diff --git a/README.md b/README.md
index 63076ff44..25047b08b 100644
--- a/README.md
+++ b/README.md
@@ -12,9 +12,11 @@ Wanting to give this version a go but not sure what's involved to get from the o
out this simple [migration document](docs/migrate_from_raspberry_noaa.md) that explains the few commands you need to run and retain
your original data!
-Finally, if you're looking for one of the cheapest ways to get started from an antenna perspective, check [this](https://jekhokie.github.io/noaa/satellite/rf/antenna/sdr/2019/05/31/noaa-satellite-imagery-sdr.html) out
-, specifically around
-how to use a cheap rabbit ears antenna as a dipole for capturing NOAA and Meteor images!
+Finally, if you're looking for one of the cheapest ways to get started from an antenna perspective, check [this](https://jekhokie.github.io/noaa/satellite/rf/antenna/sdr/2019/05/31/noaa-satellite-imagery-sdr.html) out, specifically around how to use a cheap rabbit ears antenna as a dipole for capturing NOAA and Meteor images!
+
+# Announcements
+
+* 31.7.2024. We are sunsetting the legacy Debian Bullseye support for Raspberry Pi and x64 PCs. We have supported it for some time after the Bookworm support came out in May 2024. Thank you for using the raspberry-noaa-v2 project on these operating systems. New updates for SatDump and other features related to SatDump **will only be available for 64-bit Raspberry OS version Bookworm, and 64-bit Debian Bookworm-based Linux distributions for x64 PCs** as of now. If you'd like to continue receiving the new updates, we highly suggest you perform a full reinstallation of your operating system and conduct a fresh installation of raspberry-noaa-v2. It is possible to save previously received images before reinstalling the operating system by making a copy of `panel.db` file inside `~/raspberry-noaa-v2/db` directory and the whole `/srv` directory; restore these files after your new installation has finished. If you're satisfied with the current features available, you are free to use the system as-is.
# Raspberry NOAA (...and Meteor) V2
@@ -48,7 +50,7 @@ Here's a quick start - if you have questions, continue reading the rest of this
reach out by submitting an issue:
```bash
-# update os localisation settings like timezone, locale and WiFi country
+# update os localisation settings like timezone, locale and WiFi country, and expand the filesystem
sudo raspi-config
# install git
@@ -92,9 +94,9 @@ Also, check out [THIS LINK](docs/webpanel_screenshots.md) for some screen shots
The original raspberry-noaa was tested on Raspberry Pi 2 and up. However, while this compatibility may have been maintained
with raspberry-noaa-v2, ~~this version was developed and tested on a Raspberry Pi 4 - it has not been exhaustively tested on other variants
-of Raspberry Pi (but if you get it working on a version, please do submit a PR and mention it so this document can be updated!).~~, this version works on Pi 3, Pi 4 and Pi 5, and the variants of these models. If you can install Debian Bookworm or Bullseye, it will probably work.
+of Raspberry Pi (but if you get it working on a version, please do submit a PR and mention it so this document can be updated!).~~, this version works on Pi 3, Pi 4 and Pi 5, and the variants of these models. If you can install 64 bit Debian Bookworm or Bullseye, it will probably work.
-As of September 2023, raspberry-noaa-v2 can also be installed on regular 64-bit computers running any Debian Bookworm-based distro. ~~It has been developed and tested on LMDE 6 "Faye" which I also recommend for users coming from Windows, as it has many similarities. It can be downloaded here: [https://mirrors.layeronline.com/linuxmint/debian/lmde-6-cinnamon-64bit.iso](https://mirrors.layeronline.com/linuxmint/debian/lmde-6-cinnamon-64bit.iso)~~ After providing Bookworm support, the recommended version for PCs running RN2 is plain old Debian Bookworm. Desktop environment (like Gnome, KDE, Cinammon, XFCE...) doesn't matter, it only has to be 64-bit Debian.
+As of September 2023, raspberry-noaa-v2 can also be installed on regular 64-bit computers running **ANY** Debian Bookworm-based distro. ~~It has been developed and tested on LMDE 6 "Faye" which I also recommend for users coming from Windows, as it has many similarities. It can be downloaded here: [https://mirrors.layeronline.com/linuxmint/debian/lmde-6-cinnamon-64bit.iso](https://mirrors.layeronline.com/linuxmint/debian/lmde-6-cinnamon-64bit.iso)~~ After providing Bookworm support, the recommended version for PCs running RN2 is plain old Debian Bookworm. Desktop environment (like Gnome, KDE, Cinammon, XFCE...) doesn't matter, it only has to be 64-bit Debian.
If you test with another OS - again, please submit a PR and let us know how it works out!
@@ -192,6 +194,16 @@ Then, open the settings file and edit it to match the settings from the previous
If you have elected to run a TLS-enabled web server, see [THIS LINK](docs/tls_webserver.md) for some additional information
on how to handle self-signed certificates when attempting to visit your webpanel and enabling auth for the admin pages.
+## In-Situ Upgrade
+
+Want to switch your existing RN2 installation to a different Github branch without loosing your settings and images?
+
+ **Introduction of RN2 Upgrade tool**
+
+ ${HOME}/.rn2_utils/rn2_upgrade.sh https://github.com/jekhokie/raspberry-noaa-v2.git -b beta-development
+
+ Just point to the branch you want to switch to by modifying the above line as needed.
+
## Post Install
There are and will be future "optional" features for this framework. Below is a list of optional capabilities that you may wish
@@ -214,6 +226,30 @@ If you're running into issues where you're not seeing imagery after passes compl
out the [troubleshooting](docs/troubleshooting.md) document to try and narrow down the problem. In addition, you can inspect the log
output file in `/var/log/raspberry-noaa-v2/output.log` to investigate potential errors or issues during capture events.
+
+**Introduction of verification tool**
+
+The verification tool can be used to help identify RN2 installation/configuration issues which may potentially prevent proper functioning of capture/decode/processing of APT telemetry data.
+
+Execute the verification script by passing the required argument [ quick | full ]
+
+ $HOME/raspberry-noaa-v2/scripts/tools/verification_tool/verification.sh quick
+
+ Argument required: ./verification.sh quick or ./verification.sh full
+ (~ 1 minute) (~ 5 minutes)
+
+ Dryrun of binaries includes executing :
+
+ nxing web page returned 200 OK status to confirm Web Portal is up.
+ satdump live capture for 1 second to ensure it runs without error.
+ wxmap generates an overlay map image which can be found : $HOME/raspberry-noaa-v2/scripts/tools/verification_tool/test_files/wxtoimg-map-output.png
+ wxtoimg generates MCIR enhanced image which can be founnd : $HOME/raspberry-noaa-v2/scripts/tools/verification_tool/test_files/wxtoimg-mcir-output.jpg
+ meteordemod -h is executed to ensure it runs without error.
+
+ When FULL mode is choosen meterdemod fully decodes a staged cadu file :
+
+ meteordemod generates a full set of images which can be found : $HOME/raspberry-noaa-v2/scripts/tools/verification_tool/test_files/tmp
+
Still having problems? You can email MihajloPi at mihajlo.raspberrypi@gmail.com and be sure to send him the log so he can debug the errors!
## Additional Feature Information
@@ -252,7 +288,7 @@ or form to the success of this repository/framework. Below are some direct contr
* **[Gary Day](https://www.facebook.com/profile.php?id=100068381156913&mibextid=ZbWKwL)**: Helped by lending his Raspberry Pis virtually over SSH, VNC and TeamViewer to MihajloPi for testing and creating an image.
* **[Jérôme jp112sdl](https://github.com/jp112sdl)**: Implemented automatic discarding of Meteor M2-3 night passes since they give no visible image when it's in RGB123 mode.
* **[patrice7560](https://meteo-schaltin.duckdns.org)**: Beta tester, helped in detecting and reporting errors ASAP for debugging.
-* **[Richard AI4Y](https://www.qrz.com/db/AI4Y)**: Provided Debian 12 (Bookworm) support for Raspberry Pi, discovered the FFMPEG bud when creating spectrograms, solved `atrm` errors on the website, and several NTP and timezone issues in PHP, general alpha and beta testing.
+* **[Richard AI4Y](https://www.qrz.com/db/AI4Y)**: Provided Debian 12 (Bookworm) support for Raspberry Pi, 64-bit Raspberry OS support, discovered the FFMPEG bug when creating spectrograms, solved atrm errors on the website, and several NTP and timezone issues in PHP, developed Verification Tool, Developed In-Situ Upgrade for switching repo's/branches, developed RN2 Utilities for backup/restore/stage, uninstall and upgrading, general warning cleanup of scripts, Made 32-bit wxtoimg run on 64-bit Debian, creates satdump/predict DEB files for armhf & arm64, general alpha and beta testing.
## Contributing
Pull requests are welcome! Simply follow the below pattern:
diff --git a/ansible/core.yml b/ansible/core.yml
index 776347f7f..6766bfdc8 100644
--- a/ansible/core.yml
+++ b/ansible/core.yml
@@ -5,7 +5,7 @@
gather_facts: no
pre_tasks:
- name: get os release
- shell: lsb_release -c --short
+ shell: cat /etc/os-release | grep -E "^DEBIAN_CODENAME|^VERSION_CODENAME" | awk -F"=" '{print $NF}' | sort | head -1
register: raspbian_version
check_mode: no
changed_when: no
diff --git a/ansible/roles/common/files/annotation.html.j2_file b/ansible/roles/common/files/annotation.html.j2_file
index 8785b1fcd..f94085de0 100644
--- a/ansible/roles/common/files/annotation.html.j2_file
+++ b/ansible/roles/common/files/annotation.html.j2_file
@@ -28,7 +28,7 @@
- RaspiNOAA V2 | v3.0 | Bullseye https://{{ web_server_name }}
+ RaspiNOAA V2 | v4.0 | Bookworm 64-bit https://{{ web_server_name }}
@@ -45,4 +45,4 @@
-
\ No newline at end of file
+
diff --git a/ansible/roles/common/files/rn2_backup_restore.sh b/ansible/roles/common/files/rn2_backup_restore.sh
new file mode 100644
index 000000000..4cb23821b
--- /dev/null
+++ b/ansible/roles/common/files/rn2_backup_restore.sh
@@ -0,0 +1,381 @@
+#!/bin/bash
+#
+# Purpose: Backup or Restore RN2 key directories
+#
+# (audio, videos, images, db and config)
+#
+# Author: Richard Creasey (AI4Y)
+#
+# Created: 28-July-2024
+#
+#
+# Input parameters:
+#
+# 1. Input mode [backup|backup_stage|restore|restore_stage]
+#
+# Example:
+# ./rn2_backup_restore.sh backup
+# ./rn2_backup_restore.sh backup_stage
+# ./rn2_backup_restore.sh restore
+# ./rn2_backup_restore.sh restore_stage
+
+# input params
+MODE=$1
+
+echo ""
+if [[ -z ${MODE} ]]; then
+ echo "Argument required: ./rn2_backup_restore.sh backup or ./rn2_backup_restore.sh backup_stage"
+ echo " ./rn2_backup_restore.sh restore or ./rn2_backup_restore.sh restore_stage"
+ echo ""
+ exit 1
+else
+ vMODE=$(echo ${MODE} | tr '[:upper:]' '[:lower:]')
+ if [[ ${vMODE} != "backup" && ${vMODE} != "backup_stage" && ${vMODE} != "restore" && ${vMODE} != "restore_stage" ]]; then
+ echo "Argument required: ./rn2_backup_restore.sh backup or ./rn2_backup_restore.sh backup_stage"
+ echo " ./rn2_backup_restore.sh restore or ./rn2_backup_restore.sh restore_stage"
+ echo ""
+ exit 1
+ fi
+fi
+
+start=$(date +%s)
+
+secs_to_human() {
+ if [[ -z ${1} || ${1} -lt 60 ]] ;then
+ min=0 ; secs="${1}"
+ else
+ time_mins=$(echo "scale=2; ${1}/60" | bc)
+ min=$(echo ${time_mins} | cut -d'.' -f1)
+ secs="0.$(echo ${time_mins} | cut -d'.' -f2)"
+ secs=$(echo ${secs}*60|bc|awk '{print int($1+0.5)}')
+ fi
+ echo "Time Elapsed : ${min} minutes and ${secs} seconds."
+}
+
+# Define RN2 Utils location
+RN2_UTILS="${HOME}/.rn2_utils"
+
+# Define backup location
+BACKUP_LOC="${RN2_UTILS}/backup"
+
+# Make sure backup location exists
+mkdir -p ${BACKUP_LOC} ${BACKUP_LOC}/srv
+
+# Define log file for backup/restore activity
+LOG="${BACKUP_LOC}/backup_restore.log"
+
+# loggit function
+loggit() {
+ local log_type=$1
+ local log_message=$2
+
+ echo "${log_type} : ${log_message}"
+
+ # log output to a log file
+ echo $(date '+%d-%m-%Y %H:%M') "${log_type} : ${log_message}" >> "$LOG"
+}
+
+backup() {
+
+ if [[ ${stage} -eq 0 ]]; then
+ # Making a full copy of /srv/audio, /srv/videos, /srv/ images
+
+ if [[ -d /srv ]]; then
+
+ srcSIZE=$(du -sm /srv | awk -F" " '{print $1}')
+ FreeSpace=$(df -m ${BACKUP_LOC} | grep -vi "Filesystem" | awk -F" " '{print $(NF-2)}')
+
+ # To ensure stability of the OS and processes, lets make sure we have at least 2GB of free space beyond the minimun needed before making a backup
+ RequiredSpace=$((${srcSIZE} + 2000))
+
+ if [[ ${RequiredSpace} -lt ${FreeSpace} ]]; then
+ loggit "INFO" "Required space for backup is ${RequiredSpace} MB and Free space is ${FreeSpace} MB, preceeding to backup RN2 key files..."
+
+ loggit "INFO" "Backing up /srv/audio, please wait..."
+ cp -pr /srv/audio ${BACKUP_LOC}/srv/audio
+ if [[ $? -eq 0 ]]; then
+ loggit "PASS" "Successfully backed up /srv/audio"
+ else
+ loggit "FAIL" "Failed to backup /srv/audio, aborting..."
+ exit 1
+ fi
+
+ loggit "INFO" "Backing up /srv/videos, please wait..."
+ cp -pr /srv/videos ${BACKUP_LOC}/srv/videos
+ if [[ $? -eq 0 ]]; then
+ loggit "PASS" "Successfully backed up /srv/videos"
+ else
+ loggit "FAIL" "Failed to backup /srv/videos, aborting..."
+ exit 1
+ fi
+
+ loggit "INFO" "Backing up /srv/images, please wait..."
+ cp -pr /srv/images ${BACKUP_LOC}/srv/images
+ if [[ $? -eq 0 ]]; then
+ loggit "PASS" "Successfully backed up /srv/images"
+ else
+ loggit "FAIL" "Failed to backup /srv/images, aborting..."
+ exit 1
+ fi
+
+ else
+ loggit "FAIL" "Required space for backup is ${RequiredSpace} MB and Free space is only ${FreeSpace} MB, aborting..."
+ exit 1
+ fi
+
+ else
+
+ loggit "INFO" "/srv directory not found, skipping backup..."
+
+ fi
+
+ else
+
+ # Staging /srv so no extra space or time is required
+ if [[ ! -d /srv_staged ]]; then
+ loggit "INFO" "Staging /srv as /srv_staged"
+ sudo mv /srv /srv_staged
+ else
+ loggit "FAIL" "/srv_staged already exists, aborting..."
+ exit 1
+ fi
+
+ fi
+
+
+ if [[ -f ${HOME}/raspberry-noaa-v2/config/settings.yml ]]; then
+ cp -pr ${HOME}/raspberry-noaa-v2/config/settings.yml ${BACKUP_LOC}/settings.yml
+ if [[ $? -eq 0 ]]; then
+ loggit "PASS" "Successfully backed up settings.yml"
+ else
+ loggit "FAIL" "Failed to backup settings.yml, aborting..."
+ exit 1
+ fi
+ else
+ loggit "FAIL" "${HOME}/raspberry-noaa-v2/config/settings.yml not found, aborting..."
+ exit
+ fi
+
+ if [[ -f ${HOME}/raspberry-noaa-v2/config/annotation/annotation.html.j2 ]]; then
+ cp -pr ${HOME}/raspberry-noaa-v2/config/annotation/annotation.html.j2 ${BACKUP_LOC}/annotation.html.j2
+ if [[ $? -eq 0 ]]; then
+ loggit "PASS" "Successfully backed up annotation.html.j2"
+ else
+ loggit "FAIL" "Failed to backup annotation.html.j2, aborting..."
+ exit 1
+ fi
+ else
+ loggit "FAIL" "${HOME}/raspberry-noaa-v2/config/settings.yml, not found, aborting..."
+ exit
+ fi
+
+ if [[ -f ${HOME}/raspberry-noaa-v2/db/panel.db ]]; then
+ cp -pr ${HOME}/raspberry-noaa-v2/db/panel.db ${BACKUP_LOC}/panel.db
+ if [[ $? -eq 0 ]]; then
+ loggit "PASS" "Successfully backed up panel.db"
+ else
+ loggit "FAIL" "Failed to backup panel.db, aborting..."
+ exit 1
+ fi
+ else
+ loggit "FAIL" "${HOME}/raspberry-noaa-v2/db/panel.db, not found, aborting..."
+ exit
+ fi
+
+}
+
+restore() {
+
+
+ if [[ ${stage} -eq 0 ]]; then
+ # Restoring a full copy of /srv/audio, /srv/videos, /srv/ images
+
+ if [[ -d ${BACKUP_LOC}/srv ]]; then
+ srcSIZE=$(du -sm ${BACKUP_LOC} | awk -F" " '{print $1}')
+ FreeSpace=$(df -m /srv | grep -vi "Filesystem" | awk -F" " '{print $(NF-2)}')
+
+ # To ensure stability of the OS and processes, lets make sure we have at least 2GB of free space beyond the minimun needed before restoring
+ RequiredSpace=$((${srcSIZE} + 2000))
+
+ if [[ ${RequiredSpace} -lt ${FreeSpace} ]]; then
+ loggit "INFO" "Required space for restore is ${RequiredSpace} MB and Free space is ${FreeSpace} MB, preceeding to restore RN2 key files..."
+
+ loggit "INFO" "Restoring /srv/audio, please wait..."
+ cp -pr ${BACKUP_LOC}/srv/audio /srv/audio
+ if [[ $? -eq 0 ]]; then
+ loggit "PASS" "Successfully restored /srv/audio"
+ else
+ loggit "FAIL" "Failed to restore /srv/audio, aborting..."
+ exit 1
+ fi
+
+ loggit "INFO" "Restoring /srv/videos, please wait..."
+ cp -pr ${BACKUP_LOC}/srv/videos /srv/videos
+ if [[ $? -eq 0 ]]; then
+ loggit "PASS" "Successfully restored /srv/videos"
+ else
+ loggit "FAIL" "Failed to restore /srv/videos, aborting..."
+ exit 1
+ fi
+
+ loggit "INFO" "Restoring /srv/images, please wait..."
+ cp -pr ${BACKUP_LOC}/srv/images /srv/images
+ if [[ $? -eq 0 ]]; then
+ loggit "PASS" "Successfully restored /srv/images"
+ else
+ loggit "FAIL" "Failed to restore /srv/images, aborting..."
+ exit 1
+ fi
+
+ # Ensure previously installed environment has correct ownership/permissions
+ sudo chown ${USER}:${USER} /srv/audio
+ sudo chown ${USER}:www-data /srv /srv/images /srv/images/thumb /srv/videos
+ sudo chmod 755 /srv
+ sudo chmod 775 /srv/audio /srv/images /srv/images/thumb /srv/videos
+
+ else
+ loggit "FAIL" "Required space for restore is ${RequiredSpace} MB and Free space is only ${FreeSpace} MB, aborting..."
+ exit 1
+ fi
+
+ else
+
+ loggit "INFO" "${BACKUP_LOC}/srv directory not found, skipping restore..."
+
+ fi
+
+ else
+
+ # Restoring /srv_staged as /srv so no extra space or time is required
+ if [[ -d /srv_staged ]]; then
+ loggit "INFO" "UnStaging /srv_staged as /srv"
+ sudo mv /srv_staged /srv
+ # Ensure previously installed environment has correct ownership/permissions
+ sudo chown ${USER}:${USER} /srv/audio
+ sudo chown ${USER}:www-data /srv /srv/images /srv/images/thumb /srv/videos
+ sudo chmod 755 /srv
+ sudo chmod 775 /srv/audio /srv/images /srv/images/thumb /srv/videos
+ else
+ loggit "FAIL" "/srv_staged does not exist, aborting..."
+ exit 1
+ fi
+
+ fi
+
+
+ if [[ -f ${BACKUP_LOC}/settings.yml ]]; then
+ # Keep github original
+ if [[ ! -f ${HOME}/raspberry-noaa-v2/config/settings.yml.original ]]; then
+ if [[ -f ${HOME}/raspberry-noaa-v2/config/settings.yml ]]; then
+ loggit "INFO" "Backing up GitHub settings.yml as settings.yml.original"
+ cp -pr ${HOME}/raspberry-noaa-v2/config/settings.yml ${HOME}/raspberry-noaa-v2/config/settings.yml.original
+ fi
+ fi
+
+ # Check for missing parameters from backup settings.yml that exist in latest Github version and merge them in if found
+ PARMS_REQUIRED=/tmp/parameters_required
+ PARMS_FOUND=/tmp/parameters_found
+ NEED_NEWFILE=0
+ NEWFILE_CREATED=0
+ NEWFILE=/tmp/settings.yml
+ COUNT=$(cat ${BACKUP_LOC}/settings.yml | wc -l)
+ LINE=$((${COUNT} - 1))
+
+ # Skip lines starting with # and skip blank lines and list the parameter
+ cat ${HOME}/raspberry-noaa-v2/config/settings.yml.original | grep -Ev "^#|^---|^\...|^[[:blank:]]*$" | awk -F":" '{print $1}' > /tmp/parameters_required
+ cat ${BACKUP_LOC}/settings.yml | grep -Ev "^#|^---|^\...|^[[:blank:]]*$" | awk -F":" '{print $1}' > /tmp/parameters_found
+
+ # Search for missing parameters and append them to users settings.yml file
+ while IFS= read -r parm; do
+ vFOUND=$(grep ${parm} ${PARMS_FOUND} | wc -l)
+ if [[ ${vFOUND} -eq 0 ]]; then
+ NEED_NEWFILE=1
+ if [[ ${NEWFILE_CREATED} -eq 0 ]]; then
+ NEWFILE_CREATED=1
+ cat ${BACKUP_LOC}/settings.yml | head -${COUNT} > ${NEWFILE}
+ echo "" >> ${NEWFILE}
+ echo "# The following parameters were added" >> ${NEWFILE}
+ fi
+ cat ${HOME}/raspberry-noaa-v2/config/settings.yml.original | grep ${parm} >> ${NEWFILE}
+ fi
+ done < ${PARMS_REQUIRED}
+
+ if [[ ${NEWFILE_CREATED} -eq 1 ]]; then
+ echo "..." >> ${NEWFILE}
+ cp -pr ${NEWFILE} ${HOME}/raspberry-noaa-v2/config/settings.yml
+ if [[ $? -eq 0 ]]; then
+ loggit "PASS" "Successfully merged settings.yml"
+ else
+ loggit "FAIL" "Failed to merge settings.yml"
+ fi
+ else
+ # No new setting needing to be merged, so lets restore the users original file back
+ cp -pr ${BACKUP_LOC}/settings.yml ${HOME}/raspberry-noaa-v2/config/settings.yml
+ if [[ $? -eq 0 ]]; then
+ loggit "PASS" "Successfully restored settings.yml"
+ else
+ loggit "FAIL" "Failed to restore settings.yml, aborting..."
+ exit 1
+ fi
+ fi
+
+ else
+ loggit "FAIL" "${BACKUP_LOC}/settings.yml not found, aborting..."
+ exit 1
+ fi
+
+ if [[ -f ${BACKUP_LOC}/annotation.html.j2 ]]; then
+ # Keep github original
+ if [[ ! -f ${HOME}/raspberry-noaa-v2/config/annotation/annotation.html.j2.original ]]; then
+ if [[ -f ${HOME}/raspberry-noaa-v2/config/annotation/annotation.html.j2 ]]; then
+ cp -pr ${HOME}/raspberry-noaa-v2/config/annotation/annotation.html.j2 ${HOME}/raspberry-noaa-v2/config/annotation/annotation.html.j2.original
+ fi
+ fi
+ cp -pr ${BACKUP_LOC}/annotation.html.j2 ${HOME}/raspberry-noaa-v2/config/annotation/annotation.html.j2
+ if [[ $? -eq 0 ]]; then
+ loggit "PASS" "Successfully restored annotation.html.j2"
+ else
+ loggit "FAIL" "Failed to restore annotation.html.j2, aborting..."
+ exit 1
+ fi
+ else
+ loggit "FAIL" "${BACKUP_LOC}/annotation.html.j2, not found, aborting..."
+ exit
+ fi
+
+ if [[ -f ${BACKUP_LOC}/panel.db ]]; then
+ # Keep github original
+ if [[ ! -f ${HOME}/raspberry-noaa-v2/db/panel.db.original ]]; then
+ if [[ -f ${HOME}/raspberry-noaa-v2/db/panel.db ]]; then
+ cp -pr ${HOME}/raspberry-noaa-v2/db/panel.db ${HOME}/raspberry-noaa-v2/db/panel.db.original
+ fi
+ fi
+ cp -pr ${BACKUP_LOC}/panel.db ${HOME}/raspberry-noaa-v2/db/panel.db
+ if [[ $? -eq 0 ]]; then
+ loggit "PASS" "Successfully backed up panel.db"
+ else
+ loggit "FAIL" "Failed to backup panel.db, aborting..."
+ exit 1
+ fi
+ else
+ loggit "FAIL" "${HOME}/raspberry-noaa-v2/db/panel.db, not found, aborting..."
+ exit
+ fi
+
+}
+
+if [[ ${vMODE} == "backup" ]]; then
+ stage=0
+ backup
+elif [[ ${vMODE} == "backup_stage" ]]; then
+ stage=1
+ backup
+elif [[ ${vMODE} == "restore" ]]; then
+ stage=0
+ restore
+elif [[ ${vMODE} == "restore_stage" ]]; then
+ stage=1
+ restore
+fi
+
+secs_to_human "$(($(date +%s) - ${start}))"
diff --git a/ansible/roles/common/files/rn2_uninstall.sh b/ansible/roles/common/files/rn2_uninstall.sh
new file mode 100644
index 000000000..222b1fece
--- /dev/null
+++ b/ansible/roles/common/files/rn2_uninstall.sh
@@ -0,0 +1,184 @@
+#!/bin/bash
+#
+# Purpose: The purpose of this uninstall script is to remove the RN2 environment
+# and key packages like satdump, meteordemod, , predict, wxtoimg, and nginx. As well
+# as removal of RN2 crontab entries and Audio, Videos and Images in /srv
+#
+# Author: Richard Creasey (AI4Y)
+#
+# Created: July 20th, 2024
+
+start=$(date +%s)
+
+UNINSTALL_LOG=/tmp/uninstall.log
+PACKAGES_BULLSEYE="satdump wxtoimg nginx predict php7.4-intl php8.0-sqlite3 php8.0-mbstring php8.0-fpm"
+PACKAGES_BOOKWORM="satdump wxtoimg nginx predict php8.2-intl php8.2-sqlite3 php8.2-mbstring php8.2-fpm"
+PATHS="/srv/audio /srv/videos /srv/images $HOME/.config/composer $HOME/.config/gmic $HOME/.config/matplotlib $HOME/.config/meteordemod $HOME/.config/composer $HOME/.config/satdump $HOME/raspberry-noaa-v2 $HOME/.predict $HOME/.noaa-v2.conf $HOME/.wxtoimglic $HOME/.wxtoimgrc /usr/local/bin/rtl_* /var/log/raspberry-noaa-v2 /etc/sudoers.d/020_www-data-atrm-nopasswd /var/www/wx-new /etc/nginx/sites-available/default /etc/nginx/sites-enabled/default /tmp/rtl-sdr /etc/modprobe.d/rtlsdr.conf"
+SERVICES="phpsessionclean.service phpsessionclean.timer nginx.service"
+OS=$(cat /etc/os-release | grep -E "^DEBIAN_CODENAME|^VERSION_CODENAME" | awk -F"=" '{print $NF}' | sort | head -1)
+
+if [[ ${OS} == "bookworm" ]]; then
+ PACKAGES=${PACKAGES_BOOKWORM}
+elif [[ ${OS} == "bullseye" ]]; then
+ PACKAGES=${PACKAGES_BULLSEYE}
+else
+ echo "Aborting, unsupported Operating System ${OS}"
+ exit 1
+fi
+
+secs_to_human() {
+ if [[ -z ${1} || ${1} -lt 60 ]] ;then
+ min=0 ; secs="${1}"
+ else
+ time_mins=$(echo "scale=2; ${1}/60" | bc)
+ min=$(echo ${time_mins} | cut -d'.' -f1)
+ secs="0.$(echo ${time_mins} | cut -d'.' -f2)"
+ secs=$(echo ${secs}*60|bc|awk '{print int($1+0.5)}')
+ fi
+ echo "Time Elapsed : ${min} minutes and ${secs} seconds."
+}
+
+# loggit function
+loggit() {
+ local log_type=$1
+ local log_message=$2
+
+ echo "${log_type} : ${log_message}"
+
+ # log output to a log file
+ echo $(date '+%d-%m-%Y %H:%M') "${log_type} : ${log_message}" >> "$UNINSTALL_LOG"
+
+}
+
+# Check Package status
+package_statuses() {
+
+ loggit "INFO" ""
+ loggit "INFO" "------------------------------"
+ loggit "INFO" "Package statues"
+ loggit "INFO" "------------------------------"
+ for package in `echo ${PACKAGES}`;
+ do
+
+ PkgInstalled=$(sudo dpkg -s ${package} 2>/dev/null | grep -i "Status:" | wc -l)
+
+ if [[ ${PkgInstalled} -eq 1 ]]; then
+ loggit "INFO" "${package} is installed"
+ else
+ loggit "INFO" "${package} is NOT installed"
+ fi
+
+ done
+
+ if [[ -f /usr/local/bin/meteordemod ]]; then
+ loggit "INFO" "meteordemod is installed"
+ else
+ loggit "INFO" "meteordemod is NOT installed"
+ fi
+}
+
+remove_services() {
+
+ loggit "INFO" ""
+ loggit "INFO" "------------------------------"
+ loggit "INFO" "Remove RN2 Services"
+ loggit "INFO" "------------------------------"
+ for svc in `echo ${SERVICES}`;
+ do
+
+ loggit "INFO" "Stopping and removing ${svc} service"
+ sudo systemctl stop ${svc}
+ # Disable causes it to remain disabled even after the service is removed and reinstalled by Ansible
+ # this is because disable removes /etc/systemd/system/multi-user.target.wants/nginx.service and is not added back when Ansible installs it.
+ # If Ansible had issued an systemctl enable nsinx enable it would worked.
+ # Commenting out the disable command because disabling the service is no impact since it will be removed when removing packages
+ # sudo systemctl disable ${svc}
+
+ done
+
+}
+
+# Remove software packages
+remove_packages() {
+
+ loggit "INFO" ""
+ loggit "INFO" "------------------------------"
+ loggit "INFO" "Removing packages"
+ loggit "INFO" "------------------------------"
+
+ for pkg in `echo ${PACKAGES}`;
+ do
+
+ v_result=$(sudo apt -y remove --purge ${pkg} 2>&1>/dev/null )
+
+ PkgInstalled=$(sudo dpkg -s ${pkg} 2>/dev/null | grep -i "Status:" | wc -l)
+
+ if [[ ${PkgInstalled} -eq 1 ]]; then
+ loggit "INFO" "${pkg} is installed"
+ else
+ loggit "INFO" "${pkg} is no longer installed"
+ fi
+
+ done
+
+ sudo rm -rf /usr/local/bin/meteordemod
+ if [[ -f /usr/local/bin/meteordemod ]]; then
+ loggit "INFO" "meteordemod is installed"
+ else
+ loggit "INFO" "meteordemod is no longer installed"
+ fi
+}
+
+remove_paths() {
+
+ loggit "INFO" ""
+ loggit "INFO" "------------------------------"
+ loggit "INFO" "Removing Files and Directories"
+ loggit "INFO" "------------------------------"
+ for path in `echo ${PATHS}`;
+ do
+
+ sudo rm -rf ${path}
+
+ if ! (( $? )); then
+ loggit "PASS" "${path} no longer exists"
+ else
+ loggit "FAIL" "${path} failed to remove"
+ fi
+
+ done
+}
+
+# kill any RN2 AT processes as part of clean up, otherwise danglers
+# may have the RTL-SDR open and verification dryrun test will fail
+
+ps aux | grep -E "receive_|satdump" | grep -v grep | awk -F" " '{print $2}' | xargs kill -9 2>/dev/null
+package_statuses
+remove_services
+remove_packages
+remove_paths
+
+loggit "INFO" ""
+loggit "INFO" "------------------------------"
+loggit "INFO" "Removing RN2 CRON jobs"
+loggit "INFO" "------------------------------"
+
+crontab -l | grep -Ev "schedule.sh|scratch_perms.sh|Ansible" > $HOME/crontab.stripped
+crontab < $HOME/crontab.stripped
+CronQty=$(crontab -l | grep -Ev "schedule.sh|scratch_perms.sh|Ansible" | wc -l)
+
+if [[ ${CronQty} -eq 0 ]]; then
+ loggit "PASS" "RN2 cronjobs no longer exist"
+ \rm -rf $HOME/crontab.stripped
+else
+ loggit "FAIL" "RN2 cronjobs were NOT removed"
+fi
+
+# Let's make sure to clean up the library cache so any dangling items are cleared
+sudo ldconfig
+
+loggit "INFO" ""
+loggit "INFO" "Log of results --> ${UNINSTALL_LOG}"
+echo ""
+
+secs_to_human "$(($(date +%s) - ${start}))"
diff --git a/ansible/roles/common/files/rn2_upgrade.sh b/ansible/roles/common/files/rn2_upgrade.sh
new file mode 100644
index 000000000..61ca43e24
--- /dev/null
+++ b/ansible/roles/common/files/rn2_upgrade.sh
@@ -0,0 +1,147 @@
+#!/bin/bash
+#
+# Purpose: Upgrade an existing RN2 installation in situ while retaining key files
+#
+# Process Flow:
+#
+# 1) Backup/Stage RN2 key directories
+#
+# 2) Uninstall existing RN2 installation
+#
+# 3) git clone new repository
+#
+# 4) Restore/UnStage RN2 key directories
+#
+# 5) install_and_upgrade
+#
+# 6) verification tool
+#
+#
+# Author: Richard Creasey (AI4Y)
+#
+# Created: 28-July-2024
+#
+#
+# Input parameter:
+#
+# 1. Input Repo URL / branch name
+#
+# ./rn2_upgrade.sh "https://github.com/jekhokie/raspberry-noaa-v2.git -b aarch64-support"
+#
+
+ACNT=$#
+REPO=$1
+BARG=$2
+BRANCH=$3
+
+echo ""
+if [[ -z ${REPO} ]]; then
+ echo "Argument required: ./rn2_upgrade.sh https://github.com/jekhokie/raspberry-noaa-v2.git -b aarch64-support"
+ echo ""
+ exit 1
+fi
+
+if [[ ${ACNT} -gt 1 ]]; then
+
+ if [[ ${BARG} != "-b" ]]; then
+ echo "2nd Argument must be -b"
+ echo ""
+ echo " ./rn2_upgrade.sh https://github.com/jekhokie/raspberry-noaa-v2.git -b aarch64-support"
+ echo ""
+ exit 1
+ fi
+
+ if [[ -z ${BRANCH} ]]; then
+ echo "3rd Argument branch-name required:"
+ echo ""
+ echo " ./rn2_upgrade.sh https://github.com/jekhokie/raspberry-noaa-v2.git -b aarch64-support"
+ echo ""
+ exit 1
+ fi
+
+fi
+
+start=$(date +%s)
+
+secs_to_human() {
+ if [[ -z ${1} || ${1} -lt 60 ]] ;then
+ min=0 ; secs="${1}"
+ else
+ time_mins=$(echo "scale=2; ${1}/60" | bc)
+ min=$(echo ${time_mins} | cut -d'.' -f1)
+ secs="0.$(echo ${time_mins} | cut -d'.' -f2)"
+ secs=$(echo ${secs}*60|bc|awk '{print int($1+0.5)}')
+ fi
+ echo "RN2 Upgrade Time Elapsed : ${min} minutes and ${secs} seconds."
+}
+
+# Define RN2 Utils location
+RN2_UTILS="${HOME}/.rn2_utils"
+
+# Define log file for backup/restore activity
+LOG="${RN2_UTILS}/rn2_upgrade.log"
+
+{
+
+echo "##########################################################################"
+echo "# Testing git clone arguments passed before destructive tasks are performed"
+echo "##########################################################################"
+cd /tmp
+echo "git clone --depth 1 ${REPO} ${BARG} ${BRANCH}"
+git clone --depth 1 ${REPO} ${BARG} ${BRANCH}
+
+if [[ $? != 0 ]]; then
+ echo "FAILED to git clone repo/branch passed, please check and try again"
+ exit 1
+fi
+
+echo "#####################################################"
+echo "# Perform RN2 Key file backup/stage"
+echo "#####################################################"
+${RN2_UTILS}/rn2_backup_restore.sh backup_stage
+
+echo "#####################################################"
+echo "# Uninstall existing RN2 installation"
+echo "#####################################################"
+${RN2_UTILS}/rn2_uninstall.sh
+
+echo "#####################################################"
+echo "# Swap in git cloned repository into users home"
+echo "#####################################################"
+cd ${HOME}
+mv /tmp/raspberry-noaa-v2 ${HOME}
+
+if [[ $? == 0 ]]; then
+ echo "Succcessfully moved RN2 tree from /tmp to home directory"
+else
+ echo "FAILED to move RN2 tree from /tmp to home directory, aborting..."
+ exit 1
+fi
+
+echo "#####################################################"
+echo "# Restore/UnStage RN2 key directories"
+echo "#####################################################"
+${RN2_UTILS}/rn2_backup_restore.sh restore_stage
+
+echo "#####################################################"
+echo "# Execute install_and_upgrade"
+echo "#####################################################"
+cd ${HOME}/raspberry-noaa-v2
+./install_and_upgrade.sh
+
+# Determine if verification tool was in the repo cloned
+if [[ -f ${HOME}/raspberry-noaa-v2/scripts/tools/verification_tool/verification.sh ]]; then
+ # Confirm if install_and_upgrade.sh script code already executed it or not
+ vFound=$(cat ${HOME}/raspberry-noaa-v2/install_and_upgrade.sh | grep verification.sh | wc -l)
+ if [[ ${vFound} -eq 0 ]]; then
+ echo "#####################################################"
+ echo "# Execute Verification Tool"
+ echo "#####################################################"
+ ${HOME}/raspberry-noaa-v2/scripts/tools/verification_tool/verification.sh quick
+ fi
+else
+ echo "The installed GitHub REPO has not been updated with the Verification Tool, skipping..."
+fi
+
+secs_to_human "$(($(date +%s) - ${start}))"
+} | tee -a ${LOG}
diff --git a/ansible/roles/common/tasks/configs.yml b/ansible/roles/common/tasks/configs.yml
index b31208cbc..e482da33f 100644
--- a/ansible/roles/common/tasks/configs.yml
+++ b/ansible/roles/common/tasks/configs.yml
@@ -47,7 +47,7 @@
owner: root
group: root
mode: 0644
-
+
- name: wxtoimg license terms acceptance file
copy:
src: wxtoimglic
@@ -104,13 +104,6 @@
enabled: yes
when: (wifi_powermgmt_script.changed or wifi_powermgmt_service.changed) and (disable_wifi_power_mgmt|bool)
-- name: annotation directory
- file:
- path: /home/{{ target_user }}/config/annotation
- state: directory
- owner: "{{ target_user }}"
- group: "{{ target_user }}"
- mode: 0755
- name: annotation file (sample for modification)
copy:
@@ -129,4 +122,68 @@
owner: "{{ target_user }}"
group: "{{ target_user }}"
mode: 0600
+
+- name: rn2_utils directory
+ file:
+ path: /home/{{ target_user }}/.rn2_utils
+ state: directory
+ owner: "{{ target_user }}"
+ group: "{{ target_user }}"
+ mode: 0755
+
+- name: rn2_backup_restore script
+ copy:
+ src: rn2_backup_restore.sh
+ dest: /home/{{ target_user }}/.rn2_utils
+ owner: "{{ target_user }}"
+ group: "{{ target_user }}"
+ mode: 0755
+
+- name: rn2_uninstall script
+ copy:
+ src: rn2_uninstall.sh
+ dest: /home/{{ target_user }}/.rn2_utils
+ owner: "{{ target_user }}"
+ group: "{{ target_user }}"
+ mode: 0755
+
+- name: rn2_upgrade script
+ copy:
+ src: rn2_upgrade.sh
+ dest: /home/{{ target_user }}/.rn2_utils
+ owner: "{{ target_user }}"
+ group: "{{ target_user }}"
+ mode: 0755
+
+- name: receive_noaa.sh ownership permissions
+ file:
+ path: /home/{{ target_user }}/raspberry-noaa-v2/scripts/receive_noaa.sh
+ state: file
+ owner: "{{ target_user }}"
+ group: "{{ target_user }}"
+ mode: 0755
+
+- name: receive_meteor.sh ownership permissions
+ file:
+ path: /home/{{ target_user }}/raspberry-noaa-v2/scripts/receive_meteor.sh
+ state: file
+ owner: "{{ target_user }}"
+ group: "{{ target_user }}"
+ mode: 0755
+
+- name: schedule.sh ownership permissions
+ file:
+ path: /home/{{ target_user }}/raspberry-noaa-v2/scripts/schedule.sh
+ state: file
+ owner: "{{ target_user }}"
+ group: "{{ target_user }}"
+ mode: 0755
+
+- name: common.sh ownership permissions
+ file:
+ path: /home/{{ target_user }}/raspberry-noaa-v2/scripts/common.sh
+ state: file
+ owner: "{{ target_user }}"
+ group: "{{ target_user }}"
+ mode: 0755
...
diff --git a/ansible/roles/common/tasks/dependencies.yml b/ansible/roles/common/tasks/dependencies.yml
index 5eeb23886..43078dd5b 100644
--- a/ansible/roles/common/tasks/dependencies.yml
+++ b/ansible/roles/common/tasks/dependencies.yml
@@ -1,5 +1,5 @@
---
-- name: Installing general dependencies
+- name: Installing general dependencies (this task can take a while when installing for the first time, your Raspberry Pi / PC isn't frozen)
become: yes
apt:
update_cache: yes
@@ -60,6 +60,19 @@
- libopencv-dev
- python3-opencv
+- name: Install required wxtoimg 32-bit dependencies (arm64)
+ become: yes
+ apt:
+ update_cache: yes
+ state: present
+ name:
+ - libc6:armhf
+ - libstdc++6:armhf
+ - libasound2:armhf
+ - libx11-6:armhf
+ - libxft-dev:armhf
+ - libxft2:armhf
+ when: system_architecture == 'arm64'
#This was included because, for a period of time, SatDump didn't have dependencies included in the .deb file
@@ -163,7 +176,7 @@
executable: pip3
when: raspbian_version.stdout == 'bullseye'
-- name: Installing predict on PCs
+- name: Installing predict on PCs (amd64)
become: yes
apt:
deb: "{{ noaa_home }}/software/predict_2.2.3-4-b2_amd64.deb"
@@ -171,7 +184,7 @@
update_cache: no
when: system_architecture == 'amd64'
-- name: Installing predict on Raspberry Pi
+- name: Installing predict on Raspberry Pi (armhf)
become: yes
apt:
deb: "{{ noaa_home }}/software/predict_2.2.5+dfsg.1-1_armhf.deb"
@@ -179,13 +192,28 @@
update_cache: no
when: system_architecture == 'armhf'
+- name: Installing predict on Raspberry Pi (arm64)
+ become: yes
+ apt:
+ deb: "{{ noaa_home }}/software/predict_2.2.5+dfsg.1-1_arm64.deb"
+ state: present
+ update_cache: no
+ when: system_architecture == 'arm64'
+
- name: Installing SatDump
become: yes
apt:
- deb: "{{ noaa_home }}/software/satdump_1.2.1-1021e84b_{{ raspbian_version.stdout }}_{{ system_architecture }}.deb"
+ deb: "{{ noaa_home }}/software/satdump_1.2.1-397f9ed6_{{ raspbian_version.stdout }}_{{ system_architecture }}.deb"
state: present
update_cache: no
+- name: Create WXtoImg symbolic link for ARM64 architecture
+ file:
+ src: "/home/{{ target_user }}/raspberry-noaa-v2/software/wxtoimg-armhf-2.11.2-beta.deb"
+ dest: "/home/{{ target_user }}/raspberry-noaa-v2/software/wxtoimg-arm64-2.11.2-beta.deb"
+ state: link
+ when: system_architecture == 'arm64'
+
- name: Installing WXtoImg
become: yes
apt:
@@ -200,6 +228,20 @@
# state: present
# update_cache: no
+# OS Lite versions do not have .config, but when its created as as part of the .config/meteordemod task below
+# The .config ownership of top directory is root:root 755 when this happens and it needs to be target_user:target_user 700
+#
+# This problem does not occur on OS Full installations
+
+- name: .config directory ownership
+ become: yes
+ file:
+ path: /home/{{ target_user }}/.config
+ state: directory
+ owner: "{{ target_user }}"
+ group: "{{ target_user }}"
+ mode: 0700
+
- name: Check if MeteorDemod is installed
stat:
path: /usr/local/bin/meteordemod
@@ -239,7 +281,7 @@
when: meteor_demod_installed.stat.exists is not defined or meteor_demod_installed.stat.exists == False
- name: Make MeteorDemod
- command: make -j4
+ command: make -j3
args:
chdir: /home/{{ target_user }}/MeteorDemod/build
when: meteor_demod_installed.stat.exists is not defined or meteor_demod_installed.stat.exists == False
diff --git a/ansible/roles/common/tasks/main.yml b/ansible/roles/common/tasks/main.yml
index fbcd6389d..0c0d3c5e7 100644
--- a/ansible/roles/common/tasks/main.yml
+++ b/ansible/roles/common/tasks/main.yml
@@ -1,22 +1,22 @@
---
# dependent packages and libs to be installed
-- include: dependencies.yml
+- include_tasks: dependencies.yml
# environment configuration files
-- include: configs.yml
+- include_tasks: configs.yml
# ntp configurations
-- include: ntp.yml
+- include_tasks: ntp.yml
# core software modules
-- include: sdr.yml
+- include_tasks: sdr.yml
# tools and utilities
-- include: tools.yml
+- include_tasks: tools.yml
# ramfs setup
-- include: ramfs.yml
+- include_tasks: ramfs.yml
#social media and email
-- include: social_media.yml
+- include_tasks: social_media.yml
...
diff --git a/ansible/roles/common/tasks/sdr.yml b/ansible/roles/common/tasks/sdr.yml
index b62ee6d79..15a053ece 100644
--- a/ansible/roles/common/tasks/sdr.yml
+++ b/ansible/roles/common/tasks/sdr.yml
@@ -44,7 +44,7 @@
when: rtlsdr.changed
- name: generate build system for RTL-SDR software
- command: cmake ../ -DINSTALL_UDEV_RULES=ON -DDETACH_KERNEL_DRIVER=ON
+ command: cmake ../ -DDETACH_KERNEL_DRIVER=ON
args:
chdir: /tmp/rtl-sdr/build
creates: /tmp/rtl-sdr/build/Makefile
diff --git a/ansible/roles/common/tasks/tools.yml b/ansible/roles/common/tasks/tools.yml
index ed71f93d3..caf21eefa 100644
--- a/ansible/roles/common/tasks/tools.yml
+++ b/ansible/roles/common/tasks/tools.yml
@@ -20,6 +20,49 @@
special_time: reboot
job: "{{ noaa_home }}/scripts/schedule.sh"
+- name: Set permissions on set_os_config_kernel8.sh
+ file:
+ path: "/home/{{ target_user }}/raspberry-noaa-v2/scripts/tools/set_os_config_kernel8.sh"
+ state: file
+ owner: "{{ target_user }}"
+ group: "{{ target_user }}"
+ mode: 0755
+
+- name: Set permissions on scratch_perms.sh
+ file:
+ path: "/home/{{ target_user }}/raspberry-noaa-v2/scripts/tools/scratch_perms.sh"
+ state: file
+ owner: "{{ target_user }}"
+ group: "{{ target_user }}"
+ mode: 0755
+
+- name: Set permissions on verification.sh
+ file:
+ path: "/home/{{ target_user }}/raspberry-noaa-v2/scripts/tools/verification_tool/verification.sh"
+ state: file
+ owner: "{{ target_user }}"
+ group: "{{ target_user }}"
+ mode: 0755
+
+- name: Set permissions on build_permissions_list.sh
+ file:
+ path: "/home/{{ target_user }}/raspberry-noaa-v2/scripts/tools/verification_tool/config/build_permissions_list.sh"
+ state: file
+ owner: "{{ target_user }}"
+ group: "{{ target_user }}"
+ mode: 0755
+
+- name: Set kernel to kernel8.img
+ become: yes
+ command: "/home/{{ target_user }}/raspberry-noaa-v2/scripts/tools/set_os_config_kernel8.sh"
+ when: system_architecture == 'arm64'
+
+- name: create Scratch Perm fix cron job @ reboot
+ cron:
+ name: Correct /run/user/uid perms after reboot
+ special_time: reboot
+ job: "{{ noaa_home }}/scripts/tools/scratch_perms.sh"
+
- name: create database
shell: "/usr/bin/sqlite3 {{ noaa_home }}/db/panel.db < {{ noaa_home }}/db_migrations/00_seed_schema.sql"
args:
diff --git a/ansible/roles/common/templates/noaa-v2.conf.j2 b/ansible/roles/common/templates/noaa-v2.conf.j2
index 0431c9001..54a07acd6 100644
--- a/ansible/roles/common/templates/noaa-v2.conf.j2
+++ b/ansible/roles/common/templates/noaa-v2.conf.j2
@@ -25,6 +25,7 @@ TEST_FREQ_OFFSET={{ test_freq_offset }}
DAYS_TO_SCHEDULE_PASSES={{ days_to_schedule_passes }}
SELECT_BEST_OVERLAPPING_PASSES={{ select_best_overlapping_passes|lower }}
SELECT_METEOR_PASS_OVER_NOAA={{ select_meteor_pass_over_noaa|lower }}
+USE_DEVICE_STRING={{ use_device_string|lower }}
# NOAA 15 Configuration
NOAA_15_SCHEDULE={{ noaa_15_schedule|lower }}
@@ -127,6 +128,8 @@ EXTEND_FOR_ANNOTATION={{ extend_for_annotation|lower }}
GROUND_STATION_LOCATION='{{ ground_station_location }}'
NOAA_DAY_ENHANCEMENTS='{{ noaa_daytime_enhancements }}'
NOAA_NIGHT_ENHANCEMENTS='{{ noaa_nighttime_enhancements }}'
+METEOR_DAY_ENHANCEMENTS='{{ meteor_daytime_enhancements }}'
+METEOR_NIGHT_ENHANCEMENTS='{{ meteor_nighttime_enhancements }}'
# Community Contributions
CONTRIBUTE_TO_COMMUNITY_COMPOSITES={{ contribute_to_community_composites|lower }}
@@ -160,6 +163,9 @@ NTP_SERVER={{ ntp_server }}
# Satellite Visualization
ENABLE_SATVIS={{ enable_satvis|lower }}
+# Coronal mass ejection activity
+ENABLE_CORONAL_GIF={{ enable_coronal|lower }}
+
# Web Server Configuration
WEB_SERVER_NAME={{ web_server_name }}
WEBPANEL_PORT={{ web_port }}
diff --git a/ansible/roles/common/templates/satdump_cfg.json.j2 b/ansible/roles/common/templates/satdump_cfg.json.j2
index e7b3b6bad..49ad1926f 100644
--- a/ansible/roles/common/templates/satdump_cfg.json.j2
+++ b/ansible/roles/common/templates/satdump_cfg.json.j2
@@ -4,17 +4,10 @@
// Parameters shown in the default UI table, for everything
"default_offline_parameters": {
"baseband_format": {
- "type": "options",
+ "type": "baseband_type",
"value": "cs8",
"name": "Baseband Format",
- "options": [
- "cs8",
- "cu8",
- "cs16",
- "cf32",
- "ziq"
- ],
- "description": "The sample format of the recorded baseband.\nThis depends on the settings of your recording software,\nbut some common formats are s16 (SDR#, etc),\nf32 (GQRX), u8 (HDSDR), etc",
+ "description": "The sample format of the recorded baseband.\nThis depends on the settings of your recording software,\nbut some common formats are cs16 (SDR#, etc),\ncf32 (GQRX), cu8 (HDSDR), etc",
"no_live": true
},
"samplerate": {
@@ -103,6 +96,12 @@
"value": false,
"name": "Remember Window Size and Position",
"description": "Remeber size and position of the window when closing SatDump. It will open in the same configuration on next launch"
+ },
+ "advanced_mode": {
+ "type": "bool",
+ "value": false,
+ "name": "Advanced Mode",
+ "description": "Allows full editing of all SatDump options. Be warned: invalid configurations\nmay result in crashes, corruption of data, and more. Use at your own risk!"
}
},
// More generic SatDump settings
@@ -182,7 +181,7 @@
"type": "float",
"value": {{ altitude }},
"name": "QTH Altitude",
- "description": "Altitude (meters) of your station's QTH"
+ "description": "Altitude (meters above sea level) of your station's QTH"
},
"default_qth_label": {
"type": "string",
@@ -383,7 +382,7 @@
// 41882, // FENGYUN-4A
// 48808, // FENGYUN-4B
// 43823, // GK-2A
- 31304, // AIM
+ // 31304, // AIM
// 53807, // BlueWalker-3
// 53323, // COSMOS-2558
// 42719, // COSMOS-2518
@@ -505,7 +504,7 @@
"white_balance": true,
"individual_equalize": true
},
- "AVHRR 543b False Color": {
+ "AVHRR 543b IR False Color": {
"equation": "ch10 == 0 ? 0 : 1-ch10, ch9 == 0 ? 0 : 1-ch9, ch4 == 0 ? 0 : 1-ch4",
"white_balance": true,
"individual_equalize": true
@@ -576,13 +575,13 @@
"description": "descriptions/NatColor.md",
"geo_correct": true
},
- "543b": {
+ "AVHRR 543b IR False Color": {
"equation": "ch5, ch4, ch3b",
"individual_equalize": true,
"description": "descriptions/543b.md",
"geo_correct": true
},
- "3b45": {
+ "AVHRR 3b45 IR False Color": {
"equation": "ch3b, ch4, ch5",
"individual_equalize": true,
"description": "descriptions/3b45.md",
@@ -614,18 +613,18 @@
"autogen": {{ "true" if "therm" in noaa_nighttime_enhancements.split(' ') else "false" }},
"draw_map_overlay": {{ noaa_map_country_border_enable|lower }},
"borders_color": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"project": {
"width": 2048,
"height": 2048,
"draw_map": {{ noaa_map_country_border_enable|lower }},
"map_overlay_colors": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"individual_equalize": false,
"config": {
@@ -672,9 +671,9 @@
"cpp": "underlay_with_clouds",
"description": "descriptions/CloudUnderlay.md",
"vars": {
- "minoffset": 0,
+ "minoffset": 0.0,
"scalar": 1.5,
- "thresold": 0,
+ "thresold": 0.0,
"blend": false,
"invert": false
},
@@ -685,7 +684,7 @@
"cpp": "underlay_with_clouds",
"description": "descriptions/CloudUnderlay.md",
"vars": {
- "minoffset": 0,
+ "minoffset": 0.0,
"scalar": 1.5,
"thresold": 0.15,
"blend": false,
@@ -698,17 +697,17 @@
"cpp": "underlay_with_clouds",
"description": "descriptions/MCIR.md",
"vars": {
- "minoffset": 0,
- "scalar": 1,
- "thresold": 0,
+ "minoffset": 0.0,
+ "scalar": 1.0,
+ "thresold": 0.0,
"blend": true,
"invert": true
},
"draw_map_overlay": true,
"borders_color": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
]
},
"MSA (channel 1)": {
@@ -716,28 +715,28 @@
"cpp": "underlay_with_clouds",
"description": "descriptions/MSA.md",
"geo_correct": true,
- "autogen": {{ "true" if "MSA" in noaa_daytime_enhancements.split(' ') else "false" }},
"vars": {
- "minoffset": 0,
+ "minoffset": 0.0,
"scalar": 0.95,
- "thresold": 0,
+ "thresold": 0.0,
"blend": true,
"invert": false
},
+ "autogen": {{ "true" if "MSA" in noaa_daytime_enhancements.split(' ') else "false" }},
"draw_map_overlay": {{ noaa_map_country_border_enable|lower }},
"borders_color": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"project": {
"width": 2048,
"height": 2048,
"draw_map": {{ noaa_map_country_border_enable|lower }},
"map_overlay_colors": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"individual_equalize": false,
"config": {
@@ -756,28 +755,28 @@
"cpp": "underlay_with_clouds",
"description": "descriptions/MSA.md",
"geo_correct": true,
- "autogen": {{ "true" if "MSA" in noaa_daytime_enhancements.split(' ') else "false" }},
"vars": {
- "minoffset": 0,
+ "minoffset": 0.0,
"scalar": 0.95,
- "thresold": 0,
+ "thresold": 0.0,
"blend": true,
"invert": false
},
+ "autogen": {{ "true" if "MSA" in noaa_daytime_enhancements.split(' ') else "false" }},
"draw_map_overlay": {{ noaa_map_country_border_enable|lower }},
"borders_color": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"project": {
"width": 2048,
"height": 2048,
"draw_map": {{ noaa_map_country_border_enable|lower }},
"map_overlay_colors": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"individual_equalize": false,
"config": {
@@ -865,7 +864,6 @@
"channels": "cch4",
"description": "descriptions/SST.md",
"lua": "scripted_compos/sst_landmask.lua",
- "autogen": {{ "true" if "sea" in noaa_nighttime_enhancements.split(' ') else "false" }},
"vars": {
"minval": 0,
"maxval": 1
@@ -877,20 +875,21 @@
"max": 307.15
}
},
+ "autogen": {{ "true" if "sea" in noaa_nighttime_enhancements.split(' ') else "false" }},
"draw_map_overlay": {{ noaa_map_country_border_enable|lower }},
"borders_color": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"project": {
"width": 2048,
"height": 2048,
"draw_map": {{ noaa_map_country_border_enable|lower }},
"map_overlay_colors": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"individual_equalize": false,
"config": {
@@ -921,31 +920,20 @@
}
},
"autogen": {{ "true" if "fire" in noaa_nighttime_enhancements.split(' ') else "false" }},
- "vars": {
- "minval": 0,
- "maxval": 1
- },
- "calib_cfg": {
- "cch4": {
- "type": "temperature",
- "min": 270.65,
- "max": 307.15
- }
- },
"draw_map_overlay": {{ noaa_map_country_border_enable|lower }},
"borders_color": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"project": {
"width": 2048,
"height": 2048,
"draw_map": {{ noaa_map_country_border_enable|lower }},
"map_overlay_colors": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"individual_equalize": false,
"config": {
@@ -963,7 +951,6 @@
"lut": "lut/cal/WXtoImg-NO.png",
"description": "descriptions/NO.md",
"channels": "cch4",
- "autogen": {{ "true" if "NO" in noaa_daytime_enhancements.split(' ') else "false" }},
"calib_cfg": {
"cch4": {
"type": "radiance",
@@ -971,20 +958,21 @@
"max": 155.2782819316993
}
},
+ "autogen": {{ "true" if "NO" in noaa_nighttime_enhancements.split(' ') else "false" }},
"draw_map_overlay": {{ noaa_map_country_border_enable|lower }},
"borders_color": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"project": {
"width": 2048,
"height": 2048,
"draw_map": {{ noaa_map_country_border_enable|lower }},
"map_overlay_colors": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"individual_equalize": false,
"config": {
@@ -1009,22 +997,22 @@
},
"lut": "lut/cal/WXtoImg-ZA.png",
"description": "descriptions/ZA.md",
- "autogen": {{ "true" if "ZA" in noaa_daytime_enhancements.split(' ') else "false" }},
"geo_correct": true,
+ "autogen": {{ "true" if "ZA" in noaa_nighttime_enhancements.split(' ') else "false" }},
"draw_map_overlay": {{ noaa_map_country_border_enable|lower }},
"borders_color": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"project": {
"width": 2048,
"height": 2048,
"draw_map": {{ noaa_map_country_border_enable|lower }},
"map_overlay_colors": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"individual_equalize": false,
"config": {
@@ -1049,22 +1037,22 @@
"max": 155.2782819316993
}
},
- "autogen": {{ "true" if "MB" in noaa_daytime_enhancements.split(' ') else "false" }},
"geo_correct": true,
+ "autogen": {{ "true" if "MB" in noaa_nighttime_enhancements.split(' ') else "false" }},
"draw_map_overlay": {{ noaa_map_country_border_enable|lower }},
"borders_color": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"project": {
"width": 2048,
"height": 2048,
"draw_map": {{ noaa_map_country_border_enable|lower }},
"map_overlay_colors": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"individual_equalize": false,
"config": {
@@ -1089,22 +1077,22 @@
"max": 155.2782819316993
}
},
- "autogen": {{ "true" if "MD" in noaa_daytime_enhancements.split(' ') else "false" }},
"geo_correct": true,
+ "autogen": {{ "true" if "MD" in noaa_nighttime_enhancements.split(' ') else "false" }},
"draw_map_overlay": {{ noaa_map_country_border_enable|lower }},
"borders_color": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"project": {
"width": 2048,
"height": 2048,
"draw_map": {{ noaa_map_country_border_enable|lower }},
"map_overlay_colors": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"individual_equalize": false,
"config": {
@@ -1129,22 +1117,22 @@
},
"description": "descriptions/BD.md",
"lut": "lut/cal/WXtoImg-BD.png",
- "autogen": {{ "true" if "BD" in noaa_daytime_enhancements.split(' ') else "false" }},
"geo_correct": true,
+ "autogen": {{ "true" if "BD" in noaa_nighttime_enhancements.split(' ') else "false" }},
"draw_map_overlay": {{ noaa_map_country_border_enable|lower }},
"borders_color": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"project": {
"width": 2048,
"height": 2048,
"draw_map": {{ noaa_map_country_border_enable|lower }},
"map_overlay_colors": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"individual_equalize": false,
"config": {
@@ -1169,22 +1157,22 @@
},
"description": "descriptions/CC.md",
"lut": "lut/cal/WXtoImg-CC.png",
- "autogen": {{ "true" if "CC" in noaa_daytime_enhancements.split(' ') else "false" }},
"geo_correct": true,
+ "autogen": {{ "true" if "CC" in noaa_nighttime_enhancements.split(' ') else "false" }},
"draw_map_overlay": {{ noaa_map_country_border_enable|lower }},
"borders_color": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"project": {
"width": 2048,
"height": 2048,
"draw_map": {{ noaa_map_country_border_enable|lower }},
"map_overlay_colors": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"individual_equalize": false,
"config": {
@@ -1209,22 +1197,22 @@
},
"description": "descriptions/EC.md",
"lut": "lut/cal/WXtoImg-EC.png",
- "autogen": {{ "true" if "EC" in noaa_daytime_enhancements.split(' ') else "false" }},
"geo_correct": true,
+ "autogen": {{ "true" if "EC" in noaa_nighttime_enhancements.split(' ') else "false" }},
"draw_map_overlay": {{ noaa_map_country_border_enable|lower }},
"borders_color": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"project": {
"width": 2048,
"height": 2048,
"draw_map": {{ noaa_map_country_border_enable|lower }},
"map_overlay_colors": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"individual_equalize": false,
"config": {
@@ -1249,22 +1237,22 @@
},
"description": "descriptions/HE.md",
"lut": "lut/cal/WXtoImg-HE.png",
- "autogen": {{ "true" if "HE" in noaa_daytime_enhancements.split(' ') else "false" }},
"geo_correct": true,
+ "autogen": {{ "true" if "HE" in noaa_nighttime_enhancements.split(' ') else "false" }},
"draw_map_overlay": {{ noaa_map_country_border_enable|lower }},
"borders_color": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"project": {
"width": 2048,
"height": 2048,
"draw_map": {{ noaa_map_country_border_enable|lower }},
"map_overlay_colors": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"individual_equalize": false,
"config": {
@@ -1277,7 +1265,6 @@
"offset_y": 2048000
}
}
-
},
"HF enhancement": {
"channels": "cch4",
@@ -1290,22 +1277,22 @@
},
"description": "descriptions/HF.md",
"lut": "lut/cal/WXtoImg-HF.png",
- "autogen": {{ "true" if "HF" in noaa_daytime_enhancements.split(' ') else "false" }},
"geo_correct": true,
+ "autogen": {{ "true" if "HF" in noaa_nighttime_enhancements.split(' ') else "false" }},
"draw_map_overlay": {{ noaa_map_country_border_enable|lower }},
"borders_color": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"project": {
"width": 2048,
"height": 2048,
"draw_map": {{ noaa_map_country_border_enable|lower }},
"map_overlay_colors": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"individual_equalize": false,
"config": {
@@ -1318,7 +1305,6 @@
"offset_y": 2048000
}
}
-
},
"JF enhancement": {
"channels": "cch4",
@@ -1331,22 +1317,22 @@
},
"description": "descriptions/JF.md",
"lut": "lut/cal/WXtoImg-JF.png",
- "autogen": {{ "true" if "JF" in noaa_daytime_enhancements.split(' ') else "false" }},
"geo_correct": true,
+ "autogen": {{ "true" if "JF" in noaa_nighttime_enhancements.split(' ') else "false" }},
"draw_map_overlay": {{ noaa_map_country_border_enable|lower }},
"borders_color": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"project": {
"width": 2048,
"height": 2048,
"draw_map": {{ noaa_map_country_border_enable|lower }},
"map_overlay_colors": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"individual_equalize": false,
"config": {
@@ -1359,7 +1345,6 @@
"offset_y": 2048000
}
}
-
},
"JJ enhancement": {
"channels": "cch4",
@@ -1372,22 +1357,22 @@
},
"description": "descriptions/JJ.md",
"lut": "lut/cal/WXtoImg-JJ.png",
- "autogen": {{ "true" if "JJ" in noaa_daytime_enhancements.split(' ') else "false" }},
"geo_correct": true,
+ "autogen": {{ "true" if "JJ" in noaa_nighttime_enhancements.split(' ') else "false" }},
"draw_map_overlay": {{ noaa_map_country_border_enable|lower }},
"borders_color": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"project": {
"width": 2048,
"height": 2048,
"draw_map": {{ noaa_map_country_border_enable|lower }},
"map_overlay_colors": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"individual_equalize": false,
"config": {
@@ -1400,7 +1385,6 @@
"offset_y": 2048000
}
}
-
},
"TA enhancement": {
"channels": "cch4",
@@ -1413,22 +1397,22 @@
},
"description": "descriptions/TA.md",
"lut": "lut/cal/WXtoImg-TA.png",
- "autogen": {{ "true" if "TA" in noaa_daytime_enhancements.split(' ') else "false" }},
"geo_correct": true,
+ "autogen": {{ "true" if "TA" in noaa_nighttime_enhancements.split(' ') else "false" }},
"draw_map_overlay": {{ noaa_map_country_border_enable|lower }},
"borders_color": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"project": {
"width": 2048,
"height": 2048,
"draw_map": {{ noaa_map_country_border_enable|lower }},
"map_overlay_colors": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"individual_equalize": false,
"config": {
@@ -1441,28 +1425,27 @@
"offset_y": 2048000
}
}
-
},
"Enhanced IR": {
"channels": "cch4",
"description": "descriptions/EnhancedIR.md",
"lut": "lut/cal/EnhancedIR.png",
- "autogen": {{ "true" if "enhanced-IR" in noaa_nighttime_enhancements.split(' ') else "false" }},
"geo_correct": true,
+ "autogen": {{ "true" if "enhanced-IR" in noaa_nighttime_enhancements.split(' ') else "false" }},
"draw_map_overlay": {{ noaa_map_country_border_enable|lower }},
"borders_color": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"project": {
"width": 2048,
"height": 2048,
"draw_map": {{ noaa_map_country_border_enable|lower }},
"map_overlay_colors": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"individual_equalize": false,
"config": {
@@ -1483,6 +1466,35 @@
}
}
},
+ "Cloud Top IR": {
+ "channels": "cch4",
+ "description": "descriptions/CloudTopIR.md",
+ "lut": "lut/cal/CloudTopIR.png",
+ "autogen": true,
+ "geo_correct": true,
+ "calib_cfg": {
+ "cch4": {
+ "type": "temperature",
+ "min": 183.15,
+ "max": 323.15
+ }
+ }
+ },
+ "Enhanced IR (Transparent)": {
+ "equation": "cch4, 0, 0, cch4 > 0.99 ? 1 : 0",
+ "description": "descriptions/EnhancedIR.md",
+ "autogen": false,
+ "geo_correct": true,
+ "apply_lut": true,
+ "invert": true,
+ "calib_cfg": {
+ "cch4": {
+ "type": "temperature",
+ "min": 200,
+ "max": 241
+ }
+ }
+ },
"Color general cloud IR": {
"channels": "cch4",
"description": "descriptions/ColorGeneralIR.md",
@@ -1525,29 +1537,28 @@
"channels": "chb",
"cpp": "underlay_with_clouds",
"description": "descriptions/MCIR.md",
- "autogen": {{ "true" if "MCIR" in noaa_nighttime_enhancements.split(' ') else "false" }},
"vars": {
- "minoffset": 0,
- "scalar": 1,
- "thresold": 0,
+ "minoffset": 0.0,
+ "scalar": 1.0,
+ "thresold": 0.0,
"blend": true,
"invert": false
},
- "geo_correct": true,
+ "autogen": {{ "true" if "MCIR" in noaa_nighttime_enhancements.split(' ') else "false" }},
"draw_map_overlay": {{ noaa_map_country_border_enable|lower }},
"borders_color": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"project": {
"width": 2048,
"height": 2048,
"draw_map": {{ noaa_map_country_border_enable|lower }},
"map_overlay_colors": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"individual_equalize": false,
"config": {
@@ -1560,35 +1571,34 @@
"offset_y": 2048000
}
}
-
},
"MSA (Uncalibrated)": {
"channels": "cha",
"cpp": "underlay_with_clouds",
"description": "descriptions/MSA.md",
- "autogen": {{ "true" if "MSA" in noaa_daytime_enhancements.split(' ') else "false" }},
"vars": {
- "minoffset": 0,
+ "minoffset": 0.0,
"scalar": 0.95,
- "thresold": 0,
+ "thresold": 0.0,
"blend": true,
"invert": false
},
"geo_correct": true,
+ "autogen": {{ "true" if "MSA" in noaa_daytime_enhancements.split(' ') else "false" }},
"draw_map_overlay": {{ noaa_map_country_border_enable|lower }},
"borders_color": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"project": {
"width": 2048,
"height": 2048,
"draw_map": {{ noaa_map_country_border_enable|lower }},
"map_overlay_colors": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"individual_equalize": false,
"config": {
@@ -1601,34 +1611,33 @@
"offset_y": 2048000
}
}
-
},
"MCIR Rain (Uncalibrated)": {
"channels": "cha, chb",
"lua": "scripted_compos/underlay_with_clouds_lut.lua",
"description": "descriptions/MCIR_precip.md",
- "autogen": {{ "true" if "MCIR-precip" in noaa_nighttime_enhancements.split(' ') else "false" }},
"vars": {
"minoffset": 0.21,
- "scalar": 1,
+ "scalar": 1.0,
"thresold": 0.8,
"lut": "lut/WXtoImg-NO_mod_APT.png"
},
"geo_correct": true,
+ "autogen": {{ "true" if "MCIR-precip" in noaa_nighttime_enhancements.split(' ') else "false" }},
"draw_map_overlay": {{ noaa_map_country_border_enable|lower }},
"borders_color": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"project": {
"width": 2048,
"height": 2048,
"draw_map": {{ noaa_map_country_border_enable|lower }},
"map_overlay_colors": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"individual_equalize": false,
"config": {
@@ -1641,28 +1650,27 @@
"offset_y": 2048000
}
}
-
},
"HVC (channel 1)": {
"lut": "lut/WXtoImg-HVC-1.png",
"description": "descriptions/HVC.md",
"channels": "ch1, ch4",
- "autogen": {{ "true" if "HVC" in noaa_nighttime_enhancements.split(' ') else "false" }},
"geo_correct": true,
+ "autogen": {{ "true" if "HVC" in noaa_nighttime_enhancements.split(' ') else "false" }},
"draw_map_overlay": {{ noaa_map_country_border_enable|lower }},
"borders_color": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"project": {
"width": 2048,
"height": 2048,
"draw_map": {{ noaa_map_country_border_enable|lower }},
"map_overlay_colors": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"individual_equalize": false,
"config": {
@@ -1675,28 +1683,27 @@
"offset_y": 2048000
}
}
-
},
"HVC (channel 2)": {
"lut": "lut/WXtoImg-HVC-2.png",
"description": "descriptions/HVC.md",
"channels": "ch2, ch4",
- "autogen": {{ "true" if "HVC" in noaa_nighttime_enhancements.split(' ') else "false" }},
"geo_correct": true,
+ "autogen": {{ "true" if "HVC" in noaa_nighttime_enhancements.split(' ') else "false" }},
"draw_map_overlay": {{ noaa_map_country_border_enable|lower }},
"borders_color": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"project": {
"width": 2048,
"height": 2048,
"draw_map": {{ noaa_map_country_border_enable|lower }},
"map_overlay_colors": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"individual_equalize": false,
"config": {
@@ -1709,7 +1716,6 @@
"offset_y": 2048000
}
}
-
}
}
},
@@ -1775,7 +1781,7 @@
}
}
},
- "4 individual_equalized": {
+ "Thermal Channel": {
"equation": "ch4",
"individual_equalize": true,
"geo_correct": true,
@@ -1825,24 +1831,24 @@
"rgb_composites": {
"221": {
"equation": "ch2, ch2, ch1",
+ "geo_correct": true,
"white_balance": true,
"description": "descriptions/221.md",
- "autogen": true,
- "geo_correct": true,
+ "autogen": {{ "true" if "221" in meteor_daytime_enhancements.split(' ') else "false" }},
"draw_map_overlay": {{ meteor_draw_map_overlay|lower }},
"borders_color": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"project": {
"width": 2048,
"height": 2048,
"draw_map": {{ meteor_draw_map_overlay|lower }},
"map_overlay_colors": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"individual_equalize": false,
"config": {
@@ -1859,85 +1865,23 @@
"321": {
"equation": "ch3, ch2, ch1",
"description": "descriptions/321.md",
- "white_balance": true,
- "autogen": true,
"geo_correct": true,
+ "white_balance": true,
+ "autogen": {{ "true" if "321" in meteor_daytime_enhancements.split(' ') else "false" }},
"draw_map_overlay": {{ meteor_draw_map_overlay|lower }},
"borders_color": [
- 1,
- 1,
- 0
- ],
- "project": {
- "width": 2048,
- "height": 2048,
- "draw_map": {{ meteor_draw_map_overlay|lower }},
- "map_overlay_colors": [
- 1,
- 1,
- 0
- ],
- "individual_equalize": false,
- "config": {
- "type": "stereo",
- "lat0": {{ latitude }},
- "lon0": {{ longitude }},
- "scalar_x": 2000,
- "scalar_y": -2000,
- "offset_x": -2048000,
- "offset_y": 2048000
- }
- }
- },
- "negative224": {
- "equation": "ch2, ch2, 1-ch4",
- "geo_correct": true,
- "individual_equalize": true,
- "draw_map_overlay": {{ meteor_draw_map_overlay|lower }},
- "map_overlay_colors": [
- 1,
- 1,
- 0
- ],
- "project": {
- "width": 2048,
- "height": 2048,
- "draw_map": {{ meteor_draw_map_overlay|lower }},
- "map_overlay_colors": [
- 1,
- 1,
- 0
- ],
- "individual_equalize": false,
- "config": {
- "type": "stereo",
- "lat0": {{ latitude }},
- "lon0": {{ longitude }},
- "scalar_x": 2000,
- "scalar_y": -2000,
- "offset_x": -2048000,
- "offset_y": 2048000
- }
- }
- },
- "4": {
- "equation": "ch4, ch4, ch4",
- "geo_correct": true,
- "individual_equalize": true,
- "draw_map_overlay": {{ meteor_draw_map_overlay|lower }},
- "map_overlay_colors": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"project": {
"width": 2048,
"height": 2048,
"draw_map": {{ meteor_draw_map_overlay|lower }},
"map_overlay_colors": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"individual_equalize": false,
"config": {
@@ -1954,24 +1898,24 @@
"124": {
"equation": "ch1, ch2, 1-ch4",
"description": "descriptions/124.md",
+ "geo_correct": true,
"white_balance": true,
"individual_equalize": true,
- "autogen": true,
- "geo_correct": true,
+ "autogen": {{ "true" if "124" in meteor_daytime_enhancements.split(' ') else "false" }},
"draw_map_overlay": {{ meteor_draw_map_overlay|lower }},
"borders_color": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"project": {
"width": 2048,
"height": 2048,
"draw_map": {{ meteor_draw_map_overlay|lower }},
"map_overlay_colors": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"individual_equalize": false,
"config": {
@@ -1988,23 +1932,23 @@
"Natural Color": {
"equation": "((0.5*max(ch4,min(ch2,ch1)) + 0.5*ch2)+0.3*ch3)*0.85, ch2, ch1",
"description": "descriptions/NatColor.md",
+ "geo_correct": true,
"white_balance": true,
"autogen": true,
- "geo_correct": true,
"draw_map_overlay": {{ meteor_draw_map_overlay|lower }},
"borders_color": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"project": {
"width": 2048,
"height": 2048,
"draw_map": {{ meteor_draw_map_overlay|lower }},
"map_overlay_colors": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"individual_equalize": false,
"config": {
@@ -2022,22 +1966,22 @@
"equation": "1 - ch5",
"description": "descriptions/ThermalUncal.md",
"individual_equalize": true,
- "autogen": true,
"geo_correct": true,
+ "autogen": {{ "true" if "therm" in meteor_nighttime_enhancements.split(' ') else "false" }},
"draw_map_overlay": {{ meteor_draw_map_overlay|lower }},
"borders_color": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"project": {
"width": 2048,
"height": 2048,
"draw_map": {{ meteor_draw_map_overlay|lower }},
"map_overlay_colors": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"individual_equalize": false,
"config": {
@@ -2055,22 +1999,22 @@
"equation": "ch1, ch4^2.5, ch5",
"description": "descriptions/DayMicro.md",
"individual_equalize": true,
- "autogen": true,
"geo_correct": true,
+ "autogen": true,
"draw_map_overlay": {{ meteor_draw_map_overlay|lower }},
"borders_color": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"project": {
"width": 2048,
"height": 2048,
"draw_map": {{ meteor_draw_map_overlay|lower }},
"map_overlay_colors": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"individual_equalize": false,
"config": {
@@ -2088,22 +2032,22 @@
"equation": "ch6-ch5, ch5-ch4, ch5",
"description": "descriptions/NightMicro.md",
"individual_equalize": true,
- "autogen": true,
"geo_correct": true,
+ "autogen": true,
"draw_map_overlay": {{ meteor_draw_map_overlay|lower }},
"borders_color": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"project": {
"width": 2048,
"height": 2048,
"draw_map": {{ meteor_draw_map_overlay|lower }},
"map_overlay_colors": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"individual_equalize": false,
"config": {
@@ -2121,22 +2065,22 @@
"equation": "1 - ch6, 1 - ch5, 1 - ch4",
"description": "descriptions/543b.md",
"individual_equalize": true,
- "autogen": true,
"geo_correct": true,
+ "autogen": {{ "true" if "654" in meteor_nighttime_enhancements.split(' ') else "false" }},
"draw_map_overlay": {{ meteor_draw_map_overlay|lower }},
"borders_color": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"project": {
"width": 2048,
"height": 2048,
"draw_map": {{ meteor_draw_map_overlay|lower }},
"map_overlay_colors": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"individual_equalize": false,
"config": {
@@ -2154,22 +2098,22 @@
"equation": "1 - ch4, 1 - ch5, 1 - ch6",
"description": "descriptions/3b45.md",
"individual_equalize": true,
- "autogen": true,
"geo_correct": true,
+ "autogen": {{ "true" if "456" in meteor_nighttime_enhancements.split(' ') else "false" }},
"draw_map_overlay": {{ meteor_draw_map_overlay|lower }},
"borders_color": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"project": {
"width": 2048,
"height": 2048,
"draw_map": {{ meteor_draw_map_overlay|lower }},
"map_overlay_colors": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"individual_equalize": false,
"config": {
@@ -2198,22 +2142,21 @@
"max": 307.15
}
},
- "autogen": true,
- "geo_correct": true,
+ "autogen": {{ "true" if "sea" in meteor_nighttime_enhancements.split(' ') else "false" }},
"draw_map_overlay": {{ meteor_draw_map_overlay|lower }},
"borders_color": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"project": {
"width": 2048,
"height": 2048,
"draw_map": {{ meteor_draw_map_overlay|lower }},
"map_overlay_colors": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"individual_equalize": false,
"config": {
@@ -2243,22 +2186,21 @@
"max": 1000
}
},
- "autogen": true,
- "geo_correct": true,
+ "autogen": {{ "true" if "fire" in meteor_nighttime_enhancements.split(' ') else "false" }},
"draw_map_overlay": {{ meteor_draw_map_overlay|lower }},
"borders_color": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"project": {
"width": 2048,
"height": 2048,
"draw_map": {{ meteor_draw_map_overlay|lower }},
"map_overlay_colors": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"individual_equalize": false,
"config": {
@@ -2283,22 +2225,21 @@
"max": 155.2782819316993
}
},
- "autogen": true,
- "geo_correct": true,
+ "autogen": {{ "true" if "NO" in meteor_nighttime_enhancements.split(' ') else "false" }},
"draw_map_overlay": {{ meteor_draw_map_overlay|lower }},
"borders_color": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"project": {
"width": 2048,
"height": 2048,
"draw_map": {{ meteor_draw_map_overlay|lower }},
"map_overlay_colors": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"individual_equalize": false,
"config": {
@@ -2323,22 +2264,22 @@
},
"lut": "lut/cal/WXtoImg-ZA.png",
"description": "descriptions/ZA.md",
- "autogen": true,
"geo_correct": true,
+ "autogen": {{ "true" if "ZA" in meteor_nighttime_enhancements.split(' ') else "false" }},
"draw_map_overlay": {{ meteor_draw_map_overlay|lower }},
"borders_color": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"project": {
"width": 2048,
"height": 2048,
"draw_map": {{ meteor_draw_map_overlay|lower }},
"map_overlay_colors": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"individual_equalize": false,
"config": {
@@ -2363,22 +2304,22 @@
"max": 155.2782819316993
}
},
- "autogen": true,
"geo_correct": true,
+ "autogen": {{ "true" if "MB" in meteor_nighttime_enhancements.split(' ') else "false" }},
"draw_map_overlay": {{ meteor_draw_map_overlay|lower }},
"borders_color": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"project": {
"width": 2048,
"height": 2048,
"draw_map": {{ meteor_draw_map_overlay|lower }},
"map_overlay_colors": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"individual_equalize": false,
"config": {
@@ -2403,22 +2344,22 @@
"max": 155.2782819316993
}
},
- "autogen": true,
"geo_correct": true,
+ "autogen": {{ "true" if "MD" in meteor_nighttime_enhancements.split(' ') else "false" }},
"draw_map_overlay": {{ meteor_draw_map_overlay|lower }},
"borders_color": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"project": {
"width": 2048,
"height": 2048,
"draw_map": {{ meteor_draw_map_overlay|lower }},
"map_overlay_colors": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"individual_equalize": false,
"config": {
@@ -2443,22 +2384,22 @@
},
"description": "descriptions/BD.md",
"lut": "lut/cal/WXtoImg-BD.png",
- "autogen": true,
"geo_correct": true,
+ "autogen": {{ "true" if "BD" in meteor_nighttime_enhancements.split(' ') else "false" }},
"draw_map_overlay": {{ meteor_draw_map_overlay|lower }},
"borders_color": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"project": {
"width": 2048,
"height": 2048,
"draw_map": {{ meteor_draw_map_overlay|lower }},
"map_overlay_colors": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"individual_equalize": false,
"config": {
@@ -2483,22 +2424,22 @@
},
"description": "descriptions/CC.md",
"lut": "lut/cal/WXtoImg-CC.png",
- "autogen": true,
"geo_correct": true,
+ "autogen": {{ "true" if "CC" in meteor_nighttime_enhancements.split(' ') else "false" }},
"draw_map_overlay": {{ meteor_draw_map_overlay|lower }},
"borders_color": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"project": {
"width": 2048,
"height": 2048,
"draw_map": {{ meteor_draw_map_overlay|lower }},
"map_overlay_colors": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"individual_equalize": false,
"config": {
@@ -2523,22 +2464,22 @@
},
"description": "descriptions/EC.md",
"lut": "lut/cal/WXtoImg-EC.png",
- "autogen": true,
"geo_correct": true,
+ "autogen": {{ "true" if "EC" in meteor_nighttime_enhancements.split(' ') else "false" }},
"draw_map_overlay": {{ meteor_draw_map_overlay|lower }},
"borders_color": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"project": {
"width": 2048,
"height": 2048,
"draw_map": {{ meteor_draw_map_overlay|lower }},
"map_overlay_colors": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"individual_equalize": false,
"config": {
@@ -2563,22 +2504,22 @@
},
"description": "descriptions/HE.md",
"lut": "lut/cal/WXtoImg-HE.png",
- "autogen": true,
"geo_correct": true,
+ "autogen": {{ "true" if "HE" in meteor_nighttime_enhancements.split(' ') else "false" }},
"draw_map_overlay": {{ meteor_draw_map_overlay|lower }},
"borders_color": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"project": {
"width": 2048,
"height": 2048,
"draw_map": {{ meteor_draw_map_overlay|lower }},
"map_overlay_colors": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"individual_equalize": false,
"config": {
@@ -2603,22 +2544,22 @@
},
"description": "descriptions/HF.md",
"lut": "lut/cal/WXtoImg-HF.png",
- "autogen": true,
"geo_correct": true,
+ "autogen": {{ "true" if "HF" in meteor_nighttime_enhancements.split(' ') else "false" }},
"draw_map_overlay": {{ meteor_draw_map_overlay|lower }},
"borders_color": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"project": {
"width": 2048,
"height": 2048,
"draw_map": {{ meteor_draw_map_overlay|lower }},
"map_overlay_colors": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"individual_equalize": false,
"config": {
@@ -2643,22 +2584,22 @@
},
"description": "descriptions/JF.md",
"lut": "lut/cal/WXtoImg-JF.png",
- "autogen": true,
"geo_correct": true,
+ "autogen": {{ "true" if "JF" in meteor_nighttime_enhancements.split(' ') else "false" }},
"draw_map_overlay": {{ meteor_draw_map_overlay|lower }},
"borders_color": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"project": {
"width": 2048,
"height": 2048,
"draw_map": {{ meteor_draw_map_overlay|lower }},
"map_overlay_colors": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"individual_equalize": false,
"config": {
@@ -2683,22 +2624,22 @@
},
"description": "descriptions/JJ.md",
"lut": "lut/cal/WXtoImg-JJ.png",
- "autogen": true,
"geo_correct": true,
+ "autogen": {{ "true" if "JJ" in meteor_nighttime_enhancements.split(' ') else "false" }},
"draw_map_overlay": {{ meteor_draw_map_overlay|lower }},
"borders_color": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"project": {
"width": 2048,
"height": 2048,
"draw_map": {{ meteor_draw_map_overlay|lower }},
"map_overlay_colors": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"individual_equalize": false,
"config": {
@@ -2723,22 +2664,62 @@
},
"description": "descriptions/TA.md",
"lut": "lut/cal/WXtoImg-TA.png",
- "autogen": true,
"geo_correct": true,
+ "autogen": {{ "true" if "TA" in meteor_nighttime_enhancements.split(' ') else "false" }},
"draw_map_overlay": {{ meteor_draw_map_overlay|lower }},
"borders_color": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"project": {
"width": 2048,
"height": 2048,
"draw_map": {{ meteor_draw_map_overlay|lower }},
"map_overlay_colors": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
+ ],
+ "individual_equalize": false,
+ "config": {
+ "type": "stereo",
+ "lat0": {{ latitude }},
+ "lon0": {{ longitude }},
+ "scalar_x": 2000,
+ "scalar_y": -2000,
+ "offset_x": -2048000,
+ "offset_y": 2048000
+ }
+ }
+ },
+ "Cloud Top IR": {
+ "channels": "cch5",
+ "description": "descriptions/CloudTopIR.md",
+ "lut": "lut/cal/CloudTopIR.png",
+ "geo_correct": true,
+ "calib_cfg": {
+ "cch4": {
+ "type": "temperature",
+ "min": 183.15,
+ "max": 323.15
+ }
+ },
+ "autogen": {{ "true" if "enhanced-IR" in meteor_nighttime_enhancements.split(' ') else "false" }},
+ "draw_map_overlay": {{ meteor_draw_map_overlay|lower }},
+ "borders_color": [
+ 1.0,
+ 1.0,
+ 0.0
+ ],
+ "project": {
+ "width": 2048,
+ "height": 2048,
+ "draw_map": {{ meteor_draw_map_overlay|lower }},
+ "map_overlay_colors": [
+ 1.0,
+ 1.0,
+ 0.0
],
"individual_equalize": false,
"config": {
@@ -2756,22 +2737,29 @@
"channels": "cch5",
"description": "descriptions/EnhancedIR.md",
"lut": "lut/cal/EnhancedIR.png",
- "autogen": true,
"geo_correct": true,
+ "calib_cfg": {
+ "cch5": {
+ "type": "temperature",
+ "min": 200,
+ "max": 300
+ }
+ },
+ "autogen": {{ "true" if "enhanced-IR" in meteor_nighttime_enhancements.split(' ') else "false" }},
"draw_map_overlay": {{ meteor_draw_map_overlay|lower }},
"borders_color": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"project": {
"width": 2048,
"height": 2048,
"draw_map": {{ meteor_draw_map_overlay|lower }},
"map_overlay_colors": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"individual_equalize": false,
"config": {
@@ -2783,12 +2771,20 @@
"offset_x": -2048000,
"offset_y": 2048000
}
- },
+ }
+ },
+ "Enhanced IR (Transparent)": {
+ "equation": "cch5, 0, 0, cch5 > 0.99 ? 1 : 0",
+ "description": "descriptions/EnhancedIR.md",
+ "autogen": false,
+ "geo_correct": true,
+ "apply_lut": true,
+ "invert": true,
"calib_cfg": {
"cch5": {
"type": "temperature",
"min": 200,
- "max": 300
+ "max": 241
}
}
},
@@ -2796,22 +2792,29 @@
"channels": "cch5",
"description": "descriptions/ColorGeneralIR.md",
"lut": "lut/cal/Multispectral.png",
- "autogen": true,
"geo_correct": true,
+ "calib_cfg": {
+ "cch5": {
+ "type": "temperature",
+ "min": 180,
+ "max": 320
+ }
+ },
+ "autogen": {{ "true" if "enhanced-IR" in meteor_nighttime_enhancements.split(' ') else "false" }},
"draw_map_overlay": {{ meteor_draw_map_overlay|lower }},
"borders_color": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"project": {
"width": 2048,
"height": 2048,
"draw_map": {{ meteor_draw_map_overlay|lower }},
"map_overlay_colors": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"individual_equalize": false,
"config": {
@@ -2823,35 +2826,35 @@
"offset_x": -2048000,
"offset_y": 2048000
}
- },
- "calib_cfg": {
- "cch5": {
- "type": "temperature",
- "min": 180,
- "max": 320
- }
}
},
"Color convection longwave IR": {
"channels": "cch5",
"description": "descriptions/ConvectionLWIR.md",
"lut": "lut/cal/ConvectionLWIR.png",
- "autogen": true,
"geo_correct": true,
+ "calib_cfg": {
+ "cch5": {
+ "type": "temperature",
+ "min": 180,
+ "max": 320
+ }
+ },
+ "autogen": {{ "true" if "enhanced-IR" in meteor_nighttime_enhancements.split(' ') else "false" }},
"draw_map_overlay": {{ meteor_draw_map_overlay|lower }},
"borders_color": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"project": {
"width": 2048,
"height": 2048,
"draw_map": {{ meteor_draw_map_overlay|lower }},
"map_overlay_colors": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"individual_equalize": false,
"config": {
@@ -2863,42 +2866,35 @@
"offset_x": -2048000,
"offset_y": 2048000
}
- },
- "calib_cfg": {
- "cch5": {
- "type": "temperature",
- "min": 180,
- "max": 320
- }
}
},
"MCIR": {
"channels": "ch4",
"cpp": "underlay_with_clouds",
"description": "descriptions/MCIR.md",
+ "geo_correct": true,
"vars": {
- "minoffset": 0,
- "scalar": 1,
- "thresold": 0,
+ "minoffset": 0.0,
+ "scalar": 1.0,
+ "thresold": 0.0,
"blend": true,
"invert": true
},
- "autogen": true,
- "geo_correct": true,
+ "autogen": {{ "true" if "MCIR" in meteor_nighttime_enhancements.split(' ') else "false" }},
"draw_map_overlay": {{ meteor_draw_map_overlay|lower }},
"borders_color": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"project": {
"width": 2048,
"height": 2048,
"draw_map": {{ meteor_draw_map_overlay|lower }},
"map_overlay_colors": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"individual_equalize": false,
"config": {
@@ -2916,29 +2912,29 @@
"channels": "ch1",
"cpp": "underlay_with_clouds",
"description": "descriptions/MSA.md",
+ "geo_correct": true,
"vars": {
- "minoffset": 0,
- "scalar": 1,
- "thresold": 0,
+ "minoffset": 0.0,
+ "scalar": 1.0,
+ "thresold": 0.0,
"blend": true,
"invert": false
},
- "autogen": true,
- "geo_correct": true,
+ "autogen": {{ "true" if "MSA" in meteor_daytime_enhancements.split(' ') else "false" }},
"draw_map_overlay": {{ meteor_draw_map_overlay|lower }},
"borders_color": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"project": {
"width": 2048,
"height": 2048,
"draw_map": {{ meteor_draw_map_overlay|lower }},
"map_overlay_colors": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"individual_equalize": false,
"config": {
@@ -2955,22 +2951,22 @@
"Channel 4 Equalized": {
"equation": "1 - ch4",
"individual_equalize": true,
- "autogen": true,
- "geo_correct": true,
+ "geo_correct": false,
+ "autogen": {{ "true" if "enhanced-IR" in meteor_nighttime_enhancements.split(' ') else "false" }},
"draw_map_overlay": {{ meteor_draw_map_overlay|lower }},
"borders_color": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"project": {
"width": 2048,
"height": 2048,
"draw_map": {{ meteor_draw_map_overlay|lower }},
"map_overlay_colors": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"individual_equalize": false,
"config": {
@@ -3053,9 +3049,9 @@
},
"draw_map_overlay": true,
"borders_color": [
- 1,
- 1,
- 1
+ 1.0,
+ 1.0,
+ 1.0
],
"autogen": true
},
@@ -3067,9 +3063,9 @@
"lut": "goes/abi/usradioguycustomlut.png"
},
"borders_color": [
- 1,
- 1,
- 1
+ 1.0,
+ 1.0,
+ 1.0
],
"autogen": false // Needs to be optimized...
},
@@ -3097,9 +3093,9 @@
},
"lua": "scripted_compos/split_difference.lua",
"borders_color": [
- 1,
- 1,
- 1
+ 1.0,
+ 1.0,
+ 1.0
],
"autogen": false
},
@@ -3141,9 +3137,9 @@
},
"lut": "lut/cal/abi_ir_11-15.png",
"borders_color": [
- 1,
- 1,
- 1
+ 1.0,
+ 1.0,
+ 1.0
],
"autogen": true
},
@@ -3161,9 +3157,9 @@
},
"lut": "lut/cal/abi_ir_11-15.png",
"borders_color": [
- 1,
- 1,
- 1
+ 1.0,
+ 1.0,
+ 1.0
],
"autogen": true
},
@@ -3181,9 +3177,9 @@
},
"lut": "lut/cal/abi_ir_11-15.png",
"borders_color": [
- 1,
- 1,
- 1
+ 1.0,
+ 1.0,
+ 1.0
],
"autogen": true
},
@@ -3200,9 +3196,9 @@
},
"lut": "lut/cal/Dirty_IR_CIRA.png",
"borders_color": [
- 1,
- 1,
- 1
+ 1.0,
+ 1.0,
+ 1.0
],
"autogen": true
},
@@ -3220,9 +3216,9 @@
},
"lut": "lut/cal/abi_wv_8-10.png",
"borders_color": [
- 1,
- 0,
- 0
+ 1.0,
+ 0.0,
+ 0.0
],
"autogen": true
},
@@ -3240,9 +3236,9 @@
},
"lut": "lut/cal/abi_wv_8-10.png",
"borders_color": [
- 1,
- 0,
- 0
+ 1.0,
+ 0.0,
+ 0.0
],
"autogen": true
},
@@ -3259,9 +3255,9 @@
},
"lut": "lut/cal/abi_ir_7.png",
"borders_color": [
- 0,
- 0,
- 0
+ 0.0,
+ 0.0,
+ 0.0
],
"autogen": true
},
@@ -3270,9 +3266,9 @@
"draw_map_overlay": true,
"remove_background": true,
"borders_color": [
- 1,
- 1,
- 1
+ 1.0,
+ 1.0,
+ 1.0
],
"calib_cfg": {
"cch2": {
@@ -3293,9 +3289,9 @@
"remove_background": true,
"draw_map_overlay": true,
"borders_color": [
- 0,
- 0,
- 0
+ 0.0,
+ 0.0,
+ 0.0
],
"calib_cfg": {
"cch7": {
@@ -3321,9 +3317,9 @@
"draw_map_overlay": true,
"remove_background": true,
"borders_color": [
- 1,
- 1,
- 1
+ 1.0,
+ 1.0,
+ 1.0
],
"calib_cfg": {
"cch2": {
@@ -3371,9 +3367,9 @@
"cpp": "goes_abi_false_color",
"draw_map_overlay": true,
"borders_color": [
- 1,
- 1,
- 1
+ 1.0,
+ 1.0,
+ 1.0
]
},
"Day Cloud Convection": {
@@ -3381,9 +3377,9 @@
"draw_map_overlay": true,
"remove_background": true,
"borders_color": [
- 1,
- 1,
- 1
+ 1.0,
+ 1.0,
+ 1.0
],
"calib_cfg": {
"cch3": {
@@ -3413,9 +3409,9 @@
},
"lut": "lut/cal/abi_wv_8-10.png",
"borders_color": [
- 1,
- 0,
- 0
+ 1.0,
+ 0.0,
+ 0.0
]
},
"Clean Longwave IR Window Band": {
@@ -3432,9 +3428,9 @@
},
"lut": "lut/cal/abi_ir_11-15.png",
"borders_color": [
- 1,
- 1,
- 1
+ 1.0,
+ 1.0,
+ 1.0
]
}
}
@@ -3450,15 +3446,15 @@
"vars": {
"minoffset": 0.3,
"scalar": 1.2,
- "thresold": 0,
+ "thresold": 0.0,
"blend": true,
"invert": true
},
"draw_map_overlay": true,
"borders_color": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
],
"autogen": false
},
@@ -3476,9 +3472,9 @@
},
"lut": "lut/cal/abi_ir_11-15.png",
"borders_color": [
- 1,
- 1,
- 1
+ 1.0,
+ 1.0,
+ 1.0
],
"autogen": true
},
@@ -3496,9 +3492,9 @@
},
"lut": "lut/cal/abi_ir_11-15.png",
"borders_color": [
- 1,
- 1,
- 1
+ 1.0,
+ 1.0,
+ 1.0
],
"autogen": true
},
@@ -3515,9 +3511,9 @@
},
"lut": "lut/cal/Dirty_IR_CIRA.png",
"borders_color": [
- 1,
- 1,
- 1
+ 1.0,
+ 1.0,
+ 1.0
],
"autogen": true
},
@@ -3535,9 +3531,9 @@
},
"lut": "lut/cal/abi_wv_8-10.png",
"borders_color": [
- 1,
- 0,
- 0
+ 1.0,
+ 0.0,
+ 0.0
],
"autogen": true
},
@@ -3640,6 +3636,115 @@
}
}
},
+ "airs": {
+ "handler": "image_handler",
+ "name": "AIRS",
+ "rgb_composites": {
+ "λ=4.3µm (CO2 absorption 1a)": {
+ "equation": "ch366",
+ "individual_equalize": true
+ },
+ "λ=4.4µm (CO2 absorption 1b + H2O line)": {
+ "equation": "ch420",
+ "individual_equalize": true
+ },
+ "λ=7.7µm (Methane absorption)": {
+ "equation": "ch980",
+ "individual_equalize": true
+ },
+ "λ=14.9µm (CO2 absorption 2)": {
+ "equation": "ch2292",
+ "individual_equalize": true
+ },
+ "λ=10.8µm (Window)": {
+ "equation": "ch1821",
+ "individual_equalize": true
+ },
+ "AVHRR 3b45 IR False Color": {
+ "equation": "ch4, ch1569, ch1821",
+ "individual_equalize": true,
+ "invert": true
+ },
+ "AVHRR 543b IR False Color": {
+ "equation": "ch1821, ch1569, ch4",
+ "individual_equalize": true,
+ "invert": true
+ },
+ "HIRS False Color": {
+ "equation": "ch2148, ch2193, ch2239",
+ "description": "descriptions/sounders/HIRSFalseColor.md",
+ "individual_equalize": true,
+ "invert": true
+ },
+ "6.2µm Water Vapor RGB": {
+ "equation": "ch517, ch521, ch527",
+ "individual_equalize": true,
+ "invert": true
+ },
+ "7.35 µm Water Vapor RGB": {
+ "equation": "ch845, ch857, ch863",
+ "individual_equalize": true,
+ "invert": true
+ },
+ "Airmass RGB": {
+ "equation": "(1-ch515)-(1-ch857), (1-ch1310)-(1-ch1569), (1-ch515)",
+ "individual_equalize": true
+ },
+ "Clouds Only (N2O Sounding)": {
+ "equation": "1-ch481, 1-ch570, 1",
+ "description": "descriptions/sounders/CloudOnlyN2O.md",
+ "individual_equalize": true
+ },
+ "Mid Level Water Vapor": {
+ "equation": "1-ch868",
+ "description": "descriptions/sounders/MLWV.md",
+ "individual_equalize": true,
+ "apply_lut": true
+ },
+ "Mid Stratosphere CO2 Temperature": {
+ "equation": "ch2256",
+ "description": "descriptions/sounders/MidStratoCO2T.md",
+ "individual_equalize": true,
+ "apply_lut": true
+ },
+ "Low Stratosphere CO2 Temperature": {
+ "equation": "ch2239",
+ "description": "descriptions/sounders/LowStratoCO2T.md",
+ "individual_equalize": true,
+ "apply_lut": true
+ },
+ "Top Troposphere CO2 Temperature": {
+ "equation": "ch2193",
+ "description": "descriptions/sounders/TopTropoCO2T.md",
+ "individual_equalize": true,
+ "apply_lut": true
+ },
+ "High Troposphere CO2 Temperature": {
+ "equation": "ch2148",
+ "description": "descriptions/sounders/HighTropoCO2T.md",
+ "individual_equalize": true,
+ "apply_lut": true
+ },
+ "Mid Troposphere CO2/H2O Temperature": {
+ "equation": "ch2088",
+ "description": "descriptions/sounders/MidTropoCO2H2OT.md",
+ "individual_equalize": true,
+ "apply_lut": true
+ },
+ "Low Troposphere CO2/H2O Temperature": {
+ "equation": "ch2038",
+ "description": "descriptions/sounders/LowTropoCO2H2OT.md",
+ "individual_equalize": true,
+ "apply_lut": true
+ },
+ "Cloud Detection Channel": {
+ "equation": "1-ch236",
+ "description": "descriptions/sounders/CloudDetection.md",
+ "individual_equalize": true,
+ "apply_lut": true
+ }
+ }
+ },
"modis": {
"handler": "image_handler",
"name": "MODIS",
@@ -3881,6 +3986,20 @@
"autogen": false,
"geo_correct": true
},
+ "Cloud Top IR": {
+ "channels": "cch31",
+ "description": "descriptions/CloudTopIR.md",
+ "lut": "lut/cal/CloudTopIR.png",
+ "autogen": true,
+ "geo_correct": true,
+ "calib_cfg": {
+ "cch4": {
+ "type": "temperature",
+ "min": 183.15,
+ "max": 323.15
+ }
+ }
+ },
"Enhanced IR": {
"channels": "cch31",
"description": "descriptions/EnhancedIR.md",
@@ -3979,9 +4098,9 @@
"individual_equalize": true,
"draw_map_overlay": true,
"borders_color": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
]
}
}
@@ -4004,7 +4123,7 @@
"equation": "ch17, ch19, ch18",
"geo_correct": true
},
- "9.12.11": {
+ "MERSI Airmass": {
"equation": "ch9, ch12, ch11",
"individual_equalize": true,
"geo_correct": true
@@ -4050,9 +4169,22 @@
"handler": "image_handler",
"name": "MERSI-LL",
"rgb_composites": {
- "338": {
+ "AVHRR 221 False Color": {
"equation": "ch3, ch3, ch8",
"white_balance": true,
+ "geo_correct": true,
+ "description": "descriptions/221.md"
+
+ },
+ "AVHRR 124 False Color": {
+ "equation": "ch3, ch8, 1-ch1",
+ "individual_equalize": true,
+ "description": "descriptions/124.md",
+ "geo_correct": true
+ },
+ "MERSI-LL Airmass": {
+ "equation": "ch8, ch6, ch4",
+ "individual_equalize": true,
"geo_correct": true
},
"IR/DNB Mix": {
@@ -4082,9 +4214,9 @@
"individual_equalize": true,
"draw_map_overlay": true,
"borders_color": [
- 1,
- 1,
- 0
+ 1.0,
+ 1.0,
+ 0.0
]
},
"AVHRR 543b IR False Color": {
@@ -4253,7 +4385,8 @@
},
"Microwave Airmass": {
"equation": "ch11,ch12,ch13",
- "individual_equalize": true
+ "individual_equalize": true,
+ "description": "descriptions/sounders/MicrowaveAirmass.md"
}
},
"project_channels": {
@@ -4408,15 +4541,18 @@
},
"MHS 221": {
"equation": "ch17,ch17,ch16",
- "individual_equalize": true
+ "individual_equalize": true,
+ "description": "descriptions/sounders/MHS221.md"
},
"MHS 421": {
"equation": "ch20,ch17,ch16",
- "individual_equalize": true
+ "individual_equalize": true,
+ "description": "descriptions/sounders/MHS221.md"
},
"Microwave Airmass": {
"equation": "ch18,ch19,ch20",
- "individual_equalize": true
+ "individual_equalize": true,
+ "description": "descriptions/sounders/MicrowaveAirmass.md"
},
"AMSU Surface Relative Temperature": {
"equation": "cos(ln(ch1) + ln(ch2)+0.8)",
@@ -4455,6 +4591,12 @@
"equation": "cch3^0.3, 0, 0, cch2 > 0.57 ? (cch3 < 0.5 ? 1 : 0) : 0",
"apply_lut": true,
"autogen": false
+ },
+ "Rainfall (Transparent, MHS-like)": {
+ "equation": "(((1-cch22-cch20))-0.95)^0.25, 0, 0, (((1-cch22-cch20))-0.95)^0.25 > 0.01 ? 1 : 0",
+ "apply_lut": true,
+ "autogen": false,
+ "description": "descriptions/sounders/RainfallTransparent.md"
}
}
},
diff --git a/ansible/roles/common/templates/settings.ini.j2 b/ansible/roles/common/templates/settings.ini.j2
index 346e556bb..57ecf2a32 100644
--- a/ansible/roles/common/templates/settings.ini.j2
+++ b/ansible/roles/common/templates/settings.ini.j2
@@ -40,7 +40,7 @@ TimeOffset=0.0
SatNameInTLE=METEOR-M2 4
ScanAngle=109.6
Roll=0.35
-Pitch=0.5
+Pitch=0.8
Yaw=-0.2
# Onboard time offset in seconds
TimeOffset=0.0
diff --git a/ansible/roles/webserver/templates/Config.php.j2 b/ansible/roles/webserver/templates/Config.php.j2
index d728897ea..eac1743dc 100644
--- a/ansible/roles/webserver/templates/Config.php.j2
+++ b/ansible/roles/webserver/templates/Config.php.j2
@@ -33,6 +33,10 @@ class Config {
# whether to enable satvis visualization
const ENABLE_SATVIS = '{{ enable_satvis|lower }}';
+ # whether to enable coronal mass ejetion GIFs from nasa
+ # warning: high data usage!
+ const ENABLE_CORONAL_GIF = '{{ enable_coronal|lower }}';
+
# whether to enable image video
const ENABLE_ANIMATION = '{{ enable_animation|lower }}';
const ANIMATION_VIDEO_FILE = '{{ noaa_animation_output }}';
@@ -47,6 +51,8 @@ class Config {
# which enhancements to display for day/night
const NOAA_DAY_ENHANCEMENTS = '{{ noaa_daytime_enhancements }}';
const NOAA_NIGHT_ENHANCEMENTS = '{{ noaa_nighttime_enhancements }}';
+ const METEOR_DAY_ENHANCEMENTS = '{{ meteor_daytime_enhancements }}';
+ const METEOR_NIGHT_ENHANCEMENTS = '{{ meteor_nighttime_enhancements }}';
# admin endpoint auth
const LOCK_ADMIN = '{{ lock_admin_page|lower }}';
diff --git a/config/settings.yml b/config/settings.yml
index 8044a3002..04c004279 100644
--- a/config/settings.yml
+++ b/config/settings.yml
@@ -117,8 +117,8 @@ delete_older_than_n: 30
# whether audio files should be deleted after images are created
# if you choose to keep files, they will be automatically deleted after set number of days in delete_files_older_than_days (default is 3 days)
-delete_noaa_audio: true
-delete_meteor_audio: true
+delete_noaa_audio: false
+delete_meteor_audio: false
delete_files_older_than_days: 3
# processing settings
@@ -191,8 +191,8 @@ produce_spectrogram: false #NOTE: the spectrogram option here is available fo
noaa_crop_telemetry: false
produce_noaa_pristine_image: false
produce_noaa_pristine_histogram: false
-noaa_daytime_enhancements: 'MSA MSA-precip MCIR MCIR-precip HVC-precip HVCT-precip HVC HVCT ZA therm sea CC HE HF MD BD MB JF JJ LC TA WV NO histeq'
-noaa_nighttime_enhancements: 'MCIR MCIR-precip HVCT ZA therm NO TA sea histeq'
+noaa_daytime_enhancements: 'MSA MSA-precip MCIR MCIR-precip HVC-precip HVCT-precip HVC HVCT ZA therm sea CC HE HF MD BD MB JF JJ LC TA WV NO histeq enhanced-IR'
+noaa_nighttime_enhancements: 'MCIR MCIR-precip HVCT ZA therm NO TA sea histeq enhanced-IR'
noaa_crop_toptobottom: false
noaa_interpolate: false
noaa_jpg_image_quality: 90
@@ -208,6 +208,8 @@ noaa_map_state_border_enable: true
noaa_map_state_border_color: "0xffff00"
wxtoimg_map_offset: 10.5 #Change this value only if you see map offsets from the ground on WXtoImg NOAA images
+meteor_daytime_enhancements: '221 321 124 MSA MCIR MCIR-precip HVC HVCT ZA therm sea CC HE HF MD BD MB JF JJ LC TA WV NO enhanced-IR'
+meteor_nighttime_enhancements: '654 456 MCIR MCIR-precip HVC HVCT ZA therm sea CC HE HF MD BD MB JF JJ LC TA WV NO enhanced-IR'
flip_meteor_image: true
meteor_jpg_image_quality: 90
meteor_draw_map_overlay: true
@@ -259,6 +261,12 @@ log_level: DEBUG
# the processing and space requirements
enable_satvis: true
+
+# whether to enable the "Coronal mass ejection activity" display
+# in the passes view - note that the GIFs can be ~70 MiB and not cached
+# thus they slow down the page & can lead to quite big data usage
+enable_coronal: false
+
# whether to enable the image video in the passes view - note that this
# is by default disabled on "extra-small" devices such as phones due
# to the processing and space requirements
diff --git a/config/settings_schema.json b/config/settings_schema.json
index 1147323ee..4e0fc886d 100644
--- a/config/settings_schema.json
+++ b/config/settings_schema.json
@@ -9,9 +9,18 @@
"test_sdr_device_id": { "type": "number" },
"test_enable_bias_tee": { "type": "boolean" },
"test_freq_offset": { "type": "number" },
- "receiver_type": { "type": "string" },
- "noaa_decoder": { "type": "string" },
- "meteor_decoder": { "type": "string" },
+ "receiver_type": {
+ "type": "string",
+ "enum": [ "rtlsdr", "airspy_mini", "airspy_r2", "airspy_hf_plus_discovery", "hackrf", "sdrplay", "mirisdr" ]
+ },
+ "noaa_decoder": {
+ "type": "string",
+ "enum": [ "satdump", "wxtoimg" ]
+ },
+ "meteor_decoder": {
+ "type": "string",
+ "enum": [ "satdump", "meteordemod" ]
+ },
"select_best_overlapping_passes": { "type": "boolean" },
"select_meteor_pass_over_noaa": { "type": "boolean" },
"noaa_15_schedule": { "type": "boolean" },
@@ -99,30 +108,41 @@
"minimum": 0,
"maximum": 90
},
- "noaa_memory_threshold": { "type": "number" },
- "meteor_m2_memory_threshold": { "type": "number" },
- "use_device_string": { "type": "boolean" },
- "meteor_m2_3_80k_interleaving": { "type": "boolean" },
- "days_to_schedule_passes": { "type": "number" },
- "delete_noaa_audio": { "type": "boolean" },
- "delete_meteor_audio": { "type": "boolean" },
- "delete_files_older_than_days": { "type": "number" },
- "flip_meteor_image": { "type": "boolean" },
- "produce_spectrogram": { "type": "boolean" },
- "noaa_crop_telemetry": { "type": "boolean" },
- "image_annotation_location": { "type": "string" },
- "extend_for_annotation": { "type": "boolean" },
- "produce_noaa_pristine_image": { "type": "boolean" },
- "produce_noaa_pristine_histogram": { "type": "boolean" },
- "produce_polar_az_el_graph": { "type": "boolean" },
- "produce_polar_direction_graph": { "type": "boolean" },
- "ground_station_location": { "type": "string" },
- "show_sun_elevation": { "type": "boolean" },
- "show_pass_direction": { "type": "boolean" },
- "noaa_daytime_enhancements": { "type": "string" },
- "noaa_nighttime_enhancements": { "type": "string" },
- "noaa_crop_toptobottom": { "type": "boolean" },
- "noaa_interpolate": { "type": "boolean" },
+ "noaa_memory_threshold": { "type": "number" },
+ "meteor_m2_memory_threshold": { "type": "number" },
+ "use_device_string": { "type": "boolean" },
+ "meteor_m2_3_80k_interleaving": { "type": "boolean" },
+ "days_to_schedule_passes": { "type": "number" },
+ "delete_noaa_audio": { "type": "boolean" },
+ "delete_meteor_audio": { "type": "boolean" },
+ "delete_files_older_than_days": { "type": "number" },
+ "flip_meteor_image": { "type": "boolean" },
+ "produce_spectrogram": { "type": "boolean" },
+ "noaa_crop_telemetry": { "type": "boolean" },
+ "image_annotation_location": { "type": "string" },
+ "extend_for_annotation": { "type": "boolean" },
+ "produce_noaa_pristine_image": { "type": "boolean" },
+ "produce_noaa_pristine_histogram": { "type": "boolean" },
+ "produce_polar_az_el_graph": { "type": "boolean" },
+ "produce_polar_direction_graph": { "type": "boolean" },
+ "ground_station_location": { "type": "string" },
+ "show_sun_elevation": { "type": "boolean" },
+ "show_pass_direction": { "type": "boolean" },
+ "noaa_daytime_enhancements": { "type": "string" },
+ "noaa_nighttime_enhancements": { "type": "string" },
+ "noaa_crop_toptobottom": { "type": "boolean" },
+ "noaa_interpolate": { "type": "boolean" },
+ "noaa_map_crosshair_enable": { "type": "boolean" },
+ "noaa_map_crosshair_color": { "type": "string" },
+ "noaa_map_grid_degrees": { "type": "number" },
+ "noaa_map_grid_color": { "type": "string" },
+ "noaa_map_country_border_enable": { "type": "boolean" },
+ "noaa_map_country_border_color": { "type": "string" },
+ "noaa_map_state_border_enable": { "type": "boolean" },
+ "noaa_map_state_border_color": { "type": "string" },
+ "wxtoimg_map_offset": { "type": "number" },
+ "noaa_thermal_temp_overlay": { "type": "boolean" },
+ "noaa_thermal_temp_overlay_location": { "type": "string" },
"noaa_jpg_image_quality": {
"type": "number",
"minimum": 0,
@@ -133,28 +153,17 @@
"minimum": 0,
"maximum": 100
},
+ "meteor_daytime_enhancements": { "type": "string" },
+ "meteor_nighttime_enhancements": { "type": "string" },
"meteor_create_equidistant_projection": { "type": "boolean" },
"meteor_create_mercator_projection": { "type": "boolean" },
"meteor_create_spreaded_images_without_overlay": { "type": "boolean" },
"meteor_create_rain_probability_overlay": { "type": "boolean" },
- "noaa_map_crosshair_enable": { "type": "boolean" },
"meteor_map_crosshair_enable": { "type": "boolean" },
- "noaa_map_crosshair_color": { "type": "string" },
"meteor_map_crosshair_color": { "type": "string" },
- "noaa_map_grid_degrees": { "type": "number" },
"meteor_draw_map_overlay": { "type": "boolean" },
"meteor_draw_cities": { "type": "boolean" },
- "noaa_map_grid_color": { "type": "string" },
- "noaa_map_country_border_enable": { "type": "boolean" },
- "noaa_map_country_border_color": { "type": "string" },
"meteor_map_country_border_color": { "type": "string" },
- "noaa_map_state_border_enable": { "type": "boolean" },
- "noaa_map_state_border_color": { "type": "string" },
- "wxtoimg_map_offset": { "type": "number" },
- "noaa_thermal_temp_overlay": { "type": "boolean" },
- "noaa_thermal_temp_overlay_location": {
- "type": "string"
- },
"lang_setting": {
"type": "string",
"enum": [ "ar", "bg", "cn", "de", "en", "es", "fr", "lt", "nl", "pt", "sr", "ru", "it", "hu", "gr", "kr", "ro" ]
@@ -285,6 +294,8 @@
"show_pass_direction",
"noaa_daytime_enhancements",
"noaa_nighttime_enhancements",
+ "meteor_daytime_enhancements",
+ "meteor_nighttime_enhancements",
"noaa_crop_toptobottom",
"noaa_interpolate",
"noaa_map_crosshair_enable",
diff --git a/docs/facebook_push.md b/docs/facebook_push.md
index 8c37954b3..8176beeb8 100644
--- a/docs/facebook_push.md
+++ b/docs/facebook_push.md
@@ -18,16 +18,16 @@ and created a Facebook page, you must then set the application permissions to be
* **API Key**: `FACEBOOK_ACCESS_TOKEN=""`
+ The Key you are to enter is your Page Token - [See How to get a Facebook page access token in 2024](https://www.sociablekit.com/how-to-get-a-facebook-page-access-token/)
+
## Testing (Optional)
If you want to run a manual test to ensure the Facebook configurations are acceptable, you can run a quick test
from the command line and pass an actual image file (or many) to the command like so:
```bash
-./scripts/push_processors/push_facebook.sh "test annotation" \
- "/srv/images/NOAA-18-20210212-091356-MCIR.jpg" \
- "/srv/images/NOAA-19-20210311-060645-ZA.jpg" \
- "/srv/images/NOAA-19-20210311-060645-spectrogram.png"
+${HOME}/raspberry-noaa-v2/scripts/push_processors/push_facebook.py "test annotation" \
+ "/srv/images/NOAA-15-20240826-143009-HVCT.jpg /srv/images/NOAA-15-20240826-143009-sea.jpg /srv/images/NOAA-15-20240826-143009-polar-direction.png"
```
If all goes well and the image paths passed are files that actually exist, you should see a new post on your
diff --git a/docs/setting_sdr_source_id.md b/docs/setting_sdr_source_id.md
new file mode 100644
index 000000000..e14e6f6fd
--- /dev/null
+++ b/docs/setting_sdr_source_id.md
@@ -0,0 +1,195 @@
+![Raspberry NOAA](../assets/header_1600_v2.png)
+
+# Setting SDR Device ID
+
+Good news - If you are using more than 1 SDR Dongle in your RN2 configuration and you wish to assign a particular SDR Dongle/Antenna pair to a satellite, you can!
+
+ Work flow:
+
+ #1 - Assign a unique serial # to each RTL-SDR Dongle that you wish to specitically assign to a satellite
+ #2 - Update settings.yml
+ #3 - Execute install_and_upgrade.sh
+ #4 - After the scheduled job executes for the satellite you assigned a unique device id to, confirm correct device ID was used.
+
+ These example instructions are for RTL-SDR Dongles.
+
+ Step #1 - Assign a unique serial # to each RTL-SDR Dongle
+
+ RTL Serial# programmed into the SDR and the sdr_device_id in settings.yml must not have any leading ZERO's.
+ The serial number must be no more than 8 characters and it must be an integer and must not have any leading ZERO's.
+
+For example it can be **0** or it can be set as high as **99999999** It cannot have leading ZERO's **00007777**
+
+
+Check currect serial# of installed SDR Dongle's
+
+ rtl_test -t
+ Found 2 device(s):
+ 0: RTLSDRBlog, Blog V4, SN: 00000001
+ 1: RTLSDRBlog, Blog V4, SN: 00000001
+
+Change the SDR serial #, when prompted, select 'y' to change
+Since our SDR Device ID's must fall between 0-99999999 For this example we will update both SDR Dongles with serial #'s 1 & 2,
+so remove all but the one of the SDR's whose serial # you want to update before running rtl_eeprom utility.
+
+ rtl_eeprom -s 1
+ Found 1 device(s):
+ 0: Generic RTL2832U OEM
+
+ Using device 0: Generic RTL2832U OEM
+ Found Rafael Micro R828D tuner
+ RTL-SDR Blog V4 Detected
+
+ Current configuration:
+ __________________________________
+ Vendor ID: 0x0bda
+ Product ID: 0x2838
+ Manufacturer: RTLSDRBlog
+ Product: Blog V4
+ Serial number: 00000001
+ Serial number enabled: yes
+ IR endpoint enabled: yes
+ Remote wakeup enabled: no
+ __________________________________
+
+ New configuration:
+ __________________________________
+ Vendor ID: 0x0bda
+ Product ID: 0x2838
+ Manufacturer: RTLSDRBlog
+ Product: Blog V4
+ Serial number: 1
+ Serial number enabled: yes
+ IR endpoint enabled: yes
+ Remote wakeup enabled: no
+ __________________________________
+ Write new configuration to device [y/n]? y
+
+ Configuration successfully written.
+ Please replug the device for changes to take effect.
+
+
+After removing and reinstalling the SDR Dongle, Confirm the serial #1 written is correct
+
+ rtl_test
+ Found 1 device(s):
+ 0: RTLSDRBlog, Blog V4, SN: 1
+
+Now remove that SDR Dongle and insert the second SDR Dongle which we will assign serial #2
+
+ rtl_eeprom -s 2
+ Found 1 device(s):
+ 0: Generic RTL2832U OEM
+
+ Using device 0: Generic RTL2832U OEM
+ Found Rafael Micro R828D tuner
+ RTL-SDR Blog V4 Detected
+
+ Current configuration:
+ __________________________________________
+ Vendor ID: 0x0bda
+ Product ID: 0x2838
+ Manufacturer: RTLSDRBlog
+ Product: Blog V4
+ Serial number: 00000001
+ Serial number enabled: yes
+ IR endpoint enabled: yes
+ Remote wakeup enabled: no
+ __________________________________________
+
+ New configuration:
+ __________________________________________
+ Vendor ID: 0x0bda
+ Product ID: 0x2838
+ Manufacturer: RTLSDRBlog
+ Product: Blog V4
+ Serial number: 2
+ Serial number enabled: yes
+ IR endpoint enabled: yes
+ Remote wakeup enabled: no
+ __________________________________________
+ Write new configuration to device [y/n]? y
+
+ Configuration successfully written.
+ Please replug the device for changes to take effect.
+
+
+After removing and reinstalling the second SDR Dongle, Confirm the serial #2 written is correct
+
+ rtl_test
+ Found 1 device(s):
+ 0: RTLSDRBlog, Blog V4, SN: 2
+
+
+Now insert all the SDR dongles and ensure they show up as Serial #1 & #2
+
+ rtl_test
+ Found 2 device(s):
+ 0: RTLSDRBlog, Blog V4, SN: 1
+ 1: RTLSDRBlog, Blog V4, SN: 2
+
+
+ Step #2 - Update settings.yml
+
+Make a backup before changing settings.yml, just in case...
+
+ cp -p ${HOME}/raspberry-noaa-v2/config/settings.yml ${HOME}/raspberry-noaa-v2/config/settings.yml.pre_device_id_change
+
+In settings.yml you must to enable use_device_string
+
+ use_device_string: true
+
+For each satellite that you want to assign a specific device id for, you must update its respective value.
+
+ Example only...
+ noaa_15_sdr_device_id: 1
+ noaa_18_sdr_device_id: 1
+ noaa_19_sdr_device_id: 1
+
+ meteor_m2_3_sdr_device_id: 2
+ meteor_m2_4_sdr_device_id: 2
+
+
+ Step #3 - Execute install_and_upgrade.sh
+
+ cd ${HOME}/raspberry-noaa-v2
+ ./install_and_upgrade.sh
+
+ Step #4 - After the scheduled job executes for the satellite you assigned a unique device id to, confirm that the correct device ID was used.
+
+
+ view /var/log/raspberry-noaa-v2/output.log
+
+Search for source_id by typing `/source_id` with each repeating forward `/` you type it should search through the file for occurances.
+
+Here you can see satdump saw both serial #1 & serial #2, since I set NOAA 15 to use Serial #1, that is what it used for source_id : "1"
+
+ [15:24:52 - 12/08/2024] ^[[36m(D) Device RTLSDRBlog Blog V4 #1
+ [15:24:52 - 12/08/2024] ^[[36m(D) Device RTLSDRBlog Blog V4 #2
+ [15:24:52 - 12/08/2024] ^[[36m(D) Device RTL-TCP
+ [15:24:52 - 12/08/2024] ^[[36m(D) Device SDR++ Server
+ [15:24:52 - 12/08/2024] ^[[36m(D) Device SpyServer
+ Found Rafael Micro R828D tuner
+ RTL-SDR Blog V4 Detected
+ [15:24:53 - 12/08/2024] ^[[36m(D) Set RTL-SDR samplerate to 1024000
+ [15:24:53 - 12/08/2024] ^[[36m(D) Set RTL-SDR frequency to 137620000
+ [15:24:53 - 12/08/2024] ^[[36m(D) Set RTL-SDR Bias to 0
+ [15:24:53 - 12/08/2024] ^[[36m(D) Set RTL-SDR AGC to 0
+ [15:24:53 - 12/08/2024] ^[[36m(D) Set RTL-SDR Gain to 49
+ [15:24:53 - 12/08/2024] ^[[36m(D) Set RTL-SDR PPM Correction to -3
+ [15:24:53 - 12/08/2024] ^[[36m(D) Parameters :
+ [15:24:53 - 12/08/2024] ^[[36m(D) - autocrop_wedges : true
+ [15:24:53 - 12/08/2024] ^[[36m(D) - baseband_format : "cf32"
+ [15:24:53 - 12/08/2024] ^[[36m(D) - buffer_size : 1000000
+ [15:24:53 - 12/08/2024] ^[[36m(D) - frequency : 137620000
+ [15:24:53 - 12/08/2024] ^[[36m(D) - gain : 49.6
+ [15:24:53 - 12/08/2024] ^[[36m(D) - ppm_correction : -3
+ [15:24:53 - 12/08/2024] ^[[36m(D) - samplerate : 1024000
+ [15:24:53 - 12/08/2024] ^[[36m(D) - satellite_number : 15
+ [15:24:53 - 12/08/2024] ^[[36m(D) - save_wav : true
+ [15:24:53 - 12/08/2024] ^[[36m(D) - sdrpp_noise_reduction : true
+ [15:24:53 - 12/08/2024] ^[[36m(D) - source : "rtlsdr"
+ [15:24:53 - 12/08/2024] ^[[36m(D) - source_id : "1"
+
+Good luck!
+
diff --git a/install_and_upgrade.sh b/install_and_upgrade.sh
index 67881edaf..3f7d38d41 100755
--- a/install_and_upgrade.sh
+++ b/install_and_upgrade.sh
@@ -173,13 +173,9 @@ echo "--------------------------------------------------------------------------
echo ""
if [ $install_type == 'install' ]; then
- log_running "It looks like this is a fresh install of the tooling for captures."
- log_running "If you've never had the software tools installed previously (e.g. if you've"
- log_running "not installed the original raspberry-noaa repo content), you likely need to"
- log_running "restart your device. Please do this to rule out any potential issues in the"
- log_running "software and libraries that have been installed."
-
- log_running "Automatically rebooting your device now to finish the new install."
- echo -e "\n\n\nAutomatically rebooting your device now to finish the new install."
+ log_running "Reloading udev rules and trigger so correct permissions fire for SDR Dongles"
+ sudo udevadm control --reload-rules && sudo udevadm trigger
+ log_running "Running RN2 Verification Tool..."
+ ${HOME}/raspberry-noaa-v2/scripts/tools/verification_tool/verification.sh quick
sudo reboot
fi
diff --git a/scripts/common.sh b/scripts/common.sh
index 89a7a7484..804758976 100755
--- a/scripts/common.sh
+++ b/scripts/common.sh
@@ -56,6 +56,7 @@ METEOR_M2_4_FREQ="137.9000"
NOAA15_FREQ="137.6200"
NOAA18_FREQ="137.9125"
NOAA19_FREQ="137.1000"
+ELEKTRO_L3_FREQ="1691.0000"
# current date and time
export START_DATE=$(date '+%d-%m-%Y %H:%M')
diff --git a/scripts/image_processors/histogram.sh b/scripts/image_processors/histogram.sh
index a36e37bdf..6963a14f6 100755
--- a/scripts/image_processors/histogram.sh
+++ b/scripts/image_processors/histogram.sh
@@ -28,8 +28,10 @@ input_path=$(dirname "${IN_FILE}")
input_filename="${input_file%.*}"
input_fileext="${input_file##*.}"
+os_release=$(cat /etc/os-release | grep -E "^DEBIAN_CODENAME|^VERSION_CODENAME" | awk -F"=" '{print $NF}' | sort | head -1)
+
#adjust output with os release
-if [ "$(lsb_release -sc)" == "bullseye" ];
+if [[ "${os_release}" == "bullseye" || "${os_release}" == "bookworm" ]];
then
gmic_temp_1="${input_path}/_${input_filename}_c1.${input_fileext}"
else
diff --git a/scripts/image_processors/polar_plot.py b/scripts/image_processors/polar_plot.py
index baa80af81..c4422779f 100755
--- a/scripts/image_processors/polar_plot.py
+++ b/scripts/image_processors/polar_plot.py
@@ -86,7 +86,7 @@ def constructDirectionPlot(pass_start_ms, azimuth_pos, elevation_pos, sat, sat_m
# TODO: calculate and plot AOS/LOS and location and value of max elevation
p.plot(aos_az, aos_el, 'g', marker="P", markersize=12, label="AOS")
p.plot(los_az, los_el, 'r', marker="X", markersize=12, label="LOS")
- p.plot(az_at_max_elev, max_elev, 'o', marker="*", markersize=12, label="Max El")
+ p.plot(az_at_max_elev, max_elev, 'orange', marker="*", markersize=12, label="Max El")
p.text(az_at_max_elev, max_elev-7, '{:.0f}°'.format(max_elev), fontweight="bold")
p.legend(loc="lower left", bbox_to_anchor=(-0.38, -0.14))
@@ -124,7 +124,7 @@ def constructAzElPlot(pass_start_ms, azimuth_pos, elevation_pos, sat, direction,
p.plot(start_az, start_el, 'g', marker="P", markersize=12)
p.plot(end_az, end_el, 'r', marker="X", markersize=12)
- p.plot(az_at_max_elev, max_elev, 'o', marker="*", markersize=12)
+ p.plot(az_at_max_elev, max_elev, 'orange', marker="*", markersize=12)
p.text(az_at_max_elev, max_elev-7, '{:.0f}°'.format(max_elev), fontweight="bold")
# save the file
diff --git a/scripts/receive_meteor.sh b/scripts/receive_meteor.sh
old mode 100755
new mode 100644
index f044c19f3..9d03d23d6
--- a/scripts/receive_meteor.sh
+++ b/scripts/receive_meteor.sh
@@ -68,7 +68,7 @@ case "$RECEIVER_TYPE" in
receiver="mirisdr"
;;
*)
- echo "Invalid RECEIVER_TYPE value: $RECEIVER_TYPE"
+ log "Invalid RECEIVER_TYPE value: $RECEIVER_TYPE" "INFO"
exit 1
;;
esac
@@ -106,11 +106,13 @@ mode="$([[ "${!interleaving}" == "true" ]] && echo "_80k" || echo "")"
if [[ "$receiver" == "rtlsdr" ]]; then
gain_option="--gain"
+ ppm_correction="--ppm_correction"
else
gain_option="--general_gain"
+ FREQ_OFFSET=""
fi
-if [[ "$use_device_string" == "true" ]]; then
+if [[ "$USE_DEVICE_STRING" == "true" ]]; then
sdr_id_option="--source_id"
else
sdr_id_option=""
@@ -169,7 +171,8 @@ polar_direction=0
log "Recording ${NOAA_HOME} via $receiver at ${METEOR_FREQUENCY} MHz using SatDump record " "INFO"
audio_temporary_storage_directory="$(dirname "${RAMFS_FILE_BASE}")"
-$SATDUMP live meteor_m2-x_lrpt${mode} "$audio_temporary_storage_directory" --source $receiver --samplerate $samplerate --frequency "${METEOR_FREQUENCY}e6" $sdr_id_option $SDR_DEVICE_ID $gain_option $GAIN $bias_tee_option $finish_processing --timeout $CAPTURE_TIME >> $NOAA_LOG 2>&1
+log "$SATDUMP live meteor_m2-x_lrpt${mode} $audio_temporary_storage_directory --source $receiver --samplerate $samplerate $ppm_correction ${FREQ_OFFSET} --frequency ${METEOR_FREQUENCY}e6 $sdr_id_option $SDR_DEVICE_ID $gain_option $GAIN $bias_tee_option $finish_processing --fill_missing --timeout $CAPTURE_TIME" "INFO"
+$SATDUMP live meteor_m2-x_lrpt${mode} "$audio_temporary_storage_directory" --source $receiver --samplerate $samplerate $ppm_correction ${FREQ_OFFSET} --frequency "${METEOR_FREQUENCY}e6" $sdr_id_option $SDR_DEVICE_ID $gain_option $GAIN $bias_tee_option $finish_processing --fill_missing --timeout $CAPTURE_TIME >> $NOAA_LOG 2>&1
mv "$audio_temporary_storage_directory/meteor_m2-x_lrpt${mode}.cadu" "${RAMFS_AUDIO_BASE}.cadu"
log "Removing old bmp, gcp, and dat files" "INFO"
@@ -226,13 +229,10 @@ if [[ "$METEOR_DECODER" == "meteordemod" ]]; then
fi
fi
elif [[ "$METEOR_DECODER" == "satdump" ]]; then
- #log "Running SatDump to demodulate OQPSK file, rectify (spread) images, create heat map and composites and convert them to JPG" "INFO"
- #$SATDUMP meteor_m2-x_lrpt${mode} cadu "${RAMFS_AUDIO_BASE}.cadu" . -fill_missing >> $NOAA_LOG 2>&1
-
- find MSU-MR/ -type f ! -name "*projected*" ! -name "*corrected*" -delete
+ find "MSU-MR (Filled)/" -type f ! -name "*projected*" ! -name "*corrected*" -delete
log "Deleting SatDump projected composites which have been generated, but the channels aren't broadcast" "INFO"
- for projected_file in MSU-MR/rgb_msu_mr_rgb_*_projected.png; do
+ for projected_file in MSU-MR\ \(Filled\)/rgb_msu_mr_rgb_*_projected.png; do
# Extract the corresponding corrected.png filename
corrected_file="${projected_file/rgb_msu_mr_rgb_/msu_mr_rgb_}"
corrected_file="${corrected_file/_projected.png/_corrected.png}"
@@ -245,18 +245,17 @@ elif [[ "$METEOR_DECODER" == "satdump" ]]; then
done
log "Removing images without a map if they exist" "INFO"
- for file in MSU-MR/*map.png; do
+ for file in MSU-MR\ \(Filled\)/*map.png; do
mv "$file" "${file/_map.png/.png}"
done
log "Flipping Meteor night passes decoded with SatDump" "INFO"
- for i in MSU-MR/*_corrected.png
- do
+ for i in MSU-MR\ \(Filled\)/*_corrected.png; do
$CONVERT "$i" $FLIP "$i" >> $NOAA_LOG 2>&1
done
# Renaming files, annotating images, and creating thumbnails
- for i in MSU-MR/*.png; do
+ for i in MSU-MR\ \(Filled\)/*.png; do
path="$(pwd)"
image_filename=$(basename "$i")
new_name="$image_filename"
@@ -269,15 +268,16 @@ elif [[ "$METEOR_DECODER" == "satdump" ]]; then
new_name="${new_name#msu_mr_}"
# Rename the file with the new name
- mv "$i" "$path/MSU-MR/$new_name" >> $NOAA_LOG 2>&1
+ mv "$i" "$path/MSU-MR (Filled)/$new_name" >> $NOAA_LOG 2>&1
log "Annotating images and creating thumbnails" "INFO"
- ${IMAGE_PROC_DIR}/meteor_normalize_annotate.sh "$path/MSU-MR/$new_name" "${IMAGE_FILE_BASE}-${new_name%.png}.jpg" $METEOR_IMAGE_QUALITY >> $NOAA_LOG 2>&1
+ ${IMAGE_PROC_DIR}/meteor_normalize_annotate.sh "$path/MSU-MR (Filled)/$new_name" "${IMAGE_FILE_BASE}-${new_name%.png}.jpg" $METEOR_IMAGE_QUALITY >> $NOAA_LOG 2>&1
${IMAGE_PROC_DIR}/thumbnail.sh 300 "${IMAGE_FILE_BASE}-${new_name%.png}.jpg" "${IMAGE_THUMB_BASE}-${new_name%.png}.jpg" >> $NOAA_LOG 2>&1
- rm "$path/MSU-MR/$new_name" >> $NOAA_LOG 2>&1
+ rm "$path/MSU-MR (Filled)/$new_name" >> $NOAA_LOG 2>&1
push_file_list="$push_file_list ${IMAGE_FILE_BASE}-${new_name%.png}.jpg"
done
- rm -r MSU-MR >> $NOAA_LOG 2>&1
+ rm -r "MSU-MR (Filled)" >> $NOAA_LOG 2>&1
+ rm -r "MSU-MR" >> $NOAA_LOG 2>&1
if [ "${CONTRIBUTE_TO_COMMUNITY_COMPOSITES}" == "true" ]; then
log "Contributing images for creating community composites" "INFO"
diff --git a/scripts/receive_noaa.sh b/scripts/receive_noaa.sh
index b94725e14..d75b017a6 100755
--- a/scripts/receive_noaa.sh
+++ b/scripts/receive_noaa.sh
@@ -113,18 +113,20 @@ case "$RECEIVER_TYPE" in
receiver="mirisdr"
;;
*)
- echo "Invalid RECEIVER_TYPE value: $RECEIVER_TYPE"
+ log "Invalid RECEIVER_TYPE value: $RECEIVER_TYPE" "INFO"
exit 1
;;
esac
if [[ "$receiver" == "rtlsdr" ]]; then
gain_option="--gain"
+ ppm_correction="--ppm_correction"
else
gain_option="--general_gain"
+ FREQ_OFFSET=""
fi
-if [[ "$use_device_string" == "true" ]]; then
+if [[ "$USE_DEVICE_STRING" == "true" ]]; then
sdr_id_option="--source_id"
else
sdr_id_option=""
@@ -167,7 +169,8 @@ daylight=$((SUN_ELEV > SUN_MIN_ELEV ? 1 : 0))
#start capture
log "Recording ${NOAA_HOME} via ${RECEIVER_TYPE} at ${freq} MHz via SatDump live pipeline" "INFO"
audio_temporary_storage_directory="$(dirname "${RAMFS_FILE_BASE}")"
-$SATDUMP live noaa_apt $audio_temporary_storage_directory --source $receiver --samplerate $samplerate --frequency "${NOAA_FREQUENCY}e6" --satellite_number ${SAT_NUMBER} --sdrpp_noise_reduction $sdr_id_option $SDR_DEVICE_ID $gain_option $GAIN $bias_tee_option $crop_topbottom --start_timestamp $PASS_START --save_wav $finish_processing --timeout $CAPTURE_TIME >> $NOAA_LOG 2>&1
+log "$SATDUMP live noaa_apt $audio_temporary_storage_directory --source $receiver --samplerate $samplerate $ppm_correction ${FREQ_OFFSET} --frequency "${NOAA_FREQUENCY}e6" --satellite_number ${SAT_NUMBER} --sdrpp_noise_reduction $sdr_id_option $SDR_DEVICE_ID $gain_option $GAIN $bias_tee_option $crop_topbottom --start_timestamp $PASS_START --save_wav $finish_processing --timeout $CAPTURE_TIME" "INFO"
+$SATDUMP live noaa_apt $audio_temporary_storage_directory --source $receiver --samplerate $samplerate $ppm_correction ${FREQ_OFFSET} --frequency "${NOAA_FREQUENCY}e6" --satellite_number ${SAT_NUMBER} --sdrpp_noise_reduction $sdr_id_option $SDR_DEVICE_ID $gain_option $GAIN $bias_tee_option $crop_topbottom --start_timestamp $PASS_START --save_wav $finish_processing --timeout $CAPTURE_TIME >> $NOAA_LOG 2>&1
rm "$audio_temporary_storage_directory/dataset.json" "$audio_temporary_storage_directory/product.cbor" >> $NOAA_LOG 2>&1
log "Files recorded" "INFO"
@@ -196,7 +199,7 @@ if [ "$NOAA_DECODER" == "wxtoimg" ]; then
if [[ "${PRODUCE_NOAA_PRISTINE}" == "true" ]]; then
log "Producing pristine image" "INFO"
pristine=1
- ${IMAGE_PROC_DIR}/noaa_pristine.sh "${RAMFS_AUDIO_BASE}.wav" "${IMAGE_FILE_BASE}-pristine.png" >> $NOAA_LOG 2>&1
+ ${IMAGE_PROC_DIR}/noaa_pristine.sh "${RAMFS_AUDIO_BASE}.wav" "${IMAGE_FILE_BASE}-pristine.png" 2>&1 | grep -Ev "invalid pointer|Aborted" >> $NOAA_LOG
${IMAGE_PROC_DIR}/thumbnail.sh 300 "${IMAGE_FILE_BASE}-pristine.png" "${IMAGE_THUMB_BASE}-pristine.png" >> $NOAA_LOG 2>&1
push_file_list="${push_file_list} ${IMAGE_FILE_BASE}-pristine.png"
fi
@@ -208,7 +211,7 @@ if [ "$NOAA_DECODER" == "wxtoimg" ]; then
histogram_text="${capture_start} @ ${SAT_MAX_ELEVATION}° Gain: ${GAIN}"
log "Generating Data for Histogram" "INFO"
- ${IMAGE_PROC_DIR}/noaa_histogram_data.sh "${RAMFS_AUDIO_BASE}.wav" "${tmp_dir}/${FILENAME_BASE}-a.png" "${tmp_dir}/${FILENAME_BASE}-b.png" >> $NOAA_LOG 2>&1
+ ${IMAGE_PROC_DIR}/noaa_histogram_data.sh "${RAMFS_AUDIO_BASE}.wav" "${tmp_dir}/${FILENAME_BASE}-a.png" "${tmp_dir}/${FILENAME_BASE}-b.png" 2>&1 | grep -Ev "invalid pointer|Aborted" >> $NOAA_LOG
# Define channel names
channels=("a" "b")
@@ -244,7 +247,7 @@ if [ "$NOAA_DECODER" == "wxtoimg" ]; then
[[ "${NOAA_MAP_STATE_BORDER_ENABLE}" == "true" ]] && extra_map_opts+=" -S 1 -c S:${NOAA_MAP_STATE_BORDER_COLOR}" || extra_map_opts+=" -S 0"
map_overlay="${NOAA_HOME}/tmp/map/${FILENAME_BASE}-map.png"
- $WXMAP -T "${SAT_NAME}" -H "${TLE_FILE}" -p 0 ${extra_map_opts} -o "${epoch_adjusted}" "$map_overlay" >> "$NOAA_LOG" 2>&1
+ $WXMAP -T "${SAT_NAME}" -H "${TLE_FILE}" -p 0 ${extra_map_opts} -o "${epoch_adjusted}" "$map_overlay" 2>&1 | grep -Ev "invalid pointer|Aborted" >> "$NOAA_LOG"
if [ "$daylight" -eq 1 ]; then
ENHANCEMENTS="${NOAA_DAY_ENHANCEMENTS}"
@@ -258,14 +261,16 @@ if [ "$NOAA_DECODER" == "wxtoimg" ]; then
export ENHANCEMENT=$enhancement
log "Decoding image" "INFO"
- if [ $enhancement == "avi" ]; then
- ${IMAGE_PROC_DIR}/noaa_avi.sh $map_overlay "${RAMFS_AUDIO_BASE}.wav" >> $NOAA_LOG 2>&1
+ if [ $enhancement == "enhanced-IR" ]; then
+ continue
+ elif [ $enhancement == "avi" ]; then
+ ${IMAGE_PROC_DIR}/noaa_avi.sh $map_overlay "${RAMFS_AUDIO_BASE}.wav" 2>&1 | grep -Ev "invalid pointer|Aborted" >> $NOAA_LOG
else
- ${IMAGE_PROC_DIR}/noaa_enhancements.sh $map_overlay "${RAMFS_AUDIO_BASE}.wav" "${IMAGE_FILE_BASE}-$enhancement.jpg" $enhancement >> $NOAA_LOG 2>&1
+ ${IMAGE_PROC_DIR}/noaa_enhancements.sh $map_overlay "${RAMFS_AUDIO_BASE}.wav" "${IMAGE_FILE_BASE}-$enhancement.jpg" $enhancement 2>&1 | grep -Ev "invalid pointer|Aborted" >> $NOAA_LOG
fi
if [ -f "${IMAGE_FILE_BASE}-$enhancement.jpg" ]; then
- ${IMAGE_PROC_DIR}/noaa_normalize_annotate.sh "${IMAGE_FILE_BASE}-$enhancement.jpg" "${IMAGE_FILE_BASE}-$enhancement.jpg" $NOAA_IMAGE_QUALITY >> $NOAA_LOG 2>&1
+ ${IMAGE_PROC_DIR}/noaa_normalize_annotate.sh "${IMAGE_FILE_BASE}-$enhancement.jpg" "${IMAGE_FILE_BASE}-$enhancement.jpg" $NOAA_IMAGE_QUALITY 2>&1 | grep -Ev "invalid pointer|Aborted" >> $NOAA_LOG
${IMAGE_PROC_DIR}/thumbnail.sh 300 "${IMAGE_FILE_BASE}-$enhancement.jpg" "${IMAGE_THUMB_BASE}-$enhancement.jpg" >> $NOAA_LOG 2>&1
push_file_list="${push_file_list} ${IMAGE_FILE_BASE}-$enhancement.jpg"
fi
diff --git a/scripts/schedule.sh b/scripts/schedule.sh
index a9a593c44..d741bdc1e 100755
--- a/scripts/schedule.sh
+++ b/scripts/schedule.sh
@@ -9,11 +9,21 @@
#
# Example:
# ./schedule.sh -t -x
+#
+#
+# Changes:
+#
+# 09-Jul-2024 - AI4Y
+# Unsetting XTERM varibles during scheduling passes, so that AT jobs are not running as XTERM envionmment which causes NOAA annotations
+# to fail due to : # (wkhtmltoimage:106508): Gtk-WARNING **: 19:48:38.546: cannot open display:
# import common lib and settings
. "$HOME/.noaa-v2.conf"
. "$NOAA_HOME/scripts/common.sh"
+unset `env | egrep "WAYLAND|WAYFIRE|SESSION|TERM|GIO_|DISPLAY|GPG|QT_|SAL|XDG_" | egrep -o '^[^=]+'`
+export XDG_RUNTIME_DIR=/tmp/runtime-${USER};mkdir -p -m 700 $XDG_RUNTIME_DIR
+
# TLE data files
WEATHER_TXT="${NOAA_HOME}/tmp/weather.txt"
AMATEUR_TXT="${NOAA_HOME}/tmp/amateur.txt"
diff --git a/scripts/testing/heatmap.py b/scripts/testing/heatmap.py
index 0178d0de3..8b10ff865 100755
--- a/scripts/testing/heatmap.py
+++ b/scripts/testing/heatmap.py
@@ -461,12 +461,13 @@ def closest_index(n, m_list, interpolate=False):
def word_aa(label, pt, fg_color, bg_color):
f = ImageFont.truetype(vera_path, pt*3)
- s = f.getsize(label)
+ left, top, right, bottom = f.getbbox(label)
+ s = [right - left, bottom - top]
s = (s[0], pt*3 + 3) # getsize lies, manually compute
w_img = Image.new("RGB", s, bg_color)
w_draw = ImageDraw.Draw(w_img)
w_draw.text((0, 0), label, font=f, fill=fg_color)
- return w_img.resize((s[0]//3, s[1]//3), Image.ANTIALIAS)
+ return w_img.resize((s[0]//3, s[1]//3), Image.LANCZOS)
def blend(percent, c1, c2):
"c1 and c2 are RGB tuples"
diff --git a/scripts/tools/db_backup.sh b/scripts/tools/db_backup.sh
index 309ceeae1..e9efe2479 100755
--- a/scripts/tools/db_backup.sh
+++ b/scripts/tools/db_backup.sh
@@ -15,4 +15,4 @@ log "Backing up database..." "INFO"
$SQLITE3 "${NOAA_HOME}/db/panel.db" ".backup '$NOAA_HOME/db_backups/panel.db.$dt.backup'"
log "Pruning database backups older than 3 days..." "INFO"
-find "${NOAA_HOME}/db_backups/" -type f -mtime +3 -name panel.db.*.backup
+find "${NOAA_HOME}/db_backups/" -type f -mtime +3 -name "panel.db.*.backup" -delete
diff --git a/scripts/tools/scratch_perms.sh b/scripts/tools/scratch_perms.sh
new file mode 100644
index 000000000..ada4f813c
--- /dev/null
+++ b/scripts/tools/scratch_perms.sh
@@ -0,0 +1,9 @@
+#!/bin/bash
+
+# scratch_perms.sh
+#
+# Ensure scratch area permissions are correct after reboot
+
+uid=${UID}
+sudo chmod 755 /run/user
+sudo chmod 700 /run/user/${uid}
\ No newline at end of file
diff --git a/scripts/tools/set_os_config_kernel8.sh b/scripts/tools/set_os_config_kernel8.sh
new file mode 100644
index 000000000..42758e33f
--- /dev/null
+++ b/scripts/tools/set_os_config_kernel8.sh
@@ -0,0 +1,27 @@
+#!/bin/bash
+
+# set_os_config_kernel8.sh
+
+###############################################################################################################################
+# The following line is being added to /boot/firmware/config.txt file so that wxtoimg 32-bit app pages will align on 64-bit OS
+#
+# Note -
+# Add --> kernel=kernel8.img if archeticure is aarch64 and the entry does not already exist
+###############################################################################################################################
+
+v_CFG_FILE="/boot/firmware/config.txt"
+v_cmd="/tmp/kernel_add.sh"
+v_kernel8_set=`cat ${v_CFG_FILE} | grep "kernel=kernel8.img" | wc -l`
+
+if [ ${v_kernel8_set} -eq 0 ]; then
+ timestamp=$(date '+%Y-%m-%d_%H-%M-%s')
+ sudo cp -p "${v_CFG_FILE}" "${v_CFG_FILE}.${timestamp}"
+ echo "echo \"kernel=kernel8.img\" >> ${v_CFG_FILE}" > ${v_cmd}
+ chmod +x ${v_cmd}
+ sudo ${v_cmd}
+ echo "...Boot firmware configured"
+ rm ${v_cmd}
+ echo "******* NOTICE ******* A reboot will be required for this change to take effect, so if install_and_upgrade.sh does not reboot server then you will need to"
+else
+ echo "...skipping setup for kernel8 configuration because it is already set..."
+fi
diff --git a/scripts/tools/sun.py b/scripts/tools/sun.py
index 37d842938..e737f23de 100755
--- a/scripts/tools/sun.py
+++ b/scripts/tools/sun.py
@@ -14,7 +14,7 @@
load_envbash(config_file)
# Use subprocess to get the local time offset from UTC
-timezone = int(subprocess.check_output('echo $(date "+%:::z") | sed "s/\\([+-]\\)0\\?/\\1/"', shell=True, text=True))
+timezone = float(subprocess.check_output('echo $(date "+%:::z") | sed "s/\\([+-]\\)0\\?/\\1/" | sed "s/:30/.5/"', shell=True, text=True))
date = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(int(sys.argv[1]) - (timezone * 60 * 60)))
diff --git a/scripts/tools/verification_tool/config/build_permissions_list.sh b/scripts/tools/verification_tool/config/build_permissions_list.sh
new file mode 100644
index 000000000..8e6f69fc4
--- /dev/null
+++ b/scripts/tools/verification_tool/config/build_permissions_list.sh
@@ -0,0 +1,4 @@
+for path in `find $HOME | grep -Ev ".cache|.git|.local|qt5ct|wayfire|.Xauthority|.xsession-errors|.config/wf-panel|.config/gmic|.config/lxpanel|.config/lxterminal|.config/composer|.config/pulse|.log|pipewire-media-session|matplotlib|user-dirs|annotation.html.j2.2|.original|.sudo|AVHRR-|APT-|.rc|/tmp/|.ssh|raw_unsync.png|raw_sync.png|.work|dataset.json|product.cbor|Bookshelf|Desktop|Documents|Downloads|Music|Pictures|Public|Templates|Videos|.linuxmint|thunderbird|.bash|.mozilla|vboxclient|.old"`; do
+ status=$(stat -c "%F %a %U %G %n" $path)
+ echo $status | sed -e 's/^regular //' | sed -e 's/^symbolic link /symbolic /' | sed -e 's/^empty file /file /' | sed -e 's/ richard / $USER /' | sed -e 's/ richard / $USER /' | sed -e 's/richard/$USER/'
+done | sort -k6 > $HOME/raspberry-noaa-v2/scripts/tools/verification_tool/config/permissions.list
diff --git a/scripts/tools/verification_tool/config/package.list b/scripts/tools/verification_tool/config/package.list
new file mode 100644
index 000000000..b094e0509
--- /dev/null
+++ b/scripts/tools/verification_tool/config/package.list
@@ -0,0 +1,55 @@
+airspy
+at
+bc
+build-essential
+certbot
+cmake
+cmake
+curl
+ffmpeg
+gfortran
+git
+gmic
+hackrf
+imagemagick
+jq
+libatlas-base-dev
+libegl-dev
+libgfortran5
+libgles-dev
+libjpeg-dev
+liblapacke-dev
+libncurses5-dev
+libncursesw5-dev
+libopenblas-dev
+libopencv-dev
+libsox-fmt-mp3
+libsqlite3-dev
+libtiff-dev
+libusb-1.0-0
+libusb-1.0-0-dev
+libvolk2-dev
+libxft2
+libxft-dev
+pkg-config
+predict
+python3-dev
+python3-ephem
+python3-idna
+python3-jsonschema
+python3-matplotlib
+python3-numpy
+python3-opencv
+python3-pil
+python3-pip
+python3-requests
+python3-setuptools
+python3-urllib3
+python3-yaml
+satdump
+socat
+sox
+sqlite3
+wkhtmltopdf
+wxtoimg
+zlib1g-dev
diff --git a/scripts/tools/verification_tool/config/package_arm64.list b/scripts/tools/verification_tool/config/package_arm64.list
new file mode 100644
index 000000000..72aef6fe6
--- /dev/null
+++ b/scripts/tools/verification_tool/config/package_arm64.list
@@ -0,0 +1,6 @@
+libc6:armhf
+libstdc++6:armhf
+libasound2:armhf
+libx11-6:armhf
+libxft-dev:armhf
+libxft2:armhf
diff --git a/scripts/tools/verification_tool/config/permissions.list b/scripts/tools/verification_tool/config/permissions.list
new file mode 100644
index 000000000..5de1c41d2
--- /dev/null
+++ b/scripts/tools/verification_tool/config/permissions.list
@@ -0,0 +1,289 @@
+directory 700 $USER $USER /home/$USER/.ansible/tmp
+directory 700 $USER $USER /home/$USER/.config
+directory 755 $USER $USER /home/$USER
+directory 755 $USER $USER /home/$USER/.ansible
+directory 755 $USER $USER /home/$USER/.config/meteordemod
+directory 755 $USER $USER /home/$USER/.config/meteordemod/kernels
+directory 755 $USER $USER /home/$USER/.config/meteordemod/ShapeFiles
+directory 755 $USER $USER /home/$USER/.config/satdump
+directory 755 $USER $USER /home/$USER/.predict
+directory 755 $USER $USER /home/$USER/raspberry-noaa-v2
+directory 755 $USER $USER /home/$USER/raspberry-noaa-v2/ansible
+directory 755 $USER $USER /home/$USER/raspberry-noaa-v2/ansible/group_vars
+directory 755 $USER $USER /home/$USER/raspberry-noaa-v2/ansible/roles
+directory 755 $USER $USER /home/$USER/raspberry-noaa-v2/ansible/roles/common
+directory 755 $USER $USER /home/$USER/raspberry-noaa-v2/ansible/roles/common/files
+directory 755 $USER $USER /home/$USER/raspberry-noaa-v2/ansible/roles/common/handlers
+directory 755 $USER $USER /home/$USER/raspberry-noaa-v2/ansible/roles/common/tasks
+directory 755 $USER $USER /home/$USER/raspberry-noaa-v2/ansible/roles/common/templates
+directory 755 $USER $USER /home/$USER/raspberry-noaa-v2/ansible/roles/webserver
+directory 755 $USER $USER /home/$USER/raspberry-noaa-v2/ansible/roles/webserver/files
+directory 755 $USER $USER /home/$USER/raspberry-noaa-v2/ansible/roles/webserver/handlers
+directory 755 $USER $USER /home/$USER/raspberry-noaa-v2/ansible/roles/webserver/tasks
+directory 755 $USER $USER /home/$USER/raspberry-noaa-v2/ansible/roles/webserver/templates
+directory 755 $USER $USER /home/$USER/raspberry-noaa-v2/assets
+directory 755 $USER $USER /home/$USER/raspberry-noaa-v2/config
+directory 755 $USER $USER /home/$USER/raspberry-noaa-v2/config/annotation
+directory 755 $USER $USER /home/$USER/raspberry-noaa-v2/db_backups
+directory 755 $USER $USER /home/$USER/raspberry-noaa-v2/db_migrations
+directory 755 $USER $USER /home/$USER/raspberry-noaa-v2/docs
+directory 755 $USER $USER /home/$USER/raspberry-noaa-v2/docs/assets
+directory 755 $USER $USER /home/$USER/raspberry-noaa-v2/docs/assets/images
+directory 755 $USER $USER /home/$USER/raspberry-noaa-v2/scripts
+directory 755 $USER $USER /home/$USER/raspberry-noaa-v2/scripts/image_processors
+directory 755 $USER $USER /home/$USER/raspberry-noaa-v2/scripts/prune_scripts
+directory 755 $USER $USER /home/$USER/raspberry-noaa-v2/scripts/push_processors
+directory 755 $USER $USER /home/$USER/raspberry-noaa-v2/scripts/testing
+directory 755 $USER $USER /home/$USER/raspberry-noaa-v2/scripts/tools
+directory 755 $USER $USER /home/$USER/raspberry-noaa-v2/scripts/tools/verification_tool
+directory 755 $USER $USER /home/$USER/raspberry-noaa-v2/scripts/tools/verification_tool/config
+directory 755 $USER $USER /home/$USER/raspberry-noaa-v2/scripts/tools/verification_tool/test_files
+directory 755 $USER $USER /home/$USER/raspberry-noaa-v2/scripts/tools/verification_tool/test_files/tmp
+directory 755 $USER $USER /home/$USER/raspberry-noaa-v2/software
+directory 755 $USER $USER /home/$USER/raspberry-noaa-v2/templates
+directory 755 $USER $USER /home/$USER/raspberry-noaa-v2/tmp
+directory 755 $USER $USER /home/$USER/raspberry-noaa-v2/webpanel
+directory 755 $USER $USER /home/$USER/raspberry-noaa-v2/webpanel/App
+directory 755 $USER $USER /home/$USER/raspberry-noaa-v2/webpanel/App/Controllers
+directory 755 $USER $USER /home/$USER/raspberry-noaa-v2/webpanel/App/Lang
+directory 755 $USER $USER /home/$USER/raspberry-noaa-v2/webpanel/App/Models
+directory 755 $USER $USER /home/$USER/raspberry-noaa-v2/webpanel/App/Views
+directory 755 $USER $USER /home/$USER/raspberry-noaa-v2/webpanel/App/Views/Admin
+directory 755 $USER $USER /home/$USER/raspberry-noaa-v2/webpanel/App/Views/Captures
+directory 755 $USER $USER /home/$USER/raspberry-noaa-v2/webpanel/App/Views/Passes
+directory 755 $USER $USER /home/$USER/raspberry-noaa-v2/webpanel/Lib
+directory 755 $USER $USER /home/$USER/raspberry-noaa-v2/webpanel/public
+directory 755 $USER $USER /home/$USER/raspberry-noaa-v2/webpanel/public/assets
+directory 755 $USER $USER /home/$USER/raspberry-noaa-v2/webpanel/public/assets/css
+directory 755 $USER $USER /home/$USER/raspberry-noaa-v2/webpanel/public/assets/js
+directory 755 $USER $USER /home/$USER/raspberry-noaa-v2/webpanel/public/assets/web_img
+directory 770 $USER $USER /home/$USER/raspberry-noaa-v2/ansible/ramfs_path
+directory 770 $USER www-data /home/$USER/raspberry-noaa-v2/db
+file 600 $USER $USER /home/$USER/raspberry-noaa-v2/config/annotation/annotation.html.j2
+file 644 $USER $USER /home/$USER/.config/meteordemod/kernels/tps.cl
+file 644 $USER $USER /home/$USER/.config/meteordemod/rain.bmp
+file 644 $USER $USER /home/$USER/.config/meteordemod/settings.ini
+file 644 $USER $USER /home/$USER/.config/meteordemod/ShapeFiles/ne_10m_admin_0_countries.dbf
+file 644 $USER $USER /home/$USER/.config/meteordemod/ShapeFiles/ne_10m_admin_0_countries.shp
+file 644 $USER $USER /home/$USER/.config/meteordemod/ShapeFiles/ne_10m_admin_0_countries.shx
+file 644 $USER $USER /home/$USER/.config/meteordemod/ShapeFiles/ne_10m_coastline.shp
+file 644 $USER $USER /home/$USER/.config/meteordemod/ShapeFiles/ne_10m_geography_regions_elevation_points.dbf
+file 644 $USER $USER /home/$USER/.config/meteordemod/ShapeFiles/ne_10m_geography_regions_elevation_points.shp
+file 644 $USER $USER /home/$USER/.config/meteordemod/ShapeFiles/ne_10m_geography_regions_elevation_points.shx
+file 644 $USER $USER /home/$USER/.config/meteordemod/ShapeFiles/ne_110m_graticules_10.dbf
+file 644 $USER $USER /home/$USER/.config/meteordemod/ShapeFiles/ne_110m_graticules_10.shp
+file 644 $USER $USER /home/$USER/.config/meteordemod/ShapeFiles/ne_110m_graticules_10.shx
+file 644 $USER $USER /home/$USER/.config/meteordemod/ShapeFiles/ne_50m_admin_0_boundary_lines_land.dbf
+file 644 $USER $USER /home/$USER/.config/meteordemod/ShapeFiles/ne_50m_admin_0_boundary_lines_land.shp
+file 644 $USER $USER /home/$USER/.config/meteordemod/ShapeFiles/ne_50m_admin_0_boundary_lines_land.shx
+file 644 $USER $USER /home/$USER/.config/meteordemod/ShapeFiles/ne_50m_coastline.dbf
+file 644 $USER $USER /home/$USER/.config/meteordemod/ShapeFiles/ne_50m_coastline.shp
+file 644 $USER $USER /home/$USER/.config/meteordemod/ShapeFiles/ne_50m_coastline.shx
+file 644 $USER $USER /home/$USER/.config/meteordemod/ShapeFiles/ne_50m_lakes.dbf
+file 644 $USER $USER /home/$USER/.config/meteordemod/ShapeFiles/ne_50m_populated_places.dbf
+file 644 $USER $USER /home/$USER/.config/meteordemod/ShapeFiles/ne_50m_populated_places.shp
+file 644 $USER $USER /home/$USER/.config/meteordemod/ShapeFiles/ne_50m_populated_places.shx
+file 644 $USER $USER /home/$USER/.config/meteordemod/ShapeFiles/ne_50m_rivers_lake_centerlines.dbf
+file 644 $USER $USER /home/$USER/.config/meteordemod/thermal_ref2.bmp
+file 644 $USER $USER /home/$USER/.config/meteordemod/thermal_ref.bmp
+file 644 $USER $USER /home/$USER/.config/satdump/satdump_tles.txt
+file 644 $USER $USER /home/$USER/.config/satdump/settings.json
+file 644 $USER $USER /home/$USER/.noaa-v2.conf
+file 644 $USER $USER /home/$USER/.predict/predict.qth
+file 644 $USER $USER /home/$USER/.profile
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/ansible/core.yml
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/ansible/group_vars/all.yml
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/ansible/hosts
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/ansible/roles/common/files/52-airspy.rules
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/ansible/roles/common/files/airspy-blacklist.conf
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/ansible/roles/common/files/annotation.html.j2_file
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/ansible/roles/common/files/blacklist-msi.conf
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/ansible/roles/common/files/disable-wifi-powermgmt.service
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/ansible/roles/common/files/facebook.conf
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/ansible/roles/common/files/instagram.conf
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/ansible/roles/common/files/mastodon.conf
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/ansible/roles/common/files/rtlsdr.conf
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/ansible/roles/common/files/tweepy.conf
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/ansible/roles/common/files/wxtoimglic
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/ansible/roles/common/handlers/main.yml
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/ansible/roles/common/tasks/configs.yml
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/ansible/roles/common/tasks/dependencies.yml
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/ansible/roles/common/tasks/main.yml
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/ansible/roles/common/tasks/ntp.yml
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/ansible/roles/common/tasks/ramfs.yml
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/ansible/roles/common/tasks/sdr.yml
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/ansible/roles/common/tasks/social_media.yml
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/ansible/roles/common/tasks/tools.yml
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/ansible/roles/common/templates/noaa-v2.conf.j2
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/ansible/roles/common/templates/ntp.conf.j2
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/ansible/roles/common/templates/predict.qth.j2
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/ansible/roles/common/templates/satdump_cfg.json.j2
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/ansible/roles/common/templates/settings.ini.j2
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/ansible/roles/webserver/files/020_www-data-atrm-nopasswd
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/ansible/roles/webserver/handlers/main.yml
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/ansible/roles/webserver/tasks/main.yml
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/ansible/roles/webserver/templates/Config.php.j2
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/ansible/roles/webserver/templates/nginx_default_bookworm.j2
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/ansible/roles/webserver/templates/nginx_default_bullseye.j2
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/ansible/roles/webserver/templates/nginx_tls_default_bookworm.j2
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/ansible/roles/webserver/templates/nginx_tls_default_bullseye.j2
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/ansible/site.yml
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/ansible/webserver.yml
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/assets/header_1600_v2.png
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/assets/thermal_gauge.png
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/config/settings_schema.json
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/config/settings.yml
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/db_migrations/00_seed_schema.sql
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/db_migrations/01_add_spectrogram_bool.sql
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/db_migrations/02_add_noaa_pristine_bool.sql
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/db_migrations/03_add_pass_azimuth_direction.sql
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/db_migrations/04_add_capture_gain.sql
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/db_migrations/05_add_pass_azimuth_at_max.sql
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/db_migrations/06_add_polar_az_el_bool.sql
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/db_migrations/07_add_polar_direction_bool.sql
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/db_migrations/08_add_histogram_bool.sql
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/db_migrations/09_add_at_job_id.sql
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/docs/annotation.md
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/docs/assets/images/webpanel-admin.jpg
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/docs/assets/images/webpanel-captures.jpg
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/docs/assets/images/webpanel-pass-list.jpg
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/docs/db_backups.md
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/docs/discord_push.md
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/docs/emailing.md
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/docs/facebook_push.md
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/docs/hardware.md
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/docs/instagram_push.md
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/docs/matrix_push.md
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/docs/meteor.md
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/docs/migrate_from_raspberry_noaa.md
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/docs/pruning.md
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/docs/tls_webserver.md
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/docs/troubleshooting.md
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/docs/twitter_push.md
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/docs/webpanel_screenshots.md
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/LICENSE
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/README.md
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/scripts/testing/Vera.ttf
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/scripts/tools/verification_tool/config/package_arm64.list
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/scripts/tools/verification_tool/config/package.list
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/scripts/tools/verification_tool/config/permissions.list
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/scripts/tools/verification_tool/config/permissions_other.list
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/scripts/tools/verification_tool/test_files/meteordemod-input.cadu
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/scripts/tools/verification_tool/test_files/meteordemod-input.tle
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/scripts/tools/verification_tool/test_files/wxtoimg-input.tle
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/scripts/tools/verification_tool/test_files/wxtoimg-input.wav
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/scripts/tools/verification_tool/test_files/wxtoimg-map-input.png
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/scripts/tools/verification_tool/test_files/wxtoimg-map-output.png
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/scripts/tools/verification_tool/test_files/wxtoimg-mcir-output.jpg
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/software/anydesk_6.3.0-1_amd64.deb
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/software/anydesk_6.3.0-1_armhf.deb
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/software/predict_2.2.3-4-b2_amd64.deb
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/software/predict_2.2.5+dfsg.1-1_arm64.deb
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/software/predict_2.2.5+dfsg.1-1_armhf.deb
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/software/satdump_1.2.1-397f9ed6_bookworm_amd64.deb
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/software/satdump_1.2.1-397f9ed6_bookworm_arm64.deb
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/software/satdump_1.2.1-397f9ed6_bookworm_armhf.deb
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/software/satdump_1.2.1-397f9ed6_bullseye_amd64.deb
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/software/satdump_1.2.1-397f9ed6_bullseye_armhf.deb
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/software/wxtoimg-amd64-2.11.2-beta.deb
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/software/wxtoimg-armhf-2.11.2-beta.deb
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/templates/fstab
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/webpanel/App/Controllers/AdminController.php
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/webpanel/App/Controllers/CapturesController.php
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/webpanel/App/Controllers/PassesController.php
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/webpanel/App/Lang/ar.php
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/webpanel/App/Lang/bg.php
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/webpanel/App/Lang/cn.php
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/webpanel/App/Lang/de.php
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/webpanel/App/Lang/en.php
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/webpanel/App/Lang/es.php
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/webpanel/App/Lang/fr.php
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/webpanel/App/Lang/gr.php
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/webpanel/App/Lang/hu.php
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/webpanel/App/Lang/it.php
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/webpanel/App/Lang/kr.php
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/webpanel/App/Lang/lt.php
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/webpanel/App/Lang/nl.php
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/webpanel/App/Lang/pt.php
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/webpanel/App/Lang/ro.php
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/webpanel/App/Lang/ru.php
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/webpanel/App/Lang/sr.php
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/webpanel/App/Models/Capture.php
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/webpanel/App/Models/Pass.php
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/webpanel/App/Views/Admin/captures.html
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/webpanel/App/Views/Admin/nav.html
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/webpanel/App/Views/Admin/passes.html
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/webpanel/App/Views/base.html
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/webpanel/App/Views/Captures/index.html
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/webpanel/App/Views/Captures/pagination.html
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/webpanel/App/Views/Captures/show.html
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/webpanel/App/Views/Passes/index.html
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/webpanel/composer.json
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/webpanel/composer.lock
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/webpanel/Lib/Controller.php
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/webpanel/Lib/Model.php
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/webpanel/Lib/Router.php
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/webpanel/Lib/View.php
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/webpanel/public/assets/css/admin.css
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/webpanel/public/assets/css/captures.css
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/webpanel/public/assets/css/footer.css
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/webpanel/public/assets/css/header.css
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/webpanel/public/assets/css/pagination.css
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/webpanel/public/assets/css/pass_list.css
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/webpanel/public/assets/js/admin.js
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/webpanel/public/assets/js/tooltips.js
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/webpanel/public/assets/web_img/favicon.ico
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/webpanel/public/enhancement_details.html
+file 644 $USER $USER /home/$USER/raspberry-noaa-v2/webpanel/public/index.php
+file 644 $USER $USER /home/$USER/.wxtoimglic
+file 755 $USER $USER /home/$USER/raspberry-noaa-v2/ansible/roles/common/files/disable-wifi-powermgmt.sh
+file 755 $USER $USER /home/$USER/raspberry-noaa-v2/db_migrations/update_database.sh
+file 755 $USER $USER /home/$USER/raspberry-noaa-v2/docs/assets/images/oversaturated_scan.jpg
+file 755 $USER $USER /home/$USER/raspberry-noaa-v2/docs/assets/images/scan_annotated.jpg
+file 755 $USER $USER /home/$USER/raspberry-noaa-v2/install_and_upgrade.sh
+file 755 $USER $USER /home/$USER/raspberry-noaa-v2/scripts/common.sh
+file 755 $USER $USER /home/$USER/raspberry-noaa-v2/scripts/image_processors/histogram.sh
+file 755 $USER $USER /home/$USER/raspberry-noaa-v2/scripts/image_processors/meteor_normalize_annotate.sh
+file 755 $USER $USER /home/$USER/raspberry-noaa-v2/scripts/image_processors/noaa_avi.sh
+file 755 $USER $USER /home/$USER/raspberry-noaa-v2/scripts/image_processors/noaa_enhancements.sh
+file 755 $USER $USER /home/$USER/raspberry-noaa-v2/scripts/image_processors/noaa_histogram_data.sh
+file 755 $USER $USER /home/$USER/raspberry-noaa-v2/scripts/image_processors/noaa_normalize_annotate.sh
+file 755 $USER $USER /home/$USER/raspberry-noaa-v2/scripts/image_processors/noaa_pristine.sh
+file 755 $USER $USER /home/$USER/raspberry-noaa-v2/scripts/image_processors/polar_plot.py
+file 755 $USER $USER /home/$USER/raspberry-noaa-v2/scripts/image_processors/spectrogram.sh
+file 755 $USER $USER /home/$USER/raspberry-noaa-v2/scripts/image_processors/thumbnail.sh
+file 755 $USER $USER /home/$USER/raspberry-noaa-v2/scripts/push_processors/post_to_twitter.py
+file 755 $USER $USER /home/$USER/raspberry-noaa-v2/scripts/push_processors/push_discord.sh
+file 755 $USER $USER /home/$USER/raspberry-noaa-v2/scripts/push_processors/push_email.sh
+file 755 $USER $USER /home/$USER/raspberry-noaa-v2/scripts/push_processors/push_facebook.py
+file 755 $USER $USER /home/$USER/raspberry-noaa-v2/scripts/push_processors/push_instagram.py
+file 755 $USER $USER /home/$USER/raspberry-noaa-v2/scripts/push_processors/push_mastodon.py
+file 755 $USER $USER /home/$USER/raspberry-noaa-v2/scripts/push_processors/push_matrix.sh
+file 755 $USER $USER /home/$USER/raspberry-noaa-v2/scripts/push_processors/push_pushover.sh
+file 755 $USER $USER /home/$USER/raspberry-noaa-v2/scripts/push_processors/push_slack.sh
+file 755 $USER $USER /home/$USER/raspberry-noaa-v2/scripts/push_processors/push_twitter.sh
+file 755 $USER $USER /home/$USER/raspberry-noaa-v2/scripts/receive_meteor.sh
+file 755 $USER $USER /home/$USER/raspberry-noaa-v2/scripts/receive_noaa.sh
+file 755 $USER $USER /home/$USER/raspberry-noaa-v2/scripts/schedule_captures.sh
+file 755 $USER $USER /home/$USER/raspberry-noaa-v2/scripts/schedule.sh
+file 755 $USER $USER /home/$USER/raspberry-noaa-v2/scripts/select_best_overlapping_passes.py
+file 755 $USER $USER /home/$USER/raspberry-noaa-v2/scripts/testing/generate_waterfall.sh
+file 755 $USER $USER /home/$USER/raspberry-noaa-v2/scripts/testing/heatmap.py
+file 755 $USER $USER /home/$USER/raspberry-noaa-v2/scripts/testing/produce_annotation_image.sh
+file 755 $USER $USER /home/$USER/raspberry-noaa-v2/scripts/testing/scan_for.sh
+file 755 $USER $USER /home/$USER/raspberry-noaa-v2/scripts/testing/start_scanning.sh
+file 755 $USER $USER /home/$USER/raspberry-noaa-v2/scripts/testing/stop_and_finalize_scanning.sh
+file 755 $USER $USER /home/$USER/raspberry-noaa-v2/scripts/testing/t2sec.sh
+file 755 $USER $USER /home/$USER/raspberry-noaa-v2/scripts/testing/test_reception.sh
+file 755 $USER $USER /home/$USER/raspberry-noaa-v2/scripts/tools/atrm_rule_and_removal.sh
+file 755 $USER $USER /home/$USER/raspberry-noaa-v2/scripts/tools/db_backup.sh
+file 755 $USER $USER /home/$USER/raspberry-noaa-v2/scripts/tools/jinja2_to_file.py
+file 755 $USER $USER /home/$USER/raspberry-noaa-v2/scripts/tools/scratch_perms.sh
+file 755 $USER $USER /home/$USER/raspberry-noaa-v2/scripts/tools/set_os_config_kernel8.sh
+file 755 $USER $USER /home/$USER/raspberry-noaa-v2/scripts/tools/sun.py
+file 755 $USER $USER /home/$USER/raspberry-noaa-v2/scripts/tools/validate_yaml.py
+file 755 $USER $USER /home/$USER/raspberry-noaa-v2/scripts/tools/verification_tool/config/build_permissions_list.sh
+file 755 $USER $USER /home/$USER/raspberry-noaa-v2/scripts/tools/verification_tool/verification.sh
+file 755 $USER $USER /home/$USER/raspberry-noaa-v2/software/sdrplay_api_install.sh
+file 755 $USER $USER /home/$USER/raspberry-noaa-v2/support.sh
+file 770 $USER www-data /home/$USER/raspberry-noaa-v2/db/panel.db
\ No newline at end of file
diff --git a/scripts/tools/verification_tool/config/permissions_arm64.list b/scripts/tools/verification_tool/config/permissions_arm64.list
new file mode 100644
index 000000000..5e04f1248
--- /dev/null
+++ b/scripts/tools/verification_tool/config/permissions_arm64.list
@@ -0,0 +1 @@
+symbolic 777 $USER $USER /home/$USER/raspberry-noaa-v2/software/wxtoimg-arm64-2.11.2-beta.deb
diff --git a/scripts/tools/verification_tool/config/permissions_other.list b/scripts/tools/verification_tool/config/permissions_other.list
new file mode 100644
index 000000000..d4b4df3e5
--- /dev/null
+++ b/scripts/tools/verification_tool/config/permissions_other.list
@@ -0,0 +1,17 @@
+directory 755 $USER $USER /home/$USER
+file 644 root root /usr/share/satdump/satdump_cfg.json
+file 644 root root /etc/logrotate.d/raspberry-noaa-v2
+file 644 root root /etc/ntp.conf
+file 644 root root /etc/modprobe.d/rtlsdr.conf
+file 644 root root /etc/modprobe.d/airspy-blacklist.conf
+file 644 root root /etc/modprobe.d/blacklist-msi.conf
+file 644 root root /etc/udev/rules.d/rtl-sdr.rules
+file 644 root root /etc/udev/rules.d/52-airspy.rules
+file 755 root root /usr/local/bin/rtl_sdr
+file 755 root root /usr/local/bin/meteordemod
+directory 755 $USER www-data /srv
+directory 775 $USER www-data /srv/images
+directory 775 $USER www-data /srv/images/thumb
+directory 775 $USER $USER /srv/audio
+directory 775 $USER $USER /srv/audio/meteor
+directory 775 $USER $USER /srv/audio/noaa
diff --git a/scripts/tools/verification_tool/test_files/meteordemod-input.cadu b/scripts/tools/verification_tool/test_files/meteordemod-input.cadu
new file mode 100644
index 000000000..d0664b9a0
Binary files /dev/null and b/scripts/tools/verification_tool/test_files/meteordemod-input.cadu differ
diff --git a/scripts/tools/verification_tool/test_files/meteordemod-input.tle b/scripts/tools/verification_tool/test_files/meteordemod-input.tle
new file mode 100644
index 000000000..2db3be1b0
--- /dev/null
+++ b/scripts/tools/verification_tool/test_files/meteordemod-input.tle
@@ -0,0 +1,18 @@
+NOAA 15
+1 25338U 98030A 24198.83397398 .00000396 00000+0 18184-3 0 9997
+2 25338 98.5672 225.3402 0009328 233.9378 126.0939 14.26629107361665
+NOAA 18
+1 28654U 05018A 24198.80190227 .00000302 00000+0 18460-3 0 9998
+2 28654 98.8739 275.5208 0013699 343.6543 16.4185 14.13254073987443
+NOAA 19
+1 33591U 09005A 24198.82833215 .00000325 00000+0 19836-3 0 9990
+2 33591 99.0455 254.9389 0013472 204.7318 155.3210 14.13048835795811
+METEOR-M 2
+1 40069U 14037A 24198.88587815 .00000251 00000+0 13483-3 0 9997
+2 40069 98.4373 191.7979 0004498 273.7627 86.3037 14.20996427519845
+METEOR-M2 3
+1 57166U 23091A 24198.55826376 .00000052 00000+0 41802-4 0 9991
+2 57166 98.7112 252.9663 0004842 55.7049 304.4587 14.23904732 54809
+METEOR-M2 4
+1 59051U 24039A 24198.89352404 .00000096 00000+0 62507-4 0 9995
+2 59051 98.5991 160.0580 0007944 45.3672 314.8153 14.22239163 19710
diff --git a/scripts/tools/verification_tool/test_files/wxtoimg-input.tle b/scripts/tools/verification_tool/test_files/wxtoimg-input.tle
new file mode 100644
index 000000000..2db3be1b0
--- /dev/null
+++ b/scripts/tools/verification_tool/test_files/wxtoimg-input.tle
@@ -0,0 +1,18 @@
+NOAA 15
+1 25338U 98030A 24198.83397398 .00000396 00000+0 18184-3 0 9997
+2 25338 98.5672 225.3402 0009328 233.9378 126.0939 14.26629107361665
+NOAA 18
+1 28654U 05018A 24198.80190227 .00000302 00000+0 18460-3 0 9998
+2 28654 98.8739 275.5208 0013699 343.6543 16.4185 14.13254073987443
+NOAA 19
+1 33591U 09005A 24198.82833215 .00000325 00000+0 19836-3 0 9990
+2 33591 99.0455 254.9389 0013472 204.7318 155.3210 14.13048835795811
+METEOR-M 2
+1 40069U 14037A 24198.88587815 .00000251 00000+0 13483-3 0 9997
+2 40069 98.4373 191.7979 0004498 273.7627 86.3037 14.20996427519845
+METEOR-M2 3
+1 57166U 23091A 24198.55826376 .00000052 00000+0 41802-4 0 9991
+2 57166 98.7112 252.9663 0004842 55.7049 304.4587 14.23904732 54809
+METEOR-M2 4
+1 59051U 24039A 24198.89352404 .00000096 00000+0 62507-4 0 9995
+2 59051 98.5991 160.0580 0007944 45.3672 314.8153 14.22239163 19710
diff --git a/scripts/tools/verification_tool/test_files/wxtoimg-input.wav b/scripts/tools/verification_tool/test_files/wxtoimg-input.wav
new file mode 100644
index 000000000..8d0d2e745
Binary files /dev/null and b/scripts/tools/verification_tool/test_files/wxtoimg-input.wav differ
diff --git a/scripts/tools/verification_tool/test_files/wxtoimg-map-input.png b/scripts/tools/verification_tool/test_files/wxtoimg-map-input.png
new file mode 100644
index 000000000..3f871cde8
Binary files /dev/null and b/scripts/tools/verification_tool/test_files/wxtoimg-map-input.png differ
diff --git a/scripts/tools/verification_tool/test_files/wxtoimg-map-output.png b/scripts/tools/verification_tool/test_files/wxtoimg-map-output.png
new file mode 100644
index 000000000..c06fc7eb7
Binary files /dev/null and b/scripts/tools/verification_tool/test_files/wxtoimg-map-output.png differ
diff --git a/scripts/tools/verification_tool/test_files/wxtoimg-mcir-output.jpg b/scripts/tools/verification_tool/test_files/wxtoimg-mcir-output.jpg
new file mode 100644
index 000000000..21f453b93
Binary files /dev/null and b/scripts/tools/verification_tool/test_files/wxtoimg-mcir-output.jpg differ
diff --git a/scripts/tools/verification_tool/verification.sh b/scripts/tools/verification_tool/verification.sh
new file mode 100644
index 000000000..d0d7d35bb
--- /dev/null
+++ b/scripts/tools/verification_tool/verification.sh
@@ -0,0 +1,373 @@
+#!/bin/bash
+#
+# Purpose: The purpose of this verification script is to attempt to verify the RN2 environment
+# is installed and configured correctly. It checks permissions, file/directory ownership,
+# group permissions, package dependencies are met, key programs like satdump, meteordemod,
+# wxtoimg and wxmap are linked and execute without error during a dry run.o
+#
+# Author: Richard Creasey (AI4Y)
+#
+# Created: July 15th, 2024
+
+# Input parameters:
+#
+# 1. Input mode [quick|full]
+#
+# Example:
+# ./verification.sh quick
+# ./verification.sh full
+
+# input params
+MODE=$1
+
+echo ""
+if [[ -z ${MODE} ]]; then
+ echo "Argument required: ./verification.sh quick or ./verification.sh full"
+ echo " (~ 1 minute) (~ 5 minutes)"
+ echo ""
+ exit 1
+else
+ vMODE=$(echo ${MODE} | tr '[:lower:]' '[:upper:]')
+ if [[ ${vMODE} != "QUICK" && ${vMODE} != "FULL" ]]; then
+ echo "Argument required: ./verification.sh quick or ./verification.sh full"
+ echo " (~ 1 minute) (~ 5 minutes)"
+ echo ""
+ exit 1
+ fi
+fi
+
+start=$(date +%s)
+
+secs_to_human() {
+ if [[ -z ${1} || ${1} -lt 60 ]] ;then
+ min=0 ; secs="${1}"
+ else
+ time_mins=$(echo "scale=2; ${1}/60" | bc)
+ min=$(echo ${time_mins} | cut -d'.' -f1)
+ secs="0.$(echo ${time_mins} | cut -d'.' -f2)"
+ secs=$(echo ${secs}*60|bc|awk '{print int($1+0.5)}')
+ fi
+ echo "Time Elapsed : ${min} minutes and ${secs} seconds."
+}
+
+LANG=POSIX
+VALIDATION_LOG=/var/log/raspberry-noaa-v2/verification.log
+PERMISSIONS_LIST=/home/$USER/raspberry-noaa-v2/scripts/tools/verification_tool/config/permissions.list
+PERMISSIONS_ARM64_LIST=/home/$USER/raspberry-noaa-v2/scripts/tools/verification_tool/config/permissions_arm64.list
+PERMISSIONS_OTHER_LIST=/home/$USER/raspberry-noaa-v2/scripts/tools/verification_tool/config/permissions_other.list
+PACKAGE_LIST=/home/$USER/raspberry-noaa-v2/scripts/tools/verification_tool/config/package.list
+PACKAGE_ARM64_LIST=/home/$USER/raspberry-noaa-v2/scripts/tools/verification_tool/config/package_arm64.list
+TEST_FILES=$HOME/raspberry-noaa-v2/scripts/tools/verification_tool/test_files
+mkdir -p -m 755 ${TEST_FILES}/tmp
+declare -A levels=([PASS]=1 [FAIL]=2 [INFO]=3)
+log_level=${LOG_LEVEL}
+FAILURES=0
+PASSES=0
+echo "" > $VALIDATION_LOG
+
+TEST_LOG=/tmp/verficiation_test.log
+PIP_LOG=/tmp/pip_installed.log
+ARCH=$(dpkg --print-architecture)
+BIN_SCRIPT=/tmp/verficiation_test.sh
+LDD=$(which ldd)
+
+if [[ ${ARCH} == "arm64" ]]; then
+ LDD=$(which ldd)
+ LDD32=/tmp/ldd32
+ cat ${LDD} | sed -e 's/ld-linux-aarch64.so.1/ld-linux-armhf.so.3/' > ${LDD32}
+ chmod +x ${LDD32}
+fi
+
+# loggit function
+loggit() {
+ local log_type=$1
+ local log_message=$2
+
+ echo "${log_type} : ${log_message}"
+
+ # log output to a log file
+ echo $(date '+%d-%m-%Y %H:%M') "${log_type} : ${log_message}" >> "$VALIDATION_LOG"
+
+}
+
+
+# The function will test and report
+perms() {
+
+ localuser=$USER
+
+ ptype=$1
+ #echo "ptype=${ptype}"
+ if [[ "${ptype}" == "file" ]]; then
+ ptype="regular file"
+ elif [[ "${ptype}" == "symbolic" ]]; then
+ ptype="symbolic link"
+ fi
+
+ rperms=$2
+ owner=$3
+ #echo "owner=${owner}"
+ if [[ "${owner}" == "\$USER" ]]; then
+ #echo "Setting owner, current owner=${owner}, USER=${USER}, localuser=${localuser}"
+ owner=$localuser
+ # echo "owner=${owner}"
+ fi
+
+ group=$4
+ #echo "group=${group}"
+ if [[ "${group}" == "\$USER" ]]; then
+ group=$localuser
+ # echo "group=${group}"
+ fi
+
+ path=$5
+ #echo "path=${path}"
+ if [[ "${path}" == *"\$USER"* ]]; then
+ path=$(echo ${path} | sed -e "s/\$USER/${localuser}/g")
+ # echo "path=${path}"
+ fi
+
+ #echo "-----------------"
+ #echo "ptype=${ptype}"
+ #echo "rperms=${rperms}"
+ #echo "owner=${owner}"
+ #echo "group=${group}"
+ #echo "path=${path}"
+ #echo "-----------------"
+
+ if [[ -e $path ]]; then
+ status=$(stat -c "%F %a %U %G %n" ${path})
+ if [[ "${status}" == "${ptype} ${rperms} ${owner} ${group} ${path}" ]]; then
+ loggit "PASS" "${status}"
+ PASSES=$(expr ${PASSES} + 1)
+ else
+ loggit "FAIL" "****************************************************"
+ loggit "FAIL" "CURRENT ${status}"
+ loggit "FAIL" "DESIRED ${ptype} ${rperms} ${owner} ${group} ${path}"
+ loggit "FAIL" "****************************************************"
+ FAILURES=$(expr ${FAILURES} + 1)
+ fi
+ else
+ loggit "FAIL" "$path does not exist"
+ FAILURES=$(expr ${FAILURES} + 1)
+ fi
+
+
+}
+
+# run as a normal user for any scripts within
+if [ $EUID -eq 0 ]; then
+ log "This script shouldn't be run as root." "ERROR"
+ exit 1
+fi
+
+# There is a chance that this verification script is being executed after a fresh install of OS/RN2, so execute dryrun of satdump to precreate satdump configuration directories/files
+CMD="/usr/bin/satdump live noaa_apt . --source rtlsdr --samplerate 1.024e6 --frequency 137.9125e6 --satellite_number 18 --fill_missing --sdrpp_noise_reduction --gain 49.6 --timeout 1"
+echo ${CMD} > ${BIN_SCRIPT};chmod +x ${BIN_SCRIPT}
+${BIN_SCRIPT} > ${TEST_LOG} 2>&1
+
+loggit "INFO" ""
+loggit "INFO" ""
+loggit "INFO" ""
+loggit "INFO" "************** Starting Validation **************"
+loggit "INFO" ""
+loggit "INFO" "*************************************************"
+loggit "INFO" "*** Checking Ownership and Permissions ***"
+loggit "INFO" "*************************************************"
+
+while IFS= read -r line; do
+ perms ${line}
+done < ${PERMISSIONS_LIST}
+
+if [[ ${ARCH} == "arm64" ]]; then
+ while IFS= read -r line; do
+ perms ${line}
+ done < ${PERMISSIONS_ARM64_LIST}
+fi
+
+while IFS= read -r line; do
+ perms ${line}
+done < ${PERMISSIONS_OTHER_LIST}
+
+loggit "INFO" ""
+loggit "INFO" "*************************************************"
+loggit "INFO" "*** Checking required packages ***"
+loggit "INFO" "*************************************************"
+
+while IFS= read -r line; do
+ package_status=$(dpkg-query -W ${line} | head -1)
+ if [[ "${package_status}" == *"no packages found matching"* ]]; then
+ loggit "FAIL" "${package_status}"
+ FAILURES=$(expr ${FAILURES} + 1)
+ else
+ loggit "PASS" "${package_status}"
+ PASSES=$(expr ${PASSES} + 1)
+ fi
+done < ${PACKAGE_LIST}
+
+if [[ ${ARCH} == "arm64" ]]; then
+ while IFS= read -r line; do
+ package_status=$(dpkg-query -W ${line} | head -1)
+ if [[ "${package_status}" == *"no packages found matching"* ]]; then
+ loggit "FAIL" "${package_status}"
+ FAILURES=$(expr ${FAILURES} + 1)
+ else
+ loggit "PASS" "${package_status}"
+ PASSES=$(expr ${PASSES} + 1)
+ fi
+ done < ${PACKAGE_ARM64_LIST}
+fi
+
+loggit "INFO" ""
+loggit "INFO" "*************************************************"
+loggit "INFO" "*** Checking required PIP packages ***"
+loggit "INFO" "*************************************************"
+
+pip list > ${PIP_LOG}
+for pip_package in envbash facebook pysqlite;
+do
+ v_result=$(cat ${PIP_LOG} | grep ${pip_package});
+ if [[ ${v_result} ]]; then
+ loggit "PASS" "${v_result}"
+ PASSES=$(expr ${PASSES} + 1)
+ else
+ loggit "FAIL" "Python package ${pip_package} is not installed"
+ FAILURES=$(expr ${FAILURES} + 1)
+ fi
+done
+
+loggit "INFO" ""
+loggit "INFO" "*************************************************"
+loggit "INFO" "*** Checking RN2 crontab jobs ***"
+loggit "INFO" "*************************************************"
+
+cronjob1="1 0 * * * ${HOME}/raspberry-noaa-v2/scripts/schedule.sh -t"
+cronjob2="@reboot ${HOME}/raspberry-noaa-v2/scripts/schedule.sh"
+cronjob3="@reboot ${HOME}/raspberry-noaa-v2/scripts/tools/scratch_perms.sh"
+cron1=$(crontab -l | grep -v "^#" | grep -F "${cronjob1}" | wc -l)
+cron2=$(crontab -l | grep -v "^#" | grep -F "${cronjob2}" | wc -l)
+cron3=$(crontab -l | grep -v "^#" | grep -F "${cronjob3}" | wc -l)
+crontotal=`expr ${cron1} + ${cron2} + ${cron3}`
+
+if [[ ${crontotal} -eq 3 ]]; then
+ loggit "PASS" "All RN2 enabled crontab jobs found"
+else
+ loggit "FAIL" "All RN2 enabled crontab jobs NOT found"
+fi
+
+loggit "INFO" ""
+loggit "INFO" "*************************************************"
+loggit "INFO" "*** Perform Dryrun Binary Tests ***"
+loggit "INFO" "*************************************************"
+
+###############################
+# Dryrun Binary Test Commands #
+###############################
+
+NGINX="/usr/sbin/nginx"
+NGINX_CMD="curl -s --head --request GET http://0.0.0.0/passes | grep '200 OK'"
+
+SATDUMP="/usr/bin/satdump"
+SATDUMP_CMD="${SATDUMP} live noaa_apt . --source rtlsdr --samplerate 1.024e6 --frequency 137.9125e6 --satellite_number 18 --fill_missing --sdrpp_noise_reduction --gain 49.6 --timeout 1"
+
+METEORDEMOD="/usr/local/bin/meteordemod"
+METEORDEMOD_QCMD="${METEORDEMOD} -h"
+METEORDEMOD_CMD="${METEORDEMOD} -m oqpsk -diff 1 -s 72000 -sat 'METEOR-M-2-3' -t '${TEST_FILES}/meteordemod-input.tle' -f jpg -i '${TEST_FILES}/meteordemod-input.cadu' -o '${TEST_FILES}/tmp'"
+
+WXMAP="/usr/local/bin/wxmap"
+WXMAP_CMD="${WXMAP} -T 'NOAA 15' -H '${TEST_FILES}/wxtoimg-input.tle' -p 0 -l 1 -c l:0xcc3030 -g 10.0 -c g:0xff0000 -C 1 -c C:0xffff00 -S 1 -c S:0xffff00 -o '1721222580' '${TEST_FILES}/wxtoimg-map-output.png' 2>&1 | grep -Ev 'invalid pointer|Aborted'"
+
+WXTOIMG="/usr/local/bin/wxtoimg"
+WXTOIMG_CMD="${WXTOIMG} -o -m ${TEST_FILES}/wxtoimg-map-input.png -c -I -e MCIR ${TEST_FILES}/wxtoimg-input.wav ${TEST_FILES}/wxtoimg-mcir-output.jpg 2>&1 | grep -Ev 'invalid pointer|Aborted'"
+
+for BIN in ${NGINX} ${SATDUMP} ${WXMAP} ${WXTOIMG} ${METEORDEMOD} ;
+do
+ BINNAME=$(echo ${BIN} | awk -F"/" '{print $NF}' | tr '[:lower:]' '[:upper:]')
+ BINCMD="${BINNAME}_CMD"
+
+ if [[ ${ARCH} == "arm64" && ${BINNAME} == "WXTOIMG" || ${ARCH} == "arm64" && ${BINNAME} == "WXMAP" ]]; then
+ # We are on ARM64 with 32-bit executables, so we must use the modified ldd script to ensure proper results when checking libraries link
+ v_lddresult=$(${LDD32} ${BIN} | grep -i "not found" | wc -l)
+ else
+ v_lddresult=$(${LDD} ${BIN} | grep -i "not found" | wc -l)
+ fi
+
+ if [[ ${v_lddresult} -eq 0 ]]; then
+ loggit "PASS" "${BIN} has all required libraries"
+ PASSES=$(expr ${PASSES} + 1)
+
+ # Perform Dry run execution since all libraries are dynamiclly linked
+ #
+ # Writing test command to a file to call for execution. SATDUMP and METEORDEMOD could be called
+ # directly from varible, but WXMAP and WXTOIMG arguments would not pass correctly
+ echo ${!BINCMD} > ${BIN_SCRIPT};chmod +x ${BIN_SCRIPT}
+ if [[ ${BINNAME} == 'METEORDEMOD' && ${vMODE} == "FULL" ]]; then
+ loggit "INFO" "*** FULL mode choosen *** - Please wait for meteordemod testing to complete... ~ 4 minutes"
+ ${BIN_SCRIPT} >> ${TEST_LOG} 2>&1
+ vResult=$?
+ if (( ${vResult} )); then
+ vError=$(cat ${TEST_LOG} | tail -1)
+ loggit "FAIL" "${BIN} dry run failed: ${vError}"
+ FAILURES=$(expr ${FAILURES} + 1)
+ else
+ loggit "PASS" "${BIN} dry run was successful"
+ PASSES=$(expr ${PASSES} + 1)
+ fi
+ elif [[ ${BINNAME} != 'METEORDEMOD' ]]; then
+ ${BIN_SCRIPT} >> ${TEST_LOG} 2>&1
+ vResult=$?
+ if (( ${vResult} )); then
+ vError=$(cat ${TEST_LOG} | tail -1)
+ loggit "FAIL" "${BIN} dry run failed: ${vError}"
+ FAILURES=$(expr ${FAILURES} + 1)
+ else
+ loggit "PASS" "${BIN} dry run was successful"
+ PASSES=$(expr ${PASSES} + 1)
+ fi
+ elif [[ ${BINNAME} == 'METEORDEMOD' ]]; then
+ BINCMD="${BINNAME}_QCMD"
+ echo ${!BINCMD} > ${BIN_SCRIPT};chmod +x ${BIN_SCRIPT}
+ ${BIN_SCRIPT} >> ${TEST_LOG} 2>&1
+ vResult=$?
+ if (( ${vResult} )); then
+ vError=$(cat ${TEST_LOG} | tail -1)
+ loggit "FAIL" "${BIN} dry run failed: ${vError}"
+ FAILURES=$(expr ${FAILURES} + 1)
+ else
+ loggit "PASS" "${BIN} dry run was successful"
+ PASSES=$(expr ${PASSES} + 1)
+ fi
+ fi
+ else
+ loggit "FAIL" "${BIN} is missing ${v_lddresult} required librarie(s)"
+ FAILURES=$(expr ${FAILURES} + 1)
+ loggit "FAIL" "${BIN} skipping dry run execution due to missing librarie(s)"
+ FAILURES=$(expr ${FAILURES} + 1)
+ fi
+
+done
+
+loggit "INFO" ""
+loggit "INFO" "===================================================="
+loggit "INFO" "Passing tests ${PASSES} Failing tests ${FAILURES}"
+loggit "INFO" "===================================================="
+loggit "INFO" ""
+loggit "INFO" "Log of results --> ${VALIDATION_LOG}"
+loggit "INFO" ""
+loggit "INFO" "************** Ending Validation ****************"
+
+##################################################
+# Clean up temporary files used during execution #
+##################################################
+
+if [[ ${ARCH} == "arm64" ]]; then
+ if [[ -f ${LDD32} ]]; then
+ \rm ${LDD32}
+ fi
+fi
+
+if [[ -f ${BIN_SCRIPT} ]]; then
+ \rm -f ${BIN_SCRIPT} ${PIP_LOG} raw_*.png product.cbor dataset.json APT-*.png ${TEST_FILES}/tmp/*.bmp ${TEST_FILES}/tmp/*.dat 2>/dev/null
+fi
+
+secs_to_human "$(($(date +%s) - ${start}))"
diff --git a/software/predict_2.2.5+dfsg.1-1_arm64.deb b/software/predict_2.2.5+dfsg.1-1_arm64.deb
new file mode 100644
index 000000000..aa8c7f6c9
Binary files /dev/null and b/software/predict_2.2.5+dfsg.1-1_arm64.deb differ
diff --git a/software/satdump_1.2.1-1021e84b_bullseye_amd64.deb b/software/satdump_1.2.1-397f9ed6_bookworm_amd64.deb
similarity index 75%
rename from software/satdump_1.2.1-1021e84b_bullseye_amd64.deb
rename to software/satdump_1.2.1-397f9ed6_bookworm_amd64.deb
index 7d1d17d3f..d14cd13fe 100644
Binary files a/software/satdump_1.2.1-1021e84b_bullseye_amd64.deb and b/software/satdump_1.2.1-397f9ed6_bookworm_amd64.deb differ
diff --git a/software/satdump_1.2.1-397f9ed6_bookworm_arm64.deb b/software/satdump_1.2.1-397f9ed6_bookworm_arm64.deb
new file mode 100644
index 000000000..dd792e2e3
Binary files /dev/null and b/software/satdump_1.2.1-397f9ed6_bookworm_arm64.deb differ
diff --git a/software/satdump_1.2.1-1021e84b_bullseye_armhf.deb b/software/satdump_1.2.1-397f9ed6_bookworm_armhf.deb
similarity index 75%
rename from software/satdump_1.2.1-1021e84b_bullseye_armhf.deb
rename to software/satdump_1.2.1-397f9ed6_bookworm_armhf.deb
index 865d5d49f..8681605c2 100644
Binary files a/software/satdump_1.2.1-1021e84b_bullseye_armhf.deb and b/software/satdump_1.2.1-397f9ed6_bookworm_armhf.deb differ
diff --git a/software/satdump_1.2.1-1021e84b_bookworm_amd64.deb b/software/satdump_1.2.1-397f9ed6_bullseye_amd64.deb
similarity index 75%
rename from software/satdump_1.2.1-1021e84b_bookworm_amd64.deb
rename to software/satdump_1.2.1-397f9ed6_bullseye_amd64.deb
index 9c5f79b05..840bcd093 100644
Binary files a/software/satdump_1.2.1-1021e84b_bookworm_amd64.deb and b/software/satdump_1.2.1-397f9ed6_bullseye_amd64.deb differ
diff --git a/software/satdump_1.2.1-1021e84b_bookworm_armhf.deb b/software/satdump_1.2.1-397f9ed6_bullseye_armhf.deb
similarity index 75%
rename from software/satdump_1.2.1-1021e84b_bookworm_armhf.deb
rename to software/satdump_1.2.1-397f9ed6_bullseye_armhf.deb
index 17995f1cd..d964200e0 100644
Binary files a/software/satdump_1.2.1-1021e84b_bookworm_armhf.deb and b/software/satdump_1.2.1-397f9ed6_bullseye_armhf.deb differ
diff --git a/support.sh b/support.sh
index 640573036..e9f13a4b0 100755
--- a/support.sh
+++ b/support.sh
@@ -16,6 +16,7 @@ RPI_MODEL=$(cat /proc/device-tree/model | tr -d '\0')
DISK_LAYOUT=$(lsblk)
DB_TABLES=$(sqlite3 db/panel.db "SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%';")
+{
echo "============================================="
echo "Details about environment"
echo "============================================="
@@ -82,6 +83,11 @@ while IFS= read -r res; do
echo " $res"
done < <(cat /proc/meminfo | grep Mem)
+echo "---------------------------------------------"
+echo "Git local config:"
+cat ${HOME}/raspberry-noaa-v2/.git/config
+
+
echo "---------------------------------------------"
echo "Git source files changed:"
if [ -z "${GIT_CHANGES}" ]; then
@@ -108,3 +114,13 @@ else
echo ""
done
fi
+
+if [[ -f ${HOME}/raspberry-noaa-v2/scripts/tools/verification_tool/verification.sh ]]; then
+ echo "---------------------------------------------"
+ echo "Execute Verification Tool"
+ ${HOME}/raspberry-noaa-v2/scripts/tools/verification_tool/verification.sh quick
+fi
+
+echo "---------------------------------------------"
+echo "Attach support log --> ${HOME}/raspberry-noaa-v2/support.log"
+} | tee ${HOME}/raspberry-noaa-v2/support.log
diff --git a/webpanel/App/Models/Capture.php b/webpanel/App/Models/Capture.php
index 0a35d5600..192811e32 100644
--- a/webpanel/App/Models/Capture.php
+++ b/webpanel/App/Models/Capture.php
@@ -70,7 +70,8 @@ public function getEnhancements($id) {
switch($pass['sat_type']) {
case 0: // Meteor
if ($pass['daylight_pass'] == 1) {
- $enhancements = [
+ $enhancements = array_map(function($x) { return "-" . $x . ".jpg"; }, explode(' ', Config::METEOR_DAY_ENHANCEMENTS));
+ $additional_enhancements = [
'-MSA_corrected.jpg',
'-MSA_projected.jpg',
'-MCIR_corrected.jpg',
@@ -143,7 +144,8 @@ public function getEnhancements($id) {
'-mercator_rain_68_composite.jpg'
];
} else {
- $enhancements = [
+ $enhancements = array_map(function($x) { return "-" . $x . ".jpg"; }, explode(' ', Config::METEOR_NIGHT_ENHANCEMENTS));
+ $additional_enhancements = [
'-MCIR_corrected.jpg',
'-MCIR_projected.jpg',
'-654_corrected.jpg',
@@ -190,6 +192,7 @@ public function getEnhancements($id) {
'-mercator_rain_68_composite.jpg'
];
}
+ $enhancements = array_merge($enhancements, $additional_enhancements);
break;
case 1: // NOAA
if ($pass['daylight_pass'] == 1) {
diff --git a/webpanel/App/Views/Captures/index.html b/webpanel/App/Views/Captures/index.html
index 4fae3784d..f729e4e9f 100644
--- a/webpanel/App/Views/Captures/index.html
+++ b/webpanel/App/Views/Captures/index.html
@@ -18,25 +18,6 @@
{% set i = 0 %}
{% set img_count = capture.list|length %}
-{% set meteor_suffixes = [
- '-321-corrected.jpg',
- '-equidistant_321.jpg',
- '-mercator_321.jpg',
- '-spread_321.jpg',
- '-spread_123.jpg',
- '-221-corrected.jpg',
- '-equidistant_221.jpg',
- '-mercator_321.jpg',
- '-spread_221.jpg',
- '-equidistant_654.jpg',
- '-mercator_654.jpg',
- '-spread_654.jpg',
- '-Thermal_Channel_corrected.jpg',
- '-spread_rain.jpg',
- '-spread_IR.jpg',
- '-1-122-rectified.jpg'
- ] %}
-
{% for capture in capture.list %}
{% if col_count % 3 == 0 %}
@@ -100,4 +81,7 @@
{{ capture.sat_name }}
{% endif %}
{% endfor %}
+
+