# coding: utf-8 import time import json import os import sys import os.path import tornado.ioloop import tornado.options import tornado.web import tornado.websocket import tornado.httpserver from tornado.options import define, options from pyinotify import WatchManager, Notifier, ProcessEvent, IN_DELETE, IN_CREATE, IN_MODIFY define("port", default=8080, help="run on the given port", type=int) class EventHandler(ProcessEvent): def __init__(self, client=None): self.client = client def process_IN_CREATE(self, event): print "Create file:%s." % os.path.join(event.path, event.name) def process_IN_DELETE(self, event): print "Delete file:%s." % os.path.join(event.path, event.name) def process_IN_MODIFY(self, event): print "Modify file:%s." % os.path.join(event.path, event.name) self.client.write_message(f.read()) def file_monitor(path='.', client=None): wm = WatchManager() mask = IN_DELETE | IN_CREATE | IN_MODIFY notifier = Notifier(wm, EventHandler(client)) wm.add_watch(path, mask, auto_add=True, rec=True) if not os.path.isfile(path): print "You should monitor a file" sys.exit(3) else: print "now starting monitor %s." %path global f f = open(path, 'r') st_size = os.stat(path)[6] f.seek(st_size) while True: try: notifier.process_events() if notifier.check_events(): notifier.read_events() except KeyboardInterrupt: print "keyboard Interrupt." notifier.stop() break class Application(tornado.web.Application): def __init__(self): handlers = [ (r'/', MainHandler), (r'/send', SendHandler), ] setting = { 'cookie_secret': 'DFksdfsasdfkasdfFKwlwfsdfsa1204mx', 'template_path': os.path.join(os.path.dirname(__file__), 'templates'), 'static_path': os.path.join(os.path.dirname(__file__), 'static'), } tornado.web.Application.__init__(self, handlers, **setting) class SendHandler(tornado.websocket.WebSocketHandler): clients = set() def check_origin(self, origin): return True def open(self): SendHandler.clients.add(self) self.stream.set_nodelay(True) def on_message(self, message): self.write_message(message) # while True: # self.write_message(json.dumps(message)) # time.sleep(1) # # 服务器主动关闭 # self.close() # SendHandler.clients.remove(self) file_monitor('/opt/jumpserver/logs/tty/20151102/a_b_191034.log', client=self) self.write_message('monitor /tmp/test1234') def on_close(self): # 客户端主动关闭 SendHandler.clients.remove(self) class MainHandler(tornado.web.RequestHandler): def get(self): self.render('log_watch.html') if __name__ == '__main__': tornado.options.parse_command_line() app = Application() server = tornado.httpserver.HTTPServer(app) server.listen(options.port) tornado.ioloop.IOLoop.instance().start()