#!/bin/bash if [ "$IN_CHROOT" != "1" ] ; then echo This is supposed to run inside the chroot, oops exit 1 fi set -e set -x try_install() { # try to install packages, but ignore failure for pkg in "$@"; do if ! apt-get -y install "$pkg" ; then echo ---- WARNING: Failed to install package: $pkg fi done } # Set up live username and hostname cat >/etc/casper.conf <<"EOF" export USERNAME="ubuntu" export USERFULLNAME="Live session user" export HOST="nilmbuntu" export BUILD_SYSTEM="Ubuntu" export FLAVOUR="NILMbuntu" EOF # Upgrade packages and remove old kernels apt-get update apt-get -y dist-upgrade apt-get -y --purge autoremove for VER in $(ls --sort=version /lib/modules/ | head -n -1) ; do apt-get -y --purge remove "linux-.*$VER" done # Disable upgrade popups sed -i -s -e 's/Prompt=.*/Prompt=never/g' \ /etc/update-manager/release-upgrades || true # Set up & install postfix for local mail delivery debconf-set-selections <<"EOF" postfix postfix/mailname string localdomain postfix postfix/main_mailer_type select Local only EOF apt-get -y install postfix # Required packages apt-get -y install \ python3 \ python2.7 \ python2.7-dev \ python-setuptools \ python-pip \ cython \ git \ build-essential \ python-cherrypy3 \ python-decorator \ python-simplejson \ python-requests \ python-dateutil \ python-tz \ python-progressbar \ python-psutil \ python-numpy \ python-nose \ python-coverage \ apache2 \ libapache2-mod-wsgi \ python-scipy \ python-daemon # Install other useful but optional stuff try_install \ curl \ devscripts \ dlocate \ emacs \ emacs-goodies-el \ gcc-arm-none-eabi \ gdb-arm-none-eabi \ gddrescue \ gnuplot \ help2man \ ipython \ libnewlib-arm-none-eabi \ libstdc++-arm-none-eabi-newlib \ texlive \ mailutils \ moreutils \ mutt \ network-manager-openvpn-gnome \ octave \ octave-missing-functions \ octave-signal \ openocd \ openssl \ openvpn \ python-matplotlib \ screen \ silversearcher-ag \ subversion \ tcpdump \ zip # Set up timezone to America/New_York for the live CD ln -sf /usr/share/zoneinfo/America/New_York /etc/localtime dpkg-reconfigure -f noninteractive tzdata # Put some default desktop shortcuts in place DESKTOP=/etc/skel/Desktop mkdir -p $DESKTOP cp /usr/share/applications/exo-terminal-emulator.desktop $DESKTOP || true cp /usr/share/applications/exo-web-browser.desktop $DESKTOP || true chmod +x $DESKTOP/* # Custom background image (which was already copied in by customize.sh) XML=/etc/xdg/xdg-xubuntu/xfce4/xfconf/xfce-perchannel-xml sed -i -s -e 's/xubuntu-wallpaper.png/nilmbuntu.png/g' $XML/xfce4-desktop.xml # Configure Firefox with our default homepage HOMEPAGE="http://www.wattsworth.net/" cat >/etc/firefox/syspref.js < /home/nilmdb/nilmdb.wsgi <<"EOF" # import nilmdb.server # application = nilmdb.server.wsgi_application("/home/nilmdb/db","/nilmdb") # EOF # cat > /home/nilmdb/nilmrun.wsgi <<"EOF" # import nilmrun.server # application = nilmrun.server.wsgi_application("/nilmrun") # EOF # #### Edit apache config # # Create apache config by hacking up the default one. Might be a better way # # to do this, and it'll probably break on new versions, but... # APACHE_VER=$(dpkg -s apache2 | grep ^Version | cut -d ' ' -f 2) # if dpkg --compare-versions $APACHE_VER ge 2.4 ; then # DEF=/etc/apache2/sites-available/000-default.conf # NEED_PERMISSIONS=1 # else # DEF=/etc/apache2/sites-available/default # NEED_PERMISSIONS=0 # fi # # Cut out any existing NilmDB stuff # perl -ne 'print unless /## NilmDB start/../## NilmDB end/' $DEF > $DEF.orig # # Copy everything up to the first line # perl -ne 'print unless m-^[^#]*-..1' $DEF.orig > $DEF # # Add the NilmDB config # cat >>$DEF <<"EOF" # ## NilmDB start # WSGIScriptAlias /nilmdb /home/nilmdb/nilmdb.wsgi # WSGIDaemonProcess nilmdb-procgroup threads=32 user=nilmdb group=nilmdb # # WSGIProcessGroup nilmdb-procgroup # WSGIApplicationGroup nilmdb-appgroup # # WSGIScriptAlias /nilmrun /home/nilmdb/nilmrun.wsgi # WSGIDaemonProcess nilmrun-procgroup threads=32 user=nilmdb group=nilmdb # # WSGIProcessGroup nilmrun-procgroup # WSGIApplicationGroup nilmrun-appgroup # # EOF # if [ $NEED_PERMISSIONS == 1 ] ; then # cat >>$DEF <<"EOF" # # Options All # AllowOverride All # Require all granted # # EOF # fi # cat >>$DEF <<"EOF" # ## NilmDB end # EOF # # Copy everything including and after the first line # perl -ne 'print if m-^[^#]*-..1' $DEF.orig >> $DEF # #### Done editing apache config # # Create nilmdb capture, processing, and cleanup files # cat > /home/nilmdb/capture.sh <<"EOF" # #!/bin/bash -e # # Don't run capture if we're running off a live CD # if grep -q boot=casper /proc/cmdline ; then # echo "Skipping capture, because this is a live CD." # exit 0 # fi # echo "Starting capture in background..." # nilm-pipewatch --daemon --lock "/tmp/nilmdb-capture.lock" --timeout 30 \ # "ethstream -a 192.168.1.209 -n 6 -r 8000" \ # "nilm-insert -m 10 -r 8000 --live /data/raw" # EOF # cat > /home/nilmdb/process.sh <<"EOF" # #!/bin/bash -e # # Ensure only one copy of this code runs at a time: # LOCKFILE="/tmp/nilmdb-process.lock" # exec 99>"$LOCKFILE" # flock -n -x 99 || exit 0 # trap 'rm -f "$LOCKFILE"' 0 # nilm-sinefit -c 4 /data/raw /data/sinefit # nilm-prep -c 1 -r 0 /data/raw /data/sinefit /data/prep-a # nilm-prep -c 2 -r 120 /data/raw /data/sinefit /data/prep-b # nilm-prep -c 3 -r 240 /data/raw /data/sinefit /data/prep-c # nilm-decimate-auto /data/raw "/data/prep*" # nilm-cleanup --yes /home/nilmdb/cleanup.cfg # EOF # cat > /home/nilmdb/cleanup.cfg <<"EOF" # [/data/prep-*] # keep = 1y # [/data/raw] # keep = 2w # [/data/sinefit] # keep = 1y # decimated = false # EOF # # Set up crontab # cat > /home/nilmdb/crontab <<"EOF" # SHELL=/bin/bash # PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin # # Run capture and processing scripts every 5 minutes # */5 * * * * chronic /home/nilmdb/capture.sh # */5 * * * * chronic /home/nilmdb/process.sh # # Try to run nilmdb-fsck on boot. It should hopefully run before # # apache opens the database, and apache will return errors to clients # # until nilmdb-fsck is done. # @reboot chronic nilmdb-fsck --fix --no-data /home/nilmdb/db # EOF # crontab -u nilmdb /home/nilmdb/crontab # # Fix permissions # chown -R nilmdb:nilmdb /home/nilmdb # chmod +x /home/nilmdb/{capture,process}.sh # # Fetch and build everything. Put it in the nilmdb dir # echo "machine git.jim.sh login nilm password nilm" > /home/nilmdb/.netrc # GIT=https://git.jim.sh/jim/lees # rm -rf /home/nilmdb/git # mkdir /home/nilmdb/git # chown nilmdb:nilmdb /home/nilmdb/.netrc /home/nilmdb/git # REPOS="nilmdb nilmtools nilmrun ethstream" # # check it out as nilmdb, so the .netrc gets used # for repo in $REPOS; do # sudo -i -u nilmdb git clone $GIT/$repo.git git/$repo # done # # build as root, because we need to do that for the install # for repo in $REPOS; do # make -C /home/nilmdb/git/$repo install # done # # fix up all permissions in git dir, so nilmdb user can play with it later # chown -R nilmdb:nilmdb /home/nilmdb/git # # Create the initial database and streams by running the standalone # # server as nilmdb, making the right nilmtool calls, and killing it. # sudo -i -u nilmdb nilmdb-server -a 127.0.0.1 -p 18646 -d /home/nilmdb/db & # SERVERPID=$! # trap "kill -9 $SERVERPID" 0 # for i in $(seq 1 120) ; do # sleep 1 # echo waiting for nilmdb to start $i # if nilmtool -u http://127.0.0.1:18646/ info ; then # break # fi # done # nilmtool -u http://127.0.0.1:18646/ destroy -R "/data/*" || true # nilmtool -u http://127.0.0.1:18646/ create /data/raw uint16_6 # nilmtool -u http://127.0.0.1:18646/ create /data/sinefit float32_3 # nilmtool -u http://127.0.0.1:18646/ create /data/prep-a float32_8 # nilmtool -u http://127.0.0.1:18646/ create /data/prep-b float32_8 # nilmtool -u http://127.0.0.1:18646/ create /data/prep-c float32_8 # kill $SERVERPID # wait # trap "" 0