diff --git a/.gitignore b/.gitignore index 8557253..89d2a40 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ telegram-notify.conf +telegram-notify.log diff --git a/telegram-notify b/telegram-notify index 1d56019..96bad1b 100755 --- a/telegram-notify +++ b/telegram-notify @@ -10,16 +10,24 @@ import json import sys import os import argparse +import logging from telepot.loop import MessageLoop from watchdog.observers import Observer from watchdog.events import PatternMatchingEventHandler version = 0.1 + def writeconfig(): - global configParser - with open('telegram-notify.conf', 'wb') as configfile: - configParser.write(configfile) + if not os.access(configFile, os.W_OK): + print 'WARNING: Config file (%s) is not writable ...' % configFile + logger.warning('Config file (%s) is not writable ...' % configFile) + return False + + with open(configFile, 'wb') as theFile: + configParser.write(theFile) + logger.info('Config file (%s) updated ...' % configFile) + def handle(msg): global configParser @@ -105,25 +113,28 @@ def handle(msg): def processFile(filename): - global chat_ids + logger.info('Processing %s' % filename) if re.match(r'.*jpg$',filename): for c in chat_ids: try: + logger.debug('sending %s as picture to %s' % (filename,c['username'])) r=bot.sendPhoto(c['id'], open(filename, 'rb')) os.remove(filename) + logger.debug('removed %s' % filename) except: time.sleep(10) if re.match(r'.*txt$',filename): for c in chat_ids: try: with open(filename,'r') as f: + logger.debug('sending %s as text to %s' % (filename,c['username'])) r=bot.sendMessage(c['id'], f.read()) os.remove(filename) + logger.debug('removed %s' % filename) except: time.sleep(10) - class FilesChangedHandler(PatternMatchingEventHandler): patterns = ["*.jpg", "*.txt"] @@ -147,88 +158,136 @@ class FilesChangedHandler(PatternMatchingEventHandler): self.process(event) - def checkFiles(): + spool_dir = configParser.get('general', 'spool_dir') + logger.info('Checking %s for new files ...' % spool_dir) l=os.listdir(spool_dir) for f in l: processFile("%s/%s" % (spool_dir,f) ) -configFile = '/etc/telegram-notify/telegram-notify.conf' -if not os.path.isfile(configFile) or not os.access(configFile, os.R_OK): - configFile = './telegram-notify.conf' +def setDefaults(): + global configFile + global defaults + configFile = '/etc/telegram-notify/telegram-notify.conf' if not os.path.isfile(configFile) or not os.access(configFile, os.R_OK): - configFile = '' + configFile = './telegram-notify.conf' + if not os.path.isfile(configFile) or not os.access(configFile, os.R_OK): + configFile = '' + logFile = '/var/log/telegram-notify.log' + if not os.path.isfile(logFile) or not os.access(logFile, os.W_OK): + logFile = '' + defaults = { + 'log_file': logFile, + 'log_level': 'info', + 'daemon': False, + 'token': '', + 'pair_pin': '1234', + 'spool_dir': '/var/spool/telegram-notify' + } -parser = argparse.ArgumentParser(description='Daemon for Telegram notification management') -parser.add_argument('-c', '--config', nargs='?', - help='start with specified config file') -parser.add_argument('-V', '--version', action='store_true', - help='show program version and quit') -args = parser.parse_args() +def parseCmdLine(): + global configFile -if args.version: - print 'telegram-notify version %s - Copyright (C) 2018 by Paolo Asperti.' % version - sys.exit(0) + parser = argparse.ArgumentParser(description='Daemon for Telegram notification management') + parser.add_argument('-c', '--config', nargs='?', + help='start with specified config file (default: telegram-notify.conf in /etc/ or in current directory)') + parser.add_argument('-V', '--version', action='store_true', + help='show program version and quit') + args = parser.parse_args() -if args.config: - if not os.path.isfile(args.config): - print 'specified config file doesn\'t exists or is not a file' + if args.version: + print 'telegram-notify version %s - Copyright (C) 2018 by Paolo Asperti.' % version + sys.exit(0) + + if args.config: + if not os.path.isfile(args.config): + print 'specified config file doesn\'t exists or is not a file' + sys.exit(1) + if not os.access(args.config, os.R_OK): + print 'specified config file is not readable' + sys.exit(1) + configFile = args.config + + +def readConfigFile(): + global configParser + if configFile == '': + print 'no config file available' sys.exit(1) - if not os.access(args.config, os.R_OK): - print 'specified config file is not readable' + + if not os.access(configFile, os.W_OK): + print 'WARNING: specified config file is not writable' + + configParser = ConfigParser.SafeConfigParser(defaults=defaults) + configParser.read(configFile) + + +def initLogger(): + global logger + + logFile = configParser.get('general', 'log_file') + if logFile == '': + print 'no log file available' sys.exit(1) - if not os.access(args.config, os.W_OK): - # TODO: logging - print 'WARNING: specified config file is not wriable' - configFile = args.config - -if configFile == '': - print 'no config file available' - sys.exit(1) + logLevel = configParser.get('general', 'log_level') + logging.basicConfig(filename=logFile,level=logLevel,format='%(asctime)s - %(name)s - %(levelname)s - %(message)s') + logger = logging.getLogger(__name__) -# TODO: logging -print 'INFO: using config file: %s' % configFile -configParser = ConfigParser.RawConfigParser() -configParser.read(configFile) +def checkSpoolDir(): + spool_dir = configParser.get('general', 'spool_dir') + if not os.path.isdir(spool_dir): + print "spool directory (%s) doesn't exists or is not a directory!" % spool_dir + sys.exit(1) -spool_dir = configParser.get('general', 'spool_dir') -if not os.path.isdir(spool_dir): - print "spool directory (%s) doesn't exists or is not a directory!" % spool_dir - sys.exit(1) + if not os.access(spool_dir, os.W_OK): + print "spool directory (%s) is not writable!" % spool_dir + sys.exit(1) -if not os.access(spool_dir, os.W_OK): - print "spool directory (%s) is not writable!" % spool_dir - sys.exit(1) -chat_ids=[] -print "Allowed users: " -for p in configParser.sections(): - if re.match('^id-.*',p): - chat_id={ - 'username': configParser.get(p,'username'), - 'firstname': configParser.get(p,'firstname'), - 'lastname': configParser.get(p,'lastname'), - 'id': int(re.sub(r'^id-','',p)) - } - chat_ids.append(chat_id) - print(" - (%s) %s %s" % (chat_id['username'],chat_id['firstname'],chat_id['lastname']) ) +def initBot(): + global bot + global chat_ids + chat_ids=[] + logger.info('Allowed users:') + for p in configParser.sections(): + if re.match('^id-.*',p): + chat_id={ + 'username': configParser.get(p,'username'), + 'firstname': configParser.get(p,'firstname'), + 'lastname': configParser.get(p,'lastname'), + 'id': int(re.sub(r'^id-','',p)) + } + chat_ids.append(chat_id) + logger.debug(" - (%s) %s %s" % (chat_id['username'],chat_id['firstname'],chat_id['lastname']) ) -token = configParser.get('general', 'token') -bot = telepot.Bot(token) + token = configParser.get('general', 'token') + bot = telepot.Bot(token) -MessageLoop(bot, handle).run_as_thread() -print 'I am listening ...' + MessageLoop(bot, handle).run_as_thread() + logger.info('Loop started. I am listening ...') -checkFiles() + checkFiles() -observer = Observer() -observer.schedule(FilesChangedHandler(), path=spool_dir) -observer.start() + spool_dir = configParser.get('general', 'spool_dir') + observer = Observer() + observer.schedule(FilesChangedHandler(), path=spool_dir) + observer.start() +setDefaults() +parseCmdLine() +readConfigFile() +initLogger() +checkSpoolDir() +initBot() + +daemon = configParser.get('general', 'daemon') + while 1: - time.sleep(10) checkFiles() + if re.match('false', daemon, re.IGNORECASE): + sys.exit(0) + time.sleep(10) diff --git a/telegram-notify.conf.default b/telegram-notify.conf.default index d69c86b..7c21fbc 100644 --- a/telegram-notify.conf.default +++ b/telegram-notify.conf.default @@ -1,5 +1,7 @@ [general] -daemon = false +daemon = true token = aaaaaaaaaaaaaaaaaaaaaaaaa pair_pin = 1234 spool_dir = /var/spool/telegram-notify +log_file = /var/log/telegram-notify.log +log_level = INFO