2013-08-17 22:28:49 -04:00
|
|
|
#!/bin/bash
|
|
|
|
|
|
|
|
if [ "$IN_CHROOT" != "1" ] ; then
|
|
|
|
echo This is supposed to run inside the chroot, oops
|
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
|
|
|
|
set -e
|
|
|
|
set -x
|
|
|
|
|
2013-08-18 19:26:07 -04:00
|
|
|
try_install() {
|
|
|
|
# try to install packages, but ignore failure
|
|
|
|
for pkg in "$@"; do
|
|
|
|
apt-get -y install "$pkg" || true
|
|
|
|
done
|
|
|
|
}
|
|
|
|
|
2013-08-17 22:28:49 -04:00
|
|
|
# Set up live username and hostname
|
|
|
|
cat >/etc/casper.conf <<"EOF"
|
|
|
|
export USERNAME="ubuntu"
|
|
|
|
export USERFULLNAME="Live session user"
|
|
|
|
export HOST="nilmdb"
|
|
|
|
export BUILD_SYSTEM="Ubuntu"
|
|
|
|
export FLAVOUR="NilmDBuntu"
|
|
|
|
EOF
|
|
|
|
|
|
|
|
# Upgrade packages, remove old kernels
|
|
|
|
apt-get update
|
2013-08-18 19:26:07 -04:00
|
|
|
# in 13.04, doing upgrade & dist-upgrade together tries to install 2 kernels
|
|
|
|
# at the same time, which breaks for some reason. Also, try the upgrade
|
|
|
|
# multiple times since that can help
|
|
|
|
apt-get -y upgrade || apt-get -y upgrade || true
|
|
|
|
apt-get -y dist-upgrade || apt-get -y dist-upgrade || true
|
2013-08-17 22:28:49 -04:00
|
|
|
apt-get -y --purge autoremove
|
|
|
|
for VER in $(ls --sort=version /lib/modules/ | head -n -1) ; do
|
|
|
|
apt-get -y --purge remove ".*$VER.*"
|
|
|
|
done
|
|
|
|
|
2013-08-18 12:42:11 -04:00
|
|
|
# Disable upgrade popups
|
|
|
|
sed -i -s -e 's/Prompt=normal/Prompt=never/g' \
|
2013-08-18 19:26:07 -04:00
|
|
|
/etc/update-manager/release-upgrades || true
|
2013-08-18 12:42:11 -04:00
|
|
|
|
2013-08-18 11:39:30 -04:00
|
|
|
# some stuff we need from Ubuntu
|
2013-08-18 19:26:07 -04:00
|
|
|
try_install \
|
2013-08-18 11:39:30 -04:00
|
|
|
wbritish \
|
|
|
|
thunderbird-locale-en-us
|
|
|
|
|
2013-08-18 17:54:56 -04:00
|
|
|
# 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
|
|
|
|
|
2013-08-17 22:28:49 -04:00
|
|
|
# install nilmdb things
|
|
|
|
apt-get -y install \
|
|
|
|
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
|
|
|
|
|
2013-08-28 10:28:54 -04:00
|
|
|
# install other useful but optional stuff
|
2013-08-18 19:26:07 -04:00
|
|
|
try_install \
|
2013-08-17 22:28:49 -04:00
|
|
|
emacs-goodies-el \
|
|
|
|
emacs23-nox \
|
|
|
|
octave \
|
|
|
|
octave-signal \
|
|
|
|
octave-missing-functions \
|
|
|
|
gnuplot \
|
|
|
|
curl \
|
|
|
|
gddrescue \
|
|
|
|
help2man \
|
|
|
|
luatex \
|
|
|
|
pgf \
|
|
|
|
moreutils \
|
|
|
|
ntfsprogs \
|
|
|
|
subversion \
|
|
|
|
dlocate \
|
2013-08-18 11:39:49 -04:00
|
|
|
ack-grep \
|
2013-08-20 13:38:44 -04:00
|
|
|
mutt \
|
|
|
|
python-matplotlib \
|
2013-08-28 10:28:54 -04:00
|
|
|
ipython \
|
|
|
|
openvpn \
|
|
|
|
network-manager-openvpn-gnome \
|
2014-02-18 14:56:22 -05:00
|
|
|
openssl \
|
|
|
|
tcpdump \
|
|
|
|
screen \
|
|
|
|
devscripts \
|
|
|
|
mailutils
|
2013-08-18 19:26:07 -04:00
|
|
|
|
|
|
|
# required
|
|
|
|
apt-get -y install \
|
2013-08-18 12:27:28 -04:00
|
|
|
openssh-server
|
2013-08-17 22:28:49 -04:00
|
|
|
|
2013-08-18 11:40:52 -04:00
|
|
|
# Set up timezone to America/New_York for the live CD
|
|
|
|
echo America/New_York > /etc/timezone
|
|
|
|
dpkg-reconfigure -f noninteractive tzdata
|
|
|
|
|
2013-08-17 22:28:49 -04:00
|
|
|
# Create nilmdb user to run the database
|
|
|
|
adduser --system --group --shell /bin/bash --disabled-password nilmdb
|
2013-08-18 19:25:06 -04:00
|
|
|
cp -rv /etc/skel/.??* /home/nilmdb
|
|
|
|
chown -R nilmdb:nilmdb /home/nilmdb
|
2013-08-17 22:28:49 -04:00
|
|
|
|
|
|
|
# Create WSGI scripts
|
|
|
|
cat > /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
|
|
|
|
|
|
|
|
# Create apache config by hacking up the default one. Might be a better way
|
|
|
|
# to do this, and it'll probably break on apache 2.4, but...
|
|
|
|
DEF=/etc/apache2/sites-available/default
|
|
|
|
perl -ne 'print unless /## NilmDB start/../## NilmDB end/' $DEF > $DEF.orig
|
|
|
|
perl -ne 'print unless m-^[^#]*</VirtualHost>-..1' $DEF.orig > $DEF
|
|
|
|
cat >>$DEF <<"EOF"
|
|
|
|
## NilmDB start
|
|
|
|
WSGIScriptAlias /nilmdb /home/nilmdb/nilmdb.wsgi
|
|
|
|
WSGIDaemonProcess nilmdb-procgroup threads=32 user=nilmdb group=nilmdb
|
|
|
|
<Location /nilmdb>
|
|
|
|
WSGIProcessGroup nilmdb-procgroup
|
|
|
|
WSGIApplicationGroup nilmdb-appgroup
|
|
|
|
</Location>
|
|
|
|
|
|
|
|
WSGIScriptAlias /nilmrun /home/nilmdb/nilmrun.wsgi
|
|
|
|
WSGIDaemonProcess nilmrun-procgroup threads=32 user=nilmdb group=nilmdb
|
|
|
|
<Location /nilmrun>
|
|
|
|
WSGIProcessGroup nilmrun-procgroup
|
|
|
|
WSGIApplicationGroup nilmrun-appgroup
|
|
|
|
</Location>
|
|
|
|
## NilmDB end
|
|
|
|
EOF
|
|
|
|
perl -ne 'print if m-^[^#]*</VirtualHost>-..1' $DEF.orig >> $DEF
|
|
|
|
|
|
|
|
# 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
|
2013-08-18 19:25:06 -04:00
|
|
|
echo "Skipping capture, because this is a live CD."
|
2013-08-17 22:28:49 -04:00
|
|
|
exit 0
|
|
|
|
fi
|
|
|
|
|
2013-08-18 19:25:06 -04:00
|
|
|
echo "Starting capture in background..."
|
2013-08-17 22:28:49 -04:00
|
|
|
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
|
|
|
|
|
2013-08-18 12:27:28 -04:00
|
|
|
# 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
|
|
|
|
|
2013-08-17 22:28:49 -04:00
|
|
|
# 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
|
2013-08-18 12:27:28 -04:00
|
|
|
|
|
|
|
# Create the initial database and streams by running the standalone
|
|
|
|
# server as nilmdb, making the right nilmtool calls, and killing it.
|
2013-08-18 17:55:09 -04:00
|
|
|
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
|
2013-08-18 12:27:28 -04:00
|
|
|
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
|
2013-08-18 17:55:09 -04:00
|
|
|
kill $SERVERPID
|
2013-08-18 12:42:11 -04:00
|
|
|
wait
|
2013-08-18 17:55:09 -04:00
|
|
|
trap "" 0
|
2013-08-18 15:30:34 -04:00
|
|
|
|
|
|
|
# Put some default desktop shortcuts in place
|
2013-08-18 20:53:22 -04:00
|
|
|
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/* # needs to be executable for 13.04+
|
|
|
|
|
|
|
|
# XFCE / theme customizations
|
|
|
|
if [ -d /usr/share/themes/Clearlooks ] && \
|
|
|
|
[ -d /usr/share/icons/elementary-xfce ] ; then
|
|
|
|
cat > /usr/share/gconf/defaults/88_nilmdbuntu-settings <<"EOF"
|
2013-08-18 15:30:34 -04:00
|
|
|
/desktop/gnome/interface/gtk_theme "Clearlooks"
|
|
|
|
/desktop/gnome/interface/icon_theme "elementary-xfce"
|
|
|
|
EOF
|
2013-08-18 20:53:22 -04:00
|
|
|
update-gconf-defaults
|
|
|
|
fi
|
2013-08-18 15:30:34 -04:00
|
|
|
|
2013-08-18 20:53:22 -04:00
|
|
|
XML=/etc/xdg/xdg-xubuntu/xfce4/xfconf/xfce-perchannel-xml
|
2013-08-18 15:30:34 -04:00
|
|
|
BG=/usr/share/xfce4/backdrops
|
2013-08-18 20:53:22 -04:00
|
|
|
mkdir -p $XML
|
|
|
|
cat >$XML/xfce4-desktop.xml <<"EOF"
|
2013-08-18 15:30:34 -04:00
|
|
|
<?xml version="1.0" encoding="UTF-8"?>
|
2013-08-18 20:53:22 -04:00
|
|
|
|
2013-08-18 15:30:34 -04:00
|
|
|
<channel name="xfce4-desktop" version="1.0">
|
|
|
|
<property name="desktop-icons" type="empty">
|
|
|
|
<property name="style" type="int" value="2"/>
|
|
|
|
<property name="file-icons" type="empty">
|
|
|
|
<property name="show-home" type="bool" value="true"/>
|
|
|
|
<property name="show-filesystem" type="bool" value="true"/>
|
|
|
|
<property name="show-removable" type="bool" value="true"/>
|
|
|
|
<property name="show-trash" type="bool" value="true"/>
|
|
|
|
</property>
|
|
|
|
</property>
|
|
|
|
<property name="backdrop" type="empty">
|
|
|
|
<property name="screen0" type="empty">
|
|
|
|
<property name="monitor0" type="empty">
|
|
|
|
<property name="image-path" type="string"
|
|
|
|
value="/usr/share/xfce4/backdrops/nilmdbuntu.png"/>
|
|
|
|
<property name="image-show" type="bool" value="true"/>
|
|
|
|
<property name="image-style" type="int" value="4"/>
|
|
|
|
<property name="color-style" type="int" value="0"/>
|
|
|
|
<property name="color1" type="array">
|
2013-08-18 19:07:55 -04:00
|
|
|
<value type="uint" value="0"/>
|
|
|
|
<value type="uint" value="0"/>
|
|
|
|
<value type="uint" value="0"/>
|
2013-08-18 15:30:34 -04:00
|
|
|
<value type="uint" value="65535"/>
|
|
|
|
</property>
|
|
|
|
</property>
|
|
|
|
<property name="monitor1" type="empty">
|
|
|
|
<property name="image-path" type="string"
|
|
|
|
value="/usr/share/xfce4/backdrops/nilmdbuntu.png"/>
|
|
|
|
<property name="image-show" type="bool" value="true"/>
|
|
|
|
<property name="image-style" type="int" value="4"/>
|
|
|
|
<property name="color-style" type="int" value="0"/>
|
|
|
|
<property name="color1" type="array">
|
2013-08-18 19:07:55 -04:00
|
|
|
<value type="uint" value="0"/>
|
|
|
|
<value type="uint" value="0"/>
|
|
|
|
<value type="uint" value="0"/>
|
2013-08-18 15:30:34 -04:00
|
|
|
<value type="uint" value="65535"/>
|
|
|
|
</property>
|
|
|
|
</property>
|
|
|
|
</property>
|
|
|
|
</property>
|
|
|
|
</channel>
|
|
|
|
EOF
|
2013-08-18 20:53:22 -04:00
|
|
|
sed -i -s -e 's/Greybird/Default/g' $XML/xfwm4.xml || true
|
|
|
|
sed -i -s -e 's/Greybird/Clearlooks/g' $XML/xsettings.xml || true
|
|
|
|
sed -i -s -e \
|
|
|
|
's/elementary-xfce-dark/elementary-xfce/g' $XML/xsettings.xml || true
|
2013-08-18 19:25:06 -04:00
|
|
|
|
|
|
|
# Firefox defaults
|
|
|
|
cat >/etc/firefox/syspref.js <<"EOF"
|
|
|
|
pref("browser.startup.homepage", "http://nilmdb.com/");
|
|
|
|
EOF
|
2013-08-19 14:25:05 -04:00
|
|
|
cat >/etc/xul-ext/homepage.properties <<"EOF"
|
|
|
|
browser.startup.homepage=http://nilmdb.com/
|
|
|
|
EOF
|
|
|
|
cat >/etc/xul-ext/ubufox.js <<"EOF"
|
|
|
|
pref("browser.startup.homepage", "file:/etc/xul-ext/homepage.properties");
|
|
|
|
EOF
|