From d7f316f26ba4112633eda3d8c8d7f5037366d3ca Mon Sep 17 00:00:00 2001 From: riley Date: Wed, 27 Sep 2023 18:21:54 -0400 Subject: [PATCH] Added comments in YML for clarity, handle YML camera creation --- root/etc/config/frigate | 19 +----- root/usr/libexec/apps/frigate/frigate.sh | 80 +++++++++++++++++------- 2 files changed, 60 insertions(+), 39 deletions(-) diff --git a/root/etc/config/frigate b/root/etc/config/frigate index 9f3a452..48cf692 100644 --- a/root/etc/config/frigate +++ b/root/etc/config/frigate @@ -20,21 +20,6 @@ config camera_config option roles 'detect' option record '1' option snapshots '1' - option mask '0,461,3,0,1919,0,1919,843,1699,492,1344,458,1346,336,973,317,869,375,866,432' - -config camera_config - option name 'upstairs_bedroom' - option path 'rtsp://admin:password@192.168.70.173:554/cam/realmonitor?channel=1&subtype=0&authbasic=64' - option roles 'detect' - option record '1' - option snapshots '1' - option mask '0,461,3,0,1919,0,1919,843,1699,492,1344,458,1346,336,973,317,869,375,866,432' - -config camera_config - option name 'kitchen' - option path 'rtsp://admin:password@192.168.70.173:554/cam/realmonitor?channel=1&subtype=0&authbasic=64' - option roles 'detect' - option record '1' - option snapshots '1' - option mask '0,461,3,0,1919,0,1919,843,1699,492,1344,458,1346,336,973,317,869,375,866,432' + option mask '' + option overwrite_cfg '1' diff --git a/root/usr/libexec/apps/frigate/frigate.sh b/root/usr/libexec/apps/frigate/frigate.sh index 57e0b72..5734c27 100755 --- a/root/usr/libexec/apps/frigate/frigate.sh +++ b/root/usr/libexec/apps/frigate/frigate.sh @@ -103,6 +103,7 @@ EOF # yq eval ".usbcoral = \"$usbcoral\"" -i /opt/docker2/compose/frigate/config.yml # yq eval ".hwaccel = \"$hwaccel\"" -i /opt/docker2/compose/frigate/config.yml # yq eval ".media.storage = \"$storage\"" -i /opt/docker2/compose/frigate/config.yml + yq eval '. head_comment="WARNING: Any values marked as OVERWRITTEN_BY_ROUTER are managed by Private Router. Manual changes will overwritten unless you uncheck "Overwrite Frigate Config" in the frigate app camera settings."' -i /opt/docker2/compose/frigate/config.yml yq eval ".mqtt.enabled = $mqtt" -i /opt/docker2/compose/frigate/config.yml yq eval ".mqtt.host = \"$host\"" -i /opt/docker2/compose/frigate/config.yml yq eval ".detectors.coral.type = \"$type\"" -i /opt/docker2/compose/frigate/config.yml @@ -216,8 +217,9 @@ write_camera_to_yml() { # Add path and roles to the inputs in YML yq eval ".cameras.$name.ffmpeg.inputs[0].path = \"$path\"" -i /opt/docker2/compose/frigate/config.yml + overwrite_warning_comment $name "ffmpeg.inputs[0].path" yq eval ".cameras.$name.ffmpeg.inputs[0].roles = [\"detect\"]" -i /opt/docker2/compose/frigate/config.yml - + overwrite_warning_comment $name "ffmpeg.inputs[0].roles" # Add other camera settings to YML yq eval ".cameras.$name.detect = {}" -i /opt/docker2/compose/frigate/config.yml yq eval ".cameras.$name.detect.width = 1280" -i /opt/docker2/compose/frigate/config.yml @@ -225,18 +227,21 @@ write_camera_to_yml() { yq eval ".cameras.$name.record = {}" -i /opt/docker2/compose/frigate/config.yml yq eval ".cameras.$name.record.enabled = $record" -i /opt/docker2/compose/frigate/config.yml - + overwrite_warning_comment $name "record.enabled" yq eval ".cameras.$name.snapshots = {}" -i /opt/docker2/compose/frigate/config.yml yq eval ".cameras.$name.snapshots.enabled = $snapshots" -i /opt/docker2/compose/frigate/config.yml - + overwrite_warning_comment $name "snapshots.enabled" # Check if the mask is not empty if [ -n "$mask" ]; then # Run the yq commands to update the YAML file yq eval ".cameras.$name.motion = {}" -i /opt/docker2/compose/frigate/config.yml yq eval ".cameras.$name.motion.mask = [\"$mask\"]" -i /opt/docker2/compose/frigate/config.yml + overwrite_warning_comment $name "motion.mask" else echo "Mask is empty, ignoring." fi + yq eval ".cameras.$name.origin = \"privaterouter\"" -i /opt/docker2/compose/frigate/config.yml + yq eval ".cameras.$name.origin line_comment=\"DO NOT EDIT THIS LINE\"" -i /opt/docker2/compose/frigate/config.yml } get_camera_index_by_name() { @@ -251,19 +256,27 @@ get_camera_index_by_name() { } # Toggles the line comment for a specific camera attribute in the YML -toggle_override() { +overwrite_warning_comment() { local name=$1 local attribute=$2 - local current_comment=$(yq eval ".cameras.$name.$attribute | line_comment" /opt/docker2/compose/frigate/config.yml) - - if [ "$current_comment" = "OVERWRITTEN_BY_UCI" ]; then - # If the current comment is "OVERWRITTEN_BY_UCI", remove it by setting it to nothing - yq eval ".cameras.$name.$attribute line_comment=\"\"" -i /opt/docker2/compose/frigate/config.yml - else - # Otherwise, set the comment to "OVERWRITTEN_BY_UCI" - yq eval ".cameras.$name.$attribute line_comment=\"OVERWRITTEN_BY_UCI\"" -i /opt/docker2/compose/frigate/config.yml - fi + yq eval ".cameras.$name.$attribute line_comment=\"OVERWRITTEN_BY_ROUTER\"" -i /opt/docker2/compose/frigate/config.yml } +remove_warning_comments() { + local name=$1 + # Attribute list to remove warning comments + local attributes=( + "ffmpeg.inputs[0].path" + "ffmpeg.inputs[0].roles" + "record.enabled" + "snapshots.enabled" + "motion.mask" + ) + + for attribute in "${attributes[@]}"; do + yq '.cameras.'$name'.'$attribute' line_comment=""' -i /opt/docker2/compose/frigate/config.yml + done +} + update_camera_in_yml() { local name=$1 @@ -272,21 +285,28 @@ update_camera_in_yml() { local camera_index=$(get_camera_index_by_name $name) # Fetch and Update the specific settings for this camera from UCI -> YAML + + # For each attribute you update, apply warning comment local path=$(get_uci_camera_value $camera_index "path") set_yml_value $name ".ffmpeg.inputs[0].path" "\"$path\"" + overwrite_warning_comment $name "ffmpeg.inputs[0].path" local roles=$(get_uci_camera_value $camera_index "roles") set_yml_value $name ".ffmpeg.inputs[0].roles" $roles + overwrite_warning_comment $name "ffmpeg.inputs[0].roles" local record=$(get_uci_camera_value $camera_index "record") set_yml_value $name ".record.enabled" $record + overwrite_warning_comment $name "record.enabled" local snapshots=$(get_uci_camera_value $camera_index "snapshots") set_yml_value $name ".snapshots.enabled" $snapshots + overwrite_warning_comment $name "snapshots.enabled" local mask=$(get_uci_camera_value $camera_index "mask") if [ -n "$mask" ]; then set_yml_value $name ".motion.mask" "[\"$mask\"]" + overwrite_warning_comment $name "motion.mask" else yq eval "del(.cameras.$name.motion)" -i /opt/docker2/compose/frigate/config.yml fi @@ -307,16 +327,24 @@ sync_camera_config() { while true; do # Try to fetch camera configuration local camera_name=$(get_uci_camera_value $camera_index) + local overwrite_cfg=$(get_uci_camera_value $camera_index "overwrite_cfg") # Exit loop if no more cameras are found [ -z "$camera_name" ] && break - if ! echo "$yml_cameras" | grep -q -w "$camera_name"; then - echo "UCI Camera $camera_name not found in YML, adding..." - write_camera_to_yml $camera_name + # Only proceed if overwrite_cfg is enabled (set to 1) + if [ "$overwrite_cfg" -eq 1 ] + then + if ! echo "$yml_cameras" | grep -q -w "$camera_name"; then + echo "UCI Camera $camera_name not found in YML, adding..." + write_camera_to_yml $camera_name + else + echo "UCI Camera $camera_name found in YML, updating..." + update_camera_in_yml $camera_name + fi else - echo "UCI Camera $camera_name found in YML, updating..." - update_camera_in_yml $camera_name + echo "Skipping camera $camera_name, overwrite is set to false." + remove_warning_comment $camera_name fi # Add to uci_cameras @@ -326,18 +354,26 @@ sync_camera_config() { camera_index=$((camera_index+1)) done - # Crosscheck and remove any old cameras in YML not present in UCI config + # Crosschecking and removing orphaned entry in YML not present in UCI config for yml_camera in $yml_cameras; do + # Get the origin of this camera + local origin=$(get_yml_value $yml_camera ".origin") + # Fix for word splitting set -f if ! echo $uci_cameras | grep -q -w "$yml_camera"; then - echo "Camera $yml_camera found in YML, but not in UCI, removing..." - yq eval "del(.cameras.$yml_camera)" -i /opt/docker2/compose/frigate/config.yml + # If the origin is either non-existent or not equal to "privaterouter", keep it + if [ -z "$origin" ] || [ "$origin" != "privaterouter" ]; then + echo "Manual camera $yml_camera found in YML. Keeping it since it's manually added." + else + echo "Auto generated camera $yml_camera found in YML, but not in UCI , removing..." + yq eval "del(.cameras.$yml_camera)" -i /opt/docker2/compose/frigate/config.yml + fi fi set +f done - echo "sync_camera_config completed!" + echo "Camera config syncing completed!" } case "${ACTION}" in