Compare commits

...

17 Commits
v0.1 ... v0.1.1

Author SHA1 Message Date
Yasen Pramatarov e889455d49 Version bump 2024-06-18 11:08:35 +03:00
Yasen Pramatarov da341499c3 Version bump 2024-06-18 11:05:02 +03:00
Yasen Pramatarov a5149bf765 Prepares for release 0.1.1 2024-06-18 10:58:37 +03:00
Yasen Pramatarov 2bd065da9c Update README.md 2024-06-18 07:42:51 +00:00
Yasen Pramatarov 99b70ae22a RPM build fixes 2024-06-17 19:25:59 +03:00
Yasen Pramatarov 05bc27ed24 RPM build fixes 2024-06-17 19:11:23 +03:00
Yasen Pramatarov 2f01a349c7 Updates changelog 2024-06-17 18:09:02 +03:00
Yasen Pramatarov 56c0b0340a Initial packaging for DEB and RPM 2024-06-17 18:07:03 +03:00
Yasen Pramatarov 3db637ab65 Adds duration and number of participants in conferences lists. 2024-06-17 13:30:47 +03:00
Yasen Pramatarov 76384d2216 Formats log regexps docs 2024-06-16 10:37:00 +00:00
Yasen Pramatarov 6acf8e6ad7 Update log-regexps.txt
Formats log regexps docs
2024-06-16 10:25:25 +00:00
Yasen Pramatarov 7a10ac6822 Updates CHANGELOG 2024-06-15 10:11:16 +03:00
Yasen Pramatarov 4329c7449f Fixes the silent option when listing all conferences. 2024-06-15 10:05:27 +03:00
Yasen Pramatarov 931a4bab8c Avoids double counting conferences. 2024-06-14 20:45:01 +03:00
Yasen Pramatarov 5f4b3dc467 Fixes all the command line options for conferences, participants and time period. 2024-06-14 15:29:55 +03:00
Yasen Pramatarov d5a9a74879 Updates jilo-cli to filter conferences by time period. 2024-06-13 21:09:44 +03:00
Yasen Pramatarov da0011869d Adds CHANGELOG 2024-06-13 11:27:27 +03:00
13 changed files with 779 additions and 251 deletions

3
.gitignore vendored
View File

@ -1,4 +1,5 @@
*.log
*.log.*
jitsi-stats.db
jilo.db
packaging/deb-package/
packaging/rpm-package/

61
CHANGELOG.md 100644
View File

@ -0,0 +1,61 @@
# Changelog
All notable changes to this project will be documented in this file.
---
## Unreleased
#### Links
- upstream: https://code.lindeas.com/lindeas/jilo/compare/v0.1.1...HEAD
- codeberg: https://codeberg.org/lindeas/jilo/compare/v0.1.1...HEAD
- github: https://github.com/lindeas/jilo/compare/v0.1.1...HEAD
- gitlab: https://gitlab.com/lindeas/jilo/-/compare/v0.1.1...HEAD
### Added
### Changed
### Fixed
---
## 0.1.1 - 2024-06-18
#### Links
- upstream: https://code.lindeas.com/lindeas/jilo/compare/v0.1...v0.1.1
- codeberg: https://codeberg.org/lindeas/jilo/compare/v0.1...v0.1.1
- github: https://github.com/lindeas/jilo/compare/v0.1...v0.1.1
- gitlab: https://gitlab.com/lindeas/jilo/-/compare/v0.1...v0.1.1
### Added
- Initial changelog following the keepachangelog.com format
- Added "silent" option to jilo-cli, suitable for scripting
- Added time duration and number of participants in conferences listings
- Added man page
- Added build resources and scripts for DEB and RPM packages
- Initial build of the DEB and RPM packages
- Added DEB repository
### Changed
- Updated the way jilo-cli handles multiple options, added filtering conferences by time period
### Fixed
- Fixed an error in double counting of conferences in jilo-cli
## 0.1 - 2024-06-12
#### Links
- upstream: https://code.lindeas.com/lindeas/jilo/releases/tag/v0.1
- codeberg: https://codeberg.org/lindeas/jilo/releases/tag/v0.1
- github: https://github.com/lindeas/jilo/releases/tag/v0.1
- gitlab: https://gitlab.com/lindeas/jilo/-/releases/v0.1
### Added
- Initial version of jilo and jilo-cli
- Basic functionality for JVB and Jicofo logs scanning
- Searching through conferences, participants, events and in time periods
- Detecting logs rotation and saving last parsed line
- Support for both SQLite3 and MySQL/MariaDB
- Minimal external dependencies, using Bash built-in commands as much as possible

View File

@ -18,7 +18,7 @@ You are welcome to send feedback with issues, comments and pull requests to a gi
## version
Current version: **0.1** released on **2024-06-12**
Current version: **0.1.1** released on **2024-06-18**
## components
@ -34,7 +34,15 @@ It needs access to the jilo database.
## installation
Clone the git repo:
You can install it in the following ways:
- use the latest deb package from the **[APT repo](https://lindeas.com/debian)** - recommended for Debian/Ubuntu
- use the latest **RPM package** - recommended for rpm-based systems
- download the latest release from the **"Releases"** section here
- clone the **git repo**:
```bash
git clone https://github.com/lindeas/jilo.git
cd jilo

View File

@ -12,6 +12,7 @@
- issues
- errors
- ~~info about JVBs used~~
- ~~add to conference listings: duration, number of participants~~
* Web interface
- initial version
---
@ -20,3 +21,4 @@
- ~~finish SQL refactoring, move to separate tables for conferences and participants, linked by id~~
- ~~update jilo-cli to work with new SQL~~
- ~~fix sqlite and mysql schemas differences with the new SQL~~
- there is a bug in '-c CONFERENCE_ID' - it doesn't always show the first participant

4
jilo
View File

@ -6,8 +6,8 @@
# Bash script for Jitsi Meet components (Videobridge, Jicofo, etc.) logs parsing
###
VERSION="0.1"
RELEASE_DATE="2024-06-12"
VERSION="0.1.1"
RELEASE_DATE="2024-06-18"
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" #"

618
jilo-cli
View File

@ -7,8 +7,8 @@
# Command line interface (jilo-cli)
###
VERSION="0.1"
RELEASE_DATE="2024-06-12"
VERSION="0.1.1"
RELEASE_DATE="2024-06-18"
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" #"
@ -51,10 +51,30 @@ IMPORTANT_TEXT=${IMPORTANT_TEXT:-$DEFAULT_IMPORTANT_TEXT}
## conference related
db_conferences_all_formatted_template="
SELECT
SELECT DISTINCT
c.jitsi_component,
(SELECT ce.time
FROM conference_events ce
WHERE
ce.conference_id = c.conference_id
AND
ce.conference_event = 'conference expired')
AS start,
(SELECT ce.time
FROM conference_events ce
WHERE
ce.conference_id = c.conference_id
AND
ce.conference_event = 'conference created')
AS end,
c.conference_id,
c.conference_name,
(SELECT COUNT(pe.participant_id) AS participants
FROM participant_events pe
WHERE
pe.event_type = 'participant joining'
AND
pe.event_param = c.conference_id),
name_counts.name_count,
c.conference_host
FROM
@ -68,11 +88,12 @@ JOIN (
GROUP BY
conference_name
) AS name_counts ON c.conference_name = name_counts.conference_name
JOIN
conference_events ce ON c.conference_id = ce.conference_id
WHERE (ce.time >= '%s' AND ce.time <= '%s')
ORDER BY
c.id;"
db_conferences_id_template="SELECT * FROM conferences WHERE conference_id='%s';"
db_conferences_name_template="SELECT * FROM conferences WHERE conference_name='%s';"
db_conference_events_template="SELECT * FROM conference_events WHERE conference_id='%s';"
db_conference_by_id_template="
SELECT
pe.time,
@ -93,6 +114,7 @@ LEFT JOIN
participant_events pe ON p.endpoint_id = pe.participant_id
WHERE
c.conference_id = '%s'
AND (pe.time >= '%s' AND pe.time <= '%s')
UNION
@ -111,9 +133,11 @@ LEFT JOIN
conference_events ce ON c.conference_id = ce.conference_id
WHERE
c.conference_id = '%s'
AND (event_time >= '%s' AND event_time <= '%s')
ORDER BY
pe.time;"
db_conference_by_name_template="
SELECT
pe.time,
@ -134,6 +158,7 @@ LEFT JOIN
participant_events pe ON p.endpoint_id = pe.participant_id
WHERE
c.conference_name = '%s'
AND (pe.time >= '%s' AND pe.time <= '%s')
UNION
@ -152,20 +177,23 @@ LEFT JOIN
conference_events ce ON c.conference_id = ce.conference_id
WHERE
c.conference_name = '%s'
AND (event_time >= '%s' AND event_time <= '%s')
ORDER BY
pe.time;"
## participant related
db_participants_all_template="SELECT jitsi_component, endpoint_id, conference_id FROM participants ORDER BY id;"
db_participants_id_template="SELECT * FROM participants WHERE endpoint_id='%s';"
db_participant_events_template="SELECT * FROM participant_events WHERE participant_id='%s';"
db_participants_endpoint_template="SELECT * FROM participants WHERE endpoint_id='%s';"
db_participants_conference_template="SELECT * FROM participants WHERE conference_id='%s';"
db_participants_statsid_template="SELECT * FROM participant_events WHERE event_type = 'stats_id' AND event_param LIKE '%%%s%%';"
db_participants_ip_template="SELECT * FROM participant_events WHERE event_type = 'pair selected' AND event_param='%s';"
db_participants_all_template="
SELECT DISTINCT
p.jitsi_component, p.endpoint_id, p.conference_id
FROM
participants p
JOIN
participant_events pe ON p.endpoint_id = pe.participant_id
WHERE
pe.time >= '%s' AND pe.time <= '%s'
ORDER BY p.id;"
db_conference_by_participant_id_template="
SELECT
@ -187,6 +215,7 @@ LEFT JOIN
participant_events pe ON p.endpoint_id = pe.participant_id
WHERE
p.endpoint_id = '%s'
AND (pe.time >= '%s' AND pe.time <= '%s')
UNION
@ -205,6 +234,7 @@ LEFT JOIN
conference_events ce ON c.conference_id = ce.conference_id
WHERE
participant_id = '%s'
AND (event_time >= '%s' AND event_time <= '%s')
ORDER BY
pe.time;"
@ -228,7 +258,8 @@ LEFT JOIN
LEFT JOIN
participant_events pe ON p.endpoint_id = pe.participant_id
WHERE
pe.event_param = '%s'
c.conference_id = '%s'
AND (pe.time >= '%s' AND pe.time <= '%s')
UNION
@ -246,7 +277,51 @@ FROM
LEFT JOIN
conference_events ce ON c.conference_id = ce.conference_id
WHERE
event_param = '%s'
ce.conference_id = '%s'
AND (event_time >= '%s' AND event_time <= '%s')
ORDER BY
pe.time;"
db_participant_by_conference_name_template="
SELECT
pe.time,
c.conference_id,
c.conference_name,
c.conference_host,
pe.loglevel,
pe.event_type,
p.endpoint_id AS participant_id,
pe.event_param
FROM
conferences c
LEFT JOIN
conference_events ce ON c.conference_id = ce.conference_id
LEFT JOIN
participants p ON c.conference_id = p.conference_id
LEFT JOIN
participant_events pe ON p.endpoint_id = pe.participant_id
WHERE
c.conference_name LIKE '%%%s%%'
AND (pe.time >= '%s' AND pe.time <= '%s')
UNION
SELECT
ce.time AS event_time,
c.conference_id,
c.conference_name,
c.conference_host,
ce.loglevel,
ce.conference_event AS event_type,
NULL AS participant_id,
ce.conference_param AS event_param
FROM
conferences c
LEFT JOIN
conference_events ce ON c.conference_id = ce.conference_id
WHERE c.conference_name LIKE '%%%s%%'
AND (event_time >= '%s' AND event_time <= '%s')
ORDER BY
pe.time;"
@ -271,6 +346,7 @@ LEFT JOIN
participant_events pe ON p.endpoint_id = pe.participant_id
WHERE
pe.event_type = 'stats_id' AND pe.event_param LIKE '%%%s%%'
AND (pe.time >= '%s' AND pe.time <= '%s')
UNION
@ -289,6 +365,7 @@ LEFT JOIN
conference_events ce ON c.conference_id = ce.conference_id
WHERE
event_type = 'stats_id' AND event_param LIKE '%%%s%%'
AND (event_time >= '%s' AND event_time <= '%s')
ORDER BY
pe.time;"
@ -313,6 +390,7 @@ LEFT JOIN
participant_events pe ON p.endpoint_id = pe.participant_id
WHERE
pe.event_type = 'pair selected' AND pe.event_param = '%s'
AND (pe.time >= '%s' AND pe.time <= '%s')
UNION
@ -331,6 +409,7 @@ LEFT JOIN
conference_events ce ON c.conference_id = ce.conference_id
WHERE
event_type = 'pair selected' AND event_param = '%s'
AND (event_time >= '%s' AND event_time <= '%s')
ORDER BY
pe.time;"
@ -380,13 +459,14 @@ ORDER BY
pe.time;"
help="Usage:
$0 [OPTION]
Options:
--conference|-c [conference ID or name] - show specific conference(s), all of empty
--participant|-p [participant endpoint ID, conference ID, participant IP, or participant stats ID] - show specific participant(s), all if empty
--time|-t - show stats for a time interval
--participant|-p [participant endpoint ID, conference ID, conference name, participant IP, or participant stats ID] - show specific participant(s), all if empty
--time|-t - show stats for a time interval; can be use separately ot together with -c or -p
--verbose|-v - show more details, when available
--silent|-s - show less details, more suitable for scripting
--help|-h - show this help message
--version|-V - show version"
@ -395,6 +475,16 @@ version="JILO Jitsi Logs Observer command line client
version $VERSION
released on $RELEASE_DATE"
time_formats="Expected formats:
- exact times
YYYY-MM-DD, YYYY-MM, YYYY
- exact periods
YYYY-MM-DD:YYYY-MM-DD, YYYY-MM:YYYY-MM, YYYY:YYYY
- from begining to given time
:YYYY-MM-DD, :YYYY-MM, :YYYY
- from given time until end
YYYY-MM-DD:, YYYY-MM:, YYYY:"
###
@ -497,34 +587,51 @@ parse_time_range() {
until_time="9999-12-31"
else
echo -e "Invalid time range. Expected formats:
- exact times
YYYY-MM-DD, YYYY-MM, YYYY
- exact periods
YYYY-MM-DD:YYYY-MM-DD, YYYY-MM:YYYY-MM, YYYY:YYYY
- from begining to given time
:YYYY-MM-DD, :YYYY-MM, :YYYY
- from given time until end
YYYY-MM-DD:, YYYY-MM:, YYYY:" >&2
echo -e "Invalid time range. $time_formats" >&2
exit 1
fi
time_range_specified=true
}
# we have two timestamps in format YYYY-MM-DD HH:MM:SS.sss
# calculate and return the durtion in format HH:MM:SS
calculate_duration() {
start=$(date -d "$1" +"%s")
end=$(date -d "$2" +"%s")
duration_seconds=$((end - start))
hours=$((duration_seconds / 3600))
duration_seconds_remain=$((duration_seconds % 3600))
minutes=$((duration_seconds_remain / 60))
seconds=$((duration_seconds_remain % 60))
# add leading zeroes
duration=$(printf "%02d:%02d:%02d" $hours $minutes $seconds)
}
### commandline options
cmd=""
conference_arg=""
conference_option=false
participant_arg=""
from_time=""
until_time=""
participant_option=false
from_time="0000-00-00"
until_time="9999-12-31"
time_option=false
time_range_specified=false
# display help if no arguments
if [[ $# -eq 0 ]]; then
echo -e "$help"
exit 0
fi
# then check all the options
while [[ $# -gt 0 ]]; do
case "$1" in
-c | --conference )
cmd="--conference"
conference_option=true
if [[ -n "$2" && "$2" != -* ]]; then
conference_arg="$2"
shift 2
@ -533,7 +640,7 @@ while [[ $# -gt 0 ]]; do
fi
;;
-p | --participant)
cmd="--participant"
participant_option=true
if [[ -n "$2" && "$2" != -* ]]; then
participant_arg="$2"
shift 2
@ -542,15 +649,23 @@ while [[ $# -gt 0 ]]; do
fi
;;
-t | --time)
cmd="--time"
time_option=true
if [[ -n "$2" && "$2" != -* ]]; then
parse_time_range "$2"
shift 2
else
echo "Option -t needs time range argument in format 'from-time - until-time', YYYY-MM-DD - YYYY-MM-DD" >&2
echo "Option -t needs a time range argument. $time_formats" >&2
exit 1
fi
;;
-v | --verbose)
verbose=true
shift
;;
-s | --silent)
silent=true
shift
;;
-h | --help)
echo -e "$help"
exit 0
@ -567,148 +682,270 @@ while [[ $# -gt 0 ]]; do
esac
done
case "$cmd" in
if [[ "$conference_option" == true ]]; then
--conference)
# the argument to "--conference" can be either ID or name
if [[ -n "$conference_arg" ]]; then
# the argument to "--conference" can be either ID or name
if [[ -n "$conference_arg" ]]; then
db_conferences_id=$(printf "$db_conferences_id_template" "$conference_arg")
conferences_id=$(db_query "$db_conferences_id")
# check for conferences match within a time period (or all if not period given)
db_conferences_id=$(printf "$db_conference_by_id_template" "$conference_arg" "$from_time" "$until_time" "$conference_arg" "$from_time" "$until_time")
mapfile -t conferences_id < <(db_query "$db_conferences_id")
db_conferences_name=$(printf "$db_conference_by_name_template" "$conference_arg" "$from_time" "$until_time" "$conference_arg" "$from_time" "$until_time")
mapfile -t conferences_name < <(db_query "$db_conferences_name")
db_conferences_name=$(printf "$db_conferences_name_template" "$conference_arg")
conferences_name=$(db_query "$db_conferences_name")
# we check if the argument to "--conference" is a conference ID
# conference ID is unique, so we show that conference
if [[ "${#conferences_id[@]}" -gt 0 ]]; then
# we check if the argument to "--conference" is a conference ID
# conference ID is unique, so we show that conference
if [[ -n "$conferences_id" ]]; then
db_conference=$(printf "$db_conference_by_id_template" "$conference_arg" "$conference_arg")
mapfile -t conference_array < <(db_query "$db_conference")
# prepare the header
output="time\tconference ID\tconference name\tconference host\tloglevel\tparticipant ID\tevent\tparameter\n"
# prepare the formatted rows
for row in "${conference_array[@]}"; do
IFS='|' read -r time conference_id conference_name conference_host loglevel event_type participant_id event_param <<< "$row"
output+="$time\t$IMPORTANT_TEXT$conference_id$NORMAL_TEXT\t$conference_name\t$conference_host\t$loglevel\t$participant_id\t$event_type\t$event_param\n"
done
# output
echo -e "$output" | column -t -s $'\t'
# then we check if the argument to "--conference" is a conference name
# if so, we show all matching conferences (conference names are not unique)
elif [[ -n "$conferences_name" ]]; then
db_conference=$(printf "$db_conference_by_name_template" "$conference_arg" "$conference_arg")
mapfile -t conference_array < <(db_query "$db_conference")
# prepare the header
output="time\tconf ID\tconf name\tconf host\tloglevel\tparticipant ID\tevent\tparameter\n"
# prepare the formatted rows
for row in "${conference_array[@]}"; do
IFS='|' read -r time conference_id conference_name conference_host loglevel event_type participant_id event_param <<< "$row"
output+="$time\t$conference_id\t$IMPORTANT_TEXT$conference_name$NORMAL_TEXT\t$conference_host\t$loglevel\t$participant_id\t$event_type\t$event_param\n"
done
# output
echo -e "$output" | column -t -s $'\t'
# nothing found for neither conference ID or name
else
echo "No match found for \"$conference_arg\""
fi
exit 0
else
# if no argument is given, we show all the conferences
mapfile -t conference_array < <(db_query "$db_conferences_all_formatted_template")
output=""
# prepare the header
output="component\tconference ID\tconference name\tname count\tconference host\n"
if [[ "$silent" != true ]]; then
header="\nConferences with ID matching \"$IMPORTANT_TEXT$conference_arg$NORMAL_TEXT\""
if [[ "$time_range_specified" == true ]]; then
header+=" for the time period \"$from_time - $until_time\""
fi
header+="\n"
echo -e "$header"
output="time\tconference ID\tconference name\tconference host\tloglevel\tparticipant ID\tevent\tparameter\n"
fi
# prepare the formatted rows
for row in "${conference_array[@]}"; do
IFS='|' read -r jitsi_component conference_id conference_name name_count conference_host <<< "$row"
output+="$jitsi_component\t$conference_id\t$conference_name\t$name_count\t$conference_host\n"
for row in "${conferences_id[@]}"; do
IFS='|' read -r time conference_id conference_name conference_host loglevel event_type participant_id event_param <<< "$row"
output+="$time\t$IMPORTANT_TEXT$conference_id$NORMAL_TEXT\t$conference_name\t$conference_host\t$loglevel\t$participant_id\t$event_type\t$event_param\n"
done
# output
echo -e "$output" | column -t -s $'\t'
exit 0
fi
;;
--participant)
# the argument to "--participant" can be endpointID, conferenceID, startsID, IP address
# we check for all ot them and show the matches
if [[ -n "$participant_arg" ]]; then
db_participants_endpoint=$(printf "$db_participants_endpoint_template" "$participant_arg")
participants_endpoint=$(db_query "$db_participants_endpoint")
# then we check if the argument to "--conference" is a conference name
# if so, we show all matching conferences (conference names are not unique)
elif [[ "${#conferences_name[@]}" -gt 0 ]]; then
db_participants_conference=$(printf "$db_participants_conference_template" "$participant_arg")
participants_conference=$(db_query "$db_participants_conference")
db_participants_statsid=$(printf "$db_participants_statsid_template" "$participant_arg")
participants_statsid=$(db_query "$db_participants_statsid")
db_participants_ip=$(printf "$db_participants_ip_template" "$participant_arg")
participants_ip=$(db_query "$db_participants_ip")
if [[ -n $participants_endpoint ]]; then
db_participant=$(printf "$db_conference_by_participant_id_template" "$participant_arg" "$participant_arg")
mapfile -t conference_array < <(db_query "$db_participant")
# prepare the header
output="time\tconference ID\tconference name\tconference host\tloglevel\tparticipant ID\tevent\tparameter\n"
# prepare the formatted rows
for row in "${conference_array[@]}"; do
IFS='|' read -r time conference_id conference_name conference_host loglevel event_type participant_id event_param <<< "$row"
output+="$time\t$conference_id\t$conference_name\t$conference_host\t$loglevel\t$IMPORTANT_TEXT$participant_id$NORMAL_TEXT\t$event_type\t$event_param\n"
done
# output
echo -e "$output" | column -t -s $'\t'
fi
if [[ -n $participants_conference ]]; then
db_participant=$(printf "$db_participant_by_conference_id_template" "$participant_arg" "$participant_arg")
mapfile -t conference_array < <(db_query "$db_participant")
# prepare the header
output="time\tconference ID\tconference name\tconference host\tloglevel\tparticipant ID\tevent\tparameter\n"
# prepare the formatted rows
for row in "${conference_array[@]}"; do
IFS='|' read -r time conference_id conference_name conference_host loglevel event_type participant_id event_param <<< "$row"
output+="$time\t$IMPORTANT_TEXT$conference_id$NORMAL_TEXT\t$conference_name\t$conference_host\t$loglevel\t$participant_id\t$event_type\t$event_param\n"
done
# output
echo -e "$output" | column -t -s $'\t'
fi
if [[ -n $participants_statsid ]]; then
db_participant=$(printf "$db_participant_by_stats_id_template" "$participant_arg" "$participant_arg")
mapfile -t conference_array < <(db_query "$db_participant")
# prepare the header
output="time\tconference ID\tconference name\tconference host\tloglevel\tparticipant ID\tevent\tparameter\n"
# prepare the formatted rows
for row in "${conference_array[@]}"; do
IFS='|' read -r time conference_id conference_name conference_host loglevel event_type participant_id event_param <<< "$row"
output+="$time\t$conference_id\t$conference_name\t$conference_host\t$loglevel\t$participant_id\t$event_type\t$IMPORTANT_TEXT$event_param$NORMAL_TEXT\n"
done
# output
echo -e "$output" | column -t -s $'\t'
fi
if [[ -n $participants_ip ]]; then
db_participant=$(printf "$db_participant_by_ip_template" "$participant_arg" "$participant_arg")
mapfile -t conference_array < <(db_query "$db_participant")
# prepare the header
output="time\tconference ID\tconference name\tconference host\tloglevel\tparticipant ID\tevent\tparameter\n"
# prepare the formatted rows
for row in "${conference_array[@]}"; do
IFS='|' read -r time conference_id conference_name conference_host loglevel event_type participant_id event_param <<< "$row"
output+="$time\t$conference_id\t$conference_name\t$conference_host\t$loglevel\t$participant_id\t$event_type\t$IMPORTANT_TEXT$event_param$NORMAL_TEXT\n"
done
# output
echo -e "$output" | column -t -s $'\t'
fi
exit 0
else
db_participants_all=$(printf "$db_participants_all_template" )
mapfile -t participant_array < <(db_query "$db_participants_all")
output=""
# prepare the header
output="component\tparticipant ID\tconference ID\n"
if [[ "$silent" != true ]]; then
header="\nConferences with names matching \"$IMPORTANT_TEXT$conference_arg$NORMAL_TEXT\""
if [[ "$time_range_specified" == true ]]; then
header+=" for the time period \"$from_time - $until_time\""
fi
header+="\n"
echo -e "$header"
output="time\tconf ID\tconf name\tconf host\tloglevel\tparticipant ID\tevent\tparameter\n"
fi
# prepare the formatted rows
for row in "${conferences_name[@]}"; do
IFS='|' read -r time conference_id conference_name conference_host loglevel event_type participant_id event_param <<< "$row"
output+="$time\t$conference_id\t$IMPORTANT_TEXT$conference_name$NORMAL_TEXT\t$conference_host\t$loglevel\t$participant_id\t$event_type\t$event_param\n"
done
# output
echo -e "$output" | column -t -s $'\t'
# nothing found for neither conference ID or name
else
if [[ "$silent" != true ]]; then
echo "No match found for \"$conference_arg\""
if [[ "$time_range_specified" == true ]]; then
echo "and time period $from_time - $until_time"
fi
fi
fi
exit 0
else
# if no argument is given, we show all the conferences
db_conferences_all=$(printf "$db_conferences_all_formatted_template" "$from_time" "$until_time")
mapfile -t conference_array < <(db_query "$db_conferences_all")
# we only format the outrput if there are conferences to show
if [[ "${#conference_array[@]}" -gt 0 ]]; then
output=""
# prepare the header
if [[ "$silent" != true ]]; then
header="\nAll conferences"
if [[ "$time_range_specified" == true ]]; then
header+=" for the time period \"$IMPORTANT_TEXT$from_time - $until_time$NORMAL_TEXT\""
fi
header+="\n"
echo -e "$header"
output="component\tduration\tconference ID\tconference name\tparticipants\tname count\tconference host\n"
fi
# prepare the formatted rows
for row in "${conference_array[@]}"; do
IFS='|' read -r jitsi_component end start conference_id conference_name participants name_count conference_host <<< "$row"
calculate_duration "$start" "$end"
output+="$jitsi_component\t$duration\t$conference_id\t$conference_name\t$participants\t$name_count\t$conference_host\n"
done
# output
echo -e "$output" | column -t -s $'\t'
else
if [[ "$silent" != true ]]; then
echo -n "No conferences found"
if [[ "$time_range_specified" == true ]]; then
echo -n " for the time period \"$from_time - $until_time\""
fi
echo "."
fi
fi
exit 0
fi
elif [[ "$participant_option" == true ]]; then
# the argument to "--participant" can be endpointID, conferenceID, conference name, startsID, IP address
# check for participants match within a time period (or all if period not given)
# we check for all ot them and show the matches
## FIXME - we don't catch the case with no results found at all, no message is displayed if no results ## FIXME
if [[ -n "$participant_arg" ]]; then
db_participants_endpoint=$(printf "$db_conference_by_participant_id_template" "$participant_arg" "$from_time" "$until_time" "$participant_arg" "$from_time" "$until_time")
mapfile -t participants_endpoint < <(db_query "$db_participants_endpoint")
db_participants_conference=$(printf "$db_participant_by_conference_id_template" "$participant_arg" "$from_time" "$until_time" "$participant_arg" "$from_time" "$until_time")
mapfile -t participants_conference < <(db_query "$db_participants_conference")
db_participants_conference_name=$(printf "$db_participant_by_conference_name_template" "$participant_arg" "$from_time" "$until_time" "$participant_arg" "$from_time" "$until_time")
mapfile -t participants_conference_name < <(db_query "$db_participants_conference_name")
db_participants_statsid=$(printf "$db_participant_by_stats_id_template" "$participant_arg" "$from_time" "$until_time" "$participant_arg" "$from_time" "$until_time")
mapfile -t participants_statsid < <(db_query "$db_participants_statsid")
db_participants_ip=$(printf "$db_participant_by_ip_template" "$participant_arg" "$from_time" "$until_time" "$participant_arg" "$from_time" "$until_time")
mapfile -t participants_ip < <(db_query "$db_participants_ip")
# match for participant endpoint_id
if [[ "${#participants_endpoint[@]}" -gt 0 ]]; then
output=""
# prepare the header
if [[ "$silent" != true ]]; then
header="\nParticipants with ID matching \"$IMPORTANT_TEXT$participant_arg$NORMAL_TEXT\""
if [[ "$time_range_specified" == true ]]; then
header+=" for the time period \"$from_time - $until_time\""
fi
header+="\n"
echo -e "$header"
output="time\tconference ID\tconference name\tconference host\tloglevel\tparticipant ID\tevent\tparameter\n"
fi
# prepare the formatted rows
for row in "${participants_endpoint[@]}"; do
IFS='|' read -r time conference_id conference_name conference_host loglevel event_type participant_id event_param <<< "$row"
output+="$time\t$conference_id\t$conference_name\t$conference_host\t$loglevel\t$IMPORTANT_TEXT$participant_id$NORMAL_TEXT\t$event_type\t$event_param\n"
done
# output
echo -e "$output" | column -t -s $'\t'
fi
# match for conference_id the participant was in
if [[ "${#participants_conference[@]}" -gt 0 ]]; then
output=""
# prepare the header
if [[ "$silent" != true ]]; then
header="\nParticipants in conferences with ID matching \"$IMPORTANT_TEXT$participant_arg$NORMAL_TEXT\""
if [[ "$time_range_specified" == true ]]; then
header+=" for the time period \"$from_time - $until_time\""
fi
header+="\n"
echo -e "$header"
output+="time\tconference ID\tconference name\tconference host\tloglevel\tparticipant ID\tevent\tparameter\n"
fi
# prepare the formatted rows
for row in "${participants_conference[@]}"; do
IFS='|' read -r time conference_id conference_name conference_host loglevel event_type participant_id event_param <<< "$row"
output+="$time\t$IMPORTANT_TEXT$conference_id$NORMAL_TEXT\t$conference_name\t$conference_host\t$loglevel\t$participant_id\t$event_type\t$event_param\n"
done
# output
echo -e "$output" | column -t -s $'\t'
fi
# match for conference_name the participant was in
if [[ "${#participants_conference_name[@]}" -gt 0 ]]; then
output=""
# prepare the header
if [[ "$silent" != true ]]; then
header="\nParticipants in conferences with name that include the string \"$IMPORTANT_TEXT$participant_arg$NORMAL_TEXT\""
if [[ "$time_range_specified" == true ]]; then
header+=" for the time period \"$from_time - $until_time\""
fi
header+="\n"
echo -e "$header"
output+="time\tconference ID\tconference name\tconference host\tloglevel\tparticipant ID\tevent\tparameter\n"
fi
# prepare the formatted rows
for row in "${participants_conference_name[@]}"; do
IFS='|' read -r time conference_id conference_name conference_host loglevel event_type participant_id event_param <<< "$row"
output+="$time\t$conference_id\t$IMPORTANT_TEXT$conference_name$NORMAL_TEXT\t$conference_host\t$loglevel\t$participant_id\t$event_type\t$event_param\n"
done
# output
echo -e "$output" | column -t -s $'\t'
fi
# match for participant stats_id
if [[ "${#participants_statsid[@]}" -gt 0 ]]; then
output=""
# prepare the header
if [[ "$silent" != true ]]; then
header="\nParticipants with stats ID that include the string \"$IMPORTANT_TEXT$participant_arg$NORMAL_TEXT\""
if [[ "$time_range_specified" == true ]]; then
header+=" for the time period \"$from_time - $until_time\""
fi
header+="\n"
echo -e "$header"
output+="time\tconference ID\tconference name\tconference host\tloglevel\tparticipant ID\tevent\tparameter\n"
fi
# prepare the formatted rows
for row in "${participants_statsid[@]}"; do
IFS='|' read -r time conference_id conference_name conference_host loglevel event_type participant_id event_param <<< "$row"
output+="$time\t$conference_id\t$conference_name\t$conference_host\t$loglevel\t$participant_id\t$event_type\t$IMPORTANT_TEXT$event_param$NORMAL_TEXT\n"
done
# output
echo -e "$output" | column -t -s $'\t'
fi
# match for participant IP
if [[ "${#participants_ip[@]}" -gt 0 ]]; then
output=""
# prepare the header
if [[ "$silent" != true ]]; then
header="\nParticipants with IP address matching \"$IMPORTANT_TEXT$participant_arg$NORMAL_TEXT\""
if [[ "$time_range_specified" == true ]]; then
header+=" for the time period \"$from_time - $until_time\""
fi
header+="\n"
echo -e "$header"
output+="time\tconference ID\tconference name\tconference host\tloglevel\tparticipant ID\tevent\tparameter\n"
fi
# prepare the formatted rows
for row in "${participants_ip[@]}"; do
IFS='|' read -r time conference_id conference_name conference_host loglevel event_type participant_id event_param <<< "$row"
output+="$time\t$conference_id\t$conference_name\t$conference_host\t$loglevel\t$participant_id\t$event_type\t$IMPORTANT_TEXT$event_param$NORMAL_TEXT\n"
done
# output
echo -e "$output" | column -t -s $'\t'
fi
exit 0
else
# if no argument is given, we show all the participants
db_participants_all=$(printf "$db_participants_all_template" "$from_time" "$until_time")
mapfile -t participant_array < <(db_query "$db_participants_all")
# we only format the outrput if there are conferences to show
if [[ "${#participant_array[@]}" -gt 0 ]]; then
output=""
# prepare the header
if [[ "$silent" != true ]]; then
header="\nAll participants"
if [[ "$time_range_specified" == true ]]; then
header+=" for the time period \"$IMPORTANT_TEXT$from_time - $until_time$NORMAL_TEXT\""
fi
header+="\n"
echo -e "$header"
output+="component\tparticipant ID\tconference ID\n"
fi
# prepare the formatted rows
for row in "${participant_array[@]}"; do
IFS='|' read -r jitsi_component endpoint_id conference_id <<< "$row"
@ -716,30 +953,49 @@ case "$cmd" in
done
# output
echo -e "$output" | column -t -s $'\t'
exit 0
else
if [[ "$silent" != true ]]; then
echo -n "No participants found"
if [[ "$time_range_specified" == true ]]; then
echo -n " for the time period \"$from_time - $until_time\""
fi
echo "."
fi
fi
;;
exit 0
fi
--time)
if [[ "$time_range_specified" == true ]]; then
echo "Events in the period $from_time - $until_time"
db_events_time=$(printf "$db_events_by_period_template" "$from_time" "$until_time" "$from_time" "$until_time")
mapfile -t events_array < <(db_query "$db_events_time")
elif [[ "$time_option" == true ]]; then
if [[ "$time_range_specified" == true ]]; then
db_events_time=$(printf "$db_events_by_period_template" "$from_time" "$until_time" "$from_time" "$until_time")
mapfile -t events_array < <(db_query "$db_events_time")
if [[ "${#events_array[@]}" -gt 0 ]]; then
output=""
# prepare the header
output="time\tconference ID\tconference name\tconference host\tloglevel\tparticipant ID\tevent\tparameter\n"
if [[ "$silent" != true ]]; then
header="\nEvents in the period \"$IMPORTANT_TEXT$from_time - $until_time$NORMAL_TEXT\"\n"
output="time\tconference ID\tconference name\tconference host\tloglevel\tparticipant ID\tevent\tparameter\n"
echo -e "$header"
fi
# prepare the formatted rows
for row in "${events_array[@]}"; do
IFS='|' read -r time conference_id conference_name conference_host loglevel event_type participant_id event_param <<< "$row"
output+="$time\t$conference_id\t$conference_name\t$conference_host\t$loglevel\t$event_type\t$participant_id\t$event_param\n"
output+="$IMPORTANT_TEXT$time$NORMAL_TEXT\t$conference_id\t$conference_name\t$conference_host\t$loglevel\t$event_type\t$participant_id\t$event_param\n"
done
# output
echo -e "$output" | column -t -s $'\t'
exit 0
else
if [[ "$silent" != true ]]; then
echo -n "No events found"
if [[ "$time_range_specified" == true ]]; then
echo -n " for the time period \"$from_time - $until_time\""
fi
echo "."
fi
fi
;;
exit 0
fi
*)
echo -e "$help"
exit 1
;;
esac
fi

87
log-regexps.md 100644
View File

@ -0,0 +1,87 @@
# Log regexps
This is a reference of the log lines and the corresponding regexps that are used in Jilo for events tracking.
Work in progress: 2024.06.16
----
## JVB
### conference start
needed: *timestamp, loglevel, conferenceID, conferenceName, conferenceDomain*
log
```JVB 2024-04-01 04:08:55.124 INFO: [19046] [confId=4c14584fce9a5970 conf_name=someroom123@conference.meet.example.com meeting_id=177c43a3] EndpointConnectionStatusMonitor.start#58: Starting connection status monitor```
regex
```JVB\ ([0-9-]+\ [0-9:.]+)\ ([A-Z]+):.*\[confId=([a-zA-Z]+)\ conf_name=(.*)@([a-zA-Z0-9-_.]+)\ meeting_id=.*\]\ EndpointConnectionStatusMonitor\.start.*:\ Starting\ connection\ status\ monitor```
### conference end
needed: *timestamp, loglevel, conferenceID* (optionally in case we don't have the starting event: *conferenceName, conferenceDomain*)
log
```JVB 2024-04-01 03:04:24.339 INFO: [18981] [confId=4c14584fce9a5970 conf_name=someroom123@conference.meet.example.com meeting_id=177c43a3] EndpointConnectionStatusMonitor.stop#66: Stopped```
## participant joining
needed: *timestamp, loglevel, conferenceID, endpointID, statsID*
regex
```JVB ([0-9-]+\ [0-9:.]+)\ [A-Z]+:.*\[confId=${conference_id}\ .*epId=([a-zA-Z0-9-]+)\ stats_id=([a-zA-Z0-9-]+)\ .*Starting\ the\ Agent\ without\ remote\ candidates```
### pair selection
needed: *timestamp, loglevel, conferenceID, endpointID, statsID, participant IP address*
regex
```JVB ([0-9-]+\ [0-9:.]+)\ [A-Z]+:.*\[confId=${conference_id}\ .*epId=${participant_endpoint_id}\ stats_id=${participant_stats_id}\ .*Selected\ pair\ for\ stream\ .*([0-9.]+):10000/udp/srflx\ \-\>\ ([0-9.]+):[0-9]+/udp/prflx```
### participant leaving
needed: *timestamp, loglevel, conferenceID, endpointID, statsID*
regex
```JVB ([0-9-]+\ [0-9:.]+)\ [A-Z]+:.*\[confId=${conference_id}\ .*epId=${participant_endpoint_id}\ stats_id=${participant_stats_id}\]\ Endpoint\.expire.*:\ Expired\.```
----
## JICOFO
### conference start
needed: *timestamp, loglevel, conferenceName,* (**FIXME**: we don't have *conferenceID* here, it's good to have it)
regex
```Jicofo ([0-9-]+\ [0-9:.]+)\ [A-Z]+:.*\[room=([^ ]+)@.*\]\ JitsiMeetConferenceImpl\.joinTheRoom```
### participant joining
needed: *timestamp, loglevel, conferenceID, conferenceName, participantID, statsID*
regex
```Jicofo ([0-9-]+\ [0-9:.]+)\ [A-Z]+:.*\[room=([^ ]+)@.*\ meeting_id=([a-zA-Z0-9-]+)\]\ .*\.onMemberJoined.*:\ Member\ joined:([a-zA-Z0-9]+)\ stats-id=([a-zA-Z0-9-]+)```
### bridge selection
needed: *timestamp, loglevel, bridgeID*
regex
```Jicofo ([0-9-]+\ [0-9:.]+)\ [A-Z]+:.*BridgeSelectionStrategy.select#.*:\ Selected.*\[jid=[a-z]@.*\/(.*),\ ```
### participant leaving
needed: *timestamp, loglevel, conferenceID, participantID*
regex
```Jicofo ([0-9-]+\ [0-9:.]+)\ [A-Z]+:.*\[room=${conference_name}@.*\ meeting_id=${conference_id}\]\ .*\.removeParticipant#.*:\ Removing\ ([a-zA-Z0-9]+)```
### conference end
needed: *timestamp, loglevel, conferenceID*
regex
```Jicofo ([0-9-]+\ [0-9:.]+)\ [A-Z]+:.*\[room=([^ ]+)@.*\ meeting_id=([a-zA-Z0-9-]+)\]\ JitsiMeetConferenceImpl\.stop```

View File

@ -1,65 +0,0 @@
This is a reference of the log lines and the corresponding regexps that are used in Jilo for events tracking.
Work in progress.
2024.06.10
JVB:
conference start:
log
JVB 2024-04-01 04:08:55.124 INFO: [19046] [confId=4c14584fce9a5970 conf_name=someroom123@conference.meet.example.com meeting_id=177c43a3] EndpointConnectionStatusMonitor.start#58: Starting connection status monitor
regex
JVB\ ([0-9-]+\ [0-9:.]+)\ ([A-Z]+):.*\[confId=([a-zA-Z]+)\ conf_name=(.*)@([a-zA-Z0-9-_.]+)\ meeting_id=.*\]\ EndpointConnectionStatusMonitor\.start.*:\ Starting\ connection\ status\ monitor
conference end:
log
JVB 2024-04-01 03:04:24.339 INFO: [18981] [confId=4c14584fce9a5970 conf_name=someroom123@conference.meet.example.com meeting_id=177c43a3] EndpointConnectionStatusMonitor.stop#66: Stopped
regex
participant joining
([0-9-]+\ [0-9:.]+)\ [A-Z]+:.*\[confId=${conference_id}\ .*epId=([a-zA-Z0-9-]+)\ stats_id=([a-zA-Z0-9-]+)\ .*Starting\ the\ Agent\ without\ remote\ candidates
pair selection
([0-9-]+\ [0-9:.]+)\ [A-Z]+:.*\[confId=${conference_id}\ .*epId=${participant_endpoint_id}\ stats_id=${participant_stats_id}\ .*Selected\ pair\ for\ stream\ .*([0-9.]+):10000/udp/srflx\ \-\>\ ([0-9.]+):[0-9]+/udp/prflx
participant leaving
([0-9-]+\ [0-9:.]+)\ [A-Z]+:.*\[confId=${conference_id}\ .*epId=${participant_endpoint_id}\ stats_id=${participant_stats_id}\]\ Endpoint\.expire.*:\ Expired\.
## OLD
# was used to insert start & end in one db record,
# retired because in "start" regex there was no conference name, only id
##
conference start:
log
JVB 2024-04-01 03:02:52.593 INFO: [18962] Videobridge.createConference#255: create_conf, id=4c14584fce9a5970 meeting_id=177c43a3-1780-4258-aa23-ca3d7dd29aa5
regex
([0-9-]+\ [0-9:.]+)\ [A-Z]+:.*\ Videobridge\.createConference#[0-9]+:\ create_conf,\ id=([a-zA-Z0-9]+)
conference end:
log
JVB 2024-04-01 03:04:24.339 INFO: [18981] [confId=4c14584fce9a5970 conf_name=someroom123@conference.meet.example.com meeting_id=177c43a3] Conference.expire#595: Expiring.
regex
([0-9-]+\ [0-9:.]+)\ [A-Z]+:.*\[confId=([a-zA-Z0-9]+)\ .*conf_name=([^ ]+)@.*\]\ Conference\.expire
JICOFO:
conference start
([0-9-]+\ [0-9:.]+)\ [A-Z]+:.*\[room=([^ ]+)@.*\]\ JitsiMeetConferenceImpl\.joinTheRoom
participant joining
([0-9-]+\ [0-9:.]+)\ [A-Z]+:.*\[room=([^ ]+)@.*\ meeting_id=([a-zA-Z0-9-]+)\]\ .*\.onMemberJoined.*:\ Member\ joined:([a-zA-Z0-9]+)\ stats-id=([a-zA-Z0-9-]+)
bridge selection
([0-9-]+\ [0-9:.]+)\ [A-Z]+:.*BridgeSelectionStrategy.select#.*:\ Selected.*\[jid=[a-z]@.*\/(.*),\
participant leaving
([0-9-]+\ [0-9:.]+)\ [A-Z]+:.*\[room=${conference_name}@.*\ meeting_id=${conference_id}\]\ .*\.removeParticipant#.*:\ Removing\ ([a-zA-Z0-9]+)
conference end
([0-9-]+\ [0-9:.]+)\ [A-Z]+:.*\[room=([^ ]+)@.*\ meeting_id=([a-zA-Z0-9-]+)\]\ JitsiMeetConferenceImpl\.stop

View File

@ -0,0 +1,22 @@
#!/usr/bin/env bash
VERSION=$1
mkdir -p deb-package
cd deb-package
mkdir -p "jilo-$VERSION/DEBIAN" "jilo-$VERSION/etc" "jilo-$VERSION/usr/bin" "jilo-$VERSION/usr/share/doc/jilo" "jilo-$VERSION/usr/share/man/man8"
cp ../deb-control "jilo-$VERSION/DEBIAN/control"
cp ../../jilo.conf "jilo-$VERSION/etc/jilo.conf"
cp ../../jilo "jilo-$VERSION/usr/bin/"
cp ../../jilo-cli "jilo-$VERSION/usr/bin/"
cp ../../CHANGELOG.md "jilo-$VERSION/usr/share/doc/jilo/"
cp ../../LICENSE "jilo-$VERSION/usr/share/doc/jilo/"
cp ../../README.md "jilo-$VERSION/usr/share/doc/jilo/"
cp ../../TODO.md "jilo-$VERSION/usr/share/doc/jilo/"
cp ../../log-regexps.md "jilo-$VERSION/usr/share/doc/jilo/"
cp ../man-jilo.8 "jilo-$VERSION/usr/share/man/man8/jilo.8"
dpkg-deb --build "jilo-$VERSION"
rm -rf "jilo-$VERSION/"

View File

@ -0,0 +1,29 @@
#!/usr/bin/env bash
VERSION=$1
RELEASE=1
mkdir -p rpm-package/SOURCES rpm-package/SPECS
cd rpm-package
PACKAGE_DIR="jilo-$VERSION"
mkdir -p "$PACKAGE_DIR"
cp ../../jilo.conf "$PACKAGE_DIR/"
cp ../../jilo "$PACKAGE_DIR/"
cp ../../jilo-cli "$PACKAGE_DIR/"
cp ../../CHANGELOG.md "$PACKAGE_DIR/"
cp ../../LICENSE "$PACKAGE_DIR/"
cp ../../README.md "$PACKAGE_DIR/"
cp ../../TODO.md "$PACKAGE_DIR/"
cp ../../log-regexps.md "$PACKAGE_DIR/"
cp ../man-jilo.8 "$PACKAGE_DIR/"
cp ../rpm-jilo.spec SPECS/jilo.spec
tar -czf "jilo-$VERSION.tar.gz" "$PACKAGE_DIR"
mv "jilo-$VERSION.tar.gz" SOURCES/
rpmbuild --define "_topdir $(pwd)" --define "VERSION $VERSION" --define "RELEASE $RELEASE" -ba SPECS/jilo.spec
rm -rf "$PACKAGE_DIR"

View File

@ -0,0 +1,11 @@
Package: jilo
Version: 0.1.1
Section: utils
Priority: optional
Architecture: all
Maintainer: Yasen Pramatarov <yasen@lindeas.com>
Description: Jitsi logs observer
Bash scripts for collecting and displaying information about conference events from Jitsi Meet logs.
This package contains the 'jilo' logs collecting tool and 'jilo-cli' command line events searching tool.
Homepage: https://lindeas.com/jilo
Depends: bash, sqlite3 | mysql-client | mariadb-client, coreutils, util-linux

View File

@ -0,0 +1,59 @@
.TH JILO "8" "June 2024" "jilo 0.1.1"
.SH NAME
jilo \- Bash scripts for collecting and displaying information about conference events from Jitsi Meet logs.
.SH SYNOPSIS
.B jilo
[\fIoptions\fR]
.SH DESCRIPTION
.B jilo
is a bash scripts for collecting and displaying information about conference events from Jitsi Meet logs.
This is the logs collecting tool ('jilo'). If you want to search through an already populated databae, use the command line tool 'jilo-cli'.
.SH OPTIONS
.TP
.B \-d, \-\-create\-db
Create (or recreate) the database.
.TP
.B \-f, \-\-flush
Flush an existing database.
.TP
.B \-c, \-\-check
Check the consistency of the database and the status of the log files.
.TP
.B \-p, \-\-parse
Parse the log file(s) and enter the data found in the database.
.TP
.B \-v, \-\-verbose
Verbose mode with more details shown. Can be used together with \-c, \-p
.TP
.B \-h, \-\-help
Display help message.
.TP
.B \-V, \-\-version
Display version information.
.SH EXAMPLES
Create the database, as configured in jilo.conf (or use the defaults). If the database already exists, it drops it and recreates it:
.B jilo -d
Check the consistency of the database and show detils about the logs:
.B jilo -c -v
Parse the logs in verbose mode, with progress indication:
.B jilo -p -v
.SH CONFIGURATION
The configuration file is /etc/jilo.conf.
.SH AUTHOR
Written and maintained by Yasen Pramatarov <yasen@lindeas.com>
.SH HOMEPAGE
https://lindeas.com/jilo
.SH VERSION
0.1.1
.SH SEE ALSO
jilo-cli(8)

View File

@ -0,0 +1,57 @@
Name: jilo
Version: 0.1.1
Release: 1%{?dist}
Summary: Jitsi logs observer
License: GPLv2
URL: https://lindeas.com/jilo
Source0: %{name}-%{version}.tar.gz
%define sourcedir %{_builddir}/%{name}-%{version}
BuildArch: noarch
BuildRequires: bash
Requires: bash
Requires: (sqlite or mysql or mariadb)
Requires: coreutils
Requires: util-linux
%description
Bash scripts for collecting and displaying information about conference events from Jitsi Meet logs.
This package contains the 'jilo' logs collecting tool and 'jilo-cli' command line events searching tool.
%prep
%setup -q
%install
# directories
mkdir -p %{buildroot}/etc
mkdir -p %{buildroot}/usr/bin
mkdir -p %{buildroot}/usr/share/doc/%{name}
mkdir -p %{buildroot}/usr/share/man/man8
# then copy the files
cp %{sourcedir}/jilo.conf %{buildroot}/etc/jilo.conf
cp %{sourcedir}/jilo %{buildroot}/usr/bin/
cp %{sourcedir}/jilo-cli %{buildroot}/usr/bin/
cp %{sourcedir}/CHANGELOG.md %{buildroot}/usr/share/doc/%{name}/
cp %{sourcedir}/LICENSE %{buildroot}/usr/share/doc/%{name}/
cp %{sourcedir}/README.md %{buildroot}/usr/share/doc/%{name}/
cp %{sourcedir}/TODO.md %{buildroot}/usr/share/doc/%{name}/
cp %{sourcedir}/log-regexps.md %{buildroot}/usr/share/doc/%{name}/
cp %{sourcedir}/man-jilo.8 %{buildroot}/usr/share/man/man8/jilo.8
%files
/etc/jilo.conf
/usr/bin/jilo
/usr/bin/jilo-cli
/usr/share/doc/%{name}/CHANGELOG.md
/usr/share/doc/%{name}/LICENSE
/usr/share/doc/%{name}/README.md
/usr/share/doc/%{name}/TODO.md
/usr/share/doc/%{name}/log-regexps.md
/usr/share/man/man8/jilo.8.gz
%changelog
* Wed Jun 12 2024 Yasen Pramatarov <yasen@lindeas.com> 0.1.1
- Initial build