Revisión 32
Añadido por Manu Mora Gordillo hace más de 14 años
autoclone/trunk/Client/main.py | ||
---|---|---|
import urlgrabber
|
||
import logging
|
||
import time
|
||
|
||
LOG_FILENAME = 'shareLinex.log'
|
||
logging.basicConfig(filename=LOG_FILENAME,level=logging.DEBUG)
|
||
|
||
fileISO = "my_file.iso"
|
||
teacherServer = "192.168.0.254"
|
||
port = "8999"
|
||
|
||
endDownload = false
|
||
|
||
|
||
def md5_for_file(f, block_size=2**20):
|
||
md5 = hashlib.md5()
|
||
while True:
|
||
data = f.read(block_size)
|
||
if not data:
|
||
break
|
||
md5.update(data)
|
||
return md5.digest()
|
||
|
||
|
||
def verifyFile:
|
||
if not os.path.exists("verify.hash"):
|
||
try
|
||
g = URLGrabber()
|
||
local_filename = g.urlgrab("http://"+teacherServer+":"+port+"/verify.hash")
|
||
except
|
||
logging.debug("No se puede descargar el fichero de verificación")
|
||
return false
|
||
|
||
verifyHash = so.read("verify.hash")
|
||
if verifyHash != md5_for_file("fileISO"):
|
||
return false
|
||
|
||
|
||
if __name__ == "__main__":
|
||
|
||
while not endDownload:
|
||
if not os.path.exists(release):
|
||
try
|
||
g = URLGrabber()
|
||
local_filename = g.urlgrab("http://"+teacherServer+":"+port+"/"+fileISO)
|
||
except
|
||
logging.debug("No se puede realizar la descarga desde: "+teacherServer)
|
||
time.sleep(600)
|
||
else
|
||
try
|
||
g = URLGrabber(reget="simple")
|
||
local_filename = g.urlgrab("http://"+teacherServer+":"+port+"/"+fileISO)
|
||
except
|
||
logging.debug("No se puede reanudar la descarga desde: "+teacherServer)
|
||
time.sleep(600)
|
autoclone/trunk/Client/avahiClient.py | ||
---|---|---|
import dbus, gobject, avahi
|
||
from dbus import DBusException
|
||
from dbus.mainloop.glib import DBusGMainLoop
|
||
from string import split
|
||
import logging
|
||
|
||
LOG_FILENAME = 'replicant.log'
|
||
TYPE = "_replicant25._tcp"
|
||
files = {}
|
||
logging.basicConfig(filename=LOG_FILENAME,level=logging.DEBUG)
|
||
|
||
|
||
def downloadFile(fileToDownload, source, port):
|
||
if not os.path.exists(fileToDownload):
|
||
g = URLGrabber()
|
||
else:
|
||
g = URLGrabber(reget="simple")
|
||
|
||
try:
|
||
local_filename = g.urlgrab("http://"+source+":"+port+"/"+fileToDownload)
|
||
except:
|
||
logging.debug("No se puede realizar la descarga de "+fileToDownload+" desde "+source+":"+port)
|
||
time.sleep(600)
|
||
|
||
|
||
def service_resolved(*args):
|
||
val = str(args[2]).split("@")
|
||
files[val[1]] = {'address' : str(args[7]), 'port': str(val[0])}
|
||
|
||
if len(files)>0:
|
||
for i in files:
|
||
print i['address']
|
||
#downloadFile(i.keys(), i['address'], i['port'])
|
||
|
||
#print 'name:', args[2]
|
||
#print 'address:', args[7]
|
||
#print 'port:', args[8]
|
||
|
||
def print_error(*args):
|
||
print 'error_handler'
|
||
print args[0]
|
||
|
||
def myhandler(interface, protocol, name, stype, domain, flags):
|
||
#print "Found service '%s' type '%s' domain '%s' " % (name, stype, domain)
|
||
|
||
if flags & avahi.LOOKUP_RESULT_LOCAL:
|
||
# local service, skip
|
||
pass
|
||
|
||
server.ResolveService(interface, protocol, name, stype,
|
||
domain, avahi.PROTO_UNSPEC, dbus.UInt32(0),
|
||
reply_handler=service_resolved, error_handler=print_error)
|
||
|
||
|
||
loop = DBusGMainLoop()
|
||
|
||
bus = dbus.SystemBus(mainloop=loop)
|
||
|
||
server = dbus.Interface(bus.get_object(avahi.DBUS_NAME, '/'), 'org.freedesktop.Avahi.Server')
|
||
|
||
sbrowser = dbus.Interface(bus.get_object(avahi.DBUS_NAME, server.ServiceBrowserNew(avahi.IF_UNSPEC, avahi.PROTO_UNSPEC, TYPE, 'local', dbus.UInt32(0))), avahi.DBUS_INTERFACE_SERVICE_BROWSER)
|
||
sbrowser.connect_to_signal("ItemNew", myhandler)
|
||
|
||
gobject.MainLoop().run()
|
||
|
||
print "hola"
|
autoclone/trunk/Server/WebServer.py | ||
---|---|---|
from BaseHTTPServer import BaseHTTPRequestHandler
|
||
import os
|
||
|
||
class MyHandler(BaseHTTPRequestHandler):
|
||
|
||
def do_GET(self):
|
||
try:
|
||
if self.path.endswith(".iso") or self.path.endswith(".md5"):
|
||
file = "/home/manu/Descargas/" + self.path
|
||
f = open(file)
|
||
s = os.path.getsize(file)
|
||
|
||
self.send_response(200)
|
||
self.send_header('Content-type', 'multipart/octet-stream')
|
||
self.send_header('Content-Length', s)
|
||
self.end_headers()
|
||
|
||
f.close()
|
||
return
|
||
|
||
except IOError:
|
||
pass
|
autoclone/trunk/Server/main.py | ||
---|---|---|
import ZeroconfService
|
||
from BaseHTTPServer import HTTPServer
|
||
import os
|
||
import WebServer
|
||
import MyUtils
|
||
|
||
pathDownloads = "/home/manu/Descargas/"
|
||
portWebServer = 8000
|
||
classroom = "25"
|
||
|
||
if __name__ == '__main__':
|
||
|
||
if not os.path.exists(pathDownloads):
|
||
os.mkdir(pathDownloads)
|
||
|
||
while True:
|
||
listFiles = os.listdir(pathDownloads)
|
||
|
||
if len(listFiles) == 0:
|
||
time.sleep(300) #in seconds
|
||
else:
|
||
# publish files (Avahi)
|
||
for i in listFiles:
|
||
if os.path.isfile(pathDownloads + i) and i.endswith('.iso'):
|
||
fileName = MyUtils.getFileName(os.path.basename(i))
|
||
md5File = pathDownloads + fileName + '.md5'
|
||
|
||
if not os.path.isfile(md5File):
|
||
md5Hash = MyUtils.getMD5Hash(pathDownloads + i)
|
||
f = open(md5File,'wt')
|
||
f.write(md5Hash)
|
||
f.close()
|
||
|
||
service = ZeroconfService.ZeroconfService(name = str(portWebServer)+"@"+i, port=3000, stype = "_replicant"+classroom+"._tcp") #, domain="replicant", host="localhost", text="Esto es una prueba")
|
||
service.publish()
|
||
|
||
# Start web server
|
||
server = HTTPServer(('', portWebServer), WebServer.MyHandler)
|
||
server.serve_forever()
|
||
|
||
#server.socket.close()
|
||
#service.unpublish()
|
autoclone/trunk/Server/MyUtils.py | ||
---|---|---|
|
||
import hashlib
|
||
import os
|
||
|
||
def getMD5Hash(file, block_size=2**20):
|
||
f = open(file)
|
||
md5 = hashlib.md5()
|
||
while True:
|
||
data = f.read(block_size)
|
||
if not data:
|
||
break
|
||
md5.update(data)
|
||
md5Hash = md5.hexdigest()
|
||
return md5Hash
|
||
|
||
|
||
def getFileName(file):
|
||
basename = os.path.basename(file)
|
||
filename = os.path.splitext(basename)
|
||
return filename[0]
|
autoclone/trunk/Server/ZeroconfService.py | ||
---|---|---|
import avahi
|
||
import dbus
|
||
|
||
__all__ = ["ZeroconfService"]
|
||
|
||
class ZeroconfService:
|
||
|
||
def __init__(self, name, port, stype="_http._tcp", domain="", host="", text=""):
|
||
self.name = name
|
||
self.stype = stype
|
||
self.domain = domain
|
||
self.host = host
|
||
self.port = port
|
||
self.text = text
|
||
|
||
def publish(self):
|
||
bus = dbus.SystemBus()
|
||
server = dbus.Interface(bus.get_object(avahi.DBUS_NAME, avahi.DBUS_PATH_SERVER), avahi.DBUS_INTERFACE_SERVER)
|
||
|
||
g = dbus.Interface(bus.get_object(avahi.DBUS_NAME, server.EntryGroupNew()), avahi.DBUS_INTERFACE_ENTRY_GROUP)
|
||
g.AddService(avahi.IF_UNSPEC, avahi.PROTO_UNSPEC,dbus.UInt32(0), self.name, self.stype, self.domain, self.host, dbus.UInt16(self.port), self.text)
|
||
|
||
g.Commit()
|
||
self.group = g
|
||
|
||
def unpublish(self):
|
||
self.group.Reset()
|
Exportar a: Unified diff
Primera carga de código