freedombone-controlpanel 64KB

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