123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683 |
- #!/bin/bash
- #
- # .---. . .
- # | | |
- # |--- .--. .-. .-. .-.| .-. .--.--. |.-. .-. .--. .-.
- # | | (.-' (.-' ( | ( )| | | | )( )| | (.-'
- # ' ' --' --' -' - -' ' ' -' -' -' ' - --'
- #
- # Freedom in the Cloud
- #
- # Administrator control panel for the Freedombone system
- #
- # License
- # =======
- #
- # Copyright (C) 2015 Bob Mottram <bob@robotics.uk.to>
- #
- # This program is free software: you can redistribute it and/or modify
- # it under the terms of the GNU General Public License as published by
- # the Free Software Foundation, either version 3 of the License, or
- # (at your option) any later version.
- #
- # This program is distributed in the hope that it will be useful,
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- # GNU General Public License for more details.
- #
- # You should have received a copy of the GNU General Public License
- # along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- COMPLETION_FILE=$HOME/freedombone-completed.txt
- SELECTED_USERNAME=
- SIP_CONFIG_FILE=/etc/sipwitch.conf
- ADMIN_USER=
-
- function any_key {
- echo ' '
- read -n1 -r -p "Press any key to continue..." key
- }
-
- function add_user {
- data=$(tempfile 2>/dev/null)
- trap "rm -f $data" 0 1 2 5 15
- dialog --backtitle "Freedombone Control Panel" \
- --title "Add new user" \
- --form "\n" 8 40 3 \
- "Username:" 1 1 "" 1 11 16 15 \
- "ssh public key (optional):" 2 1 "" 3 1 40 10000 \
- 2> $data
- sel=$?
- case $sel in
- 1) return;;
- 255) return;;
- esac
- new_user_username=$(cat $data | sed -n 1p)
- new_user_ssh_public_key=$(cat $data | sed -n 2p)
- if [ ${#new_user_username} -lt 2 ]; then
- dialog --title "New username" \
- --msgbox "No username was given" 6 40
- return
- fi
- if [[ "$new_user_username" == *" "* ]]; then
- dialog --title "Invalid username" \
- --msgbox "The username should not contain any spaces" 6 40
- return
- fi
- if [ ${#new_user_ssh_public_key} -lt 20 ]; then
- clear
- freedombone-adduser "$new_user_username"
- any_key
- else
- if [[ "$new_user_ssh_public_key" == "ssh-"* ]]; then
- clear
- freedombone-adduser "$new_user_username" "$new_user_ssh_public_key"
- any_key
- else
- dialog --title "ssh public key" \
- --msgbox "This does not look like an ssh public key" 6 40
- fi
- fi
- }
-
- function show_sip_extensions {
- if [ ! -f $SIP_CONFIG_FILE ]; then
- return;
- fi
- clear
- echo "SIP phone extensions:"
- echo " "
- while read ext; do
- if [[ $ext == *"user id"* ]]; then
- echo -n " "
- echo -n $(echo "$ext" | awk -F '"' '{print $2}' | awk -F '"' '{print $1}')
- echo -n " "
- fi
- if [[ $ext == *"extension"* ]]; then
- echo $(echo "$ext" | awk -F '>' '{print $2}' | awk -F '<' '{print $1}')
- fi
- done < $SIP_CONFIG_FILE
- any_key
- }
-
- function select_user {
- SELECTED_USERNAME=
- data=$(tempfile 2>/dev/null)
- trap "rm -f $data" 0 1 2 5 15
- dialog --title "Select a user" \
- --backtitle "Freedombone Control Panel" \
- --dselect "/home/" 14 40 2> $data
- sel=$?
- case $sel in
- 0) SELECTED_USERNAME=$(cat $data | awk -F '/' '{print $3}');;
- 1) return;;
- 255) return;;
- esac
- if [ ${#SELECTED_USERNAME} -lt 2 ]; then
- SELECTED_USERNAME=
- fi
- if [ ! -d /home/$SELECTED_USERNAME/Maildir ]; then
- dialog --title "User directory check" \
- --msgbox "This does not look like a user directory" 6 40
- SELECTED_USERNAME=
- fi
- }
-
- function delete_user {
- select_user
- if [ ! $SELECTED_USERNAME ]; then
- return
- fi
- if grep -Fxq "Admin user:$SELECTED_USERNAME" $COMPLETION_FILE; then
- dialog --title "Administrator user" \
- --msgbox "You can't delete the administrator user" 6 40
- return
- fi
- clear
- freedombone-rmuser $SELECTED_USERNAME
- any_key
- }
-
- function configure_remote_backups {
- if ! grep -Fxq "Admin user:$SELECTED_USERNAME" $COMPLETION_FILE; then
- dialog --title "Administrator user" \
- --msgbox "No Administrator user found. Check $COMPLETION_FILE" 6 40
- return
- fi
- if [ ${#ADMIN} -lt 2 ]; then
- dialog --title "Administrator user" \
- --msgbox "Username not found" 6 40
- return
- fi
- if [ ! -d /home/$ADMIN_USER ]; then
- dialog --title "Administrator user" \
- --msgbox "Home directory not found" 6 40
- return
- fi
- freedombone-remote -u $ADMIN_USER
- }
-
- function change_password {
- select_user
- if [ ! $SELECTED_USERNAME ]; then
- return
- fi
- clear
- echo "Change password for $SELECTED_USERNAME"
- echo ""
- su -c "passwd" - $SELECTED_USERNAME
- any_key
- }
-
- function change_ssh_public_key {
- select_user
- if [ ! $SELECTED_USERNAME ]; then
- return
- fi
-
- if grep -Fxq "Admin user:$SELECTED_USERNAME" $COMPLETION_FILE; then
- dialog --title "Change ssh public key" \
- --backtitle "Freedombone Control Panel" \
- --defaultno \
- --yesno "\nThis is the administrator user.\n\nAre you sure you want to change the ssh public key for the administrator?" 10 60
- sel=$?
- case $sel in
- 1) return;;
- 255) return;;
- esac
- fi
-
- data=$(tempfile 2>/dev/null)
- trap "rm -f $data" 0 1 2 5 15
- dialog --title "Change ssh public key for $SELECTED_USERNAME" \
- --backtitle "Freedombone Control Panel" \
- --inputbox "Paste the ssh public key below" 8 60 2>$data
- sel=$?
- case $sel in
- 0)
- SSH_PUBLIC_KEY=$(<$data)
- if [ "$SSH_PUBLIC_KEY" ]; then
- if [ ${#SSH_PUBLIC_KEY} -gt 5 ]; then
- if [ -f "$SSH_PUBLIC_KEY" ]; then
- if [ ! -d /home/$SELECTED_USERNAME/.ssh ]; then
- mkdir /home/$SELECTED_USERNAME/.ssh
- fi
- cp $SSH_PUBLIC_KEY \
- /home/$SELECTED_USERNAME/.ssh/authorized_keys
- chown -R $SELECTED_USERNAME:$SELECTED_USERNAME \
- /home/$SELECTED_USERNAME/.ssh
- dialog --title "Change ssh public key" \
- --msgbox "ssh public key was installed" 6 40
- else
- if [[ "$SSH_PUBLIC_KEY" == "ssh-"* ]]; then
- if [ ! -d /home/$SELECTED_USERNAME/.ssh ]; then
- mkdir /home/$SELECTED_USERNAME/.ssh
- fi
- echo "$SSH_PUBLIC_KEY" > \
- /home/$SELECTED_USERNAME/.ssh/authorized_keys
- chown -R $SELECTED_USERNAME:$SELECTED_USERNAME \
- /home/$SELECTED_USERNAME/.ssh
- dialog --title "Change ssh public key" \
- --msgbox "ssh public key was installed" 6 40
- fi
- fi
- fi
- fi
- ;;
- esac
- }
-
- function add_to_mailing_list {
- select_user
- if [ ! $SELECTED_USERNAME ]; then
- return
- fi
- data=$(tempfile 2>/dev/null)
- trap "rm -f $data" 0 1 2 5 15
- dialog --backtitle "Freedombone Control Panel" \
- --title "Subscribe $SELECTED_USERNAME to a mailing list" \
- --form "\n" 8 68 4 \
- "List folder name:" 1 1 "" 1 35 26 25 \
- "Name between [] on subject line:" 2 1 "" 2 35 26 25 \
- "List email address:" 3 1 "" 3 35 26 25 \
- 2> $data
- sel=$?
- case $sel in
- 1) return;;
- 255) return;;
- esac
- LIST_NAME=$(cat $data | sed -n 1p)
- LIST_SUBJECT=$(cat $data | sed -n 2p)
- LIST_EMAIL=$(cat $data | sed -n 3p)
-
- if [ ${#LIST_NAME} -lt 2 ]; then
- dialog --title "Add mailing list" \
- --msgbox "No mailing list name was given" 6 40
- return
- fi
- if [ ${#LIST_SUBJECT} -lt 2 ]; then
- dialog --title "Add mailing list" \
- --msgbox "No mailing list subject was given" 6 40
- return
- fi
- if [ ${#LIST_EMAIL} -lt 2 ]; then
- dialog --title "Add mailing list" \
- --msgbox "No mailing list email address was given" 6 40
- return
- fi
- if [[ "$LIST_EMAIL" != *"@"* || "$LIST_EMAIL" != *"."* ]]; then
- dialog --title "Add mailing list" \
- --msgbox "Unrecognised email address" 6 40
- return
- fi
-
- freedombone-addlist -u $SELECTED_USERNAME -l "$LIST_NAME" \
- -s "$LIST_SUBJECT" -e "$LIST_EMAIL"
- dialog --title "Add mailing list" \
- --msgbox "$LIST_NAME list was added" 6 40
- }
-
- function email_rule {
- select_user
- if [ ! $SELECTED_USERNAME ]; then
- return
- fi
- data=$(tempfile 2>/dev/null)
- trap "rm -f $data" 0 1 2 5 15
- dialog --backtitle "Freedombone Control Panel" \
- --title "Email rule for user $SELECTED_USERNAME" \
- --form "\n" 8 65 3 \
- "When email arrives from address:" 1 1 "" 1 35 24 28 \
- "Move to folder:" 2 1 "" 2 35 24 28 \
- 2> $data
- sel=$?
- case $sel in
- 1) return;;
- 255) return;;
- esac
- RULE_EMAIL=$(cat $data | sed -n 1p)
- RULE_FOLDER=$(cat $data | sed -n 2p)
-
- if [ ${#RULE_EMAIL} -lt 2 ]; then
- dialog --title "Add email rule" \
- --msgbox "No email address was given" 6 40
- return
- fi
- if [ ${#RULE_FOLDER} -lt 2 ]; then
- dialog --title "Add email rule" \
- --msgbox "No folder name was given" 6 40
- return
- fi
- if [[ "$RULE_EMAIL" != *"@"* || "$RULE_EMAIL" != *"."* ]]; then
- dialog --title "Add email rule" \
- --msgbox "Unrecognised email address" 6 40
- return
- fi
-
- freedombone-addemail -u $SELECTED_USERNAME -e "$RULE_EMAIL" \
- -g "$RULE_FOLDER"
- dialog --title "Add email rule" \
- --msgbox "Email rule for $RULE_EMAIL was added" 6 40
- }
-
- function block_unblock_email {
- select_user
- if [ ! $SELECTED_USERNAME ]; then
- return
- fi
- data=$(tempfile 2>/dev/null)
- trap "rm -f $data" 0 1 2 5 15
- dialog --backtitle "Freedombone Control Panel" \
- --title "Block/Unblock email going to $SELECTED_USERNAME" \
- --form "\n" 8 65 3 \
- "When email arrives from address:" 1 1 "" 1 35 24 28 \
- "Block it:" 2 1 "yes" 2 35 4 4 \
- 2> $data
- sel=$?
- case $sel in
- 1) return;;
- 255) return;;
- esac
- BLOCK_EMAIL=$(cat $data | sed -n 1p)
- BLOCK=$(cat $data | sed -n 2p)
- if [ ${#BLOCK_EMAIL} -lt 2 ]; then
- dialog --title "Block/Unblock an email" \
- --msgbox "No email address was given" 6 40
- return
- fi
- if [[ "$BLOCK_EMAIL" != *"@"* || "$BLOCK_EMAIL" != *"."* ]]; then
- dialog --title "Block/Unblock an email" \
- --msgbox "Unrecognised email address" 6 40
- return
- fi
- if [[ $BLOCK == "y"* || $BLOCK == "Y"* ]]; then
- freedombone-ignore -u $SELECTED_USERNAME -e "$BLOCK_EMAIL"
- dialog --title "Block an email" \
- --msgbox "Email from $BLOCK_EMAIL to $SELECTED_USERNAME blocked" 6 40
- else
- freedombone-unignore -u $SELECTED_USERNAME -e "$BLOCK_EMAIL"
- dialog --title "Unblock an email" \
- --msgbox "Email from $BLOCK_EMAIL to $SELECTED_USERNAME unblocked" 6 40
- fi
- }
-
- function block_unblock_subject {
- select_user
- if [ ! $SELECTED_USERNAME ]; then
- return
- fi
- data=$(tempfile 2>/dev/null)
- trap "rm -f $data" 0 1 2 5 15
- dialog --backtitle "Freedombone Control Panel" \
- --title "Block/Unblock email going to $SELECTED_USERNAME" \
- --form "\n" 8 70 3 \
- "When email arrives with subject text:" 1 1 "" 1 40 24 28 \
- "Block it:" 2 1 "yes" 2 40 4 4 \
- 2> $data
- sel=$?
- case $sel in
- 1) return;;
- 255) return;;
- esac
- BLOCK_SUBJECT=$(cat $data | sed -n 1p)
- BLOCK=$(cat $data | sed -n 2p)
- if [ ${#BLOCK_SUBJECT} -lt 2 ]; then
- dialog --title "Block/Unblock an email" \
- --msgbox "No subject was given" 6 40
- return
- fi
- if [[ $BLOCK == "y"* || $BLOCK == "Y"* ]]; then
- freedombone-ignore -u $SELECTED_USERNAME -t "$BLOCK_SUBJECT"
- dialog --title "Block an email" \
- --msgbox "Email with subject $BLOCK_SUBJECT to $SELECTED_USERNAME blocked" 6 40
- else
- freedombone-unignore -u $SELECTED_USERNAME -t "$BLOCK_SUBJECT"
- dialog --title "Unblock an email" \
- --msgbox "Email with subject $BLOCK_SUBJECT to $SELECTED_USERNAME unblocked" 6 40
- fi
- }
-
- function create_keydrive_master {
- select_user
- if [ ! $SELECTED_USERNAME ]; then
- return
- fi
- dialog --title "USB Master Keydrive" \
- --msgbox "Plug in a LUKS encrypted USB drive" 6 40
- clear
- freedombone-keydrive -u $SELECTED_USERNAME --master 'yes'
- any_key
- }
-
- function create_keydrive_fragment {
- select_user
- if [ ! $SELECTED_USERNAME ]; then
- return
- fi
- dialog --title "USB Fragment Keydrive" \
- --msgbox "Plug in a LUKS encrypted USB drive" 6 40
- clear
- freedombone-keydrive -u $SELECTED_USERNAME
- any_key
- }
-
- function backup_data {
- dialog --title "Backup data to USB" \
- --msgbox "Plug in a LUKS encrypted USB drive" 6 40
- clear
- backup
- any_key
- }
-
- function restore_data {
- dialog --title "Restore data from USB" \
- --msgbox "Plug in your backup USB drive" 6 40
- clear
- restore
- any_key
- }
-
- function restore_data_remote {
- if [ ! $ADMIN_USER ]; then
- dialog --title "Restore data from remote server" \
- --msgbox "Unknown admin user" 6 40
- return
- fi
- data=$(tempfile 2>/dev/null)
- trap "rm -f $data" 0 1 2 5 15
- dialog --title "Restore from remote server" \
- --backtitle "Freedombone Control Panel" \
- --inputbox "Enter the domain name of the server from which you wish to restore" 8 60 2>$data
- sel=$?
- case $sel in
- 0)
- friend_server_domain_name=$(<$data)
-
- if [ ${#friend_server_domain_name} -lt 2 ]; then
- return
- fi
-
- if [[ $friend_server_domain_name != *"."* ]]; then
- dialog --title "Remote server domain name" \
- --msgbox "Invalid domain name" 6 40
- return
- fi
-
- restorefromfriend $friend_server_domain_name
- any_key
- ;;
- esac
- }
-
- function logging_on_off {
- dialog --title "Logging" \
- --backtitle "Freedombone Control Panel" \
- --yesno "\nDo you want to turn logging on?" 7 60
- sel=$?
- case $sel in
- 0) freedombone-logging on;;
- 1) freedombone-logging off;;
- 255) return;;
- esac
- }
-
- function restore_gpg_key {
- select_user
- if [ ! $SELECTED_USERNAME ]; then
- return
- fi
- dialog --title "Restore GPG key for user $SELECTED_USERNAME" \
- --msgbox "Plug in your USB keydrive" 6 40
- clear
- freedombone-recoverkey -u $SELECTED_USERNAME
- any_key
- }
-
- function security_settings {
- freedombone-sec
- any_key
- }
-
- function reset_tripwire {
- clear
- echo 'Resetting the Tripwire...'
- echo ' '
- echo '
-
- ' | reset-tripwire
- any_key
- }
-
- function hubzilla_channel_directory_server {
- if ! grep -q "Hubzilla domain" $COMPLETION_FILE; then
- dialog --title "Hubzilla channel directory server" \
- --msgbox "Hubzilla is not installed on this system" 6 40
- return
- fi
- HUBZILLA_DOMAIN_NAME=$(cat $COMPLETION_FILE | grep "Hubzilla domain" | awk -F ':' '{print $2}')
- if [ ! -d /var/www/$HUBZILLA_DOMAIN_NAME ]; then
- dialog --title "Hubzilla channel directory server" \
- --msgbox "Hubzilla install directory not found" 6 40
- return
- fi
-
- data=$(tempfile 2>/dev/null)
- trap "rm -f $data" 0 1 2 5 15
- dialog --title "Hubzilla channel directory server" \
- --backtitle "Freedombone Control Panel" \
- --inputbox "When you click on 'channel directory' this is where Hubzilla will obtain its list from" 8 60 2>$data
- sel=$?
- case $sel in
- 0)
- hubzilla_domain_server=$(<$data)
- if [[ $hubzilla_domain_server != *"."* ]]; then
- return
- fi
- if [[ $hubzilla_domain_server != "https"* ]]; then
- dialog --title "Hubzilla channel directory server" \
- --msgbox "Invalid domain - include the https://" 6 40
- return
- fi
- ./var/www/$HUBZILLA_DOMAIN_NAME/htdocs/util/config system directory_server $hubzilla_domain_server
- dialog --title "Hubzilla channel directory server" \
- --msgbox "Domain channel directory server changed to $hubzilla_domain_server" 6 40
- ;;
- esac
- }
-
- function menu_backup_restore {
- while true
- do
- data=$(tempfile 2>/dev/null)
- trap "rm -f $data" 0 1 2 5 15
- dialog --backtitle "Freedombone Control Panel" \
- --title "Backup and Restore" \
- --radiolist "Choose an operation:" 15 70 8 \
- 1 "Backup data to USB drive" off \
- 2 "Restore GPG key from USB keydrive" off \
- 3 "Restore data from USB drive" off \
- 4 "Configure remote backups" off \
- 5 "Restore from remote backup" off \
- 6 "Backup GPG key to USB (master keydrive)" off \
- 7 "Backup GPG key to USB (fragment keydrive)" off \
- 8 "Back to main menu" on 2> $data
- sel=$?
- case $sel in
- 1) break;;
- 255) break;;
- esac
- case $(cat $data) in
- 1) backup_data;;
- 2) restore_gpg_key;;
- 3) restore_data;;
- 4) configure_remote_backups;;
- 5) restore_data_remote;;
- 6) create_keydrive_master;;
- 7) create_keydrive_fragment;;
- 8) break;;
- esac
- done
- }
-
- function menu_email {
- while true
- do
- data=$(tempfile 2>/dev/null)
- trap "rm -f $data" 0 1 2 5 15
- dialog --backtitle "Freedombone Control Panel" \
- --title "Email Filtering Rules" \
- --radiolist "Choose an operation:" 12 70 5 \
- 1 "Add a user to a mailing list" off \
- 2 "Add an email rule" off \
- 3 "Block/Unblock an email address" off \
- 4 "Block/Unblock email with subject text" off \
- 5 "Back to main menu" on 2> $data
- sel=$?
- case $sel in
- 1) break;;
- 255) break;;
- esac
- case $(cat $data) in
- 1) add_to_mailing_list;;
- 2) email_rule;;
- 3) block_unblock_email;;
- 4) block_unblock_subject;;
- 5) break;;
- esac
- done
- }
-
- function menu_users {
- while true
- do
- data=$(tempfile 2>/dev/null)
- trap "rm -f $data" 0 1 2 5 15
- dialog --backtitle "Freedombone Control Panel" \
- --title "Manage Users" \
- --radiolist "Choose an operation:" 12 70 5 \
- 1 "Add a user" off \
- 2 "Delete a user" off \
- 3 "Change user password" off \
- 4 "Change user ssh public key" off \
- 5 "Back to main menu" on 2> $data
- sel=$?
- case $sel in
- 1) break;;
- 255) break;;
- esac
- case $(cat $data) in
- 1) add_user;;
- 2) delete_user;;
- 3) change_password;;
- 4) change_ssh_public_key;;
- 5) break;;
- esac
- done
- }
-
- function menu_top_level {
- while true
- do
- data=$(tempfile 2>/dev/null)
- trap "rm -f $data" 0 1 2 5 15
- dialog --backtitle "Freedombone Control Panel" \
- --title "Control Panel" \
- --radiolist "Choose an operation:" 16 70 9 \
- 1 "Backup and Restore" off \
- 2 "Show SIP Phone Extensions" off \
- 3 "Reset Tripwire" off \
- 4 "Logging on/off" off \
- 5 "Manage Users" off \
- 6 "Email Filtering Rules" off \
- 7 "Security Settings" off \
- 8 "Set Hubzilla channel directory server" off \
- 9 "Exit" on 2> $data
- sel=$?
- case $sel in
- 1) exit 1;;
- 255) exit 1;;
- esac
- case $(cat $data) in
- 1) menu_backup_restore;;
- 2) show_sip_extensions;;
- 3) reset_tripwire;;
- 4) logging_on_off;;
- 5) menu_users;;
- 6) menu_email;;
- 7) security_settings;;
- 8) hubzilla_channel_directory_server;;
- 9) break;;
- esac
- done
- }
-
- if [ ! -f $COMPLETION_FILE ]; then
- echo 'This command should only be run on an installed Freedombone system'
- exit 1
- fi
-
- ADMIN_USER=$(cat $COMPLETION_FILE | grep "Admin user" | awk -F ':' '{print $2}')
- menu_top_level
- clear
- cat /etc/motd
- exit 0
|