freedombone-controlpanel 77KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125
  1. #!/bin/bash
  2. #
  3. # .---. . .
  4. # | | |
  5. # |--- .--. .-. .-. .-.| .-. .--.--. |.-. .-. .--. .-.
  6. # | | (.-' (.-' ( | ( )| | | | )( )| | (.-'
  7. # ' ' --' --' -' - -' ' ' -' -' -' ' - --'
  8. #
  9. # Freedom in the Cloud
  10. #
  11. # Administrator control panel for the Freedombone system
  12. #
  13. # License
  14. # =======
  15. #
  16. # Copyright (C) 2015-2016 Bob Mottram <bob@robotics.uk.to>
  17. #
  18. # This program is free software: you can redistribute it and/or modify
  19. # it under the terms of the GNU Affero General Public License as published by
  20. # the Free Software Foundation, either version 3 of the License, or
  21. # (at your option) any later version.
  22. #
  23. # This program is distributed in the hope that it will be useful,
  24. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  25. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  26. # GNU Affero General Public License for more details.
  27. #
  28. # You should have received a copy of the GNU Affero General Public License
  29. # along with this program. If not, see <http://www.gnu.org/licenses/>.
  30. PROJECT_NAME='freedombone'
  31. export TEXTDOMAIN=${PROJECT_NAME}-controlpanel
  32. export TEXTDOMAINDIR="/usr/share/locale"
  33. COMPLETION_FILE=$HOME/${PROJECT_NAME}-completed.txt
  34. SELECTED_USERNAME=
  35. SIP_CONFIGURATION_FILE=/etc/sipwitch.conf
  36. ADMIN_USER=
  37. UPGRADE_SCRIPT_NAME="${PROJECT_NAME}-upgrade"
  38. UPDATE_DATE_SCRIPT=/usr/bin/updatedate
  39. # Minimum number of characters in a password
  40. MINIMUM_PASSWORD_LENGTH=10
  41. if [ -f /usr/local/bin/${PROJECT_NAME} ]; then
  42. MINIMUM_PASSWORD_LENGTH=$(cat /usr/local/bin/${PROJECT_NAME} | grep 'MINIMUM_PASSWORD_LENGTH=' | head -n 1 | awk -F '=' '{print $2}')
  43. else
  44. if [ -f /usr/bin/${PROJECT_NAME} ]; then
  45. MINIMUM_PASSWORD_LENGTH=$(cat /usr/bin/${PROJECT_NAME} | grep 'MINIMUM_PASSWORD_LENGTH=' | head -n 1 | awk -F '=' '{print $2}')
  46. fi
  47. fi
  48. # voip
  49. VOIP_PORT=64738
  50. VOIP_ONION_PORT=8095
  51. SSH_PORT=2222
  52. IRC_PORT=6697
  53. IRC_ONION_PORT=8093
  54. # outgoing SMTP proxy
  55. SMTP_PROXY_ENABLE=$'no'
  56. SMTP_PROXY_PROTOCOL='smtps'
  57. SMTP_PROXY_SERVER='mail.myispdomain'
  58. SMTP_PROXY_PORT=465
  59. SMTP_PROXY_USERNAME=''
  60. SMTP_PROXY_PASSWORD=''
  61. WIFI_INTERFACE=wlan0
  62. WIFI_SSID=
  63. WIFI_TYPE='wpa2-psk'
  64. WIFI_PASSPHRASE=
  65. WIFI_HOTSPOT='no'
  66. WIFI_NETWORKS_FILE=~/${PROJECT_NAME}-wifi.cfg
  67. USB_DRIVE=sdb
  68. # get default USB from config file
  69. CONFIGURATION_FILE=/root/${PROJECT_NAME}.cfg
  70. if [ -f $CONFIGURATION_FILE ]; then
  71. if grep -q "WIFI_HOTSPOT=" $CONFIGURATION_FILE; then
  72. WIFI_HOTSPOT=$(cat $CONFIGURATION_FILE | grep "WIFI_HOTSPOT=" | awk -F '=' '{print $2}')
  73. fi
  74. if grep -q "WIFI_INTERFACE=" $CONFIGURATION_FILE; then
  75. WIFI_INTERFACE=$(cat $CONFIGURATION_FILE | grep "WIFI_INTERFACE=" | awk -F '=' '{print $2}')
  76. fi
  77. if grep -q "WIFI_TYPE=" $CONFIGURATION_FILE; then
  78. WIFI_TYPE=$(cat $CONFIGURATION_FILE | grep "WIFI_TYPE=" | awk -F '=' '{print $2}')
  79. fi
  80. if grep -q "WIFI_SSID=" $CONFIGURATION_FILE; then
  81. WIFI_SSID=$(cat $CONFIGURATION_FILE | grep "WIFI_SSID=" | awk -F '=' '{print $2}')
  82. fi
  83. if grep -q "WIFI_PASSPHRASE=" $CONFIGURATION_FILE; then
  84. WIFI_PASSPHRASE=$(cat $CONFIGURATION_FILE | grep "WIFI_PASSPHRASE=" | awk -F '=' '{print $2}')
  85. fi
  86. if grep -q "USB_DRIVE=" $CONFIGURATION_FILE; then
  87. USB_DRIVE=$(cat $CONFIGURATION_FILE | grep "USB_DRIVE=" | awk -F '=' '{print $2}')
  88. if [[ $USB_DRIVE == *"dev"* ]]; then
  89. USB_DRIVE=$(echo ${USB_DRIVE} | awk -F '/' '{print $3}' | sed 's|1||g' | sed 's|2||g')
  90. fi
  91. fi
  92. if grep -q "SSH_PORT=" $CONFIGURATION_FILE; then
  93. SSH_PORT=$(cat $CONFIGURATION_FILE | grep "SSH_PORT=" | awk -F '=' '{print $2}')
  94. fi
  95. if grep -q "IRC_PORT=" $CONFIGURATION_FILE; then
  96. IRC_PORT=$(cat $CONFIGURATION_FILE | grep "IRC_PORT=" | awk -F '=' '{print $2}')
  97. fi
  98. if grep -q "SMTP_PROXY_ENABLE=" $CONFIGURATION_FILE; then
  99. SMTP_PROXY_ENABLE=$(cat $CONFIGURATION_FILE | grep "SMTP_PROXY_ENABLE=" | awk -F '=' '{print $2}')
  100. fi
  101. if grep -q "SMTP_PROXY_PROTOCOL=" $CONFIGURATION_FILE; then
  102. SMTP_PROXY_PROTOCOL=$(cat $CONFIGURATION_FILE | grep "SMTP_PROXY_PROTOCOL=" | awk -F '=' '{print $2}')
  103. fi
  104. if grep -q "SMTP_PROXY_SERVER=" $CONFIGURATION_FILE; then
  105. SMTP_PROXY_SERVER=$(cat $CONFIGURATION_FILE | grep "SMTP_PROXY_SERVER=" | awk -F '=' '{print $2}')
  106. fi
  107. if grep -q "SMTP_PROXY_PORT=" $CONFIGURATION_FILE; then
  108. SMTP_PROXY_PORT=$(cat $CONFIGURATION_FILE | grep "SMTP_PROXY_PORT=" | awk -F '=' '{print $2}')
  109. fi
  110. if grep -q "SMTP_PROXY_USERNAME=" $CONFIGURATION_FILE; then
  111. SMTP_PROXY_USERNAME=$(cat $CONFIGURATION_FILE | grep "SMTP_PROXY_USERNAME=" | awk -F '=' '{print $2}')
  112. fi
  113. if grep -q "SMTP_PROXY_PASSWORD=" $CONFIGURATION_FILE; then
  114. SMTP_PROXY_PASSWORD=$(cat $CONFIGURATION_FILE | grep "SMTP_PROXY_PASSWORD=" | awk -F '=' '{print $2}')
  115. fi
  116. fi
  117. # Mirrors settings
  118. FRIENDS_MIRRORS_SERVER=
  119. FRIENDS_MIRRORS_SSH_PORT=2222
  120. FRIENDS_MIRRORS_PASSWORD=
  121. MY_MIRRORS_PASSWORD=
  122. function any_key {
  123. echo ' '
  124. read -n1 -r -p $"Press any key to continue..." key
  125. }
  126. function check_for_updates {
  127. if [ ! -f /etc/cron.weekly/$UPGRADE_SCRIPT_NAME ]; then
  128. dialog --title $"Check for updates" \
  129. --msgbox $"Upgrade script was not found" 6 40
  130. return
  131. fi
  132. clear
  133. . /etc/cron.weekly/$UPGRADE_SCRIPT_NAME
  134. any_key
  135. }
  136. function read_repo_servers {
  137. if [ -f $CONFIGURATION_FILE ]; then
  138. if grep -q "FRIENDS_MIRRORS_SERVER" $CONFIGURATION_FILE; then
  139. FRIENDS_MIRRORS_SERVER=$(grep "FRIENDS_MIRRORS_SERVER" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  140. fi
  141. if grep -q "FRIENDS_MIRRORS_SSH_PORT" $CONFIGURATION_FILE; then
  142. FRIENDS_MIRRORS_SSH_PORT=$(grep "FRIENDS_MIRRORS_SSH_PORT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  143. fi
  144. if grep -q "MY_MIRRORS_PASSWORD" $CONFIGURATION_FILE; then
  145. MY_MIRRORS_PASSWORD=$(grep "MY_MIRRORS_PASSWORD" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  146. fi
  147. if grep -q "FRIENDS_MIRRORS_PASSWORD" $CONFIGURATION_FILE; then
  148. FRIENDS_MIRRORS_PASSWORD=$(grep "FRIENDS_MIRRORS_PASSWORD" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  149. fi
  150. fi
  151. if [ ! $FRIENDS_MIRRORS_SERVER ]; then
  152. return
  153. fi
  154. if [ ${#FRIENDS_MIRRORS_SERVER} -lt 2 ]; then
  155. return
  156. fi
  157. MAIN_COMMAND=/usr/local/bin/${PROJECT_NAME}
  158. if [ ! -f $MAIN_COMMAND ]; then
  159. MAIN_COMMAND=/usr/bin/${PROJECT_NAME}
  160. fi
  161. REPOS=($(cat ${MAIN_COMMAND} | grep "_REPO=\"" | uniq -u | sed 's|${PROJECT_NAME}|'"${PROJECT_NAME}"'|g'))
  162. for line in "${REPOS[@]}"
  163. do
  164. repo_name=$(echo "$line" | awk -F '=' '{print $1}')
  165. mirrors_name=$(echo "$repo_name" | sed "s|_REPO||g" | awk '{print tolower($0)}')
  166. friends_repo_url="ssh://mirrors@${FRIENDS_MIRRORS_SERVER}:${FRIENDS_MIRRORS_SSH_PORT}/home/mirrors/${mirrors_name}"
  167. ${repo_name}="${friends_repo_url}"
  168. done
  169. }
  170. function set_main_repo {
  171. data=$(tempfile 2>/dev/null)
  172. trap "rm -f $data" 0 1 2 5 15
  173. dialog --backtitle $"Freedombone Control Panel" \
  174. --title $"Main Repository (Mirrors)" \
  175. --form $"If you do not wish to use the default repositories they can be obtained from mirrors on another ${PROJECT_NAME} server." 14 60 3 \
  176. $"URL:" 1 1 "$FRIENDS_MIRRORS_SERVER" 1 14 40 15 \
  177. $"SSH Port:" 2 1 "$FRIENDS_MIRRORS_SSH_PORT" 2 14 40 10000 \
  178. $"Password:" 3 1 "$FRIENDS_MIRRORS_PASSWORD" 3 14 40 10000 \
  179. 2> $data
  180. sel=$?
  181. case $sel in
  182. 1) return;;
  183. 255) return;;
  184. esac
  185. new_mirrors_url=$(cat $data | sed -n 1p)
  186. new_mirrors_ssh_port=$(cat $data | sed -n 2p)
  187. new_mirrors_password=$(cat $data | sed -n 3p)
  188. if [ ${#new_mirrors_url} -lt 2 ]; then
  189. return
  190. fi
  191. if [ ${#new_mirrors_ssh_port} -lt 1 ]; then
  192. return
  193. fi
  194. if [ ${#new_mirrors_password} -lt 10 ]; then
  195. dialog --title $"Main Repository" \
  196. --msgbox $'Mirrors password was too short. Should be at least 10 characters.' 6 40
  197. return
  198. fi
  199. if [[ $new_mirrors_url == *"."* ]]; then
  200. FRIENDS_MIRRORS_SERVER=$new_mirrors_url
  201. FRIENDS_MIRRORS_SSH_PORT=$new_mirrors_ssh_port
  202. FRIENDS_MIRRORS_PASSWORD=$new_mirrors_password
  203. if ! grep -q "FRIENDS_MIRRORS_SERVER" $CONFIGURATION_FILE; then
  204. echo "FRIENDS_MIRRORS_SERVER=$FRIENDS_MIRRORS_SERVER" >> $CONFIGURATION_FILE
  205. else
  206. sed -i "s|FRIENDS_MIRRORS_SERVER=.*|FRIENDS_MIRRORS_SERVER=$FRIENDS_MIRRORS_SERVER|g" $CONFIGURATION_FILE
  207. fi
  208. if ! grep -q "FRIENDS_MIRRORS_SSH_PORT" $CONFIGURATION_FILE; then
  209. echo "FRIENDS_MIRRORS_SSH_PORT=$FRIENDS_MIRRORS_SSH_PORT" >> $CONFIGURATION_FILE
  210. else
  211. sed -i "s|FRIENDS_MIRRORS_SSH_PORT=.*|FRIENDS_MIRRORS_SSH_PORT=$FRIENDS_MIRRORS_SSH_PORT|g" $CONFIGURATION_FILE
  212. fi
  213. if ! grep -q "FRIENDS_MIRRORS_PASSWORD" $CONFIGURATION_FILE; then
  214. echo "FRIENDS_MIRRORS_PASSWORD=$FRIENDS_MIRRORS_PASSWORD" >> $CONFIGURATION_FILE
  215. else
  216. sed -i "s|FRIENDS_MIRRORS_PASSWORD=.*|FRIENDS_MIRRORS_PASSWORD=$FRIENDS_MIRRORS_PASSWORD|g" $CONFIGURATION_FILE
  217. fi
  218. # re-read the repos
  219. read_repo_servers
  220. dialog --title $"Main Repository" \
  221. --msgbox $"Main repository set to $FRIENDS_MIRRORS_SERVER" 6 60
  222. fi
  223. }
  224. function add_user {
  225. data=$(tempfile 2>/dev/null)
  226. trap "rm -f $data" 0 1 2 5 15
  227. dialog --backtitle $"Freedombone Control Panel" \
  228. --title $"Add new user" \
  229. --form "\n" 8 60 3 \
  230. $"Username:" 1 1 "" 1 28 16 15 \
  231. $"ssh public key (optional):" 2 1 "" 2 28 40 10000 \
  232. 2> $data
  233. sel=$?
  234. case $sel in
  235. 1) return;;
  236. 255) return;;
  237. esac
  238. new_user_username=$(cat $data | sed -n 1p)
  239. new_user_ssh_public_key=$(cat $data | sed -n 2p)
  240. if [ ${#new_user_username} -lt 2 ]; then
  241. dialog --title $"New username" \
  242. --msgbox $"No username was given" 6 40
  243. return
  244. fi
  245. if [[ "$new_user_username" == *" "* ]]; then
  246. dialog --title $"Invalid username" \
  247. --msgbox $"The username should not contain any spaces" 6 40
  248. return
  249. fi
  250. if [ ${#new_user_ssh_public_key} -lt 20 ]; then
  251. clear
  252. ${PROJECT_NAME}-adduser "$new_user_username"
  253. any_key
  254. else
  255. if [[ "$new_user_ssh_public_key" == "ssh-"* ]]; then
  256. clear
  257. ${PROJECT_NAME}-adduser "$new_user_username" "$new_user_ssh_public_key"
  258. any_key
  259. else
  260. dialog --title $"ssh public key" \
  261. --msgbox $"This does not look like an ssh public key" 6 40
  262. fi
  263. fi
  264. }
  265. function pad_string {
  266. echo -n -e "$1" | sed -e :a -e 's/^.\{1,25\}$/& /;ta'
  267. }
  268. function show_domains {
  269. DEFAULT_DOMAIN_NAME=$(cat $CONFIGURATION_FILE | grep "DEFAULT_DOMAIN_NAME=" | awk -F '=' '{print $2}')
  270. echo 'Domains'
  271. echo '======='
  272. echo ''
  273. echo -n -e "$(pad_string 'Name')"
  274. echo -n -e "$(pad_string 'ICANN')"
  275. echo -n -e "$(pad_string 'Tor')"
  276. echo ''
  277. echo '--------------------------------------------------------------------------'
  278. if grep -q "ssh onion domain" $COMPLETION_FILE; then
  279. echo -n -e "$(pad_string 'ssh')"
  280. echo -n -e "$(pad_string ${DEFAULT_DOMAIN_NAME})"
  281. echo "$(cat ${COMPLETION_FILE} | grep 'ssh onion domain' | awk -F ':' '{print $2}')"
  282. fi
  283. if grep -q "Email onion domain" $COMPLETION_FILE; then
  284. echo -n -e "$(pad_string 'Email')"
  285. echo -n -e "$(pad_string ${DEFAULT_DOMAIN_NAME})"
  286. echo "$(cat ${COMPLETION_FILE} | grep 'Email onion domain' | awk -F ':' '{print $2}')"
  287. fi
  288. if grep -q "XMPP onion domain" $COMPLETION_FILE; then
  289. echo -n -e "$(pad_string 'XMPP')"
  290. echo -n -e "$(pad_string ${DEFAULT_DOMAIN_NAME})"
  291. echo "$(cat ${COMPLETION_FILE} | grep 'XMPP onion domain' | awk -F ':' '{print $2}')"
  292. fi
  293. if grep -q "VoIP onion domain" $COMPLETION_FILE; then
  294. echo -n -e "$(pad_string 'VoIP/Mumble')"
  295. echo -n -e "$(pad_string ${DEFAULT_DOMAIN_NAME})"
  296. echo "$(cat ${COMPLETION_FILE} | grep 'VoIP onion domain' | awk -F ':' '{print $2}')"
  297. fi
  298. if grep -q "SIP onion domain" $COMPLETION_FILE; then
  299. echo -n -e "$(pad_string 'SIP')"
  300. echo -n -e "$(pad_string ${DEFAULT_DOMAIN_NAME})"
  301. echo "$(cat ${COMPLETION_FILE} | grep 'SIP onion domain' | awk -F ':' '{print $2}')"
  302. fi
  303. if grep -q "IRC onion domain" $COMPLETION_FILE; then
  304. echo -n -e "$(pad_string 'IRC')"
  305. echo -n -e "$(pad_string ${DEFAULT_DOMAIN_NAME})"
  306. echo "$(cat ${COMPLETION_FILE} | grep 'IRC onion domain' | awk -F ':' '{print $2}')"
  307. fi
  308. if grep -q "tox onion domain" $COMPLETION_FILE; then
  309. echo -n -e "$(pad_string 'Tox')"
  310. echo -n -e "$(pad_string ${DEFAULT_DOMAIN_NAME})"
  311. echo "$(cat ${COMPLETION_FILE} | grep 'tox onion domain' | awk -F ':' '{print $2}')"
  312. fi
  313. if grep -q "Wiki domain" $COMPLETION_FILE; then
  314. echo -n -e "$(pad_string 'Wiki')"
  315. WIKIDOM=$(cat ${COMPLETION_FILE} | grep 'Wiki domain' | awk -F ':' '{print $2}')
  316. echo -n -e "$(pad_string ${WIKIDOM})"
  317. if [ -d /var/lib/tor/hidden_service_wiki ]; then
  318. echo -n "$(cat /var/lib/tor/hidden_service_wiki/hostname)"
  319. fi
  320. echo ''
  321. fi
  322. if grep -q "Hubzilla domain" $COMPLETION_FILE; then
  323. echo -n -e "$(pad_string 'Hubzilla')"
  324. HUBZILLADOM=$(cat ${COMPLETION_FILE} | grep 'Hubzilla domain' | awk -F ':' '{print $2}')
  325. echo -n -e "$(pad_string ${HUBZILLADOM})"
  326. if [ -d /var/lib/tor/hidden_service_hubzilla ]; then
  327. echo -n "$(cat /var/lib/tor/hidden_service_hubzilla/hostname)"
  328. fi
  329. echo ''
  330. fi
  331. if grep -q "Blog domain" $COMPLETION_FILE; then
  332. echo -n -e "$(pad_string 'Blog')"
  333. BLOGDOM=$(cat ${COMPLETION_FILE} | grep 'Blog domain' | awk -F ':' '{print $2}')
  334. echo -n -e "$(pad_string ${BLOGDOM})"
  335. if [ -d /var/lib/tor/hidden_service_blog ]; then
  336. echo -n "$(cat /var/lib/tor/hidden_service_blog/hostname)"
  337. fi
  338. echo ''
  339. fi
  340. if grep -q "GNU Social domain" $COMPLETION_FILE; then
  341. echo -n -e "$(pad_string 'GNU Social')"
  342. GNUSOCIALDOM=$(cat ${COMPLETION_FILE} | grep 'GNU Social domain' | awk -F ':' '{print $2}')
  343. echo -n -e "$(pad_string ${GNUSOCIALDOM})"
  344. if [ -d /var/lib/tor/hidden_service_microblog ]; then
  345. echo -n "$(cat /var/lib/tor/hidden_service_microblog/hostname)"
  346. fi
  347. echo ''
  348. fi
  349. if grep -q "Gogs domain" $COMPLETION_FILE; then
  350. echo -n -e "$(pad_string 'Gogs')"
  351. GOGSDOM=$(cat ${COMPLETION_FILE} | grep 'Gogs domain' | awk -F ':' '{print $2}')
  352. echo -n -e "$(pad_string ${GOGSDOM})"
  353. if [ -d /var/lib/tor/hidden_service_gogs ]; then
  354. echo -n "$(cat /var/lib/tor/hidden_service_gogs/hostname)"
  355. fi
  356. echo ''
  357. fi
  358. if grep -q "RSS reader domain" $COMPLETION_FILE; then
  359. if [ -d /var/lib/tor/hidden_service_ttrss ]; then
  360. echo -n -e "$(pad_string 'RSS reader')"
  361. RSSDOM='-'
  362. echo -n -e "$(pad_string ${RSSDOM})"
  363. echo -n "$(cat /var/lib/tor/hidden_service_ttrss/hostname)"
  364. echo ''
  365. fi
  366. if [ -d /var/lib/tor/hidden_service_ttrss_mobile ]; then
  367. echo -n -e "$(pad_string 'RSS mobile')"
  368. RSSMOBILEDOM='-'
  369. echo -n -e "$(pad_string ${RSSMOBILEDOM})"
  370. echo -n "$(cat /var/lib/tor/hidden_service_ttrss_mobile/hostname)"
  371. echo ''
  372. fi
  373. fi
  374. if grep -q "Webmail onion domain" $COMPLETION_FILE; then
  375. echo -n -e "$(pad_string 'Webmail')"
  376. WEBMAILDOM='-'
  377. echo -n -e "$(pad_string ${WEBMAILDOM})"
  378. if [ -d /var/lib/tor/hidden_service_webmail ]; then
  379. echo -n "$(cat /var/lib/tor/hidden_service_webmail/hostname)"
  380. fi
  381. echo ''
  382. fi
  383. if grep -q "Search engine onion domain" $COMPLETION_FILE; then
  384. echo -n -e "$(pad_string 'Search engine')"
  385. SEARCHDOM='-'
  386. echo -n -e "$(pad_string ${SEARCHDOM})"
  387. if [ -d /var/lib/tor/hidden_service_searx ]; then
  388. echo -n "$(cat /var/lib/tor/hidden_service_searx/hostname)"
  389. fi
  390. echo ''
  391. fi
  392. if grep -q "Mediagoblin domain" $COMPLETION_FILE; then
  393. echo -n -e "$(pad_string 'Mediagoblin')"
  394. MEDIADOM=$(cat ${COMPLETION_FILE} | grep 'Mediagoblin domain' | awk -F ':' '{print $2}')
  395. echo -n -e "$(pad_string ${MEDIADOM})"
  396. if [ -d /var/lib/tor/hidden_service_mediagoblin ]; then
  397. echo -n "$(cat /var/lib/tor/hidden_service_mediagoblin/hostname)"
  398. fi
  399. echo ''
  400. fi
  401. echo ''
  402. }
  403. function show_users {
  404. echo 'Users'
  405. echo '====='
  406. echo ''
  407. echo -n -e "$(pad_string 'Name')"
  408. echo -n -e "$(pad_string 'SIP ext')"
  409. echo -n -e "$(pad_string 'Data')"
  410. echo ''
  411. echo '--------------------------------------------------------------------------'
  412. for d in /home/*/ ; do
  413. USRNAME=$(echo "$d" | awk -F '/' '{print $3}')
  414. if [[ $USRNAME != "git" && $USRNAME != "mirrors" && $USRNAME != "sync" ]]; then
  415. echo -n -e "$(pad_string ${USRNAME})"
  416. # get the SIP extension
  417. SIPEXT=
  418. while read ext; do
  419. if [[ $ext == *"user id"* ]]; then
  420. CURR_UID=$(echo "$ext" | awk -F '"' '{print $2}' | awk -F '"' '{print $1}')
  421. fi
  422. if [[ $ext == *"extension"* ]]; then
  423. if [[ $CURR_UID == $USRNAME ]]; then
  424. SIPEXT=$(echo "$ext" | awk -F '>' '{print $2}' | awk -F '<' '{print $1}')
  425. fi
  426. fi
  427. done < $SIP_CONFIGURATION_FILE
  428. if [ $SIPEXT ]; then
  429. echo -n -e "$(pad_string SIP:${SIPEXT})"
  430. else
  431. echo -n -e "$(pad_string '')"
  432. fi
  433. # size of the home directory
  434. echo "$(du -s -h /home/${USRNAME} | awk -F ' ' '{print $1}')"
  435. fi
  436. done
  437. echo ''
  438. }
  439. function show_mirrors_password {
  440. if [ ! /home/mirrors ]; then
  441. return
  442. fi
  443. if grep -q "MY_MIRRORS_PASSWORD" $CONFIGURATION_FILE; then
  444. MY_MIRRORS_PASSWORD=$(grep "MY_MIRRORS_PASSWORD" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
  445. fi
  446. echo 'Local Mirrors'
  447. echo '============='
  448. echo ''
  449. echo -n "URL: "
  450. echo "$(cat ${COMPLETION_FILE} | grep 'ssh onion domain' | awk -F ':' '{print $2}')"
  451. echo "SSH Port: $SSH_PORT"
  452. echo "Password: $MY_MIRRORS_PASSWORD"
  453. echo ''
  454. }
  455. function show_about {
  456. clear
  457. show_domains
  458. show_mirrors_password
  459. show_users
  460. any_key
  461. }
  462. function select_user {
  463. SELECTED_USERNAME=
  464. users_array=($(ls /home))
  465. delete=(mirrors git)
  466. for del in ${delete[@]}
  467. do
  468. users_array=(${users_array[@]/$del})
  469. done
  470. i=0
  471. W=()
  472. name=()
  473. for u in ${users_array[@]}
  474. do
  475. i=$((i+1))
  476. W+=($i "$u")
  477. name+=("$u")
  478. done
  479. user_index=$(dialog --backtitle $"Freedombone Control Panel" --title $"Select User" --menu $"Select one of the following:" 24 40 17 "${W[@]}" 3>&2 2>&1 1>&3)
  480. if [ $? -eq 0 ]; then
  481. SELECTED_USERNAME="${name[$((user_index-1))]}"
  482. fi
  483. }
  484. function smtp_proxy {
  485. MUTTRC_FILE=/home/$ADMIN_USER/.muttrc
  486. if [ ! -f $MUTTRC_FILE ]; then
  487. return
  488. fi
  489. data=$(tempfile 2>/dev/null)
  490. trap "rm -f $data" 0 1 2 5 15
  491. dialog --backtitle $"Freedombone Control Panel" \
  492. --title $"SMTP Proxy for $ADMIN_USER" \
  493. --form $"You may need to proxy outgoing email via your ISP's mail server. If so enter the details below." 14 75 6 \
  494. $"Enable proxy:" 1 1 "$SMTP_PROXY_ENABLE" 1 24 5 5 \
  495. $"Protocol (smtp/smtps):" 2 1 "$SMTP_PROXY_PROTOCOL" 2 24 5 5 \
  496. $"ISP mail server:" 3 1 "$SMTP_PROXY_SERVER" 3 24 40 10000 \
  497. $"Port:" 4 1 "$SMTP_PROXY_PORT" 4 24 5 5 \
  498. $"Username:" 5 1 "$SMTP_PROXY_USERNAME" 5 24 40 10000 \
  499. $"Password:" 6 1 "$SMTP_PROXY_PASSWORD" 6 24 40 10000 \
  500. 2> $data
  501. sel=$?
  502. case $sel in
  503. 1) return;;
  504. 255) return;;
  505. esac
  506. SMTP_PROXY_ENABLE=$(cat $data | sed -n 1p)
  507. SMTP_PROXY_PROTOCOL=$(cat $data | sed -n 2p)
  508. SMTP_PROXY_SERVER=$(cat $data | sed -n 3p)
  509. SMTP_PROXY_PORT=$(cat $data | sed -n 4p)
  510. SMTP_PROXY_USERNAME=$(cat $data | sed -n 5p)
  511. SMTP_PROXY_PASSWORD=$(cat $data | sed -n 6p)
  512. # change muttrc
  513. if [ $SMTP_PROXY_ENABLE != $'no' ]; then
  514. if ! grep "set smtp_url" $MUTTRC_FILE; then
  515. echo "set smtp_url=\"${SMTP_PROXY_PROTOCOL}://${SMTP_PROXY_USERNAME}:${SMTP_PROXY_PASSWORD}@${SMTP_PROXY_SERVER}:${SMTP_PROXY_PORT}/\"" >> $MUTTRC_FILE
  516. else
  517. sed -i "s|set smtp_url=.*|set smtp_url=\"${SMTP_PROXY_PROTOCOL}://${SMTP_PROXY_USERNAME}:${SMTP_PROXY_PASSWORD}@${SMTP_PROXY_SERVER}:${SMTP_PROXY_PORT}/\"|g" $MUTTRC_FILE
  518. fi
  519. sed -i 's|#set smtp_url|set smtp_url|g' $MUTTRC_FILE
  520. else
  521. if grep "set smtp_url" $MUTTRC_FILE; then
  522. sed -i 's|set smtp_url|#set smtp_url|g' $MUTTRC_FILE
  523. fi
  524. fi
  525. # save settings within the main configuration file
  526. if ! grep -q "SMTP_PROXY_ENABLE=" $CONFIGURATION_FILE; then
  527. echo "SMTP_PROXY_ENABLE=$SMTP_PROXY_ENABLE" >> $CONFIGURATION_FILE
  528. else
  529. sed -i "s|SMTP_PROXY_ENABLE=.*|SMTP_PROXY_ENABLE=$SMTP_PROXY_ENABLE|g" $CONFIGURATION_FILE
  530. fi
  531. if ! grep -q "SMTP_PROXY_PROTOCOL=" $CONFIGURATION_FILE; then
  532. echo "SMTP_PROXY_PROTOCOL=$SMTP_PROXY_PROTOCOL" >> $CONFIGURATION_FILE
  533. else
  534. sed -i "s|SMTP_PROXY_PROTOCOL=.*|SMTP_PROXY_PROTOCOL=$SMTP_PROXY_PROTOCOL|g" $CONFIGURATION_FILE
  535. fi
  536. if ! grep -q "SMTP_PROXY_SERVER=" $CONFIGURATION_FILE; then
  537. echo "SMTP_PROXY_SERVER=$SMTP_PROXY_SERVER" >> $CONFIGURATION_FILE
  538. else
  539. sed -i "s|SMTP_PROXY_SERVER=.*|SMTP_PROXY_SERVER=$SMTP_PROXY_SERVER|g" $CONFIGURATION_FILE
  540. fi
  541. if ! grep -q "SMTP_PROXY_PORT=" $CONFIGURATION_FILE; then
  542. echo "SMTP_PROXY_PORT=$SMTP_PROXY_PORT" >> $CONFIGURATION_FILE
  543. else
  544. sed -i "s|SMTP_PROXY_PORT=.*|SMTP_PROXY_PORT=$SMTP_PROXY_PORT|g" $CONFIGURATION_FILE
  545. fi
  546. if ! grep -q "SMTP_PROXY_USERNAME=" $CONFIGURATION_FILE; then
  547. echo "SMTP_PROXY_USERNAME=$SMTP_PROXY_USERNAME" >> $CONFIGURATION_FILE
  548. else
  549. sed -i "s|SMTP_PROXY_USERNAME=.*|SMTP_PROXY_USERNAME=$SMTP_PROXY_USERNAME|g" $CONFIGURATION_FILE
  550. fi
  551. if ! grep -q "SMTP_PROXY_PASSWORD=" $CONFIGURATION_FILE; then
  552. echo "SMTP_PROXY_PASSWORD=$SMTP_PROXY_PASSWORD" >> $CONFIGURATION_FILE
  553. else
  554. sed -i "s|SMTP_PROXY_PASSWORD=.*|SMTP_PROXY_PASSWORD=$SMTP_PROXY_PASSWORD|g" $CONFIGURATION_FILE
  555. fi
  556. }
  557. function delete_user {
  558. select_user
  559. if [ ! $SELECTED_USERNAME ]; then
  560. return
  561. fi
  562. if grep -Fxq "Admin user:$SELECTED_USERNAME" $COMPLETION_FILE; then
  563. dialog --title $"Administrator user" \
  564. --msgbox $"You can't delete the administrator user" 6 40
  565. return
  566. fi
  567. clear
  568. ${PROJECT_NAME}-rmuser $SELECTED_USERNAME
  569. any_key
  570. }
  571. function configure_remote_backups {
  572. if ! grep -Fxq "Admin user:$ADMIN_USER" $COMPLETION_FILE; then
  573. dialog --title $"Administrator user" \
  574. --msgbox $"No Administrator user found. Check $COMPLETION_FILE" 6 40
  575. return
  576. fi
  577. if [ ${#ADMIN_USER} -lt 2 ]; then
  578. dialog --title $"Administrator user" \
  579. --msgbox $"Username not found" 6 40
  580. return
  581. fi
  582. if [ ! -d /home/$ADMIN_USER ]; then
  583. dialog --title $"Administrator user" \
  584. --msgbox $"Home directory not found" 6 40
  585. return
  586. fi
  587. ${PROJECT_NAME}-remote -u $ADMIN_USER
  588. if [ ! "$?" = "0" ]; then
  589. any_key
  590. fi
  591. }
  592. function change_password {
  593. select_user
  594. if [ ! $SELECTED_USERNAME ]; then
  595. return
  596. fi
  597. dialog --title $"Change password" \
  598. --passwordbox $"New password for user $SELECTED_USERNAME" 8 40 2> $data
  599. newpassword=$(<$data)
  600. if [ ${#newpassword} -lt ${MINIMUM_PASSWORD_LENGTH} ]; then
  601. dialog --title $"Change password" \
  602. --msgbox $"The password should be ${MINIMUM_PASSWORD_LENGTH} or more characters" 6 40
  603. return
  604. fi
  605. echo "$SELECTED_USERNAME:$newpassword"|chpasswd
  606. dialog --title $"Change password" \
  607. --msgbox $"Password for $SELECTED_USERNAME was changed" 6 40
  608. }
  609. function irc_show_password {
  610. IRC_PASSWORD=$(cat /etc/ngircd/ngircd.conf | grep "Password =" | head -n 1 | awk -F '=' '{print $2}')
  611. dialog --title $"IRC Password" \
  612. --msgbox "$IRC_PASSWORD" 6 40
  613. }
  614. function irc_set_global_password {
  615. dialog --title $"IRC Password" \
  616. --clear \
  617. --backtitle $"Freedombone Control Panel" \
  618. --passwordbox $"Password for all IRC users, or press Enter for no password" 10 50 2> $data
  619. sel=$?
  620. case $sel in
  621. 0)
  622. EXISTING_IRC_PASSWORD=$(cat /etc/ngircd/ngircd.conf | grep "Password =" | head -n 1 | awk -F '=' '{print $2}')
  623. NEW_IRC_PASSWORD=$(<$data)
  624. sed -i "0,/RE/s/Password =.*/Password =$NEW_IRC_PASSWORD/" /etc/ngircd/ngircd.conf
  625. # replace the password for all users
  626. for d in /home/*/ ; do
  627. IRC_USERNAME=$(echo "$d" | awk -F '/' '{print $3}')
  628. if [[ $IRC_USERNAME != "git" && $IRC_USERNAME != "mirrors" && $IRC_USERNAME != "sync" ]]; then
  629. if [ -f /home/$IRC_USERNAME/.irssi/config ]; then
  630. sed -i "s|$EXISTING_IRC_PASSWORD|$NEW_IRC_PASSWORD|g" /home/$IRC_USERNAME/.irssi/config
  631. chown -R $IRC_USERNAME:$IRC_USERNAME /home/$IRC_USERNAME/.irssi
  632. fi
  633. fi
  634. done
  635. # restart the daemon for the new password to take effect
  636. systemctl restart ngircd
  637. dialog --title $"IRC Password" \
  638. --msgbox $"The IRC password was changed" 6 40
  639. ;;
  640. esac
  641. }
  642. function change_blog_avatar {
  643. data=$(tempfile 2>/dev/null)
  644. trap "rm -f $data" 0 1 2 5 15
  645. dialog --title $"Change blog avatar" \
  646. --backtitle $"Freedombone Control Panel" \
  647. --inputbox $"Enter a URL for an image. It should be approximately a square image." 8 75 2>$data
  648. sel=$?
  649. case $sel in
  650. 0)
  651. IMAGE_URL=$(<$data)
  652. if [ ${#IMAGE_URL} -gt 5 ]; then
  653. clear
  654. ${PROJECT_NAME}-blog -a $IMAGE_URL
  655. if [ "$?" = "0" ]; then
  656. dialog --title $"Change blog avatar" \
  657. --msgbox $"Your blog avatar has been changed" 6 40
  658. fi
  659. fi
  660. ;;
  661. esac
  662. }
  663. function change_ssh_public_key {
  664. select_user
  665. if [ ! $SELECTED_USERNAME ]; then
  666. return
  667. fi
  668. if grep -Fxq "Admin user:$SELECTED_USERNAME" $COMPLETION_FILE; then
  669. dialog --title $"Change ssh public key" \
  670. --backtitle $"Freedombone Control Panel" \
  671. --defaultno \
  672. --yesno $"\nThis is the administrator user.\n\nAre you sure you want to change the ssh public key for the administrator?" 10 60
  673. sel=$?
  674. case $sel in
  675. 1) return;;
  676. 255) return;;
  677. esac
  678. fi
  679. data=$(tempfile 2>/dev/null)
  680. trap "rm -f $data" 0 1 2 5 15
  681. dialog --title $"Change ssh public key for $SELECTED_USERNAME" \
  682. --backtitle $"Freedombone Control Panel" \
  683. --inputbox $"Paste the ssh public key below" 8 60 2>$data
  684. sel=$?
  685. case $sel in
  686. 0)
  687. SSH_PUBLIC_KEY=$(<$data)
  688. if [ "$SSH_PUBLIC_KEY" ]; then
  689. if [ ${#SSH_PUBLIC_KEY} -gt 5 ]; then
  690. if [ -f "$SSH_PUBLIC_KEY" ]; then
  691. if [ ! -d /home/$SELECTED_USERNAME/.ssh ]; then
  692. mkdir /home/$SELECTED_USERNAME/.ssh
  693. fi
  694. cp $SSH_PUBLIC_KEY \
  695. /home/$SELECTED_USERNAME/.ssh/authorized_keys
  696. chown -R $SELECTED_USERNAME:$SELECTED_USERNAME \
  697. /home/$SELECTED_USERNAME/.ssh
  698. dialog --title $"Change ssh public key" \
  699. --msgbox $"ssh public key was installed" 6 40
  700. else
  701. if [[ "$SSH_PUBLIC_KEY" == "ssh-"* ]]; then
  702. if [ ! -d /home/$SELECTED_USERNAME/.ssh ]; then
  703. mkdir /home/$SELECTED_USERNAME/.ssh
  704. fi
  705. echo "$SSH_PUBLIC_KEY" > \
  706. /home/$SELECTED_USERNAME/.ssh/authorized_keys
  707. chown -R $SELECTED_USERNAME:$SELECTED_USERNAME \
  708. /home/$SELECTED_USERNAME/.ssh
  709. dialog --title $"Change ssh public key" \
  710. --msgbox $"ssh public key was installed" 6 40
  711. fi
  712. fi
  713. fi
  714. fi
  715. ;;
  716. esac
  717. }
  718. function remove_user_from_mailing_list {
  719. select_user
  720. if [ ! $SELECTED_USERNAME ]; then
  721. return
  722. fi
  723. USER_MAILING_LISTS=$(cat "/home/$SELECTED_USERNAME/.procmailrc" | grep '\[' | grep '\]' | awk -F '\[' '{print $2}' | awk -F '\\' '{print $1}')
  724. i=0
  725. W=()
  726. list_name=()
  727. while read -r listname; do
  728. i=$((i+1))
  729. W+=($i "$listname")
  730. list_name+=("$listname")
  731. echo $listname
  732. done <<< "$USER_MAILING_LISTS"
  733. i=$((i+1))
  734. W+=($i $"Exit back to user mainenance")
  735. list_selected=$(dialog --default-item "$i" --backtitle $"Freedombone Control Panel" --title $"Remove a mailing list for $SELECTED_USERNAME" --menu $"Select one of the following:" 24 50 17 "${W[@]}" 3>&2 2>&1 1>&3)
  736. if [ $? -eq 0 ]; then # Exit with OK
  737. if [ ${list_selected} -ne ${i} ]; then
  738. remove_list_name="${list_name[$((list_selected-1))]}"
  739. # find the line number where the list is defined
  740. line_number=0
  741. i=0
  742. while read -r line
  743. do
  744. if [[ "$line" == *"\[${remove_list_name}\\]"* ]]; then
  745. line_number=${i}
  746. fi
  747. i=$((i+1))
  748. done < "/home/$SELECTED_USERNAME/.procmailrc"
  749. if [ ${line_number} -eq 0 ]; then
  750. # no match was found
  751. return
  752. fi
  753. # recreate the file
  754. if [ -f /home/${SELECTED_USERNAME}/.procmailrc_new ]; then
  755. rm /home/${SELECTED_USERNAME}/.procmailrc_new
  756. fi
  757. i=0
  758. clip=0
  759. while read -r line
  760. do
  761. i=$((i+1))
  762. if [ ${i} -gt $((line_number-1)) ]; then
  763. if [ ${clip} -eq 0 ]; then
  764. clip=1
  765. fi
  766. if [ ${clip} -eq 1 ]; then
  767. if [ ${i} -lt $((line_number+2)) ]; then
  768. continue
  769. else
  770. if [ ${#line} -lt 1 ]; then
  771. clip=2
  772. continue
  773. fi
  774. if [[ "$line" == ":"* || "$line" == "#"* ]]; then
  775. clip=2
  776. else
  777. continue
  778. fi
  779. fi
  780. fi
  781. fi
  782. echo "$line" >> /home/${SELECTED_USERNAME}/.procmailrc_new
  783. if [[ "$line" == *"\[${remove_list_name}\\]"* ]]; then
  784. line_number=${i}
  785. fi
  786. done < "/home/$SELECTED_USERNAME/.procmailrc"
  787. cp /home/${SELECTED_USERNAME}/.procmailrc_new /home/${SELECTED_USERNAME}/.procmailrc
  788. rm /home/${SELECTED_USERNAME}/.procmailrc_new
  789. chown ${SELECTED_USERNAME}:${SELECTED_USERNAME} /home/${SELECTED_USERNAME}/.procmailrc
  790. dialog --title $"Remove user from mailing list" \
  791. --msgbox $"${SELECTED_USERNAME} has been removed from ${remove_list_name}" 6 50
  792. fi
  793. fi
  794. }
  795. function add_to_mailing_list {
  796. select_user
  797. if [ ! $SELECTED_USERNAME ]; then
  798. return
  799. fi
  800. data=$(tempfile 2>/dev/null)
  801. trap "rm -f $data" 0 1 2 5 15
  802. dialog --backtitle $"Freedombone Control Panel" \
  803. --title $"Subscribe $SELECTED_USERNAME to a mailing list" \
  804. --form $"You can either enter a subject or an email address\n" 11 68 4 \
  805. $"List folder name:" 1 1 "" 1 35 26 25 \
  806. $"Name between [] on subject line:" 2 1 "" 2 35 26 25 \
  807. $"List email address:" 3 1 "" 3 35 26 25 \
  808. $"Public:" 4 1 $"yes" 4 35 4 25 \
  809. 2> $data
  810. sel=$?
  811. case $sel in
  812. 1) return;;
  813. 255) return;;
  814. esac
  815. LIST_NAME=$(cat $data | sed -n 1p)
  816. LIST_SUBJECT=$(cat $data | sed -n 2p)
  817. LIST_EMAIL=$(cat $data | sed -n 3p)
  818. LIST_PUBLIC=$(cat $data | sed -n 4p)
  819. if [ ${#LIST_PUBLIC} -lt 1 ]; then
  820. LIST_PUBLIC='no'
  821. fi
  822. if [[ $LIST_PUBLIC == $'y' || $LIST_PUBLIC == $'Y' || $LIST_PUBLIC == $'true' || $LIST_PUBLIC == $'True' || $LIST_PUBLIC == $'yes' || $LIST_PUBLIC == $'Yes' || $LIST_PUBLIC == $'YES' ]]; then
  823. LIST_PUBLIC='yes'
  824. else
  825. LIST_PUBLIC='no'
  826. fi
  827. if [ ${#LIST_NAME} -lt 2 ]; then
  828. dialog --title $"Add mailing list" \
  829. --msgbox $"No mailing list name was given" 6 40
  830. return
  831. fi
  832. if [ ${#LIST_SUBJECT} -lt 2 ]; then
  833. if [ ${#LIST_EMAIL} -lt 2 ]; then
  834. dialog --title $"Add mailing list" \
  835. --msgbox $"No mailing list subject or address was given" 6 40
  836. return
  837. fi
  838. fi
  839. if [ ${#LIST_SUBJECT} -gt 1 ]; then
  840. ${PROJECT_NAME}-addlist -u $SELECTED_USERNAME -l "$LIST_NAME" \
  841. -s "$LIST_SUBJECT" --public $LIST_PUBLIC
  842. else
  843. if [[ "$LIST_EMAIL" != *"@"* || "$LIST_EMAIL" != *"."* ]]; then
  844. dialog --title $"Add mailing list" \
  845. --msgbox $"Unrecognised email address" 6 40
  846. return
  847. else
  848. ${PROJECT_NAME}-addlist -u $SELECTED_USERNAME -l "$LIST_NAME" \
  849. -e "$LIST_EMAIL" --public $LIST_PUBLIC
  850. fi
  851. fi
  852. dialog --title $"Add mailing list" \
  853. --msgbox $"$LIST_NAME list was added" 6 40
  854. }
  855. function email_rule {
  856. select_user
  857. if [ ! $SELECTED_USERNAME ]; then
  858. return
  859. fi
  860. data=$(tempfile 2>/dev/null)
  861. trap "rm -f $data" 0 1 2 5 15
  862. dialog --backtitle $"Freedombone Control Panel" \
  863. --title $"Email rule for user $SELECTED_USERNAME" \
  864. --form "\n" 9 65 4 \
  865. $"When email arrives from address:" 1 1 "" 1 35 24 28 \
  866. $"Move to folder:" 2 1 "" 2 35 24 28 \
  867. $"Public:" 3 1 $"no" 3 35 4 25 \
  868. 2> $data
  869. sel=$?
  870. case $sel in
  871. 1) return;;
  872. 255) return;;
  873. esac
  874. RULE_EMAIL=$(cat $data | sed -n 1p)
  875. RULE_FOLDER=$(cat $data | sed -n 2p)
  876. RULE_PUBLIC=$(cat $data | sed -n 3p)
  877. if [ ${#RULE_PUBLIC} -lt 1 ]; then
  878. RULE_PUBLIC='no'
  879. fi
  880. if [[ $RULE_PUBLIC == $'y' || $RULE_PUBLIC == $'Y' || $RULE_PUBLIC == $'true' || $RULE_PUBLIC == $'True' || $RULE_PUBLIC == $'yes' || $RULE_PUBLIC == $'Yes' || $RULE_PUBLIC == $'YES' ]]; then
  881. RULE_PUBLIC='yes'
  882. else
  883. RULE_PUBLIC='no'
  884. fi
  885. if [ ${#RULE_EMAIL} -lt 2 ]; then
  886. dialog --title $"Add email rule" \
  887. --msgbox $"No email address was given" 6 40
  888. return
  889. fi
  890. if [ ${#RULE_FOLDER} -lt 2 ]; then
  891. dialog --title $"Add email rule" \
  892. --msgbox $"No folder name was given" 6 40
  893. return
  894. fi
  895. if [[ "$RULE_EMAIL" != *"@"* || "$RULE_EMAIL" != *"."* ]]; then
  896. dialog --title $"Add email rule" \
  897. --msgbox $"Unrecognised email address" 6 40
  898. return
  899. fi
  900. ${PROJECT_NAME}-addemail -u $SELECTED_USERNAME -e "$RULE_EMAIL" \
  901. -g "$RULE_FOLDER" --public $RULE_PUBLIC
  902. dialog --title $"Add email rule" \
  903. --msgbox $"Email rule for $RULE_EMAIL was added" 6 40
  904. }
  905. function block_unblock_email {
  906. select_user
  907. if [ ! $SELECTED_USERNAME ]; then
  908. return
  909. fi
  910. blockstr=$"Block/Unblock email going to"
  911. data=$(tempfile 2>/dev/null)
  912. trap "rm -f $data" 0 1 2 5 15
  913. dialog --backtitle $"Freedombone Control Panel" \
  914. --title "$blockstr $SELECTED_USERNAME" \
  915. --form "\n" 8 65 3 \
  916. $"When email arrives from address:" 1 1 "" 1 35 24 100 \
  917. $"Block it:" 2 1 "yes" 2 35 4 4 \
  918. 2> $data
  919. sel=$?
  920. case $sel in
  921. 1) return;;
  922. 255) return;;
  923. esac
  924. BLOCK_EMAIL=$(cat $data | sed -n 1p)
  925. BLOCK=$(cat $data | sed -n 2p)
  926. if [ ${#BLOCK_EMAIL} -lt 2 ]; then
  927. dialog --title $"Block/Unblock an email" \
  928. --msgbox $"No email address was given" 6 40
  929. return
  930. fi
  931. if [[ "$BLOCK_EMAIL" != *"@"* || "$BLOCK_EMAIL" != *"."* ]]; then
  932. dialog --title $"Block/Unblock an email" \
  933. --msgbox $"Unrecognised email address" 6 40
  934. return
  935. fi
  936. if [[ $BLOCK == "y"* || $BLOCK == "Y"* ]]; then
  937. ${PROJECT_NAME}-ignore -u $SELECTED_USERNAME -e "$BLOCK_EMAIL"
  938. dialog --title $"Block an email" \
  939. --msgbox "Email from $BLOCK_EMAIL to $SELECTED_USERNAME blocked" 6 75
  940. else
  941. ${PROJECT_NAME}-unignore -u $SELECTED_USERNAME -e "$BLOCK_EMAIL"
  942. dialog --title $"Unblock an email" \
  943. --msgbox "Email from $BLOCK_EMAIL to $SELECTED_USERNAME unblocked" 6 75
  944. fi
  945. }
  946. function block_unblock_subject {
  947. select_user
  948. if [ ! $SELECTED_USERNAME ]; then
  949. return
  950. fi
  951. blockstr=$"Block/Unblock email going to"
  952. data=$(tempfile 2>/dev/null)
  953. trap "rm -f $data" 0 1 2 5 15
  954. dialog --backtitle $"Freedombone Control Panel" \
  955. --title "$blockstr $SELECTED_USERNAME" \
  956. --form "\n" 8 70 3 \
  957. $"When email arrives with subject text:" 1 1 "" 1 40 24 28 \
  958. $"Block it:" 2 1 "yes" 2 40 4 4 \
  959. 2> $data
  960. sel=$?
  961. case $sel in
  962. 1) return;;
  963. 255) return;;
  964. esac
  965. BLOCK_SUBJECT=$(cat $data | sed -n 1p)
  966. BLOCK=$(cat $data | sed -n 2p)
  967. if [ ${#BLOCK_SUBJECT} -lt 2 ]; then
  968. dialog --title $"Block/Unblock an email" \
  969. --msgbox $"No subject was given" 6 40
  970. return
  971. fi
  972. if [[ $BLOCK == "y"* || $BLOCK == "Y"* ]]; then
  973. ${PROJECT_NAME}-ignore -u $SELECTED_USERNAME -t "$BLOCK_SUBJECT"
  974. dialog --title $"Block an email" \
  975. --msgbox "Email with subject $BLOCK_SUBJECT to $SELECTED_USERNAME blocked" 6 40
  976. else
  977. ${PROJECT_NAME}-unignore -u $SELECTED_USERNAME -t "$BLOCK_SUBJECT"
  978. dialog --title $"Unblock an email" \
  979. --msgbox "Email with subject $BLOCK_SUBJECT to $SELECTED_USERNAME unblocked" 6 40
  980. fi
  981. }
  982. function create_keydrive_master {
  983. select_user
  984. if [ ! $SELECTED_USERNAME ]; then
  985. return
  986. fi
  987. dialog --title $"USB Master Keydrive" \
  988. --msgbox $"Plug in a LUKS encrypted USB drive" 6 40
  989. clear
  990. ${PROJECT_NAME}-keydrive -u $SELECTED_USERNAME --master 'yes'
  991. any_key
  992. }
  993. function create_keydrive_fragment {
  994. select_user
  995. if [ ! $SELECTED_USERNAME ]; then
  996. return
  997. fi
  998. dialog --title $"USB Fragment Keydrive" \
  999. --msgbox $"Plug in a LUKS encrypted USB drive" 6 40
  1000. clear
  1001. ${PROJECT_NAME}-keydrive -u $SELECTED_USERNAME
  1002. any_key
  1003. }
  1004. function backup_data {
  1005. dialog --title $"Backup data to USB" \
  1006. --msgbox $"Plug in a LUKS encrypted USB drive" 6 40
  1007. clear
  1008. echo ' '
  1009. echo $'Enter the passphrase for your LUKS encrypted backup drive:'
  1010. ${PROJECT_NAME}-backup-local
  1011. any_key
  1012. }
  1013. function restore_from_usb {
  1014. while true
  1015. do
  1016. data=$(tempfile 2>/dev/null)
  1017. trap "rm -f $data" 0 1 2 5 15
  1018. dialog --backtitle $"Freedombone Control Panel" \
  1019. --title $"Restore from USB backup" \
  1020. --radiolist $"Choose an application to restore:" 32 70 28 \
  1021. 1 $"Everything" off \
  1022. 2 $"Return to the backup and restore menu" on \
  1023. 3 $"Configuration files" off \
  1024. 4 $"MariaDB settings" off \
  1025. 5 $"Let's Encrypt account" off \
  1026. 6 $"Mutt email client settings" off \
  1027. 7 $"GPG keys" off \
  1028. 8 $"Email processing rules" off \
  1029. 9 $"Spam filtering rules" off \
  1030. 10 $"Administrator's README file" off \
  1031. 11 $"IPFS" off \
  1032. 12 $"SSH keys" off \
  1033. 13 $"User configuration files" off \
  1034. 14 $"User local files" off \
  1035. 15 $"User fin files" off \
  1036. 16 $"SSL/TLS certificates" off \
  1037. 17 $"Personal settings" off \
  1038. 18 $"Mailing List" off \
  1039. 19 $"XMPP chat" off \
  1040. 20 $"GNU Social" off \
  1041. 21 $"Hubzilla" off \
  1042. 22 $"Syncthing" off \
  1043. 23 $"Gogs" off \
  1044. 24 $"Wiki" off \
  1045. 25 $"Blog" off \
  1046. 26 $"CJDNS" off \
  1047. 27 $"Email" off \
  1048. 28 $"DLNA" off \
  1049. 29 $"VoIP" off \
  1050. 30 $"RSS reader" off \
  1051. 31 $"Tox" off \
  1052. 32 $"Mediagoblin" off 2> $data
  1053. sel=$?
  1054. case $sel in
  1055. 1) break;;
  1056. 255) break;;
  1057. esac
  1058. if [ $(cat $data) -ne 2 ]; then
  1059. clear
  1060. fi
  1061. case $(cat $data) in
  1062. 1) ${PROJECT_NAME}-restore-local $USB_DRIVE;;
  1063. 2) return;;
  1064. 3) ${PROJECT_NAME}-restore-local $USB_DRIVE configuration;;
  1065. 4) ${PROJECT_NAME}-restore-local $USB_DRIVE mariadb;;
  1066. 5) ${PROJECT_NAME}-restore-local $USB_DRIVE letsencrypt;;
  1067. 6) ${PROJECT_NAME}-restore-local $USB_DRIVE mutt;;
  1068. 7) ${PROJECT_NAME}-restore-local $USB_DRIVE gpg;;
  1069. 8) ${PROJECT_NAME}-restore-local $USB_DRIVE procmail;;
  1070. 9) ${PROJECT_NAME}-restore-local $USB_DRIVE spamassassin;;
  1071. 10) ${PROJECT_NAME}-restore-local $USB_DRIVE readme;;
  1072. 11) ${PROJECT_NAME}-restore-local $USB_DRIVE ipfs;;
  1073. 12) ${PROJECT_NAME}-restore-local $USB_DRIVE ssh;;
  1074. 13) ${PROJECT_NAME}-restore-local $USB_DRIVE userconfig;;
  1075. 14) ${PROJECT_NAME}-restore-local $USB_DRIVE userlocal;;
  1076. 15) ${PROJECT_NAME}-restore-local $USB_DRIVE userfin;;
  1077. 16) ${PROJECT_NAME}-restore-local $USB_DRIVE certs;;
  1078. 17) ${PROJECT_NAME}-restore-local $USB_DRIVE personal;;
  1079. 18) ${PROJECT_NAME}-restore-local $USB_DRIVE mailinglist;;
  1080. 19) ${PROJECT_NAME}-restore-local $USB_DRIVE xmpp;;
  1081. 20) ${PROJECT_NAME}-restore-local $USB_DRIVE gnusocial;;
  1082. 21) ${PROJECT_NAME}-restore-local $USB_DRIVE hubzilla;;
  1083. 22) ${PROJECT_NAME}-restore-local $USB_DRIVE syncthing;;
  1084. 23) ${PROJECT_NAME}-restore-local $USB_DRIVE gogs;;
  1085. 24) ${PROJECT_NAME}-restore-local $USB_DRIVE wiki;;
  1086. 25) ${PROJECT_NAME}-restore-local $USB_DRIVE blog;;
  1087. 26) ${PROJECT_NAME}-restore-local $USB_DRIVE cjdns;;
  1088. 27) ${PROJECT_NAME}-restore-local $USB_DRIVE email;;
  1089. 28) ${PROJECT_NAME}-restore-local $USB_DRIVE dlna;;
  1090. 29) ${PROJECT_NAME}-restore-local $USB_DRIVE voip;;
  1091. 30) ${PROJECT_NAME}-restore-local $USB_DRIVE ttrss;;
  1092. 31) ${PROJECT_NAME}-restore-local $USB_DRIVE tox;;
  1093. 32) ${PROJECT_NAME}-restore-local $USB_DRIVE mediagoblin;;
  1094. esac
  1095. done
  1096. any_key
  1097. }
  1098. function restore_from_remote {
  1099. remote_domain_name=$1
  1100. while true
  1101. do
  1102. data=$(tempfile 2>/dev/null)
  1103. trap "rm -f $data" 0 1 2 5 15
  1104. dialog --backtitle $"Freedombone Control Panel" \
  1105. --title $"Restore from ${remote_domain_name}" \
  1106. --radiolist $"Choose an application to restore:" 31 70 28 \
  1107. 1 $"Everything" off \
  1108. 2 $"Return to the backup and restore menu" on \
  1109. 3 $"Configuration files" off \
  1110. 4 $"MariaDB settings" off \
  1111. 5 $"Let's Encrypt account" off \
  1112. 6 $"Mutt email client settings" off \
  1113. 7 $"GPG keys" off \
  1114. 8 $"Email processing rules" off \
  1115. 9 $"Spam filtering rules" off \
  1116. 10 $"Administrator's README file" off \
  1117. 11 $"IPFS" off \
  1118. 12 $"SSH keys" off \
  1119. 13 $"User configuration files" off \
  1120. 14 $"User local files" off \
  1121. 15 $"User fin files" off \
  1122. 16 $"SSL/TLS certificates" off \
  1123. 17 $"Personal settings" off \
  1124. 18 $"Mailing List" off \
  1125. 19 $"XMPP chat" off \
  1126. 20 $"GNU Social" off \
  1127. 21 $"Hubzilla" off \
  1128. 22 $"Syncthing" off \
  1129. 23 $"Gogs" off \
  1130. 24 $"Wiki" off \
  1131. 25 $"Blog" off \
  1132. 26 $"CJDNS" off \
  1133. 27 $"Email" off \
  1134. 28 $"DLNA" off \
  1135. 29 $"VoIP" off \
  1136. 30 $"RSS reader" off \
  1137. 31 $"Tox" off 2> $data
  1138. sel=$?
  1139. case $sel in
  1140. 1) break;;
  1141. 255) break;;
  1142. esac
  1143. if [ $(cat $data) -ne 2 ]; then
  1144. clear
  1145. fi
  1146. case $(cat $data) in
  1147. 1) ${PROJECT_NAME}-restore-remote $remote_domain_name;;
  1148. 2) return;;
  1149. 3) ${PROJECT_NAME}-restore-remote $remote_domain_name configuration;;
  1150. 4) ${PROJECT_NAME}-restore-remote $remote_domain_name mariadb;;
  1151. 5) ${PROJECT_NAME}-restore-remote $remote_domain_name letsencrypt;;
  1152. 6) ${PROJECT_NAME}-restore-remote $remote_domain_name mutt;;
  1153. 7) ${PROJECT_NAME}-restore-remote $remote_domain_name gpg;;
  1154. 8) ${PROJECT_NAME}-restore-remote $remote_domain_name procmail;;
  1155. 9) ${PROJECT_NAME}-restore-remote $remote_domain_name spamassassin;;
  1156. 10) ${PROJECT_NAME}-restore-remote $remote_domain_name readme;;
  1157. 11) ${PROJECT_NAME}-restore-remote $remote_domain_name ipfs;;
  1158. 12) ${PROJECT_NAME}-restore-remote $remote_domain_name ssh;;
  1159. 13) ${PROJECT_NAME}-restore-remote $remote_domain_name userconfig;;
  1160. 14) ${PROJECT_NAME}-restore-remote $remote_domain_name userlocal;;
  1161. 15) ${PROJECT_NAME}-restore-remote $remote_domain_name userfin;;
  1162. 16) ${PROJECT_NAME}-restore-remote $remote_domain_name certs;;
  1163. 17) ${PROJECT_NAME}-restore-remote $remote_domain_name personal;;
  1164. 18) ${PROJECT_NAME}-restore-remote $remote_domain_name mailinglist;;
  1165. 19) ${PROJECT_NAME}-restore-remote $remote_domain_name xmpp;;
  1166. 20) ${PROJECT_NAME}-restore-remote $remote_domain_name gnusocial;;
  1167. 21) ${PROJECT_NAME}-restore-remote $remote_domain_name hubzilla;;
  1168. 22) ${PROJECT_NAME}-restore-remote $remote_domain_name syncthing;;
  1169. 23) ${PROJECT_NAME}-restore-remote $remote_domain_name gogs;;
  1170. 24) ${PROJECT_NAME}-restore-remote $remote_domain_name wiki;;
  1171. 25) ${PROJECT_NAME}-restore-remote $remote_domain_name blog;;
  1172. 26) ${PROJECT_NAME}-restore-remote $remote_domain_name cjdns;;
  1173. 27) ${PROJECT_NAME}-restore-remote $remote_domain_name email;;
  1174. 28) ${PROJECT_NAME}-restore-remote $remote_domain_name dlna;;
  1175. 29) ${PROJECT_NAME}-restore-remote $remote_domain_name voip;;
  1176. 30) ${PROJECT_NAME}-restore-remote $remote_domain_name ttrss;;
  1177. 31) ${PROJECT_NAME}-restore-remote $remote_domain_name tox;;
  1178. esac
  1179. done
  1180. any_key
  1181. }
  1182. function restore_data {
  1183. dialog --title $"Restore data from USB" \
  1184. --msgbox $"Plug in your backup USB drive" 6 40
  1185. clear
  1186. echo ' '
  1187. echo $'Enter the passphrase for your LUKS encrypted backup drive:'
  1188. restore_from_usb
  1189. }
  1190. function restore_data_remote {
  1191. if [ ! $ADMIN_USER ]; then
  1192. dialog --title $"Restore data from remote server" \
  1193. --msgbox $"Unknown admin user" 6 40
  1194. return
  1195. fi
  1196. data=$(tempfile 2>/dev/null)
  1197. trap "rm -f $data" 0 1 2 5 15
  1198. dialog --title $"Restore from remote server" \
  1199. --backtitle $"Freedombone Control Panel" \
  1200. --inputbox $"Enter the domain name of the server from which you wish to restore" 8 60 2>$data
  1201. sel=$?
  1202. case $sel in
  1203. 0)
  1204. friend_server_domain_name=$(<$data)
  1205. if [ ${#friend_server_domain_name} -lt 2 ]; then
  1206. return
  1207. fi
  1208. if [[ $friend_server_domain_name != *"."* ]]; then
  1209. dialog --title $"Remote server domain name" \
  1210. --msgbox $"Invalid domain name" 6 40
  1211. return
  1212. fi
  1213. restore_from_remote $friend_server_domain_name
  1214. ;;
  1215. esac
  1216. }
  1217. function ping_enable_disable {
  1218. ping_str=$"\nDo you want to enable other systems to ping this machine?\n\nPing may be useful for diagnostic purposes, but for added security you may not want to enable it."
  1219. enable_ping="no"
  1220. dialog --title $"Enable Ping / ICMP" \
  1221. --backtitle $"Freedombone Control Panel" \
  1222. --defaultno \
  1223. --yesno "$ping_str" 10 60
  1224. sel=$?
  1225. case $sel in
  1226. 0) enable_ping="yes";;
  1227. 255) return;;
  1228. esac
  1229. if [[ $enable_ping == "yes" ]]; then
  1230. iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
  1231. iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT
  1232. echo "0" > /proc/sys/net/ipv4/icmp_echo_ignore_all
  1233. else
  1234. iptables -D INPUT -p icmp --icmp-type echo-request -j ACCEPT
  1235. iptables -D OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT
  1236. echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_all
  1237. fi
  1238. }
  1239. function logging_on_off {
  1240. logging="no"
  1241. dialog --title $"Logging" \
  1242. --backtitle $"Freedombone Control Panel" \
  1243. --yesno $"\nDo you want to turn logging on?" 7 60
  1244. sel=$?
  1245. case $sel in
  1246. 0) logging="yes";;
  1247. 255) return;;
  1248. esac
  1249. clear
  1250. echo ''
  1251. echo $'This may take a few seconds. Please wait...'
  1252. if [[ $logging == "no" ]]; then
  1253. ${PROJECT_NAME}-logging off
  1254. else
  1255. ${PROJECT_NAME}-logging on
  1256. fi
  1257. }
  1258. function restore_gpg_key {
  1259. select_user
  1260. if [ ! $SELECTED_USERNAME ]; then
  1261. return
  1262. fi
  1263. restorestr=$"Restore GPG key for user"
  1264. dialog --title "$restorestr $SELECTED_USERNAME" \
  1265. --msgbox $"Plug in your USB keydrive" 6 40
  1266. clear
  1267. ${PROJECT_NAME}-recoverkey -u $SELECTED_USERNAME
  1268. any_key
  1269. }
  1270. function security_settings {
  1271. ${PROJECT_NAME}-sec
  1272. any_key
  1273. }
  1274. function reset_tripwire {
  1275. clear
  1276. echo $'Resetting the Tripwire...'
  1277. echo ' '
  1278. echo '
  1279. ' | reset-tripwire
  1280. any_key
  1281. }
  1282. function hubzilla_renew_cert {
  1283. dialog --title $"Renew SSL certificate" \
  1284. --backtitle $"Freedombone Control Panel" \
  1285. --yesno $"\nThis will renew a letsencrypt certificate. Select 'yes' to continue" 16 60
  1286. sel=$?
  1287. case $sel in
  1288. 1) return;;
  1289. 255) return;;
  1290. esac
  1291. HUBZILLA_DOMAIN_NAME=$(cat $COMPLETION_FILE | grep "Hubzilla domain" | awk -F ':' '{print $2}')
  1292. if [ ! -d /var/www/$HUBZILLA_DOMAIN_NAME/htdocs ]; then
  1293. dialog --title $"Renew SSL certificate" \
  1294. --msgbox $"Hubzilla install directory not found" 6 40
  1295. return
  1296. fi
  1297. ${PROJECT_NAME}-renew-cert -h $HUBZILLA_DOMAIN_NAME -p 'letsencrypt'
  1298. if [ ! "$?" = "0" ]; then
  1299. any_key
  1300. else
  1301. dialog --title $"Renew SSL certificate" \
  1302. --msgbox $"Hubzilla certificate has been renewed" 6 40
  1303. fi
  1304. }
  1305. function hubzilla_channel_directory_server {
  1306. if ! grep -q "Hubzilla domain" $COMPLETION_FILE; then
  1307. dialog --title $"Hubzilla channel directory server" \
  1308. --msgbox $"Hubzilla is not installed on this system" 6 40
  1309. return
  1310. fi
  1311. HUBZILLA_DOMAIN_NAME=$(cat $COMPLETION_FILE | grep "Hubzilla domain" | awk -F ':' '{print $2}')
  1312. if [ ! -d /var/www/$HUBZILLA_DOMAIN_NAME/htdocs ]; then
  1313. dialog --title $"Hubzilla channel directory server" \
  1314. --msgbox $"Hubzilla install directory not found" 6 40
  1315. return
  1316. fi
  1317. data=$(tempfile 2>/dev/null)
  1318. trap "rm -f $data" 0 1 2 5 15
  1319. dialog --title $"Hubzilla channel directory server" \
  1320. --backtitle $"Freedombone Control Panel" \
  1321. --inputbox $"When you click on 'channel directory' this is where Hubzilla will obtain its list from" 8 60 2>$data
  1322. sel=$?
  1323. case $sel in
  1324. 0)
  1325. hubzilla_domain_server=$(<$data)
  1326. if [[ $hubzilla_domain_server != *"."* ]]; then
  1327. return
  1328. fi
  1329. if [[ $hubzilla_domain_server != "https"* ]]; then
  1330. dialog --title $"Hubzilla channel directory server" \
  1331. --msgbox $"Invalid domain - include the https://" 6 40
  1332. return
  1333. fi
  1334. ./var/www/$HUBZILLA_DOMAIN_NAME/htdocs/util/config system directory_server $hubzilla_domain_server
  1335. dialog --title $"Hubzilla channel directory server" \
  1336. --msgbox $"Domain channel directory server changed to $hubzilla_domain_server" 6 40
  1337. ;;
  1338. esac
  1339. }
  1340. function format_drive {
  1341. drive=
  1342. data=$(tempfile 2>/dev/null)
  1343. trap "rm -f $data" 0 1 2 5 15
  1344. dialog --backtitle $"Freedombone Control Panel" \
  1345. --title $"Format a USB drive (LUKS encrypted)" \
  1346. --radiolist $"Choose a drive:" 12 70 5 \
  1347. 1 $"sda (Beaglebone Black)" off \
  1348. 2 $"sdb" off \
  1349. 3 $"sdc" off \
  1350. 4 $"sdd" off \
  1351. 5 $"Back to Backup and Restore menu" on 2> $data
  1352. sel=$?
  1353. case $sel in
  1354. 1) return;;
  1355. 255) return;;
  1356. esac
  1357. case $(cat $data) in
  1358. 1) drive='sda';;
  1359. 2) drive='sdb';;
  1360. 3) drive='sdc';;
  1361. 4) drive='sdd';;
  1362. 5) return;;
  1363. esac
  1364. dialog --title $"Format USB drive" \
  1365. --backtitle $"Freedombone Control Panel" \
  1366. --defaultno \
  1367. --yesno $"\nPlease confirm that you wish to format drive\n\n ${drive}\n\nAll current data on the drive will be lost, and you will be prompted to give a password used to encrypt the drive.\n\nDANGER: If you screw up here and format the wrong drive it's your own fault!" 16 60
  1368. sel=$?
  1369. case $sel in
  1370. 1) return;;
  1371. 255) return;;
  1372. esac
  1373. clear
  1374. ${PROJECT_NAME}-format $drive
  1375. any_key
  1376. }
  1377. function remove_backups {
  1378. drive=
  1379. data=$(tempfile 2>/dev/null)
  1380. trap "rm -f $data" 0 1 2 5 15
  1381. dialog --backtitle $"Freedombone Control Panel" \
  1382. --title $"Remove backups from a USB drive" \
  1383. --radiolist $"Choose a drive:" 12 70 5 \
  1384. 1 $"sda (Beaglebone Black)" off \
  1385. 2 $"sdb" off \
  1386. 3 $"sdc" off \
  1387. 4 $"sdd" off \
  1388. 5 $"Back to Backup and Restore menu" on 2> $data
  1389. sel=$?
  1390. case $sel in
  1391. 1) return;;
  1392. 255) return;;
  1393. esac
  1394. case $(cat $data) in
  1395. 1) drive='sda';;
  1396. 2) drive='sdb';;
  1397. 3) drive='sdc';;
  1398. 4) drive='sdd';;
  1399. 5) return;;
  1400. esac
  1401. dialog --title $"Remove backups from a USB drive" \
  1402. --backtitle $"Freedombone Control Panel" \
  1403. --defaultno \
  1404. --yesno $"\nPlease confirm that you wish to remove backups from this drive\n\n ${drive}\n\nYou will not be able to recover them afterwards." 12 60
  1405. sel=$?
  1406. case $sel in
  1407. 1) return;;
  1408. 255) return;;
  1409. esac
  1410. clear
  1411. ${PROJECT_NAME}-backup-local $drive remove
  1412. any_key
  1413. }
  1414. function shut_down_system {
  1415. dialog --title $"Power off the system" \
  1416. --backtitle $"Freedombone Control Panel" \
  1417. --defaultno \
  1418. --yesno $"\nPlease confirm that you wish to power off the system.\n\nWARNING: to power on again you will need to have physical access to the hardware." 10 60
  1419. sel=$?
  1420. case $sel in
  1421. 1) return;;
  1422. 255) return;;
  1423. esac
  1424. shutdown now
  1425. }
  1426. function restart_system {
  1427. dialog --title $"Restart the system" \
  1428. --backtitle $"Freedombone Control Panel" \
  1429. --defaultno \
  1430. --yesno $"\nPlease confirm that you wish to restart the system.\n\nWARNING: If you are using full disk encryption then you will need physical access to the hardware to type in the password" 10 60
  1431. sel=$?
  1432. case $sel in
  1433. 1) return;;
  1434. 255) return;;
  1435. esac
  1436. reboot
  1437. }
  1438. function change_system_name {
  1439. data=$(tempfile 2>/dev/null)
  1440. trap "rm -f $data" 0 1 2 5 15
  1441. dialog --title $"Change the name of this system" \
  1442. --backtitle $"Freedombone Control Panel" \
  1443. --inputbox $'Enter a new name for this system on your local network\n\nIt will appear as newname.local' 10 60 2>$data
  1444. sel=$?
  1445. case $sel in
  1446. 0) NEW_SYSTEM_NAME=$(<$data)
  1447. if [ "$NEW_SYSTEM_NAME" ]; then
  1448. if [ ${#NEW_SYSTEM_NAME} -gt 1 ]; then
  1449. sed -i "s|host-name=.*|host-name=$NEW_SYSTEM_NAME|g" /etc/avahi/avahi-daemon.conf
  1450. systemctl restart avahi-daemon
  1451. if grep -q "host-name=$NEW_SYSTEM_NAME" /etc/avahi/avahi-daemon.conf; then
  1452. dialog --title $"New local network name" \
  1453. --msgbox $"The name of this system on your local network was changed successfully" 6 70
  1454. fi
  1455. fi
  1456. fi
  1457. ;;
  1458. esac
  1459. }
  1460. function set_tls_time_source {
  1461. TLS_DATE_SOURCE=$(cat /usr/bin/updatedate | grep "TIMESOURCE='" | awk -F '=' '{print $2}' | awk -F "'" '{print $2}')
  1462. data=$(tempfile 2>/dev/null)
  1463. trap "rm -f $data" 0 1 2 5 15
  1464. dialog --title $"Set the TLS date/time source" \
  1465. --backtitle $"Freedombone Control Panel" \
  1466. --inputbox $"Enter a domain name to use as a TLS time source.\n\nFactors to consider when choosing a source are whether you wish that site to know that your system is 'alive' and also what might happen if an adversary were to try to mess with the date/time from that domain (i.e. how much blowback would there be)." 14 60 "$TLS_DATE_SOURCE" 2>$data
  1467. sel=$?
  1468. case $sel in
  1469. 0) NEW_TLS_DATE_SOURCE=$(<$data)
  1470. if [[ $NEW_TLS_DATE_SOURCE == *"."* && $NEW_TLS_DATE_SOURCE != *'/'* ]]; then
  1471. if [[ $NEW_TLS_DATE_SOURCE != "http"* ]]; then
  1472. sed -i "s|TIMESOURCE='.*|TIMESOURCE='${NEW_TLS_DATE_SOURCE}'|g" $UPDATE_DATE_SCRIPT
  1473. else
  1474. dialog --title $"Invalid domain name" \
  1475. --msgbox $"Don't include the 'https'" 6 70
  1476. fi
  1477. else
  1478. dialog --title $"Invalid domain name" \
  1479. --msgbox $"That doesn't look like a domain name" 6 70
  1480. fi
  1481. ;;
  1482. esac
  1483. }
  1484. function set_static_IP {
  1485. STATIC_IP='192.168.1.60'
  1486. STATIC_GATEWAY='192.168.1.1'
  1487. NEW_STATIC_IP=
  1488. NEW_STATIC_GATEWAY=
  1489. if grep -q 'iface eth0 inet static' /etc/network/interfaces; then
  1490. STATIC_IP=$(cat /etc/network/interfaces | grep "address " | awk -F ' ' '{print $2}' | head -n 1)
  1491. STATIC_GATEWAY=$(cat /etc/network/interfaces | grep "gateway " | awk -F ' ' '{print $2}' | head -n 1)
  1492. fi
  1493. # get the IP for the box
  1494. data=$(tempfile 2>/dev/null)
  1495. trap "rm -f $data" 0 1 2 5 15
  1496. dialog --title $"Set a static local IP address" \
  1497. --backtitle $"Freedombone Control Panel" \
  1498. --inputbox $"In order to forward incoming internet traffic to this system most internet routers need to know a static local IP address to send the data to.\n\n
  1499. Enter a static local IP address for this system.\n\nIt will typically be 192.168.1.x" 15 60 "$STATIC_IP" 2>$data
  1500. sel=$?
  1501. case $sel in
  1502. 0) NEW_STATIC_IP=$(<$data)
  1503. if [[ "$NEW_STATIC_IP" != *"."* ]]; then
  1504. return
  1505. fi
  1506. if grep -q 'iface eth0 inet static' /etc/network/interfaces; then
  1507. if [[ "$NEW_STATIC_IP" != "$STATIC_IP" ]]; then
  1508. sed -i "s|${STATIC_IP}|${NEW_STATIC_IP}|g" /etc/network/interfaces
  1509. fi
  1510. fi
  1511. ;;
  1512. esac
  1513. # get the gateway
  1514. data=$(tempfile 2>/dev/null)
  1515. trap "rm -f $data" 0 1 2 5 15
  1516. dialog --title $"Set the IP address of your internet router/modem" \
  1517. --backtitle $"Freedombone Control Panel" \
  1518. --inputbox $"Set the local IP address for your internet router or ADSL modem.\n\nIt will typically be 192.168.1.1, 192.168.1.254, or similar" 12 60 "$STATIC_GATEWAY" 2>$data
  1519. sel=$?
  1520. case $sel in
  1521. 0) NEW_STATIC_GATEWAY=$(<$data)
  1522. if [[ "$NEW_STATIC_GATEWAY" != *"."* ]]; then
  1523. return
  1524. fi
  1525. if grep -q 'iface eth0 inet static' /etc/network/interfaces; then
  1526. if [[ "$NEW_STATIC_GATEWAY" != "$STATIC_GATEWAY" ]]; then
  1527. sed -i "s|${STATIC_GATEWAY}|${NEW_STATIC_GATEWAY}|g" /etc/network/interfaces
  1528. fi
  1529. return
  1530. fi
  1531. ;;
  1532. esac
  1533. if ! grep -q 'iface eth0 inet static' /etc/network/interfaces; then
  1534. if [ "$NEW_STATIC_GATEWAY" && "$NEW_STATIC_IP" ]; then
  1535. echo '# This file describes the network interfaces available on your system' > /etc/network/interfaces
  1536. echo '# and how to activate them. For more information, see interfaces(5).' >> /etc/network/interfaces
  1537. echo '' >> /etc/network/interfaces
  1538. echo '# The loopback network interface' >> /etc/network/interfaces
  1539. echo 'auto lo' >> /etc/network/interfaces
  1540. echo 'iface lo inet loopback' >> /etc/network/interfaces
  1541. echo '' >> /etc/network/interfaces
  1542. echo '# The primary network interface' >> /etc/network/interfaces
  1543. echo 'auto eth0' >> /etc/network/interfaces
  1544. echo 'iface eth0 inet static' >> /etc/network/interfaces
  1545. echo " address ${NEW_STATIC_IP}" >> /etc/network/interfaces
  1546. echo ' netmask 255.255.255.0' >> /etc/network/interfaces
  1547. echo " gateway ${NEW_STATIC_GATEWAY}" >> /etc/network/interfaces
  1548. echo " dns-nameservers 213.73.91.35 85.214.20.141" >> /etc/network/interfaces
  1549. echo '# Example to keep MAC address between reboots' >> /etc/network/interfaces
  1550. echo '#hwaddress ether DE:AD:BE:EF:CA:FE' >> /etc/network/interfaces
  1551. echo '' >> /etc/network/interfaces
  1552. echo '# The secondary network interface' >> /etc/network/interfaces
  1553. echo '#auto eth1' >> /etc/network/interfaces
  1554. echo '#iface eth1 inet dhcp' >> /etc/network/interfaces
  1555. echo '' >> /etc/network/interfaces
  1556. echo '# WiFi Example' >> /etc/network/interfaces
  1557. echo "#auto $WIFI_INTERFACE" >> /etc/network/interfaces
  1558. echo "#iface $WIFI_INTERFACE inet dhcp" >> /etc/network/interfaces
  1559. echo '# wpa-ssid "essid"' >> /etc/network/interfaces
  1560. echo '# wpa-psk "password"' >> /etc/network/interfaces
  1561. echo '' >> /etc/network/interfaces
  1562. echo '# Ethernet/RNDIS gadget (g_ether)' >> /etc/network/interfaces
  1563. echo '# ... or on host side, usbnet and random hwaddr' >> /etc/network/interfaces
  1564. echo '# Note on some boards, usb0 is automaticly setup with an init script' >> /etc/network/interfaces
  1565. echo '#iface usb0 inet static' >> /etc/network/interfaces
  1566. echo '# address 192.168.7.2' >> /etc/network/interfaces
  1567. echo '# netmask 255.255.255.0' >> /etc/network/interfaces
  1568. echo '# network 192.168.7.0' >> /etc/network/interfaces
  1569. echo '# gateway 192.168.7.1' >> /etc/network/interfaces
  1570. fi
  1571. fi
  1572. }
  1573. function wifi_settings {
  1574. if [ -f /etc/hostapd/hostapd.conf ]; then
  1575. return
  1576. fi
  1577. TEMP_WIFI_NETWORKS_FILE=~/.temp-${PROJECT_NAME}-wifi.cfg
  1578. ${PROJECT_NAME}-wifi --networksinteractive $TEMP_WIFI_NETWORKS_FILE
  1579. if [ -f $TEMP_WIFI_NETWORKS_FILE ]; then
  1580. cp $TEMP_WIFI_NETWORKS_FILE $WIFI_NETWORKS_FILE
  1581. rm $TEMP_WIFI_NETWORKS_FILE
  1582. ${PROJECT_NAME}-wifi --networks $WIFI_NETWORKS_FILE
  1583. dialog --title $"Wifi Settings" \
  1584. --msgbox $"Wifi settings were changed" 6 40
  1585. fi
  1586. }
  1587. function wifi_edit_networks {
  1588. if [ -f /etc/hostapd/hostapd.conf ]; then
  1589. return
  1590. fi
  1591. if [ ! -f $WIFI_NETWORKS_FILE ]; then
  1592. echo $'# Add wifi networks as follows:' > $WIFI_NETWORKS_FILE
  1593. echo '#' >> $WIFI_NETWORKS_FILE
  1594. echo $'# MySSID' >> $WIFI_NETWORKS_FILE
  1595. echo $'# wpa2-psk' >> $WIFI_NETWORKS_FILE
  1596. echo $'# myWifiPassphrase' >> $WIFI_NETWORKS_FILE
  1597. echo '#' >> $WIFI_NETWORKS_FILE
  1598. echo $'# AnotherSSID' >> $WIFI_NETWORKS_FILE
  1599. echo $'# none' >> $WIFI_NETWORKS_FILE
  1600. echo '#' >> $WIFI_NETWORKS_FILE
  1601. fi
  1602. editor $WIFI_NETWORKS_FILE
  1603. ${PROJECT_NAME}-wifi --networks $WIFI_NETWORKS_FILE
  1604. }
  1605. function hotspot_settings {
  1606. data=$(tempfile 2>/dev/null)
  1607. trap "rm -f $data" 0 1 2 5 15
  1608. dialog --backtitle $"Freedombone Control Panel" \
  1609. --title $"Hotspot Settings" \
  1610. --form $"" 10 60 4 \
  1611. $"Enabled (yes/no):" 1 1 "$WIFI_HOTSPOT" 1 24 5 5 \
  1612. $"SSID:" 2 1 "$WIFI_SSID" 2 24 256 256 \
  1613. $"Type (wpa2-psk/none):" 3 1 "$WIFI_TYPE" 3 24 10 10 \
  1614. $"Passphrase:" 4 1 "$WIFI_PASSPHRASE" 4 24 256 256 \
  1615. 2> $data
  1616. sel=$?
  1617. case $sel in
  1618. 1) return;;
  1619. 255) return;;
  1620. esac
  1621. TEMP_WIFI_HOTSPOT=$(cat $data | sed -n 1p)
  1622. TEMP_WIFI_SSID=$(cat $data | sed -n 2p)
  1623. TEMP_WIFI_TYPE=$(cat $data | sed -n 3p)
  1624. TEMP_WIFI_PASSPHRASE=$(cat $data | sed -n 4p)
  1625. if [ ${#TEMP_WIFI_SSID} -lt 2 ]; then
  1626. return
  1627. fi
  1628. if [ ${#TEMP_WIFI_TYPE} -lt 2 ]; then
  1629. return
  1630. fi
  1631. WIFI_EXTRA=''
  1632. if [[ $TEMP_WIFI_HOTSPOT == $'yes' || $TEMP_WIFI_HOTSPOT == $'y' || $TEMP_WIFI_HOTSPOT == $'on' ]]; then
  1633. TEMP_WIFI_HOTSPOT='yes'
  1634. else
  1635. TEMP_WIFI_HOTSPOT='no'
  1636. if [ -f $WIFI_NETWORKS_FILE ]; then
  1637. WIFI_EXTRA='--networks $WIFI_NETWORKS_FILE'
  1638. fi
  1639. fi
  1640. if [[ $TEMP_WIFI_TYPE != $'none' ]]; then
  1641. if [ ! $TEMP_WIFI_PASSPHRASE ]; then
  1642. dialog --title $"Wifi Settings" \
  1643. --msgbox $"No wifi hotspot passphrase was given" 6 40
  1644. return
  1645. fi
  1646. if [ ${#TEMP_WIFI_PASSPHRASE} -lt 2 ]; then
  1647. dialog --title $"Wifi Settings" \
  1648. --msgbox $"Wifi hotspot passphrase was too short" 6 40
  1649. return
  1650. fi
  1651. WIFI_HOTSPOT=$TEMP_WIFI_HOTSPOT
  1652. WIFI_SSID=$TEMP_WIFI_SSID
  1653. WIFI_TYPE=$TEMP_WIFI_TYPE
  1654. WIFI_PASSPHRASE=$TEMP_WIFI_PASSPHRASE
  1655. ${PROJECT_NAME}-wifi -i $WIFI_INTERFACE -s $WIFI_SSID -t $WIFI_TYPE -p $WIFI_PASSPHRASE --hotspot $WIFI_HOTSPOT $WIFI_EXTRA
  1656. else
  1657. WIFI_HOTSPOT=$TEMP_WIFI_HOTSPOT
  1658. WIFI_SSID=$TEMP_WIFI_SSID
  1659. WIFI_TYPE=$TEMP_WIFI_TYPE
  1660. WIFI_PASSPHRASE=$TEMP_WIFI_PASSPHRASE
  1661. ${PROJECT_NAME}-wifi -i $WIFI_INTERFACE -s $WIFI_SSID -t $WIFI_TYPE --hotspot $WIFI_HOTSPOT $WIFI_EXTRA
  1662. fi
  1663. # store any changes
  1664. if ! grep -q "WIFI_HOTSPOT" $CONFIGURATION_FILE; then
  1665. echo "WIFI_HOTSPOT=$WIFI_HOTSPOT" >> $CONFIGURATION_FILE
  1666. else
  1667. sed -i "s|WIFI_HOTSPOT=.*|WIFI_HOTSPOT=$WIFI_HOTSPOT|g" $CONFIGURATION_FILE
  1668. fi
  1669. if ! grep -q "WIFI_SSID" $CONFIGURATION_FILE; then
  1670. echo "WIFI_SSID=$WIFI_SSID" >> $CONFIGURATION_FILE
  1671. else
  1672. sed -i "s|WIFI_SSID=.*|WIFI_SSID=$WIFI_SSID|g" $CONFIGURATION_FILE
  1673. fi
  1674. if ! grep -q "WIFI_TYPE" $CONFIGURATION_FILE; then
  1675. echo "WIFI_TYPE=$WIFI_TYPE" >> $CONFIGURATION_FILE
  1676. else
  1677. sed -i "s|WIFI_TYPE=.*|WIFI_SSID=$WIFI_TYPE|g" $CONFIGURATION_FILE
  1678. fi
  1679. if ! grep -q "WIFI_PASSPHRASE" $CONFIGURATION_FILE; then
  1680. echo "WIFI_PASSPHRASE=$WIFI_PASSPHRASE" >> $CONFIGURATION_FILE
  1681. else
  1682. sed -i "s|WIFI_PASSPHRASE=.*|WIFI_PASSPHRASE=$WIFI_PASSPHRASE|g" $CONFIGURATION_FILE
  1683. fi
  1684. dialog --title $"Wifi Settings" \
  1685. --msgbox $"Hotspot settings were changed" 6 40
  1686. }
  1687. function menu_backup_restore {
  1688. while true
  1689. do
  1690. data=$(tempfile 2>/dev/null)
  1691. trap "rm -f $data" 0 1 2 5 15
  1692. dialog --backtitle $"Freedombone Control Panel" \
  1693. --title $"Backup and Restore" \
  1694. --radiolist $"Choose an operation:" 18 70 11 \
  1695. 1 $"Backup data to USB drive" off \
  1696. 2 $"Restore GPG key from USB keydrive" off \
  1697. 3 $"Restore data from USB drive" off \
  1698. 4 $"Configure remote backups" off \
  1699. 5 $"Restore from remote backup" off \
  1700. 6 $"Backup GPG key to USB (master keydrive)" off \
  1701. 7 $"Backup GPG key to USB (fragment keydrive)" off \
  1702. 8 $"Format a USB drive (LUKS encrypted)" off \
  1703. 9 $"Remove backups from a USB drive" off \
  1704. 10 $"Back to main menu" on 2> $data
  1705. sel=$?
  1706. case $sel in
  1707. 1) break;;
  1708. 255) break;;
  1709. esac
  1710. case $(cat $data) in
  1711. 1) backup_data;;
  1712. 2) restore_gpg_key;;
  1713. 3) restore_data;;
  1714. 4) configure_remote_backups;;
  1715. 5) restore_data_remote;;
  1716. 6) create_keydrive_master;;
  1717. 7) create_keydrive_fragment;;
  1718. 8) format_drive;;
  1719. 9) remove_backups;;
  1720. 10) break;;
  1721. esac
  1722. done
  1723. }
  1724. function menu_email {
  1725. while true
  1726. do
  1727. data=$(tempfile 2>/dev/null)
  1728. trap "rm -f $data" 0 1 2 5 15
  1729. dialog --backtitle $"Freedombone Control Panel" \
  1730. --title $"Email Filtering Rules" \
  1731. --radiolist $"Choose an operation:" 13 70 6 \
  1732. 1 $"Add a user to a mailing list" off \
  1733. 2 $"Remove a user from a mailing list" off \
  1734. 3 $"Add an email rule" off \
  1735. 4 $"Block/Unblock an email address" off \
  1736. 5 $"Block/Unblock email with subject text" off \
  1737. 6 $"Back to main menu" on 2> $data
  1738. sel=$?
  1739. case $sel in
  1740. 1) break;;
  1741. 255) break;;
  1742. esac
  1743. case $(cat $data) in
  1744. 1) add_to_mailing_list;;
  1745. 2) remove_user_from_mailing_list;;
  1746. 3) email_rule;;
  1747. 4) block_unblock_email;;
  1748. 5) block_unblock_subject;;
  1749. 6) break;;
  1750. esac
  1751. done
  1752. }
  1753. function menu_users {
  1754. while true
  1755. do
  1756. data=$(tempfile 2>/dev/null)
  1757. trap "rm -f $data" 0 1 2 5 15
  1758. dialog --backtitle $"Freedombone Control Panel" \
  1759. --title $"Manage Users" \
  1760. --radiolist $"Choose an operation:" 12 70 5 \
  1761. 1 $"Add a user" off \
  1762. 2 $"Delete a user" off \
  1763. 3 $"Change user password" off \
  1764. 4 $"Change user ssh public key" off \
  1765. 5 $"Back to main menu" on 2> $data
  1766. sel=$?
  1767. case $sel in
  1768. 1) break;;
  1769. 255) break;;
  1770. esac
  1771. case $(cat $data) in
  1772. 1) add_user;;
  1773. 2) delete_user;;
  1774. 3) change_password;;
  1775. 4) change_ssh_public_key;;
  1776. 5) break;;
  1777. esac
  1778. done
  1779. }
  1780. function menu_hubzilla {
  1781. while true
  1782. do
  1783. data=$(tempfile 2>/dev/null)
  1784. trap "rm -f $data" 0 1 2 5 15
  1785. dialog --backtitle $"Freedombone Control Panel" \
  1786. --title $"Hubzilla" \
  1787. --radiolist $"Choose an operation:" 13 70 4 \
  1788. 1 $"Set channel directory server" off \
  1789. 2 $"Renew SSL certificate" off \
  1790. 3 $"Back to main menu" on 2> $data
  1791. sel=$?
  1792. case $sel in
  1793. 1) break;;
  1794. 255) break;;
  1795. esac
  1796. case $(cat $data) in
  1797. 1) hubzilla_channel_directory_server;;
  1798. 2) hubzilla_renew_cert;;
  1799. 3) break;;
  1800. esac
  1801. done
  1802. }
  1803. function menu_media {
  1804. while true
  1805. do
  1806. data=$(tempfile 2>/dev/null)
  1807. trap "rm -f $data" 0 1 2 5 15
  1808. dialog --backtitle $"Freedombone Control Panel" \
  1809. --title $"Media Menu" \
  1810. --radiolist $"Choose an operation:" 13 70 3 \
  1811. 1 $"Attach a drive containing playable media" off \
  1812. 2 $"Remove a drive containing playable media" off \
  1813. 3 $"Exit" on 2> $data
  1814. sel=$?
  1815. case $sel in
  1816. 1) break;;
  1817. 255) break;;
  1818. esac
  1819. case $(cat $data) in
  1820. 1) remove-music
  1821. attach-music;;
  1822. 2) remove-music;;
  1823. 3) break;;
  1824. esac
  1825. done
  1826. }
  1827. function wifi_enable {
  1828. disable_wifi='yes'
  1829. dialog --title $"Enable Wifi" \
  1830. --backtitle $"Freedombone Control Panel" \
  1831. --defaultno \
  1832. --yesno $"\nDo you wish to enable wifi?" 10 50
  1833. sel=$?
  1834. case $sel in
  1835. 0) disable_wifi='no';;
  1836. 1) disable_wifi='yes';;
  1837. 255) return;;
  1838. esac
  1839. ${PROJECT_NAME}-wifi --disable $disable_wifi
  1840. }
  1841. function menu_wifi {
  1842. while true
  1843. do
  1844. status_str=$'Wifi OFF'
  1845. if [ -f /etc/hostapd/hostapd.conf ]; then
  1846. status_str=$'Hotspot ON'
  1847. else
  1848. if grep -q "# wifi enabled" /etc/network/interfaces; then
  1849. status_str=$'Wifi ON'
  1850. fi
  1851. fi
  1852. data=$(tempfile 2>/dev/null)
  1853. trap "rm -f $data" 0 1 2 5 15
  1854. dialog --backtitle $"Freedombone Control Panel" \
  1855. --title $"Wifi Menu" \
  1856. --radiolist $"${status_str}\n\nChoose an operation:" 14 70 6 \
  1857. 1 $"Enable or disable Wifi" off \
  1858. 2 $"Configure wifi networks" off \
  1859. 3 $"Manually edit wifi networks file" off \
  1860. 4 $"Hotspot settings" off \
  1861. 5 $"Exit" on 2> $data
  1862. sel=$?
  1863. case $sel in
  1864. 1) break;;
  1865. 255) break;;
  1866. esac
  1867. case $(cat $data) in
  1868. 1) wifi_enable;;
  1869. 2) wifi_settings;;
  1870. 3) wifi_edit_networks;;
  1871. 4) hotspot_settings;;
  1872. 5) break;;
  1873. esac
  1874. done
  1875. }
  1876. function menu_irc {
  1877. if [ ! -d /etc/ngircd ]; then
  1878. dialog --title $"IRC Menu" \
  1879. --msgbox $"No IRC server is installed" 6 70
  1880. return
  1881. fi
  1882. while true
  1883. do
  1884. data=$(tempfile 2>/dev/null)
  1885. trap "rm -f $data" 0 1 2 5 15
  1886. dialog --backtitle $"Freedombone Control Panel" \
  1887. --title $"IRC Menu" \
  1888. --radiolist $"Choose an operation:" 14 70 4 \
  1889. 1 $"Set a password for all IRC users" off \
  1890. 2 $"Show current IRC login password" off \
  1891. 3 $"Exit" on 2> $data
  1892. sel=$?
  1893. case $sel in
  1894. 1) break;;
  1895. 255) break;;
  1896. esac
  1897. case $(cat $data) in
  1898. 1) irc_set_global_password;;
  1899. 2) irc_show_password;;
  1900. 3) break;;
  1901. esac
  1902. done
  1903. }
  1904. function menu_top_level {
  1905. while true
  1906. do
  1907. data=$(tempfile 2>/dev/null)
  1908. trap "rm -f $data" 0 1 2 5 15
  1909. dialog --backtitle $"Freedombone Control Panel" \
  1910. --title $"Control Panel" \
  1911. --radiolist $"Choose an operation:" 29 70 22 \
  1912. 1 $"About this system" off \
  1913. 2 $"Backup and Restore" off \
  1914. 3 $"Reset Tripwire" off \
  1915. 4 $"Logging on/off" off \
  1916. 5 $"Ping enable/disable" off \
  1917. 6 $"Manage Users" off \
  1918. 7 $"Email Filtering Rules" off \
  1919. 8 $"Outgoing Email Proxy" off \
  1920. 9 $"Security Settings" off \
  1921. 10 $"Set the main repository (repo mirrors)" off \
  1922. 11 $"Hubzilla" off \
  1923. 12 $"Media menu" off \
  1924. 13 $"IRC menu" off \
  1925. 14 $"Change your blog avatar" off \
  1926. 15 $"Change the name of this system" off \
  1927. 16 $"Set the TLS date/time source" off \
  1928. 17 $"Set a static local IP address" off \
  1929. 18 $"Wifi menu" off \
  1930. 19 $"Check for updates" off \
  1931. 20 $"Power off the system" off \
  1932. 21 $"Restart the system" off \
  1933. 22 $"Exit" on 2> $data
  1934. sel=$?
  1935. case $sel in
  1936. 1) exit 1;;
  1937. 255) exit 1;;
  1938. esac
  1939. case $(cat $data) in
  1940. 1) show_about;;
  1941. 2) menu_backup_restore;;
  1942. 3) reset_tripwire;;
  1943. 4) logging_on_off;;
  1944. 5) ping_enable_disable;;
  1945. 6) menu_users;;
  1946. 7) menu_email;;
  1947. 8) smtp_proxy;;
  1948. 9) security_settings;;
  1949. 10) set_main_repo;;
  1950. 11) menu_hubzilla;;
  1951. 12) menu_media;;
  1952. 13) menu_irc;;
  1953. 14) change_blog_avatar;;
  1954. 15) change_system_name;;
  1955. 16) set_tls_time_source;;
  1956. 17) set_static_IP;;
  1957. 18) menu_wifi;;
  1958. 19) check_for_updates;;
  1959. 20) shut_down_system;;
  1960. 21) restart_system;;
  1961. 22) break;;
  1962. esac
  1963. done
  1964. }
  1965. if [[ $USER != 'root' ]]; then
  1966. # show the user version of the control panel
  1967. freedombone-controlpanel-user
  1968. exit 0
  1969. fi
  1970. if [ ! -f $COMPLETION_FILE ]; then
  1971. echo $'This command should only be run on an installed Freedombone system'
  1972. exit 1
  1973. fi
  1974. ADMIN_USER=$(cat $COMPLETION_FILE | grep "Admin user" | awk -F ':' '{print $2}')
  1975. read_repo_servers
  1976. menu_top_level
  1977. clear
  1978. cat /etc/motd
  1979. exit 0