install.script 41 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405
  1. #!/bin/bash
  2. # === Detect instalation source ===
  3. echo "1 1 1 1" > /proc/sys/kernel/printk
  4. mkdir /mnt > /dev/null 2>&1
  5. mkdir /multiboot > /dev/null 2>&1
  6. mkdir /run/inst > /dev/null 2>&1
  7. #-------------------------------------------------------
  8. print_header() {
  9. clear
  10. printf "\n\033[36m\033[1m\n"
  11. printf " ======================================\n"
  12. printf " = Jeedom installer %s =\n" "${SCRIPT_VERSION}"
  13. printf " ======================================\n"
  14. printf "\033[22m\033[37m\n"
  15. }
  16. #-------------------------------------------------------
  17. print_header
  18. # Set variables
  19. CARD1=""
  20. CARD2=""
  21. CARD1_EMMC=""
  22. CARD2_EMMC=""
  23. DEST_CARD=""
  24. DEST_EMMC=""
  25. INST_ANDROID=""
  26. INST_OELEC=""
  27. INST_LINUX=""
  28. INST_LINUX2=""
  29. A_FROMDIR=""
  30. L_FROMDIR=""
  31. L2_FROMDIR=""
  32. O_FROMDIR=""
  33. SYSTEM_SIZE=1024
  34. SYSTEM_MINSIZE=768
  35. DATA_SIZE=1024
  36. DATA_MINSIZE=1024
  37. CACHE_SIZE=256
  38. CACHE_MINSIZE=128
  39. USERDATA_SIZE=1024
  40. USERDATA_MINSIZE=512
  41. LINUX_SIZE=2048
  42. LINUX_MINSIZE=2048
  43. OELEC_SIZE=512
  44. OELEC_MINSIZE=512
  45. LINUX_FSTYPE="ext4"
  46. _dest_system="/dev/disk/by-label/sdsystem"
  47. _dest_cache="/dev/disk/by-label/sdcache"
  48. _dest_data="/dev/disk/by-label/sddata"
  49. _erase_data="no"
  50. _part6_label="auxpart"
  51. _part6_dlabel="Reserved"
  52. _instfound="no"
  53. andro_updatearchive="no"
  54. _inst_mbkernel="no"
  55. _inst_no_=0
  56. #-----------------------------------------------------
  57. # Check card type
  58. #----------------
  59. CARD1="/dev/mmcblk${BOOT_CARDDEV}"
  60. CARD1_EMMC="${BOOT_CARDTYPE}"
  61. if [ "${NUMCARDS}" = "2" ]; then
  62. CARD2="/dev/mmcblk${OTHER_CARDDEV}"
  63. CARD2_EMMC="${OTHER_CARDTYPE}"
  64. fi
  65. #-----------------------------------------------------
  66. #-----------------------------------------------------
  67. # Check where the installation files are located
  68. check_source() {
  69. if [ -b ${1} ]; then
  70. /bin/mountx ${1} /mnt > /dev/null 2>&1
  71. [ $? -ne 0 ] && return 1
  72. else
  73. return 1
  74. fi
  75. sleep 1
  76. # === Source drive found and 1st partition mounted on /mnt ===
  77. # === Check installation files on source drive ===
  78. # LINUX
  79. if [ -d /mnt/${BKP_PREFIX}_backup/linux ]; then
  80. if [ -f /mnt/${BKP_PREFIX}_backup/linux/jeedom.img ]; then
  81. INST_LINUX="yes"
  82. _instfound="yes"
  83. L_FROMDIR="yes"
  84. fi
  85. else
  86. if [ -f /mnt/linux.img ]; then
  87. INST_LINUX="yes"
  88. _instfound="yes"
  89. fi
  90. fi
  91. [ "${_instfound}" = "no" ] && return 1
  92. return 0
  93. }
  94. #-----------------------------------------------------
  95. #----------------------------------------------------------------------------------------------------
  96. exit_script() {
  97. local _delay=60
  98. local B="X"
  99. echo ""
  100. while [ $_delay -gt 0 ]; do
  101. printf " \033[33mPress \033[1mE\033[22m to exit to main menu (%s) \033[37m\r" "${_delay}"
  102. if read -n 1 -t 1 -s B; then
  103. _delay=60
  104. if [ "${B}" = "E" ] || [ "${B}" = "e" ]; then
  105. break
  106. elif [ "${B}" = "s" ]; then
  107. # SCREENSHOT ===
  108. fbcat > /install_exit.ppm
  109. fi
  110. else
  111. let _delay=_delay-1
  112. fi
  113. done
  114. printf "\r\033[2K"
  115. umount /mnt1 > /dev/null 2>&1
  116. umount /mnt2 > /dev/null 2>&1
  117. umount /mnt > /dev/null 2>&1
  118. udevadm trigger --action=add > /dev/null 2>&1
  119. exit 0
  120. }
  121. #----------------------------------------------------------------------------------------------------
  122. #---------------------------------------------------------------------------
  123. check_install_sources() {
  124. _inst_no_=0
  125. if [ ! "${INST_ANDROID}" = "yes" ]; then
  126. SYSTEM_MINSIZE=8
  127. DATA_MINSIZE=8
  128. SYSTEM_SIZE=8
  129. DATA_SIZE=8
  130. CACHE_SIZE=8
  131. CACHE_MINSIZE=8
  132. USERDATA_MINSIZE=256
  133. USERDATA_SIZE=256
  134. else
  135. let _inst_no_=_inst_no_+1
  136. fi
  137. if [ ! "${INST_OELEC}" = "yes" ] && [ ! "${INST_LINUX2}" = "yes" ]; then
  138. # Partition 6 is reserved partition
  139. OELEC_MINSIZE=8
  140. OELEC_SIZE=256
  141. else
  142. if [ "${INST_OELEC}" = "yes" ]; then
  143. # Partition 6 is oelec partition
  144. OELEC_MINSIZE=256
  145. OELEC_SIZE=512
  146. if [ $USERDATA_MINSIZE -lt 384 ]; then
  147. USERDATA_MINSIZE=384
  148. USERDATA_SIZE=384
  149. fi
  150. let _inst_no_=_inst_no_+1
  151. elif [ "${INST_LINUX2}" = "yes" ]; then
  152. # Partition 6 is Linux2
  153. OELEC_MINSIZE=1563
  154. OELEC_SIZE=1536
  155. let _inst_no_=_inst_no_+1
  156. fi
  157. fi
  158. if [ ! "${INST_LINUX}" = "yes" ]; then
  159. LINUX_MINSIZE=8
  160. LINUX_SIZE=8
  161. else
  162. let _inst_no_=_inst_no_+1
  163. fi
  164. }
  165. #---------------------------------------------------------------------------
  166. print_header
  167. # ===============================================================
  168. # === Copy multiboot files from boot drive to RAMfs directory ===
  169. # ===============================================================
  170. mount -t vfat /dev/mmcblk${BOOT_CARDDEV}p1 /mnt > /dev/null 2>&1
  171. if [ $? -ne 0 ]; then
  172. printf " ERROR mounting boot card"
  173. exit_script
  174. fi
  175. cp -rf /mnt/multiboot/* /multiboot > /dev/null 2>&1
  176. if [ $? -ne 0 ]; then
  177. printf " ERROR copying multiboot files"
  178. exit_script
  179. fi
  180. umount /mnt > /dev/null 2>&1
  181. if [ $? -ne 0 ]; then
  182. printf " ERROR unmounting boot card"
  183. exit_script
  184. fi
  185. sleep 1
  186. # ===============================================================
  187. #=================================================
  188. printf " Searching for installation drive ... "
  189. # === Set default dest card to NON BOOT if exists ===
  190. DEST_CARD=${CARD1}
  191. DEST_EMMC=${CARD1_EMMC}
  192. if [ "${NUMCARDS}" = "2" ]; then
  193. DEST_CARD=${CARD2}
  194. DEST_EMMC=${CARD2_EMMC}
  195. fi
  196. _instfound="no"
  197. #----------------------------------------------------
  198. for src_drive in a b c
  199. do
  200. for src_part in 1 2 3 4
  201. do
  202. check_source "/dev/sd${src_drive}${src_part}"
  203. [ "${_instfound}" = "yes" ] && break
  204. done
  205. [ "${_instfound}" = "yes" ] && break
  206. done
  207. if [ "${_instfound}" = "no" ]; then
  208. printf " \033[33m\033[1mNOT FOUND, aborted\033[22m\033[37m\n"
  209. exit_script
  210. fi
  211. #----------------------------------------------------
  212. print_header
  213. printf " \033[33mInstallation sources found on \033[1msd%s%s\033[22m for:\033[32m\n" "${src_drive}${src_part}"
  214. print_header
  215. check_install_sources
  216. if [ $_inst_no_ -eq 0 ]; then
  217. printf " \033[33m\033[1mNOTHING TO INSTALL\033[22m\033[37m\n"
  218. exit_script
  219. fi
  220. #=================================================
  221. #=================================================
  222. if [ ! "${O_BOARD}" = "XU" ]; then
  223. part_start=65536 # RESERVE 32M AT CARD START
  224. else
  225. part_start=8192 #131072 # RESERVE 64MB AT CARD START
  226. fi
  227. PARTSIZE_INC=128
  228. export CARD_SIZE=8000
  229. export source_mount="/mnt"
  230. rm /mnt/install.log > /dev/null 2>&1
  231. log_file="/mnt/install.log"
  232. #log_file="ls/dev/null"
  233. #---------------------------------------------------------------------------------
  234. # Detect and set installation card size, leave 32M at end unused
  235. set_cardsize() {
  236. _card_sectno=`fdisk -l ${DEST_CARD} | grep "Disk ${DEST_CARD}" | awk '{print $7}'`
  237. CARD_SIZE=$(( ( $_card_sectno - $part_start - 65536 ) / 2048))
  238. }
  239. #---------------------------------------------------------------------------------
  240. #--------------------------------------------------------------------------------------------------------
  241. # Set linux or userdata partition size to fill card size
  242. set_auto_partsize() {
  243. LINUX_SIZE=$(( $CARD_SIZE - $USERDATA_SIZE - $SYSTEM_SIZE - $DATA_SIZE -$CACHE_SIZE - $OELEC_SIZE))
  244. if [ "${LINUX_SIZE}" -lt "${LINUX_MINSIZE}" ]; then
  245. LINUX_SIZE=${LINUX_MINSIZE}
  246. return 1
  247. else
  248. return 0
  249. fi
  250. }
  251. #--------------------------------------------------------------------------------------------------------
  252. #---------------------------------------------------------------------------------------------------------------------------
  253. print_settings() {
  254. set_auto_partsize
  255. printf " Install:"
  256. if [ "${INST_LINUX}" = "yes" ]; then
  257. printf " \033[36mJeedom\033[37m from "
  258. if [ "${L_FROMDIR}" = "yes" ]; then
  259. printf "backup"
  260. else
  261. printf "image"
  262. fi
  263. fi
  264. printf "\033[37m\n"
  265. printf " Install to: \033[36m%s Card (%s)\033[37m (%sM)\033[37m\n\n" "${DEST_EMMC}" "${DEST_CARD}" "${CARD_SIZE}"
  266. printf " Card size: \033[36m%sM\033[37m\n" "${CARD_SIZE}"
  267. printf " userdata partition size: \033[36m%sM\033[37m\n" "${USERDATA_SIZE}"
  268. printf " system partition size: \033[36m%sM\033[37m\n" "${SYSTEM_SIZE}"
  269. printf " data partition size: \033[36m%sM\033[37m\n" "${DATA_SIZE}"
  270. printf " cache partition size: \033[36m%sM\033[37m\n" "${CACHE_SIZE}"
  271. printf " %s partition size: \033[36m%sM\033[37m\n" "${_part6_dlabel}" "${OELEC_SIZE}"
  272. printf " linux partition size: \033[36m%sM\033[37m\n" "${LINUX_SIZE}"
  273. if [ "${INST_LINUX}" = "yes" ]; then
  274. printf " linux file system type: \033[36m%s\033[37m\n" "${LINUX_FSTYPE}"
  275. [ "${O_BOARD}" = "C2" ] && printf " install multiboot kernel: \033[36m%s\033[37m\n" "${_inst_mbkernel}"
  276. fi
  277. printf "\033[36m\n"
  278. [ "${NUMCARDS}" = "2" ] && printf " \033[32m\033[1m1\033[22m Change installation \033[1mcard\033[22m\033[36m\n"
  279. printf " \033[32m\033[1m2\033[22m Change \033[1muserdata\033[22m partition size\033[36m\n"
  280. printf " \033[32m\033[1m3\033[22m Change \033[1msystem\033[22m partition size\033[36m\n"
  281. printf " \033[32m\033[1m4\033[22m Change \033[1mdata\033[22m partition size\033[36m\n"
  282. printf " \033[32m\033[1m5\033[22m Change \033[1mcache\033[22m partition size\033[36m\n"
  283. printf " \033[32m\033[1m6\033[22m Change \033[1m%s\033[22m partition size\033[36m\n" "${_part6_dlabel}"
  284. if [ "${INST_LINUX}" = "yes" ]; then
  285. printf " \033[32m\033[1mt\033[22m Change Linux \033[1mfile system type\033[22m\033[36m\n"
  286. if [ "${O_BOARD}" = "C2" ]; then
  287. if [ "${_inst_mbkernel}" = "yes" ]; then
  288. printf " \033[32m\033[1mM\033[22m Install \033[1moriginal Linux kernel\033[22m\033[36m\n"
  289. else
  290. printf " \033[32m\033[1mM\033[22m Install \033[1mmultiboot Linux kernel\033[22m\033[36m\n"
  291. fi
  292. fi
  293. fi
  294. printf "\n \033[35m\033[1mI\033[22m Start installation\033[36m\n"
  295. printf " \033[33m\033[1mE\033[22m EXIT\033[37m\n\n"
  296. }
  297. #---------------------------------------------------------------------------------------------------------------------------
  298. #---- Select destination card -------------------------------------------------------------------------
  299. set_dest() {
  300. printf " Press \033[35m+\033[37m key to change installation card, \033[35m9\033[37m to select\n\n"
  301. _wait_delay=30
  302. while [ $_wait_delay -gt 0 ]; do
  303. printf " Install to: \033[36m%s Card (%s)\033[37m \r" "${DEST_EMMC}" "${DEST_CARD}"
  304. if read -n 1 -t 1 -s A; then
  305. _wait_delay=30
  306. if [ "${A}" = "+" ]; then
  307. if [ "${NUMCARDS}" = "2" ]; then
  308. if [ "${DEST_CARD}" = "${CARD1}" ]; then
  309. DEST_CARD=${CARD2}
  310. DEST_EMMC=${CARD2_EMMC}
  311. elif [ "${DEST_CARD}" = "${CARD2}" ]; then
  312. DEST_CARD=${CARD1}
  313. DEST_EMMC=${CARD1_EMMC}
  314. fi
  315. elif [ ! "${O_BOARD}" = "XU" ]; then
  316. if [ "${DEST_EMMC}" = "SD" ]; then
  317. DEST_EMMC="EMMC"
  318. else
  319. DEST_EMMC="SD"
  320. fi
  321. fi
  322. elif [ "${A}" = "9" ]; then
  323. set_cardsize
  324. break
  325. fi
  326. else
  327. let _wait_delay=_wait_delay-1
  328. fi
  329. printf "\r"
  330. done
  331. }
  332. #-----------------------------------------------------------------------------
  333. #----------------------------------------------------------------------------------------------------------------------------
  334. set_systemsize() {
  335. printf " Press \033[35m+\033[37m|\033[35m-\033[37m key to change system partition size, \033[35m9\033[37m to select\n\n"
  336. _wait_delay=30
  337. while [ $_wait_delay -gt 0 ]; do
  338. printf " system partition size: \033[36m%sM\033[37m \r" "${SYSTEM_SIZE}"
  339. if read -n 1 -t 1 -s A; then
  340. _wait_delay=30
  341. if [ "${A}" = "+" ]; then
  342. let SYSTEM_SIZE=SYSTEM_SIZE+PARTSIZE_INC
  343. [ ${SYSTEM_SIZE} -eq 136 ] && SYSTEM_SIZE=$PARTSIZE_INC
  344. set_auto_partsize
  345. if [ $? -ne 0 ]; then
  346. let SYSTEM_SIZE=SYSTEM_SIZE-PARTSIZE_INC
  347. set_auto_partsize
  348. fi
  349. elif [ "${A}" = "-" ]; then
  350. let SYSTEM_SIZE=SYSTEM_SIZE-${PARTSIZE_INC}
  351. [ $SYSTEM_SIZE -lt $SYSTEM_MINSIZE ] && SYSTEM_SIZE=$SYSTEM_MINSIZE
  352. set_auto_partsize
  353. elif [ "${A}" = "9" ]; then
  354. break
  355. fi
  356. else
  357. let _wait_delay=_wait_delay-1
  358. fi
  359. printf "\r"
  360. done
  361. }
  362. #----------------------------------------------------------------------------------------------------------------------------
  363. #--------------------------------------------------------------------------------------------------------------------------
  364. set_datasize() {
  365. printf " Press \033[35m+\033[37m|\033[35m-\033[37m key to change data partition size, \033[35m9\033[37m to select\n\n"
  366. _wait_delay=30
  367. while [ $_wait_delay -gt 0 ]; do
  368. printf " data partition size: \033[36m%sM\033[37m \r" "${DATA_SIZE}"
  369. if read -n 1 -t 1 -s A; then
  370. _wait_delay=30
  371. if [ "${A}" = "+" ]; then
  372. let DATA_SIZE=DATA_SIZE+PARTSIZE_INC
  373. [ ${DATA_SIZE} -eq 136 ] && DATA_SIZE=$PARTSIZE_INC
  374. set_auto_partsize
  375. if [ $? -ne 0 ]; then
  376. let DATA_SIZE=DATA_SIZE-PARTSIZE_INC
  377. set_auto_partsize
  378. fi
  379. elif [ "${A}" = "-" ]; then
  380. let DATA_SIZE=DATA_SIZE-PARTSIZE_INC
  381. [ $DATA_SIZE -lt $DATA_MINSIZE ] && DATA_SIZE=$DATA_MINSIZE
  382. set_auto_partsize
  383. elif [ "${A}" = "9" ]; then
  384. break
  385. fi
  386. else
  387. let _wait_delay=_wait_delay-1
  388. fi
  389. printf "\r"
  390. done
  391. }
  392. #--------------------------------------------------------------------------------------------------------------------------
  393. #------------------------------------------------------------------------------------------------------------------------------
  394. set_userdatasize() {
  395. printf " Press \033[35m+\033[37m|\033[35m-\033[37m key to change userdata partition size, \033[35m9\033[37m to select\n\n"
  396. _wait_delay=30
  397. while [ $_wait_delay -gt 0 ]; do
  398. printf " userdata partition size: \033[36m%sM\033[37m \r" "${USERDATA_SIZE}"
  399. if read -n 1 -t 1 -s A; then
  400. _wait_delay=30
  401. if [ "${A}" = "+" ]; then
  402. let USERDATA_SIZE=USERDATA_SIZE+PARTSIZE_INC
  403. [ ${USERDATA_SIZE} -eq 136 ] && USERDATA_SIZE=$PARTSIZE_INC
  404. set_auto_partsize
  405. if [ $? -ne 0 ]; then
  406. let USERDATA_SIZE=USERDATA_SIZE-PARTSIZE_INC
  407. set_auto_partsize
  408. fi
  409. elif [ "${A}" = "-" ]; then
  410. let USERDATA_SIZE=USERDATA_SIZE-PARTSIZE_INC
  411. [ $USERDATA_SIZE -lt $USERDATA_MINSIZE ] && USERDATA_SIZE=$USERDATA_MINSIZE
  412. set_auto_partsize
  413. elif [ "${A}" = "9" ]; then
  414. break
  415. fi
  416. else
  417. let _wait_delay=_wait_delay-1
  418. fi
  419. printf "\r"
  420. done
  421. }
  422. #------------------------------------------------------------------------------------------------------------------------------
  423. #------------------------------------------------------------------------------------------------------------------------------
  424. set_cachesize() {
  425. printf " Press \033[35m+\033[37m|\033[35m-\033[37m key to change cache partition size, \033[35m9\033[37m to select\n\n"
  426. _wait_delay=30
  427. while [ $_wait_delay -gt 0 ]; do
  428. printf " cache partition size: \033[36m%sM\033[37m \r" "${CACHE_SIZE}"
  429. if read -n 1 -t 1 -s A; then
  430. _wait_delay=30
  431. if [ "${A}" = "+" ]; then
  432. let CACHE_SIZE=CACHE_SIZE+PARTSIZE_INC
  433. [ ${CACHE_SIZE} -eq 136 ] && CACHE_SIZE=$PARTSIZE_INC
  434. set_auto_partsize
  435. if [ $? -ne 0 ]; then
  436. let CACHE_SIZE=CACHE_SIZE-PARTSIZE_INC
  437. set_auto_partsize
  438. fi
  439. elif [ "${A}" = "-" ]; then
  440. let CACHE_SIZE=CACHE_SIZE-PARTSIZE_INC
  441. [ ${CACHE_SIZE} -lt $CACHE_MINSIZE ] && CACHE_SIZE=$CACHE_MINSIZE
  442. set_auto_partsize
  443. elif [ "${A}" = "9" ]; then
  444. break
  445. fi
  446. else
  447. let _wait_delay=_wait_delay-1
  448. fi
  449. printf "\r"
  450. done
  451. }
  452. #------------------------------------------------------------------------------------------------------------------------------
  453. #------------------------------------------------------------------------------------------------
  454. create_partitions_full() {
  455. # == MULTI BOOT PARTITION LAYOUT ===
  456. # userdata
  457. # android system
  458. # android cache
  459. # extended
  460. # android data
  461. # oelec/linux2
  462. # linux
  463. _userdata_size=$(( $USERDATA_SIZE * 2048 ))
  464. _system_size=$(( $SYSTEM_SIZE * 2048 ))
  465. _cache_size=$(( $CACHE_SIZE * 2048 ))
  466. userpart_end=$(( $_userdata_size + $part_start - 1 ))
  467. syspart_start=$(( $userpart_end + 1))
  468. syspart_end=$(( $syspart_start + $_system_size - 1 ))
  469. cachepart_start=$(( $syspart_end + 1 ))
  470. cachepart_end=$(( $cachepart_start + $_cache_size - 1 ))
  471. extpart_start=$(( $cachepart_end + 1))
  472. dd if=/dev/zero of=${DEST_CARD} bs=512 seek=${extpart_start} count=131072 >> ${log_file} 2>&1
  473. sync
  474. echo "n
  475. p
  476. 1
  477. $part_start
  478. $userpart_end
  479. t
  480. c
  481. n
  482. p
  483. 2
  484. $syspart_start
  485. $syspart_end
  486. n
  487. p
  488. 3
  489. $cachepart_start
  490. $cachepart_end
  491. n
  492. e
  493. $extpart_start
  494. n
  495. +${DATA_SIZE}M
  496. n
  497. +${OELEC_SIZE}M
  498. n
  499. +${LINUX_SIZE}M
  500. w" | fdisk ${DEST_CARD} >> ${log_file} 2>&1
  501. if [ $? -ne 0 ]; then
  502. printf " fdisk ERROR "
  503. return 1
  504. fi
  505. return 0
  506. }
  507. #------------------------------------------------------------------------------------------------
  508. #----------------------------------------------------------------------------------------
  509. # Partition and format installation card
  510. prepare_card() {
  511. echo "==== PREPARE CARD ====" >> ${log_file}
  512. printf " Partitioning %s card " "${DEST_EMMC}"
  513. # ---- Erase card -------------------------------------------------------
  514. /bin/dd if=/dev/zero of=${DEST_CARD} bs=512 count=${part_start} >> ${log_file} 2>&1
  515. sync
  516. sleep 1
  517. /bin/partprobe -s ${DEST_CARD} >> ${log_file} 2>&1
  518. sleep 1
  519. #---- Make new partition table --------------------------
  520. echo -e "o\nw" | /bin/fdisk ${DEST_CARD} >> ${log_file} 2>&1
  521. sync
  522. sleep 1
  523. /bin/partprobe -s ${DEST_CARD} >> ${log_file} 2>&1
  524. if [ $? -ne 0 ]; then
  525. echo " ERROR creating partition table."
  526. return 1
  527. fi
  528. sleep 1
  529. create_partitions_full
  530. [ $? -ne 0 ] && return 1
  531. sleep 2
  532. /bin/partprobe -s ${DEST_CARD} >> ${log_file} 2>&1
  533. if [ $? -ne 0 ]; then
  534. echo " ERROR creating partitions."
  535. return 1
  536. fi
  537. sleep 1
  538. sync
  539. echo "OK"
  540. sleep 1
  541. # *** FORMATING partitions ***************************************
  542. printf " Formating partitions... "
  543. # === USERDATA/BOOT =======================================================
  544. printf "\033[36muserdata\033[37m... "
  545. dd if=/dev/zero of=${DEST_CARD}p1 bs=512 count=2048 >> ${log_file} 2>&1
  546. if [ $? -ne 0 ]; then
  547. echo "ERROR"
  548. return 1
  549. fi
  550. sync
  551. mkfs -t vfat -F 32 -n ${label_pref}userdata ${DEST_CARD}p1 >> ${log_file} 2>&1
  552. if [ $? -ne 0 ]; then
  553. echo "mkfs ERROR"
  554. return 1
  555. fi
  556. sync
  557. sleep 1
  558. if [ "${INST_LINUX}" = "yes" ]; then
  559. # === linux =========================================================================
  560. printf "\033[36mJEEDOM\033[37m... "
  561. dd if=/dev/zero of=${DEST_CARD}p7 bs=512 count=2048 >> ${log_file} 2>&1
  562. if [ $? -ne 0 ]; then
  563. echo "ERROR"
  564. return 1
  565. fi
  566. sync
  567. if [ "${LINUX_FSTYPE}" = "btrfs" ] ; then
  568. mkfs.btrfs -f -L ${label_pref}linux ${DEST_CARD}p7 >> ${log_file} 2>&1
  569. else
  570. mkfs.ext4 -L ${label_pref}linux ${DEST_CARD}p7 >> ${log_file} 2>&1
  571. fi
  572. if [ $? -ne 0 ]; then
  573. echo "mkfs ERROR"
  574. return 1
  575. fi
  576. sync
  577. sleep 1
  578. fi
  579. /bin/partprobe -s ${DEST_CARD} >> ${log_file} 2>&1
  580. echo "OK"
  581. return 0
  582. }
  583. #----------------------------------------------------------------------------------------
  584. #----------------------------------------------------------------------------
  585. # copy Odroid boot files to installation card
  586. install_boot_c2() {
  587. echo "==== INSTALL BOOT ====" >> ${log_file}
  588. printf " Installing Odroid boot files ... "
  589. dd if=/multi/bl1.bin of=${DEST_CARD} bs=1 count=442 >> ${log_file} 2>&1
  590. if [ $? -ne 0 ]; then
  591. echo "ERROR installing bl1.bin."
  592. return 1
  593. fi
  594. dd if=/multi/bl1.bin of=${DEST_CARD} bs=512 skip=1 seek=1 >> ${log_file} 2>&1
  595. if [ $? -ne 0 ]; then
  596. echo "ERROR installing bl1.bin."
  597. return 1
  598. fi
  599. sync
  600. dd if=/multi/u-boot.bin of=${DEST_CARD} bs=512 seek=97 >> ${log_file} 2>&1
  601. if [ $? -ne 0 ]; then
  602. echo "ERROR installing u-boot.bin."
  603. return 1
  604. fi
  605. sync
  606. echo "OK"
  607. sleep 1
  608. }
  609. #----------------------------------------------------------------------------
  610. #----------------------------------------------------------------------------
  611. # copy Odroid boot files to installation card
  612. install_boot_c1() {
  613. echo "==== INSTALL BOOT ====" >> ${log_file}
  614. printf " Installing Odroid boot files ... "
  615. dd if=/multi/bl1.bin of=${DEST_CARD} bs=1 count=442 >> ${log_file} 2>&1
  616. if [ $? -ne 0 ]; then
  617. echo "ERROR installing bl1.bin."
  618. return 1
  619. fi
  620. dd if=/multi/bl1.bin of=${DEST_CARD} bs=512 skip=1 seek=1 >> ${log_file} 2>&1
  621. if [ $? -ne 0 ]; then
  622. echo "ERROR installing bl1.bin."
  623. return 1
  624. fi
  625. sync
  626. dd if=/multi/u-boot.bin of=${DEST_CARD} bs=512 seek=64 >> ${log_file} 2>&1
  627. if [ $? -ne 0 ]; then
  628. echo "ERROR installing u-boot.bin."
  629. return 1
  630. fi
  631. sync
  632. echo "OK"
  633. sleep 1
  634. }
  635. #----------------------------------------------------------------------------
  636. #----------------------------------------------------------------------------
  637. # copy Odroid boot files to installation card
  638. install_boot_xu() {
  639. if [ "${label_pref}" = "sd" ]; then
  640. printf " Installing Odroid boot files to SD Card ... "
  641. dd if=/multi/bl1.bin of=${DEST_CARD} bs=512 seek=1 >> ${log_file} 2>&1
  642. if [ $? -ne 0 ]; then
  643. echo "ERROR installing bl1.bin."
  644. return 1
  645. fi
  646. sync
  647. dd if=/multi/bl2.bin of=${DEST_CARD} seek=31 >> ${log_file} 2>&1
  648. if [ $? -ne 0 ]; then
  649. echo "ERROR installing bl2.bin."
  650. return 1
  651. fi
  652. sync
  653. dd if=/multi/u-boot.bin of=${DEST_CARD} seek=63 >> ${log_file} 2>&1
  654. if [ $? -ne 0 ]; then
  655. echo "ERROR installing u-boot.bin."
  656. return 1
  657. fi
  658. sync
  659. dd if=/multi/tzsw.bin of=${DEST_CARD} seek=2111 >> ${log_file} 2>&1
  660. if [ $? -ne 0 ]; then
  661. echo "ERROR installing tzsw.bin."
  662. return 1
  663. fi
  664. sync
  665. echo "OK"
  666. else
  667. # UNLOCK boot0
  668. _dest_card_=$(basename ${DEST_CARD})
  669. printf " Installing Odroid boot files to EMMC Card (%s [%s])... " "${DEST_CARD}" "${_dest_card_}"
  670. if [ -e /sys/block/${_dest_card_}boot0/force_ro ]; then
  671. echo 0 > /sys/block/${_dest_card_}boot0/force_ro
  672. if [ $? -ne 0 ]; then
  673. echo "ERROR enabling boot0."
  674. return 1
  675. fi
  676. else
  677. echo "ERROR: boot0 not found."
  678. return 1
  679. fi
  680. dd if=/dev/zero of=${DEST_CARD}boot0 count=8192 >> ${log_file} 2>&1
  681. if [ $? -ne 0 ]; then
  682. printf "WARNING: error erasing boot0 "
  683. fi
  684. sync
  685. dd if=/multi/bl1.bin of=${DEST_CARD}boot0 >> ${log_file} 2>&1
  686. if [ $? -ne 0 ]; then
  687. echo "ERROR installing bl1.bin."
  688. return 1
  689. fi
  690. sync
  691. dd if=/multi/bl2.bin of=${DEST_CARD}boot0 seek=30 >> ${log_file} 2>&1
  692. if [ $? -ne 0 ]; then
  693. echo "ERROR installing bl2.bin."
  694. return 1
  695. fi
  696. sync
  697. dd if=/multi/u-boot.bin of=${DEST_CARD}boot0 seek=62 >> ${log_file} 2>&1
  698. if [ $? -ne 0 ]; then
  699. echo "ERROR installing u-boot.bin."
  700. return 1
  701. fi
  702. sync
  703. dd if=/multi/tzsw.bin of=${DEST_CARD}boot0 seek=2110 >> ${log_file} 2>&1
  704. if [ $? -ne 0 ]; then
  705. echo "ERROR installing tzsw.bin."
  706. return 1
  707. fi
  708. sync
  709. echo 1 > /sys/block/${_dest_card_}boot0/force_ro
  710. echo "OK"
  711. fi
  712. sleep 1
  713. }
  714. #----------------------------------------------------------------------------
  715. #---------------------------------------------------------------------------------------------------------
  716. install_multi_sel() {
  717. echo "==== INSTALL MULTIBOOT SUPPORT ====" >> ${log_file}
  718. umount /mnt2 >> ${log_file} 2>&1
  719. # Update userdata partition for multiboot
  720. /bin/mountx -t vfat ${DEST_CARD}p1 /mnt2 >> ${log_file} 2>&1
  721. if [ $? -ne 0 ]; then
  722. echo " ERROR mounting boot partition."
  723. return 1
  724. fi
  725. sleep 1
  726. mkdir /mnt2/multiboot >> ${log_file} 2>&1
  727. if [ ! -d /multiboot ]; then
  728. echo " ERROR: missing multiboot directory."
  729. return 1
  730. fi
  731. if [ -d /multiboot/mb_kernel ]; then
  732. mkdir /mnt2/multiboot/mb_kernel >> ${log_file} 2>&1
  733. cp -f /multiboot/mb_kernel/* /mnt2/multiboot/mb_kernel >> ${log_file} 2>&1
  734. fi
  735. cp /multiboot/boot.ini.multi /mnt2/multiboot >> ${log_file} 2>&1
  736. [ $? -ne 0 ] && return 1
  737. if [ "${O_BOARD}" = "XU" ]; then
  738. cp /multiboot/boot.scr.multi /mnt2/multiboot >> ${log_file} 2>&1
  739. [ $? -ne 0 ] && return 1
  740. cp /mnt2/multiboot/boot.scr.multi /mnt2/boot.scr >> ${log_file} 2>&1
  741. [ $? -ne 0 ] && return 1
  742. else
  743. cp /mnt2/multiboot/boot.ini.multi /mnt2/boot.ini >> ${log_file} 2>&1
  744. [ $? -ne 0 ] && return 1
  745. if [ "${label_pref}" = "em" ]; then
  746. sed -i "s/setenv CARD_TYPE SD/setenv CARD_TYPE EMMC/g" /mnt2/multiboot/boot.ini.multi
  747. fi
  748. fi
  749. cp /multiboot/${ODROID_IMAGE}.multi /mnt2/multiboot >> ${log_file} 2>&1
  750. [ $? -ne 0 ] && return 1
  751. cp /multiboot/uInitrd.multi /mnt2/multiboot >> ${log_file} 2>&1
  752. [ $? -ne 0 ] && return 1
  753. cp /multiboot/*.dtb.multi /mnt2/multiboot >> ${log_file} 2>&1
  754. [ $? -ne 0 ] && return 1
  755. #chmod -wx /mnt2/multiboot/${ODROID_IMAGE}.multi >> ${log_file} 2>&1
  756. #chmod -wx /mnt2/multiboot/uInitrd.multi >> ${log_file} 2>&1
  757. #chmod -wx /mnt2/multiboot/*.dtb.multi >> ${log_file} 2>&1
  758. if [ "${label_pref}" = "sd" ]; then
  759. touch /mnt2/THIS_IS_SDCARD >> ${log_file} 2>&1
  760. [ -f /mnt2/THIS_IS_EMMC ] && rm /mnt2/THIS_IS_EMMC >> ${log_file} 2>&1
  761. else
  762. touch /mnt2/THIS_IS_EMMC >> ${log_file} 2>&1
  763. [ -f /mnt2/THIS_IS_SDCARD ] && rm /mnt2/THIS_IS_SDCARD >> ${log_file} 2>&1
  764. fi
  765. return 0
  766. }
  767. #---------------------------------------------------------------------------------------------------------
  768. #-------------------------------------------------------------------------
  769. # Calculate partitions offsets and sizes of the linux installation image
  770. get_lin_partstruct() {
  771. echo "==== CHECK JEEDOM IMAGE ====" >> ${log_file}
  772. printf " Checking Linux image ... "
  773. local re='^[0-9]+$'
  774. _card_sectno=`fdisk -l ${1} | grep "Disk ${1}" | awk '{print $7}'`
  775. #printf "%s " "${_card_sectno}"
  776. if ! [[ ${_card_sectno} =~ ${re} ]]; then
  777. _card_sectno=`fdisk -l ${1} | grep total | awk '{print $8}'`
  778. fi
  779. if ! [[ ${_card_sectno} =~ ${re} ]]; then
  780. echo "ERROR: sectNo?"
  781. return 1
  782. fi
  783. #_card_end=$(( $_card_sectno - 1024))
  784. _card_sectsize=`fdisk -l ${1} | grep "Sector size" | awk '{print $4}'`
  785. #printf "%s " "${_card_sectsize}"
  786. if ! [[ ${_card_sectsize} =~ ${re} ]]; then
  787. echo "ERROR: sectSize?"
  788. return 1
  789. fi
  790. # get boot partition offset
  791. _partstart=`fdisk -l ${1} | grep ${1}1 | awk '{print $2}'`
  792. #printf "%s " "${_partstart}"
  793. if [ "${_partstart}" = "*" ]; then
  794. _partstart=`fdisk -l ${1} | grep ${1}1 | awk '{print $3}'`
  795. printf "[%s] " "${_partstart}"
  796. fi
  797. if ! [[ ${_partstart} =~ ${re} ]]; then
  798. echo "ERROR: FATpartStart?"
  799. return 1
  800. fi
  801. _fat_partstart=$(( $_partstart * $_card_sectsize ))
  802. # get linux partition offset
  803. _partstart=`fdisk -l ${1} | grep ${1}2 | awk '{print $2}'`
  804. #printf "%s " "${_partstart}"
  805. if [ "${_partstart}" = "*" ]; then
  806. _partstart=`fdisk -l ${1} | grep ${1}2 | awk '{print $3}'`
  807. #printf "[%s] " "${_partstart}"
  808. fi
  809. if ! [[ ${_partstart} =~ ${re} ]]; then
  810. echo "ERROR: LINpartStart?"
  811. return 1
  812. fi
  813. _linux_partstart=$(( $_partstart * $_card_sectsize ))
  814. #printf "(%s,%s) " "${_fat_partstart}" "${_linux_partstart}"
  815. echo "OK."
  816. return 0
  817. }
  818. #-------------------------------------------------------------------------
  819. #----------------------------------------------------------------------------------------------------------------------------
  820. prepare_linux_boot() {
  821. echo "==== PREPARE JEEDOM BOOT ====" >> ${log_file}
  822. # Prepare for multi boot
  823. if [ -d /mnt2/etc ]; then
  824. if [ -f /mnt2/etc/fstab ]; then
  825. # === Change fstab for multiboot ===
  826. # save original fstab
  827. cp /mnt2/etc/fstab /mnt2/etc/fstab.orig >> ${log_file} 2>&1
  828. # delete original "/" & "media/boot" mount
  829. sed -i '/\/dev\/mmcblk/d' /mnt2/etc/fstab >> ${log_file} 2>&1
  830. sed -i '/UUID=/d' /mnt2/etc/fstab >> ${log_file} 2>&1
  831. sed -i '/LABEL=/d' /mnt2/etc/fstab >> ${log_file} 2>&1
  832. # on DietPi, do not use ramdisk
  833. sed -i '/DietPi/d' /mnt2/etc/fstab >> ${log_file} 2>&1
  834. # save the rest
  835. mv /mnt2/etc/fstab /mnt2/etc/_fstab >> ${log_file} 2>&1
  836. if [ "${LINUX_FSTYPE}" = "btrfs" ] ; then
  837. echo "LABEL=${label_pref}linux / btrfs noatime,nodiratime,compress=lzo 0 1" > /mnt2/etc/fstab
  838. else
  839. echo "LABEL=${label_pref}linux / ext4 errors=remount-ro,noatime,nodiratime 0 1" > /mnt2/etc/fstab
  840. fi
  841. echo "LABEL=${label_pref}userdata /media/boot vfat rw,user,sync,exec,dev,suid,uid=1000,gid=1000,dmask=000,fmask=111,iocharset=utf8 0 0" >> /mnt2/etc/fstab
  842. # append saved fstab
  843. cat /mnt2/etc/_fstab >> /mnt2/etc/fstab
  844. rm /mnt2/etc/_fstab >> ${log_file} 2>&1
  845. else
  846. echo "ERROR: \"etc/fstab\" not found!"
  847. return 1
  848. fi
  849. if [ -f /mnt2/etc/rc.local ]; then
  850. # === Change rc.local to prevent partition resize ===
  851. cp /mnt2/etc/rc.local /mnt2/etc/rc.local.orig >> ${log_file} 2>&1
  852. sed -i '/first-boot/d' /mnt2/etc/rc.local >> ${log_file} 2>&1
  853. sed -i '/aafirstboot/d' /mnt2/etc/rc.local >> ${log_file} 2>&1
  854. sed -i '/resizefs/d' /mnt2/etc/rc.local >> ${log_file} 2>&1
  855. sed -i '/^.*exit/d' /mnt2/etc/rc.local >> ${log_file} 2>&1
  856. if [ -f /mnt2/aafirstboot ]; then
  857. # on original odroid Linux
  858. echo "" >> /mnt2/etc/rc.local
  859. echo "if [ -f /.first_boot ]; then" >> /mnt2/etc/rc.local
  860. echo " rm -f /.first_boot" >> /mnt2/etc/rc.local
  861. echo " [ ! -f /etc/ssh/ssh_host_rsa_key ] && dpkg-reconfigure openssh-server" >> /mnt2/etc/rc.local
  862. echo "fi" >> /mnt2/etc/rc.local
  863. fi
  864. echo "exit 0" >> /mnt2/etc/rc.local
  865. chmod 0755 /mnt2/etc/rc.local
  866. rm -f /mnt2/aafirstboot >> ${log_file} 2>&1
  867. rm -f /mnt2/.resizefs >> ${log_file} 2>&1
  868. fi
  869. else
  870. echo "ERROR: \"etc\" directory not found!"
  871. return 1
  872. fi
  873. if [ -d /mnt2/media/odroid ]; then
  874. chown 1000:1000 /mnt2/media/odroid >> ${log_file} 2>&1
  875. chmod 0666 /mnt2/media/odroid >> ${log_file} 2>&1
  876. fi
  877. if [ -f /mnt2/usr/local/bin/fs_resize_warning ]; then
  878. rm -f /mnt2/usr/local/bin/fs_resize_warning >> ${log_file} 2>&1
  879. fi
  880. mkdir /mnt2/media/boot >> ${log_file} 2>&1
  881. chown 1000:1000 /mnt2/media/boot >> ${log_file} 2>&1
  882. chmod 0666 /mnt2/media/boot >> ${log_file} 2>&1
  883. return 0
  884. }
  885. #----------------------------------------------------------------------------------------------------------------------------
  886. #----------------------------------------------------------------------------------------------------------
  887. install_linux() {
  888. echo "==== INSTALL JEEDOM ====" >> ${log_file}
  889. local lin_fromdir="no"
  890. if [ "${1}" = "C2_backup/linux/jeedom.img" ] && [ "${L_FROMDIR}" = "yes" ]; then
  891. lin_fromdir="yes"
  892. fi
  893. printf "\n \033[33mInstalling \033[1mJEEDOM\033[22m\033[37m\n"
  894. if [ "${lin_fromdir}" = "no" ]; then
  895. get_lin_partstruct "/mnt/${1}"
  896. if [ $? -ne 0 ]; then
  897. printf " \033[35mWRONG Linux image partition structure!\033[37m\n"
  898. return 1
  899. fi
  900. sleep 1
  901. fi
  902. mkdir /mnt1 >> ${log_file} 2>&1
  903. mkdir /mnt2 >> ${log_file} 2>&1
  904. umount /mnt2 >> ${log_file} 2>&1
  905. umount /mnt1 >> ${log_file} 2>&1
  906. local _linpart="p7"
  907. local _linsufix=""
  908. # === Copy Linux partition ===
  909. printf " \033[35mcopying JEEDOM image can take more than 15 min to complete on eMMC!\033[37m\n"
  910. if [ "${lin_fromdir}" = "no" ]; then
  911. printf " Installing JEEDOM root file system from image ... "
  912. /bin/mountx -t ext4 -o ro,loop,offset=${_linux_partstart} ${source_mount}/${1} /mnt1 >> ${log_file} 2>&1
  913. if [ $? -ne 0 ]; then
  914. echo " ERROR mounting JEEDOM source image."
  915. return 1
  916. fi
  917. else
  918. printf " Installing JEEDOM root file system from backup ... "
  919. /bin/mountx -t ext4 ${source_mount}/${BKP_PREFIX}_backup/linux${_linsufix}/jeedom.img /mnt1 >> ${log_file} 2>&1
  920. if [ $? -ne 0 ]; then
  921. echo " ERROR mounting JEEDOM backup image."
  922. return 1
  923. fi
  924. fi
  925. if [ "${LINUX_FSTYPE}" = "btrfs" ] ; then
  926. /bin/mountx -t btrfs -o compress-force=lzo ${DEST_CARD}${_linpart} /mnt2 >> ${log_file} 2>&1
  927. else
  928. /bin/mountx -t ext4 ${DEST_CARD}${_linpart} /mnt2 >> ${log_file} 2>&1
  929. fi
  930. if [ $? -ne 0 ]; then
  931. umount /mnt1 >> ${log_file} 2>&1
  932. echo " ERROR mounting Linux destination partition."
  933. return 1
  934. fi
  935. printf "copying... "
  936. rsync -r -t -p -o -g -x -l -H -D --numeric-ids -s --stats /mnt1/ /mnt2/ >> ${log_file} 2>&1
  937. if [ $? -ne 0 ]; then
  938. umount /mnt1 >> ${log_file} 2>&1
  939. umount /mnt2 >> ${log_file} 2>&1
  940. echo "ERROR copying JEEDOM."
  941. return 1
  942. fi
  943. sync
  944. printf "preparing... "
  945. prepare_linux_boot
  946. if [ $? -ne 0 ]; then
  947. umount /mnt1 >> ${log_file} 2>&1
  948. umount /mnt2 >> ${log_file} 2>&1
  949. return 1
  950. fi
  951. if [ "${_inst_mbkernel}" = "yes" ]; then
  952. if [ -f /multiboot/mb_kernel/lib.tar.gz ]; then
  953. printf "[prepare multiboot kernel: "
  954. cd /mnt2
  955. tar -tf /multiboot/mb_kernel/lib.tar.gz --warning=no-timestamp > /dev/null 2>&1
  956. if [ $? -eq 0 ]; then
  957. tar -xf /multiboot/mb_kernel/lib.tar.gz --same-owner --warning=no-timestamp >> ${log_file} 2>&1
  958. if [ $? -ne 0 ]; then
  959. echo "ERROR]"
  960. cd /
  961. return 1
  962. fi
  963. printf "ok] "
  964. else
  965. printf "cannot extract] "
  966. _inst_mbkernel="no"
  967. fi
  968. cd /
  969. else
  970. _inst_mbkernel="no"
  971. fi
  972. fi
  973. if [ ! "${O_BOARD}" = "XU" ] && [ -f /multi/linux ]; then
  974. cp /multi/linux /mnt2/usr/share/terminfo/l >> ${log_file} 2>&1
  975. echo "tput cnorm" >> /mnt2/root/.bashrc
  976. [ -d /mnt2/home/odroid ] && echo "tput cnorm" >> /mnt2/home/odroid/.bashrc
  977. fi
  978. cp /check_kernel /mnt2/bin >> ${log_file} 2>&1
  979. cp /check_u-boot /mnt2/bin >> ${log_file} 2>&1
  980. mkdir -p /mnt2/opt/multiboot >> ${log_file} 2>&1
  981. cp /multi/u-boot.bin /mnt2/opt/multiboot >> ${log_file} 2>&1
  982. # prevent installation/update of some packages
  983. [ ! -d /mnt2/etc/apt/preferences.d ] && mkdir -p /mnt2/etc/apt/preferences.d
  984. cat > /mnt2/etc/apt/preferences.d/odroid.pref << _EOF_
  985. Package: u-boot
  986. Pin: release *
  987. Pin-Priority: -100
  988. Package: bootini
  989. Pin: release *
  990. Pin-Priority: -100
  991. _EOF_
  992. #Package: linux-image-arm64-odroid-c2
  993. #Pin: release *
  994. #Pin-Priority: -100
  995. umount /mnt1 >> ${log_file} 2>&1
  996. umount /mnt2 >> ${log_file} 2>&1
  997. sleep 1
  998. echo "OK"
  999. # =====================================================
  1000. # === Update userdata partition for Linux multiboot ===
  1001. printf " Copying JEEDOM boot files ... "
  1002. local boot_src="/mnt1"
  1003. if [ "${lin_fromdir}" = "no" ]; then
  1004. /bin/mountx -t vfat -o ro,loop,offset=${_fat_partstart} ${source_mount}/${1} /mnt1
  1005. if [ $? -ne 0 ]; then
  1006. echo "ERROR mounting JEEDOM boot image."
  1007. return 1
  1008. fi
  1009. else
  1010. boot_src="${source_mount}/${BKP_PREFIX}_backup/linux${_linsufix}"
  1011. fi
  1012. /bin/mountx -t vfat ${DEST_CARD}p1 /mnt2 >> ${log_file} 2>&1
  1013. if [ $? -ne 0 ]; then
  1014. umount /mnt1 >> ${log_file} 2>&1
  1015. echo "ERROR mounting boot partition."
  1016. return 1
  1017. fi
  1018. sync
  1019. sleep 1
  1020. # Prepare boot.ini
  1021. local _dtbdir=""
  1022. if [ ! -f ${boot_src}/${ODROID_DTB} ]; then
  1023. # on Armbian dtb is in separate directory
  1024. [ -f ${boot_src}/dtb/${ODROID_DTB} ] && _dtbdir="dtb/"
  1025. fi
  1026. if [ -f ${boot_src}/${_dtbdir}${ODROID_DTB} ] && [ -f ${boot_src}/${ODROID_IMAGE} ] && [ -f ${boot_src}/uInitrd ]; then
  1027. mkdir /mnt2/multiboot >> ${log_file} 2>&1
  1028. cp /multi/boot.ini.linux${_linsufix} /mnt2/multiboot/boot.ini.linux${_linsufix}
  1029. sed -i "s/root=LABEL=XXlinux/root=LABEL=${label_pref}linux/g" /mnt2/multiboot/boot.ini.linux${_linsufix}
  1030. cp ${boot_src}/${_dtbdir}${ODROID_DTB} /mnt2/multiboot/${ODROID_DTB}.linux${_linsufix} >> ${log_file} 2>&1
  1031. cp ${boot_src}/${ODROID_IMAGE} /mnt2/multiboot/${ODROID_IMAGE}.linux${_linsufix} >> ${log_file} 2>&1
  1032. cp ${boot_src}/uInitrd /mnt2/multiboot/uInitrd.linux${_linsufix} >> ${log_file} 2>&1
  1033. if [ "${_inst_mbkernel}" = "yes" ]; then
  1034. if [ -f /multiboot/mb_kernel/${ODROID_DTB} ] && [ -f /multiboot/mb_kernel/${ODROID_IMAGE} ] && [ -f /multiboot/mb_kernel/uInitrd ]; then
  1035. printf "[Using multiboot kernel] "
  1036. cp -f /multiboot/mb_kernel/${ODROID_DTB} /mnt2/multiboot/${ODROID_DTB}.linux${_linsufix} >> ${log_file} 2>&1
  1037. cp -f /multiboot/mb_kernel/${ODROID_IMAGE} /mnt2/multiboot/${ODROID_IMAGE}.linux${_linsufix} >> ${log_file} 2>&1
  1038. cp -f /multiboot/mb_kernel/uInitrd /mnt2/multiboot/uInitrd.linux${_linsufix} >> ${log_file} 2>&1
  1039. fi
  1040. fi
  1041. else
  1042. echo "ERROR: not all Linux boot files found! "
  1043. umount /mnt1 >> ${log_file} 2>&1
  1044. umount /mnt2 >> ${log_file} 2>&1
  1045. return 1
  1046. fi
  1047. umount /mnt1 >> ${log_file} 2>&1
  1048. umount /mnt2 >> ${log_file} 2>&1
  1049. sleep 1
  1050. echo "OK"
  1051. }
  1052. #----------------------------------------------------------------------------------------------------------
  1053. #-----------------------------------------------------------------------------------------------------------------
  1054. check_inst() {
  1055. # INSTALLATION DRIVE IS MOUNTED ON /MNT
  1056. if [ "${INST_ANDROID}" != "yes" ] && [ "${INST_LINUX}" != "yes" ] && [ "${INST_OELEC}" != "yes" ]; then
  1057. printf " \033[33m\033[1mNOTHING TO INSTALL !\033[22m\033[37m\n"
  1058. printf " \033[33m\033[1mInstallation aborted.\033[22m\033[37m\n"
  1059. umount ${source_mount} > /dev/null 2>&1
  1060. exit_script
  1061. fi
  1062. }
  1063. #-----------------------------------------------------------------------------------------------------------------
  1064. # ====================================================================================================
  1065. # START
  1066. # ====================================================================================================
  1067. set_cardsize
  1068. print_header
  1069. check_inst
  1070. #----------------------------------------------------------------
  1071. if [ "${INST_LINUX}" = "yesa" ]; then
  1072. get_lin_partstruct "/mnt/linux.img"
  1073. if [ $? -ne 0 ]; then
  1074. echo " JEEDOM won't be installed!"
  1075. INST_LINUX="no"
  1076. check_install_sources
  1077. if [ $_inst_no_ -eq 0 ]; then
  1078. printf " \033[33m\033[1mNOTHING TO INSTALL\033[22m\033[37m\n"
  1079. exit_script
  1080. fi
  1081. sleep 3
  1082. fi
  1083. fi
  1084. #----------------------------------------------------------------
  1085. print_header
  1086. check_inst
  1087. print_settings
  1088. #==================================
  1089. #---- Main menu -------------------
  1090. #==================================
  1091. while true; do
  1092. LINUX_FSTYPE="ext4"
  1093. _inst_mbkernel="yes"
  1094. break
  1095. A="z"
  1096. if read -n 1 -t 1 -s A; then
  1097. if [ "${A}" = "1" ] && [ "${NUMCARDS}" = "2" ]; then
  1098. print_header
  1099. set_dest
  1100. print_header
  1101. print_settings
  1102. elif [ "${A}" = "2" ]; then
  1103. print_header
  1104. set_userdatasize
  1105. print_header
  1106. print_settings
  1107. elif [ "${A}" = "3" ]; then
  1108. print_header
  1109. set_systemsize
  1110. print_header
  1111. print_settings
  1112. elif [ "${A}" = "4" ]; then
  1113. print_header
  1114. set_datasize
  1115. print_header
  1116. print_settings
  1117. elif [ "${A}" = "5" ]; then
  1118. print_header
  1119. set_cachesize
  1120. print_header
  1121. print_settings
  1122. elif [ "${A}" = "t" ] && [ "${INST_LINUX}" = "yes" ]; then
  1123. if [ "${LINUX_FSTYPE}" = "btrfs" ]; then
  1124. LINUX_FSTYPE="ext4"
  1125. else
  1126. LINUX_FSTYPE="btrfs"
  1127. fi
  1128. print_header
  1129. print_settings
  1130. elif [ "${O_BOARD}" = "C2" ] && [ "${A}" = "M" ] && [ "${INST_LINUX}" = "yes" ]; then
  1131. if [ "${_inst_mbkernel}" = "yes" ]; then
  1132. _inst_mbkernel="no"
  1133. else
  1134. _inst_mbkernel="yes"
  1135. fi
  1136. print_header
  1137. print_settings
  1138. elif [ "${A}" = "E" ]; then
  1139. echo ""
  1140. _reboot_delay=10
  1141. while [ $_reboot_delay -gt 0 ]; do
  1142. printf " \033[33m\033[1mEXIT in %s sec, press \033[22ma\033[1m to abort, \033[22me\033[1m to exit \033[22m\033[37m\r" "$_reboot_delay"
  1143. if read -n 1 -t 1 -s B; then
  1144. _reboot_delay=10
  1145. if [ "${B}" = "a" ] || [ "${B}" = "A" ]; then
  1146. break
  1147. elif [ "${B}" = "e" ] || [ "${B}" = "E" ]; then
  1148. _reboot_delay=0
  1149. break
  1150. fi
  1151. else
  1152. let _reboot_delay=_reboot_delay-1
  1153. fi
  1154. done
  1155. if [ $_reboot_delay -eq 0 ]; then
  1156. umount ${source_mount} > /dev/null 2>&1
  1157. exit 0
  1158. else
  1159. print_header
  1160. print_settings
  1161. fi
  1162. elif [ "${A}" = "I" ]; then
  1163. echo ""
  1164. _reboot_delay=15
  1165. while [ $_reboot_delay -gt 0 ]; do
  1166. printf " \033[31m\033[1mWARNING: !! ALL DATA ON %s CARD WILL BE ERASED !!, PRESS Y TO CONTINUE\033[22m\033[37m\r" "${DEST_EMMC}"
  1167. B="Z"
  1168. if read -n 1 -t 1 -s B; then
  1169. break
  1170. else
  1171. let _reboot_delay=_reboot_delay-1
  1172. fi
  1173. done
  1174. if [ "${B}" = "Y" ]; then
  1175. break
  1176. else
  1177. print_header
  1178. print_settings
  1179. fi
  1180. elif [ "${A}" = "s" ]; then
  1181. # SCREENSHOT ===
  1182. fbcat > /install.ppm
  1183. fi
  1184. fi
  1185. done
  1186. # --- Set partition label prefix ---
  1187. if [ "${DEST_EMMC}" = "EMMC" ]; then
  1188. label_pref="em"
  1189. else
  1190. label_pref="sd"
  1191. fi
  1192. if [ "${INST_ANDROID}" != "yes" ] && [ "${INST_LINUX}" != "yes" ] && [ "${INST_OELEC}" != "yes" ]; then
  1193. printf " \033[33m\033[1mNothing to install!\033[22m\033[37m\n"
  1194. printf " \033[33m\033[1mInstallation aborted.\033[22m\033[37m\n"
  1195. umount ${source_mount} > /dev/null 2>&1
  1196. exit_script
  1197. fi
  1198. # --------------------------------------------------------------------------------------------------------------------
  1199. print_header
  1200. # --- Partition and format the card ----------------------------
  1201. prepare_card
  1202. if [ $? -ne 0 ]; then
  1203. printf " \033[35mERROR PREPARING %s CARD!\033[37m\n" "${DEST_EMMC}"
  1204. else
  1205. # install bootloader
  1206. if [ "${O_BOARD}" = "C2" ]; then
  1207. install_boot_c2
  1208. elif [ "${O_BOARD}" = "C1" ]; then
  1209. install_boot_c1
  1210. else
  1211. install_boot_xu
  1212. fi
  1213. if [ $? -eq 0 ]; then
  1214. if [ "${INST_LINUX}" = "yes" ]; then
  1215. # --- Install Linux ---
  1216. install_linux "C2_backup/linux/jeedom.img"
  1217. if [ $? -ne 0 ]; then
  1218. printf " \033[35mERROR INSTALLING JEEDOM!\033[37m\n"
  1219. else
  1220. printf " \033[36mJEEDOM PREPARED!\033[37m\n"
  1221. fi
  1222. fi
  1223. printf "\n \033[33mInstalling \033[1mMulti Boot support\033[22m\033[37m\n"
  1224. install_multi_sel
  1225. if [ $? -ne 0 ]; then
  1226. printf " \033[35mERROR INSTALLING Multi Boot!\033[37m\n"
  1227. else
  1228. printf " \033[36m%s CARD PREPARED FOR MULTI BOOT!\033[37m\n" "${DEST_EMMC}"
  1229. fi
  1230. umount /mnt2 >> ${log_file} 2>&1
  1231. fi
  1232. fi
  1233. echo ""
  1234. umount ${source_mount} > /dev/null 2>&1
  1235. printf " \033[35mRenaming Backup File !\033[37m\n"
  1236. mountx /dev/sda1 /mnt1
  1237. rm -Rf /mnt1/C2_backup
  1238. mv /mnt1/backupJeedom.tar.gz /mnt1/backupJeedom.tar.gz.installed
  1239. printf " \033[35mREBOOT !\033[37m\n"
  1240. sleep 2
  1241. reboot