diff --git a/.gitignore b/.gitignore index 6befdb70..5db1458c 100644 --- a/.gitignore +++ b/.gitignore @@ -10,4 +10,5 @@ test.sh test.conf *.FCStd1 **/venv*/* -**/build/ \ No newline at end of file +**/build/ +*.o \ No newline at end of file diff --git a/README.md b/README.md index f50f545a..440ad029 100644 --- a/README.md +++ b/README.md @@ -337,7 +337,7 @@ A gnss receiver with a timepulse output is a very accurate [stratum 0](https://e ``` ## Requirements: Debian base distro >= 11 (Bullseye) -Python >= 3.8 + 3.8 >= Python <= 3.13 ## History: See the [changelog](./CHANGELOG.md) diff --git a/receiver_cfg/Unicore_UM980_rtcm3.cfg b/receiver_cfg/Unicore_UM980_rtcm3.cfg index cf8247c7..0712a7f0 100644 --- a/receiver_cfg/Unicore_UM980_rtcm3.cfg +++ b/receiver_cfg/Unicore_UM980_rtcm3.cfg @@ -1,17 +1,26 @@ # Config file for using a Unicore UM980 with RTKBase (RTCM3) # SIGNALGROUP will reset the device -CONFIG SIGNALGROUP 2 +# CONFIG SIGNALGROUP 2 CONFIG SBAS ENABLE AUTO MODE BASE 1 TIME 60 1 -rtcm1019 1 -rtcm1020 1 -rtcm1042 1 -rtcm1044 1 -rtcm1045 1 -rtcm1046 1 -rtcm1077 1 -rtcm1087 1 -rtcm1097 1 -rtcm1107 1 -rtcm1117 1 -rtcm1127 1 \ No newline at end of file +rtcm1003 com2 1 +rtcm1006 com2 10 +rtcm1011 com2 1 +rtcm1019 com2 1 +rtcm1020 com2 1 +rtcm1033 com2 10 +rtcm1042 com2 1 +rtcm1044 com2 1 +rtcm1045 com2 1 +rtcm1046 com2 1 +rtcm1074 com2 1 +rtcm1077 com2 1 +rtcm1084 com2 1 +rtcm1087 com2 1 +rtcm1094 com2 1 +rtcm1097 com2 1 +rtcm1107 com2 1 +rtcm1117 com2 1 +rtcm1124 com2 1 +rtcm1127 com2 1 +CONFIG PPS ENABLE GPS POSITIVE 500000 1000 0 0*6E \ No newline at end of file diff --git a/settings.conf.default b/settings.conf.default index 99b709c3..1a70e6ca 100644 --- a/settings.conf.default +++ b/settings.conf.default @@ -29,7 +29,7 @@ cpu_temp_offset=0 [main] #base coordinates: lat long height -position='47.0983869 -1.2655108 36.40' +position='47.1983869 -1.1655108 36.40' #gnss receiver com port com_port='' #gnss receiver com port settings diff --git a/tools/install.sh b/tools/install.sh index cf97628a..892712ed 100755 --- a/tools/install.sh +++ b/tools/install.sh @@ -3,7 +3,7 @@ ### RTKBASE INSTALLATION SCRIPT ### declare -a detected_gnss declare RTKBASE_USER -APT_TIMEOUT='-o dpkg::lock::timeout=3000' #Timeout on lock file (Could not get lock /var/lib/dpkg/lock-frontend) +APT_TIMEOUT='-o dpkg::lock::timeout=6000' #Timeout on lock file (Could not get lock /var/lib/dpkg/lock-frontend) MODEM_AT_PORT=/dev/ttymodemAT man_help(){ @@ -104,13 +104,26 @@ _check_user() { } install_dependencies() { + + # Run swap.sh + echo '################################' + echo 'CONFIGURING SWAP' + echo '################################' + "${rtkbase_path}"/tools/swap.sh + echo '################################' echo 'INSTALLING DEPENDENCIES' echo '################################' apt-get "${APT_TIMEOUT}" update -y || exit 1 - apt-get "${APT_TIMEOUT}" install -y git build-essential pps-tools python3-pip python3-venv python3-dev python3-setuptools python3-wheel python3-serial libsystemd-dev bc dos2unix socat zip unzip pkg-config psmisc proj-bin nftables || exit 1 - apt-get install -y libxml2-dev libxslt-dev || exit 1 # needed for lxml (for pystemd) - #apt-get "${APT_TIMEOUT}" upgrade -y + apt-get "${APT_TIMEOUT}" upgrade -y + apt-get "${APT_TIMEOUT}" install -y git build-essential pps-tools python3-pip python3-setuptools python3-wheel python3-serial libsystemd-dev bc dos2unix socat zip unzip pkg-config psmisc proj-bin nftables wget curl lrzsz || exit 1 + apt-get "${APT_TIMEOUT}" install -y libxml2-dev libxslt-dev libc6 || exit 1 # needed for lxml (for pystemd) + apt-get "${APT_TIMEOUT}" install -y wireless-tools wpasupplicant || exit 1 + apt-get "${APT_TIMEOUT}" clean -y + apt-get "${APT_TIMEOUT}" autoclean -y + apt-get "${APT_TIMEOUT}" autoremove -y + python3 --version + } install_gpsd_chrony() { @@ -312,19 +325,27 @@ _add_rtkbase_path_to_environment(){ echo "rtkbase_path=$(pwd)/rtkbase" >> /etc/environment fi fi - rtkbase_path=$(pwd)/rtkbase - export rtkbase_path + + } rtkbase_requirements(){ + platform=$(uname -m) echo '################################' echo 'INSTALLING RTKBASE REQUIREMENTS' - echo '################################' + echo 'Platform:' + echo $platform + echo '################################' + if [[$platform =~ 'riscv64' ]] + then + # install system python pre-built packages + apt-get "${APT_TIMEOUT}" install -y python3.13-venv + apt-get "${APT_TIMEOUT}" install -y python3-lxml python3-pystemd python3-cryptography python3-cffi python3-gevent || exit 1 # create virtual environnement for rtkbase - sudo -u "${RTKBASE_USER}" python3 -m venv "${rtkbase_path}"/venv + sudo -u "${RTKBASE_USER}" python3 -m venv --system-site-packages "${rtkbase_path}"/venv + fi python_venv="${rtkbase_path}"/venv/bin/python - platform=$(uname -m) - if [[ $platform =~ 'aarch64' ]] || [[ $platform =~ 'x86_64' ]] + if [[ $platform =~ 'aarch64' || $platform =~ 'x86_64' || $platform =~ 'riscv64' ]] then # More dependencies needed for aarch64 as there is no prebuilt wheel on piwheels.org apt-get "${APT_TIMEOUT}" install -y libssl-dev libffi-dev || exit 1 @@ -334,6 +355,7 @@ rtkbase_requirements(){ cp "${rtkbase_path}"/tools/udev_rules/*.rules /etc/udev/rules.d/ udevadm control --reload && udevadm trigger # Copying polkitd rules and add rtkbase group + echo '################################ 1' "${rtkbase_path}"/tools/install_polkit_rules.sh "${RTKBASE_USER}" #Copying settings.conf.default as settings.conf if [[ ! -f "${rtkbase_path}/settings.conf" ]] @@ -342,25 +364,16 @@ rtkbase_requirements(){ fi #Then launch check cpu temp script for OPI zero LTS source "${rtkbase_path}/tools/opizero_temp_offset.sh" - #venv module installation - sudo -u "${RTKBASE_USER}" "${python_venv}" -m pip install --upgrade pip setuptools wheel --extra-index-url https://www.piwheels.org/simple - # install prebuilt wheel for cryptography because it is unavailable on piwheels (2023/01) - # not needed anymore (2023/11) - #if [[ $platform == 'armv7l' ]] && [[ $("${python_venv}" --version) =~ '3.7' ]] - # then - # sudo -u "${RTKBASE_USER}" "${python_venv}" -m pip install "${rtkbase_path}"/tools/wheel/cryptography-38.0.0-cp37-cp37m-linux_armv7l.whl - #elif [[ $platform == 'armv6l' ]] && [[ $("${python_venv}" --version) =~ '3.7' ]] - # then - # sudo -u "${RTKBASE_USER}" "${python_venv}" -m pip install "${rtkbase_path}"/tools/wheel/cryptography-38.0.0-cp37-cp37m-linux_armv6l.whl - #fi - sudo -u "${RTKBASE_USER}" "${python_venv}" -m pip install -r "${rtkbase_path}"/web_app/requirements.txt --extra-index-url https://www.piwheels.org/simple - #when we will be able to launch the web server without root, we will use - #sudo -u $(logname) python3 -m pip install -r requirements.txt --user. + if [[$platform =~ 'riscv64' ]] + then + #venv module installation + sudo -u "${RTKBASE_USER}" "${python_venv}" -m pip install --upgrade pip setuptools wheel --extra-index-url https://www.piwheels.org/simple + sudo -u "${RTKBASE_USER}" "${python_venv}" -m pip install -r "${rtkbase_path}"/web_app/requirements.txt --extra-index-url https://www.piwheels.org/simple - #Installing requirements for Cellular modem. Installing them during the Armbian firstrun doesn't work because the network isn't fully up. - sudo -u "${RTKBASE_USER}" "${rtkbase_path}/venv/bin/python" -m pip install nmcli --extra-index-url https://www.piwheels.org/simple - sudo -u "${RTKBASE_USER}" "${rtkbase_path}/venv/bin/python" -m pip install git+https://github.com/Stefal/sim-modem.git - + #Installing requirements for Cellular modem. Installing them during the Armbian firstrun doesn't work because the network isn't fully up. + sudo -u "${RTKBASE_USER}" "${rtkbase_path}/venv/bin/python" -m pip install nmcli --extra-index-url https://www.piwheels.org/simple + sudo -u "${RTKBASE_USER}" "${rtkbase_path}/venv/bin/python" -m pip install git+https://github.com/Stefal/sim-modem.git + if } install_unit_files() { @@ -382,6 +395,7 @@ install_unit_files() { } detect_gnss() { + python_venv="${rtkbase_path}"/venv/bin/python echo '################################' echo 'USB GNSS RECEIVER DETECTION' echo '################################' @@ -425,16 +439,16 @@ detect_gnss() { echo '################################' systemctl is-active --quiet str2str_tcp.service && sudo systemctl stop str2str_tcp.service && echo 'Stopping str2str_tcp service' # TODO remove port if not available in /dev/ - for port in ttyS0 ttyUSB0 ttyUSB1 ttyUSB2 serial0 ttyS1 ttyS2 ttyS3 ttyS4 ttyS5; do + for port in ttyUSB0 ttyUSB1 ttyUSB2 serial0 ttyS0 ttyS1 ttyS2 ttyS3 ttyS4 ttyS5; do for port_speed in 115200 57600 38400 19200 9600; do echo 'DETECTION ON ' $port ' at ' $port_speed - if [[ $(python3 "${rtkbase_path}"/tools/ubxtool -f /dev/$port -s $port_speed -p MON-VER -w 5 2>/dev/null) =~ 'ZED-F9P' ]]; then + if [[ $(sudo -u "${RTKBASE_USER}" "${python_venv}" "${rtkbase_path}"/tools/ubxtool -f /dev/$port -s $port_speed -p MON-VER -w 5 2>/dev/null) =~ 'ZED-F9P' ]]; then detected_gnss[0]=$port detected_gnss[1]='u-blox' detected_gnss[2]=$port_speed #echo 'U-blox ZED-F9P DETECTED ON '$port $port_speed break - elif { model=$(python3 "${rtkbase_path}"/tools/unicore_tool.py --port /dev/$port --baudrate $port_speed --command get_model 2>/dev/null) ; [[ "${model}" == 'UM98'[0-2] ]] ;}; then + elif { model=$(sudo -u "${RTKBASE_USER}" "${python_venv}" "${rtkbase_path}"/tools/unicore_tool.py --port /dev/$port --baudrate $port_speed --retry 2 --command get_model 2>/dev/null) ; [[ "${model}" == 'UM98'[0-2] ]] ;}; then detected_gnss[0]=$port detected_gnss[1]='unicore' detected_gnss[2]=$port_speed @@ -455,16 +469,16 @@ detect_gnss() { if [[ "${detected_gnss[1]}" =~ 'u-blox' ]] then #get F9P firmware release - detected_gnss[3]=$(python3 "${rtkbase_path}"/tools/ubxtool -f /dev/"${detected_gnss[0]}" -s ${detected_gnss[2]} -p MON-VER | grep 'FWVER' | awk '{print $NF}') + detected_gnss[3]=$(sudo -u "${RTKBASE_USER}" "${python_venv}" "${rtkbase_path}"/tools/ubxtool -f /dev/"${detected_gnss[0]}" -s ${detected_gnss[2]} -p MON-VER | grep 'FWVER' | awk '{print $NF}') sudo -u "${RTKBASE_USER}" sed -i s/^receiver_firmware=.*/receiver_firmware=\'${firmware}\'/ "${rtkbase_path}"/settings.conf elif [[ "${detected_gnss[1]}" =~ 'Septentrio' ]] then #get mosaic-X5 firmware release - detected_gnss[3]="$(python3 "${rtkbase_path}"/tools/sept_tool.py --port /dev/ttyGNSS_CTRL --baudrate ${detected_gnss[2]} --command get_firmware --retry 5)" || firmware='?' + detected_gnss[3]="$(sudo -u "${RTKBASE_USER}" "${python_venv}" "${rtkbase_path}"/tools/sept_tool.py --port /dev/ttyGNSS_CTRL --baudrate ${detected_gnss[2]} --command get_firmware --retry 5)" || firmware='?' elif [[ "${detected_gnss[1]}" =~ 'unicore' ]] then #get Unicore UM98X firmware release - detected_gnss[3]="$(python3 "${rtkbase_path}"/tools/unicore_tool.py --port /dev/"${detected_gnss[0]}" --baudrate ${detected_gnss[2]} --command get_firmware 2>/dev/null)" || firmware='?' + detected_gnss[3]="$(sudo -u "${RTKBASE_USER}" "${python_venv}" "${rtkbase_path}"/tools/unicore_tool.py --port /dev/"${detected_gnss[0]}" --baudrate ${detected_gnss[2]} --command get_firmware 2>/dev/null)" || firmware='?' fi # "send" result echo '/dev/'"${detected_gnss[0]}" ' - ' "${detected_gnss[1]}"' - ' "${detected_gnss[2]}"' - ' "${detected_gnss[3]}" @@ -507,6 +521,7 @@ _get_device_path() { } configure_gnss(){ + python_venv="${rtkbase_path}"/venv/bin/python echo '################################' echo 'CONFIGURE GNSS RECEIVER' echo '################################' @@ -515,10 +530,10 @@ configure_gnss(){ source <( grep -v '^#' "${rtkbase_path}"/settings.conf | grep '=' ) systemctl is-active --quiet str2str_tcp.service && sudo systemctl stop str2str_tcp.service #if the receiver is a U-Blox F9P, launch the set_zed-f9p.sh. This script will reset the F9P and configure it with the corrects settings for rtkbase - if [[ $(python3 "${rtkbase_path}"/tools/ubxtool -f /dev/"${com_port}" -s ${com_port_settings%%:*} -p MON-VER) =~ 'ZED-F9P' ]] + if [[ $(sudo -u "${RTKBASE_USER}" "${python_venv}" "${rtkbase_path}"/tools/ubxtool -f /dev/"${com_port}" -s ${com_port_settings%%:*} -p MON-VER) =~ 'ZED-F9P' ]] then #get F9P firmware release - firmware=$(python3 "${rtkbase_path}"/tools/ubxtool -f /dev/"${com_port}" -s ${com_port_settings%%:*} -p MON-VER | grep 'FWVER' | awk '{print $NF}') + firmware=$(sudo -u "${RTKBASE_USER}" "${python_venv}" "${rtkbase_path}"/tools/ubxtool -f /dev/"${com_port}" -s ${com_port_settings%%:*} -p MON-VER | grep 'FWVER' | awk '{print $NF}') echo 'F9P Firmware: ' "${firmware}" sudo -u "${RTKBASE_USER}" sed -i s/^receiver_firmware=.*/receiver_firmware=\'${firmware}\'/ "${rtkbase_path}"/settings.conf #configure the F9P for RTKBase @@ -541,18 +556,18 @@ configure_gnss(){ sudo -u "${RTKBASE_USER}" sed -i -r '/^rtcm_/s/1107(\([0-9]+\))?,//' "${rtkbase_path}"/settings.conf && \ return $? - elif [[ $(python3 "${rtkbase_path}"/tools/sept_tool.py --port /dev/ttyGNSS_CTRL --baudrate ${com_port_settings%%:*} --command get_model) =~ 'mosaic-X5' ]] + elif [[ $(sudo -u "${RTKBASE_USER}" "${python_venv}" "${rtkbase_path}"/tools/sept_tool.py --port /dev/ttyGNSS_CTRL --baudrate ${com_port_settings%%:*} --command get_model) =~ 'mosaic-X5' ]] then #get mosaic-X5 firmware release - firmware="$(python3 "${rtkbase_path}"/tools/sept_tool.py --port /dev/ttyGNSS_CTRL --baudrate ${com_port_settings%%:*} --command get_firmware --retry 5)" || firmware='?' + firmware="$(sudo -u "${RTKBASE_USER}" "${python_venv}" "${rtkbase_path}"/tools/sept_tool.py --port /dev/ttyGNSS_CTRL --baudrate ${com_port_settings%%:*} --command get_firmware --retry 5)" || firmware='?' echo 'Mosaic-X5 Firmware: ' "${firmware}" sudo -u "${RTKBASE_USER}" sed -i s/^receiver_firmware=.*/receiver_firmware=\'${firmware}\'/ "${rtkbase_path}"/settings.conf #configure the mosaic-X5 for RTKBase echo 'Resetting the mosaic-X5 settings....' - python3 "${rtkbase_path}"/tools/sept_tool.py --port /dev/ttyGNSS_CTRL --baudrate ${com_port_settings%%:*} --command reset --retry 5 + sudo -u "${RTKBASE_USER}" "${python_venv}" "${rtkbase_path}"/tools/sept_tool.py --port /dev/ttyGNSS_CTRL --baudrate ${com_port_settings%%:*} --command reset --retry 5 sleep_time=30 ; echo 'Waiting '$sleep_time's for mosaic-X5 reboot' ; sleep $sleep_time echo 'Sending settings....' - python3 "${rtkbase_path}"/tools/sept_tool.py --port /dev/ttyGNSS_CTRL --baudrate ${com_port_settings%%:*} --command send_config_file "${rtkbase_path}"/receiver_cfg/Septentrio_Mosaic-X5.cfg --store --retry 5 + sudo -u "${RTKBASE_USER}" "${python_venv}" "${rtkbase_path}"/tools/sept_tool.py --port /dev/ttyGNSS_CTRL --baudrate ${com_port_settings%%:*} --command send_config_file "${rtkbase_path}"/receiver_cfg/Septentrio_Mosaic-X5.cfg --store --retry 5 if [[ $? -eq 0 ]] then echo 'Septentrio Mosaic-X5 successfuly configured' @@ -568,18 +583,18 @@ configure_gnss(){ return $? fi - elif { model=$(python3 "${rtkbase_path}"/tools/unicore_tool.py --port /dev/${com_port} --baudrate ${com_port_settings%%:*} --command get_model 2>/dev/null) ; [[ "${model}" == 'UM98'[0-2] ]] ;} + elif { model=$(sudo -u "${RTKBASE_USER}" "${python_venv}" "${rtkbase_path}"/tools/unicore_tool.py --port /dev/${com_port} --baudrate ${com_port_settings%%:*} --retry 2 --command get_model 2>/dev/null) ; [[ "${model}" == 'UM98'[0-2] ]] ;} then #get UM98x firmware release - firmware="$(python3 "${rtkbase_path}"/tools/unicore_tool.py --port /dev/${com_port} --baudrate ${com_port_settings%%:*} --command get_firmware 2>/dev/null)" || firmware='?' + firmware="$(sudo -u "${RTKBASE_USER}" "${python_venv}" "${rtkbase_path}"/tools/unicore_tool.py --port /dev/${com_port} --baudrate ${com_port_settings%%:*} --retry 2 --command get_firmware 2>/dev/null)" || firmware='?' echo 'Unicore-' "${model}" 'Firmware: ' "${firmware}" sudo -u "${RTKBASE_USER}" sed -i s/^receiver_firmware=.*/receiver_firmware=\'${firmware}\'/ "${rtkbase_path}"/settings.conf #configure the UM980/UM982 for RTKBase echo 'Resetting the ' "${model}" ' settings....' - python3 "${rtkbase_path}"/tools/unicore_tool.py --port /dev/${com_port} --baudrate ${com_port_settings%%:*} --command reset --retry 5 + sudo -u "${RTKBASE_USER}" "${python_venv}" "${rtkbase_path}"/tools/unicore_tool.py --port /dev/${com_port} --baudrate ${com_port_settings%%:*} --command reset --retry 5 sleep_time=10 ; echo 'Waiting '$sleep_time's for ' "${model}" ' reboot' ; sleep $sleep_time echo 'Sending settings....' - python3 "${rtkbase_path}"/tools/unicore_tool.py --port /dev/${com_port} --baudrate ${com_port_settings%%:*} --command send_config_file "${rtkbase_path}"/receiver_cfg/Unicore_"${model}"_rtcm3.cfg --store --retry 2 + sudo -u "${RTKBASE_USER}" "${python_venv}" "${rtkbase_path}"/tools/unicore_tool.py --port /dev/${com_port} --baudrate ${com_port_settings%%:*} --command send_config_file "${rtkbase_path}"/receiver_cfg/Unicore_"${model}"_rtcm3.cfg --store --retry 2 if [[ $? -eq 0 ]] then echo 'Unicore UM980 successfuly configured' @@ -735,6 +750,7 @@ main() { ARG_DETECT_MODEM=0 ARG_START_SERVICES=0 ARG_ZEROCONF=0 + ARG_PIN_MUX=0 ARG_ALL=0 PARSED_ARGUMENTS=$(getopt --name install --options hu:drbi:jf:qtgencmsza: --longoptions help,user:,dependencies,rtklib,rtkbase-release,rtkbase-repo:,rtkbase-bundled,rtkbase-custom:,rtkbase-requirements,unit-files,gpsd-chrony,detect-gnss,no-write-port,configure-gnss,detect-modem,start-services,zeroconf,all: -- "$@") diff --git a/unit/rtkbase_web.service b/unit/rtkbase_web.service index 09f0c6ac..27816277 100644 --- a/unit/rtkbase_web.service +++ b/unit/rtkbase_web.service @@ -5,12 +5,21 @@ Description=RTKBase Web Server [Service] User=root -ExecStart={python_path} {script_path}/web_app/server.py +WorkingDirectory=/home/debian +Environment="PATH=/usr/local/bin:/usr/bin:/bin" +Environment="HOME=/home/debian" +Environment="LOGNAME=debian" +#StandardOutput=append:/var/log/rtkbase_web.log + +# Run the install.sh command before starting the main service +ExecStartPre=/home/debian/rtkbase_riscv/tools/install.sh -u debian --pin-mux + +ExecStart=/home/debian/rtkbase_riscv/venv/bin/python /home/debian/rtkbase_riscv/web_app/server.py Restart=on-failure RestartSec=30 #ProtectHome=read-only #ProtectSystem=strict -#ReadWritePaths={script_path} /var/tmp /usr/local/bin +#ReadWritePaths=/home/debian/rtkbase_riscv /var/tmp /usr/local/bin [Install] WantedBy=multi-user.target diff --git a/web_app/network_infos.py b/web_app/network_infos.py index c2840da8..fce09f57 100644 --- a/web_app/network_infos.py +++ b/web_app/network_infos.py @@ -44,7 +44,7 @@ def get_up_if(): if_stats.pop('lo') log.debug(if_stats) if_stats = {k:v for (k,v) in if_stats.items() if if_stats[k].isup} # keep only up interface - if_stats = {k:v for (k,v) in if_stats.items() if if_stats[k].speed > 0 or 'pointopoint' in if_stats[k].flags} # keep only interface with speed > 0 + #if_stats = {k:v for (k,v) in if_stats.items() if if_stats[k].speed > 0 or 'pointopoint' in if_stats[k].flags} # keep only interface with speed > 0 if_stats = {k:v for (k,v) in if_stats.items() if not k.startswith('docker')} # remove docker interface return if_stats diff --git a/web_app/requirements.txt b/web_app/requirements.txt index ac559b3d..20129dbf 100644 --- a/web_app/requirements.txt +++ b/web_app/requirements.txt @@ -2,32 +2,26 @@ bidict==0.22.1 blinker==1.6.3 Bootstrap-Flask==2.4.0 certifi==2024.2.2 -cffi==1.16.0 charset-normalizer==3.3.2 click==8.1.7 -cryptography==42.0.7 distro==1.8.0 dnspython==2.6.1 Flask==3.0.3 Flask-Login==0.6.3 Flask-SocketIO==5.3.6 Flask-WTF==1.2.1 -gevent==24.2.1 gunicorn==22.0.0 h11==0.14.0 idna==3.7 itsdangerous==2.1.2 Jinja2==3.1.4 -lxml==4.9.3 MarkupSafe==2.1.3 nmcli==1.3.0 pexpect==4.8.0 psutil==5.9.6 ptyprocess==0.7.0 pycparser==2.21 -pyOpenSSL==24.1.0 pyserial==3.5 -pystemd==0.13.2 python-engineio==4.8.0 python-socketio==5.10.0 requests==2.32.3 diff --git a/web_app/server.py b/web_app/server.py index 74b6b2a1..8e613690 100755 --- a/web_app/server.py +++ b/web_app/server.py @@ -29,7 +29,7 @@ # along with ReachView. If not, see . from gevent import monkey -monkey.patch_all() +#monkey.patch_all() import time import json @@ -47,12 +47,6 @@ from RTKBaseConfigManager import RTKBaseConfigManager import network_infos -#print("Installing all required packages") -#provisioner.provision_reach() - -#import reach_bluetooth.bluetoothctl -#import reach_bluetooth.tcp_bridge - from flask_bootstrap import Bootstrap4 from flask import Flask, render_template, session, request, flash, url_for from flask import send_from_directory, redirect, abort @@ -73,6 +67,10 @@ from werkzeug.utils import safe_join import gunicorn.app.base +#Delay before rtkrcv will stop if no user is on status.html page +rtkcv_standby_delay = 600 +connected_clients = 0 + app = Flask(__name__) app.debug = False app.config["SECRET_KEY"] = "secret!" @@ -111,10 +109,6 @@ {'service_unit' : 'rtkbase_gnss_web_proxy.service', "name": "RTKBase Reverse Proxy for Gnss receiver Web Server"} ] -#Delay before rtkrcv will stop if no user is on status.html page -rtkcv_standby_delay = 600 -connected_clients = 0 - class StandaloneApplication(gunicorn.app.base.BaseApplication): def __init__(self, app, options=None): self.options = options or {} @@ -158,46 +152,58 @@ def update_password(config_object): config_object.update_setting("general", "web_password_hash", generate_password_hash(new_password)) config_object.update_setting("general", "new_web_password", "") + +def update_sys_informations(): + + if not hasattr(update_sys_informations, "max_cpu_temp"): + update_sys_informations.max_cpu_temp = 0 # it doesn't exist yet, so initialize it + + cpu_temp_offset = int(rtkbaseconfig.get("general", "cpu_temp_offset")) + + cpu_temp = get_cpu_temp() + cpu_temp_offset + update_sys_informations.max_cpu_temp = max(cpu_temp, update_sys_informations.max_cpu_temp) + + try: + interfaces_infos = network_infos.get_interfaces_infos() + except Exception: + # network-manager not installed ? + interfaces_infos = None + + volume_usage = get_volume_usage() + sys_infos = {"cpu_temp" : cpu_temp, + "max_cpu_temp" : update_sys_informations.max_cpu_temp, + "uptime" : get_uptime(), + "volume_free" : round(volume_usage.free / 10E8, 2), + "volume_used" : round(volume_usage.used / 10E8, 2), + "volume_total" : round(volume_usage.total / 10E8, 2), + "volume_percent_used" : volume_usage.percent, + "network_infos" : interfaces_infos} + + return sys_infos + def manager(): """ This manager runs inside a separate thread It checks how long rtkrcv is running since the last user leaves the status web page, and stop rtkrcv when sleep_count reaches rtkrcv_standby delay And it sends various system informations to the web interface """ - max_cpu_temp = 0 - cpu_temp_offset = int(rtkbaseconfig.get("general", "cpu_temp_offset")) services_status = getServicesStatus(emit_pingback=False) main_service = {} while True: - # Make sure max_cpu_temp is always updated - cpu_temp = get_cpu_temp() + cpu_temp_offset - max_cpu_temp = max(cpu_temp, max_cpu_temp) if connected_clients > 0: + # We only need to emit to the socket if there are clients able to receive it. updated_services_status = getServicesStatus(emit_pingback=False) main_service = updated_services_status[0] if services_status != updated_services_status: services_status = updated_services_status socketio.emit("services status", json.dumps(services_status), namespace="/test") - #print("service status", services_status) - - try: - interfaces_infos = network_infos.get_interfaces_infos() - except Exception: - # network-manager not installed ? - interfaces_infos = None - - volume_usage = get_volume_usage() - sys_infos = {"cpu_temp" : cpu_temp, - "max_cpu_temp" : max_cpu_temp, - "uptime" : get_uptime(), - "volume_free" : round(volume_usage.free / 10E8, 2), - "volume_used" : round(volume_usage.used / 10E8, 2), - "volume_total" : round(volume_usage.total / 10E8, 2), - "volume_percent_used" : volume_usage.percent, - "network_infos" : interfaces_infos} - socketio.emit("sys_informations", json.dumps(sys_infos), namespace="/test") + print("service status", services_status) + + # Make sure max_cpu_temp is always updated + sys_infos = update_sys_informations() + socketio.emit("sys_informations", json.dumps(sys_infos), namespace="/test") if rtk.sleep_count > rtkcv_standby_delay and rtk.state != "inactive" or \ main_service.get("active") == False and rtk.state != "inactive": @@ -245,7 +251,7 @@ def old_get_cpu_temp(): def get_cpu_temp(): try: temps = psutil.sensors_temperatures() - current_cpu_temp = round(temps.get('cpu_thermal')[0].current, 1) + current_cpu_temp = round(temps.get('soc_thermal_0')[0].current, 1) except: current_cpu_temp = 0 return current_cpu_temp @@ -556,11 +562,13 @@ def clientConnect(): rtkbaseconfig.write_file() socketio.emit("update_successful", json.dumps({"result": 'true'}), namespace="/test") rtk.sendState() + sys_infos = update_sys_informations() + socketio.emit("sys_informations", json.dumps(sys_infos), namespace="/test") @socketio.on("disconnect", namespace="/test") def clientDisconnect(): global connected_clients - connected_clients -=1 + connected_clients -= 1 print("Browser client disconnected") #### Log list handling ### @@ -627,9 +635,11 @@ def deleteLog(json_msg): @socketio.on("detect_receiver", namespace="/test") def detect_receiver(json_msg): - print("Detecting gnss receiver") + #print("Detecting gnss receiver") #print("DEBUG json_msg: ", json_msg) + #print([os.path.join(rtkbase_path, "tools", "install.sh"), "--user", rtkbaseconfig.get("general", "user"), "--detect-gnss", "--no-write-port"]) answer = subprocess.run([os.path.join(rtkbase_path, "tools", "install.sh"), "--user", rtkbaseconfig.get("general", "user"), "--detect-gnss", "--no-write-port"], encoding="UTF-8", stderr=subprocess.PIPE, stdout=subprocess.PIPE, check=False) + #print(answer) if answer.returncode == 0 and "/dev/" in answer.stdout: #print("DEBUG ok stdout: ", answer.stdout) try: @@ -665,13 +675,15 @@ def configure_receiver(brand="", model=""): # configure the receiver. We wait a few seconds before stopping it to remove conflicting calls. time.sleep(4) main_service = services_list[0] + #print(main_service) if main_service.get("active") is True: main_service["unit"].stop() restart_main = True else: restart_main = False - print("configuring {} gnss receiver model {}".format(brand, model)) + #print("configuring {} gnss receiver model {}".format(brand, model)) + #print([os.path.join(rtkbase_path, "tools", "install.sh"), "--user", rtkbaseconfig.get("general", "user"), "--configure-gnss"]) answer = subprocess.run([os.path.join(rtkbase_path, "tools", "install.sh"), "--user", rtkbaseconfig.get("general", "user"), "--configure-gnss"], encoding="UTF-8", stderr=subprocess.PIPE, stdout=subprocess.PIPE, check=False) #print("DEBUG - stdout: ", answer.stdout) #print("DEBUG - returncode: ", answer.returncode)