diff --git a/front/php/server/traceroute.php b/front/php/server/traceroute.php old mode 100644 new mode 100755 diff --git a/front/plugins/csv_backup/README.md b/front/plugins/csv_backup/README.md index 48c16bab..e742cf39 100755 --- a/front/plugins/csv_backup/README.md +++ b/front/plugins/csv_backup/README.md @@ -4,10 +4,5 @@ Plugin generating CSV backups of your Devices database table, including the netw ### Usage -- Go to settings and find TBC +- If the devices.csv file can be overwritten or the date and time timestamp added to the name. This is toggled with the `CSVBCKP_overwrite` setting. -#### Examples: -- TBC - -### Known Limitations -- TBC diff --git a/front/plugins/csv_backup/config.json b/front/plugins/csv_backup/config.json index 04e31149..0337ad08 100755 --- a/front/plugins/csv_backup/config.json +++ b/front/plugins/csv_backup/config.json @@ -49,7 +49,7 @@ "function": "RUN", "type": "text.select", "default_value":"disabled", - "options": ["disabled", "once", "always_after_scan"], + "options": ["disabled", "once", "schedule", "always_after_scan", "on_new_device"], "localized": ["name", "description"], "name" :[{ "language_code":"en_us", @@ -61,7 +61,7 @@ }], "description": [{ "language_code":"en_us", - "string" : "When the backup should be created. A daily SCHEDULE is a good option." + "string" : "When the backup should be created. A daily or weekly SCHEDULE is a good option." }] }, { @@ -94,7 +94,7 @@ { "function": "RUN_SCHD", "type": "text", - "default_value":"0 2 3 * *", + "default_value":"0 2 * * 3", "options": [], "localized": ["name", "description"], "name" : [{ @@ -153,7 +153,7 @@ }], "description": [{ "language_code":"en_us", - "string" : "If the devices.csv file should be always overwritten. If disabled, the date and time is added to the name." + "string" : "If the devices.csv file should be always overwritten. If disabled, the date and time is added to the name." }] }, { @@ -168,7 +168,7 @@ }], "description": [{ "language_code":"en_us", - "string" : "Where the devices.csv file should be saved." + "string" : "Where the devices.csv file should be saved. For example /home/pi/pialert/config." }] } ], diff --git a/front/plugins/csv_backup/script.py b/front/plugins/csv_backup/script.py index 1126cd33..45a501a3 100755 --- a/front/plugins/csv_backup/script.py +++ b/front/plugins/csv_backup/script.py @@ -1,5 +1,6 @@ #!/usr/bin/env python -# test script by running python script.py devices=test,dummy +# test script by running: +# /home/pi/pialert/front/plugins/csv_backup/script.py overwrite=False location=/home/pi/pialert/config import os import pathlib @@ -7,12 +8,13 @@ import argparse import sys import hashlib import csv +import sqlite3 from io import StringIO +from datetime import datetime sys.path.append("/home/pi/pialert/front/plugins") sys.path.append('/home/pi/pialert/pialert') -import database from plugin_helper import Plugin_Object, Plugin_Objects, decodeBase64 from logger import mylog, append_line_to_file from helper import timeNowTZ @@ -26,53 +28,66 @@ RESULT_FILE = os.path.join(CUR_PATH, 'last_result.log') def main(): # the script expects a parameter in the format of devices=device1,device2,... - parser = argparse.ArgumentParser(description='TBC') - parser.add_argument('location', action="store", help="TBC") - parser.add_argument('overwrite', action="store", help="TBC") + parser = argparse.ArgumentParser(description='Export devices data to CSV') + parser.add_argument('overwrite', action="store", help="Specify 'TRUE' to overwrite an existing file, or 'FALSE' to create a new file") + parser.add_argument('location', action="store", help="The directory where the CSV file will be saved") values = parser.parse_args() + overwrite = values.overwrite.split('=')[1] + + if (overwrite.upper() == "TRUE"): + overwrite = True + else: + overwrite = False + mylog('verbose', ['[CSVBCKP] In script']) - # plugin_objects = Plugin_Objects( RESULT_FILE ) + # Connect to the PiAlert SQLite database + conn = sqlite3.connect('/home/pi/pialert/db/pialert.db') + cursor = conn.cursor() - # if values.devices: - # for fake_dev in values.devices.split('=')[1].split(','): + # Execute your SQL query + cursor.execute("SELECT * FROM Devices") - # fake_mac = string_to_mac_hash(fake_dev) + # Get column names + columns = [desc[0] for desc in cursor.description] - # plugin_objects.add_object( - # primaryId=fake_dev, # MAC (Device Name) - # secondaryId="0.0.0.0", # IP Address (always 0.0.0.0) - # watched1=fake_dev, # Device Name - # watched2="", - # watched3="", - # watched4="", - # extra="", - # foreignKey=fake_mac) + if overwrite: + filename = 'devices.csv' + else: + timestamp = datetime.now().strftime('%Y%m%d%H%M%S') + filename = f'devices_{timestamp}.csv' - # plugin_objects.write_result_file() + fullPath = os.path.join(values.location.split('=')[1], filename) - # # Execute your SQL query - # cursor.execute("SELECT * FROM Devices") + mylog('verbose', ['[CSVBCKP] Writing file ', fullPath]) - # # Get column names - # columns = [desc[0] for desc in cursor.description] + # Create a CSV file in the specified location + with open(fullPath, 'w', newline='') as csvfile: + # Initialize the CSV writer + csv_writer = csv.writer(csvfile, delimiter=',', quoting=csv.QUOTE_MINIMAL) - # # Initialize the CSV writer - # csv_writer = csv.writer(output, quoting=csv.QUOTE_MINIMAL) + # Wrap the header values in double quotes and write the header row + csv_writer.writerow([ '"' + col + '"' for col in columns]) - # # Write the header row - # csv_writer.writerow(columns) + # Fetch and write data rows + for row in cursor.fetchall(): + # Wrap each value in double quotes and write the row + csv_writer.writerow(['"' + str(value) + '"' for value in row]) - # # Fetch and write data rows - # for row in cursor.fetchall(): - # csv_writer.writerow(row) + # Close the database connection + conn.close() - # # Close the database connection - # conn.close() + # Open the CSV file for reading + with open(fullPath, 'r') as file: + data = file.read() - # # Prepare the CSV data for download - # csv_data = output.getvalue() + # Replace all occurrences of """ with " + data = data.replace('"""', '"') + + # Open the CSV file for writing + with open(fullPath, 'w') as file: + file.write(data) return 0 diff --git a/pialert/logger.py b/pialert/logger.py index fb846ed4..24e2f331 100755 --- a/pialert/logger.py +++ b/pialert/logger.py @@ -19,8 +19,6 @@ def timeNowTZ(): return datetime.datetime.now().replace(microsecond=0) -# conf.LOG_LEVEL = get_setting_value("LOG_LEVEL") - #------------------------------------------------------------------------------- debugLevels = [ ('none', 0), ('minimal', 1), ('verbose', 2), ('debug', 3) @@ -49,23 +47,9 @@ def file_print (*args): for arg in args: result += str(arg) print(result) - - # try: - # # # Open the file - # # file = open(logPath + "/pialert.log", "a") - - # # # Write to the file - # # file.write(result + '\n') - - # # # Close the file - # # file.close() - + append_to_file_with_timeout(logPath + "/pialert.log", result + '\n', 5) - # except Exception as e: - # # Handle the exception, e.g., log it or print an error message - # print(f"Error opening or writing to the file: {e}") - #------------------------------------------------------------------------------- # Function to append to the file def append_to_file(file_path, data):