freedombone-restore-remote 26KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726
  1. #!/bin/bash
  2. #
  3. # .---. . .
  4. # | | |
  5. # |--- .--. .-. .-. .-.| .-. .--.--. |.-. .-. .--. .-.
  6. # | | (.-' (.-' ( | ( )| | | | )( )| | (.-'
  7. # ' ' --' --' -' - -' ' ' -' -' -' ' - --'
  8. #
  9. # Freedom in the Cloud
  10. #
  11. # Restore from a given remote server
  12. # License
  13. # =======
  14. #
  15. # Copyright (C) 2015 Bob Mottram <bob@robotics.uk.to>
  16. #
  17. # This program is free software: you can redistribute it and/or modify
  18. # it under the terms of the GNU General Public License as published by
  19. # the Free Software Foundation, either version 3 of the License, or
  20. # (at your option) any later version.
  21. #
  22. # This program is distributed in the hope that it will be useful,
  23. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  24. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  25. # GNU General Public License for more details.
  26. #
  27. # You should have received a copy of the GNU General Public License
  28. # along with this program. If not, see <http://www.gnu.org/licenses/>.
  29. PROJECT_NAME='freedombone'
  30. COMPLETION_FILE=$HOME/${PROJECT_NAME}-completed.txt
  31. CONFIG_FILE=$HOME/${PROJECT_NAME}.cfg
  32. BACKUP_EXTRA_DIRECTORIES=/root/backup-extra-dirs.csv
  33. export TEXTDOMAIN=${PROJECT_NAME}-restore-remote
  34. export TEXTDOMAINDIR="/usr/share/locale"
  35. SERVER_NAME=$1
  36. ADMIN_USERNAME=$(cat $COMPLETION_FILE | grep "Admin user" | -nawk -F ':' '{print $2}')
  37. ADMIN_EMAIL_ADDRESS=${ADMIN_USERNAME}@${HOSTNAME}
  38. # Temporary location for data to be backed up to other servers
  39. SERVER_DIRECTORY=/root/remoterestore
  40. BACKUP_LIST=/home/${ADMIN_USERNAME}/backup.list
  41. if [ ! $SERVER_NAME ]; then
  42. echo $'restorefromfriend [server]'
  43. exit 1
  44. fi
  45. if [ ! -f $BACKUP_LIST ]; then
  46. echo $"No friends list found at $BACKUP_LIST"
  47. exit 2
  48. fi
  49. if ! grep -q "$SERVER_NAME" $BACKUP_LIST; then
  50. echo $"Server not found within the friends list"
  51. exit 3
  52. fi
  53. REMOTE_SERVER=$(grep -i "$SERVER_NAME" $BACKUP_LIST | awk -F ' ' '{print $1}')
  54. REMOTE_SSH_PORT=$(grep -i "$SERVER_NAME" $BACKUP_LIST | awk -F ' ' '{print $2}')
  55. REMOTE_PASSWORD=$(grep -i "$SERVER_NAME" $BACKUP_LIST | awk -F ' ' '{print $3}')
  56. NOW=$(date +"%Y-%m-%d %H:%M:%S")
  57. echo "$NOW Starting restore from $REMOTE_SERVER" >> /var/log/remotebackups.log
  58. rsync -ratlzv --rsh="/usr/bin/sshpass -p $REMOTE_PASSWORD ssh -p $REMOTE_SSH_PORT -o StrictHostKeyChecking=no" $REMOTE_SERVER/backup $SERVER_DIRECTORY
  59. if [ ! "$?" = "0" ]; then
  60. echo "$NOW Restore from $REMOTE_SERVER failed" >> /var/log/remotebackups.log
  61. # Send a warning email
  62. echo "Restore from $REMOTE_SERVER failed" | mail -s "${PROJECT_NAME} restore from friend" $ADMIN_EMAIL_ADDRESS
  63. exit 790
  64. else
  65. echo "$NOW Restored encrypted data from $REMOTE_SERVER" >> /var/log/remotebackups.log
  66. fi
  67. # MariaDB password
  68. DATABASE_PASSWORD=$(cat /root/dbpass)
  69. function restore_directory_from_friend {
  70. if [ ! -d ${1} ]; then
  71. mkdir ${1}
  72. fi
  73. obnam restore -r $SERVER_DIRECTORY/backup/${2} --to ${1}
  74. }
  75. function copy_gpg_keys {
  76. echo $"Copying GPG keys from admin user to root"
  77. cp -r /home/$ADMIN_USERNAME/.gnupg /root
  78. }
  79. function restore_database_from_friend {
  80. DATABASE_PASSWORD=
  81. RESTORE_SUBDIR="root"
  82. if [ -d $SERVER_DIRECTORY/backup/${1} ]; then
  83. echo $"Restoring ${1} database"
  84. restore_directory_from_friend /root/temp${1}data ${1}data
  85. if [ ! -f /root/temp${1}data/${RESTORE_SUBDIR}/temp${1}data/${1}.sql ]; then
  86. echo $"Unable to restore ${1} database"
  87. rm -rf /root/temp${1}data
  88. exit 503
  89. fi
  90. mysqlsuccess=$(mysql -u root --password="$DATABASE_PASSWORD" ${1} -o < /root/temp${1}data/${RESTORE_SUBDIR}/temp${1}data/${1}.sql)
  91. if [ ! "$?" = "0" ]; then
  92. echo "$mysqlsuccess"
  93. exit 964
  94. fi
  95. shred -zu /root/temp${1}data/${RESTORE_SUBDIR}/temp${1}data/*
  96. rm -rf /root/temp${1}data
  97. echo $"Restoring ${1} installation"
  98. restore_directory_from_friend /root/temp${1} ${1}
  99. RESTORE_SUBDIR="var"
  100. if [ ${1} ]; then
  101. if [ -d /var/www/${2}/htdocs ]; then
  102. if [ -d /root/temp${1}/${RESTORE_SUBDIR}/www/${2}/htdocs ]; then
  103. rm -rf /var/www/${2}/htdocs
  104. mv /root/temp${1}/${RESTORE_SUBDIR}/www/${2}/htdocs /var/www/${2}/
  105. if [ ! "$?" = "0" ]; then
  106. exit 683
  107. fi
  108. if [ -d /etc/letsencrypt/live/${2} ]; then
  109. ln -s /etc/letsencrypt/live/${2}/privkey.pem /etc/ssl/private/${2}.key
  110. ln -s /etc/letsencrypt/live/${2}/fullchain.pem /etc/ssl/certs/${2}.pem
  111. else
  112. # Ensure that the bundled SSL cert is being used
  113. if [ -f /etc/ssl/certs/${2}.bundle.crt ]; then
  114. sed -i "s|${2}.crt|${2}.bundle.crt|g" /etc/nginx/sites-available/${2}
  115. fi
  116. fi
  117. fi
  118. fi
  119. fi
  120. fi
  121. }
  122. function restore_configuration {
  123. if [ -d $SERVER_DIRECTORY/backup/config ]; then
  124. echo $"Restoring configuration files"
  125. restore_directory_from_friend /root/tempconfig config
  126. cp -f /root/tempconfig/root/${PROJECT_NAME}.cfg $CONFIG_FILE
  127. if [ ! "$?" = "0" ]; then
  128. unmount_drive
  129. rm -rf /root/tempconfig
  130. exit 5372
  131. fi
  132. if [ -f $CONFIG_FILE ]; then
  133. # install according to the config file
  134. freedombone -c $CONFIG_FILE
  135. fi
  136. cp -f /root/tempconfig/root/${PROJECT_NAME}-completed.txt $COMPLETION_FILE
  137. if [ ! "$?" = "0" ]; then
  138. unmount_drive
  139. rm -rf /root/tempconfig
  140. exit 7252
  141. fi
  142. if [ -f /root/tempconfig${BACKUP_EXTRA_DIRECTORIES} ]; then
  143. cp -f /root/tempconfig${BACKUP_EXTRA_DIRECTORIES} ${BACKUP_EXTRA_DIRECTORIES}
  144. if [ ! "$?" = "0" ]; then
  145. unmount_drive
  146. rm -rf /root/tempconfig
  147. exit 62121
  148. fi
  149. fi
  150. rm -rf /root/tempconfig
  151. fi
  152. }
  153. function restore_mariadb {
  154. if [ -d $SERVER_DIRECTORY/backup/mariadb ]; then
  155. echo $"Restoring MariaDB settings"
  156. restore_directory_from_friend /root/tempmariadb mariadb
  157. echo $"Get the MariaDB password from the backup"
  158. if [ ! -f /root/tempmariadb/root/tempmariadb/db ]; then
  159. echo $"MariaDB password file not found"
  160. exit 495
  161. fi
  162. BACKUP_MARIADB_PASSWORD=$(cat /root/tempmariadb/root/tempmariadb/db)
  163. if [[ "$BACKUP_MARIADB_PASSWORD" != "$DATABASE_PASSWORD" ]]; then
  164. echo $"Restore the MariaDB user table"
  165. mysqlsuccess=$(mysql -u root --password="$DATABASE_PASSWORD" mysql -o < /root/tempmariadb/root/tempmariadb/mysql.sql)
  166. if [ ! "$?" = "0" ]; then
  167. echo $"Try again using the password obtained from backup"
  168. mysqlsuccess=$(mysql -u root --password="$BACKUP_MARIADB_PASSWORD" mysql -o < /root/tempmariadb/root/tempmariadb/mysql.sql)
  169. fi
  170. if [ ! "$?" = "0" ]; then
  171. echo "$mysqlsuccess"
  172. exit 962
  173. fi
  174. echo $"Restarting database"
  175. service mysql restart
  176. echo $"Change the MariaDB password to the backup version"
  177. DATABASE_PASSWORD=$BACKUP_MARIADB_PASSWORD
  178. fi
  179. shred -zu /root/tempmariadb/root/tempmariadb/db
  180. rm -rf /root/tempmariadb
  181. # Change database password file
  182. echo "$DATABASE_PASSWORD" > /root/dbpass
  183. chmod 600 /root/dbpass
  184. fi
  185. }
  186. function restore_letsencrypt {
  187. if [ -d $SERVER_DIRECTORY/backup/letsencrypt ]; then
  188. echo $"Restoring Lets Encrypt settings"
  189. restore_directory_from_friend / letsencrypt
  190. fi
  191. }
  192. function restore_mutt_settings {
  193. for d in $SERVER_DIRECTORY/backup/mutt/*/ ; do
  194. USERNAME=$(echo "$d" | awk -F '/' '{print $6}')
  195. if [[ $USERNAME != "git" ]]; then
  196. if [ -d $SERVER_DIRECTORY/backup/mutt/$USERNAME ]; then
  197. if [ ! -d /home/$USERNAME ]; then
  198. ${PROJECT_NAME}-adduser $USERNAME
  199. fi
  200. echo $"Restoring Mutt settings for $USERNAME"
  201. restore_directory_from_friend /root/tempmutt mutt/$USERNAME
  202. if [ -f /root/tempmutt/home/$USERNAME/tempbackup/.muttrc ]; then
  203. cp -f /root/tempmutt/home/$USERNAME/tempbackup/.muttrc /home/$USERNAME/.muttrc
  204. fi
  205. if [ -f /root/tempmutt/home/$USERNAME/tempbackup/Muttrc ]; then
  206. cp -f /root/tempmutt/home/$USERNAME/tempbackup/Muttrc /etc/Muttrc
  207. fi
  208. if [ ! "$?" = "0" ]; then
  209. rm -rf /root/tempmutt
  210. exit 276
  211. fi
  212. rm -rf /root/tempmutt
  213. fi
  214. fi
  215. done
  216. }
  217. function restore_gpg {
  218. for d in $SERVER_DIRECTORY/backup/gnupg/*/ ; do
  219. USERNAME=$(echo "$d" | awk -F '/' '{print $6}')
  220. if [[ $USERNAME != "git" ]]; then
  221. if [ -d $SERVER_DIRECTORY/backup/gnupg/$USERNAME ]; then
  222. if [ ! -d /home/$USERNAME ]; then
  223. ${PROJECT_NAME}-adduser $USERNAME
  224. fi
  225. echo $"Restoring gnupg settings for $USERNAME"
  226. restore_directory_from_friend /root/tempgnupg gnupg/$USERNAME
  227. cp -r /root/tempgnupg/home/$USERNAME/.gnupg /home/$USERNAME/
  228. if [ ! "$?" = "0" ]; then
  229. rm -rf /root/tempgnupg
  230. exit 276
  231. fi
  232. rm -rf /root/tempgnupg
  233. if [[ "$USERNAME" == "$ADMIN_USERNAME" ]]; then
  234. cp -r /home/$USERNAME/.gnupg /root
  235. if [ ! "$?" = "0" ]; then
  236. exit 283
  237. fi
  238. fi
  239. fi
  240. fi
  241. done
  242. }
  243. function restore_procmail {
  244. for d in $SERVER_DIRECTORY/backup/procmail/*/ ; do
  245. USERNAME=$(echo "$d" | awk -F '/' '{print $6}')
  246. if [[ $USERNAME != "git" ]]; then
  247. if [ -d $SERVER_DIRECTORY/backup/procmail/$USERNAME ]; then
  248. if [ ! -d /home/$USERNAME ]; then
  249. ${PROJECT_NAME}-adduser $USERNAME
  250. fi
  251. echo $"Restoring procmail settings for $USERNAME"
  252. restore_directory_from_friend /root/tempprocmail procmail/$USERNAME
  253. cp -f /root/tempprocmail/home/$USERNAME/tempbackup/.procmailrc /home/$USERNAME/
  254. if [ ! "$?" = "0" ]; then
  255. rm -rf /root/tempprocmail
  256. exit 276
  257. fi
  258. rm -rf /root/tempprocmail
  259. fi
  260. fi
  261. done
  262. }
  263. function restore_spamassassin {
  264. for d in $SERVER_DIRECTORY/backup/spamassassin/*/ ; do
  265. USERNAME=$(echo "$d" | awk -F '/' '{print $6}')
  266. if [[ $USERNAME != "git" ]]; then
  267. if [ -d $SERVER_DIRECTORY/backup/spamassassin/$USERNAME ]; then
  268. if [ ! -d /home/$USERNAME ]; then
  269. ${PROJECT_NAME}-adduser $USERNAME
  270. fi
  271. echo $"Restoring spamassassin settings for $USERNAME"
  272. restore_directory_from_friend /root/tempspamassassin spamassassin/$USERNAME
  273. cp -rf /root/tempspamassassin/home/$USERNAME/.spamassassin /home/$USERNAME/
  274. if [ ! "$?" = "0" ]; then
  275. rm -rf /root/tempspamassassin
  276. exit 276
  277. fi
  278. rm -rf /root/tempspamassassin
  279. fi
  280. fi
  281. done
  282. }
  283. function restore_admin_readme {
  284. if [ -d $SERVER_DIRECTORY/backup/readme ]; then
  285. echo $"Restoring README"
  286. restore_directory_from_friend /root/tempreadme readme
  287. cp -f /root/tempreadme/home/$ADMIN_USERNAME/tempbackup/README /home/$ADMIN_USERNAME/
  288. if [ ! "$?" = "0" ]; then
  289. rm -rf /root/tempreadme
  290. exit 276
  291. fi
  292. rm -rf /root/tempreadme
  293. fi
  294. }
  295. function restore_ipfs {
  296. if [ -d $SERVER_DIRECTORY/backup/ipfs ]; then
  297. echo $"Restoring IPFS"
  298. restore_directory_from_friend /root/tempipfs ipfs
  299. cp -rf /root/tempipfs/home/$ADMIN_USERNAME/.ipfs/* /home/$ADMIN_USERNAME/.ipfs
  300. if [ ! "$?" = "0" ]; then
  301. rm -rf /root/tempipfs
  302. exit 276
  303. fi
  304. rm -rf /root/tempipfs
  305. fi
  306. }
  307. function restore_ssh_keys {
  308. for d in $SERVER_DIRECTORY/backup/ssh/*/ ; do
  309. USERNAME=$(echo "$d" | awk -F '/' '{print $6}')
  310. if [[ $USERNAME != "git" ]]; then
  311. if [ -d $SERVER_DIRECTORY/backup/ssh/$USERNAME ]; then
  312. if [ ! -d /home/$USERNAME ]; then
  313. ${PROJECT_NAME}-adduser $USERNAME
  314. fi
  315. echo $"Restoring ssh keys for $USERNAME"
  316. restore_directory_from_friend /root/tempssh ssh/$USERNAME
  317. cp -r /root/tempssh/home/$USERNAME/.ssh /home/$USERNAME/
  318. if [ ! "$?" = "0" ]; then
  319. rm -rf /root/tempssh
  320. exit 664
  321. fi
  322. rm -rf /root/tempssh
  323. fi
  324. fi
  325. done
  326. }
  327. function restore_user_config {
  328. for d in $SERVER_DIRECTORY/backup/config/*/ ; do
  329. USERNAME=$(echo "$d" | awk -F '/' '{print $6}')
  330. if [[ $USERNAME != "git" ]]; then
  331. if [ -d $SERVER_DIRECTORY/backup/config/$USERNAME ]; then
  332. if [ ! -d /home/$USERNAME ]; then
  333. ${PROJECT_NAME}-adduser $USERNAME
  334. fi
  335. echo $"Restoring config files for $USERNAME"
  336. restore_directory_from_friend /root/tempconfig config/$USERNAME
  337. cp -r /root/tempconfig/home/$USERNAME/.config /home/$USERNAME/
  338. if [ ! "$?" = "0" ]; then
  339. rm -rf /root/tempconfig
  340. exit 664
  341. fi
  342. rm -rf /root/tempconfig
  343. fi
  344. fi
  345. done
  346. }
  347. function restore_certs {
  348. if [ -d $SERVER_DIRECTORY/backup/ssl ]; then
  349. echo $"Restoring certificates"
  350. restore_directory_from_friend /root/tempssl ssl
  351. cp -r /root/tempssl/etc/ssl/* /etc/ssl
  352. if [ ! "$?" = "0" ]; then
  353. exit 276
  354. fi
  355. rm -rf /root/tempssl
  356. fi
  357. }
  358. function restore_personal_settings {
  359. for d in $SERVER_DIRECTORY/backup/personal/*/ ; do
  360. USERNAME=$(echo "$d" | awk -F '/' '{print $6}')
  361. if [[ $USERNAME != "git" ]]; then
  362. if [ -d $SERVER_DIRECTORY/backup/personal/$USERNAME ]; then
  363. if [ ! -d /home/$USERNAME ]; then
  364. ${PROJECT_NAME}-adduser $USERNAME
  365. fi
  366. echo $"Restoring personal settings for $USERNAME"
  367. restore_directory_from_friend /root/temppersonal personal/$USERNAME
  368. if [ -d /home/$USERNAME/personal ]; then
  369. rm -rf /home/$USERNAME/personal
  370. fi
  371. mv /root/temppersonal/home/$USERNAME/personal /home/$USERNAME
  372. if [ ! "$?" = "0" ]; then
  373. exit 184
  374. fi
  375. rm -rf /root/temppersonal
  376. fi
  377. fi
  378. done
  379. }
  380. function restore_mailing_list {
  381. if [ -d /var/spool/mlmmj ]; then
  382. echo $"Restoring public mailing list"
  383. restore_directory_from_friend /root/tempmailinglist mailinglist
  384. cp -r /root/tempmailinglist/root/spool/mlmmj/* /var/spool/mlmmj
  385. if [ ! "$?" = "0" ]; then
  386. exit 526
  387. fi
  388. rm -rf /root/tempmailinglist
  389. fi
  390. }
  391. function restore_xmpp {
  392. if [ -d /var/lib/prosody ]; then
  393. echo $"Restoring XMPP settings"
  394. restore_directory_from_friend /root/tempxmpp xmpp
  395. cp -r /root/tempxmpp/var/lib/prosody/* /var/lib/prosody
  396. if [ ! "$?" = "0" ]; then
  397. exit 725
  398. fi
  399. rm -rf /root/tempxmpp
  400. service prosody restart
  401. chown -R prosody:prosody /var/lib/prosody/*
  402. fi
  403. }
  404. function restore_gnu_social {
  405. if grep -q "GNU Social domain" $COMPLETION_FILE; then
  406. MICROBLOG_DOMAIN_NAME=$(cat $COMPLETION_FILE | grep "GNU Social domain" | awk -F ':' '{print $2}')
  407. restore_database_from_friend gnusocial ${MICROBLOG_DOMAIN_NAME}
  408. if [ -d /root/tempgnusocial ]; then
  409. rm -rf /root/tempgnusocial
  410. fi
  411. fi
  412. }
  413. function restore_hubzilla {
  414. if grep -q "Hubzilla domain" $COMPLETION_FILE; then
  415. HUBZILLA_DOMAIN_NAME=$(cat $COMPLETION_FILE | grep "Hubzilla domain" | awk -F ':' '{print $2}')
  416. restore_database_from_friend hubzilla ${HUBZILLA_DOMAIN_NAME}
  417. if [ -d $SERVER_DIRECTORY/backup/hubzilla ]; then
  418. if [ ! -d /var/www/${HUBZILLA_DOMAIN_NAME}/htdocs/store/[data]/smarty3 ]; then
  419. mkdir -p /var/www/${HUBZILLA_DOMAIN_NAME}/htdocs/store/[data]/smarty3
  420. fi
  421. chmod 777 /var/www/${HUBZILLA_DOMAIN_NAME}/htdocs/store/[data]/smarty3
  422. chown -R www-data:www-data /var/www/${HUBZILLA_DOMAIN_NAME}/htdocs/*
  423. fi
  424. if [ -d /root/temphubzilla ]; then
  425. rm -rf /root/temphubzilla
  426. fi
  427. fi
  428. }
  429. function restore_owncloud {
  430. if grep -q "Owncloud domain" $COMPLETION_FILE; then
  431. OWNCLOUD_DOMAIN_NAME=$(cat $COMPLETION_FILE | grep "Owncloud domain" | awk -F ':' '{print $2}')
  432. restore_database_from_friend owncloud $OWNCLOUD_DOMAIN_NAME
  433. if [ -d $SERVER_DIRECTORY/backup/owncloud ]; then
  434. echo $"Restoring Owncloud installation"
  435. cp -r /root/tempowncloud/var/lib/owncloud/* /var/lib/owncloud/
  436. if [ ! "$?" = "0" ]; then
  437. exit 981
  438. fi
  439. restore_directory_from_friend /root/tempowncloud2 owncloud2
  440. cp -r /root/tempowncloud2/etc/owncloud/* /etc/owncloud/
  441. if [ ! "$?" = "0" ]; then
  442. exit 982
  443. fi
  444. rm -rf /root/tempowncloud
  445. rm -rf /root/tempowncloud2
  446. chown -R www-data:www-data /var/lib/owncloud/data
  447. chown -R www-data:www-data /var/lib/owncloud/backup
  448. chown -R www-data:www-data /var/lib/owncloud/assets
  449. for d in /home/*/ ; do
  450. USERNAME=$(echo "$d" | awk -F '/' '{print $3}')
  451. if [[ $USERNAME != "git" ]]; then
  452. occ files:scan $USERNAME
  453. fi
  454. done
  455. ln -s /usr/share/owncloud /var/www/${OWNCLOUD_DOMAIN_NAME}/htdocs
  456. fi
  457. fi
  458. }
  459. function restore_gogs {
  460. if grep -q "Gogs domain" $COMPLETION_FILE; then
  461. GIT_DOMAIN_NAME=$(cat $COMPLETION_FILE | grep "Gogs domain" | awk -F ':' '{print $2}')
  462. restore_database_from_friend gogs $GIT_DOMAIN_NAME
  463. if [ -d $SERVER_DIRECTORY/backup/gogs ]; then
  464. if [ ! -d /home/git/go/src/github.com/gogits/gogs/custom ]; then
  465. mkdir -p /home/git/go/src/github.com/gogits/gogs/custom
  466. fi
  467. cp -r /root/tempgogs/home/git/go/src/github.com/gogits/gogs/custom/* /home/git/go/src/github.com/gogits/gogs/custom/
  468. if [ ! "$?" = "0" ]; then
  469. exit 5885
  470. fi
  471. echo $"Restoring Gogs repos"
  472. restore_directory_from_friend /root/tempgogsrepos gogsrepos
  473. cp -r /root/tempgogsrepos/home/git/gogs-repositories/* /home/git/gogs-repositories/
  474. if [ ! "$?" = "0" ]; then
  475. exit 7649
  476. fi
  477. echo $"Restoring Gogs authorized_keys"
  478. restore_directory_from_friend /root/tempgogsssh gogsssh
  479. if [ ! -d /home/git/.ssh ]; then
  480. mkdir /home/git/.ssh
  481. fi
  482. cp -r /root/tempgogsssh/home/git/.ssh/* /home/git/.ssh/
  483. if [ ! "$?" = "0" ]; then
  484. exit 74239
  485. fi
  486. rm -rf /root/tempgogs
  487. rm -rf /root/tempgogsrepos
  488. rm -rf /root/tempgogsssh
  489. chown -R git:git /home/git
  490. fi
  491. fi
  492. }
  493. function restore_wiki {
  494. if [ -d $SERVER_DIRECTORY/backup/wiki ]; then
  495. WIKI_DOMAIN_NAME=$(cat $COMPLETION_FILE | grep "Wiki domain" | awk -F ':' '{print $2}')
  496. echo $"Restoring Wiki installation $WIKI_DOMAIN_NAME"
  497. restore_directory_from_friend /root/tempwiki wiki
  498. cp -r /root/tempwiki/var/lib/dokuwiki/* /var/lib/dokuwiki/
  499. if [ ! "$?" = "0" ]; then
  500. exit 868
  501. fi
  502. restore_directory_from_friend /root/tempwiki2 wiki2
  503. cp -r /root/tempwiki2/etc/dokuwiki/* /etc/dokuwiki/
  504. if [ ! "$?" = "0" ]; then
  505. exit 869
  506. fi
  507. rm -rf /root/tempwiki
  508. rm -rf /root/tempwiki2
  509. chown -R www-data:www-data /var/lib/dokuwiki/*
  510. # Ensure that the bundled SSL cert is being used
  511. if [ -f /etc/ssl/certs/${WIKI_DOMAIN_NAME}.bundle.crt ]; then
  512. sed -i "s|${WIKI_DOMAIN_NAME}.crt|${WIKI_DOMAIN_NAME}.bundle.crt|g" /etc/nginx/sites-available/${WIKI_DOMAIN_NAME}
  513. fi
  514. if [ -d /etc/letsencrypt/live/${WIKI_DOMAIN_NAME} ]; then
  515. ln -s /etc/letsencrypt/live/${WIKI_DOMAIN_NAME}/privkey.pem /etc/ssl/private/${WIKI_DOMAIN_NAME}.key
  516. ln -s /etc/letsencrypt/live/${WIKI_DOMAIN_NAME}/fullchain.pem /etc/ssl/certs/${WIKI_DOMAIN_NAME}.pem
  517. fi
  518. fi
  519. }
  520. function restore_blog {
  521. if [ -d $SERVER_DIRECTORY/backup/blog ]; then
  522. FULLBLOG_DOMAIN_NAME=$(cat $COMPLETION_FILE | grep "Blog domain" | awk -F ':' '{print $2}')
  523. echo $"Restoring blog installation $FULLBLOG_DOMAIN_NAME"
  524. mkdir /root/tempblog
  525. restore_directory_from_friend /root/tempblog blog
  526. rm -rf /var/www/${FULLBLOG_DOMAIN_NAME}/htdocs
  527. cp -r /root/tempblog/var/www/${FULLBLOG_DOMAIN_NAME}/htdocs /var/www/${FULLBLOG_DOMAIN_NAME}/
  528. if [ ! "$?" = "0" ]; then
  529. exit 593
  530. fi
  531. rm -rf /root/tempblog
  532. if [ ! -d /var/www/${FULLBLOG_DOMAIN_NAME}/htdocs/content ]; then
  533. echo $"No content directory found after restoring blog"
  534. exit 287
  535. fi
  536. # Ensure that the bundled SSL cert is being used
  537. if [ -f /etc/ssl/certs/${FULLBLOG_DOMAIN_NAME}.bundle.crt ]; then
  538. sed -i "s|${FULLBLOG_DOMAIN_NAME}.crt|${FULLBLOG_DOMAIN_NAME}.bundle.crt|g" /etc/nginx/sites-available/${FULLBLOG_DOMAIN_NAME}
  539. fi
  540. for d in /home/*/ ; do
  541. USERNAME=$(echo "$d" | awk -F '/' '{print $3}')
  542. if [[ $USERNAME != "git" ]]; then
  543. if [ -d /var/www/${FULLBLOG_DOMAIN_NAME}/htdocs/content/$USERNAME/blog/uncategorized/post ]; then
  544. mv /var/www/${FULLBLOG_DOMAIN_NAME}/htdocs/content/$USERNAME/blog/*.md /var/www/${FULLBLOG_DOMAIN_NAME}/htdocs/content/$USERNAME/blog/uncategorized/post
  545. fi
  546. done
  547. if [ -d /etc/letsencrypt/live/${FULLBLOG_DOMAIN_NAME} ]; then
  548. ln -s /etc/letsencrypt/live/${FULLBLOG_DOMAIN_NAME}/privkey.pem /etc/ssl/private/${FULLBLOG_DOMAIN_NAME}.key
  549. ln -s /etc/letsencrypt/live/${FULLBLOG_DOMAIN_NAME}/fullchain.pem /etc/ssl/certs/${FULLBLOG_DOMAIN_NAME}.pem
  550. fi
  551. fi
  552. }
  553. function restore_cjdns {
  554. if [ -d $SERVER_DIRECTORY/backup/cjdns ]; then
  555. echo $"Restoring cjdns installation"
  556. restore_directory_from_friend /root/tempcjdns cjdns
  557. rm -rf /etc/cjdns
  558. cp -r /root/tempcjdns/etc/cjdns /etc/
  559. if [ ! "$?" = "0" ]; then
  560. exit 7438
  561. fi
  562. rm -rf /root/tempcjdns
  563. fi
  564. }
  565. function restore_voip {
  566. if [ -d $SERVER_DIRECTORY/backup/voip ]; then
  567. echo $"Restoring VoIP settings"
  568. restore_directory_from_friend /root/tempvoip voip
  569. cp -f /root/tempvoip/home/$ADMIN_USERNAME/tempbackup/mumble-server.ini /etc/
  570. if [ ! "$?" = "0" ]; then
  571. rm -rf /root/tempvoip
  572. exit 7823
  573. fi
  574. cp -f /root/tempvoip/home/$ADMIN_USERNAME/tempbackup/sipwitch.conf /etc/sipwitch.conf
  575. if [ ! "$?" = "0" ]; then
  576. rm -rf /root/tempvoip
  577. exit 7823
  578. fi
  579. cp -f /root/tempvoip/home/$ADMIN_USERNAME/tempbackup/mumble-server.sqlite /var/lib/mumble-server/
  580. if [ ! "$?" = "0" ]; then
  581. rm -rf /root/tempvoip
  582. exit 276
  583. fi
  584. rm -rf /root/tempvoip
  585. cp /etc/ssl/certs/mumble* /var/lib/mumble-server
  586. cp /etc/ssl/private/mumble* /var/lib/mumble-server
  587. chown -R mumble-server:mumble-server /var/lib/mumble-server
  588. service sipwitch restart
  589. service mumble-server restart
  590. fi
  591. }
  592. function restore_tox {
  593. if [ -d $SERVER_DIRECTORY/backup/tox ]; then
  594. echo $"Restoring Tox node settings"
  595. restore_directory_from_friend / tox
  596. if [ ! "$?" = "0" ]; then
  597. exit 93653
  598. fi
  599. cp /var/lib/tox-bootstrapd/tox-bootstrapd.conf /etc/tox-bootstrapd.conf
  600. systemctl restart tox-bootstrapd.service
  601. if [ ! "$?" = "0" ]; then
  602. systemctl status tox-bootstrapd.service
  603. exit 59369
  604. fi
  605. fi
  606. }
  607. function restore_email {
  608. for d in $SERVER_DIRECTORY/backup/mail/*/ ; do
  609. USERNAME=$(echo "$d" | awk -F '/' '{print $6}')
  610. if [[ $USERNAME != "git" ]]; then
  611. if [ -d $SERVER_DIRECTORY/backup/mail/$USERNAME ]; then
  612. if [ ! -d /home/$USERNAME ]; then
  613. ${PROJECT_NAME}-adduser $USERNAME
  614. fi
  615. echo $"Restoring emails for $USERNAME"
  616. restore_directory_from_friend /root/tempmail mail/$USERNAME
  617. if [ ! -d /home/$USERNAME/Maildir ]; then
  618. mkdir /home/$USERNAME/Maildir
  619. fi
  620. tar -xzvf /root/tempmail/root/tempbackupemail/$USERNAME/maildir.tar.gz -C /
  621. if [ ! "$?" = "0" ]; then
  622. exit 927
  623. fi
  624. rm -rf /root/tempmail
  625. fi
  626. fi
  627. done
  628. }
  629. function restore_dlna {
  630. if [ -d /var/cache/minidlna ]; then
  631. if [ -d $SERVER_DIRECTORY/backup/dlna ]; then
  632. echo $"Restoring DLNA cache"
  633. restore_directory_from_friend /root/tempdlna dlna
  634. cp -r /root/tempdlna/var/cache/minidlna/* /var/cache/minidlna/
  635. if [ ! "$?" = "0" ]; then
  636. exit 982
  637. fi
  638. rm -rf /root/tempdlna
  639. fi
  640. fi
  641. }
  642. # Social key management
  643. # Recover any key fragments and reconstruct the gpg key
  644. ${PROJECT_NAME}-recoverkey -u ${ADMIN_USERNAME} -l $BACKUP_LIST
  645. copy_gpg_keys
  646. restore_configuration
  647. restore_mariadb
  648. restore_letsencrypt
  649. restore_mutt_settings
  650. restore_gpg
  651. restore_procmail
  652. restore_spamassassin
  653. restore_admin_readme
  654. restore_ipfs
  655. restore_ssh_keys
  656. restore_user_config
  657. restore_certs
  658. restore_personal_settings
  659. restore_mailing_list
  660. restore_xmpp
  661. restore_gnu_social
  662. restore_hubzilla
  663. restore_owncloud
  664. restore_gogs
  665. restore_wiki
  666. restore_blog
  667. restore_cjdns
  668. restore_voip
  669. restore_tox
  670. restore_email
  671. restore_dlna
  672. echo $"*** Remote restore was successful ***"
  673. exit 0