freedombone-controlpanel 75KB

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