Skip to content

Instantly share code, notes, and snippets.

@aphexddb
Last active January 19, 2019 19:14
Show Gist options
  • Save aphexddb/cd371de803ac54dc1c091dc9e3f318af to your computer and use it in GitHub Desktop.
Save aphexddb/cd371de803ac54dc1c091dc9e3f318af to your computer and use it in GitHub Desktop.
Home Linux configurations

Network

Great writeup on setting up wifi VLAN and DMZ using pfsense and Ubuquti.

Samba

To ensure fileshares are not super slow, do some basic Samba perf tuning in /etc/samba/smb.conf:

[global]
socket options = TCP_NODELAY SO_RCVBUF=524288 SO_SNDBUF=524288 IPTOS_LOWDELAY 

Go

Install latest go and add /usr/local/go/bin to PATH in /etc/environment

curl -O https://dl.google.com/go/go1.11.1.linux-amd64.tar.gz
sudo tar -C /usr/local -xzf go1.11.1.linux-amd64.tar.gz

Gogs

Runs on port 3000

  1. Install from source.
  2. Use the Debian startup (init.d) script: gogs-init-script.sh and setup gogs service
    vi /etc/init.d/gogs
    sudo chmod 755 /etc/init.d/gogs
    sudo update-rc.d gogs defaults
  3. Navigate to host:30000 and setup
  4. Update /go/src/github.com/gogs/gogs/custom/conf/app.ini as needed (link to full config)

Octoprint

Runs on port 5000

  1. Install Python, build tools and virtualenv

    sudo apt update
    sudo apt install python-pip python-dev python-setuptools python-virtualenv git libyaml-dev build-essential
    mkdir ~/OctoPrint && cd ~/OctoPrint
    virtualenv venv
    source venv/bin/activate
  2. Install OctoPrint in ~/OctoPrint

    pip install pip --upgrade
    pip install https://get.octoprint.org/latest
  3. Add our user to the dialout group and tty so that the user can access the serial ports:

    sudo usermod -a -G tty poe
    sudo usermod -a -G dialout poe
  4. Use the Debian startup (init.d) script: octoprint-init-script.sh and setup octoprint service

    vi /etc/init.d/octoprint
    sudo chmod 755 /etc/init.d/octoprint
    sudo update-rc.d octoprint defaults
  5. Install CuraEngine via this guide

    sudo apt-get install dh-autoreconf cmake git python3-setuptools python3-sip-dev
    sudo apt-get install
    
    cd ~
    wget https://github.com/google/protobuf/releases/download/v3.1.0/protobuf-python-3.1.0.tar.gz
    tar zxf protobuf-python-3.1.0.tar.gz
    cd protobuf-3.1.0
    ./autogen.sh
    ./configure
    make
    sudo make install
    
    cd python
    python3 setup.py build
    sudo python3 setup.py install
    sudo ldconfig
    
    cd ~
    git clone https://github.com/Ultimaker/libArcus.git
    cd libArcus
    mkdir build
    cd build
    cmake ..
    make
    sudo make install
    sudo ldconfig
    
    cd ~
    git clone https://github.com/Ultimaker/CuraEngine.git
    cd CuraEngine
    mkdir build
    cd build
    cmake ..
    make
    sudo make install
    sudo ldconfig
  6. Install support for a USB webcam using mjpg-streamer, I used a Logittech C920.

    sudo apt-get install cmake libjpeg8-dev
    git clone https://github.com/jacksonliam/mjpg-streamer.git
    cd mjpg-streamer/mjpg-streamer-experimental
    make
    sudo make install
    sudo ldconfig

    Run streamer on port 8000 to test using flags for your device:

    export LD_LIBRARY_PATH=/home/poe/mjpg-streamer/mjpg-streamer-experimental
    mjpg_streamer -i "input_uvc.so -r 1280x720 -d /dev/video0 -f 30 -q 80" -o "output_http.so -p 8000 -w /home/poe/mjpg-streamer/mjpg-streamer-experimental/www"
  7. Use the Debian startup (init.d) script: mjpg-streamer-init-script.sh

    vi /home/poe/mjpg-streamer/mjpg-streamer-experimental/mjpg-streamer.sh
    
    vi /etc/init.d/mjpg-streamer
    sudo chmod 755 /etc/init.d/mjpg-streamer
    sudo update-rc.d mjpg-streamer defaults

    Validate the stream service starts:

    • Stream URL: http://192.168.1.25:8000/?action=stream
    • Snapshot URL: http://192.168.1.25:8000/?action=snapshot
    • Path to FFMPEG: /usr/bin/ffmpeg
#! /bin/sh
### BEGIN INIT INFO
# Provides: gogs
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Git repository manager Gogs
# Description: Starts and stops the self-hosted git repository manager Gogs
### END INIT INFO
# PATH should only include /usr/* if it runs after the mountnfs.sh script
PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC="Git repository manager Gogs"
NAME=gogs
# The daemon will be run as this user
USER=git
HOME=$(grep "^$USER:" /etc/passwd | cut -d: -f6)
USER_ID=$(id -u $USER)
GROUP_ID=$(id -g $USER)
# DIR is the gogs installation directory. Change if necessary.
DIR=/home/$USER/go/src/github.com/gogs/gogs/
DAEMON=$DIR$NAME
DAEMON_ARGS="web"
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME
# Load the VERBOSE setting and other rcS variables
. /lib/init/vars.sh
# Define LSB log_* functions.
# Depend on lsb-base (>= 3.2-14) to ensure that this file is present
# and status_of_proc is working.
. /lib/lsb/init-functions
#
# Function that starts the daemon/service
#
do_start()
{
# Return
# 0 if daemon has been started
# 1 if daemon was already running
# 2 if daemon could not be started
export USER HOME
start-stop-daemon --start --pidfile $PIDFILE --make-pidfile --user $USER --chdir $DIR --exec $DAEMON --test > /dev/null \
|| return 1
start-stop-daemon --start --background --pidfile $PIDFILE --make-pidfile --user $USER --chdir $DIR --chuid $USER_ID:$GROUP_ID --exec $DAEMON -- \
$DAEMON_ARGS \
|| return 2
}
#
# Function that stops the daemon/service
#
do_stop()
{
# Return
# 0 if daemon has been stopped
# 1 if daemon was already stopped
# 2 if daemon could not be stopped
# other if a failure occurred
start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME
RETVAL="$?"
[ "$RETVAL" = 2 ] && return 2
# Wait for children to finish too if this is a daemon that forks
# and if the daemon is only ever run from this initscript.
# If the above conditions are not satisfied then add some other code
# that waits for the process to drop all resources that could be
# needed by services started subsequently. A last resort is to
# sleep for some time.
start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON
[ "$?" = 2 ] && return 2
# Many daemons don't delete their pidfiles when they exit.
rm -f $PIDFILE
return "$RETVAL"
}
#
# Function that sends a SIGHUP to the daemon/service
#
do_reload() {
#
# If the daemon can reload its configuration without
# restarting (for example, when it is sent a SIGHUP),
# then implement that here.
#
start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE --name $NAME
return 0
}
case "$1" in
start)
[ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
do_start
case "$?" in
0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
esac
;;
stop)
[ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
do_stop
case "$?" in
0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
esac
;;
status)
status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
;;
#reload|force-reload)
#
# If do_reload() is not implemented then leave this commented out
# and leave 'force-reload' as an alias for 'restart'.
#
#log_daemon_msg "Reloading $DESC" "$NAME"
#do_reload
#log_end_msg $?
#;;
restart|force-reload)
#
# If the "reload" option is implemented then remove the
# 'force-reload' alias
#
log_daemon_msg "Restarting $DESC" "$NAME"
do_stop
case "$?" in
0|1)
do_start
case "$?" in
0) log_end_msg 0 ;;
1) log_end_msg 1 ;; # Old process is still running
*) log_end_msg 1 ;; # Failed to start
esac
;;
*)
# Failed to stop
log_end_msg 1
;;
esac
;;
*)
#echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2
echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2
exit 3
;;
esac
exit 0
#!/bin/sh
export LD_LIBRARY_PATH=/home/poe/mjpg-streamer/mjpg-streamer-experimental
PORT=8000
WWW_DIR=/home/poe/mjpg-streamer/mjpg-streamer-experimental/www
VIDEO_DEVICE=/dev/video0
VIDEO_FPS=30
VIDEO_QUALITY=80
VIDEO_RESOLUTION="1280x720"
INPUT_ARGS="-r $VIDEO_RESOLUTION -d $VIDEO_DEVICE -f $VIDEO_FPS -q $VIDEO_QUALITY"
OUTPUT_ARGS="-p $PORT -w $WWW_DIR"
exec /home/poe/mjpg-streamer/mjpg-streamer-experimental/mjpg_streamer -i "input_uvc.so $INPUT_ARGS" -o "output_http.so $OUTPUT_ARGS"
#! /bin/sh
### BEGIN INIT INFO
# Provides: mjpg-streamer
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Webcam mjpg-streamer
# Description: Starts and stops the webcam mjpg-streamer
### END INIT INFO
# PATH should only include /usr/* if it runs after the mountnfs.sh script
PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC="Webcam mjpg-streamer"
NAME=mjpg-streamer.sh
# The daemon will be run as this user
USER=root
HOME=$(grep "^$USER:" /etc/passwd | cut -d: -f6)
USER_ID=$(id -u $USER)
GROUP_ID=$(id -g $USER)
DIR=/home/poe/mjpg-streamer/mjpg-streamer-experimental
DAEMON=$DIR/$NAME
DAEMON_ARGS=""
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME
# Load the VERBOSE setting and other rcS variables
. /lib/init/vars.sh
# Define LSB log_* functions.
# Depend on lsb-base (>= 3.2-14) to ensure that this file is present
# and status_of_proc is working.
. /lib/lsb/init-functions
#
# Function that starts the daemon/service
#
do_start()
{
# Return
# 0 if daemon has been started
# 1 if daemon was already running
# 2 if daemon could not be started
export USER HOME
export LD_LIBRARY_PATH=$DIR
start-stop-daemon --start --pidfile $PIDFILE --make-pidfile --user $USER --chdir $DIR --exec $DAEMON --test > /dev/null \
|| return 1
start-stop-daemon --start --background --pidfile $PIDFILE --make-pidfile --user $USER --chdir $DIR --chuid $USER_ID:$GROUP_ID --exec $DAEMON -- \
$DAEMON_ARGS \
|| return 2
}
#
# Function that stops the daemon/service
#
do_stop()
{
# Return
# 0 if daemon has been stopped
# 1 if daemon was already stopped
# 2 if daemon could not be stopped
# other if a failure occurred
start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME
RETVAL="$?"
[ "$RETVAL" = 2 ] && return 2
# Wait for children to finish too if this is a daemon that forks
# and if the daemon is only ever run from this initscript.
# If the above conditions are not satisfied then add some other code
# that waits for the process to drop all resources that could be
# needed by services started subsequently. A last resort is to
# sleep for some time.
start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON
[ "$?" = 2 ] && return 2
# Many daemons don't delete their pidfiles when they exit.
rm -f $PIDFILE
return "$RETVAL"
}
#
# Function that sends a SIGHUP to the daemon/service
#
do_reload() {
#
# If the daemon can reload its configuration without
# restarting (for example, when it is sent a SIGHUP),
# then implement that here.
#
start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE --name $NAME
return 0
}
case "$1" in
start)
[ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
do_start
case "$?" in
0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
esac
;;
stop)
[ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
do_stop
case "$?" in
0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
esac
;;
status)
status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
;;
#reload|force-reload)
#
# If do_reload() is not implemented then leave this commented out
# and leave 'force-reload' as an alias for 'restart'.
#
#log_daemon_msg "Reloading $DESC" "$NAME"
#do_reload
#log_end_msg $?
#;;
restart|force-reload)
#
# If the "reload" option is implemented then remove the
# 'force-reload' alias
#
log_daemon_msg "Restarting $DESC" "$NAME"
do_stop
case "$?" in
0|1)
do_start
case "$?" in
0) log_end_msg 0 ;;
1) log_end_msg 1 ;; # Old process is still running
*) log_end_msg 1 ;; # Failed to start
esac
;;
*)
# Failed to stop
log_end_msg 1
;;
esac
;;
*)
#echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2
echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2
exit 3
;;
esac
exit 0
#! /bin/sh
### BEGIN INIT INFO
# Provides: octoprint
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: OctoPrint 3D Printer manager
# Description: Starts and stops the OctoPrint service
### END INIT INFO
# PATH should only include /usr/* if it runs after the mountnfs.sh script
PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC="OctoPrint 3D Printer manager"
NAME=octoprint
# The daemon will be run as this user
USER=poe
HOME=$(grep "^$USER:" /etc/passwd | cut -d: -f6)
USER_ID=$(id -u $USER)
GROUP_ID=$(id -g $USER)
# DIR is the octoprint installation directory. Change if necessary.
DIR=/home/poe/OctoPrint/venv/bin/
DAEMON=$DIR$NAME
DAEMON_ARGS="serve"
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME
# Load the VERBOSE setting and other rcS variables
. /lib/init/vars.sh
# Define LSB log_* functions.
# Depend on lsb-base (>= 3.2-14) to ensure that this file is present
# and status_of_proc is working.
. /lib/lsb/init-functions
#
# Function that starts the daemon/service
#
do_start()
{
# Return
# 0 if daemon has been started
# 1 if daemon was already running
# 2 if daemon could not be started
export USER HOME
start-stop-daemon --start --pidfile $PIDFILE --make-pidfile --user $USER --chdir $DIR --exec $DAEMON --test > /dev/null \
|| return 1
start-stop-daemon --start --background --pidfile $PIDFILE --make-pidfile --user $USER --chdir $DIR --chuid $USER_ID:$GROUP_ID --exec $DAEMON -- \
$DAEMON_ARGS \
|| return 2
}
#
# Function that stops the daemon/service
#
do_stop()
{
# Return
# 0 if daemon has been stopped
# 1 if daemon was already stopped
# 2 if daemon could not be stopped
# other if a failure occurred
start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME
RETVAL="$?"
[ "$RETVAL" = 2 ] && return 2
# Wait for children to finish too if this is a daemon that forks
# and if the daemon is only ever run from this initscript.
# If the above conditions are not satisfied then add some other code
# that waits for the process to drop all resources that could be
# needed by services started subsequently. A last resort is to
# sleep for some time.
start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON
[ "$?" = 2 ] && return 2
# Many daemons don't delete their pidfiles when they exit.
rm -f $PIDFILE
return "$RETVAL"
}
#
# Function that sends a SIGHUP to the daemon/service
#
do_reload() {
#
# If the daemon can reload its configuration without
# restarting (for example, when it is sent a SIGHUP),
# then implement that here.
#
start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE --name $NAME
return 0
}
case "$1" in
start)
[ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
do_start
case "$?" in
0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
esac
;;
stop)
[ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
do_stop
case "$?" in
0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
esac
;;
status)
status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
;;
#reload|force-reload)
#
# If do_reload() is not implemented then leave this commented out
# and leave 'force-reload' as an alias for 'restart'.
#
#log_daemon_msg "Reloading $DESC" "$NAME"
#do_reload
#log_end_msg $?
#;;
restart|force-reload)
#
# If the "reload" option is implemented then remove the
# 'force-reload' alias
#
log_daemon_msg "Restarting $DESC" "$NAME"
do_stop
case "$?" in
0|1)
do_start
case "$?" in
0) log_end_msg 0 ;;
1) log_end_msg 1 ;; # Old process is still running
*) log_end_msg 1 ;; # Failed to start
esac
;;
*)
# Failed to stop
log_end_msg 1
;;
esac
;;
*)
#echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2
echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2
exit 3
;;
esac
exit 0
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment