#!/bin/bash if [ "$1" == "" ] || [ "$1" == "-h" ] then echo "Usage: install.sh [binary] [root] [OPTIONS] Example: install.sh build/wmbusmeters / Options: --no-adduser Do not add wmbusmeters user " exit 0 fi if [ ! "$(basename "$1")" = "wmbusmeters" ] then echo Oups, please only try to install wmbusmeters using this script. exit 1 fi if [ ! -x "$1" ] then echo This is not an executable: \"$1\" exit 1 fi if [ ! -d "$2" ] then echo Oups, please supply a valid root directory. exit 1 fi SRC=$1 ROOT="${2%/}" ADDUSER=true while [ $# -ne 0 ] do ARG="$1" shift case "$ARG" in --no-adduser) ADDUSER=false ;; esac done ## If your OS does not have the dialout group (Arch Linux for example) ## then use uucp instead. SERIALGROUP=dialout if [ "$(getent group ${SERIALGROUP})" = "" ] then SERIALGROUP=uucp fi #################################################################### ## ## Intall binaries ## rm -f "$ROOT"/usr/bin/wmbusmeters "$ROOT"/usr/sbin/wmbusmetersd mkdir -p "$ROOT"/usr/bin mkdir -p "$ROOT"/usr/sbin cp "$SRC" "$ROOT"/usr/bin/wmbusmeters ln -s /usr/bin/wmbusmeters "$ROOT"/usr/sbin/wmbusmetersd echo binaries: installed "$ROOT"/usr/bin/wmbusmeters and "$ROOT"/usr/sbin/wmbusmetersd #################################################################### ## ## Intall wmbusmeters manual page ## rm -f "$ROOT"/usr/share/man/man1/wmbusmeters.1.gz mkdir -p "$ROOT"/usr/share/man/man1 gzip -c wmbusmeters.1 > "$ROOT"/usr/share/man/man1/wmbusmeters.1.gz echo man page: installed "$ROOT"/usr/share/man/man1/wmbusmeters.1.gz #################################################################### ## ## Create wmbusmeters user ## if [ -f "$ROOT"/usr/sbin/nologin ] then USERSHELL="$ROOT/usr/sbin/nologin" elif [ -f "$ROOT"/sbin/nologin ] then USERSHELL="$ROOT/sbin/nologin" else USERSHELL="/bin/false" fi if [ "$ADDUSER" = "true" ] then # Create the wmbusmeters group, if it does not already exist. groupadd -f wmbusmeters ID=$(id -u wmbusmeters 2>/dev/null) if [ -z "$ID" ] then # Create the wmbusmeters user useradd --system --shell $USERSHELL -g wmbusmeters wmbusmeters echo user: added wmbusmeters else echo user: wmbusmeters already exists fi if [ "$(groups wmbusmeters | grep -o ${SERIALGROUP})" = "" ] then # Add the wmbusmeters user to dialout/uucp usermod -a -G ${SERIALGROUP} wmbusmeters echo user: added wmbusmeters to ${SERIALGROUP} group else echo user: wmbusmeters already added to ${SERIALGROUP} fi if [ "$(groups wmbusmeters | grep -o plugdev)" = "" ] then # Add the wmbusmeters user to plugdev usermod -a -G plugdev wmbusmeters echo user: added wmbusmeters to plugdev group else echo user: wmbusmeters already added to plugdev fi if [ ! -z "$SUDO_USER" ] then if [ "$(groups $SUDO_USER | grep -o wmbusmeters)" = "" ] then # Add user to the wmbusmeters group. usermod -a -G wmbusmeters $SUDO_USER echo user: added $SUDO_USER to group wmbusmeters else echo user: $SUDO_USER already added group wmbusmeters fi if [ "$(groups $SUDO_USER | grep -o ${SERIALGROUP})" = "" ] then # Add user to the dialout/uucp group. usermod -a -G ${SERIALGROUP} $SUDO_USER echo user: added $SUDO_USER to group ${SERIALGROUP} else echo user: $SUDO_USER already added group ${SERIALGROUP} fi fi fi #################################################################### ## ## Prepare for /run/wmbusmeters.pid ## #if [ ! -d "$ROOT"/var/run ] #then # # Create /var/run # mkdir -p "$ROOT"/var/run # echo pid store: created /var/run #fi #################################################################### ## ## Prepare for /var/log/wmbusmeters and /var/log/wmbusmeters/meter_readings ## if [ ! -d "$ROOT"/var/log/wmbusmeters/meter_readings ] then # Create the log directories mkdir -p "$ROOT"/var/log/wmbusmeters/meter_readings chown -R wmbusmeters:wmbusmeters "$ROOT"/var/log/wmbusmeters echo log: created "$ROOT"/var/log/wmbusmeters/meter_readings fi #################################################################### ## ## Install /etc/logrotate.d/wmbusmeters ## if [ ! -f "$ROOT"/etc/logrotate.d/wmbusmeters ] then mkdir -p "$ROOT"/etc/logrotate.d # Create logrotate file cat < "$ROOT"/etc/logrotate.d/wmbusmeters /var/log/wmbusmeters/*.log { rotate 12 weekly compress missingok postrotate /bin/kill -HUP `cat /run/wmbusmeters/wmbusmeters.pid 2> /dev/null` 2> /dev/null || true endscript EOF echo logrotate: created "$ROOT"/etc/logrotate.d/wmbusmeters else echo conf file: "$ROOT"/etc/logrotate.d/wmbusmeters unchanged fi #################################################################### ## ## Install /etc/wmbusmeters.conf ## if [ ! -f "$ROOT"/etc/wmbusmeters.conf ] then # Create default configuration mkdir -p "$ROOT"/etc/ cat < "$ROOT"/etc/wmbusmeters.conf loglevel=normal device=auto logtelegrams=false format=json meterfiles=/var/log/wmbusmeters/meter_readings meterfilesaction=overwrite logfile=/var/log/wmbusmeters/wmbusmeters.log EOF chmod 644 "$ROOT"/etc/wmbusmeters.conf echo conf file: created "$ROOT"/etc/wmbusmeters.conf else echo conf file: "$ROOT"/etc/wmbusmeters.conf unchanged fi #################################################################### ## ## Create /etc/wmbusmeters.d ## if [ ! -d "$ROOT"/etc/wmbusmeters.d ] then # Create the configuration directory mkdir -p "$ROOT"/etc/wmbusmeters.d chmod -R 755 "$ROOT"/etc/wmbusmeters.d echo conf dir: created "$ROOT"/etc/wmbusmeters.d else echo conf dir: "$ROOT"/etc/wmbusmeters.d unchanged fi #################################################################### ## ## Create /lib/systemd/system/wmbusmeters.service ## SYSTEMD_NEEDS_RELOAD=false mkdir -p "$ROOT"/lib/systemd/system/ OLD_WMBS=~/old.wmbusmeters.service.backup CURR_WMBS="$ROOT"/lib/systemd/system/wmbusmeters.service if [ -f $CURR_WMBS ] then cp $CURR_WMBS $OLD_WMBS 2>/dev/null fi # Create service file for starting daemon without explicit device. # This means that wmbusmeters will rely on the conf file device setting. cat <<'EOF' > $CURR_WMBS [Unit] Description="wmbusmeters service" Documentation=https://github.com/weetmuts/wmbusmeters Documentation=man:wmbusmeters(1) After=network.target StopWhenUnneeded=false StartLimitIntervalSec=10 StartLimitInterval=10 StartLimitBurst=3 [Service] Type=forking PrivateTmp=yes User=wmbusmeters Group=wmbusmeters Restart=always RestartSec=1 # Run ExecStartPre with root-permissions PermissionsStartOnly=true ExecStartPre=-/bin/mkdir -p /var/log/wmbusmeters/meter_readings ExecStartPre=/bin/chown -R wmbusmeters:wmbusmeters /var/log/wmbusmeters ExecStartPre=-/bin/mkdir -p /run/wmbusmeters ExecStartPre=/bin/chown -R wmbusmeters:wmbusmeters /run/wmbusmeters ExecStart=/usr/sbin/wmbusmetersd /run/wmbusmeters/wmbusmeters.pid ExecReload=/bin/kill -HUP $MAINPID PIDFile=/run/wmbusmeters/wmbusmeters.pid [Install] WantedBy=multi-user.target EOF if diff $OLD_WMBS $CURR_WMBS 1>/dev/null then echo systemd: no changes to $CURR_WMBS rm -f $OLD_WMBS else echo systemd: updated $CURR_WMBS SYSTEMD_NEEDS_RELOAD=true fi OLD_WMBAS=~/old.wmbusmeters@.service.backup CURR_WMBAS="$ROOT"/lib/systemd/system/wmbusmeters@.service if [ -f $CURR_WMBAS ] then echo systemd: removing $CURR_WMBAS echo systemd: backing up $CURR_WMBAS to here: $OLD_WMBAS cp $CURR_WMBAS $OLD_WMBAS 2>/dev/null rm $CURR_WMBAS SYSTEMD_NEEDS_RELOAD=true fi #################################################################### ## ## Remove any existing /etc/udev/rules.d/99-wmbus-usb-serial.rules ## The new wmbuseters daemon is not going to use these. ## if [ -f "$ROOT"/etc/udev/rules.d/99-wmbus-usb-serial.rules ] then echo udev: removing "$ROOT"/etc/udev/rules.d/99-wmbus-usb-serial.rules echo udev: backup stored here: ~/old.wmbusmeters-wmbus-usb-serial.rules.backup cp "$ROOT"/etc/udev/rules.d/99-wmbus-usb-serial.rules ~/old.wmbusmeters-wmbus-usb-serial.rules.backup rm "$ROOT"/etc/udev/rules.d/99-wmbus-usb-serial.rules UDEV_NEEDS_RELOAD=true fi if [ "$SYSTEMD_NEEDS_RELOAD" = "true" ] then echo echo echo You need to reload systemd configuration! Please do: echo sudo systemctl daemon-reload fi if [ "$UDEV_NEEDS_RELOAD" = "true" ] then echo echo echo You need to reload udev configuration! Please do: echo "sudo udevadm control --reload-rules" echo "sudo udevadm trigger" fi