From 47c756c3e06a6a8b9ae2c86a2538457c439c4393 Mon Sep 17 00:00:00 2001 From: Jake Herbst Date: Thu, 26 May 2022 16:33:11 -0400 Subject: [PATCH] Adding better support for database language configuration --- birdnet.conf-defaults | 4 + scripts/config.php | 258 +++++++++++++++++------------ scripts/install_birdnet.sh | 14 +- scripts/install_config.sh | 4 +- scripts/install_language_label.sh | 26 +++ scripts/update_birdnet_snippets.sh | 14 +- 6 files changed, 197 insertions(+), 123 deletions(-) create mode 100755 scripts/install_language_label.sh diff --git a/birdnet.conf-defaults b/birdnet.conf-defaults index e53af20..3ada803 100644 --- a/birdnet.conf-defaults +++ b/birdnet.conf-defaults @@ -150,6 +150,10 @@ EXTRACTION_LENGTH= AUDIOFMT=mp3 +## DATABASE_LANG is used to set the language for the database + +DATABASE_LANG=en + ## These are just for debugging LAST_RUN= THIS_RUN= diff --git a/scripts/config.php b/scripts/config.php index 8b13084..bd55200 100644 --- a/scripts/config.php +++ b/scripts/config.php @@ -2,89 +2,112 @@ error_reporting(E_ERROR); ini_set('display_errors',1); -# Basic Settings -if(isset($_GET["latitude"])){ -$latitude = $_GET["latitude"]; -$longitude = $_GET["longitude"]; -$birdweather_id = $_GET["birdweather_id"]; -$apprise_input = $_GET['apprise_input']; -$apprise_notification_title = $_GET['apprise_notification_title']; -$apprise_notification_body = $_GET['apprise_notification_body']; -$flickr_api_key = $_GET['flickr_api_key']; -if(isset($_GET['apprise_notify_each_detection'])) { - $apprise_notify_each_detection = 1; -} else { - $apprise_notify_each_detection = 0; -} -if(isset($_GET['apprise_notify_new_species'])) { - $apprise_notify_new_species = 1; -} else { - $apprise_notify_new_species = 0; -} +function syslog_shell_exec($cmd, $sudo_user = null) { + if ($sudo_user) { + $cmd = "sudo -u $sudo_user $cmd"; + } + $output = shell_exec($cmd); -// logic for setting the date and time based on user inputs from the form below -if(isset($_GET['date']) && isset($_GET['time'])) { - // can't set the date manually if it's getting it from the internet, disable ntp - exec("sudo timedatectl set-ntp false"); - - exec("sudo date -s '".$_GET['date']." ".$_GET['time']."'"); -} else { - // user checked 'use time from internet if available,' so make sure that's on - if(strlen(trim(exec("sudo timedatectl | grep \"NTP service: active\""))) == 0){ - exec("sudo timedatectl set-ntp true"); - sleep(3); + if (strlen($output) > 0) { + syslog(LOG_INFO, $output); } } +# Basic Settings +if(isset($_GET["latitude"])){ + $latitude = $_GET["latitude"]; + $longitude = $_GET["longitude"]; + $birdweather_id = $_GET["birdweather_id"]; + $apprise_input = $_GET['apprise_input']; + $apprise_notification_title = $_GET['apprise_notification_title']; + $apprise_notification_body = $_GET['apprise_notification_body']; + $flickr_api_key = $_GET['flickr_api_key']; + $language = $_GET["language"]; + + if(isset($_GET['apprise_notify_each_detection'])) { + $apprise_notify_each_detection = 1; + } else { + $apprise_notify_each_detection = 0; + } + if(isset($_GET['apprise_notify_new_species'])) { + $apprise_notify_new_species = 1; + } else { + $apprise_notify_new_species = 0; + } + + // logic for setting the date and time based on user inputs from the form below + if(isset($_GET['date']) && isset($_GET['time'])) { + // can't set the date manually if it's getting it from the internet, disable ntp + exec("sudo timedatectl set-ntp false"); + + exec("sudo date -s '".$_GET['date']." ".$_GET['time']."'"); + } else { + // user checked 'use time from internet if available,' so make sure that's on + if(strlen(trim(exec("sudo timedatectl | grep \"NTP service: active\""))) == 0){ + exec("sudo timedatectl set-ntp true"); + sleep(3); + } + } + + // Update Language settings only if a change is requested + if (file_exists('./scripts/thisrun.txt')) { + $lang_config = parse_ini_file('./scripts/thisrun.txt'); + } elseif (file_exists('./scripts/firstrun.ini')) { + $lang_config = parse_ini_file('./scripts/firstrun.ini'); + } + if ($language != $lang_config['DATABASE_LANG']){ + $user = trim(shell_exec("awk -F: '/1000/{print $1}' /etc/passwd")); + $home = trim(shell_exec("awk -F: '/1000/{print $6}' /etc/passwd")); + + // Archive old language file + syslog_shell_exec("cp -f $home/BirdNET-Pi/model/labels.txt $home/BirdNET-Pi/model/labels.txt.old", $user); + + // Install new language label file + syslog_shell_exec("$home/BirdNET-Pi/scripts/install_language_label.sh -l $language", $user); + + syslog(LOG_INFO, "Successfully changed language to '$language'"); + } + $contents = file_get_contents("/etc/birdnet/birdnet.conf"); + $contents = preg_replace("/LATITUDE=.*/", "LATITUDE=$latitude", $contents); + $contents = preg_replace("/LONGITUDE=.*/", "LONGITUDE=$longitude", $contents); + $contents = preg_replace("/BIRDWEATHER_ID=.*/", "BIRDWEATHER_ID=$birdweather_id", $contents); + $contents = preg_replace("/APPRISE_NOTIFICATION_TITLE=.*/", "APPRISE_NOTIFICATION_TITLE=\"$apprise_notification_title\"", $contents); + $contents = preg_replace("/APPRISE_NOTIFICATION_BODY=.*/", "APPRISE_NOTIFICATION_BODY=\"$apprise_notification_body\"", $contents); + $contents = preg_replace("/APPRISE_NOTIFY_EACH_DETECTION=.*/", "APPRISE_NOTIFY_EACH_DETECTION=$apprise_notify_each_detection", $contents); + $contents = preg_replace("/APPRISE_NOTIFY_NEW_SPECIES=.*/", "APPRISE_NOTIFY_NEW_SPECIES=$apprise_notify_new_species", $contents); + $contents = preg_replace("/FLICKR_API_KEY=.*/", "FLICKR_API_KEY=$flickr_api_key", $contents); + $contents = preg_replace("/DATABASE_LANG=.*/", "DATABASE_LANG=$language", $contents); -$contents = file_get_contents("/etc/birdnet/birdnet.conf"); -$contents = preg_replace("/LATITUDE=.*/", "LATITUDE=$latitude", $contents); -$contents = preg_replace("/LONGITUDE=.*/", "LONGITUDE=$longitude", $contents); -$contents = preg_replace("/BIRDWEATHER_ID=.*/", "BIRDWEATHER_ID=$birdweather_id", $contents); -$contents = preg_replace("/APPRISE_NOTIFICATION_TITLE=.*/", "APPRISE_NOTIFICATION_TITLE=\"$apprise_notification_title\"", $contents); -$contents = preg_replace("/APPRISE_NOTIFICATION_BODY=.*/", "APPRISE_NOTIFICATION_BODY=\"$apprise_notification_body\"", $contents); -$contents = preg_replace("/APPRISE_NOTIFY_EACH_DETECTION=.*/", "APPRISE_NOTIFY_EACH_DETECTION=$apprise_notify_each_detection", $contents); -$contents = preg_replace("/APPRISE_NOTIFY_NEW_SPECIES=.*/", "APPRISE_NOTIFY_NEW_SPECIES=$apprise_notify_new_species", $contents); -$contents = preg_replace("/FLICKR_API_KEY=.*/", "FLICKR_API_KEY=$flickr_api_key", $contents); + $contents2 = file_get_contents("./scripts/thisrun.txt"); + $contents2 = preg_replace("/LATITUDE=.*/", "LATITUDE=$latitude", $contents2); + $contents2 = preg_replace("/LONGITUDE=.*/", "LONGITUDE=$longitude", $contents2); + $contents2 = preg_replace("/BIRDWEATHER_ID=.*/", "BIRDWEATHER_ID=$birdweather_id", $contents2); + $contents2 = preg_replace("/APPRISE_NOTIFICATION_TITLE=.*/", "APPRISE_NOTIFICATION_TITLE=\"$apprise_notification_title\"", $contents2); + $contents2 = preg_replace("/APPRISE_NOTIFICATION_BODY=.*/", "APPRISE_NOTIFICATION_BODY=\"$apprise_notification_body\"", $contents2); + $contents2 = preg_replace("/APPRISE_NOTIFY_EACH_DETECTION=.*/", "APPRISE_NOTIFY_EACH_DETECTION=$apprise_notify_each_detection", $contents2); + $contents2 = preg_replace("/APPRISE_NOTIFY_NEW_SPECIES=.*/", "APPRISE_NOTIFY_NEW_SPECIES=$apprise_notify_new_species", $contents2); + $contents2 = preg_replace("/FLICKR_API_KEY=.*/", "FLICKR_API_KEY=$flickr_api_key", $contents2); + $contents2 = preg_replace("/DATABASE_LANG=.*/", "DATABASE_LANG=$language", $contents2); -$contents2 = file_get_contents("./scripts/thisrun.txt"); -$contents2 = preg_replace("/LATITUDE=.*/", "LATITUDE=$latitude", $contents2); -$contents2 = preg_replace("/LONGITUDE=.*/", "LONGITUDE=$longitude", $contents2); -$contents2 = preg_replace("/BIRDWEATHER_ID=.*/", "BIRDWEATHER_ID=$birdweather_id", $contents2); -$contents2 = preg_replace("/APPRISE_NOTIFICATION_TITLE=.*/", "APPRISE_NOTIFICATION_TITLE=\"$apprise_notification_title\"", $contents2); -$contents2 = preg_replace("/APPRISE_NOTIFICATION_BODY=.*/", "APPRISE_NOTIFICATION_BODY=\"$apprise_notification_body\"", $contents2); -$contents2 = preg_replace("/APPRISE_NOTIFY_EACH_DETECTION=.*/", "APPRISE_NOTIFY_EACH_DETECTION=$apprise_notify_each_detection", $contents2); -$contents2 = preg_replace("/APPRISE_NOTIFY_NEW_SPECIES=.*/", "APPRISE_NOTIFY_NEW_SPECIES=$apprise_notify_new_species", $contents2); -$contents2 = preg_replace("/FLICKR_API_KEY=.*/", "FLICKR_API_KEY=$flickr_api_key", $contents2); + $fh = fopen("/etc/birdnet/birdnet.conf", "w"); + $fh2 = fopen("./scripts/thisrun.txt", "w"); + fwrite($fh, $contents); + fwrite($fh2, $contents2); + if(isset($apprise_input)){ + $user = shell_exec("awk -F: '/1000/{print $1}' /etc/passwd"); + $home = shell_exec("awk -F: '/1000/{print $6}' /etc/passwd"); + $home = trim($home); -$fh = fopen("/etc/birdnet/birdnet.conf", "w"); -$fh2 = fopen("./scripts/thisrun.txt", "w"); -fwrite($fh, $contents); -fwrite($fh2, $contents2); + $appriseconfig = fopen($home."/BirdNET-Pi/apprise.txt", "w"); + fwrite($appriseconfig, $apprise_input); + } -if(isset($apprise_input)){ - $user = shell_exec("awk -F: '/1000/{print $1}' /etc/passwd"); - $home = shell_exec("awk -F: '/1000/{print $6}' /etc/passwd"); - $home = trim($home); - - $appriseconfig = fopen($home."/BirdNET-Pi/apprise.txt", "w"); - fwrite($appriseconfig, $apprise_input); -} - - -$language = $_GET["language"]; -if ($language != "none"){ - $user = shell_exec("awk -F: '/1000/{print $1}' /etc/passwd"); - $home = shell_exec("awk -F: '/1000/{print $6}' /etc/passwd"); - $home = trim($home); - $command = "sudo -u".$user." mv ".$home."/BirdNET-Pi/model/labels.txt ".$home."/BirdNET-Pi/model/labels.txt.old && sudo -u".$user." unzip ".$home."/BirdNET-Pi/model/labels_l18n.zip ".$language." -d ".$home."/BirdNET-Pi/model && sudo -u".$user." mv ".$home."/BirdNET-Pi/model/".$language." ".$home."/BirdNET-Pi/model/labels.txt"; - $command_output = `$command`; - `sudo restart_services.sh`; -} + syslog(LOG_INFO, "Restarting Services"); + shell_exec("sudo restart_services.sh"); } ?> @@ -95,12 +118,12 @@ if ($language != "none"){

Basic Settings

-Localization

- 0) { + if (strlen($tdc) > 0) { $checkedvalue = "checked"; $disabledvalue = "disabled"; } else { diff --git a/scripts/install_birdnet.sh b/scripts/install_birdnet.sh index e09d495..432bdc1 100755 --- a/scripts/install_birdnet.sh +++ b/scripts/install_birdnet.sh @@ -11,7 +11,7 @@ cd $my_dir/scripts || exit 1 if [ "$(uname -m)" != "aarch64" ];then echo "BirdNET-Pi requires a 64-bit OS. -It looks like your operating system is using $(uname -m), +It looks like your operating system is using $(uname -m), but would need to be aarch64. Please take a look at https://birdnetwiki.pmcgui.xyz for more information" @@ -31,14 +31,10 @@ install_birdnet() { pip3 install -U -r $HOME/BirdNET-Pi/requirements.txt } -unpack_labels() { - unzip $HOME/BirdNET-Pi/model/labels_l18n.zip labels_en.txt \ - -d $HOME/BirdNET-Pi/model - mv $HOME/BirdNET-Pi/model/labels_en.txt $HOME/BirdNET-Pi/model/labels.txt -} - [ -d ${RECS_DIR} ] || mkdir -p ${RECS_DIR} &> /dev/null -install_birdnet -unpack_labels +install_birdnet + +./install_language_label.sh -l $DATABASE_LANG || exit 1 + exit 0 diff --git a/scripts/install_config.sh b/scripts/install_config.sh index daab688..6b579e8 100755 --- a/scripts/install_config.sh +++ b/scripts/install_config.sh @@ -163,6 +163,8 @@ EXTRACTION_LENGTH= AUDIOFMT=mp3 +## DATABASE_LANG is the language used for the bird species database +DATABASE_LANG=en ## These are just for debugging LAST_RUN= @@ -171,7 +173,7 @@ IDFILE=$HOME/BirdNET-Pi/IdentifiedSoFar.txt EOF } -# Checks for a birdnet.conf file +# Checks for a birdnet.conf file if ! [ -f ${birdnet_conf} ];then install_config fi diff --git a/scripts/install_language_label.sh b/scripts/install_language_label.sh new file mode 100755 index 0000000..4ba0b27 --- /dev/null +++ b/scripts/install_language_label.sh @@ -0,0 +1,26 @@ +#!/usr/bin/env bash + +usage() { echo "Usage: $0 -l " 1>&2; exit 1; } + +while getopts "l:" o; do + case "${o}" in + l) + lang=${OPTARG} + ;; + *) + usage + ;; + esac +done +shift $((OPTIND-1)) + +HOME=$(awk -F: '/1000/ {print $6}' /etc/passwd) + +label_file_name="labels_${lang}.txt" + +unzip -o $HOME/BirdNET-Pi/model/labels_l18n.zip $label_file_name \ + -d $HOME/BirdNET-Pi/model \ + && mv -f $HOME/BirdNET-Pi/model/$label_file_name $HOME/BirdNET-Pi/model/labels.txt \ + && logger "[$0] Changed language label file to '$label_file_name'"; + +exit 0 diff --git a/scripts/update_birdnet_snippets.sh b/scripts/update_birdnet_snippets.sh index 9022d25..90ed2e8 100755 --- a/scripts/update_birdnet_snippets.sh +++ b/scripts/update_birdnet_snippets.sh @@ -40,6 +40,14 @@ fi if ! grep APPRISE_NOTIFY_NEW_SPECIES /etc/birdnet/birdnet.conf &>/dev/null;then sudo -u$USER echo "APPRISE_NOTIFY_NEW_SPECIES=0 " >> /etc/birdnet/birdnet.conf fi + +# If the config does not contain the DATABASE_LANG setting, we'll want to add it. +# Defaults to not-selected, which config.php will know to render as a language option. +# The user can then select a language in the web interface and update with that. +if ! grep DATABASE_LANG /etc/birdnet/birdnet.conf &>/dev/null;then + sudo -u$USER echo "DATABASE_LANG=not-selected" >> /etc/birdnet/birdnet.conf +fi + apprise_installation_status=$(~/BirdNET-Pi/birdnet/bin/python3 -c 'import pkgutil; print("installed" if pkgutil.find_loader("apprise") else "not installed")') if [[ "$apprise_installation_status" = "not installed" ]];then ~/BirdNET-Pi/birdnet/bin/pip3 install -U pip @@ -66,11 +74,11 @@ if systemctl list-unit-files pushed_notifications.service &>/dev/null;then sudo rm -f /usr/lib/systemd/system/pushed_notifications.service sudo rm $HOME/BirdNET-Pi/templates/pushed_notifications.service fi + if [ ! -f $HOME/BirdNET-Pi/model/labels.txt ] then - unzip $HOME/BirdNET-Pi/model/labels_l18n.zip labels_en.txt \ - -d $HOME/BirdNET-Pi/model - mv $HOME/BirdNET-Pi/model/labels_en.txt $HOME/BirdNET-Pi/model/labels.txt + $my_dir/install_language_label.sh -l $DATABASE_LANG \ + && logger "[$0] Installed new language label file for '$DATABASE_LANG'"; fi sudo systemctl daemon-reload