From 7888f7ae6313f08465d3c1425a2eaf0af24cafd4 Mon Sep 17 00:00:00 2001
From: Bob Mottram <bob@freedombone.net>
Date: Thu, 1 Mar 2018 11:45:51 +0000
Subject: [PATCH] Tidying

---
 src/freedombone-app-syncthing | 186 ++++++++-------
 src/freedombone-app-tahoelafs | 319 ++++++++++++-------------
 src/freedombone-app-tox       | 398 ++++++++++++++++---------------
 src/freedombone-app-turtl     | 154 ++++++------
 src/freedombone-app-vim       | 122 +++++-----
 src/freedombone-app-vpn       | 428 +++++++++++++++++-----------------
 6 files changed, 818 insertions(+), 789 deletions(-)

diff --git a/src/freedombone-app-syncthing b/src/freedombone-app-syncthing
index 1cebff14c..7d46f794b 100755
--- a/src/freedombone-app-syncthing
+++ b/src/freedombone-app-syncthing
@@ -66,12 +66,12 @@ function syncthing_create_ids_file {
 
     SYNCTHING_ID=$(cat ~/.syncthing-server-id)
     if [ ! -f $SYNCTHING_CONFIG_FILE ]; then
-        echo $'# Your syncthing configuration file' > $SYNCTHING_CONFIG_FILE
-        echo '#' >> $SYNCTHING_CONFIG_FILE
-        echo $"# The ${PROJECT_NAME} syncthing ID is: $SYNCTHING_ID" >> $SYNCTHING_CONFIG_FILE
-        echo '#' >> $SYNCTHING_CONFIG_FILE
-        echo '# Paste the IDs of your devices below' >> $SYNCTHING_CONFIG_FILE
-        echo '#' >> $SYNCTHING_CONFIG_FILE
+        { echo $'# Your syncthing configuration file';
+          echo '#';
+          echo $"# The ${PROJECT_NAME} syncthing ID is: $SYNCTHING_ID";
+          echo '#';
+          echo '# Paste the IDs of your devices below';
+          echo '#'; } > $SYNCTHING_CONFIG_FILE
     fi
 }
 
@@ -94,12 +94,13 @@ function syncthing_show_id {
     SYNCTHING_ID=$(cat ~/.syncthing-server-id)
     dialog --title $"Device ID for ${PROJECT_NAME}" \
            --backtitle $"Freedombone User Control Panel" \
-           --msgbox $"In a desktop terminal press shift and select the ID below,\nthen right click and copy.\n\nWithin Connectbot select Menu/Copy and then highlight the ID below\n\n$SYNCTHING_ID\n\nAlternatively press Enter to display a QR code which can be scanned." 13 78
+           --msgbox $"In a desktop terminal press shift and select the ID below,\\nthen right click and copy.\\n\\nWithin Connectbot select Menu/Copy and then highlight the ID below\\n\\n$SYNCTHING_ID\\n\\nAlternatively press Enter to display a QR code which can be scanned." 13 78
     clear
     echo $'Your Syncthing ID code'
     echo ''
     echo -n "$SYNCTHING_ID" | qrencode -t UTF8
     echo ''
+    # shellcheck disable=SC2034
     read -n1 -rsp $"Press any key to continue..." key
 }
 
@@ -110,21 +111,24 @@ function syncthing_add_id {
 
     syncthing_create_ids_file
 
-    data=$(tempfile 2>/dev/null)
+    data=$(mktemp 2>/dev/null)
     trap "rm -f $data" 0 1 2 5 15
     dialog --backtitle $"Freedombone User Control Panel" \
            --title $"Add a Syncthing device ID" \
            --form $"Paste the device ID for your laptop/desktop/netbook/phone/tablet below" 9 80 2 \
            $"Device ID:" 1 1 "" 1 26 80 80 \
            $"Description (optional):" 2 1 "" 2 26 80 80 \
-           2> $data
+           2> "$data"
     sel=$?
     case $sel in
-        1) return;;
-        255) return;;
+        1) rm -f "$data"
+           return;;
+        255) rm -f "$data"
+             return;;
     esac
-    SYNCTHING_DEVICE_ID=$(cat $data | sed -n 1p)
-    SYNCTHING_DESCRIPTION=$(cat $data | sed -n 2p)
+    SYNCTHING_DEVICE_ID=$(sed -n 1p < "$data")
+    SYNCTHING_DESCRIPTION=$(sed -n 2p < "$data")
+    rm -f "$data"
 
     if [ ${#SYNCTHING_DEVICE_ID} -lt 10 ]; then
         return
@@ -164,19 +168,21 @@ function syncthing_remove_id {
 
     syncthing_create_ids_file
 
-    data=$(tempfile 2>/dev/null)
-    trap "rm -f $data" 0 1 2 5 15
+    data=$(mktemp 2>/dev/null)
     dialog --backtitle $"Freedombone User Control Panel" \
            --title $"Remove a Syncthing device ID" \
            --form $"Paste the device ID which is to be removed below" 8 80 1 \
            $"Device ID:" 1 1 "" 1 14 80 80 \
-           2> $data
+           2> "$data"
     sel=$?
     case $sel in
-        1) return;;
-        255) return;;
+        1) rm -f "$data"
+           return;;
+        255) rm -f "$data"
+             return;;
     esac
-    SYNCTHING_DEVICE_ID=$(cat $data | sed -n 1p)
+    SYNCTHING_DEVICE_ID=$(sed -n 1p < "$data")
+    rm -f "$data"
 
     if [ ${#SYNCTHING_DEVICE_ID} -lt 10 ]; then
         return
@@ -212,8 +218,7 @@ function run_client_syncthing {
 
     while true
     do
-        data=$(tempfile 2>/dev/null)
-        trap "rm -f $data" 0 1 2 5 15
+        data=$(mktemp 2>/dev/null)
         dialog --backtitle $"Freedombone User Control Panel" \
                --title $"File Synchronization" \
                --radiolist $"Choose an operation:" 12 70 6 \
@@ -221,19 +226,23 @@ function run_client_syncthing {
                2 $"Add an ID for another machine or device" off \
                3 $"Remove an ID for another machine or device" off \
                4 $"Manually edit device IDs" off \
-               5 $"Back to main menu" on 2> $data
+               5 $"Back to main menu" on 2> "$data"
         sel=$?
         case $sel in
-            1) break;;
-            255) break;;
+            1) rm -f "$data"
+               break;;
+            255) rm -f "$data"
+                 break;;
         esac
-        case $(cat $data) in
+        case $(cat "$data") in
             1) syncthing_show_id;;
             2) syncthing_add_id;;
             3) syncthing_remove_id;;
             4) syncthing_manual_edit;;
-            5) break;;
+            5) rm -f "$data"
+               break;;
         esac
+        rm -f "$data"
     done
 }
 
@@ -260,21 +269,21 @@ function backup_local_syncthing {
     for d in /home/*/ ; do
         USERNAME=$(echo "$d" | awk -F '/' '{print $3}')
         if [[ $(is_valid_user "$USERNAME") == "1" ]]; then
-            if [ -d /home/$USERNAME/Sync ]; then
+            if [ -d "/home/$USERNAME/Sync" ]; then
                 echo $"Backing up syncthing files for $USERNAME"
-                backup_directory_to_usb /home/$USERNAME/Sync syncthing/$USERNAME
+                backup_directory_to_usb "/home/$USERNAME/Sync" "syncthing/$USERNAME"
                 # ensure that device IDs will be backed up as part of user config settings
-                if [ ! -d /home/$USERNAME/.config/syncthing ]; then
-                    mkdir -p /home/$USERNAME/.config/syncthing
-                    chown -R $USERNAME:$USERNAME /home/$USERNAME/.config
+                if [ ! -d "/home/$USERNAME/.config/syncthing" ]; then
+                    mkdir -p "/home/$USERNAME/.config/syncthing"
+                    chown -R "$USERNAME":"$USERNAME" "/home/$USERNAME/.config"
                 fi
-                if [ -f /home/$USERNAME/.syncthing-server-id ]; then
-                    cp /home/$USERNAME/.syncthing-server-id /home/$USERNAME/.config/syncthing
-                    chown -R $USERNAME:$USERNAME /home/$USERNAME/.config
+                if [ -f "/home/$USERNAME/.syncthing-server-id" ]; then
+                    cp "/home/$USERNAME/.syncthing-server-id" "/home/$USERNAME/.config/syncthing"
+                    chown -R "$USERNAME":"$USERNAME" "/home/$USERNAME/.config"
                 fi
-                if [ -f /home/$USERNAME/.syncthingids ]; then
-                    cp /home/$USERNAME/.syncthingids /home/$USERNAME/.config/syncthing
-                    chown -R $USERNAME:$USERNAME /home/$USERNAME/.config
+                if [ -f "/home/$USERNAME/.syncthingids" ]; then
+                    cp "/home/$USERNAME/.syncthingids" "/home/$USERNAME/.config/syncthing"
+                    chown -R "$USERNAME":"$USERNAME" "/home/$USERNAME/.config"
                 fi
             fi
         fi
@@ -288,7 +297,7 @@ function restore_local_syncthing {
     fi
 
     temp_restore_dir=/root/tempsyncthing
-    if [ -d $USB_MOUNT/backup/syncthingconfig ]; then
+    if [ -d "$USB_MOUNT/backup/syncthingconfig" ]; then
         echo $"Restoring syncthing configuration"
         function_check restore_directory_from_usb
         restore_directory_from_usb ${temp_restore_dir}config syncthingconfig
@@ -297,9 +306,7 @@ function restore_local_syncthing {
         if [ ! -d $SYNCTHING_CONFIG_PATH ]; then
             mkdir -p $SYNCTHING_CONFIG_PATH
         fi
-        cp -r ${temp_restore_dir}config/* $SYNCTHING_CONFIG_PATH/
-
-        if [ ! "$?" = "0" ]; then
+        if ! cp -r ${temp_restore_dir}config/* $SYNCTHING_CONFIG_PATH/; then
             set_user_permissions
             backup_unmount_drive
             systemctl start syncthing
@@ -309,7 +316,7 @@ function restore_local_syncthing {
         rm -rf ${temp_restore_dir}config
     fi
 
-    if [ -d $USB_MOUNT/backup/syncthingshared ]; then
+    if [ -d "$USB_MOUNT/backup/syncthingshared" ]; then
         echo $"Restoring syncthing shared files"
         restore_directory_from_usb ${temp_restore_dir}shared syncthingshared
         #cp -r ${temp_restore_dir}shared/* /
@@ -321,28 +328,29 @@ function restore_local_syncthing {
         rm -rf ${temp_restore_dir}shared
     fi
 
-    if [ -d $USB_MOUNT/backup/syncthing ]; then
+    if [ -d "$USB_MOUNT/backup/syncthing" ]; then
         for d in $USB_MOUNT/backup/syncthing/*/ ; do
             USERNAME=$(echo "$d" | awk -F '/' '{print $6}')
             if [[ $(is_valid_user "$USERNAME") == "1" ]]; then
-                if [ ! -d /home/$USERNAME ]; then
-                    ${PROJECT_NAME}-adduser $USERNAME
+                if [ ! -d "/home/$USERNAME" ]; then
+                    "${PROJECT_NAME}-adduser" "$USERNAME"
                 fi
                 echo $"Restoring syncthing files for $USERNAME"
-                restore_directory_from_usb ${temp_restore_dir} syncthing/$USERNAME
-                if [ -d ${temp_restore_dir}/home/$USERNAME/Sync ]; then
-                    cp -r ${temp_restore_dir}/home/$USERNAME/Sync /home/$USERNAME/
+                restore_directory_from_usb "${temp_restore_dir}" "syncthing/$USERNAME"
+                if [ -d "${temp_restore_dir}/home/$USERNAME/Sync" ]; then
+                    cp -r "${temp_restore_dir}/home/$USERNAME/Sync" "/home/$USERNAME/"
                 else
-                    if [ ! -d /home/$USERNAME/Sync ]; then
-                        mkdir /home/$USERNAME/Sync
+                    if [ ! -d "/home/$USERNAME/Sync" ]; then
+                        mkdir "/home/$USERNAME/Sync"
                     fi
                     if [ -d /root/Sync ]; then
-                        cp -r /root/Sync/* /home/$USERNAME/Sync/
+                        cp -r /root/Sync/* "/home/$USERNAME/Sync/"
                         rm -rf /root/Sync
                     else
-                        cp -r ${temp_restore_dir}/* /home/$USERNAME/Sync/
+                        cp -r "${temp_restore_dir}/*" "/home/$USERNAME/Sync/"
                     fi
                 fi
+                # shellcheck disable=SC2181
                 if [ ! "$?" = "0" ]; then
                     rm -rf ${temp_restore_dir}
                     set_user_permissions
@@ -354,13 +362,13 @@ function restore_local_syncthing {
                 rm -rf ${temp_restore_dir}
 
                 # restore device IDs from config settings
-                if [ -f /home/$USERNAME/.config/syncthing/.syncthing-server-id ]; then
-                    cp /home/$USERNAME/.config/syncthing/.syncthing-server-id /home/$USERNAME/.syncthing-server-id
-                    chown $USERNAME:$USERNAME /home/$USERNAME/.syncthing-server-id
+                if [ -f "/home/$USERNAME/.config/syncthing/.syncthing-server-id" ]; then
+                    cp "/home/$USERNAME/.config/syncthing/.syncthing-server-id" "/home/$USERNAME/.syncthing-server-id"
+                    chown "$USERNAME":"$USERNAME" "/home/$USERNAME/.syncthing-server-id"
                 fi
-                if [ -f /home/$USERNAME/.config/syncthing/.syncthingids ]; then
-                    cp /home/$USERNAME/.config/syncthing/.syncthingids /home/$USERNAME/.syncthingids
-                    chown $USERNAME:$USERNAME /home/$USERNAME/.syncthingids
+                if [ -f "/home/$USERNAME/.config/syncthing/.syncthingids" ]; then
+                    cp "/home/$USERNAME/.config/syncthing/.syncthingids" "/home/$USERNAME/.syncthingids"
+                    chown "$USERNAME":"$USERNAME" "/home/$USERNAME/.syncthingids"
                 fi
             fi
         done
@@ -389,21 +397,21 @@ function backup_remote_syncthing {
     for d in /home/*/ ; do
         USERNAME=$(echo "$d" | awk -F '/' '{print $3}')
         if [[ $(is_valid_user "$USERNAME") == "1" ]]; then
-            if [ -d /home/$USERNAME/Sync ]; then
+            if [ -d "/home/$USERNAME/Sync" ]; then
                 echo $"Backing up syncthing files for $USERNAME"
-                backup_directory_to_friend /home/$USERNAME/Sync syncthing/$USERNAME
+                backup_directory_to_friend "/home/$USERNAME/Sync" "syncthing/$USERNAME"
                 # ensure that device IDs will be backed up as part of user config settings
-                if [ ! -d /home/$USERNAME/.config/syncthing ]; then
-                    mkdir -p /home/$USERNAME/.config/syncthing
-                    chown -R $USERNAME:$USERNAME /home/$USERNAME/.config
+                if [ ! -d "/home/$USERNAME/.config/syncthing" ]; then
+                    mkdir -p "/home/$USERNAME/.config/syncthing"
+                    chown -R "$USERNAME":"$USERNAME" "/home/$USERNAME/.config"
                 fi
-                if [ -f /home/$USERNAME/.syncthing-server-id ]; then
-                    cp /home/$USERNAME/.syncthing-server-id /home/$USERNAME/.config/syncthing
-                    chown -R $USERNAME:$USERNAME /home/$USERNAME/.config
+                if [ -f "/home/$USERNAME/.syncthing-server-id" ]; then
+                    cp "/home/$USERNAME/.syncthing-server-id" "/home/$USERNAME/.config/syncthing"
+                    chown -R "$USERNAME":"$USERNAME" "/home/$USERNAME/.config"
                 fi
-                if [ -f /home/$USERNAME/.syncthingids ]; then
-                    cp /home/$USERNAME/.syncthingids /home/$USERNAME/.config/syncthing
-                    chown -R $USERNAME:$USERNAME /home/$USERNAME/.config
+                if [ -f "/home/$USERNAME/.syncthingids" ]; then
+                    cp "/home/$USERNAME/.syncthingids" "/home/$USERNAME/.config/syncthing"
+                    chown -R "$USERNAME":"$USERNAME" "/home/$USERNAME/.config"
                 fi
             fi
         fi
@@ -416,7 +424,7 @@ function restore_remote_syncthing {
         systemctl stop cron
     fi
 
-    if [ -d $SERVER_DIRECTORY/backup/syncthingconfig ]; then
+    if [ -d "$SERVER_DIRECTORY/backup/syncthingconfig" ]; then
         echo $"Restoring syncthing configuration"
         temp_restore_dir=/root/tempsyncthingconfig
         function_check restore_directory_from_friend
@@ -425,8 +433,7 @@ function restore_remote_syncthing {
         if [ ! -d $SYNCTHING_CONFIG_PATH ]; then
             mkdir -p $SYNCTHING_CONFIG_PATH
         fi
-        cp -r ${temp_restore_dir}/* $SYNCTHING_CONFIG_PATH/
-        if [ ! "$?" = "0" ]; then
+        if ! cp -r ${temp_restore_dir}/* $SYNCTHING_CONFIG_PATH/; then
             systemctl start syncthing
             systemctl start cron
             exit 6833
@@ -434,7 +441,7 @@ function restore_remote_syncthing {
         rm -rf $temp_restore_dir
     fi
 
-    if [ -d $SERVER_DIRECTORY/backup/syncthingshared ]; then
+    if [ -d "$SERVER_DIRECTORY/backup/syncthingshared" ]; then
         echo $"Restoring syncthing shared files"
         temp_restore_dir=/root/tempsyncthingshared
         function_check restore_directory_from_friend
@@ -446,30 +453,31 @@ function restore_remote_syncthing {
         rm -rf ${temp_restore_dir}
     fi
 
-    if [ -d $SERVER_DIRECTORY/backup/syncthing ]; then
+    if [ -d "$SERVER_DIRECTORY/backup/syncthing" ]; then
         for d in $SERVER_DIRECTORY/backup/syncthing/*/ ; do
             USERNAME=$(echo "$d" | awk -F '/' '{print $6}')
             if [[ $(is_valid_user "$USERNAME") == "1" ]]; then
-                if [ ! -d /home/$USERNAME ]; then
-                    ${PROJECT_NAME}-adduser $USERNAME
+                if [ ! -d "/home/$USERNAME" ]; then
+                    "${PROJECT_NAME}-adduser" "$USERNAME"
                 fi
                 echo $"Restoring syncthing files for $USERNAME"
                 temp_restore_dir=/root/tempsyncthing
                 function_check restore_directory_from_friend
-                restore_directory_from_friend $temp_restore_dir syncthing/$USERNAME
-                if [ -d $temp_restore_dir/home/$USERNAME/Sync ]; then
-                    cp -r $temp_restore_dir/home/$USERNAME/Sync /home/$USERNAME/
+                restore_directory_from_friend "$temp_restore_dir" "syncthing/$USERNAME"
+                if [ -d "$temp_restore_dir/home/$USERNAME/Sync" ]; then
+                    cp -r "$temp_restore_dir/home/$USERNAME/Sync" "/home/$USERNAME/"
                 else
-                    if [ ! -d /home/$USERNAME/Sync ]; then
-                        mkdir /home/$USERNAME/Sync
+                    if [ ! -d "/home/$USERNAME/Sync" ]; then
+                        mkdir "/home/$USERNAME/Sync"
                     fi
                     if [ -d /root/Sync ]; then
-                        cp -r /root/Sync/* /home/$USERNAME/Sync/
+                        cp -r /root/Sync/* "/home/$USERNAME/Sync/"
                         rm -rf /root/Sync
                     else
-                        cp -r ${temp_restore_dir}/* /home/$USERNAME/Sync/
+                        cp -r "${temp_restore_dir}/*" "/home/$USERNAME/Sync/"
                     fi
                 fi
+                # shellcheck disable=SC2181
                 if [ ! "$?" = "0" ]; then
                     rm -rf $temp_restore_dir
                     systemctl start syncthing
@@ -479,13 +487,13 @@ function restore_remote_syncthing {
                 rm -rf $temp_restore_dir
 
                 # restore device IDs from config settings
-                if [ -f /home/$USERNAME/.config/syncthing/.syncthing-server-id ]; then
-                    cp /home/$USERNAME/.config/syncthing/.syncthing-server-id /home/$USERNAME/.syncthing-server-id
-                    chown $USERNAME:$USERNAME /home/$USERNAME/.syncthing-server-id
+                if [ -f "/home/$USERNAME/.config/syncthing/.syncthing-server-id" ]; then
+                    cp "/home/$USERNAME/.config/syncthing/.syncthing-server-id" "/home/$USERNAME/.syncthing-server-id"
+                    chown "$USERNAME":"$USERNAME" "/home/$USERNAME/.syncthing-server-id"
                 fi
-                if [ -f /home/$USERNAME/.config/syncthing/.syncthingids ]; then
-                    cp /home/$USERNAME/.config/syncthing/.syncthingids /home/$USERNAME/.syncthingids
-                    chown $USERNAME:$USERNAME /home/$USERNAME/.syncthingids
+                if [ -f "/home/$USERNAME/.config/syncthing/.syncthingids" ]; then
+                    cp "/home/$USERNAME/.config/syncthing/.syncthingids" "/home/$USERNAME/.syncthingids"
+                    chown "$USERNAME":"$USERNAME" "/home/$USERNAME/.syncthingids"
                 fi
                 echo $"Restore of syncthing files for $USERNAME complete"
             fi
diff --git a/src/freedombone-app-tahoelafs b/src/freedombone-app-tahoelafs
index b8b795d56..f6fcbc9b0 100755
--- a/src/freedombone-app-tahoelafs
+++ b/src/freedombone-app-tahoelafs
@@ -72,52 +72,52 @@ function add_user_tahoelafs {
 
     new_username="$1"
     new_user_password="$2"
-    ${PROJECT_NAME}-pass -u $new_username -a tahoelafs -p "$new_user_password"
+    "${PROJECT_NAME}-pass" -u "$new_username" -a tahoelafs -p "$new_user_password"
     if grep -q "${new_username}:" /etc/nginx/.htpasswd-tahoelafs; then
-        sed -i '/${new_username}:/d' /etc/nginx/.htpasswd-tahoelafs
+        sed -i "'/${new_username}:/d" /etc/nginx/.htpasswd-tahoelafs
     fi
-    echo "${new_user_password}" | htpasswd -i -s /etc/nginx/.htpasswd-tahoelafs ${new_username}
+    echo "${new_user_password}" | htpasswd -i -s /etc/nginx/.htpasswd-tahoelafs "${new_username}"
     echo '0'
 }
 
 function remove_user_tahoelafs {
     remove_username="$1"
-    ${PROJECT_NAME}-pass -u $remove_username --rmapp tahoelafs
+    "${PROJECT_NAME}-pass" -u "$remove_username" --rmapp tahoelafs
     if grep -q "${remove_username}:" /etc/nginx/.htpasswd-tahoelafs; then
-        sed -i '/${remove_username}:/d' /etc/nginx/.htpasswd-tahoelafs
+        sed -i "/${remove_username}:/d" /etc/nginx/.htpasswd-tahoelafs
     fi
 }
 
 function change_password_tahoelafs {
     change_username="$1"
     change_password="$2"
-    ${PROJECT_NAME}-pass -u $change_username -a tahoelafs -p "$change_password"
+    "${PROJECT_NAME}-pass" -u "$change_username" -a tahoelafs -p "$change_password"
     if grep -q "${change_username}:" /etc/nginx/.htpasswd-tahoelafs; then
-        sed -i '/tahoe-${change_username}:/d' /etc/nginx/.htpasswd-tahoelafs
+        sed -i "/tahoe-${change_username}:/d" /etc/nginx/.htpasswd-tahoelafs
     fi
-    echo "${change_password}" | htpasswd -i -s /etc/nginx/.htpasswd-tahoelafs ${change_username}
+    echo "${change_password}" | htpasswd -i -s /etc/nginx/.htpasswd-tahoelafs "${change_username}"
 }
 
 function add_tahoelafs_storage_node_interactive {
-    data=$(tempfile 2>/dev/null)
-    trap "rm -f $data" 0 1 2 5 15
+    data=$(mktemp 2>/dev/null)
     dialog --backtitle $"Freedombone Configuration" \
            --title $"Add Tahoe-LAFS storage node" \
-           --form $"\nEnter the storage node details which can be found on the About screen of another server" 13 75 5 \
+           --form $"\\nEnter the storage node details which can be found on the About screen of another server" 13 75 5 \
            $"Hostname:" 1 1 "" 1 14 53 40 \
            $"Public Key:" 2 1 "" 2 14 53 255 \
            $"Nickname:" 3 1 "" 3 14 53 255 \
            $"FURL:" 4 1 "" 4 14 53 255 \
-           2> $data
+           2> "$data"
     sel=$?
     case $sel in
         1) return;;
         255) return;;
     esac
-    storage_hostname=$(cat $data | sed -n 1p)
-    public_key="$(cat $data | sed -n 2p)"
-    nick=$(cat $data | sed -n 3p)
-    furl=$(cat $data | sed -n 4p)
+    storage_hostname=$(sed -n 1p < "$data")
+    public_key=$(sed -n 2p < "$data")
+    nick=$(sed -n 3p < "$data")
+    furl=$(sed -n 4p < "$data")
+    rm -f "$data"
 
     if [ ${#public_key} -eq 0 ]; then
         return
@@ -142,23 +142,26 @@ function edit_tahoelafs_shares {
     read_config_param TAHOELAFS_SHARES_HAPPY
     read_config_param TAHOELAFS_SHARES_TOTAL
 
-    data=$(tempfile 2>/dev/null)
-    trap "rm -f $data" 0 1 2 5 15
+    data=$(mktemp 2>/dev/null)
     dialog --backtitle $"Freedombone Configuration" \
            --title $"Tahoe-LAFS shares" \
-           --form $"\nEnter the storage node details which can be found on the About screen of another server" 13 40 3 \
+           --form $"\\nEnter the storage node details which can be found on the About screen of another server" 13 40 3 \
            $"Needed:" 1 1 "${TAHOELAFS_SHARES_NEEDED}" 1 14 4 4 \
            $"Happy:" 2 1 "${TAHOELAFS_SHARES_HAPPY}" 2 14 4 4 \
            $"Total:" 3 1 "${TAHOELAFS_SHARES_TOTAL}" 3 14 4 4 \
-           2> $data
+           2> "$data"
     sel=$?
     case $sel in
-        1) return;;
-        255) return;;
+        1) rm -f "$data"
+           return;;
+        255) rm -f "$data"
+             return;;
     esac
-    tl_needed="$(cat $data | sed -n 1p)"
-    tl_happy="$(cat $data | sed -n 2p)"
-    tl_total="$(cat $data | sed -n 3p)"
+    tl_needed=$(sed -n 1p < "$data")
+    tl_happy=$(sed -n 2p < "$data")
+    tl_total=$(sed -n 3p < "$data")
+    rm -f "$data"
+
     if [ ${#tl_needed} -gt 0 ]; then
         TAHOELAFS_SHARES_NEEDED=${tl_needed}
     fi
@@ -185,88 +188,90 @@ function edit_tahoelafs_shares {
 }
 
 function configure_interactive_tahoelafs {
-    data=$(tempfile 2>/dev/null)
-    trap "rm -f $data" 0 1 2 5 15
+    data=$(mktemp 2>/dev/null)
     dialog --backtitle $"Freedombone Configuration" \
            --title $"Tahoe-LAFS" \
            --radiolist $"The least authority is always the best" 11 50 5 \
            1 "Add a storage node" off \
            2 "Manually edit storage nodes" off \
            3 "Shares settings" off \
-           4 "Back to main menu" on 2> $data
+           4 "Back to main menu" on 2> "$data"
     sel=$?
     case $sel in
-        1) exit 1;;
-        255) exit 1;;
+        1) rm -f "$data"
+           exit 1;;
+        255) rm -f "$data"
+             exit 1;;
     esac
-    case $(cat $data) in
+    case $(cat "$data") in
         1) add_tahoelafs_storage_node_interactive;;
         2) edit_tahoelafs_nodes;;
         3) edit_tahoelafs_shares;;
     esac
+    rm -f "$data"
 }
 
 function tahoelafs_setup_client_config {
-    config_file=$1
+    config_file="$1"
     nick="$2"
 
-    echo '[node]' > $config_file
-    echo "nickname = $nick" >> $config_file
-    echo 'reveal-IP-address = false' >> $config_file
-    echo "web.port = tcp:${TAHOELAFS_PORT}:interface=127.0.0.1" >> $config_file
-    echo 'web.static = public_html' >> $config_file
-    echo 'tub.port = disabled' >> $config_file
-    echo 'tub.location = disabled' >> $config_file
-    echo '' >> $config_file
-    echo '[client]' >> $config_file
-    echo 'introducer.furl =' >> $config_file
-    echo "shares.needed = ${TAHOELAFS_SHARES_NEEDED}" >> $config_file
-    echo "shares.happy = ${TAHOELAFS_SHARES_HAPPY}" >> $config_file
-    echo "shares.total = ${TAHOELAFS_SHARES_TOTAL}" >> $config_file
-    echo '' >> $config_file
-    echo '[storage]' >> $config_file
-    echo 'enabled = false' >> $config_file
-    echo 'reserved_space = 3G' >> $config_file
-    echo '' >> $config_file
-    echo '[helper]' >> $config_file
-    echo 'enabled = false' >> $config_file
-    echo '' >> $config_file
-    echo '[connections]' >> $config_file
-    echo 'tcp = tor' >> $config_file
+    { echo '[node]';
+      echo "nickname = $nick";
+      echo 'reveal-IP-address = false';
+      echo "web.port = tcp:${TAHOELAFS_PORT}:interface=127.0.0.1";
+      echo 'web.static = public_html';
+      echo 'tub.port = disabled';
+      echo 'tub.location = disabled';
+      echo '';
+      echo '[client]';
+      echo 'introducer.furl =';
+      echo "shares.needed = ${TAHOELAFS_SHARES_NEEDED}";
+      echo "shares.happy = ${TAHOELAFS_SHARES_HAPPY}";
+      echo "shares.total = ${TAHOELAFS_SHARES_TOTAL}";
+      echo '';
+      echo '[storage]';
+      echo 'enabled = false';
+      echo 'reserved_space = 3G';
+      echo '';
+      echo '[helper]';
+      echo 'enabled = false';
+      echo '';
+      echo '[connections]';
+      echo 'tcp = tor'; } > "$config_file"
 }
 
 function tahoelafs_setup_storage_config {
-    config_file=$1
+    config_file="$1"
     nick="$2"
 
-    echo '[node]' > $config_file
-    echo "nickname = $nick" >> $config_file
-    echo 'reveal-IP-address = false' >> $config_file
-    echo 'web.port =' >> $config_file
-    echo 'web.static = public_html' >> $config_file
-    echo "tub.port = tcp:${TAHOELAFS_STORAGE_ONION_PORT}:interface=127.0.0.1" >> $config_file
-    echo "tub.location = tor:${TAHOELAFS_STORAGE_ONION_HOSTNAME}:${TAHOELAFS_STORAGE_PORT}" >> $config_file
-    echo '' >> $config_file
-    echo '[client]' >> $config_file
-    echo 'introducer.furl =' >> $config_file
-    echo 'helper.furl =' >> $config_file
-    echo '' >> $config_file
-    echo "shares.needed = ${TAHOELAFS_SHARES_NEEDED}" >> $config_file
-    echo "shares.happy = ${TAHOELAFS_SHARES_HAPPY}" >> $config_file
-    echo "shares.total = ${TAHOELAFS_SHARES_TOTAL}" >> $config_file
-    echo '' >> $config_file
-    echo '[storage]' >> $config_file
-    echo 'enabled = true' >> $config_file
-    echo 'reserved_space = 3G' >> $config_file
-    echo 'expire.enabled = true' >> $config_file
-    echo 'expire.mode = age' >> $config_file
-    echo 'expire.override_lease_duration = 3 months' >> $config_file
-    echo '' >> $config_file
-    echo '[helper]' >> $config_file
-    echo 'enabled = false' >> $config_file
-    echo '' >> $config_file
-    echo '[connections]' >> $config_file
-    echo 'tcp = tor' >> $config_file
+    { echo '[node]';
+      echo "nickname = $nick";
+      echo 'reveal-IP-address = false';
+      echo 'web.port =';
+      echo 'web.static = public_html';
+      echo "tub.port = tcp:${TAHOELAFS_STORAGE_ONION_PORT}:interface=127.0.0.1";
+      echo "tub.location = tor:${TAHOELAFS_STORAGE_ONION_HOSTNAME}:${TAHOELAFS_STORAGE_PORT}";
+      echo '';
+      echo '[client]';
+      echo 'introducer.furl =';
+      echo 'helper.furl =';
+      echo '';
+      echo "shares.needed = ${TAHOELAFS_SHARES_NEEDED}";
+      echo "shares.happy = ${TAHOELAFS_SHARES_HAPPY}";
+      echo "shares.total = ${TAHOELAFS_SHARES_TOTAL}";
+      echo '';
+      echo '[storage]';
+      echo 'enabled = true';
+      echo 'reserved_space = 3G';
+      echo 'expire.enabled = true';
+      echo 'expire.mode = age';
+      echo 'expire.override_lease_duration = 3 months';
+      echo '';
+      echo '[helper]';
+      echo 'enabled = false';
+      echo '';
+      echo '[connections]';
+      echo 'tcp = tor'; } > "$config_file"
 
     chown -R tahoelafs:debian-tor $TAHOE_DIR
 }
@@ -304,6 +309,7 @@ function restore_local_tahoelafs {
     else
         cp -r $temp_restore_dir/* $TAHOE_DIR/
     fi
+    # shellcheck disable=SC2181
     if [ ! "$?" = "0" ]; then
         if [ -d ${TAHOE_DIR}-old ]; then
             mv ${TAHOE_DIR}-old $TAHOE_DIR
@@ -346,14 +352,15 @@ function restore_remote_tahoelafs {
     else
         cp -r $temp_restore_dir/* $TAHOE_DIR/
     fi
+    # shellcheck disable=SC2181
     if [ ! "$?" = "0" ]; then
-        if [ -d ${$TAHOE_DIR}-old ]; then
-            mv ${TAHOE_DIR}-old $TAHOE_DIR
+        if [ -d "${TAHOE_DIR}-old" ]; then
+            mv "${TAHOE_DIR}-old" $TAHOE_DIR
         fi
         exit 623925
     fi
-    if [ -d ${$TAHOE_DIR}-old ]; then
-        rm -rf ${$TAHOE_DIR}-old
+    if [ -d "${TAHOE_DIR}-old" ]; then
+        rm -rf "${TAHOE_DIR}-old"
     fi
     rm -rf $temp_restore_dir
     chown -R tahoelafs:debian-tor $TAHOE_DIR
@@ -398,7 +405,7 @@ function remove_tahoelafs {
     remove_completion_param install_tahoelafs
     function_check remove_onion_service
     remove_onion_service tahoelafs ${TAHOELAFS_ONION_PORT}
-    remove_onion_service storage-tahoelafs ${TAHOELAFS_STORAGE_ONION_PORT} $(get_tahoelafs_nick)
+    remove_onion_service storage-tahoelafs ${TAHOELAFS_STORAGE_ONION_PORT} "$(get_tahoelafs_nick)"
     sed -i '/HidServAuth /d' /etc/tor/torrc
 
     groupdel -f tahoelafs
@@ -437,23 +444,23 @@ function create_tahoelafs_stealth_node {
         exit 682362
     fi
 
-    if [ ! -f ${node_dir}/tahoe.cfg ]; then
+    if [ ! -f "${node_dir}/tahoe.cfg" ]; then
         su -c "mkdir ${node_dir}" - tahoelafs
         su -c "$TAHOE_COMMAND create-node -C ${node_dir} --hostname=fixme" - tahoelafs
-        tahoelafs_setup_storage_config ${node_dir}/tahoe.cfg ${node_nick}
+        tahoelafs_setup_storage_config "${node_dir}/tahoe.cfg" "${node_nick}"
     fi
 
-    if [ ! -f ${client_dir}/tahoe.cfg ]; then
+    if [ ! -f "${client_dir}/tahoe.cfg" ]; then
         su -c "mkdir ${client_dir}" - tahoelafs
         su -c "$TAHOE_COMMAND create-client -C ${client_dir}" - tahoelafs
-        tahoelafs_setup_client_config ${client_dir}/tahoe.cfg ${client_nick}
+        tahoelafs_setup_client_config "${client_dir}/tahoe.cfg" "${client_nick}"
     fi
 }
 
 function create_tahoelafs_introducer {
     introducer_dir="$1"
 
-    if [ -f ${introducer_dir}/tahoe.cfg ]; then
+    if [ -f "${introducer_dir}/tahoe.cfg" ]; then
         return
     fi
 
@@ -470,7 +477,7 @@ function create_tahoelafs_storage_node {
         return
     fi
 
-    if [ -f ${node_dir}/tahoe.cfg ]; then
+    if [ -f "${node_dir}/tahoe.cfg" ]; then
         return
     fi
 
@@ -487,15 +494,15 @@ function create_tahoelafs_client {
         return
     fi
 
-    if [ -f ${client_dir}/tahoe.cfg ]; then
+    if [ -f "${client_dir}/tahoe.cfg" ]; then
         return
     fi
 
     su -c "mkdir ${client_dir}" - tahoelafs
     su -c "$TAHOE_COMMAND create-client -C ${client_dir} --introducer=\"$furl\" --listen=tor --hide-ip --hostname=127.0.0.1" - tahoelafs
-    sed -i 's|reveal-IP-address =.*|reveal-IP-address = False|g' $client_dir/tahoe.cfg
-    sed -i 's|tub.port =.*|tub.port = disabled|g' $client_dir/tahoe.cfg
-    sed -i 's|tub.location =.*|tub.location = disabled|g' $client_dir/tahoe.cfg
+    sed -i 's|reveal-IP-address =.*|reveal-IP-address = False|g' "$client_dir/tahoe.cfg"
+    sed -i 's|tub.port =.*|tub.port = disabled|g' "$client_dir/tahoe.cfg"
+    sed -i 's|tub.location =.*|tub.location = disabled|g' "$client_dir/tahoe.cfg"
 }
 
 function get_tahoelafs_furl {
@@ -510,11 +517,11 @@ function get_tahoelafs_nick {
 }
 
 function get_tahoelafs_storage_hostname {
-    echo "$(cat /var/lib/tor/hidden_service_storage-tahoelafs/hostname)"
+    cat /var/lib/tor/hidden_service_storage-tahoelafs/hostname
 }
 
 function get_tahoelafs_public_key {
-    echo "$(cat $TAHOE_DIR/storage/node.pubkey | grep 'v0-' | sed 's|pub-||g')"
+    grep 'v0-' "$TAHOE_DIR/storage/node.pubkey" | sed 's|pub-||g'
 }
 
 function add_tahoelafs_server {
@@ -549,10 +556,10 @@ function add_tahoelafs_server {
         fi
         echo '# storage' >> ${tahoelafs_storage_file}
     fi
-    echo "  ${public_key}:" >> ${tahoelafs_storage_file}
-    echo "    ann:" >> ${tahoelafs_storage_file}
-    echo "      nickname: ${nick}" >> ${tahoelafs_storage_file}
-    echo "      anonymous-storage-FURL: ${furl}" >> ${tahoelafs_storage_file}
+    { echo "  ${public_key}:";
+      echo "    ann:";
+      echo "      nickname: ${nick}";
+      echo "      anonymous-storage-FURL: ${furl}"; } >> "${tahoelafs_storage_file}"
     chown tahoelafs:debian-tor ${tahoelafs_storage_file}
 
     if ! grep -q "HidServAuth ${storage_hostname}" /etc/tor/torrc; then
@@ -566,27 +573,27 @@ function create_tahoelafs_daemon {
     TAHOELAFS_DAEMON_FILE=/etc/systemd/system/tahoelafs-${daemon_name}.service
     echo "Creating daemon: $TAHOELAFS_DAEMON_FILE"
 
-    echo '[Unit]' > $TAHOELAFS_DAEMON_FILE
-    echo "Description=Tahoe-LAFS ${daemon_name}" >> $TAHOELAFS_DAEMON_FILE
-    echo 'After=syslog.target' >> $TAHOELAFS_DAEMON_FILE
-    echo 'After=network.target' >> $TAHOELAFS_DAEMON_FILE
-    echo '' >> $TAHOELAFS_DAEMON_FILE
-    echo '[Service]' >> $TAHOELAFS_DAEMON_FILE
-    echo 'Type=simple' >> $TAHOELAFS_DAEMON_FILE
-    echo "User=tahoelafs" >> $TAHOELAFS_DAEMON_FILE
-    echo "Group=debian-tor" >> $TAHOELAFS_DAEMON_FILE
-    echo "WorkingDirectory=${TAHOE_DIR}" >> $TAHOELAFS_DAEMON_FILE
-    echo "ExecStart=/usr/bin/tahoe run ${TAHOE_DIR}/${daemon_name}" >> $TAHOELAFS_DAEMON_FILE
-    echo "ExecStop=/usr/bin/tahoe stop ${TAHOE_DIR}/${daemon_name}" >> $TAHOELAFS_DAEMON_FILE
-    echo 'Restart=on-failure' >> $TAHOELAFS_DAEMON_FILE
-    echo 'RestartSec=10' >> $TAHOELAFS_DAEMON_FILE
-    echo "Environment=\"USER=tahoelafs\" \"HOME=${TAHOE_DIR}\"" >> $TAHOELAFS_DAEMON_FILE
-    echo '' >> $TAHOELAFS_DAEMON_FILE
-    echo '[Install]' >> $TAHOELAFS_DAEMON_FILE
-    echo 'WantedBy=multi-user.target' >> $TAHOELAFS_DAEMON_FILE
-    systemctl enable tahoelafs-${daemon_name}
+    { echo '[Unit]';
+      echo "Description=Tahoe-LAFS ${daemon_name}";
+      echo 'After=syslog.target';
+      echo 'After=network.target';
+      echo '';
+      echo '[Service]';
+      echo 'Type=simple';
+      echo "User=tahoelafs";
+      echo "Group=debian-tor";
+      echo "WorkingDirectory=${TAHOE_DIR}";
+      echo "ExecStart=/usr/bin/tahoe run ${TAHOE_DIR}/${daemon_name}";
+      echo "ExecStop=/usr/bin/tahoe stop ${TAHOE_DIR}/${daemon_name}";
+      echo 'Restart=on-failure';
+      echo 'RestartSec=10';
+      echo "Environment=\"USER=tahoelafs\" \"HOME=${TAHOE_DIR}\"";
+      echo '';
+      echo '[Install]';
+      echo 'WantedBy=multi-user.target'; } > "$TAHOELAFS_DAEMON_FILE"
+    systemctl enable "tahoelafs-${daemon_name}"
     systemctl daemon-reload
-    systemctl start tahoelafs-${daemon_name}
+    systemctl start "tahoelafs-${daemon_name}"
 }
 
 function create_tahoelafs_web {
@@ -596,44 +603,44 @@ function create_tahoelafs_web {
     TAHOELAFS_LOGIN_TEXT=$'Tahoe-LAFS login'
 
     tahoelafs_nginx_site=/etc/nginx/sites-available/tahoelafs
-    echo 'server {' > $tahoelafs_nginx_site
-    echo "    listen 127.0.0.1:$TAHOELAFS_ONION_PORT default_server;" >> $tahoelafs_nginx_site
-    echo "    server_name $TAHOELAFS_ONION_HOSTNAME;" >> $tahoelafs_nginx_site
-    echo '' >> $tahoelafs_nginx_site
+    { echo 'server {';
+      echo "    listen 127.0.0.1:$TAHOELAFS_ONION_PORT default_server;";
+      echo "    server_name $TAHOELAFS_ONION_HOSTNAME;";
+      echo ''; } > "$tahoelafs_nginx_site"
     function_check nginx_disable_sniffing
     nginx_disable_sniffing tahoelafs
-    echo '' >> $tahoelafs_nginx_site
-    echo '  # Logs' >> $tahoelafs_nginx_site
-    echo '  access_log /dev/null;' >> $tahoelafs_nginx_site
-    echo '  error_log /dev/null;' >> $tahoelafs_nginx_site
-    echo '' >> $tahoelafs_nginx_site
-    echo '  # Root' >> $tahoelafs_nginx_site
-    echo "  root /var/www/tahoelafs/htdocs;" >> $tahoelafs_nginx_site
-    echo '' >> $tahoelafs_nginx_site
-    echo '  location / {' >> $tahoelafs_nginx_site
-    echo "    auth_basic \"${TAHOELAFS_LOGIN_TEXT}\";" >> $tahoelafs_nginx_site
-    echo '    auth_basic_user_file /etc/nginx/.htpasswd-tahoelafs;' >> $tahoelafs_nginx_site
+    { echo '';
+      echo '  # Logs';
+      echo '  access_log /dev/null;';
+      echo '  error_log /dev/null;';
+      echo '';
+      echo '  # Root';
+      echo "  root /var/www/tahoelafs/htdocs;";
+      echo '';
+      echo '  location / {';
+      echo "    auth_basic \"${TAHOELAFS_LOGIN_TEXT}\";";
+      echo '    auth_basic_user_file /etc/nginx/.htpasswd-tahoelafs;'; } >> "$tahoelafs_nginx_site"
     function_check nginx_limits
     nginx_limits tahoelafs '15m'
-    echo '    rewrite /(.*) /$1 break;' >> $tahoelafs_nginx_site
-    echo '    proxy_set_header X-Real-IP $remote_addr;' >> $tahoelafs_nginx_site
-    echo '    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;' >> $tahoelafs_nginx_site
-    echo '    proxy_set_header Host $http_host;' >> $tahoelafs_nginx_site
-    echo '    proxy_set_header X-NginX-Proxy true;' >> $tahoelafs_nginx_site
-    echo "    proxy_pass http://localhost:${TAHOELAFS_PORT};" >> $tahoelafs_nginx_site
-    echo '    proxy_redirect off;' >> $tahoelafs_nginx_site
-    echo '  }' >> $tahoelafs_nginx_site
-    echo '}' >> $tahoelafs_nginx_site
-
-    TAHOELAFS_ADMIN_PASSWORD="$(create_password ${MINIMUM_PASSWORD_LENGTH})"
-    ${PROJECT_NAME}-pass -u $MY_USERNAME -a tahoelafs -p "$TAHOELAFS_ADMIN_PASSWORD"
+    { echo "    rewrite /(.*) /\$1 break;";
+      echo "    proxy_set_header X-Real-IP \$remote_addr;";
+      echo "    proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;";
+      echo "    proxy_set_header Host \$http_host;";
+      echo '    proxy_set_header X-NginX-Proxy true;';
+      echo "    proxy_pass http://localhost:${TAHOELAFS_PORT};";
+      echo '    proxy_redirect off;';
+      echo '  }';
+      echo '}'; } >> "$tahoelafs_nginx_site"
+
+    TAHOELAFS_ADMIN_PASSWORD="$(create_password "${MINIMUM_PASSWORD_LENGTH}")"
+    "${PROJECT_NAME}-pass" -u "$MY_USERNAME" -a tahoelafs -p "$TAHOELAFS_ADMIN_PASSWORD"
     if [ ! -f /etc/nginx/.htpasswd-tahoelafs ]; then
         touch /etc/nginx/.htpasswd-tahoelafs
     fi
     if grep -q "${MY_USERNAME}:" /etc/nginx/.htpasswd-tahoelafs; then
-        sed -i '/${MY_USERNAME}:/d' /etc/nginx/.htpasswd-tahoelafs
+        sed -i "/${MY_USERNAME}:/d" /etc/nginx/.htpasswd-tahoelafs
     fi
-    echo "${TAHOELAFS_ADMIN_PASSWORD}" | htpasswd -i -s /etc/nginx/.htpasswd-tahoelafs ${MY_USERNAME}
+    echo "${TAHOELAFS_ADMIN_PASSWORD}" | htpasswd -i -s /etc/nginx/.htpasswd-tahoelafs "${MY_USERNAME}"
 
     function_check nginx_ensite
     nginx_ensite tahoelafs
@@ -641,7 +648,7 @@ function create_tahoelafs_web {
 }
 
 function install_tahoelafs {
-    if [ $INSTALLING_MESH ]; then
+    if [ "$INSTALLING_MESH" ]; then
         return
     fi
 
@@ -692,7 +699,7 @@ function install_tahoelafs {
     # create an onion address for client node
     TAHOELAFS_ONION_HOSTNAME=$(add_onion_service tahoelafs 80 ${TAHOELAFS_ONION_PORT})
 
-    create_tahoelafs_stealth_node $TAHOE_DIR/storage $TAHOE_DIR/client ${node_nick} ${client_nick}
+    create_tahoelafs_stealth_node "$TAHOE_DIR/storage" "$TAHOE_DIR/client" "${node_nick}" "${client_nick}"
 
     # start the storage node
     su -c "/usr/bin/python2 /usr/bin/tahoe start $TAHOE_DIR/storage" - tahoelafs
diff --git a/src/freedombone-app-tox b/src/freedombone-app-tox
index a9c30633a..3763d6ddb 100755
--- a/src/freedombone-app-tox
+++ b/src/freedombone-app-tox
@@ -74,12 +74,12 @@ function logging_off_tox {
 function remove_user_tox {
     remove_username="$1"
 
-    if [ -d /home/$remove_username/.config/tox ]; then
-        if [ -d /home/$remove_username/.config/tox/chatlogs ]; then
-            shred -zu /home/$remove_username/.config/tox/chatlogs/*
-            rm -rf /home/$remove_username/.config/tox/chatlogs
+    if [ -d "/home/$remove_username/.config/tox" ]; then
+        if [ -d "/home/$remove_username/.config/tox/chatlogs" ]; then
+            shred -zu "/home/$remove_username/.config/tox/chatlogs/*"
+            rm -rf "/home/$remove_username/.config/tox/chatlogs"
         fi
-        shred -zu /home/$remove_username/.config/tox/*
+        shred -zu "/home/$remove_username/.config/tox/*"
     fi
 }
 
@@ -87,27 +87,27 @@ function add_user_tox {
     new_username="$1"
 
     # Note: password isn't used
-    new_user_password="$2"
+    #new_user_password="$2"
 
     USER_TOX_FILE=/home/${new_username}/.config/tox/data.tox
-    if [ ! -f $USER_TOX_FILE ]; then
-        mkdir -p /home/${new_username}/.config/tox
-        chown -R ${new_username}:${new_username} /home/${new_username}/.config
-        su -c "toxid -u ${new_username} -n data" - $new_username
-        su -c "toxid --setuser ${new_username}" - $new_username
+    if [ ! -f "$USER_TOX_FILE" ]; then
+        mkdir -p "/home/${new_username}/.config/tox"
+        chown -R "${new_username}":"${new_username}" "/home/${new_username}/.config"
+        su -c "toxid -u ${new_username} -n data" - "$new_username"
+        su -c "toxid --setuser ${new_username}" - "$new_username"
     fi
 }
 
 function run_client_tox {
     # create a tox user
     USER_TOX_FILE=/home/${USER}/.config/tox/data.tox
-    if [ ! -f $USER_TOX_FILE ]; then
-        mkdir -p /home/${USER}/.config/tox
-        chown -R ${USER}:${USER} /home/${USER}/.config
-        toxid -u ${USER} -n data
-        toxid --setuser ${USER}
+    if [ ! -f "$USER_TOX_FILE" ]; then
+        mkdir -p "/home/${USER}/.config/tox"
+        chown -R "${USER}":"${USER}" "/home/${USER}/.config"
+        toxid -u "${USER}" -n data
+        toxid --setuser "${USER}"
     fi
-    toxic -f $USER_TOX_FILE --force-tcp --SOCKS5-proxy 127.0.0.1 9050
+    toxic -f "$USER_TOX_FILE" --force-tcp --SOCKS5-proxy 127.0.0.1 9050
 }
 
 function install_interactive_tox {
@@ -121,16 +121,17 @@ function configure_interactive_tox {
     fi
     bootstrap_id=$(cat $TOX_BOOTSTRAP_ID_FILE)
     dialog --title $"Tox Bootstrap Node ID" \
-           --msgbox $"\n$bootstrap_id\n\nTo copy this hold down the shift key, select the ID and then right click and copy." 10 70
+           --msgbox $"\\n$bootstrap_id\\n\\nTo copy this hold down the shift key, select the ID and then right click and copy." 10 70
 }
 
 function mesh_tox_qtox {
-    if [ ! ${rootdir}$INSTALL_DIR ]; then
+    # shellcheck disable=SC2154
+    if [ ! "${rootdir}$INSTALL_DIR" ]; then
         INSTALL_DIR=${rootdir}/root/build
     fi
 
-    if [ ! -d ${rootdir}$INSTALL_DIR ]; then
-        mkdir -p ${rootdir}$INSTALL_DIR
+    if [ ! -d "${rootdir}$INSTALL_DIR" ]; then
+        mkdir -p "${rootdir}$INSTALL_DIR"
     fi
 
     chroot "${rootdir}" apt-get -yq install build-essential libatk1.0-0 libbz2-1.0 libc6 libcairo2 libdbus-1-3 libegl1-mesa libfontconfig1 libfreetype6 libgcc1 libgdk-pixbuf2.0-0 libgl1-mesa-glx libglib2.0-0 libgtk2.0-0 libice6 libicu57 libjpeg62-turbo libmng1 libmtdev1 libopenal1 libopus0 libpango-1.0-0 libpangocairo-1.0-0 libpangoft2-1.0-0 libpng16-16 libqrencode3 libsm6 libsodium18 libsqlite3-0 libssl1.1 libstdc++6 libtiff5 libudev1 libvpx4 libwayland-client0 libwayland-cursor0 libwayland-egl1-mesa libwebp6 libx11-6 libx11-xcb1 libxcb-glx0 libxcb-icccm4 libxcb-image0 libxcb-keysyms1 libxcb-randr0 libxcb-render-util0 libxcb-render0 libxcb-shape0 libxcb-shm0 libxcb-sync1 libxcb-xfixes0 libxcb-xinerama0 libxcb1 libxext6 libxfixes3 libxi6 libxrender1 libxss1 zlib1g libopus-dev libvpx-dev
@@ -149,30 +150,30 @@ function mesh_tox_qtox {
     chroot "${rootdir}" apt-get -yq install build-essential cmake ffmpeg libexif-dev libgdk-pixbuf2.0-dev libglib2.0-dev libgtk2.0-dev libopenal-dev libqrencode-dev libqt5opengl5-dev libqt5svg5-dev libsqlcipher-dev libxss-dev pkg-config qrencode qt5-default qt5-qmake qttools5-dev qttools5-dev-tools yasm
 
     if [ -d /repos/qtox ]; then
-        mkdir ${rootdir}$INSTALL_DIR/qtox
-        cp -r -p /repos/qtox/. ${rootdir}$INSTALL_DIR/qtox
-        cd ${rootdir}$INSTALL_DIR/qtox
+        mkdir "${rootdir}$INSTALL_DIR/qtox"
+        cp -r -p /repos/qtox/. "${rootdir}$INSTALL_DIR/qtox"
+        cd "${rootdir}$INSTALL_DIR/qtox" || exit 264826826
         git pull
     else
-        git clone $QTOX_REPO ${rootdir}$INSTALL_DIR/qtox
+        git clone "$QTOX_REPO" "${rootdir}$INSTALL_DIR/qtox"
     fi
 
-    if [ ! -d ${rootdir}$INSTALL_DIR/qtox ]; then
+    if [ ! -d "${rootdir}$INSTALL_DIR/qtox" ]; then
         exit 72428
     fi
-    cd ${rootdir}${INSTALL_DIR}/qtox
+    cd "${rootdir}${INSTALL_DIR}/qtox" || exit 235745728
     git checkout $QTOX_COMMIT -b $QTOX_COMMIT
-    chroot ${rootdir} /bin/bash -x <<EOF
+    chroot "${rootdir}" /bin/bash -x <<EOF
 cd ${INSTALL_DIR}/qtox
 export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig"
 cmake .
 make
 make install
 EOF
-    if [ ! -f ${rootdir}/usr/local/bin/qtox ]; then
+    if [ ! -f "${rootdir}/usr/local/bin/qtox" ]; then
         exit 75784
     fi
-    cp ${rootdir}/usr/local/bin/qtox ${rootdir}/usr/bin/qtox
+    cp "${rootdir}/usr/local/bin/qtox" "${rootdir}/usr/bin/qtox"
 }
 
 function reconfigure_tox {
@@ -181,9 +182,9 @@ function reconfigure_tox {
 
 function upgrade_tox {
     function_check set_repo_commit
-    set_repo_commit $INSTALL_DIR/toxcore "toxcore commit" "$TOXCORE_COMMIT" $TOXCORE_REPO
-    if [[ $(commit_has_changed $INSTALL_DIR/toxcore "toxcore commit" "$TOXCORE_COMMIT") == "1" ]]; then
-        cd $INSTALL_DIR/toxcore
+    set_repo_commit "$INSTALL_DIR/toxcore" "toxcore commit" "$TOXCORE_COMMIT" $TOXCORE_REPO
+    if [[ $(commit_has_changed "$INSTALL_DIR/toxcore" "toxcore commit" "$TOXCORE_COMMIT") == "1" ]]; then
+        cd "$INSTALL_DIR/toxcore" || exit 53683563
         sed -i 's|ExecStart=.*|ExecStart=/usr/local/bin/tox-bootstrapd --config /etc/tox-bootstrapd.conf|g' $rootdir/etc/systemd/system/tox-bootstrapd.service
         autoreconf -i
         ./configure --enable-daemon
@@ -194,9 +195,9 @@ function upgrade_tox {
     fi
 
     function_check set_repo_commit
-    set_repo_commit $INSTALL_DIR/toxic "Toxic commit" "$TOXIC_COMMIT" $TOXIC_REPO
-    if [[ $(commit_has_changed $INSTALL_DIR/toxic "Toxic commit" "$TOXIC_COMMIT") == "1" ]]; then
-        cd $INSTALL_DIR/toxic
+    set_repo_commit "$INSTALL_DIR/toxic" "Toxic commit" "$TOXIC_COMMIT" $TOXIC_REPO
+    if [[ $(commit_has_changed "$INSTALL_DIR/toxic" "Toxic commit" "$TOXIC_COMMIT") == "1" ]]; then
+        cd "$INSTALL_DIR/toxic" || exit 4684618
         make
         make install
     fi
@@ -221,12 +222,11 @@ function backup_local_tox {
 }
 
 function restore_local_tox {
-    if [ -d $USB_MOUNT/backup/tox ]; then
+    if [ -d "$USB_MOUNT/backup/tox" ]; then
         echo $"Restoring Tox node settings"
         function_check restore_directory_from_usb
         #restore_directory_from_usb / tox
-        restore_directory_from_usb /var/lib/tox-bootstrapd tox
-        if [ ! "$?" = "0" ]; then
+        if ! restore_directory_from_usb /var/lib/tox-bootstrapd tox; then
             function_check set_user_permissions
             set_user_permissions
             function_check backup_unmount_drive
@@ -234,8 +234,7 @@ function restore_local_tox {
             exit 6393
         fi
         cp /var/lib/tox-bootstrapd/tox-bootstrapd.conf /etc/tox-bootstrapd.conf
-        systemctl restart tox-bootstrapd.service
-        if [ ! "$?" = "0" ]; then
+        if ! systemctl restart tox-bootstrapd.service; then
             systemctl status tox-bootstrapd.service
             function_check set_user_permissions
             set_user_permissions
@@ -259,17 +258,15 @@ function backup_remote_tox {
 }
 
 function restore_remote_tox {
-    if [ -d $SERVER_DIRECTORY/backup/tox ]; then
+    if [ -d "$SERVER_DIRECTORY/backup/tox" ]; then
         echo $"Restoring Tox node settings"
         function_check restore_directory_from_friend
         #restore_directory_from_friend / tox
-        restore_directory_from_friend /var/lib/tox-bootstrapd tox
-        if [ ! "$?" = "0" ]; then
+        if ! restore_directory_from_friend /var/lib/tox-bootstrapd tox; then
             exit 93653
         fi
         cp /var/lib/tox-bootstrapd/tox-bootstrapd.conf /etc/tox-bootstrapd.conf
-        systemctl restart tox-bootstrapd.service
-        if [ ! "$?" = "0" ]; then
+        if ! systemctl restart tox-bootstrapd.service; then
             systemctl status tox-bootstrapd.service
             exit 59369
         fi
@@ -283,8 +280,7 @@ function remove_tox_node {
     function_check remove_onion_service
     remove_onion_service tox ${TOX_PORT}
 
-    ${PROJECT_NAME}-mesh-install -f tox_node --remove yes
-    if [ ! "$?" = "0" ]; then
+    if ! "${PROJECT_NAME}-mesh-install" -f tox_node --remove yes; then
         echo $'Failed to remove tox node'
         exit 763836
     fi
@@ -293,21 +289,20 @@ function remove_tox_node {
 }
 
 function remove_tox_avahi {
-    cd $INSTALL_DIR/toxid
+    cd "$INSTALL_DIR/toxid" || exit 82456275
     make uninstall
-    rm -rf $INSTALL_DIR/toxid
-    sed -i '/tox_avahi/d' $COMPLETION_FILE
+    rm -rf "$INSTALL_DIR/toxid"
+    sed -i '/tox_avahi/d' "$COMPLETION_FILE"
 }
 
 function remove_tox_client {
-    ${PROJECT_NAME}-mesh-install -f tox_client --remove yes
-    if [ ! "$?" = "0" ]; then
+    if ! "${PROJECT_NAME}-mesh-install" -f tox_client --remove yes; then
         echo $'Could not remove Tox client'
         exit 737253
     fi
-    sed -i '/install_tox_client/d' $COMPLETION_FILE
-    sed -i '/Tox /d' $COMPLETION_FILE
-    sed -i '/Toxic /d' $COMPLETION_FILE
+    sed -i '/install_tox_client/d' "$COMPLETION_FILE"
+    sed -i '/Tox /d' "$COMPLETION_FILE"
+    sed -i '/Toxic /d' "$COMPLETION_FILE"
 }
 
 function remove_tox {
@@ -317,7 +312,7 @@ function remove_tox {
 }
 
 function configure_firewall_for_tox {
-    if [ ! $INSTALLING_MESH ]; then
+    if [ ! "$INSTALLING_MESH" ]; then
         if [[ $(is_completed "${FUNCNAME[0]}") == "1" ]]; then
             return
         fi
@@ -331,16 +326,16 @@ function configure_firewall_for_tox {
         return
     fi
 
-    TOX_PORT_MAIN=$(cat /usr/share/${PROJECT_NAME}/apps/${PROJECT_NAME}-app-tox | grep "TOX_PORT=" | head -n 1 | awk -F '=' '{print $2}')
+    TOX_PORT_MAIN=$(grep "TOX_PORT=" "/usr/share/${PROJECT_NAME}/apps/${PROJECT_NAME}-app-tox" | head -n 1 | awk -F '=' '{print $2}')
     if [ ${#TOX_PORT_MAIN} -gt 2 ]; then
         TOX_PORT=$TOX_PORT_MAIN
     fi
-    if [ ! $TOX_PORT ]; then
+    if [ ! "$TOX_PORT" ]; then
         echo $'No Tox port was specified'
         exit 32856
     fi
 
-    firewall_add Tox ${TOX_PORT}
+    firewall_add Tox "${TOX_PORT}"
     mark_completed "${FUNCNAME[0]}"
 }
 
@@ -355,24 +350,23 @@ function tox_avahi {
     fi
 
     # install a command to obtain the Tox ID
-    cd $INSTALL_DIR
+    cd "$INSTALL_DIR" || exit 131497953
 
     if [ -d /repos/toxid ]; then
-        mkdir $INSTALL_DIR/toxid
-        cp -r -p /repos/toxid/. $INSTALL_DIR/toxid
-        cd $INSTALL_DIR/toxid
+        mkdir "$INSTALL_DIR/toxid"
+        cp -r -p /repos/toxid/. "$INSTALL_DIR/toxid"
+        cd "$INSTALL_DIR/toxid" || exit 468276424526
         git pull
     else
         function_check git_clone
-        git_clone $TOXID_REPO $INSTALL_DIR/toxid
+        git_clone "$TOXID_REPO" "$INSTALL_DIR/toxid"
     fi
 
-    if [ ! -d $INSTALL_DIR/toxid ]; then
+    if [ ! -d "$INSTALL_DIR/toxid" ]; then
         exit 63921
     fi
-    cd $INSTALL_DIR/toxid
-    make
-    if [ ! "$?" = "0" ]; then
+    cd "$INSTALL_DIR/toxid" || exit 4782462846
+    if ! make; then
         exit 58432
     fi
     make install
@@ -399,13 +393,13 @@ function install_tox_node {
     mesh_tox_node
 
     # onion address for bootstrapping
-    TOX_ONION_HOSTNAME=$(add_onion_service tox ${TOX_PORT} ${TOX_PORT})
+    add_onion_service tox "${TOX_PORT}" "${TOX_PORT}"
 
     systemctl restart tox-bootstrapd.service
 
     sleep 3
 
-    TOX_PUBLIC_KEY=$(cat /var/log/syslog | grep tox | grep "Public Key" | tail -n 1 | awk -F ' ' '{print $8}')
+    TOX_PUBLIC_KEY=$(grep tox /var/log/syslog | grep "Public Key" | tail -n 1 | awk -F ' ' '{print $8}')
     if [ ${#TOX_PUBLIC_KEY} -lt 30 ]; then
         echo $'Could not obtain the tox node public key'
         exit 6529
@@ -435,58 +429,58 @@ function install_tox_client {
 
 function mesh_tox_node {
     # obtain commits from the main file
-    TOXCORE_COMMIT_MAIN=$(cat /usr/share/${PROJECT_NAME}/apps/${PROJECT_NAME}-app-tox | grep "TOXCORE_COMMIT=" | head -n 1 | awk -F "'" '{print $2}')
+    TOXCORE_COMMIT_MAIN=$(grep "TOXCORE_COMMIT=" "/usr/share/${PROJECT_NAME}/apps/${PROJECT_NAME}-app-tox" | head -n 1 | awk -F "'" '{print $2}')
     if [ ${#TOXCORE_COMMIT_MAIN} -gt 10 ]; then
         TOXCORE_COMMIT=$TOXCORE_COMMIT_MAIN
     fi
-    if [ ! $TOXCORE_COMMIT ]; then
+    if [ ! "$TOXCORE_COMMIT" ]; then
         echo $'No Tox commit was specified'
         exit 76325
     fi
 
-    TOXID_REPO_MAIN=$(cat /usr/share/${PROJECT_NAME}/apps/${PROJECT_NAME}-app-tox | grep "TOXID_REPO=" | head -n 1 | awk -F '"' '{print $2}')
+    TOXID_REPO_MAIN=$(grep "TOXID_REPO=" "/usr/share/${PROJECT_NAME}/apps/${PROJECT_NAME}-app-tox" | head -n 1 | awk -F '"' '{print $2}')
     if [ ${#TOXID_REPO_MAIN} -gt 5 ]; then
         TOXID_REPO=$TOXID_REPO_MAIN
     fi
-    if [ ! $TOXID_REPO ]; then
+    if [ ! "$TOXID_REPO" ]; then
         echo $'No ToxID repo was specified'
         exit 78252
     fi
 
-    TOX_PORT_MAIN=$(cat /usr/share/${PROJECT_NAME}/apps/${PROJECT_NAME}-app-tox | grep "TOX_PORT=" | head -n 1 | awk -F '=' '{print $2}')
+    TOX_PORT_MAIN=$(grep "TOX_PORT=" "/usr/share/${PROJECT_NAME}/apps/${PROJECT_NAME}-app-tox" | head -n 1 | awk -F '=' '{print $2}')
     if [ ${#TOX_PORT_MAIN} -gt 2 ]; then
         TOX_PORT=$TOX_PORT_MAIN
     fi
-    if [ ! $TOX_PORT ]; then
+    if [ ! "$TOX_PORT" ]; then
         echo $'No Tox port was specified'
         exit 32856
     fi
 
-    TOXCORE_REPO_MAIN=$(cat /usr/share/${PROJECT_NAME}/apps/${PROJECT_NAME}-app-tox | grep "TOXCORE_REPO=" | head -n 1 | awk -F '"' '{print $2}')
+    TOXCORE_REPO_MAIN=$(grep "TOXCORE_REPO=" "/usr/share/${PROJECT_NAME}/apps/${PROJECT_NAME}-app-tox" | head -n 1 | awk -F '"' '{print $2}')
     if [ ${#TOXCORE_REPO_MAIN} -gt 10 ]; then
         TOXCORE_REPO=$TOXCORE_REPO_MAIN
     fi
-    if [ ! $TOXCORE_REPO ]; then
+    if [ ! "$TOXCORE_REPO" ]; then
         echo $'No Tox repo was specified'
         exit 16865
     fi
 
-    if [ ! $TOXCORE_COMMIT ]; then
+    if [ ! "$TOXCORE_COMMIT" ]; then
         echo $'No Tox commit was specified'
         exit 76325
     fi
 
-    if [ ! $TOXCORE_REPO ]; then
+    if [ ! "$TOXCORE_REPO" ]; then
         echo $'No Tox repo was specified'
         exit 16865
     fi
 
-    if [ $rootdir ]; then
-        chroot ${rootdir} apt-get -yq install build-essential libtool autotools-dev
-        chroot ${rootdir} apt-get -yq install automake checkinstall check git yasm
-        chroot ${rootdir} apt-get -yq install libsodium18 libsodium-dev libcap2-bin
-        chroot ${rootdir} apt-get -yq install libconfig9 libconfig-dev autoconf
-        chroot ${rootdir} apt-get -yq install libopus-dev libvpx-dev
+    if [ "$rootdir" ]; then
+        chroot "${rootdir}" apt-get -yq install build-essential libtool autotools-dev
+        chroot "${rootdir}" apt-get -yq install automake checkinstall check git yasm
+        chroot "${rootdir}" apt-get -yq install libsodium18 libsodium-dev libcap2-bin
+        chroot "${rootdir}" apt-get -yq install libconfig9 libconfig-dev autoconf
+        chroot "${rootdir}" apt-get -yq install libopus-dev libvpx-dev
     else
         apt-get -yq install build-essential libtool autotools-dev
         apt-get -yq install automake checkinstall check git yasm
@@ -495,27 +489,26 @@ function mesh_tox_node {
         apt-get -yq install libopus-dev libvpx-dev
     fi
 
-    if [ ! -d ${rootdir}${INSTALL_DIR} ]; then
-        mkdir -p ${rootdir}${INSTALL_DIR}
+    if [ ! -d "${rootdir}${INSTALL_DIR}" ]; then
+        mkdir -p "${rootdir}${INSTALL_DIR}"
     fi
-    if [ ! -d ${rootdir}${INSTALL_DIR}/toxcore ]; then
+    if [ ! -d "${rootdir}${INSTALL_DIR}/toxcore" ]; then
         if [ -d /repos/toxcore ]; then
-            mkdir ${rootdir}${INSTALL_DIR}/toxcore
-            cp -r -p /repos/toxcore/. ${rootdir}${INSTALL_DIR}/toxcore
-            cd ${rootdir}${INSTALL_DIR}/toxcore
+            mkdir "${rootdir}${INSTALL_DIR}/toxcore"
+            cp -r -p /repos/toxcore/. "${rootdir}${INSTALL_DIR}/toxcore"
+            cd "${rootdir}${INSTALL_DIR}/toxcore" || exit 2468246284
             git pull
         else
-            git clone ${TOXCORE_REPO} ${rootdir}${INSTALL_DIR}/toxcore
-            if [ ! "$?" = "0" ]; then
-                exit 429252
+            if ! git clone "${TOXCORE_REPO}" "${rootdir}${INSTALL_DIR}/toxcore"; then
+                exit 4292521
             fi
         fi
     fi
-    cd ${rootdir}$INSTALL_DIR/toxcore
-    git checkout $TOXCORE_COMMIT -b $TOXCORE_COMMIT
+    cd "${rootdir}$INSTALL_DIR/toxcore" || exit 46824624
+    git checkout "$TOXCORE_COMMIT" -b "$TOXCORE_COMMIT"
 
-    if [ ${rootdir} ]; then
-        chroot ${rootdir} /bin/bash -x <<EOF
+    if [ "${rootdir}" ]; then
+        chroot "${rootdir}" /bin/bash -x <<EOF
 cd ${INSTALL_DIR}/toxcore
 autoreconf -i
 ./configure --enable-daemon
@@ -532,28 +525,28 @@ make install
 EOF
     fi
 
-    cp $rootdir/usr/local/lib/libtoxcore* $rootdir/usr/lib/
-    cp ${rootdir}${INSTALL_DIR}/toxcore/other/bootstrap_daemon/tox-bootstrapd.service $rootdir/etc/systemd/system/
-    sed -i 's|ExecStart=.*|ExecStart=/usr/local/bin/tox-bootstrapd --config /etc/tox-bootstrapd.conf|g' $rootdir/etc/systemd/system/tox-bootstrapd.service
-    if [ ${rootdir} ]; then
-        chroot ${rootdir} systemctl enable tox-bootstrapd.service
+    cp "$rootdir/usr/local/lib/libtoxcore*" "$rootdir/usr/lib/"
+    cp "${rootdir}${INSTALL_DIR}/toxcore/other/bootstrap_daemon/tox-bootstrapd.service" "$rootdir/etc/systemd/system/"
+    sed -i 's|ExecStart=.*|ExecStart=/usr/local/bin/tox-bootstrapd --config /etc/tox-bootstrapd.conf|g' "$rootdir/etc/systemd/system/tox-bootstrapd.service"
+    if [ "${rootdir}" ]; then
+        chroot "${rootdir}" systemctl enable tox-bootstrapd.service
     else
         systemctl enable tox-bootstrapd.service
     fi
 
     SECONDS=0
-    if [ ! -f $rootdir/usr/local/bin/tox-bootstrapd ]; then
+    if [ ! -f "$rootdir/usr/local/bin/tox-bootstrapd" ]; then
         duration=$SECONDS
-        echo $"Toxcore compile failed at $(($duration / 60)) minutes and $(($duration % 60)) seconds elapsed."
+        echo $"Toxcore compile failed at $((duration / 60)) minutes and $((duration % 60)) seconds elapsed."
         echo $'Unable to make toxcore'
         exit 73835
     fi
     duration=$SECONDS
-    echo $"Toxcore compile $(($duration / 60)) minutes and $(($duration % 60)) seconds elapsed."
+    echo $"Toxcore compile $((duration / 60)) minutes and $((duration % 60)) seconds elapsed."
 
-    if [ ${rootdir} ]; then
-        chroot ${rootdir} /usr/sbin/useradd --home-dir /var/lib/tox-bootstrapd --create-home --system --shell /sbin/nologin --comment $"Account to run Tox's DHT bootstrap daemon" --user-group tox-bootstrapd
-        chroot ${rootdir} /bin/chmod 700 /var/lib/tox-bootstrapd
+    if [ "${rootdir}" ]; then
+        chroot "${rootdir}" /usr/sbin/useradd --home-dir /var/lib/tox-bootstrapd --create-home --system --shell /sbin/nologin --comment $"Account to run Tox's DHT bootstrap daemon" --user-group tox-bootstrapd
+        chroot "${rootdir}" /bin/chmod 700 /var/lib/tox-bootstrapd
     else
         chmod 600 /etc/shadow
         chmod 600 /etc/gshadow
@@ -564,87 +557,89 @@ EOF
     fi
 
     # remove Maildir
-    if [ -d $rootdir/var/lib/tox-bootstrapd/Maildir ]; then
-        rm -rf $rootdir/var/lib/tox-bootstrapd/Maildir
+    if [ -d "$rootdir/var/lib/tox-bootstrapd/Maildir" ]; then
+        rm -rf "$rootdir/var/lib/tox-bootstrapd/Maildir"
     fi
 
     # create configuration file
     TOX_BOOTSTRAP_CONFIG=$rootdir/etc/tox-bootstrapd.conf
-    echo "port = $TOX_PORT" > $TOX_BOOTSTRAP_CONFIG
-    echo 'keys_file_path = "/var/lib/tox-bootstrapd/keys"' >> $TOX_BOOTSTRAP_CONFIG
-    echo 'pid_file_path = "/var/run/tox-bootstrapd/tox-bootstrapd.pid"' >> $TOX_BOOTSTRAP_CONFIG
-    echo 'enable_ipv6 = true' >> $TOX_BOOTSTRAP_CONFIG
-    echo 'enable_ipv4_fallback = true' >> $TOX_BOOTSTRAP_CONFIG
-    echo 'enable_lan_discovery = true' >> $TOX_BOOTSTRAP_CONFIG
-    echo 'enable_tcp_relay = true' >> $TOX_BOOTSTRAP_CONFIG
-    echo "tcp_relay_ports = [443, 3389, $TOX_PORT]" >> $TOX_BOOTSTRAP_CONFIG
-    echo 'enable_motd = true' >> $TOX_BOOTSTRAP_CONFIG
-    echo 'motd = "tox-bootstrapd"' >> $TOX_BOOTSTRAP_CONFIG
+    { echo "port = $TOX_PORT";
+      echo 'keys_file_path = "/var/lib/tox-bootstrapd/keys"';
+      echo 'pid_file_path = "/var/run/tox-bootstrapd/tox-bootstrapd.pid"';
+      echo 'enable_ipv6 = true';
+      echo 'enable_ipv4_fallback = true';
+      echo 'enable_lan_discovery = true';
+      echo 'enable_tcp_relay = true';
+      echo "tcp_relay_ports = [443, 3389, $TOX_PORT]";
+      echo 'enable_motd = true';
+      echo 'motd = "tox-bootstrapd"'; } > "$TOX_BOOTSTRAP_CONFIG"
 
     if [ $TOX_NODES ]; then
-        echo 'bootstrap_nodes = (' >> $TOX_BOOTSTRAP_CONFIG
+        echo 'bootstrap_nodes = (' >> "$TOX_BOOTSTRAP_CONFIG"
         toxcount=0
         while [ "x${TOX_NODES[toxcount]}" != "x" ]
         do
-            toxval_ipv4=$(echo $TOX_NODES[toxcount] | awk -F ',' '{print $1}')
-            toxval_ipv6=$(echo $TOX_NODES[toxcount] | awk -F ',' '{print $2}')
-            toxval_port=$(echo $TOX_NODES[toxcount] | awk -F ',' '{print $3}')
-            toxval_pubkey=$(echo $TOX_NODES[toxcount] | awk -F ',' '{print $4}')
-            toxval_maintainer=$(echo $TOX_NODES[toxcount] | awk -F ',' '{print $5}')
-            echo "{ // $toxval_maintainer" >> $TOX_BOOTSTRAP_CONFIG
+            # shellcheck disable=SC2102
+            nodes_str=$(echo $TOX_NODES[toxcount])
+            toxval_ipv4=$(awk "$nodes_str" -F ',' '{print $1}')
+            toxval_ipv6=$(awk "$nodes_str" -F ',' '{print $2}')
+            toxval_port=$(awk "$nodes_str" -F ',' '{print $3}')
+            toxval_pubkey=$(awk "$nodes_str" -F ',' '{print $4}')
+            toxval_maintainer=$(awk "$nodes_str" -F ',' '{print $5}')
+            echo "{ // $toxval_maintainer" >> "$TOX_BOOTSTRAP_CONFIG"
             if [[ $toxval_ipv6 != 'NONE' ]]; then
-                echo "  address = \"$toxval_ipv6\"" >> $TOX_BOOTSTRAP_CONFIG
+                echo "  address = \"$toxval_ipv6\"" >> "$TOX_BOOTSTRAP_CONFIG"
             else
-                echo "  address = \"$toxval_ipv4\"" >> $TOX_BOOTSTRAP_CONFIG
+                echo "  address = \"$toxval_ipv4\"" >> "$TOX_BOOTSTRAP_CONFIG"
             fi
-            echo "  port = $toxval_port" >> $TOX_BOOTSTRAP_CONFIG
-            echo "  public_key = \"$toxval_pubkey\"" >> $TOX_BOOTSTRAP_CONFIG
-            toxcount=$(( $toxcount + 1 ))
+            echo "  port = $toxval_port" >> "$TOX_BOOTSTRAP_CONFIG"
+            echo "  public_key = \"$toxval_pubkey\"" >> "$TOX_BOOTSTRAP_CONFIG"
+            toxcount=$((toxcount + 1))
             if [ "x${TOX_NODES[toxcount]}" != "x" ]; then
-                echo "}," >> $TOX_BOOTSTRAP_CONFIG
+                echo "}," >> "$TOX_BOOTSTRAP_CONFIG"
             else
-                echo "}" >> $TOX_BOOTSTRAP_CONFIG
+                echo "}" >> "$TOX_BOOTSTRAP_CONFIG"
             fi
         done
-        echo ')' >> $TOX_BOOTSTRAP_CONFIG
+        echo ')' >> "$TOX_BOOTSTRAP_CONFIG"
     fi
 
-    if [ -f $rootdir/var/lib/tox-bootstrapd/keys ]; then
-        chmod 700 $rootdir/var/lib/tox-bootstrapd/keys
+    if [ -f "$rootdir/var/lib/tox-bootstrapd/keys" ]; then
+        chmod 700 "$rootdir/var/lib/tox-bootstrapd/keys"
     fi
 }
 
 function mesh_tox_avahi {
-    if [ ! -d $rootdir/etc/avahi ]; then
+    if [ ! -d "$rootdir/etc/avahi" ]; then
         echo $'tox_avahi: avahi is not installed'
         exit 87359
     fi
 
-    if [ ! $TOXID_REPO ]; then
+    if [ ! "$TOXID_REPO" ]; then
         echo $'No ToxID repo was specified'
         exit 78252
     fi
 
-    if [ ! -d ${rootdir}${INSTALL_DIR} ]; then
-        mkdir -p ${rootdir}${INSTALL_DIR}
+    if [ ! -d "${rootdir}${INSTALL_DIR}" ]; then
+        mkdir -p "${rootdir}${INSTALL_DIR}"
     fi
 
     if [ -d /repos/toxid ]; then
-        mkdir ${rootdir}${INSTALL_DIR}/toxid
-        cp -r -p /repos/toxid/. ${rootdir}${INSTALL_DIR}/toxid
-        cd ${rootdir}${INSTALL_DIR}/toxid
+        mkdir "${rootdir}${INSTALL_DIR}/toxid"
+        cp -r -p /repos/toxid/. "${rootdir}${INSTALL_DIR}/toxid"
+        cd "${rootdir}${INSTALL_DIR}/toxid" || exit 2468246
         git pull
     else
-        git clone ${TOXID_REPO} ${rootdir}${INSTALL_DIR}/toxid
+        git clone "${TOXID_REPO}" "${rootdir}${INSTALL_DIR}/toxid"
     fi
 
-    if [ ! -d ${rootdir}${INSTALL_DIR}/toxid ]; then
+    if [ ! -d "${rootdir}${INSTALL_DIR}/toxid" ]; then
         echo $'Unable to clone toxid repo'
         exit 768352
     fi
 
-    if [ ${rootdir} ]; then
-        chroot ${rootdir} /bin/bash -x <<EOF
+    if [ "${rootdir}" ]; then
+        chroot "${rootdir}" /bin/bash -x <<EOF
 cd ${INSTALL_DIR}/toxid
 make
 make install
@@ -657,45 +652,46 @@ make install
 EOF
     fi
 
-    if [ ! -f $rootdir/usr/local/bin/toxid ]; then
+    if [ ! -f "$rootdir/usr/local/bin/toxid" ]; then
         echo $'toxid not found'
         exit 74370
     fi
-    if [ ! -f $rootdir/usr/local/bin/toxavahi ]; then
+    if [ ! -f "$rootdir/usr/local/bin/toxavahi" ]; then
         exit 3621729
     fi
 
     MESH_SYNC_COMMAND=$rootdir/usr/bin/mesh-sync
-    echo '#!/bin/bash' > $MESH_SYNC_COMMAND
-    echo '/usr/local/bin/toxavahi 2> /dev/null' >> $MESH_SYNC_COMMAND
-    echo '/usr/local/bin/meshavahi 2> /dev/null' >> $MESH_SYNC_COMMAND
-    chmod +x $MESH_SYNC_COMMAND
+    { echo '#!/bin/bash';
+      echo '/usr/local/bin/toxavahi 2> /dev/null';
+      echo '/usr/local/bin/meshavahi 2> /dev/null'; } > "$MESH_SYNC_COMMAND"
+    chmod +x "$MESH_SYNC_COMMAND"
 
-    if ! grep -q "mesh-sync" ${rootdir}/etc/crontab; then
-        echo "*/1            * *   *   *   root /usr/bin/mesh-sync 2> /dev/null" >> ${rootdir}/etc/crontab
-        echo "*/1            * *   *   *   root ( sleep 20 ; /usr/bin/mesh-sync 2> /dev/null )" >> ${rootdir}/etc/cro        echo "*/1            * *   *   *   root ( sleep 40 ; /usr/bin/mesh-sync 2> /dev/null )" >> ${rootdir}/etc/crontab
+    if ! grep -q "mesh-sync" "${rootdir}/etc/crontab"; then
+        { echo "*/1            * *   *   *   root /usr/bin/mesh-sync 2> /dev/null";
+          echo "*/1            * *   *   *   root ( sleep 20 ; /usr/bin/mesh-sync 2> /dev/null )";
+          echo "*/1            * *   *   *   root ( sleep 40 ; /usr/bin/mesh-sync 2> /dev/null )"; } >> "${rootdir}/etc/crontab"
     fi
 }
 
 function mesh_tox_client {
 
-    TOXIC_FILE=$(cat /usr/share/${PROJECT_NAME}/apps/${PROJECT_NAME}-app-tox | grep "TOXIC_FILE=" | head -n 1 | awk -F '=' '{print $2}')
+    TOXIC_FILE=$(grep "TOXIC_FILE=" "/usr/share/${PROJECT_NAME}/apps/${PROJECT_NAME}-app-tox" | head -n 1 | awk -F '=' '{print $2}')
 
     # obtain commits from the main file
-    TOXIC_COMMIT_MAIN=$(cat /usr/share/${PROJECT_NAME}/apps/${PROJECT_NAME}-app-tox | grep "TOXIC_COMMIT=" | head -n 1 | awk -F "'" '{print $2}')
+    TOXIC_COMMIT_MAIN=$(grep "TOXIC_COMMIT=" "/usr/share/${PROJECT_NAME}/apps/${PROJECT_NAME}-app-tox" | head -n 1 | awk -F "'" '{print $2}')
     if [ ${#TOXIC_COMMIT_MAIN} -gt 10 ]; then
         TOXIC_COMMIT=$TOXIC_COMMIT_MAIN
     fi
 
-    TOXIC_REPO_MAIN=$(cat /usr/share/${PROJECT_NAME}/apps/${PROJECT_NAME}-app-tox | grep "TOXIC_REPO=" | head -n 1 | awk -F '"' '{print $2}')
+    TOXIC_REPO_MAIN=$(grep "TOXIC_REPO=" "/usr/share/${PROJECT_NAME}/apps/${PROJECT_NAME}-app-tox" | head -n 1 | awk -F '"' '{print $2}')
     if [ ${#TOXIC_REPO_MAIN} -gt 5 ]; then
         TOXIC_REPO=$TOXIC_REPO_MAIN
     fi
 
-    if [ ${rootdir} ]; then
-        chroot ${rootdir} apt-get -yq install libncursesw5-dev libconfig-dev libqrencode-dev
-        chroot ${rootdir} apt-get -yq install libcurl4-openssl-dev libvpx-dev libopenal-dev
-        chroot ${rootdir} apt-get -yq install libqrencode-dev
+    if [ "${rootdir}" ]; then
+        chroot "${rootdir}" apt-get -yq install libncursesw5-dev libconfig-dev libqrencode-dev
+        chroot "${rootdir}" apt-get -yq install libcurl4-openssl-dev libvpx-dev libopenal-dev
+        chroot "${rootdir}" apt-get -yq install libqrencode-dev
     else
         apt-get -yq install libncursesw5-dev libconfig-dev libqrencode-dev
         apt-get -yq install libcurl4-openssl-dev libvpx-dev libopenal-dev
@@ -704,57 +700,57 @@ function mesh_tox_client {
 
     TEMP_SCRIPT_NAME=fbtmp728353.sh
     TEMP_SCRIPT=/tmp/$TEMP_SCRIPT_NAME
-    echo '#!/bin/bash' > $TEMP_SCRIPT
-    echo "mkdir -p $INSTALL_DIR" >> $TEMP_SCRIPT
-    echo 'if [ -d /repos/toxic ]; then' >> $TEMP_SCRIPT
-    echo "    mkdir $INSTALL_DIR/toxic" >> $TEMP_SCRIPT
-    echo "    cp -r -p /repos/toxic/. $INSTALL_DIR/toxic" >> $TEMP_SCRIPT
-    echo "    cd $INSTALL_DIR/toxic" >> $TEMP_SCRIPT
-    echo '    git pull' >> $TEMP_SCRIPT
-    echo 'else' >> $TEMP_SCRIPT
-    echo "    git clone $TOXIC_REPO $INSTALL_DIR/toxic" >> $TEMP_SCRIPT
-    echo 'fi' >> $TEMP_SCRIPT
-    echo "cd $INSTALL_DIR/toxic" >> $TEMP_SCRIPT
-    echo "git checkout $TOXIC_COMMIT -b $TOXIC_COMMIT" >> $TEMP_SCRIPT
-    echo 'make' >> $TEMP_SCRIPT
-    echo 'if [ ! "$?" = "0" ]; then' >> $TEMP_SCRIPT
-    echo '    exit 1' >> $TEMP_SCRIPT
-    echo 'fi' >> $TEMP_SCRIPT
-    echo 'make install' >> $TEMP_SCRIPT
-    echo 'exit 0' >> $TEMP_SCRIPT
+    { echo '#!/bin/bash';
+      echo "mkdir -p $INSTALL_DIR";
+      echo 'if [ -d /repos/toxic ]; then';
+      echo "    mkdir $INSTALL_DIR/toxic";
+      echo "    cp -r -p /repos/toxic/. $INSTALL_DIR/toxic";
+      echo "    cd $INSTALL_DIR/toxic";
+      echo '    git pull';
+      echo 'else';
+      echo "    git clone $TOXIC_REPO $INSTALL_DIR/toxic";
+      echo 'fi';
+      echo "cd $INSTALL_DIR/toxic";
+      echo "git checkout $TOXIC_COMMIT -b $TOXIC_COMMIT";
+      echo 'make';
+      echo 'if [ ! "$?" = "0" ]; then';
+      echo '    exit 1';
+      echo 'fi';
+      echo 'make install';
+      echo 'exit 0'; } > "$TEMP_SCRIPT"
     chmod +x $TEMP_SCRIPT
-    cp $TEMP_SCRIPT $rootdir/root/
+    cp "$TEMP_SCRIPT" "$rootdir/root/"
 
-    TOXIC_FILE=$(cat /usr/share/${PROJECT_NAME}/apps/${PROJECT_NAME}-app-tox | grep "TOXIC_FILE=" | head -n 1 | awk -F '=' '{print $2}')
+    TOXIC_FILE=$(grep "TOXIC_FILE=" "/usr/share/${PROJECT_NAME}/apps/${PROJECT_NAME}-app-tox" | head -n 1 | awk -F '=' '{print $2}')
 
     SECONDS=0
-    if [ ${rootdir} ]; then
-        chroot ${rootdir} /root/$TEMP_SCRIPT_NAME
+    if [ "${rootdir}" ]; then
+        chroot "${rootdir}" "/root/$TEMP_SCRIPT_NAME"
     else
         /root/$TEMP_SCRIPT_NAME
     fi
+    # shellcheck disable=SC2181
     if [ ! "$?" = "0" ]; then
         cat -n /root/fbtmp728353.sh
         duration=$SECONDS
-        echo $"Toxic client compile failed at $(($duration / 60)) minutes and $(($duration % 60)) seconds elapsed."
+        echo $"Toxic client compile failed at $((duration / 60)) minutes and $((duration % 60)) seconds elapsed."
         echo $'Unable to make tox client'
         rm $TEMP_SCRIPT
         exit 74872
     fi
     rm $TEMP_SCRIPT
-    if [ ! -f $rootdir$TOXIC_FILE ]; then
+    if [ ! -f "$rootdir$TOXIC_FILE" ]; then
         echo $"Tox client was not installed to $TOXIC_FILE"
         exit 63278
     fi
     duration=$SECONDS
-    echo $"Toxic client compile $(($duration / 60)) minutes and $(($duration % 60)) seconds elapsed."
+    echo $"Toxic client compile $((duration / 60)) minutes and $((duration % 60)) seconds elapsed."
 }
 
 function enable_tox_repo {
-    echo 'deb http://download.opensuse.org/repositories/home:/antonbatenev:/tox/Debian_9.0/ /' > $rootdir/etc/apt/sources.list.d/tox.list
-
+    echo 'deb http://download.opensuse.org/repositories/home:/antonbatenev:/tox/Debian_9.0/ /' > "$rootdir/etc/apt/sources.list.d/tox.list"
 
-    cat >> $rootdir/root/gettoxkey.sh <<EOF
+    cat >> "$rootdir/root/gettoxkey.sh" <<EOF
 #!/bin/bash
 wget -q http://download.opensuse.org/repositories/home:antonbatenev:tox/Debian_9.0/Release.key -O- > /root/tox.key
 apt-key add /root/tox.key
@@ -769,30 +765,30 @@ EOF
 function install_tox {
     configure_firewall_for_tox
 
-    if [ $INSTALLING_MESH ]; then
+    if [ "$INSTALLING_MESH" ]; then
         mesh_tox_node
         mesh_tox_avahi
         mesh_tox_client
     else
         avoid_tor_restart=
-        if [ -f $IMAGE_PASSWORD_FILE ]; then
+        if [ -f "$IMAGE_PASSWORD_FILE" ]; then
             if [[ $ONION_ONLY != 'no' ]]; then
                 avoid_tor_restart=1
             fi
         fi
 
         if [ $avoid_tor_restart ]; then
-            ${PROJECT_NAME}-logging on --onion
+            "${PROJECT_NAME}-logging" on --onion
         else
-            ${PROJECT_NAME}-logging on
+            "${PROJECT_NAME}-logging" on
         fi
 
         install_tox_node
 
         if [ $avoid_tor_restart ]; then
-            ${PROJECT_NAME}-logging off --onion
+            "${PROJECT_NAME}-logging" off --onion
         else
-            ${PROJECT_NAME}-logging off
+            "${PROJECT_NAME}-logging" off
         fi
 
         tox_avahi
diff --git a/src/freedombone-app-turtl b/src/freedombone-app-turtl
index c55bbb7d9..415d68cea 100755
--- a/src/freedombone-app-turtl
+++ b/src/freedombone-app-turtl
@@ -68,22 +68,24 @@ function logging_off_turtl {
 }
 
 function change_password_turtl {
-    change_username="$1"
-    new_user_password="$2"
+    echo -n ''
+#    change_username="$1"
+#    new_user_password="$2"
 }
 
 function remove_user_turtl {
-    remove_username="$1"
+    echo -n ''
+#    remove_username="$1"
 }
 
 function add_user_turtl {
-    new_username="$1"
-    new_user_password="$2"
+#    new_username="$1"
+#    new_user_password="$2"
     echo '0'
 }
 
 function install_interactive_turtl {
-    if [ ! $ONION_ONLY ]; then
+    if [ ! "$ONION_ONLY" ]; then
         ONION_ONLY='no'
     fi
 
@@ -128,7 +130,7 @@ function configure_interactive_turtl_signups {
     dialog --title $"Allow new turtl signups" \
            --backtitle $"Freedombone Control Panel" \
            --defaultno \
-           --yesno $"\nAllow registration of new users?" 10 60
+           --yesno $"\\nAllow registration of new users?" 10 60
     sel=$?
     case $sel in
         0)
@@ -146,15 +148,14 @@ function configure_interactive_turtl_signups {
 }
 
 function configure_interactive_turtl_storage {
-    data=$(tempfile 2>/dev/null)
-    trap "rm -f $data" 0 1 2 5 15
+    data=$(mktemp 2>/dev/null)
     dialog --title $"Change storage limit" \
            --backtitle $"Freedombone Control Panel" \
-           --inputbox $"Enter a storage limit in megabytes." 8 75 "$TURTL_STORAGE_LIMIT_MB" 2>$data
+           --inputbox $"Enter a storage limit in megabytes." 8 75 "$TURTL_STORAGE_LIMIT_MB" 2>"$data"
     sel=$?
     case $sel in
         0)
-            STORAGE=$(<$data)
+            STORAGE=$(<"$data")
             if [ ${#STORAGE} -gt 0 ]; then
                 TURTL_STORAGE_LIMIT_MB=$STORAGE
                 sed -i "s|defparameter *default-storage-limit*.*|defparameter *default-storage-limit* ${TURTL_STORAGE_LIMIT_MB})|g" $TURTL_BASE_DIR/api/config/config.lisp
@@ -164,27 +165,31 @@ function configure_interactive_turtl_storage {
             fi
             ;;
     esac
+    rm -f "$data"
 }
 
 function configure_interactive_turtl {
-    data=$(tempfile 2>/dev/null)
-    trap "rm -f $data" 0 1 2 5 15
+    data=$(mktemp 2>/dev/null)
     dialog --backtitle $"Freedombone Control Panel" \
            --title $"turtl app settings" \
            --radiolist $"Choose an operation:" 12 70 3 \
            1 $"Enable/disable new user registrations" off \
            2 $"Change storage limit" off \
-           3 $"Exit" on 2> $data
+           3 $"Exit" on 2> "$data"
     sel=$?
     case $sel in
-        1) exit 1;;
-        255) exit 1;;
+        1) rm -f "$data"
+           exit 1;;
+        255) rm -f "$data"
+             exit 1;;
     esac
-    case $(cat $data) in
+    case $(cat "$data") in
         1) configure_interactive_turtl_signups;;
         2) configure_interactive_turtl_storage;;
-        3) return;;
+        3) rm -f "$data"
+           return;;
     esac
+    rm -f "$data"
 }
 
 function reconfigure_turtl {
@@ -255,7 +260,7 @@ function restore_local_turtl {
         else
             cp -r ${temp_restore_dir}/* /etc/turtl/
         fi
-
+        # shellcheck disable=SC2181
         if [ ! "$?" = "0" ]; then
             set_user_permissions
             backup_unmount_drive
@@ -273,6 +278,7 @@ function restore_local_turtl {
             cp -r ${temp_restore_dir}/* /var/lib/rethinkdb/
         fi
 
+        # shellcheck disable=SC2181
         if [ ! "$?" = "0" ]; then
             set_user_permissions
             backup_unmount_drive
@@ -318,6 +324,7 @@ function restore_remote_turtl {
             cp -r ${temp_restore_dir}/* /etc/turtl/
         fi
 
+        # shellcheck disable=SC2181
         if [ ! "$?" = "0" ]; then
             if [ -d /etc/turtl_previous ]; then
                 mv /etc/turtl_previous $TURTL_BASE_DIR
@@ -338,6 +345,7 @@ function restore_remote_turtl {
             cp -r ${temp_restore_dir}/* /var/lib/rethinkdb/
         fi
 
+        # shellcheck disable=SC2181
         if [ ! "$?" = "0" ]; then
             set_user_permissions
             exit 26783
@@ -358,7 +366,7 @@ function remove_turtl {
     remove_rethinkdb
     remove_app turtl
     remove_completion_param install_turtl
-    sed -i '/turtl/d' $COMPLETION_FILE
+    sed -i '/turtl/d' "$COMPLETION_FILE"
     nginx_dissite $TURTL_DOMAIN_NAME
     if [ -f /etc/nginx/sites-available/$TURTL_DOMAIN_NAME ]; then
         rm /etc/nginx/sites-available/$TURTL_DOMAIN_NAME
@@ -444,18 +452,18 @@ __ENDCONFIG__
         exit 6238234
     fi
 
-    echo '[Unit]' > /etc/systemd/system/turtl.service
-    echo 'Description=Note taking service' >> /etc/systemd/system/turtl.service
-    echo 'Documentation=http://turtl.it' >> /etc/systemd/system/turtl.service
-    echo 'Requires=network.target' >> /etc/systemd/system/turtl.service
-    echo 'Requires=rethinkdb.service' >> /etc/systemd/system/turtl.service
-    echo 'After=network.target' >> /etc/systemd/system/turtl.service
-    echo 'After=rethinkdb.service' >> /etc/systemd/system/turtl.service
-    echo '' >> /etc/systemd/system/turtl.service
-    echo '[Service]' >> /etc/systemd/system/turtl.service
-    echo 'Type=simple' >> /etc/systemd/system/turtl.service
-    echo 'User=turtl' >> /etc/systemd/system/turtl.service
-    echo "WorkingDirectory=$TURTL_BASE_DIR/api/" >> /etc/systemd/system/turtl.service
+    { echo '[Unit]';
+      echo 'Description=Note taking service';
+      echo 'Documentation=http://turtl.it';
+      echo 'Requires=network.target';
+      echo 'Requires=rethinkdb.service';
+      echo 'After=network.target';
+      echo 'After=rethinkdb.service';
+      echo '';
+      echo '[Service]';
+      echo 'Type=simple';
+      echo 'User=turtl';
+      echo "WorkingDirectory=$TURTL_BASE_DIR/api/"; } > /etc/systemd/system/turtl.service
 
     if [[ "$check_architecture" == *"64"* && "$check_architecture" != *"arm"* ]]; then
         echo "ExecStart=$TURTL_BASE_DIR/ccl/lx86cl64 -l $TURTL_BASE_DIR/quicklisp/setup.lisp -l launch.lisp" >> /etc/systemd/system/turtl.service
@@ -466,9 +474,9 @@ __ENDCONFIG__
             echo "ExecStart=$TURTL_BASE_DIR/ccl/armcl -l $TURTL_BASE_DIR/quicklisp/setup.lisp -l launch.lisp" >> /etc/systemd/system/turtl.service
         fi
     fi
-    echo '' >> /etc/systemd/system/turtl.service
-    echo '[Install]' >> /etc/systemd/system/turtl.service
-    echo 'WantedBy=multi-user.target' >> /etc/systemd/system/turtl.service
+    { echo '';
+      echo '[Install]';
+      echo 'WantedBy=multi-user.target'; } >> /etc/systemd/system/turtl.service
     chmod +x /etc/systemd/system/turtl.service
 
     chown -R turtl:turtl $TURTL_BASE_DIR
@@ -484,7 +492,7 @@ function install_turtl_api {
     if [ ! -d $TURTL_BASE_DIR ]; then
         mkdir -p $TURTL_BASE_DIR
     fi
-    cd $TURTL_BASE_DIR
+    cd "$TURTL_BASE_DIR" || exit 745726542
     mkdir cd $TURTL_BASE_DIR/data
     check_architecture=$(uname -a)
 
@@ -600,21 +608,21 @@ __ENDCONFIG__
     chown -R rethinkdb:rethinkdb /var/lib/rethinkdb
 
     # install turtl API
-    cd $TURTL_BASE_DIR/
+    cd "$TURTL_BASE_DIR/" || exit 6428462
 
     if [ -d /repos/turtl ]; then
         mkdir $TURTL_BASE_DIR/api
         cp -r -p /repos/turtl/. $TURTL_BASE_DIR/api
-        cd $TURTL_BASE_DIR/api
+        cd "$TURTL_BASE_DIR/api" || exit 57141845
         git pull
     else
         git clone $TURTL_REPO $TURTL_BASE_DIR/api
     fi
 
-    cd $TURTL_BASE_DIR/api
+    cd "$TURTL_BASE_DIR/api" || exit 35814614
     git checkout $TURTL_COMMIT -b $TURTL_COMMIT
     set_completion_param "turtl commit" "$TURTL_COMMIT"
-    cd $TURTL_BASE_DIR/quicklisp/local-projects
+    cd "$TURTL_BASE_DIR/quicklisp/local-projects" || exit 43618941415
     git clone git://github.com/orthecreedence/cl-hash-util
     if [[ "$check_architecture" != *"arm"* ]]; then
         if [[ "$check_architecture" == *"64"* ]]; then
@@ -657,54 +665,54 @@ function install_turtl_nginx {
     if [[ $ONION_ONLY == "no" ]]; then
         function_check nginx_http_redirect
         nginx_http_redirect $TURTL_DOMAIN_NAME
-        echo 'server {' >> $turtl_nginx_site
-        echo '  listen 443 ssl;' >> $turtl_nginx_site
-        echo '  #listen [::]:443 ssl;' >> $turtl_nginx_site
-        echo "  server_name ${TURTL_DOMAIN_NAME};" >> $turtl_nginx_site
-        echo '' >> $turtl_nginx_site
-        echo '  # Security' >> $turtl_nginx_site
+        { echo 'server {';
+          echo '  listen 443 ssl;';
+          echo '  #listen [::]:443 ssl;';
+          echo "  server_name ${TURTL_DOMAIN_NAME};";
+          echo '';
+          echo '  # Security'; } >> "$turtl_nginx_site"
         function_check nginx_ssl
         nginx_ssl $TURTL_DOMAIN_NAME
 
         function_check nginx_disable_sniffing
         nginx_disable_sniffing $TURTL_DOMAIN_NAME
 
-        echo '  add_header Strict-Transport-Security max-age=15768000;' >> $turtl_nginx_site
-        echo '' >> $turtl_nginx_site
-        echo '  # Logs' >> $turtl_nginx_site
-        echo '  access_log /dev/null;' >> $turtl_nginx_site
-        echo '  error_log /dev/null;' >> $turtl_nginx_site
-        echo '' >> $turtl_nginx_site
-        echo '  location / {' >> $turtl_nginx_site
+        { echo '  add_header Strict-Transport-Security max-age=15768000;';
+          echo '';
+          echo '  # Logs';
+          echo '  access_log /dev/null;';
+          echo '  error_log /dev/null;';
+          echo '';
+          echo '  location / {'; } >> "$turtl_nginx_site"
         function_check nginx_limits
         nginx_limits $TURTL_DOMAIN_NAME '15m'
-        echo "    proxy_pass        http://localhost:${TURTL_PORT}/;" >> $turtl_nginx_site
-        echo '    proxy_set_header  Host $host;' >> $turtl_nginx_site
-        echo '    proxy_buffering   off;' >> $turtl_nginx_site
-        echo '  }' >> $turtl_nginx_site
-        echo '}' >> $turtl_nginx_site
+        { echo "    proxy_pass        http://localhost:${TURTL_PORT}/;";
+          echo "    proxy_set_header  Host \$host;";
+          echo '    proxy_buffering   off;';
+          echo '  }';
+          echo '}'; } >> "$turtl_nginx_site"
     else
         echo -n '' > $turtl_nginx_site
     fi
-    echo 'server {' >> $turtl_nginx_site
-    echo "  listen 127.0.0.1:${TURTL_ONION_PORT};" >> $turtl_nginx_site
-    echo "  server_name ${TURTL_ONION_HOSTNAME};" >> $turtl_nginx_site
-    echo '' >> $turtl_nginx_site
+    { echo 'server {';
+      echo "  listen 127.0.0.1:${TURTL_ONION_PORT};";
+      echo "  server_name ${TURTL_ONION_HOSTNAME};";
+      echo ''; } >> $turtl_nginx_site
     function_check nginx_disable_sniffing
     nginx_disable_sniffing $TURTL_DOMAIN_NAME
-    echo '' >> $turtl_nginx_site
-    echo '  # Logs' >> $turtl_nginx_site
-    echo '  access_log /dev/null;' >> $turtl_nginx_site
-    echo '  error_log /dev/null;' >> $turtl_nginx_site
-    echo '' >> $turtl_nginx_site
-    echo '  location / {' >> $turtl_nginx_site
+    { echo '';
+      echo '  # Logs';
+      echo '  access_log /dev/null;';
+      echo '  error_log /dev/null;';
+      echo '';
+      echo '  location / {'; } >> $turtl_nginx_site
     function_check nginx_limits
     nginx_limits $TURTL_DOMAIN_NAME '15m'
-    echo "    proxy_pass        http://localhost:${TURTL_PORT}/;" >> $turtl_nginx_site
-    echo '    proxy_set_header  Host $host;' >> $turtl_nginx_site
-    echo '    proxy_buffering   off;' >> $turtl_nginx_site
-    echo '  }' >> $turtl_nginx_site
-    echo '}' >> $turtl_nginx_site
+    { echo "    proxy_pass        http://localhost:${TURTL_PORT}/;";
+      echo "    proxy_set_header  Host \$host;";
+      echo '    proxy_buffering   off;';
+      echo '  }';
+      echo '}'; } >> $turtl_nginx_site
 
     function_check add_ddns_domain
     add_ddns_domain $TURTL_DOMAIN_NAME
diff --git a/src/freedombone-app-vim b/src/freedombone-app-vim
index 6f5958e6b..8af2aa8c8 100755
--- a/src/freedombone-app-vim
+++ b/src/freedombone-app-vim
@@ -62,27 +62,27 @@ function backup_local_vim {
             echo $"Backing up Vim config for $USERNAME"
 
             # create a temporary directory
-            if [ ! -d /home/$USERNAME/$VIM_TEMP_DIR ]; then
-                mkdir /home/$USERNAME/$VIM_TEMP_DIR
+            if [ ! -d "/home/$USERNAME/$VIM_TEMP_DIR" ]; then
+                mkdir "/home/$USERNAME/$VIM_TEMP_DIR"
             fi
 
             # copy config files into the directory
-            if [ -f /home/$USERNAME/.vimrc ]; then
-                cp /home/$USERNAME/.vimrc /home/$USERNAME/$VIM_TEMP_DIR
-                chown -R $USERNAME:$USERNAME /home/$USERNAME/$VIM_TEMP_DIR
+            if [ -f "/home/$USERNAME/.vimrc" ]; then
+                cp "/home/$USERNAME/.vimrc" "/home/$USERNAME/$VIM_TEMP_DIR"
+                chown -R "$USERNAME":"$USERNAME" "/home/$USERNAME/$VIM_TEMP_DIR"
             fi
-            if [ -f /home/$USERNAME/.viminfo ]; then
-                cp /home/$USERNAME/.viminfo /home/$USERNAME/$VIM_TEMP_DIR
-                chown -R $USERNAME:$USERNAME /home/$USERNAME/$VIM_TEMP_DIR
+            if [ -f "/home/$USERNAME/.viminfo" ]; then
+                cp "/home/$USERNAME/.viminfo" "/home/$USERNAME/$VIM_TEMP_DIR"
+                chown -R "$USERNAME":"$USERNAME" "/home/$USERNAME/$VIM_TEMP_DIR"
             fi
 
             # backup the directory
             function_check backup_directory_to_usb
-            backup_directory_to_usb /home/$USERNAME/$VIM_TEMP_DIR vim/$USERNAME
+            backup_directory_to_usb "/home/$USERNAME/$VIM_TEMP_DIR" "vim/$USERNAME"
 
             # remove temporary directory
-            if [ -d /home/$USERNAME/$VIM_TEMP_DIR ]; then
-                rm -rf /home/$USERNAME/$VIM_TEMP_DIR
+            if [ -d "/home/$USERNAME/$VIM_TEMP_DIR" ]; then
+                rm -rf "/home/${USERNAME:?}/$VIM_TEMP_DIR"
             fi
         fi
     done
@@ -90,24 +90,25 @@ function backup_local_vim {
 
 function restore_local_vim {
     temp_restore_dir=/root/tempvim
-    if [ -d $USB_MOUNT/backup/vim ]; then
+    if [ -d "$USB_MOUNT/backup/vim" ]; then
         for d in $USB_MOUNT/backup/vim/*/ ; do
             USERNAME=$(echo "$d" | awk -F '/' '{print $6}')
             if [[ $(is_valid_user "$USERNAME") == "1" ]]; then
-                if [ ! -d /home/$USERNAME ]; then
-                    ${PROJECT_NAME}-adduser $USERNAME
+                if [ ! -d "/home/$USERNAME" ]; then
+                    "${PROJECT_NAME}-adduser" "$USERNAME"
                 fi
                 echo $"Restoring Vim config for $USERNAME"
                 function_check restore_directory_from_usb
-                restore_directory_from_usb $temp_restore_dir vim/$USERNAME
-                if [ -d $temp_restore_dir/home/$USERNAME/$VIM_TEMP_DIR ]; then
-                    cp -r $temp_restore_dir/home/$USERNAME/$VIM_TEMP_DIR /home/$USERNAME/
+                restore_directory_from_usb "$temp_restore_dir" "vim/$USERNAME"
+                if [ -d "$temp_restore_dir/home/$USERNAME/$VIM_TEMP_DIR" ]; then
+                    cp -r "$temp_restore_dir/home/$USERNAME/$VIM_TEMP_DIR" "/home/$USERNAME/"
                 else
-                    if [ ! -d /home/$USERNAME/$VIM_TEMP_DIR ]; then
-                        mkdir /home/$USERNAME/$VIM_TEMP_DIR
+                    if [ ! -d "/home/$USERNAME/$VIM_TEMP_DIR" ]; then
+                        mkdir "/home/$USERNAME/$VIM_TEMP_DIR"
                     fi
-                    cp -r $temp_restore_dir/* /home/$USERNAME/$VIM_TEMP_DIR/
+                    cp -r "$temp_restore_dir/*" "/home/$USERNAME/$VIM_TEMP_DIR/"
                 fi
+                # shellcheck disable=SC2181
                 if [ ! "$?" = "0" ]; then
                     rm -rf $temp_restore_dir
                     function_check set_user_permissions
@@ -116,14 +117,14 @@ function restore_local_vim {
                     backup_unmount_drive
                     exit 664
                 fi
-                cp /home/$USERNAME/$VIM_TEMP_DIR/* /home/$USERNAME
-                if [ -f /home/$USERNAME/.viminfo ]; then
-                    chown $USERNAME:$USERNAME /home/$USERNAME/.viminfo
+                cp "/home/$USERNAME/$VIM_TEMP_DIR/*" "/home/$USERNAME"
+                if [ -f "/home/$USERNAME/.viminfo" ]; then
+                    chown "$USERNAME":"$USERNAME" "/home/$USERNAME/.viminfo"
                 fi
-                if [ -f /home/$USERNAME/.vimrc ]; then
-                    chown $USERNAME:$USERNAME /home/$USERNAME/.vimrc
+                if [ -f "/home/$USERNAME/.vimrc" ]; then
+                    chown "$USERNAME":"$USERNAME" "/home/$USERNAME/.vimrc"
                 fi
-                rm -rf /home/$USERNAME/$VIM_TEMP_DIR
+                rm -rf "/home/${USERNAME:?}/$VIM_TEMP_DIR"
                 rm -rf $temp_restore_dir
             fi
         done
@@ -137,27 +138,27 @@ function backup_remote_vim {
             echo $"Backing up Vim config for $USERNAME"
 
             # create a temporary directory
-            if [ ! -d /home/$USERNAME/$VIM_TEMP_DIR ]; then
-                mkdir /home/$USERNAME/$VIM_TEMP_DIR
+            if [ ! -d "/home/$USERNAME/$VIM_TEMP_DIR" ]; then
+                mkdir "/home/$USERNAME/$VIM_TEMP_DIR"
             fi
 
             # copy config files into the directory
-            if [ -f /home/$USERNAME/.vimrc ]; then
-                cp /home/$USERNAME/.vimrc /home/$USERNAME/$VIM_TEMP_DIR
-                chown -R $USERNAME:$USERNAME /home/$USERNAME/$VIM_TEMP_DIR
+            if [ -f "/home/$USERNAME/.vimrc" ]; then
+                cp "/home/$USERNAME/.vimrc" "/home/$USERNAME/$VIM_TEMP_DIR"
+                chown -R "$USERNAME":"$USERNAME" "/home/$USERNAME/$VIM_TEMP_DIR"
             fi
-            if [ -f /home/$USERNAME/.viminfo ]; then
-                cp /home/$USERNAME/.viminfo /home/$USERNAME/$VIM_TEMP_DIR
-                chown -R $USERNAME:$USERNAME /home/$USERNAME/$VIM_TEMP_DIR
+            if [ -f "/home/$USERNAME/.viminfo" ]; then
+                cp "/home/$USERNAME/.viminfo" "/home/$USERNAME/$VIM_TEMP_DIR"
+                chown -R "$USERNAME":"$USERNAME" "/home/$USERNAME/$VIM_TEMP_DIR"
             fi
 
             # backup the directory
             function_check backup_directory_to_friend
-            backup_directory_to_friend /home/$USERNAME/$VIM_TEMP_DIR vim/$USERNAME
+            backup_directory_to_friend "/home/$USERNAME/$VIM_TEMP_DIR" "vim/$USERNAME"
 
             # remove temporary directory
-            if [ -d /home/$USERNAME/$VIM_TEMP_DIR ]; then
-                rm -rf /home/$USERNAME/$VIM_TEMP_DIR
+            if [ -d "/home/$USERNAME/$VIM_TEMP_DIR" ]; then
+                rm -rf "/home/${USERNAME:?}/$VIM_TEMP_DIR"
             fi
         fi
     done
@@ -165,24 +166,25 @@ function backup_remote_vim {
 
 function restore_remote_vim {
     temp_restore_dir=/root/tempvim
-    if [ -d $USB_MOUNT/backup/vim ]; then
+    if [ -d "$USB_MOUNT/backup/vim" ]; then
         for d in $USB_MOUNT/backup/vim/*/ ; do
             USERNAME=$(echo "$d" | awk -F '/' '{print $6}')
             if [[ $(is_valid_user "$USERNAME") == "1" ]]; then
-                if [ ! -d /home/$USERNAME ]; then
-                    ${PROJECT_NAME}-adduser $USERNAME
+                if [ ! -d "/home/$USERNAME" ]; then
+                    "${PROJECT_NAME}-adduser" "$USERNAME"
                 fi
                 echo $"Restoring Vim config for $USERNAME"
                 function_check restore_directory_from_friend
-                restore_directory_from_friend $temp_restore_dir vim/$USERNAME
-                if [ -d $temp_restore_dir/home/$USERNAME/$VIM_TEMP_DIR ]; then
-                    cp -r $temp_restore_dir/home/$USERNAME/$VIM_TEMP_DIR /home/$USERNAME/
+                restore_directory_from_friend "$temp_restore_dir vim/$USERNAME"
+                if [ -d "$temp_restore_dir/home/$USERNAME/$VIM_TEMP_DIR" ]; then
+                    cp -r "$temp_restore_dir/home/$USERNAME/$VIM_TEMP_DIR" "/home/$USERNAME/"
                 else
-                    if [ ! -d /home/$USERNAME/$VIM_TEMP_DIR ]; then
-                        mkdir /home/$USERNAME/$VIM_TEMP_DIR
+                    if [ ! -d "/home/$USERNAME/$VIM_TEMP_DIR" ]; then
+                        mkdir "/home/$USERNAME/$VIM_TEMP_DIR"
                     fi
-                    cp -r $temp_restore_dir/* /home/$USERNAME/$VIM_TEMP_DIR/
+                    cp -r "$temp_restore_dir/*" "/home/$USERNAME/$VIM_TEMP_DIR/"
                 fi
+                # shellcheck disable=SC2181
                 if [ ! "$?" = "0" ]; then
                     rm -rf $temp_restore_dir
                     function_check set_user_permissions
@@ -191,14 +193,14 @@ function restore_remote_vim {
                     backup_unmount_drive
                     exit 664
                 fi
-                cp /home/$USERNAME/$VIM_TEMP_DIR/* /home/$USERNAME
-                if [ -f /home/$USERNAME/.viminfo ]; then
-                    chown $USERNAME:$USERNAME /home/$USERNAME/.viminfo
+                cp "/home/$USERNAME/$VIM_TEMP_DIR/*" "/home/$USERNAME"
+                if [ -f "/home/$USERNAME/.viminfo" ]; then
+                    chown "$USERNAME":"$USERNAME" "/home/$USERNAME/.viminfo"
                 fi
-                if [ -f /home/$USERNAME/.vimrc ]; then
-                    chown $USERNAME:$USERNAME /home/$USERNAME/.vimrc
+                if [ -f "/home/$USERNAME/.vimrc" ]; then
+                    chown "$USERNAME":"$USERNAME" "/home/$USERNAME/.vimrc"
                 fi
-                rm -rf /home/$USERNAME/$VIM_TEMP_DIR
+                rm -rf "/home/${USERNAME:?}/$VIM_TEMP_DIR"
                 rm -rf $temp_restore_dir
             fi
         done
@@ -210,7 +212,7 @@ function remove_vim {
     # This may change with Debian Stretch
     # apt-get -yq remove --purge vim
     update-alternatives --set editor /usr/bin/nano
-    sed -i '/install_vim/d' $COMPLETION_FILE
+    sed -i '/install_vim/d' "$COMPLETION_FILE"
 
     # remove Vim as the mutt email editor
     if [ -f /etc/Muttrc ]; then
@@ -220,9 +222,9 @@ function remove_vim {
         for d in /home/*/ ; do
             USERNAME=$(echo "$d" | awk -F '/' '{print $3}')
             if [[ $(is_valid_user "$USERNAME") == "1" ]]; then
-                if [ -f /home/$USERNAME/.muttrc ]; then
-                    if grep -q "set editor=" /home/$USERNAME/.muttrc; then
-                        sed -i '/set editor=/d' /home/$USERNAME/.muttrc
+                if [ -f "/home/$USERNAME/.muttrc" ]; then
+                    if grep -q "set editor=" "/home/$USERNAME/.muttrc"; then
+                        sed -i '/set editor=/d' "/home/$USERNAME/.muttrc"
                     fi
                 fi
             fi
@@ -244,11 +246,11 @@ function install_vim {
         for d in /home/*/ ; do
             USERNAME=$(echo "$d" | awk -F '/' '{print $3}')
             if [[ $(is_valid_user "$USERNAME") == "1" ]]; then
-                if [ -f /home/$USERNAME/.muttrc ]; then
-                    if ! grep -q "set editor=" /home/$USERNAME/.muttrc; then
-                        echo "set editor=\"$VIM_MUTT_EDITOR\"" >> /home/$USERNAME/.muttrc
+                if [ -f "/home/$USERNAME/.muttrc" ]; then
+                    if ! grep -q "set editor=" "/home/$USERNAME/.muttrc"; then
+                        echo "set editor=\"$VIM_MUTT_EDITOR\"" >> "/home/$USERNAME/.muttrc"
                     else
-                        sed -i "s|set editor=.*|set editor=\"$VIM_MUTT_EDITOR\"|g" /home/$USERNAME/.muttrc
+                        sed -i "s|set editor=.*|set editor=\"$VIM_MUTT_EDITOR\"|g" "/home/$USERNAME/.muttrc"
                     fi
                 fi
             fi
diff --git a/src/freedombone-app-vpn b/src/freedombone-app-vpn
index 1aa183f5c..df241b025 100755
--- a/src/freedombone-app-vpn
+++ b/src/freedombone-app-vpn
@@ -82,23 +82,24 @@ function install_interactive_vpn {
     VPN_DETAILS_COMPLETE=
     while [ ! $VPN_DETAILS_COMPLETE ]
     do
-        data=$(tempfile 2>/dev/null)
-        trap "rm -f $data" 0 1 2 5 15
+        data=$(mktemp 2>/dev/null)
         currtlsport=$(grep 'VPN_TLS_PORT' temp.cfg | awk -F '=' '{print $2}')
-        if [ $currtlsport ]; then
+        if [ "$currtlsport" ]; then
             VPN_TLS_PORT=$currtlsport
         fi
         dialog --backtitle $"Freedombone Configuration" \
                --title $"VPN Configuration" \
-               --form $"\nPlease enter your VPN details. Changing the port to 443 will help defend against censorship but will prevent other web apps from running." 12 65 1 \
+               --form $"\\nPlease enter your VPN details. Changing the port to 443 will help defend against censorship but will prevent other web apps from running." 12 65 1 \
                $"TLS port:" 1 1 "$VPN_TLS_PORT" 1 12 5 5 \
-               2> $data
+               2> "$data"
         sel=$?
         case $sel in
-            1) exit 1;;
-            255) exit 1;;
+            1) rm -f "$data"
+               exit 1;;
+            255) rm -f "$data"
+                 exit 1;;
         esac
-        tlsport=$(cat $data | sed -n 1p)
+        tlsport=$(sed -n 1p < "$data")
         if [ ${#tlsport} -gt 1 ]; then
             if [[ "$tlsport" != *' '* && "$tlsport" != *'.'* ]]; then
                 VPN_TLS_PORT="$tlsport"
@@ -106,27 +107,27 @@ function install_interactive_vpn {
                 write_config_param "VPN_TLS_PORT" "$VPN_TLS_PORT"
             fi
         fi
+        rm -f "$data"
     done
     clear
     APP_INSTALLED=1
 }
 
 function vpn_change_tls_port {
-    if ! grep -q "VPN-TLS" $FIREWALL_CONFIG; then
+    if ! grep -q "VPN-TLS" "$FIREWALL_CONFIG"; then
         EXISTING_VPN_TLS_PORT=443
     else
-        EXISTING_VPN_TLS_PORT=$(cat $FIREWALL_CONFIG | grep "VPN-TLS" | awk -F '=' '{print $2}')
+        EXISTING_VPN_TLS_PORT=$(grep "VPN-TLS" "$FIREWALL_CONFIG" | awk -F '=' '{print $2}')
     fi
 
-    data=$(tempfile 2>/dev/null)
-    trap "rm -f $data" 0 1 2 5 15
+    data=$(mktemp 2>/dev/null)
     dialog --title $"VPN Configuration" \
            --backtitle $"Freedombone Control Panel" \
-           --inputbox $'Change TLS port' 10 50 $EXISTING_VPN_TLS_PORT 2>$data
+           --inputbox $'Change TLS port' 10 50 "$EXISTING_VPN_TLS_PORT" 2>"$data"
     sel=$?
     case $sel in
         0)
-            tlsport=$(<$data)
+            tlsport=$(<"$data")
             if [ ${#tlsport} -gt 0 ]; then
                 if [[ "$tlsport" != "$EXISTING_VPN_TLS_PORT" ]]; then
                     clear
@@ -137,22 +138,22 @@ function vpn_change_tls_port {
 
                     for d in /home/*/ ; do
                         USERNAME=$(echo "$d" | awk -F '/' '{print $3}')
-                        if [ -f /home/$USERNAME/stunnel-client.conf ]; then
-                            cp /etc/stunnel/stunnel-client.conf /home/$USERNAME/stunnel-client.conf
-                            chown $USERNAME:$USERNAME /home/$USERNAME/stunnel-client.conf
+                        if [ -f "/home/$USERNAME/stunnel-client.conf" ]; then
+                            cp "/etc/stunnel/stunnel-client.conf" "/home/$USERNAME/stunnel-client.conf"
+                            chown "$USERNAME":"$USERNAME" "/home/$USERNAME/stunnel-client.conf"
                         fi
                     done
 
-                    if [ $VPN_TLS_PORT -eq 443 ]; then
+                    if [ "$VPN_TLS_PORT" -eq 443 ]; then
                         if [[ "$PREVIOUS_VPN_TLS_PORT" != "443" ]]; then
-                            firewall_remove VPN-TLS ${EXISTING_VPN_TLS_PORT}
+                            firewall_remove VPN-TLS "${EXISTING_VPN_TLS_PORT}"
                         fi
                         systemctl stop nginx
                         systemctl disable nginx
                     else
                         if [[ "$PREVIOUS_VPN_TLS_PORT" != "$VPN_TLS_PORT" ]]; then
-                            firewall_remove VPN-TLS ${EXISTING_VPN_TLS_PORT}
-                            firewall_add VPN-TLS ${VPN_TLS_PORT} tcp
+                            firewall_remove VPN-TLS "${EXISTING_VPN_TLS_PORT}"
+                            firewall_add VPN-TLS "${VPN_TLS_PORT}" tcp
                         fi
                         systemctl enable nginx
                         systemctl restart nginx
@@ -160,7 +161,7 @@ function vpn_change_tls_port {
 
                     systemctl restart stunnel
 
-                    if [ $VPN_TLS_PORT -eq 443 ]; then
+                    if [ "$VPN_TLS_PORT" -eq 443 ]; then
                         dialog --title $"VPN Configuration" \
                                --msgbox $"TLS port changed to ${VPN_TLS_PORT}. Forward this port from your internet router." 10 60
                     else
@@ -171,52 +172,56 @@ function vpn_change_tls_port {
             fi
             ;;
     esac
+    rm -f "$data"
 }
 
 function vpn_regenerate_client_keys {
-    data=$(tempfile 2>/dev/null)
-    trap "rm -f $data" 0 1 2 5 15
+    data=$(mktemp 2>/dev/null)
     dialog --title $"Regenerate VPN keys for a user" \
            --backtitle $"Freedombone Control Panel" \
-           --inputbox $'username' 10 50 2>$data
+           --inputbox $'username' 10 50 2>"$data"
     sel=$?
     case $sel in
         0)
-            USERNAME=$(<$data)
+            USERNAME=$(<"$data")
             if [ ${#USERNAME} -gt 0 ]; then
-                if [ -d /home/$USERNAME ]; then
+                if [ -d "/home/$USERNAME" ]; then
                     clear
-                    create_user_vpn_key $USERNAME
+                    create_user_vpn_key "$USERNAME"
                     dialog --title $"Regenerate VPN keys for a user" \
                            --msgbox $"VPN keys were regenerated for $USERNAME" 6 60
                 fi
             fi
             ;;
     esac
+    rm -f "$data"
 }
 
 function configure_interactive_vpn {
     read_config_param VPN_TLS_PORT
     while true
     do
-        data=$(tempfile 2>/dev/null)
-        trap "rm -f $data" 0 1 2 5 15
+        data=$(mktemp 2>/dev/null)
         dialog --backtitle $"Freedombone Control Panel" \
                --title $"VPN Configuration" \
                --radiolist $"Choose an operation:" 13 70 3 \
                1 $"Change TLS port (currently $VPN_TLS_PORT)" off \
                2 $"Regenerate keys for a user" off \
-               3 $"Exit" on 2> $data
+               3 $"Exit" on 2> "$data"
         sel=$?
         case $sel in
-            1) return;;
-            255) return;;
+            1) rm -f "$data"
+               return;;
+            255) rm -f "$data"
+                 return;;
         esac
-        case $(cat $data) in
+        case $(cat "$data") in
             1) vpn_change_tls_port;;
             2) vpn_regenerate_client_keys;;
-            3) break;;
+            3) rm -f "$data"
+               break;;
         esac
+        rm -f "$data"
     done
 }
 
@@ -231,8 +236,8 @@ function upgrade_vpn {
 function backup_local_vpn {
     for d in /home/*/ ; do
         USERNAME=$(echo "$d" | awk -F '/' '{print $3}')
-        if [ -f /home/$USERNAME/$OPENVPN_KEY_FILENAME ]; then
-            cp /home/$USERNAME/$OPENVPN_KEY_FILENAME /etc/openvpn/easy-rsa/keys/${USERNAME}_${OPENVPN_KEY_FILENAME}
+        if [ -f "/home/$USERNAME/$OPENVPN_KEY_FILENAME" ]; then
+            cp "/home/$USERNAME/$OPENVPN_KEY_FILENAME" "/etc/openvpn/easy-rsa/keys/${USERNAME}_${OPENVPN_KEY_FILENAME}"
         fi
     done
 
@@ -252,9 +257,9 @@ function restore_local_vpn {
 
         for d in /home/*/ ; do
             USERNAME=$(echo "$d" | awk -F '/' '{print $3}')
-            if [ -f /etc/openvpn/easy-rsa/keys/${USERNAME}_${OPENVPN_KEY_FILENAME} ]; then
-                cp /etc/openvpn/easy-rsa/keys/${USERNAME}_${OPENVPN_KEY_FILENAME} /home/$USERNAME/$OPENVPN_KEY_FILENAME
-                chown $USERNAME:$USERNAME /home/$USERNAME/$OPENVPN_KEY_FILENAME
+            if [ -f "/etc/openvpn/easy-rsa/keys/${USERNAME}_${OPENVPN_KEY_FILENAME}" ]; then
+                cp "/etc/openvpn/easy-rsa/keys/${USERNAME}_${OPENVPN_KEY_FILENAME}" "/home/$USERNAME/$OPENVPN_KEY_FILENAME"
+                chown "$USERNAME":"$USERNAME" "/home/$USERNAME/$OPENVPN_KEY_FILENAME"
             fi
         done
     fi
@@ -265,13 +270,13 @@ function restore_local_vpn {
         rm -rf ${temp_restore_dir}
         for d in /home/*/ ; do
             USERNAME=$(echo "$d" | awk -F '/' '{print $3}')
-            if [ -f /home/$USERNAME/stunnel.pem ]; then
-                cp /etc/stunnel/stunnel.pem /home/$USERNAME/stunnel.pem
-                chown $USERNAME:$USERNAME /home/$USERNAME/stunnel.pem
+            if [ -f "/home/$USERNAME/stunnel.pem" ]; then
+                cp /etc/stunnel/stunnel.pem "/home/$USERNAME/stunnel.pem"
+                chown "$USERNAME":"$USERNAME" "/home/$USERNAME/stunnel.pem"
             fi
-            if [ -f /home/$USERNAME/stunnel.p12 ]; then
-                cp /etc/stunnel/stunnel.p12 /home/$USERNAME/stunnel.p12
-                chown $USERNAME:$USERNAME /home/$USERNAME/stunnel.p12
+            if [ -f "/home/$USERNAME/stunnel.p12" ]; then
+                cp /etc/stunnel/stunnel.p12 "/home/$USERNAME/stunnel.p12"
+                chown "$USERNAME":"$USERNAME" "/home/$USERNAME/stunnel.p12"
             fi
         done
     fi
@@ -280,8 +285,8 @@ function restore_local_vpn {
 function backup_remote_vpn {
     for d in /home/*/ ; do
         USERNAME=$(echo "$d" | awk -F '/' '{print $3}')
-        if [ -f /home/$USERNAME/$OPENVPN_KEY_FILENAME ]; then
-            cp /home/$USERNAME/$OPENVPN_KEY_FILENAME /etc/openvpn/easy-rsa/keys/${USERNAME}_${OPENVPN_KEY_FILENAME}
+        if [ -f "/home/$USERNAME/$OPENVPN_KEY_FILENAME" ]; then
+            cp "/home/$USERNAME/$OPENVPN_KEY_FILENAME" "/etc/openvpn/easy-rsa/keys/${USERNAME}_${OPENVPN_KEY_FILENAME}"
         fi
     done
 
@@ -301,9 +306,9 @@ function restore_remote_vpn {
 
         for d in /home/*/ ; do
             USERNAME=$(echo "$d" | awk -F '/' '{print $3}')
-            if [ -f /etc/openvpn/easy-rsa/keys/${USERNAME}_${OPENVPN_KEY_FILENAME} ]; then
-                cp /etc/openvpn/easy-rsa/keys/${USERNAME}_${OPENVPN_KEY_FILENAME} /home/$USERNAME/$OPENVPN_KEY_FILENAME
-                chown $USERNAME:$USERNAME /home/$USERNAME/$OPENVPN_KEY_FILENAME
+            if [ -f "/etc/openvpn/easy-rsa/keys/${USERNAME}_${OPENVPN_KEY_FILENAME}" ]; then
+                cp "/etc/openvpn/easy-rsa/keys/${USERNAME}_${OPENVPN_KEY_FILENAME}" "/home/$USERNAME/$OPENVPN_KEY_FILENAME"
+                chown "$USERNAME":"$USERNAME" "/home/$USERNAME/$OPENVPN_KEY_FILENAME"
             fi
         done
     fi
@@ -314,13 +319,13 @@ function restore_remote_vpn {
         rm -rf ${temp_restore_dir}
         for d in /home/*/ ; do
             USERNAME=$(echo "$d" | awk -F '/' '{print $3}')
-            if [ -f /home/$USERNAME/stunnel.pem ]; then
-                cp /etc/stunnel/stunnel.pem /home/$USERNAME/stunnel.pem
-                chown $USERNAME:$USERNAME /home/$USERNAME/stunnel.pem
+            if [ -f "/home/$USERNAME/stunnel.pem" ]; then
+                cp /etc/stunnel/stunnel.pem "/home/$USERNAME/stunnel.pem"
+                chown "$USERNAME":"$USERNAME" "/home/$USERNAME/stunnel.pem"
             fi
-            if [ -f /home/$USERNAME/stunnel.p12 ]; then
-                cp /etc/stunnel/stunnel.p12 /home/$USERNAME/stunnel.p12
-                chown $USERNAME:$USERNAME /home/$USERNAME/stunnel.p12
+            if [ -f "/home/$USERNAME/stunnel.p12" ]; then
+                cp /etc/stunnel/stunnel.p12 "/home/$USERNAME/stunnel.p12"
+                chown "$USERNAME":"$USERNAME" "/home/$USERNAME/stunnel.p12"
             fi
         done
     fi
@@ -332,8 +337,8 @@ function remove_vpn {
     rm /etc/systemd/system/stunnel.service
 
     systemctl stop openvpn
-    if [ $VPN_TLS_PORT -ne 443 ]; then
-        firewall_remove VPN-TLS $VPN_TLS_PORT
+    if [ "$VPN_TLS_PORT" -ne 443 ]; then
+        firewall_remove VPN-TLS "$VPN_TLS_PORT"
     else
         systemctl enable nginx
         systemctl restart nginx
@@ -354,10 +359,10 @@ function remove_vpn {
     # remove any client keys
     for d in /home/*/ ; do
         USERNAME=$(echo "$d" | awk -F '/' '{print $3}')
-        if [ -f /home/$USERNAME/$OPENVPN_KEY_FILENAME ]; then
-            shred -zu /home/$USERNAME/$OPENVPN_KEY_FILENAME
+        if [ -f "/home/$USERNAME/$OPENVPN_KEY_FILENAME" ]; then
+            shred -zu "/home/$USERNAME/$OPENVPN_KEY_FILENAME"
         fi
-        rm /home/$USERNAME/stunnel*
+        rm "/home/$USERNAME/stunnel*"
     done
     userdel -f vpn
     groupdel -f vpn
@@ -370,107 +375,108 @@ function remove_vpn {
 function create_user_vpn_key {
     username=$1
 
-    if [ ! -d /home/$username ]; then
+    if [ ! -d "/home/$username" ]; then
         return
     fi
 
     echo $"Creating VPN key for $username"
 
-    cd /etc/openvpn/easy-rsa
+    cd /etc/openvpn/easy-rsa || exit 4728468246
 
-    if [ -f /etc/openvpn/easy-rsa/keys/$username.crt ]; then
-        rm /etc/openvpn/easy-rsa/keys/$username.crt
+    if [ -f "/etc/openvpn/easy-rsa/keys/$username.crt" ]; then
+        rm "/etc/openvpn/easy-rsa/keys/$username.crt"
     fi
-    if [ -f /etc/openvpn/easy-rsa/keys/$username.key ]; then
-        rm /etc/openvpn/easy-rsa/keys/$username.key
+    if [ -f "/etc/openvpn/easy-rsa/keys/$username.key" ]; then
+        rm "/etc/openvpn/easy-rsa/keys/$username.key"
     fi
-    if [ -f /etc/openvpn/easy-rsa/keys/$username.csr ]; then
-        rm /etc/openvpn/easy-rsa/keys/$username.csr
+    if [ -f "/etc/openvpn/easy-rsa/keys/$username.csr" ]; then
+        rm "/etc/openvpn/easy-rsa/keys/$username.csr"
     fi
 
     sed -i 's| --interact||g' build-key
     ./build-key "$username"
 
-    if [ ! -f /etc/openvpn/easy-rsa/keys/$username.crt ]; then
+    if [ ! -f "/etc/openvpn/easy-rsa/keys/$username.crt" ]; then
         echo $'VPN user cert not generated'
         exit 783528
     fi
-    user_cert=$(cat /etc/openvpn/easy-rsa/keys/$username.crt)
+    user_cert=$(cat "/etc/openvpn/easy-rsa/keys/$username.crt")
     if [ ${#user_cert} -lt 10 ]; then
-        cat /etc/openvpn/easy-rsa/keys/$username.crt
+        cat "/etc/openvpn/easy-rsa/keys/$username.crt"
         echo $'User cert generation failed'
         exit 634659
     fi
-    if [ ! -f /etc/openvpn/easy-rsa/keys/$username.key ]; then
+    if [ ! -f "/etc/openvpn/easy-rsa/keys/$username.key" ]; then
         echo $'VPN user key not generated'
         exit 682523
     fi
-    user_key=$(cat /etc/openvpn/easy-rsa/keys/$username.key)
+    user_key=$(cat "/etc/openvpn/easy-rsa/keys/$username.key")
     if [ ${#user_key} -lt 10 ]; then
-        cat /etc/openvpn/easy-rsa/keys/$username.key
+        cat "/etc/openvpn/easy-rsa/keys/$username.key"
         echo $'User key generation failed'
         exit 285838
     fi
 
     user_vpn_cert_file=/home/$username/$OPENVPN_KEY_FILENAME
 
-    echo 'client' > $user_vpn_cert_file
-    echo 'dev tun' >> $user_vpn_cert_file
-    echo 'proto tcp' >> $user_vpn_cert_file
-    echo "remote localhost $STUNNEL_PORT" >> $user_vpn_cert_file
-    echo "route $DEFAULT_DOMAIN_NAME 255.255.255.255 net_gateway" >> $user_vpn_cert_file
-    echo 'resolv-retry infinite' >> $user_vpn_cert_file
-    echo 'nobind' >> $user_vpn_cert_file
-    echo 'tun-mtu 1500' >> $user_vpn_cert_file
-    echo 'tun-mtu-extra 32' >> $user_vpn_cert_file
-    echo 'mssfix 1450' >> $user_vpn_cert_file
-    echo 'persist-key' >> $user_vpn_cert_file
-    echo 'persist-tun' >> $user_vpn_cert_file
-    echo 'auth-nocache' >> $user_vpn_cert_file
-    echo 'remote-cert-tls server' >> $user_vpn_cert_file
-    echo 'comp-lzo' >> $user_vpn_cert_file
-    echo 'verb 3' >> $user_vpn_cert_file
-    echo '' >> $user_vpn_cert_file
-
-    echo '<ca>' >> $user_vpn_cert_file
-    cat /etc/openvpn/ca.crt >> $user_vpn_cert_file
-    echo '</ca>' >> $user_vpn_cert_file
-
-    echo '<cert>' >> $user_vpn_cert_file
-    cat /etc/openvpn/easy-rsa/keys/$username.crt >> $user_vpn_cert_file
-    echo '</cert>' >> $user_vpn_cert_file
-
-    echo '<key>' >> $user_vpn_cert_file
-    cat /etc/openvpn/easy-rsa/keys/$username.key >> $user_vpn_cert_file
-    echo '</key>' >> $user_vpn_cert_file
-
-    chown $username:$username $user_vpn_cert_file
+    { echo 'client';
+      echo 'dev tun';
+      echo 'proto tcp';
+      echo "remote localhost $STUNNEL_PORT";
+      echo "route $DEFAULT_DOMAIN_NAME 255.255.255.255 net_gateway";
+      echo 'resolv-retry infinite';
+      echo 'nobind';
+      echo 'tun-mtu 1500';
+      echo 'tun-mtu-extra 32';
+      echo 'mssfix 1450';
+      echo 'persist-key';
+      echo 'persist-tun';
+      echo 'auth-nocache';
+      echo 'remote-cert-tls server';
+      echo 'comp-lzo';
+      echo 'verb 3';
+      echo ''; } > "$user_vpn_cert_file"
+
+    {
+        echo '<ca>';
+        cat /etc/openvpn/ca.crt;
+        echo '</ca>';
+
+        echo '<cert>';
+        cat "/etc/openvpn/easy-rsa/keys/$username.crt;"
+        echo '</cert>';
+
+        echo '<key>';
+        cat "/etc/openvpn/easy-rsa/keys/$username.key;"
+        echo '</key>'; } >> "$user_vpn_cert_file"
+
+    chown "$username":"$username" "$user_vpn_cert_file"
 
     # keep a backup
-    cp $user_vpn_cert_file /etc/openvpn/easy-rsa/keys/$username.ovpn
+    cp "$user_vpn_cert_file" "/etc/openvpn/easy-rsa/keys/$username.ovpn"
 
     #rm /etc/openvpn/easy-rsa/keys/$username.crt
     #rm /etc/openvpn/easy-rsa/keys/$username.csr
-    shred -zu /etc/openvpn/easy-rsa/keys/$username.key
+    shred -zu "/etc/openvpn/easy-rsa/keys/$username.key"
 
     echo $"VPN key created at $user_vpn_cert_file"
 }
 
 function add_user_vpn {
     new_username="$1"
-    new_user_password="$2"
+#    new_user_password="$2"
 
-    create_user_vpn_key $new_username
+    create_user_vpn_key "$new_username"
     if [ -f /etc/stunnel/stunnel.pem ]; then
-        cp /etc/stunnel/stunnel.pem /home/$new_username/stunnel.pem
-        chown $new_username:$new_username /home/$new_username/stunnel.pem
+        cp /etc/stunnel/stunnel.pem "/home/$new_username/stunnel.pem"
+        chown "$new_username":"$new_username" "/home/$new_username/stunnel.pem"
     fi
     if [ -f /etc/stunnel/stunnel.p12 ]; then
-        cp /etc/stunnel/stunnel.p12 /home/$new_username/stunnel.p12
-        chown $new_username:$new_username /home/$new_username/stunnel.p12
+        cp /etc/stunnel/stunnel.p12 "/home/$new_username/stunnel.p12"
+        chown "$new_username":"$new_username" "/home/$new_username/stunnel.p12"
     fi
-    cp /etc/stunnel/stunnel-client.conf /home/$new_username/stunnel-client.conf
-    chown $new_username:$new_username /home/$new_username/stunnel-client.conf
+    cp /etc/stunnel/stunnel-client.conf "/home/$new_username/stunnel-client.conf"
+    chown "$new_username":"$new_username" "/home/$new_username/stunnel-client.conf"
 }
 
 function remove_user_vpn {
@@ -516,15 +522,16 @@ function generate_stunnel_keys {
     fi
     chmod 640 /etc/stunnel/stunnel.p12
 
-    cp /etc/stunnel/stunnel.pem /home/$MY_USERNAME/stunnel.pem
-    cp /etc/stunnel/stunnel.p12 /home/$MY_USERNAME/stunnel.p12
-    chown $MY_USERNAME:$MY_USERNAME $prefix$userhome/stunnel*
+    cp /etc/stunnel/stunnel.pem "/home/$MY_USERNAME/stunnel.pem"
+    cp /etc/stunnel/stunnel.p12 "/home/$MY_USERNAME/stunnel.p12"
+    chown "$MY_USERNAME":"$MY_USERNAME" "$prefix/home/$MY_USERNAME/stunnel*"
 }
 
 function install_stunnel {
     prefix=
     prefixchroot=
-    if [ $rootdir ]; then
+    # shellcheck disable=SC2154
+    if [ "$rootdir" ]; then
         prefix=$rootdir
         prefixchroot="chroot $rootdir"
         VPN_TLS_PORT=$VPN_MESH_TLS_PORT
@@ -532,53 +539,53 @@ function install_stunnel {
 
     $prefixchroot apt-get -yq install stunnel4
 
-    if [ ! $prefix ]; then
-        cd /etc/stunnel
+    if [ ! "$prefix" ]; then
+        cd /etc/stunnel || exit 46284624
         generate_stunnel_keys
     fi
 
-    echo 'chroot = /var/lib/stunnel4' > $prefix/etc/stunnel/stunnel.conf
-    echo 'pid = /stunnel4.pid' >> $prefix/etc/stunnel/stunnel.conf
-    echo 'setuid = stunnel4' >> $prefix/etc/stunnel/stunnel.conf
-    echo 'setgid = stunnel4' >> $prefix/etc/stunnel/stunnel.conf
-    echo 'socket = l:TCP_NODELAY=1' >> $prefix/etc/stunnel/stunnel.conf
-    echo 'socket = r:TCP_NODELAY=1' >> $prefix/etc/stunnel/stunnel.conf
-    echo 'cert = /etc/stunnel/stunnel.pem' >> $prefix/etc/stunnel/stunnel.conf
-    echo '[openvpn]' >> $prefix/etc/stunnel/stunnel.conf
-    echo "accept = $VPN_TLS_PORT" >> $prefix/etc/stunnel/stunnel.conf
-    echo 'connect = localhost:1194' >> $prefix/etc/stunnel/stunnel.conf
-    echo 'cert = /etc/stunnel/stunnel.pem' >> $prefix/etc/stunnel/stunnel.conf
-    echo 'protocol = socks' >> $prefix/etc/stunnel/stunnel.conf
-
-    sed -i 's|ENABLED=.*|ENABLED=1|g' $prefix/etc/default/stunnel4
-
-    echo '[openvpn]' > $prefix/etc/stunnel/stunnel-client.conf
-    echo 'client = yes' >> $prefix/etc/stunnel/stunnel-client.conf
-    echo "accept = $STUNNEL_PORT" >> $prefix/etc/stunnel/stunnel-client.conf
-    echo "connect = $DEFAULT_DOMAIN_NAME:$VPN_TLS_PORT" >> $prefix/etc/stunnel/stunnel-client.conf
-    echo 'cert = stunnel.pem' >> $prefix/etc/stunnel/stunnel-client.conf
-    echo 'protocol = socks' >> $prefix/etc/stunnel/stunnel-client.conf
-
-    echo '[Unit]' > $prefix/etc/systemd/system/stunnel.service
-    echo 'Description=SSL tunnel for network daemons' >> $prefix/etc/systemd/system/stunnel.service
-    echo 'Documentation=man:stunnel https://www.stunnel.org/docs.html' >> $prefix/etc/systemd/system/stunnel.service
-    echo 'DefaultDependencies=no' >> $prefix/etc/systemd/system/stunnel.service
-    echo 'After=network.target' >> $prefix/etc/systemd/system/stunnel.service
-    echo 'After=syslog.target' >> $prefix/etc/systemd/system/stunnel.service
-    echo '' >> $prefix/etc/systemd/system/stunnel.service
-    echo '[Install]' >> $prefix/etc/systemd/system/stunnel.service
-    echo 'WantedBy=multi-user.target' >> $prefix/etc/systemd/system/stunnel.service
-    echo 'Alias=stunnel.target' >> $prefix/etc/systemd/system/stunnel.service
-    echo '' >> $prefix/etc/systemd/system/stunnel.service
-    echo '[Service]' >> $prefix/etc/systemd/system/stunnel.service
-    echo 'Type=forking' >> $prefix/etc/systemd/system/stunnel.service
-    echo 'RuntimeDirectory=stunnel' >> $prefix/etc/systemd/system/stunnel.service
-    echo 'EnvironmentFile=-/etc/stunnel/stunnel.conf' >> $prefix/etc/systemd/system/stunnel.service
-    echo 'ExecStart=/usr/bin/stunnel /etc/stunnel/stunnel.conf' >> $prefix/etc/systemd/system/stunnel.service
-    echo 'ExecStop=/usr/bin/killall -9 stunnel' >> $prefix/etc/systemd/system/stunnel.service
-    echo 'RemainAfterExit=yes' >> $prefix/etc/systemd/system/stunnel.service
-
-    if [ ! $prefix ]; then
+    { echo 'chroot = /var/lib/stunnel4';
+      echo 'pid = /stunnel4.pid';
+      echo 'setuid = stunnel4';
+      echo 'setgid = stunnel4';
+      echo 'socket = l:TCP_NODELAY=1';
+      echo 'socket = r:TCP_NODELAY=1';
+      echo 'cert = /etc/stunnel/stunnel.pem';
+      echo '[openvpn]';
+      echo "accept = $VPN_TLS_PORT";
+      echo 'connect = localhost:1194';
+      echo 'cert = /etc/stunnel/stunnel.pem';
+      echo 'protocol = socks'; } > "$prefix/etc/stunnel/stunnel.conf"
+
+    sed -i 's|ENABLED=.*|ENABLED=1|g' "$prefix/etc/default/stunnel4"
+
+    { echo '[openvpn]';
+      echo 'client = yes';
+      echo "accept = $STUNNEL_PORT";
+      echo "connect = $DEFAULT_DOMAIN_NAME:$VPN_TLS_PORT";
+      echo 'cert = stunnel.pem';
+      echo 'protocol = socks'; } > "$prefix/etc/stunnel/stunnel-client.conf"
+
+    { echo '[Unit]';
+      echo 'Description=SSL tunnel for network daemons';
+      echo 'Documentation=man:stunnel https://www.stunnel.org/docs.html';
+      echo 'DefaultDependencies=no';
+      echo 'After=network.target';
+      echo 'After=syslog.target';
+      echo '';
+      echo '[Install]';
+      echo 'WantedBy=multi-user.target';
+      echo 'Alias=stunnel.target';
+      echo '';
+      echo '[Service]';
+      echo 'Type=forking';
+      echo 'RuntimeDirectory=stunnel';
+      echo 'EnvironmentFile=-/etc/stunnel/stunnel.conf';
+      echo 'ExecStart=/usr/bin/stunnel /etc/stunnel/stunnel.conf';
+      echo 'ExecStop=/usr/bin/killall -9 stunnel';
+      echo 'RemainAfterExit=yes'; } > "$prefix/etc/systemd/system/stunnel.service"
+
+    if [ ! "$prefix" ]; then
         if [ $VPN_TLS_PORT -eq 443 ]; then
             systemctl stop nginx
             systemctl disable nginx
@@ -591,15 +598,15 @@ function install_stunnel {
         systemctl daemon-reload
         systemctl start stunnel
 
-        cp /etc/stunnel/stunnel-client.conf /home/$MY_USERNAME/stunnel-client.conf
-        chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/stunnel*
+        cp /etc/stunnel/stunnel-client.conf "/home/$MY_USERNAME/stunnel-client.conf"
+        chown "$MY_USERNAME":"$MY_USERNAME" "/home/$MY_USERNAME/stunnel*"
     fi
 }
 
 function vpn_generate_keys {
     # generate host keys
     if [ ! -f /etc/openvpn/dh2048.pem ]; then
-        ${PROJECT_NAME}-dhparam -o /etc/openvpn/dh2048.pem
+        "${PROJECT_NAME}-dhparam" -o /etc/openvpn/dh2048.pem
     fi
     if [ ! -f /etc/openvpn/dh2048.pem ]; then
         echo $'vpn dhparams were not generated'
@@ -607,7 +614,8 @@ function vpn_generate_keys {
     fi
     cp /etc/openvpn/dh2048.pem /etc/openvpn/easy-rsa/keys/dh2048.pem
 
-    cd /etc/openvpn/easy-rsa
+    cd /etc/openvpn/easy-rsa || exit 5628756256
+    # shellcheck disable=SC1091
     . ./vars
     ./clean-all
     vpn_openssl_version='1.0.0'
@@ -651,13 +659,13 @@ function vpn_generate_keys {
     fi
     cp /etc/openvpn/easy-rsa/keys/{$OPENVPN_SERVER_NAME.crt,$OPENVPN_SERVER_NAME.key,ca.crt} /etc/openvpn
 
-    create_user_vpn_key ${MY_USERNAME}
+    create_user_vpn_key "${MY_USERNAME}"
 }
 
 function install_vpn {
     prefix=
     prefixchroot=
-    if [ $rootdir ]; then
+    if [ "$rootdir" ]; then
         prefix=$rootdir
         prefixchroot="chroot $rootdir"
         VPN_TLS_PORT=$VPN_MESH_TLS_PORT
@@ -668,50 +676,50 @@ function install_vpn {
     $prefixchroot useradd -r -s /bin/false -g vpn vpn
 
     # server configuration
-    echo 'port 1194' > $prefix/etc/openvpn/server.conf
-    echo 'proto tcp' >> $prefix/etc/openvpn/server.conf
-    echo 'dev tun' >> $prefix/etc/openvpn/server.conf
-    echo 'tun-mtu 1500' >> $prefix/etc/openvpn/server.conf
-    echo 'tun-mtu-extra 32' >> $prefix/etc/openvpn/server.conf
-    echo 'mssfix 1450' >> $prefix/etc/openvpn/server.conf
-    echo 'ca /etc/openvpn/ca.crt' >> $prefix/etc/openvpn/server.conf
-    echo 'cert /etc/openvpn/server.crt' >> $prefix/etc/openvpn/server.conf
-    echo 'key /etc/openvpn/server.key' >> $prefix/etc/openvpn/server.conf
-    echo 'dh /etc/openvpn/dh2048.pem' >> $prefix/etc/openvpn/server.conf
-    echo 'server 10.8.0.0 255.255.255.0' >> $prefix/etc/openvpn/server.conf
-    echo 'push "redirect-gateway def1 bypass-dhcp"' >> $prefix/etc/openvpn/server.conf
-    echo "push \"dhcp-option DNS 85.214.73.63\"" >> $prefix/etc/openvpn/server.conf
-    echo "push \"dhcp-option DNS 213.73.91.35\"" >> $prefix/etc/openvpn/server.conf
-    echo 'keepalive 5 30' >> $prefix/etc/openvpn/server.conf
-    echo 'comp-lzo' >> $prefix/etc/openvpn/server.conf
-    echo 'persist-key' >> $prefix/etc/openvpn/server.conf
-    echo 'persist-tun' >> $prefix/etc/openvpn/server.conf
-    echo 'status /dev/null' >> $prefix/etc/openvpn/server.conf
-    echo 'verb 3' >> $prefix/etc/openvpn/server.conf
-    echo '' >> $prefix/etc/openvpn/server.conf
-
-    if [ ! $prefix ]; then
+    { echo 'port 1194';
+      echo 'proto tcp';
+      echo 'dev tun';
+      echo 'tun-mtu 1500';
+      echo 'tun-mtu-extra 32';
+      echo 'mssfix 1450';
+      echo 'ca /etc/openvpn/ca.crt';
+      echo 'cert /etc/openvpn/server.crt';
+      echo 'key /etc/openvpn/server.key';
+      echo 'dh /etc/openvpn/dh2048.pem';
+      echo 'server 10.8.0.0 255.255.255.0';
+      echo 'push "redirect-gateway def1 bypass-dhcp"';
+      echo "push \"dhcp-option DNS 85.214.73.63\"";
+      echo "push \"dhcp-option DNS 213.73.91.35\"";
+      echo 'keepalive 5 30';
+      echo 'comp-lzo';
+      echo 'persist-key';
+      echo 'persist-tun';
+      echo 'status /dev/null';
+      echo 'verb 3';
+      echo ''; } > "$prefix/etc/openvpn/server.conf"
+
+    if [ ! "$prefix" ]; then
         echo 1 > /proc/sys/net/ipv4/ip_forward
     fi
-    sed -i 's|# net.ipv4.ip_forward|net.ipv4.ip_forward|g' $prefix/etc/sysctl.conf
-    sed -i 's|#net.ipv4.ip_forward|net.ipv4.ip_forward|g' $prefix/etc/sysctl.conf
-    sed -i 's|net.ipv4.ip_forward.*|net.ipv4.ip_forward=1|g' $prefix/etc/sysctl.conf
+    sed -i 's|# net.ipv4.ip_forward|net.ipv4.ip_forward|g' "$prefix/etc/sysctl.conf"
+    sed -i 's|#net.ipv4.ip_forward|net.ipv4.ip_forward|g' "$prefix/etc/sysctl.conf"
+    sed -i 's|net.ipv4.ip_forward.*|net.ipv4.ip_forward=1|g' "$prefix/etc/sysctl.conf"
 
-    cp -r $prefix/usr/share/easy-rsa/ $prefix/etc/openvpn
-    if [ ! -d $prefix/etc/openvpn/easy-rsa/keys ]; then
-        mkdir $prefix/etc/openvpn/easy-rsa/keys
+    cp -r "$prefix/usr/share/easy-rsa/" "$prefix/etc/openvpn"
+    if [ ! -d "$prefix/etc/openvpn/easy-rsa/keys" ]; then
+        mkdir "$prefix/etc/openvpn/easy-rsa/keys"
     fi
 
     # keys configuration
-    sed -i "s|export KEY_COUNTRY.*|export KEY_COUNTRY=\"US\"|g" $prefix/etc/openvpn/easy-rsa/vars
-    sed -i "s|export KEY_PROVINCE.*|export KEY_PROVINCE=\"TX\"|g" $prefix/etc/openvpn/easy-rsa/vars
-    sed -i "s|export KEY_CITY.*|export KEY_CITY=\"Dallas\"|g" $prefix/etc/openvpn/easy-rsa/vars
-    sed -i "s|export KEY_ORG.*|export KEY_ORG=\"$PROJECT_NAME\"|g" $prefix/etc/openvpn/easy-rsa/vars
-    sed -i "s|export KEY_EMAIL.*|export KEY_EMAIL=\"$MY_EMAIL_ADDRESS\"|g" $prefix/etc/openvpn/easy-rsa/vars
-    sed -i "s|export KEY_OU=.*|export KEY_OU=\"MoonUnit\"|g" $prefix/etc/openvpn/easy-rsa/vars
-    sed -i "s|export KEY_NAME.*|export KEY_NAME=\"$OPENVPN_SERVER_NAME\"|g" $prefix/etc/openvpn/easy-rsa/vars
-
-    if [ ! $prefix ]; then
+    sed -i "s|export KEY_COUNTRY.*|export KEY_COUNTRY=\"US\"|g" "$prefix/etc/openvpn/easy-rsa/vars"
+    sed -i "s|export KEY_PROVINCE.*|export KEY_PROVINCE=\"TX\"|g" "$prefix/etc/openvpn/easy-rsa/vars"
+    sed -i "s|export KEY_CITY.*|export KEY_CITY=\"Dallas\"|g" "$prefix/etc/openvpn/easy-rsa/vars"
+    sed -i "s|export KEY_ORG.*|export KEY_ORG=\"$PROJECT_NAME\"|g" "$prefix/etc/openvpn/easy-rsa/vars"
+    sed -i "s|export KEY_EMAIL.*|export KEY_EMAIL=\"$MY_EMAIL_ADDRESS\"|g" "$prefix/etc/openvpn/easy-rsa/vars"
+    sed -i "s|export KEY_OU=.*|export KEY_OU=\"MoonUnit\"|g" "$prefix/etc/openvpn/easy-rsa/vars"
+    sed -i "s|export KEY_NAME.*|export KEY_NAME=\"$OPENVPN_SERVER_NAME\"|g" "$prefix/etc/openvpn/easy-rsa/vars"
+
+    if [ ! "$prefix" ]; then
         vpn_generate_keys
         firewall_enable_vpn
 
@@ -724,7 +732,7 @@ function install_vpn {
 
     install_stunnel
 
-    if [ ! $prefix ]; then
+    if [ ! "$prefix" ]; then
         systemctl restart openvpn
     fi
 
-- 
GitLab