From 8f4dcaa4c9f589705e957a89e90dfa6d04b82d90 Mon Sep 17 00:00:00 2001 From: Stefan Krulj Date: Fri, 12 Oct 2012 18:45:53 +0200 Subject: [PATCH 1/3] logger improved --- modules/active/logger.py | 65 ++++++++++++++++++++++++++-------------- sys/s5b.py | 2 +- 2 files changed, 44 insertions(+), 23 deletions(-) diff --git a/modules/active/logger.py b/modules/active/logger.py index 16ed07c..8bacf12 100644 --- a/modules/active/logger.py +++ b/modules/active/logger.py @@ -1,11 +1,18 @@ -import brathuhn, tempfile +import brathuhn, tempfile, datetime, time +from StringIO import StringIO user_logs = dict() +def get_log(msg,args): + if msg.getFrom() in user_logs: + user_logs[msg.getFrom()].seek(0) + log = user_logs[msg.getFrom()].read() + fd = StringIO(log) + brathuhn.sendFileStream(msg.getFrom(),len(log),"log.txt",fd) + else: + brathuhn.sendMsg(msg.getFrom(),"I'm currently not logging for you") + def show_log(msg,args): - if len(args)!=1: - brathuhn.sendMsg(msg.getFrom(),"Usage: !"+args[0]) - return if msg.getFrom() in user_logs: user_logs[msg.getFrom()].seek(0) log = user_logs[msg.getFrom()].read() @@ -13,10 +20,7 @@ def show_log(msg,args): else: brathuhn.sendMsg(msg.getFrom(),"I'm currently not logging for you") -def del_log(msg,args): - if len(args)!=1: - brathuhn.sendMsg(msg.getFrom(),"Usage: !"+args[0]) - return +def delete_log(msg,args): if msg.getFrom() in user_logs: user_logs[msg.getFrom()].seek(0) user_logs[msg.getFrom()].truncate(0) @@ -25,28 +29,31 @@ def del_log(msg,args): brathuhn.sendMsg(msg.getFrom(),"I'm currently not logging for you") def stop_log(msg,args): - if len(args)!=1: - brathuhn.sendMsg(brathuhn.ROOM,"Usage: !"+args[0],'groupchat') - return - brathuhn.sendMsg(brathuhn.ROOM,"/me stopped logging for "+unicode(msg.getFrom()),'groupchat') if msg.getFrom() in user_logs: + brathuhn.sendMsg(brathuhn.ROOM,"/me stopped logging for "+unicode(msg.getFrom()),'groupchat') del user_logs[msg.getFrom()] + else: + brathuhn.sendMsg(msg.getFrom(),"I'm currently not logging for you") def start_log(msg,args): - if len(args)!=1: - brathuhn.sendMsg(brathuhn.ROOM,"Usage: !"+args[0],'groupchat') - return - brathuhn.sendMsg(brathuhn.ROOM,"/me started logging for "+unicode(msg.getFrom()),'groupchat') - user_logs[msg.getFrom()]=open(tempfile.mkstemp(brathuhn.NAME)[1],"w+") + if not msg.getFrom() in user_logs: + brathuhn.sendMsg(brathuhn.ROOM,"/me started logging for "+unicode(msg.getFrom()),'groupchat') + user_logs[msg.getFrom()]=open(tempfile.mkstemp(brathuhn.NAME)[1],"w+") + else: + brathuhn.sendMsg(msg.getFrom(),"I'm already logging for you") def message_logger(mfrom,msg): body = unicode(msg.getBody()) - for key in user_logs: + for key in user_logs: + date=datetime.datetime.fromtimestamp(time.time()) + user_logs[key].write(date.strftime("(%H:%M:%S) ")) user_logs[key].write(unicode(mfrom)+": "+body+"\n") def status_logger(mfrom,msg,status): for key in user_logs: + date=datetime.datetime.fromtimestamp(time.time()) + user_logs[key].write(date.strftime("(%H:%M:%S) ")) if status==brathuhn.STATUS_JOIN: user_logs[key].write(unicode(mfrom)+" joined\n") if status==brathuhn.STATUS_ONLINE: @@ -62,9 +69,23 @@ def status_logger(mfrom,msg,status): if status==brathuhn.STATUS_UNKNOWN: user_logs[key].write(unicode(mfrom)+" is now ???\n") -brathuhn.addPrivateCommand("show_log","Usage: !show_log",show_log) -brathuhn.addPrivateCommand("start_log","Usage: !start_log",start_log) -brathuhn.addPrivateCommand("stop_log","Usage: !stop_log",stop_log) -brathuhn.addPrivateCommand("delete_log","Usage: !delete_log",del_log) +def log(msg,args): + if len(args)!=2: + brathuhn.sendMsg(msg.getFrom(),"Usage: !log (start|stop|delete|show|get)") + return + if args[1]=='start': + start_log(msg,args) + elif args[1]=='stop': + stop_log(msg,args) + elif args[1]=='delete': + delete_log(msg,args) + elif args[1]=='show': + show_log(msg,args) + elif args[1]=='get': + get_log(msg,args) + else: + brathuhn.sendMsg(msg.getFrom(),"Usage: !log (start|stop|delete|show|get)") + +brathuhn.addPrivateCommand("log","Usage: !log (start|stop|delete|show|get)",log) brathuhn.addGroupListener(message_logger) brathuhn.addStatusListener(status_logger) diff --git a/sys/s5b.py b/sys/s5b.py index f29ca18..31488ad 100644 --- a/sys/s5b.py +++ b/sys/s5b.py @@ -16,7 +16,7 @@ def s5b_prepare(): return (s,port) def s5b_write_file(s,fd,size): - s.settimeout(20) + s.settimeout(60) conn, addr = s.accept() data = conn.recv(3) From 9d8f7c2ba1423dfb24773c28fcdd1c886d6d5b43 Mon Sep 17 00:00:00 2001 From: Stefan Krulj Date: Sun, 14 Oct 2012 17:43:32 +0200 Subject: [PATCH 2/3] log_rotate script added --- log_rotate.py | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100755 log_rotate.py diff --git a/log_rotate.py b/log_rotate.py new file mode 100755 index 0000000..2828f52 --- /dev/null +++ b/log_rotate.py @@ -0,0 +1,28 @@ +#!/usr/bin/python + +import os,sys +import time,datetime + +LOG_FILE = "./brathuhn.log" +ROT_SIZE = 2**20 +ROT_CRITICAL = 2**20+50*2**10 + +f = open(LOG_FILE,'wb') + +cnt = 0 + +c = sys.stdin.read(1) +while c!='': + f.write(c) + cnt+=1 + if c=='\n' and cnt>=ROT_SIZE or cnt>=ROT_CRITICAL: + f.close() + os.rename(LOG_FILE, LOG_FILE+date.strftime("_%Y-%m-%d_%H-%M-%S") ) + f = open(LOG_FILE,'wb') + + date=datetime.datetime.fromtimestamp(time.time()) + print "rotate",cnt,date.strftime("%Y-%m-%d %H:%M:%S") + + cnt = 0 + c = sys.stdin.read(1) + From da54a52bcad93f4a34b9d5761e185dad27821c72 Mon Sep 17 00:00:00 2001 From: Stefan Krulj Date: Tue, 16 Oct 2012 16:15:12 +0200 Subject: [PATCH 3/3] Brathuhn is now a daemon --- log_rotate.py | 28 ------------------- main.py | 15 +++++++--- sys/brathuhn.py | 25 ++++++++++------- sys/demonize.py | 73 +++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 99 insertions(+), 42 deletions(-) delete mode 100755 log_rotate.py create mode 100644 sys/demonize.py diff --git a/log_rotate.py b/log_rotate.py deleted file mode 100755 index 2828f52..0000000 --- a/log_rotate.py +++ /dev/null @@ -1,28 +0,0 @@ -#!/usr/bin/python - -import os,sys -import time,datetime - -LOG_FILE = "./brathuhn.log" -ROT_SIZE = 2**20 -ROT_CRITICAL = 2**20+50*2**10 - -f = open(LOG_FILE,'wb') - -cnt = 0 - -c = sys.stdin.read(1) -while c!='': - f.write(c) - cnt+=1 - if c=='\n' and cnt>=ROT_SIZE or cnt>=ROT_CRITICAL: - f.close() - os.rename(LOG_FILE, LOG_FILE+date.strftime("_%Y-%m-%d_%H-%M-%S") ) - f = open(LOG_FILE,'wb') - - date=datetime.datetime.fromtimestamp(time.time()) - print "rotate",cnt,date.strftime("%Y-%m-%d %H:%M:%S") - - cnt = 0 - c = sys.stdin.read(1) - diff --git a/main.py b/main.py index 1df1d4c..546cef8 100755 --- a/main.py +++ b/main.py @@ -2,16 +2,19 @@ # -*- coding: utf-8 -*- import sys, os - cwd = os.getcwd() sys.path.append(os.path.join(cwd,"sys")) sys.path.append(os.path.join(cwd,"modules","active")) -import brathuhn +import demonize, brathuhn +#Demonize +if not demonize.demonize('./pid',False,'log.txt'): + sys.stderr.write("Daemon already running") + sys.exit(1) +#Inport modules modules = [] files = os.listdir( os.path.join(cwd,"modules","active") ) - for f in files: if f.endswith(".py"): mod = f[:-3] @@ -19,10 +22,14 @@ for f in files: mod = f[:-4] if not mod in modules: modules.append(mod) - for mod in modules: __import__(mod) +print "PID:", os.getpid() + +#Start Brathuhn brathuhn.connect_and_join() brathuhn.loop() + + diff --git a/sys/brathuhn.py b/sys/brathuhn.py index 537a102..b3ae60d 100644 --- a/sys/brathuhn.py +++ b/sys/brathuhn.py @@ -1,5 +1,5 @@ import xmpp, os, sys, time, traceback, stream_ft -import threading +import threading, errno, select from config import * @@ -281,16 +281,21 @@ def loop(): except KeyboardInterrupt: print "keyboard interrupt, quitting..." sys.exit(0) + except select.error as e: + if not (e.args and e.args[0] == errno.EINTR): + print_error() except: - print "-------ERROR OCCURED-------" - exc_type, exc_value, exc_traceback = sys.exc_info() - traceback.print_exc(file=sys.stdout) - if not cl.connected: - s=MIN_CONNECT_INTERVAL-(time.time()-last_connect) - if s>0: - time.sleep(s) - connect_and_join() - print "---------------------------" + print_error() + +def print_error(): + print "-------ERROR OCCURED-------" + traceback.print_exc(file=sys.stdout) + if not cl.connected: + s=MIN_CONNECT_INTERVAL-(time.time()-last_connect) + if s>0: + time.sleep(s) + connect_and_join() + print "---------------------------" def callAt(func,_time,*args): """Call a function at given time; The call is not very exact but it is diff --git a/sys/demonize.py b/sys/demonize.py new file mode 100644 index 0000000..397339b --- /dev/null +++ b/sys/demonize.py @@ -0,0 +1,73 @@ +import os, sys, signal + +log_file = None +log_path = None + +def demonize(pid_file, force=False, logfile=None): + global log_file + global log_path + + # check if pid file exists and return if not a forced start + if os.path.exists(pid_file) and not force: + return False + + ## Demonize + if os.fork(): + exit(0) + os.umask(0) + os.setsid() + if os.fork(): + exit(0) + + pid = open(pid_file,'w') + pid.write(str(os.getpid())) + pid.close() + + + # The fileno is accessable after the first write + sys.stdout.write('\0') + sys.stderr.write('\0') + sys.stdout.flush() + sys.stderr.flush() + + ignore = open('/dev/null', 'r+') + os.dup2(ignore.fileno(), sys.stdin.fileno()) + + if type(logfile)==file: + log_file = logfile + elif logfile!=None: + log_file = open(logfile,'w') + log_path = logfile + else: + log_file = ignore + os.dup2(log_file.fileno(), sys.stdout.fileno()) + os.dup2(log_file.fileno(), sys.stderr.fileno()) + + signal.signal(signal.SIGHUP, __sys_call(__sighup_handler) ) + return True + +# decorator to make system call methods safe from EINTR +def __sys_call(func): + def __func(*args, **kwargs): + try: + rv = func(*args, **kwargs) + except exception as e: + if e.args and e.args[0] == EINTR: + pass + return rv + return __func + +def __sighup_handler(sig,dontcare): + global log_path + global log_file + import traceback + try: + if log_path != None: + log_file.seek(0) + log_file.close() + log_file = open(log_path,'w') + os.dup2(log_file.fileno(), sys.stdout.fileno()) + os.dup2(log_file.fileno(), sys.stderr.fileno()) + except: + traceback.print_exc(file=sys.stdout) + sys.exit(1)