2026-06-29 09:42:14 +02:00
#!/bin/bash
set -euo pipefail
2026-06-29 17:29:00 +02:00
SOURCE_DIR = $( cd -- " $( dirname -- " ${ BASH_SOURCE [0] } " ) " && pwd )
source " $SOURCE_DIR /usr/local/lib/pivilion/common.sh "
pivilion_load_config
pivilion_print_motd "Pivilion installer"
2026-06-29 09:42:14 +02:00
if [ " $( id -u) " -ne 0 ] ; then
echo "Run this installer with sudo: sudo ./install.sh" >& 2
exit 1
fi
export DEBIAN_FRONTEND = noninteractive
is_networkmanager_system( ) {
command -v nmcli >/dev/null 2>& 1 && {
systemctl is-enabled --quiet NetworkManager 2>/dev/null ||
systemctl is-active --quiet NetworkManager 2>/dev/null
}
}
install_packages( ) {
2026-06-29 17:29:00 +02:00
local packages = ( apache2 libapache2-mod-php php php-cli tor dnsmasq dnsutils nftables iproute2 iw rfkill curl wget unzip wpasupplicant)
2026-06-29 09:42:14 +02:00
apt-get update
apt-get install -y " ${ packages [@] } "
if is_networkmanager_system; then
echo "Using the installed NetworkManager backend."
elif command -v dhcpcd >/dev/null 2>& 1 || dpkg-query -W dhcpcd5 >/dev/null 2>& 1; then
apt-get install -y hostapd dhcpcd5
echo "Using the installed dhcpcd/hostapd backend."
else
apt-get install -y network-manager
systemctl enable NetworkManager
echo "No active networking backend was found; installed NetworkManager."
fi
}
deploy_files( ) {
local php_version
2026-06-29 17:29:00 +02:00
install -d -m 0755 /usr/local/lib/pivilion /usr/local/bin /etc/systemd/system /etc/tor/torrc.d /etc/profile.d
2026-06-29 09:42:14 +02:00
install -m 0644 " $SOURCE_DIR /usr/local/lib/pivilion/common.sh " /usr/local/lib/pivilion/common.sh
install -m 0755 " $SOURCE_DIR /usr/local/lib/pivilion/mode.sh " /usr/local/lib/pivilion/mode.sh
install -m 0755 " $SOURCE_DIR " /usr/local/bin/* /usr/local/bin/
install -m 0644 " $SOURCE_DIR /etc/systemd/system/pivilion-mode.service " /etc/systemd/system/pivilion-mode.service
install -m 0644 " $SOURCE_DIR /etc/systemd/system/pivilion-dnsmasq.service " /etc/systemd/system/pivilion-dnsmasq.service
install -m 0644 " $SOURCE_DIR /etc/tor/torrc.d/pivilion.conf " /etc/tor/torrc.d/pivilion.conf
2026-06-29 17:29:00 +02:00
install -m 0644 " $SOURCE_DIR /etc/profile.d/pivilion-motd.sh " /etc/profile.d/pivilion-motd.sh
2026-06-29 09:42:14 +02:00
cat > /etc/pivilion.defaults <<EOF
PIVILION_USER = $PIVILION_USER
PIVILION_HOME = $PIVILION_HOME
PIVILION_DIR = $PIVILION_DIR
PIVILION_WEBROOT = $PIVILION_WEBROOT
PIVILION_MODE = $PIVILION_MODE
PIVILION_HOTSPOT_SSID = $PIVILION_HOTSPOT_SSID
PIVILION_WIFI_INTERFACE = $PIVILION_WIFI_INTERFACE
EOF
chmod 0644 /etc/pivilion.defaults
install -d -m 0755 -o " $PIVILION_USER " -g " $PIVILION_GROUP " " $PIVILION_DIR " " $PIVILION_DIR /config "
cp -a " $SOURCE_DIR /home/pi/pivilion/config/. " " $PIVILION_DIR /config/ "
chown -R " $PIVILION_USER : $PIVILION_GROUP " " $PIVILION_DIR /config "
install -d -m 0755 -o " $PIVILION_USER " -g " $PIVILION_GROUP " \
" $PIVILION_DIR /static " " $PIVILION_DIR /hotglue " " $PIVILION_DIR /hotglue/backup "
[ -s " $PIVILION_DIR /mode " ] || pivilion_set_mode " $PIVILION_MODE "
[ -e " $PIVILION_DIR /torname " ] || install -m 0644 -o " $PIVILION_USER " -g " $PIVILION_GROUP " /dev/null " $PIVILION_DIR /torname "
install -d -m 2775 -o www-data -g www-data " $PIVILION_WEBROOT " " $PIVILION_WEBROOT /gen "
cp -a " $SOURCE_DIR /var/www/html/pivilion/scripts " " $PIVILION_WEBROOT / "
cp -a " $SOURCE_DIR /var/www/html/pivilion/images " " $PIVILION_WEBROOT / "
cp -a " $SOURCE_DIR /var/www/html/pivilion/skeleton " " $PIVILION_WEBROOT / "
install -m 0664 -o www-data -g www-data " $SOURCE_DIR /var/www/html/pivilion/gen.php " " $PIVILION_WEBROOT /gen.php "
install -m 0644 -o www-data -g www-data " $SOURCE_DIR /var/www/html/pivilion/index.html " " $PIVILION_WEBROOT /index.html "
install -m 0644 -o www-data -g www-data " $SOURCE_DIR /var/www/html/pivilion/pi-logo_128.png " " $PIVILION_WEBROOT /pi-logo_128.png "
if [ ! -e " $PIVILION_WEBROOT /gen/index.php " ] ; then
cp -a " $SOURCE_DIR /var/www/html/pivilion/gen/. " " $PIVILION_WEBROOT /gen/ "
fi
chown -R www-data:www-data " $PIVILION_WEBROOT /scripts " " $PIVILION_WEBROOT /images " " $PIVILION_WEBROOT /skeleton "
chown -R www-data:www-data " $PIVILION_WEBROOT /gen "
find " $PIVILION_WEBROOT " -type d -exec chmod 2775 { } +
find " $PIVILION_WEBROOT " -type f -exec chmod 0664 { } +
cat > /etc/pivilion.php <<EOF
<?php
define( 'PIVILION_DIR' , ${ PIVILION_DIR @Q } ) ;
define( 'PIVILION_WEBROOT' , ${ PIVILION_WEBROOT @Q } ) ;
EOF
chmod 0644 /etc/pivilion.php
php_version = $( php -r 'echo PHP_MAJOR_VERSION.".".PHP_MINOR_VERSION;' )
install -d -m 0755 " /etc/php/ $php_version /apache2/conf.d "
install -m 0644 " $SOURCE_DIR /etc/php/pivilion.ini " " /etc/php/ $php_version /apache2/conf.d/99-pivilion.ini "
}
configure_services( ) {
sed " s|/var/www/html/pivilion| $PIVILION_WEBROOT |g " " $SOURCE_DIR /etc/apache2/sites-available/000-default.conf " > /etc/apache2/sites-available/000-default.conf
sed " s|/var/www/html/pivilion| $PIVILION_WEBROOT |g " " $SOURCE_DIR /etc/apache2/sites-available/000-upload.conf " > /etc/apache2/sites-available/000-upload.conf
install -m 0644 " $SOURCE_DIR /etc/apache2/ports.conf " /etc/apache2/ports.conf
cat > /etc/apache2/conf-available/pivilion.conf <<EOF
<Directory " $PIVILION_WEBROOT " >
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
EOF
a2enmod rewrite
a2enconf pivilion
a2ensite 000-default.conf
if ! grep -Fqx '%include /etc/tor/torrc.d/*.conf' /etc/tor/torrc; then
printf '\n%%include /etc/tor/torrc.d/*.conf\n' >> /etc/tor/torrc
fi
systemctl daemon-reload
systemctl enable apache2 pivilion-mode.service
systemctl enable tor@default.service 2>/dev/null || systemctl enable tor.service
systemctl disable --now dnsmasq 2>/dev/null || true
systemctl disable pivilion-dnsmasq.service 2>/dev/null || true
}
validate_install( ) {
apache2ctl configtest
tor --verify-config -f /etc/tor/torrc
dnsmasq --test
bash -n /usr/local/lib/pivilion/common.sh /usr/local/lib/pivilion/mode.sh /usr/local/bin/pivilion \
/usr/local/bin/hotspot /usr/local/bin/onion /usr/local/bin/pikey /usr/local/bin/generator \
2026-06-29 17:29:00 +02:00
/usr/local/bin/static /usr/local/bin/hotglue /usr/local/bin/htaccess /usr/local/bin/pivilion-diagnose
2026-06-29 09:42:14 +02:00
}
install_packages
deploy_files
configure_services
validate_install
echo " Pivilion installed for $PIVILION_USER . Reboot to enter $( pivilion_current_mode) mode. "