diff --git a/certAlert.py b/certAlert.py index da68264..ae5972f 100644 --- a/certAlert.py +++ b/certAlert.py @@ -1,17 +1,34 @@ -#!/bin/env/python -import datetime, sys, re, urllib2 +#!/usr/bin/env python +import datetime, sys, re, urllib2, logging +#from pushnotify import abstract, get_client, exceptions, pushover +import pushnotify from bs4 import BeautifulSoup +ERRSTR = '!!!!!!!!!!!!! ' + +PUSHOVER_DEVICE = 'chromehome' + TARGET_URL = 'https://www.cert-bund.de/overview/AdvisoryShort' MEMORY_PATH = 'C:\Users\Panki\Desktop\Privat\Dev\certAlert\out.txt' -PROGRAMS = [u'Chrome', u'OpenSSH', u'Java', u'Linux'] + +USER_KEY_PATH = 'C:\Users\Panki\Desktop\Privat\Dev\pushover_user' +API_KEY_PATH = 'C:\Users\Panki\Desktop\Privat\Dev\pushover_key' + +PROGRAMS = [u'Chrome', u'OpenSSH', u'Java', u'Linux', u'Apache', u'Windows'] + +with open(USER_KEY_PATH, 'r') as userKeyFile: + USER_KEY = userKeyFile.read() + userKeyFile.close() +with open(API_KEY_PATH, 'r') as apiKeyFile: + API_KEY = apiKeyFile.read() + userKeyFile.close() + class Advisory: def __init__(self, html): - self.date = datetime.datetime.strptime(html.td.text, '%d.%m.%y').date() self.risk = int(html.find('span', {'class': re.compile('search-result-crit-*')}).text) self.identifier = html.find('a', {'class': 'search-result-link'}).text - self.link = TARGET_URL + html.find('a', {'class': 'search-result-link'})['href'] + self.link = 'https://www.cert-bund.de/overview/' + html.find('a', {'class': 'search-result-link'})['href'] self.description = html.find_all('a', {'class': 'search-result-link'})[1].text def debug(self): print('date: '+ self.date.isoformat()) @@ -20,41 +37,62 @@ class Advisory: print('desc: ' + self.description) print('link: ' + self.link) -try: - response = urllib2.urlopen(TARGET_URL) -except: - e = sys.exc_info()[0] - print('Error getting Webpage!\r\n' + e) - sys.exit('Stopping execution!') -html = response.read() -soup = BeautifulSoup(html, 'html.parser') - -results = [] -for adv in soup.find_all('tr', {'class' : re.compile('search-result-*')}): - x = Advisory(adv) - results.append(x) -try: - with open(MEMORY_PATH, 'r') as memFile: - checkedIDs = memFile.read() - memFile.close() -except IOError: - print('Error reading memory file!') - print('Continuing without list of checked IDs...') - checkedIDs = '' -except: - e = sys.exc_info()[0] - print('An unknown error occured!') - print(e) -for result in results: - if result.risk > 3: - for prog in PROGRAMS: - if re.match(prog, result.description): - if result.identifier not in checkedIDs: - result.debug() - print('==================================') - else: - print('Already sent an alert for ' + result.identifier +', skipping...') -with open(MEMORY_PATH, 'w') as memFile: +def startLogger(): + logger = logging.getLogger('pushnotify') + logger.setLevel(logging.DEBUG)F + formatter = logging.Formatter('%(name)s-%(levelname)s: %(message)s') + handler = logging.StreamHandler() + handler.setFormatter(formatter) + logger.addHandler(handler) + + +def main(): + import pushnotify + startLogger() + #readKeys() + client = pushnotify.get_client('pushover', API_KEY, 'certAlert') + client.add_key(USER_KEY, PUSHOVER_DEVICE) + try: + response = urllib2.urlopen(TARGET_URL) + except: + e = sys.exc_info()[0] + print(ERRSTR + 'Error getting Webpage!\r\n' + e) + sys.exit(ERRSTR + 'Stopping execution!') + html = response.read() + soup = BeautifulSoup(html, 'html.parser') + + results = [] + for adv in soup.find_all('tr', {'class' : re.compile('search-result-*')}): + x = Advisory(adv) + results.append(x) + try: + with open(MEMORY_PATH, 'r') as memFile: + checkedIDs = memFile.read() + memFile.close() + except IOError: + print(ERRSTR + 'Error reading memory file!') + print(ERRSTR + 'Continuing without list of checked IDs...') + checkedIDs = '' + except: + e = sys.exc_info()[0] + print('An unknown error occured!') + print(e) for result in results: - memFile.write(result.identifier + '\r\n') - memFile.close() \ No newline at end of file + if result.risk > 3: + for prog in PROGRAMS: + if re.match(prog, result.description, re.IGNORECASE): + if result.identifier not in checkedIDs: + #this means we have found an alert that we have not seen before! lets alert the user... + client.notify(result.description, result.identifier, kwargs={'priority': 1, 'url': result.link,'url_title': result.identifier}); + result.debug() + print('========================================================================') + else: + print('Already sent an alert for ' + result.identifier +', skipping...') + with open(MEMORY_PATH, 'w') as memFile: + for result in results: + memFile.write(result.identifier + '\r\n') + memFile.close() + + +if __name__ == '__main__': + main() \ No newline at end of file