-
Notifications
You must be signed in to change notification settings - Fork 19
/
Copy pathnode.py
77 lines (61 loc) · 2.42 KB
/
node.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
from SimpleXMLRPCServer import SimpleXMLRPCServer, SimpleXMLRPCRequestHandler
import logging
import os
import re
import subprocess
import threading
__author__ = 'dushyant'
logger = logging.getLogger('syncIt')
class Handler(SimpleXMLRPCRequestHandler):
def _dispatch(self, method, params):
try:
print self.server.funcs.items()
return self.server.funcs[method](*params)
except:
import traceback
traceback.print_exc()
raise
class Node(object):
"""Base class for client and server"""
def __init__(self, role , ip, port, uname, watch_dirs):
self.role = role
self.ip = ip
self.port = port
self.username = uname
self.watch_dirs = watch_dirs
@staticmethod
def get_dest_path(filename, dest_uname):
""" Replace username in filename with 'dest_uname'"""
user_dir_pattern = re.compile("/home/[^ ]*?/")
if re.search(user_dir_pattern, filename):
destpath = user_dir_pattern.sub("/home/%s/" % dest_uname, filename)
logger.debug("destpath %s", destpath)
return destpath
@staticmethod
def push_file(filename, dest_uname, dest_ip):
"""push file 'filename' to the destination """
proc = subprocess.Popen(['scp', filename, "%s@%s:%s" % (dest_uname, dest_ip, Node.get_dest_path(filename, dest_uname))])
return_status = proc.wait()
logger.debug("returned status %s",return_status)
def ensure_dir(self):
"""create directories to be synced if not exist"""
for dir in self.watch_dirs:
if not os.path.isdir(dir):
os.makedirs(dir)
def start_server(self):
"""Start RPC Server on each node """
server = SimpleXMLRPCServer(("0.0.0.0", self.port), allow_none =True)
server.register_instance(self)
server.register_introspection_functions()
rpc_thread = threading.Thread(target=server.serve_forever)
rpc_thread.start()
logger.debug("server functions on rpc %s", server.funcs.items())
logger.info("Started RPC server thread. Listening on port %s..." , self.port)
def start_sync_thread(self):
sync_thread = threading.Thread(target=self.sync_files)
sync_thread.start()
logger.info("Thread 'syncfiles' started ")
def activate(self):
self.ensure_dir()
self.start_sync_thread()
self.start_server()