honestly no idea, just trying to fix my fckin git

This commit is contained in:
panki27 2018-10-17 15:52:07 +02:00
parent 6b3c04d759
commit 97bb22a290

View File

@ -1,137 +1,136 @@
#!/usr/bin/env python #!/usr/bin/env python
# before running this you might want to export PYTHONIOENCODING=UTF-8, or add it permanently to /etc/environment # before running this you might want to export PYTHONIOENCODING=UTF-8, or add it permanently to /etc/environment
import datetime, sys, re, urllib2, logging import datetime, sys, re, urllib2, logging
from bs4 import BeautifulSoup from bs4 import BeautifulSoup
from pyfcm import FCMNotification from pyfcm import FCMNotification
ERRSTR = '!!!!!!!!!!!!! ' ERRSTR = '!!!!!!!!!!!!! '
# REMEMBER TO CHANGE THESE!!! # REMEMBER TO CHANGE THESE!!!
TARGET_URL = 'https://www.cert-bund.de/overview/AdvisoryShort' TARGET_URL = 'https://www.cert-bund.de/overview/AdvisoryShort'
MEMORY_PATH = 'C:\Users\Panki\Desktop\Privat\Dev\certAlert\out.txt' MEMORY_PATH = 'C:\Users\Panki\Desktop\Privat\Dev\certAlert\out.txt'
KEY_FILE_PATH = 'C:\Users\Panki\Desktop\Privat\Dev\keyfile' KEY_FILE_PATH = 'C:\Users\Panki\Desktop\Privat\Dev\keyfile'
# To monitor more programs, simply add a string here # To monitor more programs, simply add a string here
PROGRAMS = [u'Android', u'Git', u'Chrome', u'OpenSSH', u'Java', u'Linux', u'Apache', u'Windows'] PROGRAMS = [u'Android', u'Git', u'Chrome', u'OpenSSH', u'Java', u'Linux', u'Apache', u'Windows']
# object to store a single cert alert # object to store a single cert alert
class Advisory: class Advisory:
def __init__(self, html): def __init__(self, html):
# this is the fun parts. here we 'fish' the information out of the HTML # this is the fun parts. here we 'fish' the information out of the HTML
self.date = datetime.datetime.strptime(html.td.text, '%d.%m.%y').date() 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.risk = int(html.find('span', {'class': re.compile('search-result-crit-*')}).text)
self.identifier = html.find('a', {'class': 'search-result-link'}).text self.identifier = html.find('a', {'class': 'search-result-link'}).text
self.link = 'https://www.cert-bund.de/' + html.find('a', {'class': 'search-result-link'})['href'] self.link = 'https://www.cert-bund.de/' + html.find('a', {'class': 'search-result-link'})['href']
self.description = html.find_all('a', {'class': 'search-result-link'})[1].text self.description = html.find_all('a', {'class': 'search-result-link'})[1].text
def debug(self): def debug(self):
print('date: '+ self.date.isoformat()) print('date: '+ self.date.isoformat())
print('risk: '+ str(self.risk)) print('risk: '+ str(self.risk))
print('id: ' + self.identifier) print('id: ' + self.identifier)
print('desc: ' + self.description) print('desc: ' + self.description)
print('link: ' + self.link) print('link: ' + self.link)
def startLogger(): def startLogger():
# todo: figure out how this works? # todo: figure out how this works?
# thanks to whoever i stole this from # thanks to whoever i stole this from
logger = logging.getLogger('certAlert') logger = logging.getLogger('certAlert')
logger.setLevel(logging.DEBUG) logger.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(name)s-%(levelname)s: %(message)s') formatter = logging.Formatter('%(name)s-%(levelname)s: %(message)s')
handler = logging.StreamHandler() handler = logging.StreamHandler()
handler.setFormatter(formatter) handler.setFormatter(formatter)
logger.addHandler(handler) logger.addHandler(handler)
def getHTML(url): def getHTML(url):
import urllib2 import urllib2
try: try:
response = urllib2.urlopen(url) response = urllib2.urlopen(url)
except URLError: except URLError:
print(ERRSTR + 'Failed getting webpage!') print(ERRSTR + 'Failed getting webpage!')
print(ERRSTR + 'Check your internet connection or TARGET_URL.') print(ERRSTR + 'Check your internet connection or TARGET_URL.')
sys.exit(ERRSTR + 'Stopping execution!') sys.exit(ERRSTR + 'Stopping execution!')
except: except:
e = sys.exc_info()[1] e = sys.exc_info()[1]
print(ERRSTR + 'Error getting Webpage!') print(ERRSTR + 'Error getting Webpage!')
print(e) print(e)
sys.exit(ERRSTR + 'Stopping execution!') sys.exit(ERRSTR + 'Stopping execution!')
result = response.read() result = response.read()
return result return result
def readFile(path, lines = False): def readFile(path, lines = False):
try: try:
with open(path, 'r') as file: with open(path, 'r') as file:
if(lines): if(lines):
contents = file.readlines() contents = file.readlines()
else: else:
contents = file.read() contents = file.read()
file.close() file.close()
except IOError: except IOError:
# this most likely means file not found. this can happen during the first run # this most likely means file not found. this can happen during the first run
print(ERRSTR + 'Error reading file ' + path + '!') print(ERRSTR + 'Error reading file ' + path + '!')
contents = '' contents = ''
except: except:
e = sys.exc_info()[1] e = sys.exc_info()[1]
print('An unknown error occured!') print('An unknown error occured!')
print(e) print(e)
contents = '' contents = ''
finally: finally:
return contents return contents
def main(): def main():
# this loads our API keys into memory from an external file which is specified above # this loads our API keys into memory from an external file which is specified above
try: try:
contents = readFile(KEY_FILE_PATH, True) contents = readFile(KEY_FILE_PATH, True)
# extract just the text behind the equals sign # extract just the text behind the equals sign
API_KEY = contents[0].split("=",1)[1] API_KEY = contents[0].split("=",1)[1]
USER_KEYS = contents[1].split("=",1)[1] USER_KEYS = contents[1].split("=",1)[1]
# get rid of that pesky newline # get rid of that pesky newline
API_KEY = API_KEY.strip() API_KEY = API_KEY.strip()
# now we split along semicolons to get single keys in a list # now we split along semicolons to get single keys in a list
USER_KEYS = USER_KEYS.split(";") USER_KEYS = USER_KEYS.split(";")
except: except:
e = sys.exc_info()[1] e = sys.exc_info()[1]
print(e) print(e)
print(ERRSTR + "I couldn't load your credentials. Did you specify your keyfile?") print(ERRSTR + "I couldn't load your credentials. Did you specify your keyfile?")
sys.exit(ERRSTR + 'Stopping execution!') sys.exit(ERRSTR + 'Stopping execution!')
#startLogger() #startLogger()
print('Getting client using ' + API_KEY) print('Getting client using ' + API_KEY)
client = FCMNotification(api_key=API_KEY) client = FCMNotification(api_key=API_KEY)
html = getHTML(TARGET_URL) html = getHTML(TARGET_URL)
soup = BeautifulSoup(html, 'html.parser') soup = BeautifulSoup(html, 'html.parser')
# create a list of results and add objects created with the data of each table row # create a list of results and add objects created with the data of each table row
results = [] results = []
for adv in soup.find_all('tr', {'class' : re.compile('search-result-*')}): for adv in soup.find_all('tr', {'class' : re.compile('search-result-*')}):
x = Advisory(adv) x = Advisory(adv)
results.append(x) results.append(x)
# here we're checking which advisory IDs we've already seen, # here we're checking which advisory IDs we've already seen,
# so we don't send multiple notifications for the same advisory # so we don't send multiple notifications for the same advisory
# TODO: refactor into functions writeMemory(checkeIDs), readMemory() checkedIDs = readFile(MEMORY_PATH)
checkedIDs = readFile(MEMORY_PATH) for result in results:
for result in results: if result.risk > 3:
if result.risk > 3: # here we're checking if the is related to our programs
# here we're checking if the is related to our programs for prog in PROGRAMS:
for prog in PROGRAMS: if re.search(prog, result.description, re.IGNORECASE):
if re.search(prog, result.description, re.IGNORECASE): if ( len(checkedIDs) == 0 ) or ( result.identifier not in checkedIDs ):
if ( len(checkedIDs) == 0 ) or ( result.identifier not in checkedIDs ): #this means we have found an alert that we have not seen before! lets alert the user...
#this means we have found an alert that we have not seen before! lets alert the user... for key in USER_KEYS:
for key in USER_KEYS: try:
try: key = key.rstrip()
key = key.rstrip() response = client.notify_single_device(registration_id=key, message_body=result.description, message_title=result.identifier)
response = client.notify_single_device(registration_id=key, message_body=result.description, message_title=result.identifier) except:
except: e = sys.exc_info()[1]
e = sys.exc_info()[1] print(e)
print(e) print("we fucked up!")
print("we fucked up!") result.debug()
result.debug() print('========================================================================')
print('========================================================================') else:
else: print('Already sent an alert for ' + result.identifier +', skipping...')
print('Already sent an alert for ' + result.identifier +', skipping...') # now we overwrite our memory file with the IDs we just checked
# now we overwrite our memory file with the IDs we just checked with open(MEMORY_PATH, 'w') as memFile:
with open(MEMORY_PATH, 'w') as memFile: for result in results:
for result in results: memFile.write(result.identifier + '\r')
memFile.write(result.identifier + '\r') memFile.close()
memFile.close()
if __name__ == '__main__':
if __name__ == '__main__':
main() main()