installer.sh.in 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311
  1. #!/bin/sh
  2. #-
  3. # Copyright (c) 2012 Juan Romero Pardines <[email protected]>.
  4. # 2012 Dave Elusive <[email protected]>.
  5. # All rights reserved.
  6. #
  7. # Redistribution and use in source and binary forms, with or without
  8. # modification, are permitted provided that the following conditions
  9. # are met:
  10. # 1. Redistributions of source code must retain the above copyright
  11. # notice, this list of conditions and the following disclaimer.
  12. # 2. Redistributions in binary form must reproduce the above copyright
  13. # notice, this list of conditions and the following disclaimer in the
  14. # documentation and/or other materials provided with the distribution.
  15. #
  16. # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
  17. # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  18. # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
  19. # IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
  20. # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  21. # NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  22. # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  23. # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  24. # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  25. # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  26. #-
  27. # Make sure we don't inherit these from env.
  28. SOURCE_DONE=
  29. HOSTNAME_DONE=
  30. KEYBOARD_DONE=
  31. LOCALE_DONE=
  32. TIMEZONE_DONE=
  33. ROOTPASSWORD_DONE=
  34. BOOTLOADER_DONE=
  35. PARTITIONS_DONE=
  36. NETWORK_DONE=
  37. FILESYSTEMS_DONE=
  38. TARGETDIR=/mnt/target
  39. LOG=/dev/tty7
  40. CONF_FILE=/tmp/.void-installer.conf
  41. if [ ! -f $CONF_FILE ]; then
  42. touch -f $CONF_FILE
  43. fi
  44. ANSWER=$(mktemp -t vinstall-XXXXXXXX || exit 1)
  45. TARGET_FSTAB=$(mktemp -t vinstall-fstab-XXXXXXXX || exit 1)
  46. trap "DIE" INT TERM QUIT
  47. # disable printk
  48. if [ -w /proc/sys/kernel/printk ]; then
  49. echo 0 >/proc/sys/kernel/printk
  50. fi
  51. # Detect if this is an EFI system.
  52. if [ -e /sys/firmware/efi/systab ]; then
  53. EFI_SYSTEM=1
  54. fi
  55. # dialog colors
  56. BLACK="\Z0"
  57. RED="\Z1"
  58. GREEN="\Z2"
  59. YELLOW="\Z3"
  60. BLUE="\Z4"
  61. MAGENTA="\Z5"
  62. CYAN="\Z6"
  63. WHITE="\Z7"
  64. BOLD="\Zb"
  65. REVERSE="\Zr"
  66. UNDERLINE="\Zu"
  67. RESET="\Zn"
  68. # Properties shared per widget.
  69. MENULABEL="${BOLD}Use UP and DOWN keys to navigate \
  70. menus. Use TAB to switch between buttons and ENTER to select.${RESET}"
  71. MENUSIZE="14 60 0"
  72. INPUTSIZE="8 60"
  73. MSGBOXSIZE="8 70"
  74. YESNOSIZE="$INPUTSIZE"
  75. WIDGET_SIZE="10 70"
  76. # Hardcoded list of timezones; to not depend on tzdata.
  77. TIMEZONES="
  78. Africa/Abidjan
  79. Africa/Accra
  80. Africa/Addis_Ababa
  81. Africa/Algiers
  82. Africa/Asmara
  83. Africa/Bamako
  84. Africa/Bangui
  85. Africa/Banjul
  86. Africa/Bissau
  87. Africa/Blantyre
  88. Africa/Brazzaville
  89. Africa/Bujumbura
  90. Africa/Cairo
  91. Africa/Casablanca
  92. Africa/Ceuta
  93. Africa/Conakry
  94. Africa/Dakar
  95. Africa/Dar_es_Salaam
  96. Africa/Djibouti
  97. Africa/Douala
  98. Africa/El_Aaiun
  99. Africa/Freetown
  100. Africa/Gaborone
  101. Africa/Harare
  102. Africa/Johannesburg
  103. Africa/Juba
  104. Africa/Kampala
  105. Africa/Khartoum
  106. Africa/Kigali
  107. Africa/Kinshasa
  108. Africa/Lagos
  109. Africa/Libreville
  110. Africa/Lome
  111. Africa/Luanda
  112. Africa/Lubumbashi
  113. Africa/Lusaka
  114. Africa/Malabo
  115. Africa/Maputo
  116. Africa/Maseru
  117. Africa/Mbabane
  118. Africa/Mogadishu
  119. Africa/Monrovia
  120. Africa/Nairobi
  121. Africa/Ndjamena
  122. Africa/Niamey
  123. Africa/Nouakchott
  124. Africa/Ouagadougou
  125. Africa/Porto-Novo
  126. Africa/Sao_Tome
  127. Africa/Tripoli
  128. Africa/Tunis
  129. Africa/Windhoek
  130. America/Adak
  131. America/Anchorage
  132. America/Anguilla
  133. America/Antigua
  134. America/Araguaina
  135. America/Argentina/Buenos_Aires
  136. America/Argentina/Catamarca
  137. America/Argentina/Cordoba
  138. America/Argentina/Jujuy
  139. America/Argentina/La_Rioja
  140. America/Argentina/Mendoza
  141. America/Argentina/Rio_Gallegos
  142. America/Argentina/Salta
  143. America/Argentina/San_Juan
  144. America/Argentina/San_Luis
  145. America/Argentina/Tucuman
  146. America/Argentina/Ushuaia
  147. America/Aruba
  148. America/Asuncion
  149. America/Atikokan
  150. America/Bahia
  151. America/Bahia_Banderas
  152. America/Barbados
  153. America/Belem
  154. America/Belize
  155. America/Blanc-Sablon
  156. America/Boa_Vista
  157. America/Bogota
  158. America/Boise
  159. America/Cambridge_Bay
  160. America/Campo_Grande
  161. America/Cancun
  162. America/Caracas
  163. America/Cayenne
  164. America/Cayman
  165. America/Chicago
  166. America/Chihuahua
  167. America/Costa_Rica
  168. America/Creston
  169. America/Cuiaba
  170. America/Curacao
  171. America/Danmarkshavn
  172. America/Dawson
  173. America/Dawson_Creek
  174. America/Denver
  175. America/Detroit
  176. America/Dominica
  177. America/Edmonton
  178. America/Eirunepe
  179. America/El_Salvador
  180. America/Fortaleza
  181. America/Glace_Bay
  182. America/Godthab
  183. America/Goose_Bay
  184. America/Grand_Turk
  185. America/Grenada
  186. America/Guadeloupe
  187. America/Guatemala
  188. America/Guayaquil
  189. America/Guyana
  190. America/Halifax
  191. America/Havana
  192. America/Hermosillo
  193. America/Indiana/Indianapolis
  194. America/Indiana/Knox
  195. America/Indiana/Marengo
  196. America/Indiana/Petersburg
  197. America/Indiana/Tell_City
  198. America/Indiana/Vevay
  199. America/Indiana/Vincennes
  200. America/Indiana/Winamac
  201. America/Inuvik
  202. America/Iqaluit
  203. America/Jamaica
  204. America/Juneau
  205. America/Kentucky/Louisville
  206. America/Kentucky/Monticello
  207. America/Kralendijk
  208. America/La_Paz
  209. America/Lima
  210. America/Los_Angeles
  211. America/Lower_Princes
  212. America/Maceio
  213. America/Managua
  214. America/Manaus
  215. America/Marigot
  216. America/Martinique
  217. America/Matamoros
  218. America/Mazatlan
  219. America/Menominee
  220. America/Merida
  221. America/Metlakatla
  222. America/Mexico_City
  223. America/Miquelon
  224. America/Moncton
  225. America/Monterrey
  226. America/Montevideo
  227. America/Montreal
  228. America/Montserrat
  229. America/Nassau
  230. America/New_York
  231. America/Nipigon
  232. America/Nome
  233. America/Noronha
  234. America/North_Dakota/Beulah
  235. America/North_Dakota/Center
  236. America/North_Dakota/New_Salem
  237. America/Ojinaga
  238. America/Panama
  239. America/Pangnirtung
  240. America/Paramaribo
  241. America/Phoenix
  242. America/Port-au-Prince
  243. America/Port_of_Spain
  244. America/Porto_Velho
  245. America/Puerto_Rico
  246. America/Rainy_River
  247. America/Rankin_Inlet
  248. America/Recife
  249. America/Regina
  250. America/Resolute
  251. America/Rio_Branco
  252. America/Santa_Isabel
  253. America/Santarem
  254. America/Santiago
  255. America/Santo_Domingo
  256. America/Sao_Paulo
  257. America/Scoresbysund
  258. America/Shiprock
  259. America/Sitka
  260. America/St_Barthelemy
  261. America/St_Johns
  262. America/St_Kitts
  263. America/St_Lucia
  264. America/St_Thomas
  265. America/St_Vincent
  266. America/Swift_Current
  267. America/Tegucigalpa
  268. America/Thule
  269. America/Thunder_Bay
  270. America/Tijuana
  271. America/Toronto
  272. America/Tortola
  273. America/Vancouver
  274. America/Whitehorse
  275. America/Winnipeg
  276. America/Yakutat
  277. America/Yellowknife
  278. Antarctica/Casey
  279. Antarctica/Davis
  280. Antarctica/DumontDUrville
  281. Antarctica/Macquarie
  282. Antarctica/Mawson
  283. Antarctica/McMurdo
  284. Antarctica/Palmer
  285. Antarctica/Rothera
  286. Antarctica/South_Pole
  287. Antarctica/Syowa
  288. Antarctica/Vostok
  289. Arctic/Longyearbyen
  290. Asia/Aden
  291. Asia/Almaty
  292. Asia/Amman
  293. Asia/Anadyr
  294. Asia/Aqtau
  295. Asia/Aqtobe
  296. Asia/Ashgabat
  297. Asia/Baghdad
  298. Asia/Bahrain
  299. Asia/Baku
  300. Asia/Bangkok
  301. Asia/Beirut
  302. Asia/Bishkek
  303. Asia/Brunei
  304. Asia/Choibalsan
  305. Asia/Chongqing
  306. Asia/Colombo
  307. Asia/Damascus
  308. Asia/Dhaka
  309. Asia/Dili
  310. Asia/Dubai
  311. Asia/Dushanbe
  312. Asia/Gaza
  313. Asia/Harbin
  314. Asia/Hebron
  315. Asia/Ho_Chi_Minh
  316. Asia/Hong_Kong
  317. Asia/Hovd
  318. Asia/Irkutsk
  319. Asia/Jakarta
  320. Asia/Jayapura
  321. Asia/Jerusalem
  322. Asia/Kabul
  323. Asia/Kamchatka
  324. Asia/Karachi
  325. Asia/Kashgar
  326. Asia/Kathmandu
  327. Asia/Kolkata
  328. Asia/Krasnoyarsk
  329. Asia/Kuala_Lumpur
  330. Asia/Kuching
  331. Asia/Kuwait
  332. Asia/Macau
  333. Asia/Magadan
  334. Asia/Makassar
  335. Asia/Manila
  336. Asia/Muscat
  337. Asia/Nicosia
  338. Asia/Novokuznetsk
  339. Asia/Novosibirsk
  340. Asia/Omsk
  341. Asia/Oral
  342. Asia/Phnom_Penh
  343. Asia/Pontianak
  344. Asia/Pyongyang
  345. Asia/Qatar
  346. Asia/Qyzylorda
  347. Asia/Rangoon
  348. Asia/Riyadh
  349. Asia/Sakhalin
  350. Asia/Samarkand
  351. Asia/Seoul
  352. Asia/Shanghai
  353. Asia/Singapore
  354. Asia/Taipei
  355. Asia/Tashkent
  356. Asia/Tbilisi
  357. Asia/Tehran
  358. Asia/Thimphu
  359. Asia/Tokyo
  360. Asia/Ulaanbaatar
  361. Asia/Urumqi
  362. Asia/Vientiane
  363. Asia/Vladivostok
  364. Asia/Yakutsk
  365. Asia/Yekaterinburg
  366. Asia/Yerevan
  367. Atlantic/Azores
  368. Atlantic/Bermuda
  369. Atlantic/Canary
  370. Atlantic/Cape_Verde
  371. Atlantic/Faroe
  372. Atlantic/Madeira
  373. Atlantic/Reykjavik
  374. Atlantic/South_Georgia
  375. Atlantic/St_Helena
  376. Atlantic/Stanley
  377. Australia/Adelaide
  378. Australia/Brisbane
  379. Australia/Broken_Hill
  380. Australia/Currie
  381. Australia/Darwin
  382. Australia/Eucla
  383. Australia/Hobart
  384. Australia/Lindeman
  385. Australia/Lord_Howe
  386. Australia/Melbourne
  387. Australia/Perth
  388. Australia/Sydney
  389. Europe/Amsterdam
  390. Europe/Andorra
  391. Europe/Athens
  392. Europe/Belgrade
  393. Europe/Berlin
  394. Europe/Bratislava
  395. Europe/Brussels
  396. Europe/Bucharest
  397. Europe/Budapest
  398. Europe/Chisinau
  399. Europe/Copenhagen
  400. Europe/Dublin
  401. Europe/Gibraltar
  402. Europe/Guernsey
  403. Europe/Helsinki
  404. Europe/Isle_of_Man
  405. Europe/Istanbul
  406. Europe/Jersey
  407. Europe/Kaliningrad
  408. Europe/Kiev
  409. Europe/Lisbon
  410. Europe/Ljubljana
  411. Europe/London
  412. Europe/Luxembourg
  413. Europe/Madrid
  414. Europe/Malta
  415. Europe/Mariehamn
  416. Europe/Minsk
  417. Europe/Monaco
  418. Europe/Moscow
  419. Europe/Oslo
  420. Europe/Paris
  421. Europe/Podgorica
  422. Europe/Prague
  423. Europe/Riga
  424. Europe/Rome
  425. Europe/Samara
  426. Europe/San_Marino
  427. Europe/Sarajevo
  428. Europe/Simferopol
  429. Europe/Skopje
  430. Europe/Sofia
  431. Europe/Stockholm
  432. Europe/Tallinn
  433. Europe/Tirane
  434. Europe/Uzhgorod
  435. Europe/Vaduz
  436. Europe/Vatican
  437. Europe/Vienna
  438. Europe/Vilnius
  439. Europe/Volgograd
  440. Europe/Warsaw
  441. Europe/Zagreb
  442. Europe/Zaporozhye
  443. Europe/Zurich
  444. Indian/Antananarivo
  445. Indian/Chagos
  446. Indian/Christmas
  447. Indian/Cocos
  448. Indian/Comoro
  449. Indian/Kerguelen
  450. Indian/Mahe
  451. Indian/Maldives
  452. Indian/Mauritius
  453. Indian/Mayotte
  454. Indian/Reunion
  455. Pacific/Apia
  456. Pacific/Auckland
  457. Pacific/Chatham
  458. Pacific/Chuuk
  459. Pacific/Easter
  460. Pacific/Efate
  461. Pacific/Enderbury
  462. Pacific/Fakaofo
  463. Pacific/Fiji
  464. Pacific/Funafuti
  465. Pacific/Galapagos
  466. Pacific/Gambier
  467. Pacific/Guadalcanal
  468. Pacific/Guam
  469. Pacific/Honolulu
  470. Pacific/Johnston
  471. Pacific/Kiritimati
  472. Pacific/Kosrae
  473. Pacific/Kwajalein
  474. Pacific/Majuro
  475. Pacific/Marquesas
  476. Pacific/Midway
  477. Pacific/Nauru
  478. Pacific/Niue
  479. Pacific/Norfolk
  480. Pacific/Noumea
  481. Pacific/Pago_Pago
  482. Pacific/Palau
  483. Pacific/Pitcairn
  484. Pacific/Pohnpei
  485. Pacific/Port_Moresby
  486. Pacific/Rarotonga
  487. Pacific/Saipan
  488. Pacific/Tahiti
  489. Pacific/Tarawa
  490. Pacific/Tongatapu
  491. Pacific/Wake
  492. Pacific/Wallis"
  493. DIALOG() {
  494. rm -f $ANSWER
  495. dialog --colors --keep-tite --no-shadow --no-mouse \
  496. --backtitle "${BOLD}${WHITE}Void Linux installation -- http://www.voidlinux.eu/${RESET}" \
  497. --cancel-label "Back" --aspect 20 "$@" 2>$ANSWER
  498. return $?
  499. }
  500. DIE() {
  501. rval=$1
  502. [ -z "$rval" ] && rval=0
  503. clear
  504. rm -f $ANSWER $TARGET_FSTAB
  505. # reenable printk
  506. if [ -w /proc/sys/kernel/printk ]; then
  507. echo 4 >/proc/sys/kernel/printk
  508. fi
  509. umount_filesystems
  510. exit $rval
  511. }
  512. set_option() {
  513. if grep -Eq "^${1}.*" $CONF_FILE; then
  514. sed -i -e "/^${1}.*/d" $CONF_FILE
  515. fi
  516. echo "${1} ${2}" >>$CONF_FILE
  517. }
  518. get_option() {
  519. echo $(grep -E "^${1}.*" $CONF_FILE|sed -e "s|${1}||")
  520. }
  521. show_disks() {
  522. local dev size sectorsize gbytes
  523. # IDE
  524. for dev in $(ls /sys/block|grep -E '^hd'); do
  525. if [ "$(cat /sys/block/$dev/device/media)" = "disk" ]; then
  526. # Find out nr sectors and bytes per sector;
  527. echo "/dev/$dev"
  528. size=$(cat /sys/block/$dev/size)
  529. sectorsize=$(cat /sys/block/$dev/queue/hw_sector_size)
  530. gbytes="$(($size * $sectorsize / 1024 / 1024 / 1024))"
  531. echo "size:${gbytes}GB;sector_size:$sectorsize"
  532. fi
  533. done
  534. # SATA/SCSI and Virtual disks (virtio)
  535. for dev in $(ls /sys/block|grep -E '^[sv]d'); do
  536. if [ "$(cat /sys/block/$dev/device/type)" != "5" ]; then
  537. echo "/dev/$dev"
  538. size=$(cat /sys/block/$dev/size)
  539. sectorsize=$(cat /sys/block/$dev/queue/hw_sector_size)
  540. gbytes="$(($size * $sectorsize / 1024 / 1024 / 1024))"
  541. echo "size:${gbytes}GB;sector_size:$sectorsize"
  542. fi
  543. done
  544. }
  545. show_partitions() {
  546. local dev fstype fssize p part
  547. set -- $(show_disks)
  548. while [ $# -ne 0 ]; do
  549. disk=$(basename $1)
  550. shift 2
  551. # ATA/SCSI/SATA
  552. for p in /sys/block/$disk/$disk*; do
  553. if [ -d $p ]; then
  554. part=$(basename $p)
  555. fstype=$(blkid /dev/$part|awk '{print $3}'|sed -e 's/TYPE=\"\(.*\)\"/\1/g')
  556. [ "$fstype" = "iso9660" ] && continue
  557. fssize=$(lsblk -r /dev/$part|awk '{print $4}'|grep -v SIZE)
  558. echo "/dev/$part"
  559. echo "size:${fssize:-unknown};fstype:${fstype:-none}"
  560. fi
  561. done
  562. # LVM
  563. for p in $(ls /dev/mapper 2>/dev/null|grep -v control); do
  564. [ "$p" = "live-rw" ] && continue
  565. fstype=$(blkid /dev/$part|awk '{print $3}'|sed -e 's/TYPE=\"\(.*\)\"/\1/g')
  566. fssize=$(lsblk -r /dev/mapper/$p|awk '{print $4}'|grep -v SIZE)
  567. echo "/dev/mapper/$p"
  568. echo "size:${fssize:-unknown};fstype:${fstype:-none}"
  569. done
  570. # Software raid (md)
  571. for p in $(ls -d /dev/md* 2>/dev/null|grep '[0-9]'); do
  572. if cat /proc/mdstat|grep -qw $(echo $p|sed -e 's|/dev/||g'); then
  573. fstype=$(blkid /dev/$part|awk '{print $3}'|sed -e 's/TYPE=\"\(.*\)\"/\1/g')
  574. fssize=$(lsblk -r /dev/$p|awk '{print $4}'|grep -v SIZE)
  575. echo "$p"
  576. echo "size:${fssize:-unknown};fstype:${fstype:-none}"
  577. fi
  578. done
  579. done
  580. }
  581. menu_filesystems() {
  582. local dev fstype fssize mntpoint reformat
  583. while true; do
  584. DIALOG --title " Select the partition to edit " --menu "$MENULABEL" \
  585. ${MENUSIZE} $(show_partitions)
  586. [ $? -ne 0 ] && return
  587. dev=$(cat $ANSWER)
  588. DIALOG --title " Select the filesystem type for $dev " \
  589. --menu "$MENULABEL" ${MENUSIZE} \
  590. "vfat" "FAT32" \
  591. "btrfs" "Oracle's Btrfs" \
  592. "ext2" "Linux ext2 (no journaling)" \
  593. "ext3" "Linux ext3 (journal)" \
  594. "ext4" "Linux ext4 (journal)" \
  595. "swap" "Linux swap" \
  596. "xfs" "SGI's XFS"
  597. if [ $? -eq 0 ]; then
  598. fstype=$(cat $ANSWER)
  599. else
  600. continue
  601. fi
  602. if [ "$fstype" != "swap" ]; then
  603. DIALOG --inputbox "Please specify the mount point for $dev:" ${INPUTSIZE}
  604. if [ $? -eq 0 ]; then
  605. mntpoint=$(cat $ANSWER)
  606. elif [ $? -eq 1 ]; then
  607. continue
  608. fi
  609. else
  610. mntpoint=swap
  611. fi
  612. DIALOG --yesno "Do you want to create a new filesystem on $dev?" ${YESNOSIZE}
  613. if [ $? -eq 0 ]; then
  614. reformat=1
  615. elif [ $? -eq 1 ]; then
  616. reformat=0
  617. else
  618. continue
  619. fi
  620. fssize=$(lsblk -r $dev|awk '{print $4}'|grep -v SIZE)
  621. set -- "$fstype" "$fssize" "$mntpoint" "$reformat"
  622. if [ -n "$1" -a -n "$2" -a -n "$3" -a -n "$4" ]; then
  623. local bdev=$(basename $dev)
  624. if grep -Eq "^MOUNTPOINT \/dev\/${bdev}.*" $CONF_FILE; then
  625. sed -i -e "/^MOUNTPOINT \/dev\/${bdev}.*/d" $CONF_FILE
  626. fi
  627. echo "MOUNTPOINT $dev $1 $2 $3 $4" >>$CONF_FILE
  628. fi
  629. done
  630. }
  631. menu_partitions() {
  632. DIALOG --title " Select the disk to partition " \
  633. --menu "$MENULABEL" ${MENUSIZE} $(show_disks)
  634. if [ $? -eq 0 ]; then
  635. local device=$(cat $ANSWER)
  636. DIALOG --title "Modify Partition Table on $device" --msgbox "\n
  637. ${BOLD}GNU parted will be executed in disk $device.${RESET}\n\n
  638. For BIOS systems, MBR or GPT partition tables are supported.\n
  639. To use GPT on PC BIOS systems an empty partition of 1MB must be added\n
  640. at the first 2GB of the disk with the TOGGLE \`bios_grub' enabled.\n
  641. ${BOLD}NOTE: you don't need this on EFI systems.${RESET}\n\n
  642. For EFI systems GPT is mandatory and a FAT32 partition with at least\n
  643. 100MB must be created with the TOGGLE \`boot', this will be used as\n
  644. EFI System Partition. This partition must have mountpoint as \`/boot/efi'.\n\n
  645. At least 2 partitions are required: swap and rootfs (/).\n
  646. For swap, RAM*2 must be really enough. For / 600MB are required.\n\n
  647. ${BOLD}WARNING: /usr is not supported as a separate partition.${RESET}\n
  648. ${BOLD}WARNING: changes made by parted are destructive, you've been warned.
  649. ${RESET}\n" 18 80
  650. if [ $? -eq 0 ]; then
  651. while true; do
  652. clear; parted $device; PARTITIONS_DONE=1; partprobe $device
  653. break
  654. done
  655. else
  656. return
  657. fi
  658. fi
  659. }
  660. menu_keymap() {
  661. local KEYMAPS="de German fr French it Italian en English es Spanish ru Russia us American"
  662. while true; do
  663. DIALOG --title " Select your keymap " --menu "$MENULABEL" 14 70 14 ${KEYMAPS}
  664. if [ $? -eq 0 ]; then
  665. set_option KEYMAP "$(cat $ANSWER)"
  666. loadkeys "$(cat $ANSWER)"
  667. KEYBOARD_DONE=1
  668. break
  669. else
  670. return
  671. fi
  672. done
  673. }
  674. set_keymap() {
  675. local KEYMAP=$(get_option KEYMAP)
  676. sed -i -e "s|KEYMAP=.*|KEYMAP=$KEYMAP|g" $TARGETDIR/etc/vconsole.conf
  677. }
  678. menu_locale() {
  679. local _locales="$(localectl --no-pager list-locales)"
  680. local _LOCALES=
  681. for f in ${_locales}; do
  682. _LOCALES="${_LOCALES} ${f} -"
  683. done
  684. while true; do
  685. DIALOG --title " Select your locale " --menu "$MENULABEL" 14 70 14 ${_LOCALES}
  686. if [ $? -eq 0 ]; then
  687. set_option LANG "$(cat $ANSWER)"
  688. LOCALE_DONE=1
  689. break
  690. else
  691. return
  692. fi
  693. done
  694. }
  695. set_locale() {
  696. local LOCALE=$(get_option LOCALE)
  697. sed -i -e "s|LANG=.*|LANG=$KEYMAP|g" $TARGETDIR/etc/locale.conf
  698. }
  699. menu_timezone() {
  700. local _tzones=
  701. for f in ${TIMEZONES}; do
  702. _tzones="${_tzones} ${f} -"
  703. done
  704. while true; do
  705. DIALOG --title " Select your timezone " --menu "$MENULABEL" 14 70 14 ${_tzones}
  706. if [ $? -eq 0 ]; then
  707. set_option TIMEZONE "$(cat $ANSWER)"
  708. TIMEZONE_DONE=1
  709. break
  710. else
  711. return
  712. fi
  713. done
  714. }
  715. set_timezone() {
  716. local TIMEZONE="$(get_option TIMEZONE)"
  717. ln -sf /usr/share/zoneinfo/${TIMEZONE} $TARGETDIR/etc/localtime
  718. }
  719. menu_hostname() {
  720. while true; do
  721. DIALOG --inputbox "Set the machine hostname:" ${INPUTSIZE}
  722. if [ $? -eq 0 ]; then
  723. set_option HOSTNAME "$(cat $ANSWER)"
  724. HOSTNAME_DONE=1
  725. break
  726. else
  727. return
  728. fi
  729. done
  730. }
  731. set_hostname() {
  732. echo $(get_option HOSTNAME) > $TARGETDIR/etc/hostname
  733. }
  734. menu_rootpassword() {
  735. local _firstpass= _secondpass= _desc=
  736. while true; do
  737. if [ -n "${_firstpass}" ]; then
  738. _desc="Enter the root password again (password won't be displayed)"
  739. else
  740. _desc="Enter the root password (password won't be displayed)"
  741. fi
  742. DIALOG --passwordbox "${_desc}" ${MSGBOXSIZE}
  743. if [ $? -eq 0 ]; then
  744. if [ -z "${_firstpass}" ]; then
  745. _firstpass="$(cat $ANSWER)"
  746. else
  747. _secondpass="$(cat $ANSWER)"
  748. fi
  749. if [ -n "${_firstpass}" -a -n "${_secondpass}" ]; then
  750. if [ "${_firstpass}" != "${_secondpass}" ]; then
  751. DIALOG --infobox "Passwords do not match! please reenter it again" 6 80
  752. unset _firstpass _secondpass
  753. sleep 2 && continue
  754. fi
  755. set_option ROOTPASSWORD "${_firstpass}"
  756. ROOTPASSWORD_DONE=1
  757. break
  758. fi
  759. else
  760. return
  761. fi
  762. done
  763. }
  764. set_rootpassword() {
  765. echo "root:$(get_option ROOTPASSWORD)" | chpasswd -R $TARGETDIR -c SHA512
  766. }
  767. menu_bootloader() {
  768. while true; do
  769. DIALOG --title " Select the disk to install the bootloader" \
  770. --menu "$MENULABEL" ${MENUSIZE} $(show_disks)
  771. if [ $? -eq 0 ]; then
  772. set_option BOOTLOADER "$(cat $ANSWER)"
  773. BOOTLOADER_DONE=1
  774. break
  775. else
  776. return
  777. fi
  778. done
  779. }
  780. set_bootloader() {
  781. local dev=$(get_option BOOTLOADER) grub_args=
  782. # Check if it's an EFI system via efivars module.
  783. if [ -n "$EFI_SYSTEM" ]; then
  784. grub_args="--target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=void_grub --recheck"
  785. fi
  786. echo "Running grub-install $grub_args $dev..." >$LOG
  787. chroot $TARGETDIR grub-install $grub_args $dev >$LOG 2>&1
  788. if [ $? -ne 0 ]; then
  789. DIALOG --msgbox "${BOLD}${RED}ERROR:${RESET} \
  790. failed to install GRUB to $dev!\nCheck $LOG for errors." ${MSGBOXSIZE}
  791. DIE 1
  792. fi
  793. echo "Running grub-mkconfig on $TARGETDIR..." >$LOG
  794. chroot $TARGETDIR grub-mkconfig -o /boot/grub/grub.cfg >$LOG 2>&1
  795. if [ $? -ne 0 ]; then
  796. DIALOG --msgbox "${BOLD}${RED}ERROR${RESET}: \
  797. failed to run grub-mkconfig!\nCheck $LOG for errors." ${MSGBOXSIZE}
  798. DIE 1
  799. fi
  800. }
  801. test_network() {
  802. rm -f xtraeme.asc && \
  803. wget http://xbps.nopcode.org/live/xtraeme.asc >$LOG 2>&1
  804. if [ $? -eq 0 ]; then
  805. DIALOG --msgbox "Network is working properly!" ${MSGBOXSIZE}
  806. NETWORK_DONE=1
  807. return 1
  808. fi
  809. DIALOG --msgbox "Network is unaccessible, please setup it properly." ${MSGBOXSIZE}
  810. }
  811. configure_wifi() {
  812. local dev="$1"
  813. DIALOG --form "Wireless configuration for $dev:" 0 0 0 \
  814. "SSID:" 1 1 "add your AP name here" 1 21 20 0 \
  815. "Encryption:" 2 1 "Only supported: WEP or WPA-PSK" 2 21 20 0 \
  816. "Passphrase:" 3 1 "Enter the AP passphrase here" 3 21 20 0 || return 1
  817. }
  818. configure_eth() {
  819. local dev="$1"
  820. DIALOG --yesno "Do you want to use DHCP for $dev?" ${YESNOSIZE}
  821. if [ $? -eq 0 ]; then
  822. configure_net_dhcp $dev
  823. elif [ $? -eq 1 ]; then
  824. configure_net_static $dev
  825. fi
  826. }
  827. iface_setup() {
  828. ifconfig $1|grep -q 'inet addr:'
  829. return $?
  830. }
  831. configure_net_dhcp() {
  832. local dev="$1"
  833. iface_setup $dev
  834. if [ $? -eq 1 ]; then
  835. udhcpc -q -t 10 -n -i $dev 2>&1 | tee $LOG | \
  836. DIALOG --progressbox "Initializing $dev via DHCP..." ${WIDGET_SIZE}
  837. if [ $? -ne 0 ]; then
  838. DIALOG --msgbox "${BOLD}${RED}ERROR:${RESET} failed to run udhcpc. See $LOG for details." ${MSGBOXSIZE}
  839. return 1
  840. fi
  841. iface_setup $dev
  842. if [ $? -eq 1 ]; then
  843. DIALOG --msgbox "${BOLD}${RED}ERROR:${RESET} DHCP request failed for $dev. Check $LOG for errors." ${MSGBOXSIZE}
  844. return 1
  845. fi
  846. fi
  847. test_network
  848. if [ $? -eq 1 ]; then
  849. set_option NETWORK "${dev} dhcp"
  850. fi
  851. }
  852. configure_net_static() {
  853. local ip gw dns1 dns2 dev=$1
  854. DIALOG --form "Static IP configuration for $dev:" 0 0 0 \
  855. "IP address:" 1 1 "192.168.0.2" 1 21 20 0 \
  856. "Gateway:" 2 1 "192.168.0.1" 2 21 20 0 \
  857. "DNS Primary" 3 1 "8.8.8.8" 3 21 20 0 \
  858. "DNS Secondary" 4 1 "8.8.4.4" 4 21 20 0 || return 1
  859. set -- $(cat $ANSWER)
  860. ip=$1; gw=$2; dns1=$3; dns2=$4
  861. echo "running: ifconfig $dev $IPADDR up" >$LOG
  862. ifconfig $dev $ip up >$LOG 2>&1
  863. if [ $? -ne 0 ]; then
  864. DIALOG --msgbox "${BOLD}${RED}ERROR:${RESET} Failed to setup $dev interface." ${MSGBOXSIZE}
  865. return 1
  866. fi
  867. route add default gw $gw >$LOG 2>&1
  868. if [ $? -ne 0 ]; then
  869. DIALOG --msgbox "${BOLD}${RED}ERROR:${RESET} failed to setup your gateway." ${MSGBOXSIZE}
  870. return 1
  871. fi
  872. echo "nameserver $dns1" >/etc/resolv.conf
  873. echo "nameserver $dns2" >>/etc/resolv.conf
  874. test_network
  875. if [ $? -eq 1 ]; then
  876. set_option NETWORK "${dev} static $ip $gw $dns1 $dns2"
  877. fi
  878. }
  879. menu_network() {
  880. local dev addr f DEVICES
  881. for f in $(ls /sys/class/net); do
  882. [ "$f" = "lo" ] && continue
  883. addr=$(cat /sys/class/net/$f/address)
  884. DEVICES="$DEVICES $f $addr"
  885. done
  886. DIALOG --title " Select the network interface to configure " \
  887. --menu "$MENULABEL" ${MENUSIZE} ${DEVICES}
  888. if [ $? -eq 0 ]; then
  889. dev=$(cat $ANSWER)
  890. if $(echo $dev|grep -q "wlan[0-9]" 2>/dev/null); then
  891. configure_wifi $dev
  892. else
  893. configure_eth $dev
  894. fi
  895. fi
  896. }
  897. validate_filesystems() {
  898. local mnts dev size fstype mntpt mkfs rootfound swapfound fmt
  899. local usrfound efi_system_partition
  900. unset TARGETFS
  901. mnts=$(grep -E '^MOUNTPOINT.*' $CONF_FILE)
  902. set -- ${mnts}
  903. while [ $# -ne 0 ]; do
  904. dev=$2; fstype=$3; size=$4; mntpt="$5"; mkfs=$6
  905. shift 6
  906. if [ "$mntpt" = "/" ]; then
  907. rootfound=1
  908. elif [ "$mntpt" = "/usr" ]; then
  909. usrfound=1
  910. elif [ "$fstype" = "vfat" -a "$mntpt" = "/boot/efi" ]; then
  911. efi_system_partition=1
  912. fi
  913. if [ "$mkfs" -eq 1 ]; then
  914. fmt="NEW FILESYSTEM: "
  915. fi
  916. if [ -z "$TARGETFS" ]; then
  917. TARGETFS="${fmt}$dev ($size) mounted on $mntpt as ${fstype}\n"
  918. else
  919. TARGETFS="${TARGETFS}${fmt}${dev} ($size) mounted on $mntpt as ${fstype}\n"
  920. fi
  921. done
  922. if [ -z "$rootfound" ]; then
  923. DIALOG --msgbox "${BOLD}${RED}ERROR:${RESET} \
  924. the mount point for the root filesystem (/) has not yet been configured." ${MSGBOXSIZE}
  925. return 1
  926. elif [ -n "$usrfound" ]; then
  927. DIALOG --msgbox "${BOLD}${RED}ERROR:${RESET} \
  928. /usr mount point has been configured but is not supported, please remove it to continue." ${MSGBOXSIZE}
  929. return 1
  930. elif [ -n "$EFI_SYSTEM" -a -z "$efi_system_partition" ]; then
  931. DIALOG --msgbox "${BOLD}${RED}ERROR:${RESET} \
  932. The EFI System Partition has not yet been configured, please create it\n
  933. as FAT32, mountpoint /boot/efi and at least with 100MB of size." ${MSGBOXSIZE}
  934. fi
  935. FILESYSTEMS_DONE=1
  936. }
  937. create_filesystems() {
  938. local mnts dev mntpt fstype mkfs size rv uuid
  939. mnts=$(grep -E '^MOUNTPOINT.*' $CONF_FILE)
  940. set -- ${mnts}
  941. while [ $# -ne 0 ]; do
  942. dev=$2; fstype=$3; mntpt="$5"; mkfs=$6
  943. shift 6
  944. # swap partitions
  945. if [ "$fstype" = "swap" ]; then
  946. swapoff $dev >/dev/null 2>&1
  947. if [ "$mkfs" -eq 1 ]; then
  948. mkswap $dev >$LOG 2>&1
  949. if [ $? -ne 0 ]; then
  950. DIALOG --msgbox "${BOLD}${RED}ERROR:${RESET} \
  951. failed to create swap on ${dev}!\ncheck $LOG for errors." ${MSGBOXSIZE}
  952. DIE 1
  953. fi
  954. fi
  955. swapon $dev >$LOG 2>&1
  956. if [ $? -ne 0 ]; then
  957. DIALOG --msgbox "${BOLD}${RED}ERROR:${RESET} \
  958. failed to activate swap on $dev!\ncheck $LOG for errors." ${MSGBOXSIZE}
  959. DIE 1
  960. fi
  961. # Add entry for target fstab
  962. uuid=$(blkid $dev|awk '{print $2}'|sed -e 's/UUID=\"\(.*\)\"/\1/g')
  963. echo "UUID=$uuid none swap sw 0 0" >>$TARGET_FSTAB
  964. continue
  965. fi
  966. if [ "$mkfs" -eq 1 ]; then
  967. case "$fstype" in
  968. vfat) MKFS="mkfs.vfat -F32"; modprobe vfat >$LOG 2>&1;;
  969. xfs) MKFS="mkfs.xfs -f"; modprobe xfs >$LOG 2>&1;;
  970. ext2) MKFS="mke2fs"; modprobe ext2 >$LOG 2>&1;;
  971. ext3) MKFS="mke2fs -j"; modprobe ext3 >$LOG 2>&1;;
  972. ext4) MKFS="mke2fs -t ext4"; modprobe ext4 >$LOG 2>&1;;
  973. btrfs) MKFS="mkfs.btrfs"; modprobe btrfs >$LOG 2>&1;;
  974. esac
  975. DIALOG --infobox "Creating filesystem $fstype on $dev for $mntpt ..." 8 60
  976. echo "Running $MKFS $dev..." >$LOG
  977. $MKFS $dev >$LOG 2>&1; rv=$?
  978. if [ $rv -ne 0 ]; then
  979. DIALOG --msgbox "${BOLD}${RED}ERROR:${RESET} \
  980. failed to create filesystem $fstype on $dev!\ncheck $LOG for errors." ${MSGBOXSIZE}
  981. DIE 1
  982. fi
  983. fi
  984. # Mount rootfs the first one.
  985. [ "$mntpt" != "/" ] && continue
  986. mkdir -p $TARGETDIR
  987. echo "Mounting $dev on $mntpt ($fstype)..." >$LOG
  988. mount -t $fstype $dev $TARGETDIR >$LOG 2>&1
  989. if [ $? -ne 0 ]; then
  990. DIALOG --msgbox "${BOLD}${RED}ERROR:${RESET} \
  991. failed to mount $dev on ${mntpt}! check $LOG for errors." ${MSGBOXSIZE}
  992. DIE 1
  993. fi
  994. # Add entry to target fstab
  995. uuid=$(blkid $dev|awk '{print $2}'|sed -e 's/UUID=\"\(.*\)\"/\1/g')
  996. echo "UUID=$uuid $mntpt $fstype defaults 0 1" >>$TARGET_FSTAB
  997. done
  998. # mount all filesystems in target rootfs
  999. mnts=$(grep -E '^MOUNTPOINT.*' $CONF_FILE)
  1000. set -- ${mnts}
  1001. while [ $# -ne 0 ]; do
  1002. dev=$2; fstype=$3; mntpt="$5"
  1003. shift 6
  1004. [ "$mntpt" = "/" -o "$fstype" = "swap" ] && continue
  1005. mkdir -p ${TARGETDIR}${mntpt}
  1006. echo "Mounting $dev on $mntpt ($fstype)..." >$LOG
  1007. mount -t $fstype $dev ${TARGETDIR}${mntpt} >$LOG 2>&1
  1008. if [ $? -ne 0 ]; then
  1009. DIALOG --msgbox "${BOLD}${RED}ERROR:${RESET} \
  1010. failed to mount $dev on $mntpt! check $LOG for errors." ${MSGBOXSIZE}
  1011. DIE
  1012. fi
  1013. # Add entry to target fstab
  1014. uuid=$(blkid $dev|awk '{print $2}'|sed -e 's/UUID=\"\(.*\)\"/\1/g')
  1015. echo "UUID=$uuid $mntpt $fstype defaults 0 1" >>$TARGET_FSTAB
  1016. done
  1017. }
  1018. mount_filesystems() {
  1019. for f in sys proc dev; do
  1020. [ ! -d $TARGETDIR/$f ] && mkdir $TARGETDIR/$f
  1021. echo "Mounting $TARGETDIR/$f..." >$LOG
  1022. mount --bind /$f $TARGETDIR/$f >$LOG 2>&1
  1023. done
  1024. }
  1025. umount_filesystems() {
  1026. local f
  1027. for f in sys proc dev; do
  1028. echo "Unmounting $TARGETDIR/$f..." >$LOG
  1029. umount $TARGETDIR/$f >$LOG 2>&1
  1030. done
  1031. local mnts=$(grep -E '^MOUNTPOINT.*$' $CONF_FILE)
  1032. set -- ${mnts}
  1033. while [ $# -ne 0 ]; do
  1034. local dev=$2; local fstype=$3; local mntpt=$5
  1035. shift 6
  1036. if [ "$fstype" = "swap" ]; then
  1037. echo "Disabling swap space on $dev..." >$LOG
  1038. swapoff $dev >$LOG 2>&1
  1039. continue
  1040. fi
  1041. if [ "$mntpt" != "/" ]; then
  1042. echo "Unmounting $TARGETDIR/$mntpt..." >$LOG
  1043. umount $TARGETDIR/$mntpt >$LOG 2>&1
  1044. fi
  1045. done
  1046. echo "Unmounting $TARGETDIR..." >$LOG
  1047. umount $TARGETDIR >$LOG 2>&1
  1048. }
  1049. install_packages() {
  1050. local _grub=
  1051. if [ -n "$EFI_SYSTEM" ]; then
  1052. _grub="grub-x86_64-efi"
  1053. else
  1054. _grub="grub"
  1055. fi
  1056. mkdir -p $TARGETDIR/boot/grub
  1057. stdbuf -oL xbps-install -C /tmp/xbps.conf \
  1058. -r $TARGETDIR -Sy base-system ${_grub} 2>&1 | \
  1059. DIALOG --title "Installing base system packages..." \
  1060. --programbox 24 80
  1061. if [ $? -ne 0 ]; then
  1062. DIE 1
  1063. fi
  1064. }
  1065. menu_install() {
  1066. # Don't continue if filesystems are not ready.
  1067. validate_filesystems || return 1
  1068. ROOTPASSWORD_DONE="$(get_option ROOTPASSWORD)"
  1069. BOOTLOADER_DONE="$(get_option BOOTLOADER)"
  1070. if [ -z "$FILESYSTEMS_DONE" ]; then
  1071. DIALOG --msgbox "${BOLD}Required filesystems were not configured, \
  1072. please do so before starting the installation.${RESET}" ${MSGBOXSIZE}
  1073. return 1
  1074. elif [ -z "$ROOTPASSWORD_DONE" ]; then
  1075. DIALOG --msgbox "${BOLD}The root password has not been configured, \
  1076. please do so before starting the installation.${RESET}" ${MSGBOXSIZE}
  1077. return 1
  1078. elif [ -z "$BOOTLOADER_DONE" ]; then
  1079. DIALOG --msgbox "${BOLD}The disk to install the bootloader has not been \
  1080. configured, please do so before starting the installation.${RESET}" ${MSGBOXSIZE}
  1081. return 1
  1082. fi
  1083. DIALOG --yesno "${BOLD}The following operations will be executed:${RESET}\n\n
  1084. ${BOLD}${TARGETFS}${RESET}\n
  1085. ${BOLD}${RED}WARNING: data on partitions will be COMPLETELY DESTROYED for new \
  1086. filesystems.${RESET}\n\n
  1087. ${BOLD}Do you want to continue?${RESET}" 20 80 || return
  1088. unset TARGETFS
  1089. # Create and mount filesystems
  1090. create_filesystems
  1091. # mount required fs
  1092. mount_filesystems
  1093. # If source not set use defaults.
  1094. if [ -z "$SOURCE_DONE" ]; then
  1095. enable_localsrc
  1096. fi
  1097. # Install required packages.
  1098. install_packages
  1099. DIALOG --infobox "Applying installer settings..." 4 60
  1100. # copy target fstab.
  1101. install -Dm644 $TARGET_FSTAB $TARGETDIR/etc/fstab
  1102. # set up keymap, locale, timezone, hostname and root passwd.
  1103. set_keymap
  1104. set_locale
  1105. set_timezone
  1106. set_hostname
  1107. set_rootpassword
  1108. # Copy /etc/skel files for root.
  1109. cp $TARGETDIR/etc/skel/.[bix]* $TARGETDIR/root
  1110. # network settings for target
  1111. if [ -n "$NETWORK_DONE" ]; then
  1112. local net=$(grep -E '^NETWORK.*' $CONF_FILE)
  1113. set -- ${net}
  1114. local dev=$2; local type=$3; local ip=$4; local gw=$5
  1115. local dns1=$6; local dns2=$7
  1116. if [ "$type" = "dhcp" ]; then
  1117. # if user had dhcp enabled, enable dhcpcd service for that device.
  1118. chroot $TARGETDIR systemctl enable dhcpcd.service >$LOG 2>&1
  1119. else
  1120. # static IP through dhcpcd.
  1121. mv $TARGETDIR/etc/dhcpcd.conf $TARGETDIR/etc/dhdpcd.conf.orig
  1122. echo "# Static IP configuration set by the void-installer for $dev." \
  1123. >$TARGETDIR/etc/dhcpcd.conf
  1124. echo "interface $dev" >>$TARGETDIR/etc/dhcpcd.conf
  1125. echo "static ip_address=$ip" >>$TARGETDIR/etc/dhcpcd.conf
  1126. echo "static routers=$gw" >>$TARGETDIR/etc/dhcpcd.conf
  1127. echo "static domain_name_servers=$dns1 $dns2" >>$TARGETDIR/etc/dhcpcd.conf
  1128. chroot $TARGETDIR systemctl enable dhcpcd.service >$LOG 2>&1
  1129. fi
  1130. fi
  1131. # install bootloader.
  1132. set_bootloader
  1133. sync && sync && sync
  1134. # unmount all filesystems.
  1135. umount_filesystems
  1136. # installed successfully.
  1137. DIALOG --yesno "${BOLD}Void Linux has been installed successfully!${RESET}\n
  1138. Do you want to reboot the system?" ${YESNOSIZE}
  1139. if [ $? -eq 0 ]; then
  1140. shutdown -r now
  1141. else
  1142. return
  1143. fi
  1144. }
  1145. enable_localsrc() {
  1146. # local and fallback to official remote.
  1147. echo "repositories = { /packages, http://xbps.nopcode.org/repos/current }" >/tmp/xbps.conf
  1148. }
  1149. enable_netsrc() {
  1150. # only remote.
  1151. echo "repositories = { http://xbps.nopcode.org/repos/current }" > /tmp/xbps.conf
  1152. }
  1153. menu_source() {
  1154. local src=
  1155. DIALOG --title " Select installation source " \
  1156. --menu "$MENULABEL" 8 70 0 \
  1157. "Local" "Packages from ISO image" \
  1158. "Network" "Packages from official remote reposity"
  1159. case "$(cat $ANSWER)" in
  1160. "Local") src="local"; enable_localsrc;;
  1161. "Network") src="net"; enable_netsrc; menu_network;;
  1162. *) return 1;;
  1163. esac
  1164. SOURCE_DONE=1
  1165. set_option SOURCE $src
  1166. }
  1167. menu() {
  1168. if [ -z "$DEFITEM" ]; then
  1169. DEFITEM="Keyboard"
  1170. fi
  1171. DIALOG --default-item $DEFITEM \
  1172. --extra-button --extra-label "Settings" \
  1173. --title " Void Linux installation menu " \
  1174. --menu "$MENULABEL" 10 70 0 \
  1175. "Keyboard" "Set system keyboard" \
  1176. "Source" "Set source installation" \
  1177. "Hostname" "Set system hostname" \
  1178. "Locale" "Set system locale" \
  1179. "Timezone" "Set system time zone" \
  1180. "RootPassword" "Set system root password" \
  1181. "BootLoader" "Set disk to install bootloader" \
  1182. "Partition" "Partition disk(s)" \
  1183. "Filesystems" "Configure filesystems and mount points" \
  1184. "Install" "Start installation with saved settings" \
  1185. "Exit" "Exit installation"
  1186. if [ $? -eq 3 ]; then
  1187. # Show settings
  1188. DIALOG --title "Saved settings for installation" --textbox $CONF_FILE 14 60
  1189. return
  1190. fi
  1191. case $(cat $ANSWER) in
  1192. "Keyboard") menu_keymap && [ -n "$KEYBOARD_DONE" ] && DEFITEM="Source";;
  1193. "Source") menu_source && [ -n "$SOURCE_DONE" ] && DEFITEM="Hostname";;
  1194. "Hostname") menu_hostname && [ -n "$HOSTNAME_DONE" ] && DEFITEM="Locale";;
  1195. "Locale") menu_locale && [ -n "$LOCALE_DONE" ] && DEFITEM="Timezone";;
  1196. "Timezone") menu_timezone && [ -n "$TIMEZONE_DONE" ] && DEFITEM="RootPassword";;
  1197. "RootPassword") menu_rootpassword && [ -n "$ROOTPASSWORD_DONE" ] && DEFITEM="BootLoader";;
  1198. "BootLoader") menu_bootloader && [ -n "$BOOTLOADER_DONE" ] && DEFITEM="Partition";;
  1199. "Partition") menu_partitions && [ -n "$PARTITIONS_DONE" ] && DEFITEM="Filesystems";;
  1200. "Filesystems") menu_filesystems && [ -n "$FILESYSTEMS_DONE" ] && DEFITEM="Install";;
  1201. "Install") menu_install;;
  1202. "Exit") DIE;;
  1203. *) DIALOG --yesno "Abort Installation?" ${YESNOSIZE} && DIE
  1204. esac
  1205. }
  1206. #
  1207. # main()
  1208. #
  1209. DIALOG --title "${BOLD}${RED} Enter the void ... ${RESET}" --msgbox "\n
  1210. Welcome to the Void Linux installation. A simple and minimal \
  1211. Linux distribution made from scratch and built from the source package tree \
  1212. available for XBPS, a new alternative binary package system.\n\n
  1213. The installation should be pretty straightforward, if you are in trouble \
  1214. please join us at ${BOLD}#xbps on irc.freenode.org${RESET}.\n\n
  1215. ${BOLD}http://www.voidlinux.eu${RESET}\n\n" 16 80
  1216. while true; do
  1217. menu
  1218. done
  1219. exit 0
  1220. # vim: set ts=4 sw=4 et: