2026-09-26 13:57:33 +08:00
#!/bin/bash
set -euo pipefail
cd " $( dirname " $0 " ) "
2026-09-27 20:24:34 +08:00
NO_START = 0
2026-09-27 22:28:03 +08:00
API_ENABLED = ""
2026-09-27 10:29:01 +08:00
for arg in " $@ " ; do
case " $arg " in
2026-09-27 22:28:03 +08:00
--enable-api) API_ENABLED = true ;;
--disable-api) API_ENABLED = false ;;
2026-09-27 20:24:34 +08:00
--no-start) NO_START = 1 ;;
2026-09-27 22:28:03 +08:00
-h| --help) echo 'Usage: sudo ./install.sh [--no-start] [--enable-api|--disable-api]' ; exit 0 ;;
2026-09-27 20:24:34 +08:00
*) echo "ERROR: unknown option: $arg (hardware is installed separately)" >& 2; exit 2 ;;
2026-09-27 10:29:01 +08:00
esac
done
2026-09-27 22:28:03 +08:00
for required in app/pigway_pi_control.py app/plugin_api.py app/pigway_pi_control_api.py config/pigway-pi-control.conf systemd/pigway-pi-control.service systemd/pigway-pi-control-api.service; do
2026-09-27 20:24:34 +08:00
[ -f " $required " ] || { echo "ERROR: required file missing: $required " >& 2; exit 1; }
2026-09-26 17:10:53 +08:00
done
2026-09-27 20:24:34 +08:00
[ " $( id -u) " -eq 0 ] || { echo 'ERROR: run installer as root' >& 2; exit 1; }
# The monitor has no I2C, GPIO, Pillow, smbus2 or cooling-board requirement.
command -v python3 >/dev/null || { apt-get update; apt-get install -y python3; }
2026-09-27 22:28:03 +08:00
mkdir -p /usr/local/share/pigway-pi-control
2026-09-27 20:24:34 +08:00
install -m 0644 app/plugin_api.py /usr/local/share/pigway-pi-control/plugin_api.py
2026-09-26 13:57:33 +08:00
install -m 0755 app/pigway_pi_control.py /usr/local/sbin/pigway-pi-control
2026-09-27 10:21:12 +08:00
install -m 0755 app/pigway_pi_control_api.py /usr/local/sbin/pigway-pi-control-api
2026-09-26 13:57:33 +08:00
if [ -f /etc/pigway-pi-control.conf ] ; then
cp /etc/pigway-pi-control.conf "/etc/pigway-pi-control.conf.bak. $( date +%Y%m%d-%H%M%S) "
2026-09-26 17:10:53 +08:00
else
install -m 0644 config/pigway-pi-control.conf /etc/pigway-pi-control.conf
2026-09-26 13:57:33 +08:00
fi
2026-09-27 20:24:34 +08:00
# Legacy hardware sections are deliberately preserved for explicit migration,
# but ignored by the monitor and never exposed as monitor configuration.
python3 - <<'PY'
2026-09-27 10:04:15 +08:00
from pathlib import Path
2026-09-27 20:24:34 +08:00
import configparser
p=Path('/etc/pigway-pi-control.conf');c=configparser.ConfigParser();c.read(p)
with p.open('a') as f:
2026-09-27 22:28:03 +08:00
for section,values in {'device':{'identifier':'auto','name':'auto'},'plugins':{},'api':{'bind':'0.0.0.0','port':'6001','log_limit':'200'}}.items():
2026-09-27 20:24:34 +08:00
if not c.has_section(section):
f.write('\n['+section+']\n'+''.join(k+' = '+v+'\n' for k,v in values.items()))
2026-09-27 10:04:15 +08:00
PY
2026-09-27 10:21:12 +08:00
if [ ! -s /etc/pigway-pi-control-api.token ] ; then
2026-09-27 20:24:34 +08:00
( umask 077; python3 -c 'import secrets; print(secrets.token_urlsafe(32))' > /etc/pigway-pi-control-api.token)
2026-09-27 10:21:12 +08:00
fi
chmod 0600 /etc/pigway-pi-control-api.token
2026-09-27 20:24:34 +08:00
install -m 0644 systemd/pigway-pi-control.service /etc/systemd/system/
install -m 0644 systemd/pigway-pi-control-api.service /etc/systemd/system/
2026-09-27 22:28:03 +08:00
if [ -z " $API_ENABLED " ] ; then
API_ENABLED = false
if [ -t 0 ] ; then
read -r -p 'Enable remote management API? [y/N] ' answer
case " $answer " in y| Y| yes| YES) API_ENABLED = true ;; esac
fi
fi
API_ENABLED = " $API_ENABLED " python3 - <<'PYAPI'
import os,sys
sys.path.insert(0,'app')
import pigway_pi_control_api as api
api.save_ini_text(api.replace_ini_value('api','enabled',os.environ['API_ENABLED']),'install')
PYAPI
2026-09-26 13:57:33 +08:00
systemctl daemon-reload
2026-09-27 20:24:34 +08:00
if [ " $NO_START " -eq 0 ] ; then
2026-09-27 22:28:03 +08:00
systemctl enable pigway-pi-control.service >/dev/null
systemctl restart pigway-pi-control.service
2026-09-27 20:24:34 +08:00
systemctl is-active --quiet pigway-pi-control.service
2026-09-27 22:28:03 +08:00
if [ " $API_ENABLED " = true ] ; then
systemctl enable pigway-pi-control-api.service >/dev/null
systemctl restart pigway-pi-control-api.service
systemctl is-active --quiet pigway-pi-control-api.service
else
systemctl disable --now pigway-pi-control-api.service
fi
2026-09-27 10:29:01 +08:00
fi
2026-09-27 20:24:34 +08:00
echo 'Monitor installed. Hardware plugins are installed and connected separately.'
echo 'Config: /etc/pigway-pi-control.conf'
echo 'API token: sudo cat /etc/pigway-pi-control-api.token'