added some logging
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
2020-03-30 07:32:46 +02:00
parent 9d0bf70f37
commit e4f9ef8ea3

View File

@@ -8,69 +8,126 @@ import mechanize
import pushover import pushover
import datetime import datetime
import os import os
import logging
logging.basicConfig(level=getattr(logging, os.environ.get("LOG_LEVEL", "INFO")))
_logger = logging.getLogger(__name__)
def split_notify(string): def split_notify(string):
values = string.split(':') values = string.split(":")
return (values[0], values[1:]) return (values[0], values[1:])
def main(): def main():
try:
pushover.init(os.environ["PUSHOVER_KEY"])
except:
_logger.exception("Pushover KEY is required")
return
while True: while True:
pushover.init(os.environ['PUSHOVER_KEY']) try:
if 'HEALTHCHECK_URL' in os.environ: _logger.info("Starting Bibcheck")
if "HEALTHCHECK_URL" in os.environ:
_logger.info("Pinging Healthcheck [start]")
_logger.debug(
f"Pinging Healthcheck Url {os.environ['HEALTHCHECK_URL']}/start"
)
requests.get(f"{os.environ['HEALTHCHECK_URL']}/start") requests.get(f"{os.environ['HEALTHCHECK_URL']}/start")
allinfo = [] allinfo = []
users = list(map(lambda x: x.split(':', 1), os.environ['BIB_USERS'].split(','))) users = list(
notify = dict(map(split_notify, os.environ['NOTIFY_USERS'].split(','))) map(lambda x: x.split(":", 1), os.environ["BIB_USERS"].split(","))
)
notify = dict(map(split_notify, os.environ["NOTIFY_USERS"].split(",")))
_logger.info(f"Found {len(users)} user(s) to check for")
for user, pwd in users: for user, pwd in users:
_logger.info(f"Check for {user}")
allinfo += check(user, pwd, notify.get(user, [])) allinfo += check(user, pwd, notify.get(user, []))
if 'HEALTHCHECK_URL' in os.environ: if "HEALTHCHECK_URL" in os.environ:
requests.post(f"{os.environ['HEALTHCHECK_URL']}", data='\n'.join(allinfo).encode('utf8')) _logger.info("Pinging Healthcheck [stop]")
if 'RUN_FOREVER' in os.environ and os.environ['RUN_FOREVER'] == 'False': requests.post(
f"{os.environ['HEALTHCHECK_URL']}",
data="\n".join(allinfo).encode("utf8"),
)
if "RUN_FOREVER" in os.environ and os.environ["RUN_FOREVER"] == "False":
_logger.info("Finished")
break break
except Exception as e:
_logger.exception("Check Failed ")
if "HEALTHCHECK_URL" in os.environ:
_logger.info("Pinging Healthcheck [failed]")
_logger.debug(
f"Pinging Healthcheck Url {os.environ['HEALTHCHECK_URL']}/fail"
)
requests.post(
f"{os.environ['HEALTHCHECK_URL']}/fail",
data="\n".join(allinfo).encode("utf8"),
)
now = datetime.datetime.utcnow now = datetime.datetime.utcnow
to = (now() + datetime.timedelta(days = 1)).replace(hour=os.environ.get('RUN_AT_HOUR', 6), minute=os.environ.get('RUN_AT_MINUTE', 0), second=0) to = (now() + datetime.timedelta(days=1)).replace(
time.sleep((to-now()).seconds) hour=os.environ.get("RUN_AT_HOUR", 6),
minute=os.environ.get("RUN_AT_MINUTE", 0),
second=0,
)
_logger.info(f"Sleeping till {to.isodate()}")
time.sleep((to - now()).seconds)
def check(username, password, notify_ids): def check(username, password, notify_ids):
br = mechanize.Browser() br = mechanize.Browser()
starturl = os.environ.get('LIBRARY_URL', 'https://ssl.muenchen.de/aDISWeb/app?service=direct/0/Home/$DirectLink&sp=SOPAC') starturl = os.environ.get(
"LIBRARY_URL",
"https://ssl.muenchen.de/aDISWeb/app?service=direct/0/Home/$DirectLink&sp=SOPAC",
)
_logger.info(f"Library URL used: {starturl}")
response = br.open(starturl) response = br.open(starturl)
_logger.info(f"Goto loginpage")
br.follow_link(text_regex=r"Anmeld(en|ung abschicken)") br.follow_link(text_regex=r"Anmeld(en|ung abschicken)")
br.select_form('Form0') _logger.info(f"Fill form")
br['$Textfield'] = username br.select_form("Form0")
br['$Textfield$0'] = password br["$Textfield"] = username
br["$Textfield$0"] = password
_logger.info(f"Sumbit form")
response = br.submit() response = br.submit()
_logger.info(f"Open account page")
br.follow_link(text_regex=r"Konto") br.follow_link(text_regex=r"Konto")
try: try:
_logger.info(f"Open lent list")
response = br.follow_link(text_regex=r"Ausleihen? zeigen") response = br.follow_link(text_regex=r"Ausleihen? zeigen")
br.select_form('Form0') br.select_form("Form0")
response = br.submit(name='textButton$0', label='Alle verlängern') response = br.submit(name="textButton$0", label="Alle verlängern")
lentlist = bs4.BeautifulSoup(response.read(), 'html.parser') lentlist = bs4.BeautifulSoup(response.read(), "html.parser")
table = lentlist.select('table[class="rTable_table"]')[0] table = lentlist.select('table[class="rTable_table"]')[0]
allinfo = [] allinfo = []
for entry in table.tbody.select('tr'): _logger.info(f"Parsing table")
info = list(map(lambda x: str(x.text).strip(), entry.select('td'))) for entry in table.tbody.select("tr"):
date = datetime.datetime.strptime(info[1], '%d.%m.%Y') info = list(map(lambda x: str(x.text).strip(), entry.select("td")))
date = datetime.datetime.strptime(info[1], "%d.%m.%Y")
delta = date - datetime.datetime.now() delta = date - datetime.datetime.now()
allinfo.append(str(info)) allinfo.append(str(info))
if delta.days <= 10 or delta.days == 20 or delta.days == 15: if delta.days <= 10 or delta.days == 20 or delta.days == 15:
message = f'Bitte an {info[3]} denken\n' message = f"Bitte an {info[3]} denken\n"
if delta.days <= 7: if delta.days <= 7:
message += '<font color="#ff0000">' message += '<font color="#ff0000">'
message += f'Abgabe <b>{info[1]}</b>' message += f"Abgabe <b>{info[1]}</b>"
if delta.days <= 7: if delta.days <= 7:
message += '</font>' message += "</font>"
message += f' - {username}' message += f" - {username}"
for client in itertools.chain(notify_ids, os.environ.get('PUSHOVER_CLIENTS', '').split(',')): for client in itertools.chain(
notify_ids, os.environ.get("PUSHOVER_CLIENTS", "").split(",")
):
try: try:
pushover.Client(client).send_message(message, title="Erinnerung", html=1) pushover.Client(client).send_message(
message, title="Erinnerung", html=1
)
except: except:
print("No client") print("No client")
except (StopIteration, mechanize._mechanize.LinkNotFoundError) as e: except (StopIteration, mechanize._mechanize.LinkNotFoundError) as e:
_logger.exception("Failed to read information")
return [] return []
return allinfo return allinfo
if __name__ == "__main__": if __name__ == "__main__":
main() main()