From 47f231a7631ad9ebd99dbd4b328adaa53f0aa059 Mon Sep 17 00:00:00 2001 From: pucherot Date: Tue, 2 Feb 2021 09:57:36 +0100 Subject: [PATCH] tar update --- back/pialert.py | 45 ++++++++++++++++------------------------- tar/pialert_2.70.tar | Bin 58583040 -> 58593280 bytes tar/pialert_latest.tar | Bin 58583040 -> 58593280 bytes 3 files changed, 17 insertions(+), 28 deletions(-) diff --git a/back/pialert.py b/back/pialert.py index 781b1032..8a9fe755 100644 --- a/back/pialert.py +++ b/back/pialert.py @@ -167,8 +167,7 @@ def check_internet_IP (): def get_internet_IP (): # BUGFIX #46 - curl http://ipv4.icanhazip.com repeatedly is very slow # Using 'dig' - dig_args = ['dig', '+short', '-4', 'myip.opendns.com', - '@resolver1.opendns.com'] + dig_args = ['dig', '+short', '-4', 'myip.opendns.com', '@resolver1.opendns.com'] cmd_output = subprocess.check_output (dig_args, universal_newlines=True) ## BUGFIX #12 - Query IPv4 address (not IPv6) @@ -217,8 +216,7 @@ def get_previous_internet_IP (): #------------------------------------------------------------------------------- def save_new_internet_IP (pNewIP): # Log new IP into logfile - append_line_to_file (LOG_PATH + '/IP_changes.log', - str(startTime) +'\t'+ pNewIP +'\n') + append_line_to_file (LOG_PATH + '/IP_changes.log', str(startTime) +'\t'+ pNewIP +'\n') # Save event sql.execute ("""INSERT INTO Events (eve_MAC, eve_IP, eve_DateTime, @@ -297,8 +295,7 @@ def update_devices_MAC_vendors (pArg = ''): # print (recordsToUpdate) # update devices - sql.executemany ("UPDATE Devices SET dev_Vendor = ? WHERE dev_MAC = ? ", - recordsToUpdate ) + sql.executemany ("UPDATE Devices SET dev_Vendor = ? WHERE dev_MAC = ? ", recordsToUpdate ) # DEBUG - print number of rows updated # print (sql.rowcount) @@ -447,19 +444,16 @@ def query_ScanCycle_Data (pOpenCloseDB = False): #------------------------------------------------------------------------------- def execute_arpscan (pRetries): # Prepara command arguments - arpscan_args = ['sudo', 'arp-scan', '--localnet', '--ignoredups', - '--retry=' + str(pRetries)] + arpscan_args = ['sudo', 'arp-scan', '--localnet', '--ignoredups', '--retry=' + str(pRetries)] # TESTING - Fast Scan - # arpscan_args = ['sudo', 'arp-scan', '--localnet', '--ignoredups', - # '--retry=1'] + # arpscan_args = ['sudo', 'arp-scan', '--localnet', '--ignoredups', '--retry=1'] # DEBUG - arp-scan command # print (" ".join (arpscan_args)) # Execute command - arpscan_output = subprocess.check_output (arpscan_args, - universal_newlines=True) + arpscan_output = subprocess.check_output (arpscan_args, universal_newlines=True) # Search IP + MAC + Vendor as regular expresion re_ip = r'(?P((2[0-5]|1[0-9]|[0-9])?[0-9]\.){3}((2[0-5]|1[0-9]|[0-9])?[0-9]))' @@ -678,9 +672,9 @@ def create_new_devices (): sql.execute ("""INSERT INTO Devices (dev_MAC, dev_name, dev_Vendor, dev_LastIP, dev_FirstConnection, dev_LastConnection, dev_ScanCycle, dev_AlertEvents, dev_AlertDeviceDown, - dev_PresentLastScan) + dev_PresentLastScan, dev_NewDevice) SELECT cur_MAC, '(unknown)', cur_Vendor, cur_IP, ?, ?, - 1, 1, 0, 1 + 1, 1, 0, 1, 1 FROM CurrentScan WHERE cur_ScanCycle = ? AND NOT EXISTS (SELECT 1 FROM Devices @@ -707,9 +701,9 @@ def create_new_devices (): sql.execute ("""INSERT INTO Devices (dev_MAC, dev_name, dev_Vendor, dev_LastIP, dev_FirstConnection, dev_LastConnection, dev_ScanCycle, dev_AlertEvents, dev_AlertDeviceDown, - dev_PresentLastScan) + dev_PresentLastScan, dev_NewDevice) SELECT PH_MAC, PH_Name, PH_Vendor, IFNULL (PH_IP,'-'), - ?, ?, 1, 1, 0, 1 + ?, ?, 1, 1, 0, 1, 1 FROM PiHole_Network WHERE NOT EXISTS (SELECT 1 FROM Devices WHERE dev_MAC = PH_MAC) """, @@ -737,7 +731,7 @@ def create_new_devices (): sql.execute ("""INSERT INTO Devices (dev_MAC, dev_name, dev_LastIP, dev_Vendor, dev_FirstConnection, dev_LastConnection, dev_ScanCycle, dev_AlertEvents, dev_AlertDeviceDown, - dev_PresentLastScan) + dev_PresentLastScan, dev_NewDevice) SELECT DISTINCT DHCP_MAC, (SELECT DHCP_Name FROM DHCP_Leases AS D2 WHERE D2.DHCP_MAC = D1.DHCP_MAC @@ -745,7 +739,7 @@ def create_new_devices (): (SELECT DHCP_IP FROM DHCP_Leases AS D2 WHERE D2.DHCP_MAC = D1.DHCP_MAC ORDER BY DHCP_DateTime DESC LIMIT 1), - '(unknown)', ?, ?, 1, 1, 0, 1 + '(unknown)', ?, ?, 1, 1, 0, 1, 1 FROM DHCP_Leases AS D1 WHERE NOT EXISTS (SELECT 1 FROM Devices WHERE dev_MAC = DHCP_MAC) """, @@ -1186,8 +1180,7 @@ def email_reporting (): eventAlert['eve_EventType'], eventAlert['eve_DateTime'], eventAlert['eve_IP'], eventAlert['eve_AdditionalInfo']) - format_report_section (mail_section_Internet, 'SECTION_INTERNET', - 'TABLE_INTERNET', mail_text_Internet, mail_html_Internet) + format_report_section (mail_section_Internet, 'SECTION_INTERNET', 'TABLE_INTERNET', mail_text_Internet, mail_html_Internet) # Compose New Devices Section mail_section_new_devices = False @@ -1214,8 +1207,7 @@ def email_reporting (): eventAlert['eve_DateTime'], eventAlert['eve_IP'], eventAlert['dev_Name'], eventAlert['eve_AdditionalInfo']) - format_report_section (mail_section_new_devices, 'SECTION_NEW_DEVICES', - 'TABLE_NEW_DEVICES', mail_text_new_devices, mail_html_new_devices) + format_report_section (mail_section_new_devices, 'SECTION_NEW_DEVICES', 'TABLE_NEW_DEVICES', mail_text_new_devices, mail_html_new_devices) # Compose Devices Down Section mail_section_devices_down = False @@ -1241,8 +1233,7 @@ def email_reporting (): eventAlert['eve_DateTime'], eventAlert['eve_IP'], eventAlert['dev_Name']) - format_report_section (mail_section_devices_down, 'SECTION_DEVICES_DOWN', - 'TABLE_DEVICES_DOWN', mail_text_devices_down, mail_html_devices_down) + format_report_section (mail_section_devices_down, 'SECTION_DEVICES_DOWN', 'TABLE_DEVICES_DOWN', mail_text_devices_down, mail_html_devices_down) # Compose Events Section mail_section_events = False @@ -1272,8 +1263,7 @@ def email_reporting (): eventAlert['eve_EventType'], eventAlert['dev_Name'], eventAlert['eve_AdditionalInfo']) - format_report_section (mail_section_events, 'SECTION_EVENTS', - 'TABLE_EVENTS', mail_text_events, mail_html_events) + format_report_section (mail_section_events, 'SECTION_EVENTS', 'TABLE_EVENTS', mail_text_events, mail_html_events) # DEBUG - Write output emails for testing if True : @@ -1329,8 +1319,7 @@ def remove_section (pText, pSection): if pText.find ('<'+ pSection +'>') >=0 \ and pText.find ('') >=0 : # return text without the section - return pText[:pText.find ('<'+ pSection+'>')] + \ - pText[pText.find ('') + len (pSection) +3:] + return pText[:pText.find ('<'+ pSection+'>')] + pText[pText.find ('') + len (pSection) +3:] else : # return all text return pText diff --git a/tar/pialert_2.70.tar b/tar/pialert_2.70.tar index 9dea4b460c96d8d62995b5d191a1f5147749072c..568487f4b63a5b0c3de1e5b8a55b86b9e955ae1c 100644 GIT binary patch delta 4705 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 Yx2Jm=MmvL-r<|GY$xAsi!;@F-KaOr@r2qf` diff --git a/tar/pialert_latest.tar b/tar/pialert_latest.tar index 9dea4b460c96d8d62995b5d191a1f5147749072c..568487f4b63a5b0c3de1e5b8a55b86b9e955ae1c 100644 GIT binary patch delta 4705 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 Yx2Jm=MmvL-r<|GY$xAsi!;@F-KaOr@r2qf`