commit
70cbbcdcf0
1
.gitignore
vendored
1
.gitignore
vendored
@ -4,3 +4,4 @@ msg/*
|
||||
index
|
||||
interfaceip6adress
|
||||
nodes/*
|
||||
*.log
|
||||
|
@ -32,11 +32,12 @@ sed -i -e "s/option 'interfaces' 'mesh'/option 'interfaces' 'adhoc0'/g" /etc/con
|
||||
|
||||
opkg install python git
|
||||
sleep 1
|
||||
git clone git://github.com/jngrt/meshenger.git /meshenger
|
||||
git clone ://github.com/rscmbbng/meshenger /root/meshenger
|
||||
|
||||
mv uhttpd /etc/config/uhttpd
|
||||
|
||||
mv meshenger /etc/init.d/meshenger
|
||||
/etc/init.d/meshenger enable
|
||||
|
||||
echo 'my ip address is:' #klopt nog niet
|
||||
ifconfig br-lan | grep 'inet addr'
|
||||
|
4
log/.gitignore
vendored
Normal file
4
log/.gitignore
vendored
Normal file
@ -0,0 +1,4 @@
|
||||
# Ignore everything in this directory
|
||||
*
|
||||
# Except this file
|
||||
!.gitignore
|
62
main.py
62
main.py
@ -1,6 +1,9 @@
|
||||
#!/usr/bin/python
|
||||
|
||||
import socket, os, time, select, urllib, sys, threading
|
||||
import socket, os, time, select, urllib, sys, threading, json, logging, logging.config
|
||||
|
||||
logging.config.fileConfig('pylog.conf')
|
||||
logger = logging.getLogger('meshenger'+'.main')
|
||||
|
||||
class Meshenger:
|
||||
devices = {} #the dictionary of all the nodes this this node has seen
|
||||
@ -22,7 +25,7 @@ class Meshenger:
|
||||
|
||||
if not os.path.exists(self.msg_dir):
|
||||
os.mkdir(self.msg_dir)
|
||||
print 'Making message directory'
|
||||
logger.info('Making message directory')
|
||||
|
||||
try:
|
||||
d = threading.Thread(target=self.discover)
|
||||
@ -48,7 +51,7 @@ class Meshenger:
|
||||
#os.system("python meshenger_clientserve.py")
|
||||
|
||||
except (KeyboardInterrupt, SystemExit):
|
||||
print 'exiting discovery thread'
|
||||
logger.info('exiting discovery thread')
|
||||
d.join()
|
||||
a.join()
|
||||
b.join()
|
||||
@ -57,31 +60,31 @@ class Meshenger:
|
||||
sys.exit()
|
||||
|
||||
while True:
|
||||
print 'Entering main loop'
|
||||
logger.debug('Entering main loop')
|
||||
#
|
||||
if len(self.devices) > 0:
|
||||
print 'found', len(self.devices),'device(s)'
|
||||
logger.info('found %s device(s)', len(self.devices))
|
||||
|
||||
for device in self.devices.keys():
|
||||
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')
|
||||
nodehash = self.hasj(device)
|
||||
nodepath = os.path.join(os.path.abspath('nodes'), nodehash)
|
||||
nodeupdatepath = os.path.join(nodepath, 'lastupdate')
|
||||
|
||||
|
||||
print 'Checking age of foreign node index'
|
||||
print self.devices[device], 'Foreign announce timestamp'
|
||||
logger.info('Checking age of foreign node index')
|
||||
logger.info('%s Foreign announce timestamp', self.devices[device])
|
||||
try:
|
||||
foreign_node_update = open(nodeupdatepath).read()
|
||||
except:
|
||||
foreign_node_update = 0 #means it was never seen before
|
||||
|
||||
print foreign_node_update, 'Locally stored timestamp for device'
|
||||
logger.info('%s Locally stored timestamp for device', foreign_node_update)
|
||||
|
||||
|
||||
if self.devices[device] > foreign_node_update:
|
||||
print 'Foreign node"s index is newer, proceed to download index'
|
||||
logger.info('Foreign node"s index is newer, proceed to download index')
|
||||
self.get_index(device, nodepath)
|
||||
print 'downloading messages'
|
||||
self.get_messages(device, nodepath)
|
||||
logger.info('downloading messages')
|
||||
self.get_messages(device, nodepath, nodehash)
|
||||
self.node_timestamp(device)
|
||||
|
||||
time.sleep(5) #free process or ctrl+c
|
||||
@ -99,7 +102,7 @@ class Meshenger:
|
||||
"""
|
||||
Announce the node's existance to other nodes
|
||||
"""
|
||||
print 'Announcing'
|
||||
logger.info('Announcing')
|
||||
while not self.exitapp:
|
||||
sock = socket.socket(socket.AF_INET6, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
|
||||
sock.sendto(self.index_last_update, ("ff02::1", self.announce_port))
|
||||
@ -120,7 +123,7 @@ Discover other devices by listening to the Meshenger announce port
|
||||
while not self.exitapp:
|
||||
result = select.select([s],[],[])[0][0].recvfrom(bufferSize)
|
||||
ip = result[1][0]
|
||||
print ip, "*"*45
|
||||
logger.info('%s %s', ip, "*"*45)
|
||||
node_path = os.path.join(os.path.abspath('nodes'), self.hasj(ip))
|
||||
|
||||
if not os.path.exists(node_path) and ip != self.own_ip:
|
||||
@ -128,10 +131,10 @@ Discover other devices by listening to the Meshenger announce port
|
||||
self.ip_to_hash_path(ip) #make a folder /nodes/hash
|
||||
self.devices[ip] = result[0]
|
||||
#self.node_timestamp(ip) #make a local copy of the timestamp in /nodes/hash/updatetimestamp
|
||||
print 'New node', ip
|
||||
logger.info('New node %s', ip)
|
||||
|
||||
elif os.path.exists(node_path) and ip != self.own_ip:
|
||||
print 'Known node', ip
|
||||
logger.info('Known node %s', ip)
|
||||
self.devices[ip] = result[0]
|
||||
|
||||
|
||||
@ -141,7 +144,7 @@ Discover other devices by listening to the Meshenger announce port
|
||||
"""
|
||||
Initialize the nodeserver
|
||||
"""
|
||||
print 'Serving to nodes'
|
||||
logger.info('Serving to nodes')
|
||||
import meshenger_nodeserve
|
||||
meshenger_nodeserve.main()
|
||||
|
||||
@ -149,7 +152,7 @@ Initialize the nodeserver
|
||||
"""
|
||||
Initialize the clientserver
|
||||
"""
|
||||
print 'Serving to client'
|
||||
logger.info('Serving to client')
|
||||
import meshenger_clientserve
|
||||
meshenger_clientserve.main()
|
||||
|
||||
@ -160,7 +163,7 @@ Make an index file of all the messages present on the node.
|
||||
Save the time of the last update.
|
||||
"""
|
||||
|
||||
print 'Building own index for the first time\n'
|
||||
logger.info('Building own index for the first time\n')
|
||||
|
||||
if not os.path.exists('index'):
|
||||
with open('index','wb') as index:
|
||||
@ -178,7 +181,7 @@ Save the time of the last update.
|
||||
index.write('\n')
|
||||
self.index_last_update = str(int(time.time()))
|
||||
|
||||
print 'Index updated:', current_index
|
||||
logger.info('Index updated: %s', current_index)
|
||||
|
||||
with open('index_last_update', 'wb') as indexupdate:
|
||||
indexupdate.write(self.index_last_update) ### misschien moet dit index_last_update zijn
|
||||
@ -194,7 +197,7 @@ Download the indices from other nodes.
|
||||
os.system('wget http://['+ip+'%adhoc0]:'+self.serve_port+'/index -O '+os.path.join(path,'index'))
|
||||
|
||||
|
||||
def get_messages(self, ip, path):
|
||||
def get_messages(self, ip, path, hash):
|
||||
"""
|
||||
Get new messages from other node based on it's index file
|
||||
"""
|
||||
@ -204,10 +207,16 @@ Get new messages from other node based on it's index file
|
||||
for message in index:
|
||||
messagepath = os.path.join(os.path.abspath(self.msg_dir), message)
|
||||
if not os.path.exists(messagepath):
|
||||
print 'downloading', message, 'to', messagepath
|
||||
logger.info('downloading %s to %s', message, messagepath)
|
||||
os.system('wget http://['+ip+'%adhoc0]:'+self.serve_port+'/msg/'+message+' -O '+messagepath)
|
||||
with open(messagepath, 'r+') as f:
|
||||
data=json.load(f)
|
||||
data['hops']=str(int(data['hops'])+1)
|
||||
data['node']=hash
|
||||
f.seek(0)
|
||||
json.dump(data, f)
|
||||
except:
|
||||
print 'Failed to download messages'
|
||||
logger.info('Failed to download messages')
|
||||
pass
|
||||
|
||||
def ip_to_hash_path(self, ip):
|
||||
@ -223,6 +232,7 @@ Convert a node's ip into a hash and make a directory to store it's files
|
||||
|
||||
return nodepath
|
||||
|
||||
|
||||
def hasj(self, ip):
|
||||
"""
|
||||
Convert a node's ip into a hash
|
||||
@ -243,7 +253,7 @@ Hack to adhoc0's inet6 adress
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
print "test"
|
||||
logger.info("starting main...")
|
||||
try:
|
||||
meshenger = Meshenger()
|
||||
except (KeyboardInterrupt, SystemExit):
|
||||
|
@ -8,6 +8,10 @@ from BaseHTTPServer import HTTPServer
|
||||
import SimpleHTTPServer
|
||||
import urlparse
|
||||
import unicodedata
|
||||
import logging, logging.config
|
||||
|
||||
logging.config.fileConfig('pylog.conf')
|
||||
logger = logging.getLogger('meshenger'+'.clientserve')
|
||||
|
||||
|
||||
class ClientServeHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
|
||||
@ -23,14 +27,20 @@ class ClientServeHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
|
||||
self.send_response(200)
|
||||
self.send_header('Content-type', 'text/html')
|
||||
self.end_headers()
|
||||
|
||||
f = os.path.join('/root/meshenger/',"webapp.html")
|
||||
f = os.path.relpath('webapp.html')
|
||||
# f = os.path.join('/root/meshenger/',"webapp.html")
|
||||
with open( f, 'r') as the_file:
|
||||
self.wfile.write(the_file.read())
|
||||
|
||||
elif self.path == '/index' or self.path.startswith( "/"+self.messageDir ):
|
||||
return SimpleHTTPServer.SimpleHTTPRequestHandler.do_GET(self)
|
||||
|
||||
elif self.path == '/log':
|
||||
self.send_response(200)
|
||||
self.send_header('Content-type', 'text-html')
|
||||
self.end_headers()
|
||||
f = os.path.relpath('log/meshenger.log')
|
||||
with open( f, 'r') as the_file:
|
||||
self.wfile.write(the_file.read())
|
||||
else:
|
||||
self.send_response(200) #serve the webapp on every url requested
|
||||
self.send_header('Content-type', 'text/html')
|
||||
|
@ -7,6 +7,11 @@ import socket
|
||||
import BaseHTTPServer
|
||||
import SimpleHTTPServer
|
||||
import urlparse
|
||||
import logging
|
||||
import logging.config
|
||||
|
||||
logging.config.fileConfig('pylog.conf')
|
||||
logger = logging.getLogger('meshenger'+'.nodeserve')
|
||||
|
||||
#GOTTMITTUNS
|
||||
|
||||
|
34
pylog.conf
Normal file
34
pylog.conf
Normal file
@ -0,0 +1,34 @@
|
||||
[loggers]
|
||||
keys=root,meshenger
|
||||
|
||||
[handlers]
|
||||
keys=consoleHandler, fileHandler
|
||||
|
||||
[formatters]
|
||||
keys=simpleFormatter
|
||||
|
||||
[logger_root]
|
||||
level=DEBUG
|
||||
handlers=consoleHandler
|
||||
|
||||
[logger_meshenger]
|
||||
level=DEBUG
|
||||
handlers=consoleHandler, fileHandler
|
||||
qualname=meshenger
|
||||
propagate=0
|
||||
|
||||
[handler_fileHandler]
|
||||
class=handlers.RotatingFileHandler
|
||||
level=INFO
|
||||
args=('log/meshenger.log','a','maxBytes=10000','backupCount=5')
|
||||
formatter=simpleFormatter
|
||||
|
||||
[handler_consoleHandler]
|
||||
class=StreamHandler
|
||||
level=DEBUG
|
||||
formatter=simpleFormatter
|
||||
args=(sys.stdout,)
|
||||
|
||||
[formatter_simpleFormatter]
|
||||
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
|
||||
datefmt=
|
68
webapp.html
68
webapp.html
@ -110,7 +110,7 @@
|
||||
//background:-moz-linear-gradient(top, #fff, #eee);
|
||||
}
|
||||
#outbox{
|
||||
display:hidden;
|
||||
display:none;
|
||||
}
|
||||
#header{
|
||||
width:100%;
|
||||
@ -118,6 +118,9 @@
|
||||
}
|
||||
#name{
|
||||
|
||||
}
|
||||
.hops .node{
|
||||
// display:hidden;
|
||||
}
|
||||
|
||||
</style>
|
||||
@ -142,8 +145,6 @@
|
||||
<option value="dateSend">Sort by Date Send</option>
|
||||
|
||||
</select>
|
||||
|
||||
|
||||
<ul id="inbox"></ul>
|
||||
|
||||
<!--<h2>outbox</h2>-->
|
||||
@ -152,6 +153,7 @@
|
||||
|
||||
<script type="text/javascript">
|
||||
|
||||
localStorage.clear();
|
||||
/*
|
||||
* OUTBOX STUFF
|
||||
*/
|
||||
@ -165,8 +167,18 @@ document.getElementById( 'send' ).onclick = function() {
|
||||
var namm= document.getElementById('name').value;
|
||||
}
|
||||
var mess = document.getElementById('message').value.replace(/\r?\n/g, "<br />");
|
||||
outStr += new Date().getTime() + ' ' + namm + '///' + mess + '\n';
|
||||
localStorage.setItem( 'outbox', outStr );
|
||||
var newMsgs ={};
|
||||
var ddata= new Date().getTime();
|
||||
var contento = {
|
||||
"time" : ddata,
|
||||
"message" : mess,
|
||||
"name" : namm,
|
||||
"node" : "local",
|
||||
"hops" : "0"
|
||||
}
|
||||
newMsgs.message = contento;
|
||||
|
||||
localStorage.setItem( 'outbox', JSON.stringify(newMsgs) );
|
||||
updateOutboxView();
|
||||
checkOutbox();
|
||||
document.getElementById('message').value = '';
|
||||
@ -181,8 +193,10 @@ function checkOutbox() {
|
||||
if ( lines[i].length === 0 ) {
|
||||
continue;
|
||||
}
|
||||
var ts = lines[ i ].substr( 0, lines[ i ].indexOf( ' ' ));
|
||||
var msg = lines[ i ].substr( lines[ i ].indexOf( ' ' ));
|
||||
var obj = JSON.parse(lines[i]);
|
||||
var ts = obj.message.time;
|
||||
delete obj.message.time;
|
||||
var msg = JSON.stringify(obj.message);
|
||||
sendMessage( ts, msg );
|
||||
}
|
||||
}
|
||||
@ -208,7 +222,8 @@ function removeOutboxItem( timestamp ) {
|
||||
var outStr = localStorage.getItem( 'outbox' ) || '';
|
||||
var lines = outStr.split( /\n/ );
|
||||
for ( var i in lines ) {
|
||||
var ts = lines[ i ].substr( 0, lines[ i ].indexOf( ' ' ));
|
||||
var obj = JSON.parse(lines[i]);
|
||||
var ts = obj.message.time;
|
||||
if ( ts === timestamp ) {
|
||||
lines.splice( i, 1 );
|
||||
break;
|
||||
@ -226,30 +241,21 @@ function updateOutboxView() {
|
||||
if ( lines[ i ].length === 0 ) {
|
||||
continue;
|
||||
}
|
||||
var ts = lines[ i ].substr( 0, lines[ i ].indexOf( ' ' ));
|
||||
var msg = lines[ i ].substr( lines[ i ].indexOf( ' ' ));
|
||||
var obj = JSON.parse(lines[i]);
|
||||
var ts = obj.message.time;
|
||||
delete obj.message.time;
|
||||
var msg = JSON.stringify(obj.message);
|
||||
|
||||
contentString += '<li><b>' + ts + ' </b>' + msg + '</li>';
|
||||
}
|
||||
document.getElementById( 'outbox' ).innerHTML = contentString;
|
||||
}
|
||||
|
||||
function doStuffForEach( entriesString, stuffFunction ) {
|
||||
if ( ! entriesString ) {
|
||||
return;
|
||||
}
|
||||
var lines = entriesString.split( /\n/ );
|
||||
for ( var i in lines ) {
|
||||
var ts = lines[ i ].substr( 0, lines[ i ].indexOf( ' ' ));
|
||||
var msg = lines[ i ].substr( lines[ i ].indexOf( ' ' ) + 1 );
|
||||
stuffFunction( ts, msg );
|
||||
}
|
||||
}
|
||||
/*
|
||||
* INBOX STUFF
|
||||
*/
|
||||
|
||||
|
||||
|
||||
function updateInboxView() {
|
||||
var localStorageArray = new Array();
|
||||
var contentString = '';
|
||||
@ -257,15 +263,19 @@ function updateInboxView() {
|
||||
if (localStorage.length>0) {
|
||||
for (i=0;i<localStorage.length;i++){
|
||||
|
||||
element=localStorage.getItem(localStorage.key(i));
|
||||
|
||||
element=localStorage.getItem(localStorage.key(i))
|
||||
|
||||
elesplit=element.split('///');
|
||||
|
||||
if ( localStorage.key(i).length === 0 || element === 'outbox' ) {
|
||||
if ( localStorage.key(i).length < 10 || element === 'outbox' ) {
|
||||
continue;
|
||||
}
|
||||
localStorageArray[i] = { time:localStorage.key(i), user:elesplit[0], message:elesplit[1] };
|
||||
// alert(element);
|
||||
try {
|
||||
elementj = JSON.parse(element);
|
||||
} catch (e) {
|
||||
continue;
|
||||
}
|
||||
|
||||
localStorageArray[i] = { time:localStorage.key(i), user:elementj.name, message:elementj.message, node:elementj.node, hops:elementj.hops };
|
||||
}
|
||||
}
|
||||
orderStorage = localStorageArray.sort(function(a,b) { return b.time - a.time } );
|
||||
@ -278,7 +288,7 @@ function updateInboxView() {
|
||||
var date = new Date(parseInt(orderStorage[i].time));
|
||||
// date.setHours(date.getHours() + 2);
|
||||
var datereadable = date.getDate()+"/"+(date.getMonth()+1)+"/"+date.getFullYear()+" "+date.getHours()+":"+date.getMinutes();
|
||||
contentString += '<li><b>' + datereadable + ' </b>' + ' <i>'+ orderStorage[i].user +'</i><br/> '+orderStorage[i].message+'</li>';
|
||||
contentString += '<li><b>' + datereadable + ' </b>' + ' <i>'+ orderStorage[i].user +'</i><br/> '+orderStorage[i].message+' <span class="node '+orderStorage[i].node+'">'+orderStorage[i].node+'</span> <span class="hops '+orderStorage[i].hops+'">'+orderStorage[i].hops+'</span></li>';
|
||||
}
|
||||
document.getElementById( 'inbox' ).innerHTML = contentString;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user