freedombone-controlpanel 66KB

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