|
@ -1,6 +1,6 @@ |
|
|
#!/usr/bin/python |
|
|
#!/usr/bin/python |
|
|
|
|
|
|
|
|
import socket, os, time, select, urllib, sys, threading |
|
|
import socket, os, time, select, urllib, sys, threading, subprocess |
|
|
|
|
|
|
|
|
class Meshenger: |
|
|
class Meshenger: |
|
|
devices = {} #the dictionary of all the nodes this this node has seen |
|
|
devices = {} #the dictionary of all the nodes this this node has seen |
|
@ -9,7 +9,7 @@ class Meshenger: |
|
|
#own_ip = "0.0.0.0" |
|
|
#own_ip = "0.0.0.0" |
|
|
msg_dir = os.path.relpath('msg/') |
|
|
msg_dir = os.path.relpath('msg/') |
|
|
exitapp = False #to kill all threads on |
|
|
exitapp = False #to kill all threads on |
|
|
index_last_update = str(int(time.time())) |
|
|
index_last_update = "0" #str(int(time.time())) |
|
|
|
|
|
|
|
|
def __init__(self): |
|
|
def __init__(self): |
|
|
|
|
|
|
|
@ -59,7 +59,7 @@ class Meshenger: |
|
|
if len(self.devices) > 0: |
|
|
if len(self.devices) > 0: |
|
|
print 'found', len(self.devices),'device(s)' |
|
|
print 'found', len(self.devices),'device(s)' |
|
|
|
|
|
|
|
|
for device in self.devices: |
|
|
for device in self.devices.keys(): |
|
|
nodepath = self.ip_to_hash_path(device) #make a folder for the node (nodes/'hash'/) |
|
|
nodepath = self.ip_to_hash_path(device) #make a folder for the node (nodes/'hash'/) |
|
|
nodeupdatepath = os.path.join(self.ip_to_hash_path(device), 'lastupdate') |
|
|
nodeupdatepath = os.path.join(self.ip_to_hash_path(device), 'lastupdate') |
|
|
|
|
|
|
|
@ -76,9 +76,16 @@ class Meshenger: |
|
|
|
|
|
|
|
|
if self.devices[device] > foreign_node_update: |
|
|
if self.devices[device] > foreign_node_update: |
|
|
print 'Foreign node"s index is newer, proceed to download index' |
|
|
print 'Foreign node"s index is newer, proceed to download index' |
|
|
self.get_index(device, nodepath) |
|
|
if not self.get_index(device, nodepath): |
|
|
|
|
|
print 'index wget failed' |
|
|
|
|
|
continue |
|
|
|
|
|
|
|
|
print 'downloading messages' |
|
|
print 'downloading messages' |
|
|
self.get_messages(device, nodepath) |
|
|
if not self.get_messages(device, nodepath): |
|
|
|
|
|
print 'getting messages failed' |
|
|
|
|
|
continue |
|
|
|
|
|
|
|
|
|
|
|
print 'updating node timestamp' |
|
|
self.node_timestamp(device) |
|
|
self.node_timestamp(device) |
|
|
|
|
|
|
|
|
time.sleep(5) #free process or ctrl+c |
|
|
time.sleep(5) #free process or ctrl+c |
|
@ -121,7 +128,7 @@ Discover other devices by listening to the Meshenger announce port |
|
|
node_path = os.path.join(os.path.abspath('nodes'), self.hasj(ip)) |
|
|
node_path = os.path.join(os.path.abspath('nodes'), self.hasj(ip)) |
|
|
|
|
|
|
|
|
if not os.path.exists(node_path) and ip != self.own_ip: |
|
|
if not os.path.exists(node_path) and ip != self.own_ip: |
|
|
#loop for first time |
|
|
#loop for first timef |
|
|
self.ip_to_hash_path(ip) #make a folder /nodes/hash |
|
|
self.ip_to_hash_path(ip) #make a folder /nodes/hash |
|
|
self.devices[ip] = result[0] |
|
|
self.devices[ip] = result[0] |
|
|
#self.node_timestamp(ip) #make a local copy of the timestamp in /nodes/hash/updatetimestamp |
|
|
#self.node_timestamp(ip) #make a local copy of the timestamp in /nodes/hash/updatetimestamp |
|
@ -157,6 +164,44 @@ Make an index file of all the messages present on the node. |
|
|
Save the time of the last update. |
|
|
Save the time of the last update. |
|
|
""" |
|
|
""" |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
index_file = os.path.relpath( 'index' ) |
|
|
|
|
|
previous_index = [] |
|
|
|
|
|
if not os.path.exists( index_file ): |
|
|
|
|
|
with open('index','wb') as index: |
|
|
|
|
|
index.write('') |
|
|
|
|
|
else: |
|
|
|
|
|
previous_index = open( index_file ).read().split() |
|
|
|
|
|
|
|
|
|
|
|
index_last_update_file = os.path.relpath( 'index_last_update' ) |
|
|
|
|
|
if os.path.exists( index_last_update_file ): |
|
|
|
|
|
self.index_last_update = open( index_last_update_file ).read() |
|
|
|
|
|
|
|
|
|
|
|
while not self.exitapp: |
|
|
|
|
|
|
|
|
|
|
|
current_index = [] |
|
|
|
|
|
for root, folders, files in os.walk( self.msg_dir ): |
|
|
|
|
|
if root == 'msg': |
|
|
|
|
|
folders.sort() |
|
|
|
|
|
else: |
|
|
|
|
|
files.sort() |
|
|
|
|
|
current_index += [root + '/' + f for f in files] |
|
|
|
|
|
|
|
|
|
|
|
if current_index != previous_index: |
|
|
|
|
|
with open( index_file, 'w' ) as f: |
|
|
|
|
|
f.write( '\n'.join( current_index )) |
|
|
|
|
|
|
|
|
|
|
|
self.index_last_update = str( int( time.time())) |
|
|
|
|
|
print 'Index updated:', current_index |
|
|
|
|
|
|
|
|
|
|
|
with open( os.path.relpath('index_last_update'), 'w') as f: |
|
|
|
|
|
f.write( self.index_last_update ) |
|
|
|
|
|
|
|
|
|
|
|
previous_index = current_index |
|
|
|
|
|
|
|
|
|
|
|
time.sleep( 5 ) |
|
|
|
|
|
|
|
|
|
|
|
""" |
|
|
print 'Building own index for the first time\n' |
|
|
print 'Building own index for the first time\n' |
|
|
|
|
|
|
|
|
if not os.path.exists('index'): |
|
|
if not os.path.exists('index'): |
|
@ -176,36 +221,51 @@ Save the time of the last update. |
|
|
self.index_last_update = str(int(time.time())) |
|
|
self.index_last_update = str(int(time.time())) |
|
|
|
|
|
|
|
|
print 'Index updated:', current_index |
|
|
print 'Index updated:', current_index |
|
|
|
|
|
|
|
|
with open('index_last_update', 'wb') as indexupdate: |
|
|
with open('index_last_update', 'wb') as indexupdate: |
|
|
indexupdate.write(self.index_last_update) ### misschien moet dit index_last_update zijn |
|
|
indexupdate.write(self.index_last_update) ### misschien moet dit index_last_update zijn |
|
|
|
|
|
|
|
|
previous_index = current_index |
|
|
previous_index = current_index |
|
|
time.sleep(5) |
|
|
time.sleep(5) |
|
|
|
|
|
""" |
|
|
|
|
|
|
|
|
def get_index(self,ip, path): |
|
|
def get_index(self,ip, path): |
|
|
""" |
|
|
""" |
|
|
Download the indices from other nodes. |
|
|
Download the indices from other nodes. |
|
|
""" |
|
|
""" |
|
|
|
|
|
# time.sleep(0) # hack to prevent wget bug |
|
|
os.system('wget http://['+ip+'%adhoc0]:'+self.serve_port+'/index -O '+os.path.join(path,'index')) |
|
|
# os.system('wget http://['+ip+'%adhoc0]:'+self.serve_port+'/index -O '+os.path.join(path,'index')) |
|
|
|
|
|
command = 'wget http://['+ip+'%adhoc0]:'+self.serve_port+'/index -O '+os.path.join(path,'index') |
|
|
|
|
|
print 'get_index: ', command |
|
|
def get_messages(self, ip, path): |
|
|
status = subprocess.call( command, shell=True ) |
|
|
|
|
|
return status == 0 |
|
|
|
|
|
|
|
|
|
|
|
def get_messages(self, ip, path ): |
|
|
""" |
|
|
""" |
|
|
Get new messages from other node based on it's index file |
|
|
Get new messages from other node based on it's index file |
|
|
""" |
|
|
""" |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
try: |
|
|
try: |
|
|
with open(os.path.join(path,'index')) as index: |
|
|
with open(os.path.join(path,'index')) as index: |
|
|
index = index.read().split('\n') |
|
|
index = index.read().split('\n') |
|
|
for message in index: |
|
|
for message in index: |
|
|
messagepath = os.path.join(os.path.abspath(self.msg_dir), message) |
|
|
parts = message.split('/') |
|
|
|
|
|
dirpath = os.path.join( parts[0], parts[1]) |
|
|
|
|
|
if not os.path.isdir( dirpath ): |
|
|
|
|
|
os.mkdir( dirpath ) |
|
|
|
|
|
|
|
|
|
|
|
messagepath = os.path.relpath( message ) |
|
|
if not os.path.exists(messagepath): |
|
|
if not os.path.exists(messagepath): |
|
|
print 'downloading', message, 'to', messagepath |
|
|
print 'downloading', message, 'to', messagepath |
|
|
os.system('wget http://['+ip+'%adhoc0]:'+self.serve_port+'/msg/'+message+' -O '+messagepath) |
|
|
command = 'wget http://['+ip+'%adhoc0]:' + self.serve_port + '/' + message+' -O ' + messagepath |
|
|
|
|
|
status = subprocess.call( command, shell=True) |
|
|
|
|
|
if status != 0: |
|
|
|
|
|
return False |
|
|
|
|
|
# succesfuly downloaded all messages, return true |
|
|
|
|
|
return True |
|
|
except: |
|
|
except: |
|
|
print 'Failed to download messages' |
|
|
print 'Failed to download messages' |
|
|
pass |
|
|
return False |
|
|
|
|
|
|
|
|
def ip_to_hash_path(self, ip): |
|
|
def ip_to_hash_path(self, ip): |
|
|
""" |
|
|
""" |
|
|