reworked logger class - also handles bot crashes and tbs now. added configline for log directory.
This commit is contained in:
parent
8357be7f7d
commit
654af44534
|
@ -28,6 +28,8 @@ passphrase = "sup3rs3cur3"
|
||||||
# when it breaks down), you should specify a contact email address:
|
# when it breaks down), you should specify a contact email address:
|
||||||
#contact = "your_mail@riseup.net"
|
#contact = "your_mail@riseup.net"
|
||||||
|
|
||||||
|
[logging]
|
||||||
|
logpath = "logs"
|
||||||
|
|
||||||
# [trigger]
|
# [trigger]
|
||||||
# goodlists are one regex per line.
|
# goodlists are one regex per line.
|
||||||
|
|
54
logger.py
54
logger.py
|
@ -2,18 +2,40 @@
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import datetime
|
import datetime
|
||||||
|
import traceback
|
||||||
|
import sys
|
||||||
|
import sendmail
|
||||||
|
|
||||||
|
|
||||||
class Logger(object):
|
class Logger(object):
|
||||||
|
"""
|
||||||
|
builds log files, writes the log messages.
|
||||||
|
If a critical error occurs, handles the bugtracking and error
|
||||||
|
messages.
|
||||||
|
"""
|
||||||
|
|
||||||
def __init__(self, logpath=None):
|
def __init__(self, config):
|
||||||
|
"""
|
||||||
|
logs everything & sends bugtracking messages.
|
||||||
|
|
||||||
|
:param config: config file
|
||||||
|
"""
|
||||||
|
self.config = config
|
||||||
|
|
||||||
# initialize logging
|
# initialize logging
|
||||||
if logpath:
|
if config["logging"]["logpath"]:
|
||||||
self.logpath = logpath
|
self.logpath = os.path.join(self.config["logging"]["logpath"], str(datetime.datetime.now()))
|
||||||
else:
|
else:
|
||||||
self.logpath = os.path.join("logs", str(datetime.datetime.now()))
|
self.logpath = os.path.join("logs", str(datetime.datetime.now()))
|
||||||
print("Path of logfile: " + self.logpath)
|
print("Path of logfile: " + self.logpath)
|
||||||
|
|
||||||
|
# intialize shutdown contact
|
||||||
|
try:
|
||||||
|
self.no_shutdown_contact = False
|
||||||
|
self.contact = self.config['mail']['contact']
|
||||||
|
except KeyError:
|
||||||
|
self.no_shutdown_contact = True
|
||||||
|
|
||||||
def log(self, message):
|
def log(self, message):
|
||||||
"""
|
"""
|
||||||
Writing an error message & sometimes a traceback to a logfile in logs/
|
Writing an error message & sometimes a traceback to a logfile in logs/
|
||||||
|
@ -30,3 +52,29 @@ class Logger(object):
|
||||||
self.log("Failed to save log message due to UTF-8 error. ")
|
self.log("Failed to save log message due to UTF-8 error. ")
|
||||||
print(line, end="")
|
print(line, end="")
|
||||||
|
|
||||||
|
def generate_tb(self, exc):
|
||||||
|
tb = traceback.extract_tb(exc[2]) # returns StackSummary object
|
||||||
|
tb = "\n".join(tb.format()) # string of the actual traceback
|
||||||
|
message = ("Traceback (most recent call last):\n",
|
||||||
|
tb,
|
||||||
|
exc[0].__name__) # the type of the Exception
|
||||||
|
message = "".join(message) # concatenate to full traceback message
|
||||||
|
return message
|
||||||
|
|
||||||
|
def shutdown(self, tb):
|
||||||
|
""" If something breaks, it shuts down the bot and messages the owner.
|
||||||
|
|
||||||
|
:param tb: (string) traceback
|
||||||
|
"""
|
||||||
|
logmessage = "Shit went wrong, closing down.\n" + tb + "\n\n"
|
||||||
|
if self.no_shutdown_contact:
|
||||||
|
self.log(logmessage)
|
||||||
|
return
|
||||||
|
logmessage = logmessage + "Sending message to " + self.contact
|
||||||
|
self.log(logmessage)
|
||||||
|
try:
|
||||||
|
mailer = sendmail.Mailer(self.config)
|
||||||
|
mailer.send(tb, self.contact, "Ticketfrei Crash Report")
|
||||||
|
except:
|
||||||
|
self.log(self.generate_tb(sys.exc_info()))
|
||||||
|
print()
|
||||||
|
|
45
retootbot.py
45
retootbot.py
|
@ -8,15 +8,13 @@ import re
|
||||||
import time
|
import time
|
||||||
import trigger
|
import trigger
|
||||||
import logger
|
import logger
|
||||||
import sendmail
|
|
||||||
import traceback
|
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
|
|
||||||
class RetootBot(object):
|
class RetootBot(object):
|
||||||
def __init__(self, config, filter, logger):
|
def __init__(self, config, trigger, logger):
|
||||||
self.config = config
|
self.config = config
|
||||||
self.filter = filter
|
self.trigger = trigger
|
||||||
self.client_id = self.register()
|
self.client_id = self.register()
|
||||||
self.m = self.login()
|
self.m = self.login()
|
||||||
|
|
||||||
|
@ -27,13 +25,6 @@ class RetootBot(object):
|
||||||
except IOError:
|
except IOError:
|
||||||
self.seen_toots = set()
|
self.seen_toots = set()
|
||||||
|
|
||||||
# intialize shutdown contact
|
|
||||||
try:
|
|
||||||
self.no_shutdown_contact = False
|
|
||||||
self.contact = self.config['mail']['contact']
|
|
||||||
except KeyError:
|
|
||||||
self.no_shutdown_contact = True
|
|
||||||
|
|
||||||
self.logger = logger
|
self.logger = logger
|
||||||
|
|
||||||
def register(self):
|
def register(self):
|
||||||
|
@ -75,7 +66,7 @@ class RetootBot(object):
|
||||||
self.seen_toots.add(notification['status']['id'])
|
self.seen_toots.add(notification['status']['id'])
|
||||||
text_content = re.sub(r'<[^>]*>', '',
|
text_content = re.sub(r'<[^>]*>', '',
|
||||||
notification['status']['content'])
|
notification['status']['content'])
|
||||||
if not self.filter.is_ok(text_content):
|
if not self.trigger.is_ok(text_content):
|
||||||
continue
|
continue
|
||||||
self.logger.log('Boosting toot from %s: %s' % (
|
self.logger.log('Boosting toot from %s: %s' % (
|
||||||
# notification['status']['id'],
|
# notification['status']['id'],
|
||||||
|
@ -95,25 +86,6 @@ class RetootBot(object):
|
||||||
# return mentions for mirroring
|
# return mentions for mirroring
|
||||||
return retoots
|
return retoots
|
||||||
|
|
||||||
def shutdown(self, tb):
|
|
||||||
""" If something breaks, it shuts down the bot and messages the owner.
|
|
||||||
"""
|
|
||||||
logmessage = "Shit went wrong, closing down.\n" + tb + "\n\n"
|
|
||||||
if self.no_shutdown_contact:
|
|
||||||
self.logger.log(logmessage)
|
|
||||||
return
|
|
||||||
logmessage = logmessage + "Sending message to " + self.contact
|
|
||||||
self.logger.log(logmessage)
|
|
||||||
# feature yet only in RetweetBot:
|
|
||||||
# self.save_last_mention()
|
|
||||||
try:
|
|
||||||
mailer = sendmail.Mailer(self.config)
|
|
||||||
mailer.send(tb, self.contact, "Ticketfrei Crash Report")
|
|
||||||
except:
|
|
||||||
# traceback.print_exc()
|
|
||||||
self.logger.log(traceback.extract_tb(sys.exc_info()[2]))
|
|
||||||
print()
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
# read config in TOML format (https://github.com/toml-lang/toml#toml)
|
# read config in TOML format (https://github.com/toml-lang/toml#toml)
|
||||||
|
@ -121,7 +93,7 @@ if __name__ == '__main__':
|
||||||
config = toml.load(configfile)
|
config = toml.load(configfile)
|
||||||
|
|
||||||
trigger = trigger.Trigger(config)
|
trigger = trigger.Trigger(config)
|
||||||
logger = logger.Logger()
|
logger = logger.Logger(config)
|
||||||
|
|
||||||
bot = RetootBot(config, trigger, logger)
|
bot = RetootBot(config, trigger, logger)
|
||||||
|
|
||||||
|
@ -133,11 +105,6 @@ if __name__ == '__main__':
|
||||||
print("Good bye. Remember to restart the bot!")
|
print("Good bye. Remember to restart the bot!")
|
||||||
except:
|
except:
|
||||||
exc = sys.exc_info() # returns tuple [Exception type, Exception object, Traceback object]
|
exc = sys.exc_info() # returns tuple [Exception type, Exception object, Traceback object]
|
||||||
tb = traceback.extract_tb(exc[2]) # returns StackSummary object
|
message = logger.generate_tb(exc)
|
||||||
tb = "\n".join(tb.format()) # string of the actual traceback
|
|
||||||
message = ("Traceback (most recent call last):\n",
|
|
||||||
tb,
|
|
||||||
exc[0].__name__) # the type of the Exception
|
|
||||||
message = "".join(message) # concatenate to full traceback message
|
|
||||||
bot.logger.log(message)
|
bot.logger.log(message)
|
||||||
bot.shutdown(message)
|
bot.logger.shutdown(message)
|
||||||
|
|
|
@ -6,9 +6,7 @@ import requests
|
||||||
import pytoml as toml
|
import pytoml as toml
|
||||||
import trigger
|
import trigger
|
||||||
from time import sleep
|
from time import sleep
|
||||||
import traceback
|
|
||||||
import logger
|
import logger
|
||||||
import sendmail
|
|
||||||
|
|
||||||
|
|
||||||
class RetweetBot(object):
|
class RetweetBot(object):
|
||||||
|
@ -216,26 +214,6 @@ class RetweetBot(object):
|
||||||
# Return Retweets for tooting on mastodon
|
# Return Retweets for tooting on mastodon
|
||||||
return mastodon
|
return mastodon
|
||||||
|
|
||||||
def shutdown(self, tb):
|
|
||||||
""" If something breaks, it shuts down the bot and messages the owner.
|
|
||||||
|
|
||||||
:param tb: (string) traceback
|
|
||||||
"""
|
|
||||||
logmessage = "Shit went wrong, closing down.\n" + tb + "\n\n"
|
|
||||||
if self.no_shutdown_contact:
|
|
||||||
self.logger.log(logmessage)
|
|
||||||
return
|
|
||||||
logmessage = logmessage + "Sending message to " + self.contact
|
|
||||||
self.logger.log(logmessage)
|
|
||||||
self.save_last_mention()
|
|
||||||
try:
|
|
||||||
mailer = sendmail.Mailer(self.config)
|
|
||||||
mailer.send(tb, self.contact, "Ticketfrei Crash Report")
|
|
||||||
except:
|
|
||||||
# traceback.print_exc()
|
|
||||||
self.logger.log(traceback.extract_tb(sys.exc_info()[2]))
|
|
||||||
print()
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
# create an Api object
|
# create an Api object
|
||||||
|
@ -243,7 +221,7 @@ if __name__ == "__main__":
|
||||||
config = toml.load(configfile)
|
config = toml.load(configfile)
|
||||||
|
|
||||||
trigger = trigger.Trigger(config)
|
trigger = trigger.Trigger(config)
|
||||||
logger = logger.Logger()
|
logger = logger.Logger(config)
|
||||||
|
|
||||||
bot = RetweetBot(trigger, config, logger)
|
bot = RetweetBot(trigger, config, logger)
|
||||||
try:
|
try:
|
||||||
|
@ -254,11 +232,7 @@ if __name__ == "__main__":
|
||||||
print("Good bye. Remember to restart the bot!")
|
print("Good bye. Remember to restart the bot!")
|
||||||
except:
|
except:
|
||||||
exc = sys.exc_info() # returns tuple [Exception type, Exception object, Traceback object]
|
exc = sys.exc_info() # returns tuple [Exception type, Exception object, Traceback object]
|
||||||
tb = traceback.extract_tb(exc[2]) # returns StackSummary object
|
message = logger.generate_tb(exc)
|
||||||
tb = "\n".join(tb.format()) # string of the actual traceback
|
|
||||||
message = ("Traceback (most recent call last):\n",
|
|
||||||
tb,
|
|
||||||
exc[0].__name__) # the type of the Exception
|
|
||||||
message = "".join(message) # concatenate to full traceback message
|
|
||||||
bot.logger.log(message)
|
bot.logger.log(message)
|
||||||
bot.shutdown(message)
|
bot.save_last_mention()
|
||||||
|
bot.logger.shutdown(message)
|
||||||
|
|
|
@ -43,11 +43,12 @@ class Mailer(object):
|
||||||
|
|
||||||
return "Sent mail to " + recipient + ": " + subject
|
return "Sent mail to " + recipient + ": " + subject
|
||||||
|
|
||||||
|
|
||||||
# For testing:
|
# For testing:
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
# read config in TOML format (https://github.com/toml-lang/toml#toml)
|
# read config in TOML format (https://github.com/toml-lang/toml#toml)
|
||||||
with open('config.toml') as configfile:
|
with open('config.toml') as configfile:
|
||||||
config = toml.load(configfile)
|
config = toml.load(configfile)
|
||||||
|
|
||||||
m = Mailer(config)
|
m = Mailer(config)
|
||||||
print(m.send("This is a test mail.", m.fromaddr, "Test"))
|
print(m.send("This is a test mail.", m.fromaddr, "Test"))
|
||||||
|
|
|
@ -3,10 +3,7 @@
|
||||||
import pytoml as toml
|
import pytoml as toml
|
||||||
import logger
|
import logger
|
||||||
import time
|
import time
|
||||||
import traceback
|
|
||||||
import os
|
|
||||||
import sys
|
import sys
|
||||||
import datetime
|
|
||||||
|
|
||||||
from retootbot import RetootBot
|
from retootbot import RetootBot
|
||||||
from retweetbot import RetweetBot
|
from retweetbot import RetweetBot
|
||||||
|
@ -20,8 +17,7 @@ if __name__ == '__main__':
|
||||||
|
|
||||||
trigger = Trigger(config)
|
trigger = Trigger(config)
|
||||||
|
|
||||||
logpath = os.path.join("logs", str(datetime.datetime.now()))
|
logger = logger.Logger(config)
|
||||||
logger = logger.Logger(logpath)
|
|
||||||
|
|
||||||
mbot = RetootBot(config, trigger, logger)
|
mbot = RetootBot(config, trigger, logger)
|
||||||
tbot = RetweetBot(trigger, config, logger)
|
tbot = RetweetBot(trigger, config, logger)
|
||||||
|
@ -36,11 +32,7 @@ if __name__ == '__main__':
|
||||||
print("Good bye. Remember to restart the bot!")
|
print("Good bye. Remember to restart the bot!")
|
||||||
except:
|
except:
|
||||||
exc = sys.exc_info() # returns tuple [Exception type, Exception object, Traceback object]
|
exc = sys.exc_info() # returns tuple [Exception type, Exception object, Traceback object]
|
||||||
tb = traceback.extract_tb(exc[2]) # returns StackSummary object
|
message = logger.generate_tb(exc)
|
||||||
tb = "\n".join(tb.format()) # string of the actual traceback
|
|
||||||
message = ("Traceback (most recent call last):\n",
|
|
||||||
tb,
|
|
||||||
exc[0].__name__) # the type of the Exception
|
|
||||||
message = "".join(message) # concatenate to full traceback message
|
|
||||||
tbot.logger.log(message)
|
tbot.logger.log(message)
|
||||||
tbot.shutdown(message)
|
tbot.save_last_mention()
|
||||||
|
tbot.logger.shutdown(message)
|
||||||
|
|
Loading…
Reference in a new issue