From bef8309d200dfb86570752494d70e0d327f8ddcc Mon Sep 17 00:00:00 2001 From: Tristan Ancelet Date: Sat, 13 May 2023 13:25:45 -0500 Subject: [PATCH] moved all un-necessary files out of webroot directory. --- Database/create-database.sql | 54 ++++++++++++++++++++++++++++++++ Site | 2 +- count-crontabs.sh | 19 +++++++++++ update-database.sh | 59 +++++++++++++++++++++++++++++++++++ webcron.db | Bin 0 -> 28672 bytes 5 files changed, 133 insertions(+), 1 deletion(-) create mode 100644 Database/create-database.sql create mode 100755 count-crontabs.sh create mode 100755 update-database.sh create mode 100644 webcron.db diff --git a/Database/create-database.sql b/Database/create-database.sql new file mode 100644 index 0000000..e6eb32b --- /dev/null +++ b/Database/create-database.sql @@ -0,0 +1,54 @@ +CREATE TABLE IF NOT EXISTS log_levels ( + log_level_id INTEGER PRIMARY KEY, + log_level_name VARCHAR(10) NOT NULL +); + +INSERT INTO log_levels (log_level_id, log_level_name) VALUES + (0, 'INFO'), + (1, 'CRITICAL'), + (2, 'WARNING'); + +CREATE TABLE IF NOT EXISTS logs ( + log_id INTEGER PRIMARY KEY AUTOINCREMENT, + log_level_id INTEGER NOT NULL DEFAULT 0, + log_source VARCHAR NOT NULL, -- This will be a unix path '/path/to/script' + log_message TEXT NOT NULl, + log_entry_timestamp DATETIME DEFAULT CURRENT_TIMESTAMP, + + FOREIGN KEY (log_level_id) REFERENCES log_levels(log_level_id) +); + + +CREATE VIEW IF NOT EXISTS log_statistics AS + SELECT levels.log_level_name, COUNT(logs.log_id) FROM logs + JOIN log_levels levels ON log_levels.log_level_id = logs.log_level_id + GROUP BY logs.log_level_id; + +CREATE VIEW IF NOT EXISTS log_statistics_last_7_days AS + SELECT log_levels.log_level_name, COUNT(logs.log_id) as count FROM logs + JOIN log_levels ON log_levels.log_level_id = logs.log_level_id + WHERE logs.log_entry_timestamp > DATETIME(CURRENT_TIMESTAMP, '-7 day') + GROUP BY logs.log_level_id; + + +CREATE TABLE IF NOT EXISTS job_history ( + job_id INTEGER PRIMARY KEY AUTOINCREMENT, + job_source TEXT NOT NULL, -- This will be the path to the script + job_result VARCHAR(7) NOT NULL, -- will be N/A, Fail or Success + job_exit_code INTEGER NOT NULL, + job_timestamp DATETIME DEFAULT CURRENT_TIMESTAMP +); + +CREATE VIEW IF NOT EXISTS last_ten_failed_jobs AS + SELECT job_timestamp, job_source, job_exit_code FROM job_history + WHERE job_result = "Fail" + ORDER BY job_timestamp DESC + LIMIT 10; + +CREATE TABLE IF NOT EXISTS crontabs ( + crontab_id INTEGER PRIMARY KEY AUTOINCREMENT, + crontab_path VARCHAR NOT NULL UNIQUE, -- this will be the parent directory of the crontab file + crontab_created_timestamp DATETIME DEFAULT CURRENT_TIMESTAMP, + crontab_modified_timestamp DATETIME DEFAULT CURRENT_TIMESTAMP, + crontab_data BLOB NOT NULL +); \ No newline at end of file diff --git a/Site b/Site index 77ac940..9a1139e 160000 --- a/Site +++ b/Site @@ -1 +1 @@ -Subproject commit 77ac940c7a5952ccc772b2cdbf83fd98756b34aa +Subproject commit 9a1139edaeab309f9cf7eaf4b6431c339638be41 diff --git a/count-crontabs.sh b/count-crontabs.sh new file mode 100755 index 0000000..9ea45d8 --- /dev/null +++ b/count-crontabs.sh @@ -0,0 +1,19 @@ +total_count=0 +declare -a crontab_dirs=( + /etc/cron.d + /etc/cron.daily + /etc/cron.hourly + /etc/cron.weekly + /var/spool/cron +) + +for dir in ${crontab_dirs[@]}; do + count=0; + for file in $dir/*; do + count=` ls -1 $dir | wc -l ` + done + echo "- $dir: $count
" + total_count=$(( $count + $total_count )) +done + +echo "Total: $total_count" \ No newline at end of file diff --git a/update-database.sh b/update-database.sh new file mode 100755 index 0000000..4704072 --- /dev/null +++ b/update-database.sh @@ -0,0 +1,59 @@ +#!/usr/bin/bash +[[ -f ~/.bashrc ]] && . .bashrc + +declare -a crontab_dirs=( + /etc/cron.d + /etc/cron.daily + /etc/cron.hourly + /etc/cron.weekly + /var/spool/cron +) + +declare -a crontabs_in_db + +sqlite_cmd='sqlite3 $WEBCRON_DB' + + +for name in $( $sqlite_cmd <<< "SELECT crontab_path FROM crontabs;"); do + crontabs_in_db+=( "$name" ) +done + +# This will go through and count the number of files in each directory (to determine if they need to be checked) +for dir in ${crontab_dirs[@]}; do + # If the directory has less than 1 crontab (aka empty) it will be skipped + if [[ $( ls -1 $dir | wc -l ) -ge 1 ]]; then + for file in $dir/* ; do + # For each file in the directory it will check to see if the current file + # path is already stored in the DB + # if not it will create one and it will be be indexed in the DB + if [[ -f $file ]] && [[ ! "${crontabs_in_db[@]}" == *$file* ]]; then + $sqlite_cmd <<< " + INSERT INTO crontabs (crontab_path, crontab_data) VALUES + ('$file', + '$(<$file)') + " + fi + done + fi +done + +# This will request all of the information from the db relating to all of the indexed crontab's +IFS='|' +while read crontab_id crontab_path; do + # It will initially request the id and path of the file, and then will load in the actual data of the + # file to be compared to the file content's on disk. + data=`sqlite3 $WEBCRON_DB <<< "SELECT crontab_data FROM crontabs WHERE crontab_id = $crontab_id"` + + # this will check to make sure that the file exists on disk and + # will compare the disk and db versions of the file to make sure if a change is needed to be + # loaded into the db. + if [[ -f $crontab_path ]] && [[ ! "$data" == "$(<$crontab_path)" ]]; then + sqlite3 $WEBCRON_DB <<<" + UPDATE crontabs SET crontab_data = '$(<$crontab_path)' WHERE crontab_id = $crontab_id + " + fi + +done <<< ` sqlite3 $WEBCRON_DB <<< " +SELECT crontab_id crontab_name, crontab_path FROM crontabs; +" ` +unset IFS \ No newline at end of file diff --git a/webcron.db b/webcron.db new file mode 100644 index 0000000000000000000000000000000000000000..db0c4e9a4ea4e613b60cf9b8dd32a88e7d948f45 GIT binary patch literal 28672 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 literal 0 HcmV?d00001