added logging

This commit is contained in:
Paolo Asperti 2018-01-14 22:01:01 +01:00
parent 0c01c20880
commit 0388bf7ad2
3 changed files with 127 additions and 65 deletions

1
.gitignore vendored
View File

@ -1 +1,2 @@
telegram-notify.conf telegram-notify.conf
telegram-notify.log

View File

@ -10,16 +10,24 @@ import json
import sys import sys
import os import os
import argparse import argparse
import logging
from telepot.loop import MessageLoop from telepot.loop import MessageLoop
from watchdog.observers import Observer from watchdog.observers import Observer
from watchdog.events import PatternMatchingEventHandler from watchdog.events import PatternMatchingEventHandler
version = 0.1 version = 0.1
def writeconfig(): def writeconfig():
global configParser if not os.access(configFile, os.W_OK):
with open('telegram-notify.conf', 'wb') as configfile: print 'WARNING: Config file (%s) is not writable ...' % configFile
configParser.write(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): def handle(msg):
global configParser global configParser
@ -105,25 +113,28 @@ def handle(msg):
def processFile(filename): def processFile(filename):
global chat_ids logger.info('Processing %s' % filename)
if re.match(r'.*jpg$',filename): if re.match(r'.*jpg$',filename):
for c in chat_ids: for c in chat_ids:
try: try:
logger.debug('sending %s as picture to %s' % (filename,c['username']))
r=bot.sendPhoto(c['id'], open(filename, 'rb')) r=bot.sendPhoto(c['id'], open(filename, 'rb'))
os.remove(filename) os.remove(filename)
logger.debug('removed %s' % filename)
except: except:
time.sleep(10) time.sleep(10)
if re.match(r'.*txt$',filename): if re.match(r'.*txt$',filename):
for c in chat_ids: for c in chat_ids:
try: try:
with open(filename,'r') as f: with open(filename,'r') as f:
logger.debug('sending %s as text to %s' % (filename,c['username']))
r=bot.sendMessage(c['id'], f.read()) r=bot.sendMessage(c['id'], f.read())
os.remove(filename) os.remove(filename)
logger.debug('removed %s' % filename)
except: except:
time.sleep(10) time.sleep(10)
class FilesChangedHandler(PatternMatchingEventHandler): class FilesChangedHandler(PatternMatchingEventHandler):
patterns = ["*.jpg", "*.txt"] patterns = ["*.jpg", "*.txt"]
@ -147,23 +158,41 @@ class FilesChangedHandler(PatternMatchingEventHandler):
self.process(event) self.process(event)
def checkFiles(): def checkFiles():
spool_dir = configParser.get('general', 'spool_dir')
logger.info('Checking %s for new files ...' % spool_dir)
l=os.listdir(spool_dir) l=os.listdir(spool_dir)
for f in l: for f in l:
processFile("%s/%s" % (spool_dir,f) ) processFile("%s/%s" % (spool_dir,f) )
def setDefaults():
global configFile
global defaults
configFile = '/etc/telegram-notify/telegram-notify.conf' configFile = '/etc/telegram-notify/telegram-notify.conf'
if not os.path.isfile(configFile) or not os.access(configFile, os.R_OK): if not os.path.isfile(configFile) or not os.access(configFile, os.R_OK):
configFile = './telegram-notify.conf' configFile = './telegram-notify.conf'
if not os.path.isfile(configFile) or not os.access(configFile, os.R_OK): if not os.path.isfile(configFile) or not os.access(configFile, os.R_OK):
configFile = '' 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'
}
def parseCmdLine():
global configFile
parser = argparse.ArgumentParser(description='Daemon for Telegram notification management') parser = argparse.ArgumentParser(description='Daemon for Telegram notification management')
parser.add_argument('-c', '--config', nargs='?', parser.add_argument('-c', '--config', nargs='?',
help='start with specified config file') help='start with specified config file (default: telegram-notify.conf in /etc/ or in current directory)')
parser.add_argument('-V', '--version', action='store_true', parser.add_argument('-V', '--version', action='store_true',
help='show program version and quit') help='show program version and quit')
args = parser.parse_args() args = parser.parse_args()
@ -179,21 +208,35 @@ if args.config:
if not os.access(args.config, os.R_OK): if not os.access(args.config, os.R_OK):
print 'specified config file is not readable' print 'specified config file is not readable'
sys.exit(1) 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 configFile = args.config
def readConfigFile():
global configParser
if configFile == '': if configFile == '':
print 'no config file available' print 'no config file available'
sys.exit(1) sys.exit(1)
if not os.access(configFile, os.W_OK):
print 'WARNING: specified config file is not writable'
# TODO: logging configParser = ConfigParser.SafeConfigParser(defaults=defaults)
print 'INFO: using config file: %s' % configFile
configParser = ConfigParser.RawConfigParser()
configParser.read(configFile) configParser.read(configFile)
def initLogger():
global logger
logFile = configParser.get('general', 'log_file')
if logFile == '':
print 'no log 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__)
def checkSpoolDir():
spool_dir = configParser.get('general', 'spool_dir') spool_dir = configParser.get('general', 'spool_dir')
if not os.path.isdir(spool_dir): if not os.path.isdir(spool_dir):
print "spool directory (%s) doesn't exists or is not a directory!" % spool_dir print "spool directory (%s) doesn't exists or is not a directory!" % spool_dir
@ -203,8 +246,12 @@ if not os.access(spool_dir, os.W_OK):
print "spool directory (%s) is not writable!" % spool_dir print "spool directory (%s) is not writable!" % spool_dir
sys.exit(1) sys.exit(1)
def initBot():
global bot
global chat_ids
chat_ids=[] chat_ids=[]
print "Allowed users: " logger.info('Allowed users:')
for p in configParser.sections(): for p in configParser.sections():
if re.match('^id-.*',p): if re.match('^id-.*',p):
chat_id={ chat_id={
@ -214,21 +261,33 @@ for p in configParser.sections():
'id': int(re.sub(r'^id-','',p)) 'id': int(re.sub(r'^id-','',p))
} }
chat_ids.append(chat_id) chat_ids.append(chat_id)
print(" - (%s) %s %s" % (chat_id['username'],chat_id['firstname'],chat_id['lastname']) ) logger.debug(" - (%s) %s %s" % (chat_id['username'],chat_id['firstname'],chat_id['lastname']) )
token = configParser.get('general', 'token') token = configParser.get('general', 'token')
bot = telepot.Bot(token) bot = telepot.Bot(token)
MessageLoop(bot, handle).run_as_thread() MessageLoop(bot, handle).run_as_thread()
print 'I am listening ...' logger.info('Loop started. I am listening ...')
checkFiles() checkFiles()
spool_dir = configParser.get('general', 'spool_dir')
observer = Observer() observer = Observer()
observer.schedule(FilesChangedHandler(), path=spool_dir) observer.schedule(FilesChangedHandler(), path=spool_dir)
observer.start() observer.start()
setDefaults()
parseCmdLine()
readConfigFile()
initLogger()
checkSpoolDir()
initBot()
daemon = configParser.get('general', 'daemon')
while 1: while 1:
time.sleep(10)
checkFiles() checkFiles()
if re.match('false', daemon, re.IGNORECASE):
sys.exit(0)
time.sleep(10)

View File

@ -1,5 +1,7 @@
[general] [general]
daemon = false daemon = true
token = aaaaaaaaaaaaaaaaaaaaaaaaa token = aaaaaaaaaaaaaaaaaaaaaaaaa
pair_pin = 1234 pair_pin = 1234
spool_dir = /var/spool/telegram-notify spool_dir = /var/spool/telegram-notify
log_file = /var/log/telegram-notify.log
log_level = INFO