Use Python's logging module. Add debug/verbose/output_dir options.
1 parent ca7e074 commit 1b9c64d1b71add24092f68b0418fbf76d3cb34c7
@Jeff Rebeiro Jeff Rebeiro authored on 4 Feb 2013
Showing 4 changed files
View
2
■■■
common.py
 
__author__ = 'jeff@rebeiro.net (Jeff Rebeiro)'
 
import ConfigParser
import logging
import os
import socket
import uuid
 
config = ConfigParser.RawConfigParser()
config.read(CONFIG_FILE)
 
if not config.has_section('AUTOBACKUP'):
logging.info('Creating configuration file %s', CONFIG_FILE)
config.add_section('AUTOBACKUP')
config.set('AUTOBACKUP', 'backup_dir',
os.path.expanduser('~/PCAutoBackup'))
config.set('AUTOBACKUP', 'default_interface',
View
102
mediaserver.py
 
__author__ = 'jeff@rebeiro.net (Jeff Rebeiro)'
 
import HTMLParser
import logging
import os
import random
import re
import string
 
from twisted.internet import reactor
from twisted.web.error import NoResource
from twisted.web.resource import Resource
from twisted.web.server import Site
 
import common
return (parent_id, obj_id)
 
def CreateObject(self, obj_name, obj_date, obj_type, obj_size):
(parent_id, obj_id) = self._GenerateObjectID(obj_date)
logging.debug('Creating Backup Object for %s (type:%s size:%s)', obj_name,
obj_type, obj_size)
self.backup_objects[obj_id] = {'obj_name': obj_name,
'obj_date': obj_date,
'obj_type': obj_type,
'parent_id': parent_id,
obj_dir = os.path.join(self.config.get('AUTOBACKUP', 'backup_dir'),
obj_details['obj_date'])
 
if not os.path.isdir(obj_dir):
logging.info('Creating output dir %s', obj_dir)
os.makedirs(obj_dir)
 
obj_file = os.path.join(obj_dir, obj_details['obj_name'])
 
logging.info('Saving %s', obj_file)
with open(obj_file, 'wb') as f:
f.write(data)
 
del(self.backup_objects[obj_id])
class MediaServer(Resource):
 
isLeaf = True
 
def __init__(self, debug=False):
def __init__(self):
self.config = common.LoadOrCreateConfig()
self.debug = debug
 
def render_GET(self, request):
if self.debug:
print 'Request headers:'
print request.getAllHeaders()
logging.debug('Request Headers: %s', request.getAllHeaders())
if request.path == '/DMS/SamsungDmsDesc.xml':
return self.GetDMSDescriptionResponse()
logging.info('New connection from %s', request.getHeader('user-agent'))
response = self.GetDMSDescriptionResponse()
else:
print 'Unhandled GET request: %s' % request.path
logging.error('Unhandled GET request: %s', request.path)
return NoResource()
 
logging.debug('Response: %s', response)
return response
 
def render_POST(self, request):
if self.debug:
print 'Request args:'
print request.args
print 'Request headers:'
print request.getAllHeaders()
logging.debug('Request args: %s', request.args)
logging.debug('Request headers: %s', request.getAllHeaders())
 
if request.path == '/cd/content':
return self.ReceiveUpload(request)
if request.path == '/upnp/control/ContentDirectory1':
return self.GetContentDirectoryResponse(request)
response = self.ReceiveUpload(request)
elif request.path == '/upnp/control/ContentDirectory1':
response = self.GetContentDirectoryResponse(request)
else:
print 'Unhandled POST request: %s' % request.path
logging.error('Unhandled POST request: %s', request.path)
return NoResource()
 
logging.debug('Response: %s', response)
return response
 
def GetContentDirectoryResponse(self, request):
logging.debug('Request content: %s', request.content.read())
request.content.seek(0)
 
soapaction = request.getHeader('soapaction')
 
response = ''
 
if soapaction == X_BACKUP_START:
response = X_BACKUP_RESPONSE % 'START'
if self.debug:
print 'Response:'
print response
if soapaction == CREATE_OBJ:
request.content.seek(0)
elif soapaction == CREATE_OBJ:
soap_xml = request.content.read()
 
m = CREATE_OBJ_DIDL.match(soap_xml)
if m:
'obj_id': obj_id,
'obj_type': obj_type,
'obj_size': obj_size,
'parent_id': obj_details['parent_id']}
if soapaction == X_BACKUP_DONE:
elif soapaction == X_BACKUP_DONE:
response = X_BACKUP_RESPONSE % 'DONE'
 
if self.debug:
print 'Response:'
print response
else:
logging.error('Unhandled soapaction: %s', soapaction)
return NoResource()
 
return response
 
def GetDMSDescriptionResponse(self):
response = DMS_DESC_RESPONSE % {
'friendly_name': self.config.get('AUTOBACKUP', 'server_name'),
'uuid': self.config.get('AUTOBACKUP', 'uuid')}
if self.debug:
print 'Response:'
print response
 
return response
 
def ReceiveUpload(self, request):
response = ''
 
obj_id = request.args['didx'][0].split('=')[1]
backup = Backup()
 
data = request.content.read()
backup.WriteObject(obj_id, data)
return response
 
 
def StartMediaServer(debug=False):
resource = MediaServer(debug=debug)
 
return response
 
 
def StartMediaServer():
logging.info('MediaServer started')
resource = MediaServer()
factory = Site(resource)
reactor.listenTCP(52235, factory)
reactor.run()
 
 
def main():
StartMediaServer(debug=True)
logging.basicConfig(filename='mediaserver.log', level=logging.DEBUG)
StartMediaServer()
 
 
if __name__ == '__main__':
main()
View
47
pc-autobackup.py
# Main runnable for PC Autobackup
 
__author__ = 'jeff@rebeiro.net (Jeff Rebeiro)'
 
import logging
import optparse
 
from twisted.internet import reactor
from twisted.web.server import Site
 
def main():
parser = optparse.OptionParser()
parser.add_option('-b', '--bind', dest='bind',
help='Bind the server to a specific IP',
metavar='IPADDRESS')
parser.add_option('-d', '--debug', dest='debug', action="store_true",
default=False, help='Print debug information')
help='bind the server to a specific IP',
metavar='IP')
parser.add_option('-d', '--debug', dest='debug', action='store_true',
default=False, help='debug output')
parser.add_option('--log_file', dest='log_file',
help='output log to file', metavar='FILE')
parser.add_option('-o', '--output_dir', dest='output_dir',
help='output directory for files', metavar='DIR')
parser.add_option('-v', '--verbose', dest='verbose', action='store_true',
default=False, help='verbose output')
(options, args) = parser.parse_args()
 
logging_options = {'level': logging.WARN}
 
if options.verbose:
logging_options['level'] = logging.INFO
if options.debug:
logging_options['level'] = logging.DEBUG
if options.log_file:
logging_options['filename'] = options.log_file
 
logging.basicConfig(**logging_options)
 
logging.info('pc-autobackup started')
 
config = common.LoadOrCreateConfig()
if options.bind:
config.set('AUTOBACKUP', 'default_interface', options.bind)
if options.output_dir:
config.set('AUTOBACKUP', 'backup_dir', options.output_dir)
 
#ssdp.StartSSDPServer(debug=options.debug)
#mediaserver.StartMediaServer(debug=options.debug)
resource = mediaserver.MediaServer(debug=options.debug)
resource = mediaserver.MediaServer()
factory = Site(resource)
reactor.listenMulticast(1900, ssdp.SSDPServer(debug=options.debug))
reactor.listenMulticast(1900, ssdp.SSDPServer())
logging.info('SSDPServer started')
reactor.listenTCP(52235, factory)
logging.info('MediaServer started')
reactor.run()
 
 
if __name__ == '__main__':
View
24
ssdp.py
 
__author__ = 'jeff@rebeiro.net (Jeff Rebeiro)'
 
import ConfigParser
import logging
import re
 
from twisted.internet import reactor
from twisted.internet.protocol import DatagramProtocol
 
 
class SSDPServer(DatagramProtocol):
 
def __init__(self, debug=False):
def __init__(self):
self.config = common.LoadOrCreateConfig()
self.debug = debug
 
def startProtocol(self):
self.transport.setTTL(5)
self.transport.joinGroup('239.255.255.250')
m = MSEARCH.match(datagram)
if m:
# TODO(jrebeiro): Verify that MediaServer is the only discovery request
# PCAutoBackup responds to.
if self.debug:
print 'Received M-SEARCH for %s from %r' % (m.group(3), address)
logging.debug('Received M-SEARCH for %s from %r', m.group(3), address)
if m.group(3) == 'MediaServer':
self.SendSSDPResponse(address)
 
def SendSSDPResponse(self, address):
response = SSDP_RESPONSE % (self.config.get('AUTOBACKUP',
'default_interface'),
self.config.get('AUTOBACKUP', 'uuid'))
self.transport.write(response, address)
if self.debug:
print "Response:"
print response
logging.debug('Response: %s', response)
 
 
def StartSSDPServer(debug=False):
reactor.listenMulticast(1900, SSDPServer(debug=debug))
def StartSSDPServer():
logging.info('SSDPServer started')
reactor.listenMulticast(1900, SSDPServer())
reactor.run()
 
 
def main():
StartSSDPServer(debug=True)
logging.basicConfig(filename='ssdp.log', level=logging.DEBUG)
StartSSDPServer()
 
 
if __name__ == "__main__":
main()