Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import gamin, paramiko, os, time, ConfigParser, hashlib
- from twisted.internet import reactor, defer
- from twisted.internet.task import LoopingCall
- from twisted.internet.protocol import DatagramProtocol
- from twisted.protocols.basic import LineReceiver
- from twisted.internet.protocol import ClientFactory, Protocol
- class Sync(LineReceiver):
- def __init__(self):
- config = ConfigParser.ConfigParser()
- config.readfp(open('openbox.config'))
- self.local_watch_dir = config.get("dirs", "local")
- self.remote_watch_dir = config.get("dirs", "remote")
- self.mon = gamin.WatchMonitor()
- self.mon.watch_directory(self.local_watch_dir, self.callback)
- self.remote_server = config.get("server", "address")
- self.username = config.get("server", "username")
- self.port = int(config.get("server", "port"))
- self.password = hashlib.sha224(config.get("server", "password")).hexdigest()
- self.authenticated = 0
- def connectionMade(self):
- print "[Notice] Connection made to remote system, authenticating..."
- self.connected = 1
- self.setup_auth()
- gamin_loop = LoopingCall(self.check_gamin_status)
- gamin_loop.start(0.5)
- def dataReceived(self, data):
- is_file = os.path.basename(data.replace("\n",""))
- if data.split()[-1] == "ok":
- self.authenticated = 1
- print "[Auth] Authenticated"
- self.setup_sftp()
- if data.startswith("True"):
- print "[File] File %s exists on remote system" % (is_file)
- if os.path.isfile("%s%s%s" % (self.local_watch_dir, os.sep, is_file)) == False:
- self.send_delete(2, is_file)
- if data.startswith("False"):
- print "[File] File %s does not exists on remote system" % (is_file)
- if os.path.isfile("%s%s%s" % (self.local_watch_dir, os.sep, is_file)) == True:
- print "[File] Sending..."
- self.send_file(0, is_file)
- def setup_auth(self):
- print "[Auth] Setting up auth..."
- privatekeyfile = os.path.expanduser("~/.ssh/id_rsa")
- self.known_hosts = os.path.expanduser("~/.ssh/known_hosts")
- self.ssh_key = paramiko.RSAKey.from_private_key_file(privatekeyfile)
- self.sendLine("auth %s" % (self.password))
- return True
- def setup_sftp(self):
- print "[Auth] Setting up SFTP..."
- transport = paramiko.Transport((self.remote_server, self.port))
- transport.connect(username = self.username, pkey = self.ssh_key)
- self.sftp = paramiko.SFTPClient.from_transport(transport)
- print "[Auth] SFTP setup..."
- return True
- def check_remote_file(self, path):
- self.sendLine("exists %s%s%s" % (self.remote_watch_dir, os.sep, path))
- def send_delete(self, event, path):
- if event == 2:
- print "[File] Deleting %s" % (path)
- self.sendLine("delete %s%s%s" % (self.remote_watch_dir, os.sep, path))
- def send_notice(self, event, path):
- if self.connected == 1:
- if event == 8:
- self.check_remote_file(path)
- def send_file(self, event, path):
- self.sftp.put("%s%s%s" % (self.local_watch_dir, os.sep, path), "%s%s%s" % (self.remote_watch_dir, os.sep, path))
- self.check_remote_file(path)
- def callback(self, path, event):
- path = os.path.basename(path)
- if path == os.path.basename(self.local_watch_dir):
- return
- if event == 1:
- #print "%s was changed " % (path)
- self.send_file(event, path)
- elif event == 2:
- #print "%s was deleted " % (path)
- self.send_delete(event, path)
- elif event == 3:
- print "%s executing " % (path)
- self.send_notice(event, path)
- elif event == 4:
- print "%s stopped executing " % (path)
- self.send_notice(event, path)
- elif event == 5:
- #print "%s was created " % (path)
- self.send_file(event, path)
- elif event == 6:
- print "%s was moved " % (path)
- self.send_notice(event, path)
- elif event == 7:
- print "%s acknowledged" % (path)
- self.send_notice(event, path)
- elif event == 8:
- #print "%s exists " % (path)
- self.send_notice(event, path)
- elif event == 9:
- #print "%s end exits " % (path)
- self.send_notice(event, path)
- def check_gamin_status(self):
- self.mon.handle_events()
- class ServerFactory(ClientFactory):
- protocol = Sync
- def clientConnectionFailed(self, connector, reason):
- print 'connection failed:', reason.getErrorMessage()
- reactor.stop()
- def clientConnectionLost(self, connector, reason):
- print 'connection lost:', reason.getErrorMessage()
- reactor.stop()
- factory = ServerFactory()
- reactor.connectTCP(Sync().remote_server, 9990, factory)
- reactor.run()
Add Comment
Please, Sign In to add comment