Adds initial support for MySQL/MariaDB and database checks.

main
Yasen Pramatarov 2024-05-29 11:24:58 +03:00
parent 6633278599
commit 0e858d8f38
2 changed files with 90 additions and 25 deletions

95
jilo
View File

@ -6,6 +6,8 @@
# Bash script for Jitsi Meet components (Videobridge, Jicofo, etc.) logs parsing
###
### Configuration file (overrides default configs)
CONFIG_FILE="./jilo.conf"
### Default configuration
@ -14,11 +16,15 @@ DEFAULT_JVB_LOGFILE="/var/log/jitsi/jvb.log"
DEFAULT_JVB_PROCESS="videobridge"
DEFAULT_JICOFO_LOGFILE="/var/log/jitsi/jicofo.log"
DEFAULT_JICOFO_PROCESS="jicofo"
# Default database type (sqlite, mysql|mariadb)
DEFAULT_DB_TYPE="sqlite"
# Default SQLite database file
DEFAULT_DB="./jilo.db"
# Configuration file
CONFIG_FILE="./jilo.conf"
# Default MySQL/MariaDB configuration
DEFAULT_MYSQL_HOST="localhost"
DEFAULT_MYSQL_USER="jilo"
DEFAULT_MYSQL_PASS="jilopass"
DEFAULT_MYSQL_DB="jilo_db"
# Load configurations from the config file if it exists
if [[ -f "$CONFIG_FILE" ]]; then
@ -31,10 +37,15 @@ JVB_PROCESS=${JVB_PROCESS:-$DEFAULT_JVB_PROCESS}
JICOFO_LOGFILE=${JICOFO_LOGFILE:-$DEFAULT_JICOFO_LOGFILE}
JICOFO_PROCESS=${JICOFO_PROCESS:-$DEFAULT_JICOFO_PROCESS}
DB=${DB:-$DEFAULT_DB}
DB_TYPE=${DB_TYPE:-$DEFAULT_DB_TYPE}
MYSQL_HOST=${MYSQL_HOST:-$DEFAULT_MYSQL_HOST}
MYSQL_USER=${MYSQL_USER:-$DEFAULT_MYSQL_USER}
MYSQL_PASS=${MYSQL_PASS:-$DEFAULT_MYSQL_PASS}
MYSQL_DB=${MYSQL_DB:-$DEFAULT_MYSQL_DB}
###
# SQLite queries
# DB queries
db_get_state_template="SELECT filename, filetime, filesize, position, inode FROM state WHERE jitsi_component = '%s';"
db_set_state_template="UPDATE state SET time=datetime('now'), filename='%s', filetime='%s', filesize='%s', position='%s', inode='%s' WHERE jitsi_component = '%s';"
db_insert_template="INSERT INTO conferences (jitsi_component, conference_name, conference_id, start, end) VALUES ('%s', '%s', '%s', '%s', '%s');"
@ -90,12 +101,30 @@ check_requirements
###
# DB functions
# DB functions for Sqlite3 and for MySQL/MariaDB
# normalize DB schemas for Sqlite3 and MySQL/MariaDB in order to compare them when needed
db_normalize_schema() {
echo "$1" | tr -d '\n' | tr -s ' ' | sed 's/,/,\n/g' | sort
}
# execute a query and return the result
db_query() {
local query=$1
if [[ "$DB_TYPE" == "sqlite" ]]; then
sqlite3 "$DB" "$query"
elif [[ "$DB_TYPE" == "mysql" || "$DB_TYPE" == "mariadb" ]]; then
mysql -h "$MYSQL_HOST" -u "$MYSQL_USER" -p "$MYSQL_PASS" -D "$MYSQL_DB" -se "$query"
else
echo "Error: unknown database type $DB_TYPE."
exit 1
fi
}
# Get the last processed state from the database
get_state() {
db_get_state=$(printf "$db_get_state_template" "$1")
sqlite3 "$DB" "$db_get_state"
db_query "$db_get_state"
}
# Update the state database
@ -107,7 +136,7 @@ set_state() {
local inode=$5
local jitsi_component=$6
db_set_state=$(printf "$db_set_state_template" "$filename" "$filetime" "$filesize" "$position" "$inode" "$jitsi_component")
sqlite3 "$DB" "$db_set_state"
db_query "$db_set_state"
}
###
@ -162,7 +191,7 @@ jitsi_log_parse() {
if [[ -n "$start_time" ]]; then
db_insert=$(printf "$db_insert_template" "$jitsi_component" "$conferenceName" "$conferenceId" "$start_time" "$end_time")
sqlite3 "$DB" "$db_insert"
db_query "$db_insert"
unset "start_times[$conferenceId]"
fi
fi
@ -184,7 +213,7 @@ jitsi_log_parse() {
if [[ -n "$start_time" ]]; then
db_insert=$(printf "$db_insert_template" "$jitsi_component" "$conferenceName" "$conferenceId" "$start_time" "$end_time")
sqlite3 "$DB" "$db_insert"
db_query "$db_insert"
unset "start_times[$conferenceName]"
fi
fi
@ -237,35 +266,69 @@ shift $((OPTIND -1))
case "$cmd" in
--create-db)
sqlite3 "$DB" "$db_drop"
sqlite3 "$DB" "$db_create"
sqlite3 "$DB" "$db_init"
db_query "$db_drop"
db_query "$db_create"
db_query "$db_init"
echo "Database created."
exit 0
;;
--flush)
sqlite3 "$DB" "$db_flush"
sqlite3 "$DB" "$db_init"
db_query "$db_flush"
db_query "$db_init"
echo "Tables flushed."
exit 0
;;
--check)
# database checks
if [[ "$DB_TYPE" == "sqlite" ]]; then
# First check if database exists
if [[ ! -f "$DB" ]]; then
echo "Database not found. If it's a fresh install, please install the database first."
exit 1
fi
# compare the DB schema to the expected one
# get current and expected db schemas in comparable format
current_db_schema=$(sqlite3 "$DB" .schema)
if [[ "$current_db_schema" != "$db_create" ]]; then
current_db_schema_normalized=$(db_normalize_schema "$current_db_schema")
expected_db_schema_normalized=$(db_normalize_schema "$db_create")
# compare the DB schema to the expected one
if [[ "$current_db_schema_normalized" != "$expected_db_schema_normalized" ]]; then
echo "The database doesn't match the expected schema. Please check it, and if needed, reinstall it."
exit 1
fi
elif [[ "$DB_TYPE" == "mysql" || "$DB_TYPE" == "mariadb" ]]; then
# First check if database exists
if ! mysql -h "$MYSQL_HOST" -u "$MYSQL_USER" -p "$MYSQL_PASS" -e "USE $MYSQL_DB"; then
echo "Database not found. If it's a fresh install, please install the database first."
exit 1
fi
# get current and expected db schemas in comparable format
current_db_schema=''
for table in conferences state; do
current_db_schema+=$(mysql -h "$MYQL_HOST" -u "$MYSQL_USER" -p "$MYSQL_PASS" -D "$MYSQL_DB" -e "SHOW CREATE TABLE $table\G" | grep -v "Table" | grep -v "Create Table" | sed 's/^\s*//g')
done
current_db_schema_normalized=$(db_normalize_schema "$current_db_schema")
expected_db_schema_normalized=$(db_normalize_schema "$db_create")
# compare the DB schema to the expected one
if [[ "$current_db_schema_normalized" != "$expected_db_schema_normalized" ]]; then
echo "The database doesn't match the expected schema. Please check it, and if needed, reinstall it."
exit 1
fi
else
echo "Error: unknown database type $DB_TYPE."
exit 1
fi
# Check if log files exist
jvb_found=false
jicofo_found=false

View File

@ -1,5 +1,7 @@
###
# jilo.conf - configuration variables for JItso Log Observer
# the values here override the default ones in JILO
###
JVB_LOGFILE="./jvb.log"
JICOFO_LOGFILE="./jicofo.log"
DB="./jilo.db"