fix(script): Add event allow-list

This commit is contained in:
hygienic-books 2025-03-17 23:01:41 +01:00
parent 30f6429066
commit 4772902ed2
2 changed files with 28 additions and 6 deletions

View File

@ -16,11 +16,12 @@ function load_config() {
source "${conf_file_resolved_abs_path}"
fi
# Optional, will use default values if not given by user
: "${allow_list_events:='^(deviceOnline|deviceUnknown|geofenceEnter|geofenceExit)$'}"
: "${message_event_type_not_allowed:='Event "%s" not allowed. Nothing to do.\n'}"
: "${message_geofence_enter:='%s entered geofence %s.'}"
: "${message_geofence_exit:='%s left geofence %s.'}"
: "${message_device_online:='On %s Traccar Client app is now active.'}"
: "${message_device_unknown:='On %s Traccar Client app has not checked in for 10 minutes, the app is likely off now.'}"
: "${message_device_offline:='On %s Traccar Client app is now off.'}"
: "${message_device_unhandled:='For %s we do not want to send a message to Signal. Nothing to do.\n'}"
: "${message_event_other:='%s triggered event "%s" in Traccar server.'}"
: "${allow_unique_device_ids_posix_ere:=''}"
@ -37,6 +38,13 @@ function get_event_data() {
device_name="$(<<<"${payload}" jq --raw-output '.device.name')"
event_type="$(<<<"${payload}" jq --raw-output '.event.type')"
# Discard event and stop any further action unless event is allow-listed
if ! [[ "${event_type}" =~ ${allow_list_events} ]]; then
printf -- "${message_event_type_not_allowed}" "${device_name}"
exit 0
fi
if [[ "${event_type}" = 'geofenceEnter' || "${event_type}" = 'geofenceExit' ]]; then
battery_level="$(<<<"${payload}" jq --raw-output '.position.attributes.batteryLevel')"
battery_level="$(echo "${battery_level}"' / 1' | bc)"
@ -69,10 +77,6 @@ function craft_message() {
message="${message_device_unknown}"
message="$(printf -- "${message}" "${device_name}")"
;;
'deviceOffline')
message="${message_device_offline}"
message="$(printf -- "${message}" "${device_name}")"
;;
*)
message="${message_event_other}"
message="$(printf -- "${message}" "${device_name}" "${event_type}")"

View File

@ -1,3 +1,22 @@
# List of events on which this script will act. This is a Posix Extended
# Regular Expression (ERE). Most Perl-Compatible Regular Expression
# (PCRE) syntax works. Most notably lookarounds are unsupported in ERE.
# Default's '^(deviceOnline|deviceUnknown|geofenceEnter|geofenceExit)$'.
# Any event not in this list will be discarded. Note that this script
# only /gracefully/ acts on these four events anyway. You can have it
# act on any other event as well but in its current state that just
# triggers the message_event_other Signal message which is decidedly
# /ungraceful/, its usefulness is limited.
#
# For a list of events refer to github.com/traccar/traccar, specifically
# the 'src/main/java/org/traccar/model/Event.java' file that lists all
# available event names.
allow_list_events='^(deviceOnline|deviceUnknown|geofenceEnter|geofenceExit)$'
# If an event comes in that's not in allow_list_events we print this
# message to stdout and exit.
message_event_type_not_allowed='Event "%s" not allowed. Nothing to do.\n'
# First positional argument '%s' is Traccar device name, second
# positional argument '%s' is geofence name, third one is battery level.
# This cannot be switched around, please word your message accordingly.
@ -8,7 +27,6 @@ message_geofence_exit='%s left geofence %s.\\n\\nBattery level %s%%.'
# Argument '%s' is Traccar device name
message_device_online='On %s Traccar Client app is now active.'
message_device_unknown='On %s Traccar Client app has not checked in for 10 minutes, the app is likely off now.'
message_device_offline='On %s Traccar Client app is now off.'
# Argument '%s' is Traccar device name but this one unlike the three
# message strings before is used as stdout log output when the device ID