backup.script 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613
  1. #!/bin/bash
  2. sd_multi="no"
  3. card_no="0"
  4. multiboot_label="sd"
  5. #--------------------------------------------------
  6. disp_header() {
  7. clear
  8. printf "\n\033[36m\033[1m\n"
  9. if [ ! "${O_BOARD}" = "XU" ]; then
  10. printf " =================================\n"
  11. printf " = Odroid %s Backup utility %s =\n" "${O_BOARD}" "${SCRIPT_VERSION}"
  12. printf " =================================\n"
  13. else
  14. printf " ======================================\n"
  15. printf " = Odroid XU3/XU4 Backup utility %s =\n" "${SCRIPT_VERSION}"
  16. printf " ======================================\n"
  17. fi
  18. printf "\033[22m\033[37m\n\n"
  19. sleep 1
  20. }
  21. #--------------------------------------------------
  22. #------------------------------------------------------------------------------------------------------------
  23. # arg1: full path to image file
  24. # arg2: description
  25. # arg3: backup type, 'andro' or 'linux'
  26. # source partition is mounted on /mnt1
  27. make_image() {
  28. mkdir /imgmnt >> ${log_file} 2>&1
  29. printf " Backup: \033[32m%s\033[37m ... preparing image... " "${2}"
  30. # Get size
  31. _size_=$(du -s /mnt1 | awk '{print $1}')
  32. _size=$(( ($_size_ / 1024) + 128 ))
  33. # add 5% ext4 fs overhead
  34. _ovhd=$(( ($_size * 6) / 100 ))
  35. _size=$(( $_size + $_ovhd ))
  36. rm -f ${1} >> ${log_file} 2>&1
  37. printf " (%sM)... " "${_size}"
  38. # create sparse image file
  39. dd if=/dev/zero of=${1} bs=1 count=0 seek=${_size}M >> ${log_file} 2>&1
  40. #dd if=/dev/zero of=${1} bs=1M count=${_size} >> ${log_file} 2>&1
  41. if [ $? -ne 0 ]; then
  42. printf "ERROR\n"
  43. return 1
  44. fi
  45. sync
  46. printf "mkfs... "
  47. mkfs.ext4 ${1} >> ${log_file} 2>&1
  48. if [ $? -ne 0 ]; then
  49. printf "ERROR\n"
  50. return 1
  51. fi
  52. sync
  53. printf "mount... "
  54. mountx ${1} /imgmnt >> ${log_file} 2>&1
  55. if [ $? -ne 0 ]; then
  56. printf "ERROR\n"
  57. return 1
  58. fi
  59. # Copy partition to image
  60. printf "copy... "
  61. if [ "${3}" = "andro" ]; then
  62. rsync -r -t -p -o -g -x -l -H -D --numeric-ids -s -A -X --no-specials /mnt1/ /imgmnt/ >> ${log_file} 2>&1
  63. else
  64. rsync -r -t -p -o -g -x -l -H -D --numeric-ids -s --stats /mnt1/ /imgmnt/ >> ${log_file} 2>&1
  65. fi
  66. if [ $? -ne 0 ]; then
  67. umount /imgmnt >> ${log_file} 2>&1
  68. printf "ERROR\n"
  69. return 1
  70. fi
  71. sync
  72. umount /imgmnt >> ${log_file} 2>&1
  73. printf "OK\n"
  74. return 0
  75. }
  76. #------------------------------------------------------------------------------------------------------------
  77. #--------------------------------------------------------------------------------------------------------------
  78. backup_android() {
  79. printf "\n Backup: \033[32m\033[1mAndroid\033[22m\033[37m\n"
  80. # === backup system partition, already mounted on /mnt1 ===
  81. mkdir /mnt2/${BKP_PREFIX}_backup >> ${log_file} 2>&1
  82. mkdir /mnt2/${BKP_PREFIX}_backup/android >> ${log_file} 2>&1
  83. rm -rf /mnt2/${BKP_PREFIX}_backup/android/* >> ${log_file} 2>&1
  84. mkdir /mnt2/${BKP_PREFIX}_backup/android/userdir >> ${log_file} 2>&1
  85. make_image "/mnt2/${BKP_PREFIX}_backup/android/system.raw.img" "Android system" "andro"
  86. if [ $? -ne 0 ]; then
  87. umount /mnt1 >> ${log_file} 2>&1
  88. return 1
  89. fi
  90. umount /mnt1 >> ${log_file} 2>&1
  91. # === backup data partition ===
  92. if [ "${sd_multi}" = "yes" ]; then
  93. /bin/mountx /dev/disk/by-label/${multiboot_label}data /mnt1 >> ${log_file} 2>&1
  94. else
  95. # Original Odroid android
  96. /bin/mountx /dev/mmcblk${card_no}p${ADATA_PART_ORIG} /mnt1 >> ${log_file} 2>&1
  97. fi
  98. if [ $? -ne 0 ]; then
  99. umount /mnt1 >> ${log_file} 2>&1
  100. printf " ERROR mounting data partition\n"
  101. return 1
  102. fi
  103. make_image "/mnt2/${BKP_PREFIX}_backup/android/data.raw.img" "Android data" "andro"
  104. if [ $? -ne 0 ]; then
  105. umount /mnt1 >> ${log_file} 2>&1
  106. return 1
  107. fi
  108. umount /mnt1 >> ${log_file} 2>&1
  109. # === backup cache partition ===
  110. if [ "${sd_multi}" = "yes" ]; then
  111. /bin/mountx /dev/disk/by-label/${multiboot_label}cache /mnt1 >> ${log_file} 2>&1
  112. else
  113. # Original Odroid android
  114. /bin/mountx /dev/mmcblk${card_no}p${ACACHE_PART_ORIG} /mnt1 >> ${log_file} 2>&1
  115. fi
  116. if [ $? -ne 0 ]; then
  117. umount /mnt1 >> ${log_file} 2>&1
  118. printf " ERROR mounting cache partition\n"
  119. return 1
  120. fi
  121. make_image "/mnt2/${BKP_PREFIX}_backup/android/cache.raw.img" "Android cache" "andro"
  122. if [ $? -ne 0 ]; then
  123. umount /mnt1 >> ${log_file} 2>&1
  124. return 1
  125. fi
  126. umount /mnt1 >> ${log_file} 2>&1
  127. # === Mount boot card and copy android user data and boot files ===
  128. printf " Backup: \033[32mCopy boot files\033[37m ... "
  129. mount -t vfat /dev/mmcblk${card_no}p1 /mnt1 >> ${log_file} 2>&1
  130. if [ $? -ne 0 ]; then
  131. printf "ERROR mounting boot card\n"
  132. return 1
  133. fi
  134. cp -rf /mnt1/* /mnt2/${BKP_PREFIX}_backup/android/userdir >> ${log_file} 2>&1
  135. rm -rf /mnt2/${BKP_PREFIX}_backup/android/userdir/multiboot/* >> ${log_file} 2>&1
  136. rmdir /mnt2/${BKP_PREFIX}_backup/android/userdir/multiboot >> ${log_file} 2>&1
  137. rm -f /mnt2/${BKP_PREFIX}_backup/android/userdir/boot.ini >> ${log_file} 2>&1
  138. if [ "${sd_multi}" = "yes" ]; then
  139. cp /mnt1/multiboot/${ODROID_IMAGE}.android /mnt2/${BKP_PREFIX}_backup/android/${ODROID_IMAGE} >> ${log_file} 2>&1
  140. if [ $? -ne 0 ]; then
  141. printf "ERROR: Image\n"
  142. return 1
  143. fi
  144. if [ ! "${O_BOARD}" = "XU" ]; then
  145. cp /mnt1/multiboot/${ODROID_DTB}.android /mnt2/${BKP_PREFIX}_backup/android/${ODROID_DTB} >> ${log_file} 2>&1
  146. if [ $? -ne 0 ]; then
  147. printf "ERROR: dtb\n"
  148. return 1
  149. fi
  150. fi
  151. else
  152. # Original Odroid android, extract kernel/dtb from the card
  153. if [ -f /mnt1/${ODROID_IMAGE} ]; then
  154. cp /mnt1/${ODROID_IMAGE} /mnt2/${BKP_PREFIX}_backup/android >> ${log_file} 2>&1
  155. if [ $? -ne 0 ]; then
  156. printf "ERROR: Kernel\n"
  157. return 1
  158. fi
  159. else
  160. if [ ! "${O_BOARD}" = "C1" ]; then
  161. if [ "${O_BOARD}" = "C2" ]; then
  162. dd if=/dev/mmcblk${card_no} of=/mnt2/${BKP_PREFIX}_backup/android/${ODROID_IMAGE} bs=512 skip=1632 count=32768 >> ${log_file} 2>&1
  163. elif [ "${O_BOARD}" = "XU" ]; then
  164. dd if=/dev/mmcblk${card_no} of=/mnt2/${BKP_PREFIX}_backup/android/${ODROID_IMAGE} bs=512 skip=1263 count=16384 >> ${log_file} 2>&1
  165. fi
  166. if [ $? -ne 0 ]; then
  167. printf "ERROR: Kernel\n"
  168. return 1
  169. fi
  170. sync
  171. fi
  172. fi
  173. if [ -f /mnt1/${ODROID_DTB} ]; then
  174. cp /mnt1/${ODROID_DTB} /mnt2/${BKP_PREFIX}_backup/android >> ${log_file} 2>&1
  175. if [ $? -ne 0 ]; then
  176. printf "ERROR: dtb\n"
  177. return 1
  178. fi
  179. else
  180. if [ "${O_BOARD}" = "C2" ]; then
  181. dd if=/dev/mmcblk${card_no} of=/mnt2/${BKP_PREFIX}_backup/android/${ODROID_DTB} bs=512 skip=1504 count=128 >> ${log_file} 2>&1
  182. if [ $? -ne 0 ]; then
  183. printf "ERROR: dtb\n"
  184. return 1
  185. fi
  186. sync
  187. fi
  188. fi
  189. fi
  190. umount /mnt1 >> ${log_file} 2>&1
  191. sync
  192. sleep 1
  193. printf "OK\n"
  194. return 0
  195. }
  196. #--------------------------------------------------------------------------------------------------------------
  197. #----------------------------------------------------------------------------------------------------------------
  198. backup_linux() {
  199. printf "\n Backup: \033[32m\033[1mLinux%s\033[22m\033[37m\n" "${1}"
  200. # backup Linux partition, already mounted on /mnt1
  201. mkdir /mnt2/${BKP_PREFIX}_backup >> ${log_file} 2>&1
  202. mkdir /mnt2/${BKP_PREFIX}_backup/linux${1} >> ${log_file} 2>&1
  203. rm -rf /mnt2/${BKP_PREFIX}_backup/linux${1}/* >> ${log_file} 2>&1
  204. make_image "/mnt2/${BKP_PREFIX}_backup/linux${1}/linux.img" "Linux root" "linux"
  205. if [ $? -ne 0 ]; then
  206. umount /mnt1 >> ${log_file} 2>&1
  207. return 1
  208. fi
  209. umount /mnt1 >> ${log_file} 2>&1
  210. if [ $? -ne 0 ]; then
  211. printf "ERROR unmounting Linux partition\n"
  212. return 1
  213. fi
  214. # Mount boot card and copy Linux boot files
  215. printf " Backup: \033[32mCopy boot files\033[37m ... "
  216. mount -t vfat /dev/mmcblk${card_no}p1 /mnt1 >> ${log_file} 2>&1
  217. if [ $? -ne 0 ]; then
  218. printf "ERROR mounting boot partition\n"
  219. return 1
  220. fi
  221. if [ "${sd_multi}" = "yes" ]; then
  222. cp /mnt1/multiboot/${ODROID_IMAGE}.linux /mnt2/${BKP_PREFIX}_backup/linux${1}/${ODROID_IMAGE} >> ${log_file} 2>&1
  223. if [ $? -ne 0 ]; then
  224. printf "ERROR: Image\n"
  225. return 1
  226. fi
  227. cp /mnt1/multiboot/${ODROID_DTB}.linux /mnt2/${BKP_PREFIX}_backup/linux${1}/${ODROID_DTB} >> ${log_file} 2>&1
  228. if [ $? -ne 0 ]; then
  229. printf "ERROR: dtb\n"
  230. return 1
  231. fi
  232. cp /mnt1/multiboot/uInitrd.linux /mnt2/${BKP_PREFIX}_backup/linux${1}/uInitrd >> ${log_file} 2>&1
  233. if [ $? -ne 0 ]; then
  234. printf "ERROR: uInitrd\n"
  235. return 1
  236. fi
  237. else
  238. cp /mnt1/${ODROID_IMAGE} /mnt2/${BKP_PREFIX}_backup/linux${1} >> ${log_file} 2>&1
  239. if [ $? -ne 0 ]; then
  240. printf "ERROR: Image "
  241. fi
  242. cp /mnt1/${ODROID_DTB} /mnt2/${BKP_PREFIX}_backup/linux${1} >> ${log_file} 2>&1
  243. if [ $? -ne 0 ]; then
  244. printf "ERROR: dtb "
  245. fi
  246. cp /mnt1/uInitrd /mnt2/${BKP_PREFIX}_backup/linux${1} >> ${log_file} 2>&1
  247. if [ $? -ne 0 ]; then
  248. printf "ERROR: uInitrd "
  249. fi
  250. fi
  251. sync
  252. sleep 1
  253. umount /mnt1 >> ${log_file} 2>&1
  254. printf "OK\n"
  255. return 0
  256. }
  257. #----------------------------------------------------------------------------------------------------------------
  258. backup_oelec() {
  259. printf "\n Backup: \033[32m\033[1mOpenElec\033[22m\033[37m\n"
  260. # === backup oelec partition, allready mounted on /mnt1 ===
  261. mkdir /mnt2/${BKP_PREFIX}_backup >> ${log_file} 2>&1
  262. mkdir /mnt2/${BKP_PREFIX}_backup/oelec >> ${log_file} 2>&1
  263. rm -rf /mnt2/${BKP_PREFIX}_backup/oelec/* >> ${log_file} 2>&1
  264. mkdir /mnt2/${BKP_PREFIX}_backup/oelec/target >> ${log_file} 2>&1
  265. mkdir /mnt2/${BKP_PREFIX}_backup/oelec/3rdparty >> ${log_file} 2>&1
  266. mkdir /mnt2/${BKP_PREFIX}_backup/oelec/3rdparty/bootloader >> ${log_file} 2>&1
  267. make_image "/mnt2/${BKP_PREFIX}_backup/oelec/oelec.img" "OpenElec" "linux"
  268. if [ $? -ne 0 ]; then
  269. umount /mnt1 >> ${log_file} 2>&1
  270. return 1
  271. fi
  272. umount /mnt1 >> ${log_file} 2>&1
  273. # === Mount boot card and copy OpenElec boot files ===
  274. printf " Backup: \033[32mCopy OpenElec files\033[37m ... "
  275. mount -t vfat /dev/mmcblk${card_no}p1 /mnt1 >> ${log_file} 2>&1
  276. if [ $? -ne 0 ]; then
  277. printf "ERROR mounting boot card\n"
  278. return 1
  279. fi
  280. cp /mnt1/SYSTEM /mnt2/${BKP_PREFIX}_backup/oelec/target >> ${log_file} 2>&1
  281. if [ $? -ne 0 ]; then
  282. printf "ERROR: SYSTEM\n"
  283. return 1
  284. fi
  285. cp /mnt1/multiboot/KERNEL /mnt2/${BKP_PREFIX}_backup/oelec/target >> ${log_file} 2>&1
  286. if [ $? -ne 0 ]; then
  287. printf "ERROR: KERNEL\n"
  288. return 1
  289. fi
  290. cp /mnt1/multiboot/${ODROID_DTB}.oelec /mnt2/${BKP_PREFIX}_backup/oelec/3rdparty/bootloader/${ODROID_DTB} >> ${log_file} 2>&1
  291. if [ $? -ne 0 ]; then
  292. printf "ERROR: dtb\n"
  293. return 1
  294. fi
  295. if [ "${O_BOARD}" = "XU" ]; then
  296. cp /mnt1/multiboot/INITRD /mnt2/${BKP_PREFIX}_backup/oelec/target >> ${log_file} 2>&1
  297. if [ $? -ne 0 ]; then
  298. printf "ERROR: INITRD\n"
  299. return 1
  300. fi
  301. fi
  302. umount /mnt1 >> ${log_file} 2>&1
  303. printf "OK\n"
  304. return 0
  305. }
  306. #----------------------------------------------------------------------------------------------------
  307. exit_script() {
  308. local _delay=30
  309. local B="X"
  310. echo ""
  311. while [ $_delay -gt 0 ]; do
  312. printf " \033[33mPress \033[1mE\033[22m to exit to main menu (%s) \033[37m\r" "${_delay}"
  313. if read -n 1 -t 1 -s B; then
  314. _delay=30
  315. if [ "${B}" = "E" ] || [ "${B}" = "e" ]; then
  316. break
  317. elif [ "${B}" = "s" ]; then
  318. # SCREENSHOT ===
  319. fbcat > /backup_exit.ppm
  320. fi
  321. else
  322. let _delay=_delay-1
  323. fi
  324. done
  325. printf "\r\033[2K"
  326. umount /mnt1 > /dev/null 2>&1
  327. umount /mnt2 > /dev/null 2>&1
  328. exit 0
  329. }
  330. #----------------------------------------------------------------------------------------------------
  331. #=====================================================================================
  332. mkdir /mnt1 > /dev/null 2>&1
  333. mkdir /mnt2 > /dev/null 2>&1
  334. mkdir /multiboot > /dev/null 2>&1
  335. umount /mnt1 > /dev/null 2>&1
  336. umount /mnt2 > /dev/null 2>&1
  337. disp_header
  338. # ===============
  339. # Check USB drive
  340. # ===============
  341. if [ ! -b /dev/sda ]; then
  342. printf " ERROR: USB drive not found\n"
  343. exit_script
  344. fi
  345. usb_part="0"
  346. max_usbpart=0
  347. #------------------------------------------------------------------------------------
  348. check_usbpart() {
  349. local usbpart_free=0
  350. if [ -b /dev/sda${1} ]; then
  351. let max_usbpart=max_usbpart+1
  352. printf " \033[32m\033[1m%s\033[22m partition #%s \033[37m (" "${1}" "${1}"
  353. /bin/mountx /dev/sda${1} /mnt2 > /dev/null 2>&1
  354. if [ $? -ne 0 ]; then
  355. printf "NOT MOUNTABLE)\n"
  356. else
  357. [ "${usb_part}" = "0" ] && usb_part="1"
  358. usbpart_free=$(df | grep /dev/sda${1} | awk '{print $4}')
  359. usbpart_free=$(( $usbpart_free / 1024 ))
  360. printf "%sM free)\n" "${usbpart_free}"
  361. fi
  362. umount /mnt2 > /dev/null 2>&1
  363. fi
  364. }
  365. #------------------------------------------------------------------------------------
  366. printf " \033[33mMore than one partition on USB drive detected, select which one to use for backup\033[37m\n\n"
  367. check_usbpart "1"
  368. check_usbpart "2"
  369. check_usbpart "3"
  370. check_usbpart "4"
  371. check_usbpart "5"
  372. check_usbpart "6"
  373. printf "\n"
  374. if [ $max_usbpart -eq 0 ] || [ "${usb_part}" = "0" ]; then
  375. printf " ERROR: no usable USB partition found!\n"
  376. exit_script
  377. fi
  378. _delay=30
  379. usb_part="1"
  380. while [ $_delay -gt 0 ]; do
  381. printf " \033[33mSelect the backup partition, default is \033[1m#1\033[22m %s\033[37m \r" "${_delay}"
  382. B="X"
  383. if read -n 1 -t 1 -s B; then
  384. _delay=30
  385. if [ "${B}" = "1" ] && [ $max_usbpart -ge 1 ]; then
  386. usb_part="1"
  387. break
  388. elif [ "${B}" = "2" ] && [ $max_usbpart -ge 2 ]; then
  389. usb_part="2"
  390. break
  391. elif [ "${B}" = "3" ] && [ $max_usbpart -ge 3 ]; then
  392. usb_part="3"
  393. break
  394. elif [ "${B}" = "4" ] && [ $max_usbpart -ge 4 ]; then
  395. usb_part="4"
  396. break
  397. elif [ "${B}" = "5" ] && [ $max_usbpart -ge 5 ]; then
  398. usb_part="5"
  399. break
  400. elif [ "${B}" = "6" ] && [ $max_usbpart -ge 6 ]; then
  401. usb_part="6"
  402. break
  403. fi
  404. else
  405. let _delay=_delay-1
  406. fi
  407. done
  408. disp_header
  409. # Mount backup partition
  410. /bin/mountx /dev/sda${usb_part} /mnt2 > /dev/null 2>&1
  411. if [ $? -ne 0 ]; then
  412. printf " ERROR mounting USB partition #%s\n" "${usb_part}"
  413. exit_script
  414. fi
  415. #==========================================================================================
  416. rm /mnt2/backup.log > /dev/null 2>&1
  417. log_file="/mnt2/backup.log"
  418. #log_file="ls/dev/null"
  419. # Check source drive
  420. if [ "${NUMCARDS}" = "2" ]; then
  421. printf " \033[33mTwo cards detected, select which one to use for backup\033[37m\n\n"
  422. printf " \033[32m\033[1m0\033[22m Boot card (%s)\033[37m\n" "${BOOT_CARDTYPE}"
  423. printf " \033[32m\033[1m1\033[22m Other card (%s)\033[37m\n\n" "${OTHER_CARDTYPE}"
  424. _delay=30
  425. while [ $_delay -gt 0 ]; do
  426. printf " \033[33mSelect the card, default is \033[1mEMMC\033[22m %s\033[37m \r" "${_delay}"
  427. B="X"
  428. if read -n 1 -t 1 -s B; then
  429. _delay=30
  430. if [ "${B}" = "0" ]; then
  431. card_no="${BOOT_CARDDEV}"
  432. card_type="${BOOT_CARDTYPE}"
  433. break
  434. elif [ "${B}" = "1" ]; then
  435. card_no="${OTHER_CARDDEV}"
  436. card_type="${OTHER_CARDTYPE}"
  437. break
  438. fi
  439. else
  440. let _delay=_delay-1
  441. fi
  442. done
  443. disp_header
  444. fi
  445. # === Display backup info ===
  446. printf " \033[32mBackup from "
  447. if [ "${card_type}" = "SD" ]; then
  448. multiboot_label="sd"
  449. else
  450. multiboot_label="em"
  451. fi
  452. # === Check if the backup is from multiboot card ===
  453. # shellcheck disable=SC2010
  454. tmp_crdtype=`ls -l /dev/disk/by-label | grep mmcblk${card_no}p1 | awk '{print $4}'`
  455. if [ "${tmp_crdtype}" = "${multiboot_label}userdata" ]; then
  456. sd_multi="yes"
  457. printf "\033[1mMultiBoot\033[22m %s card " "${card_type}"
  458. else
  459. printf "\033[1mOriginal Odroid\033[22m %s card " "${card_type}"
  460. fi
  461. printf " to \033[1mUSB partition #%s\033[22m\033[37m\n\n" "${usb_part}"
  462. # === Mount partition 2 (Android system or Linux) ===
  463. /bin/mountx /dev/mmcblk${card_no}p2 /mnt1 >> ${log_file} 2>&1
  464. if [ $? -ne 0 ]; then
  465. umount /mnt2 > /dev/null 2>&1
  466. printf " ERROR mounting source card, nothing to backup\n"
  467. exit_script
  468. fi
  469. # === Wait for backup confirmation ===
  470. _delay=30
  471. while [ $_delay -gt 0 ]; do
  472. printf " \033[33mReady for backup, press \033[1mY\033[22m to continue, \033[1mE\033[22m to exit (%s) \033[37m\r" "${_delay}"
  473. B="X"
  474. if read -n 1 -t 1 -s B; then
  475. _delay=30
  476. if [ "${B}" = "Y" ]; then
  477. printf "\r\033[2K"
  478. break
  479. elif [ "${B}" = "E" ] || [ "${B}" = "e" ]; then
  480. _delay=0
  481. break
  482. elif [ "${B}" = "s" ]; then
  483. # SCREENSHOT ===
  484. fbcat > /backup.ppm
  485. fi
  486. else
  487. let _delay=_delay-1
  488. fi
  489. done
  490. if [ $_delay -eq 0 ]; then
  491. printf "\r\033[2K"
  492. umount /mnt2 > /dev/null 2>&1
  493. exit_script
  494. fi
  495. # === Ckeck if it is Android partition ===
  496. if [ -f /mnt1/${ODROID_FSTAB} ]; then
  497. backup_android
  498. else
  499. if [ ! "${sd_multi}" = "yes" ]; then
  500. # backup single linux card
  501. if [ -f /mnt1/etc/fstab ]; then
  502. backup_linux ""
  503. fi
  504. fi
  505. fi
  506. umount /mnt1 >> ${log_file} 2>&1
  507. # === For multiboot card backup, continue to backup other operating systems ===
  508. if [ "${sd_multi}" = "yes" ]; then
  509. if [ -b /dev/disk/by-label/${multiboot_label}linux ]; then
  510. printf "\n"
  511. # === Backup multiboot Linux ===
  512. /bin/mountx /dev/disk/by-label/${multiboot_label}linux /mnt1 >> ${log_file} 2>&1
  513. if [ $? -ne 0 ]; then
  514. printf " ERROR mounting Linux partition\n"
  515. exit_script
  516. fi
  517. if [ -f /mnt1/etc/fstab ]; then
  518. backup_linux ""
  519. fi
  520. fi
  521. umount /mnt1 >> ${log_file} 2>&1
  522. if [ -b /dev/disk/by-label/${multiboot_label}linux2 ]; then
  523. printf "\n"
  524. # === Backup multiboot Linux2 ===
  525. /bin/mountx /dev/disk/by-label/${multiboot_label}linux2 /mnt1 >> ${log_file} 2>&1
  526. if [ $? -eq 0 ]; then
  527. if [ -f /mnt1/etc/fstab ]; then
  528. backup_linux "2"
  529. fi
  530. fi
  531. fi
  532. if [ -b /dev/disk/by-label/${multiboot_label}aux ]; then
  533. printf "\n"
  534. # === Backup multiboot OpenElec ===
  535. /bin/mountx /dev/disk/by-label/${multiboot_label}aux /mnt1 >> ${log_file} 2>&1
  536. if [ $? -eq 0 ]; then
  537. backup_oelec
  538. fi
  539. fi
  540. fi
  541. umount /mnt1 >> ${log_file} 2>&1
  542. umount /mnt2 > /dev/null 2>&1
  543. printf "\n FINISHED.\n"
  544. exit_script
  545. #=====================================================================================