installer.sh.in 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050
  1. #!/bin/sh
  2. #-
  3. # Copyright (c) 2012-2014 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. SYSTEMD_INIT=
  39. TARGETDIR=/mnt/target
  40. LOG=/dev/tty8
  41. CONF_FILE=/tmp/.void-installer.conf
  42. if [ ! -f $CONF_FILE ]; then
  43. touch -f $CONF_FILE
  44. fi
  45. ANSWER=$(mktemp -t vinstall-XXXXXXXX || exit 1)
  46. TARGET_FSTAB=$(mktemp -t vinstall-fstab-XXXXXXXX || exit 1)
  47. trap "DIE" INT TERM QUIT
  48. # disable printk
  49. if [ -w /proc/sys/kernel/printk ]; then
  50. echo 0 >/proc/sys/kernel/printk
  51. fi
  52. # Detect if this is an EFI system.
  53. if [ -e /sys/firmware/efi/systab ]; then
  54. EFI_SYSTEM=1
  55. fi
  56. # Detect if systemd is installed
  57. if [ "$(cat /proc/1/comm)" = "systemd" ]; then
  58. SYSTEMD_INIT=1
  59. fi
  60. # dialog colors
  61. BLACK="\Z0"
  62. RED="\Z1"
  63. GREEN="\Z2"
  64. YELLOW="\Z3"
  65. BLUE="\Z4"
  66. MAGENTA="\Z5"
  67. CYAN="\Z6"
  68. WHITE="\Z7"
  69. BOLD="\Zb"
  70. REVERSE="\Zr"
  71. UNDERLINE="\Zu"
  72. RESET="\Zn"
  73. # Properties shared per widget.
  74. MENULABEL="${BOLD}Use UP and DOWN keys to navigate \
  75. menus. Use TAB to switch between buttons and ENTER to select.${RESET}"
  76. MENUSIZE="14 60 0"
  77. INPUTSIZE="8 60"
  78. MSGBOXSIZE="8 70"
  79. YESNOSIZE="$INPUTSIZE"
  80. WIDGET_SIZE="10 70"
  81. DIALOG() {
  82. rm -f $ANSWER
  83. dialog --colors --keep-tite --no-shadow --no-mouse \
  84. --backtitle "${BOLD}${WHITE}Void Linux installation -- http://www.voidlinux.eu/ (@@MKLIVE_VERSION@@)${RESET}" \
  85. --cancel-label "Back" --aspect 20 "$@" 2>$ANSWER
  86. return $?
  87. }
  88. DIE() {
  89. rval=$1
  90. [ -z "$rval" ] && rval=0
  91. clear
  92. rm -f $ANSWER $TARGET_FSTAB
  93. # reenable printk
  94. if [ -w /proc/sys/kernel/printk ]; then
  95. echo 4 >/proc/sys/kernel/printk
  96. fi
  97. umount_filesystems
  98. exit $rval
  99. }
  100. set_option() {
  101. if grep -Eq "^${1}.*" $CONF_FILE; then
  102. sed -i -e "/^${1}.*/d" $CONF_FILE
  103. fi
  104. echo "${1} ${2}" >>$CONF_FILE
  105. }
  106. get_option() {
  107. echo $(grep -E "^${1}.*" $CONF_FILE|sed -e "s|${1}||")
  108. }
  109. show_disks() {
  110. local dev size sectorsize gbytes
  111. # IDE
  112. for dev in $(ls /sys/block|grep -E '^hd'); do
  113. if [ "$(cat /sys/block/$dev/device/media)" = "disk" ]; then
  114. # Find out nr sectors and bytes per sector;
  115. echo "/dev/$dev"
  116. size=$(cat /sys/block/$dev/size)
  117. sectorsize=$(cat /sys/block/$dev/queue/hw_sector_size)
  118. gbytes="$(($size * $sectorsize / 1024 / 1024 / 1024))"
  119. echo "size:${gbytes}GB;sector_size:$sectorsize"
  120. fi
  121. done
  122. # SATA/SCSI and Virtual disks (virtio)
  123. for dev in $(ls /sys/block|grep -E '^([sv]|xv)d|mmcblk'); do
  124. echo "/dev/$dev"
  125. size=$(cat /sys/block/$dev/size)
  126. sectorsize=$(cat /sys/block/$dev/queue/hw_sector_size)
  127. gbytes="$(($size * $sectorsize / 1024 / 1024 / 1024))"
  128. echo "size:${gbytes}GB;sector_size:$sectorsize"
  129. done
  130. # cciss(4) devices
  131. for dev in $(ls /dev/cciss|grep -E 'c[0-9]d[0-9]$'); do
  132. echo "/dev/cciss/$dev"
  133. size=$(cat /sys/block/cciss\!$dev/size)
  134. sectorsize=$(cat /sys/block/cciss\!$dev/queue/hw_sector_size)
  135. gbytes="$(($size * $sectorsize / 1024 / 1024 / 1024))"
  136. echo "size:${gbytes}GB;sector_size:$sectorsize"
  137. done
  138. }
  139. show_partitions() {
  140. local dev fstype fssize p part
  141. set -- $(show_disks)
  142. while [ $# -ne 0 ]; do
  143. disk=$(basename $1)
  144. shift 2
  145. # ATA/SCSI/SATA
  146. for p in /sys/block/$disk/$disk*; do
  147. if [ -d $p ]; then
  148. part=$(basename $p)
  149. fstype=$(lsblk -nfr /dev/$part|awk '{print $2}'|head -1)
  150. [ "$fstype" = "iso9660" ] && continue
  151. [ "$fstype" = "crypto_LUKS" ] && continue
  152. [ "$fstype" = "LVM2_member" ] && continue
  153. fssize=$(lsblk -nr /dev/$part|awk '{print $4}'|head -1)
  154. echo "/dev/$part"
  155. echo "size:${fssize:-unknown};fstype:${fstype:-none}"
  156. fi
  157. done
  158. done
  159. # Software raid (md)
  160. for p in $(ls -d /dev/md* 2>/dev/null|grep '[0-9]'); do
  161. part=$(basename $p)
  162. if cat /proc/mdstat|grep -qw $part; then
  163. fstype=$(lsblk -nfr /dev/$part|awk '{print $2}')
  164. [ "$fstype" = "crypto_LUKS" ] && continue
  165. [ "$fstype" = "LVM2_member" ] && continue
  166. fssize=$(lsblk -nr /dev/$part|awk '{print $4}')
  167. echo "$p"
  168. echo "size:${fssize:-unknown};fstype:${fstype:-none}"
  169. fi
  170. done
  171. # cciss(4) devices
  172. for part in $(ls /dev/cciss|grep -E 'c[0-9]d[0-9]p[0-9]+'); do
  173. fstype=$(lsblk -nfr /dev/cciss/$part|awk '{print $2}')
  174. [ "$fstype" = "crypto_LUKS" ] && continue
  175. [ "$fstype" = "LVM2_member" ] && continue
  176. fssize=$(lsblk -nr /dev/cciss/$part|awk '{print $4}')
  177. echo "$part"
  178. echo "size:${fssize:-unknown};fstype:${fstype:-none}"
  179. done
  180. if [ -e /sbin/lvs ]; then
  181. # LVM
  182. lvs --noheadings|while read lvname vgname perms size; do
  183. echo "/dev/mapper/${vgname}-${lvname}"
  184. echo "size:${size};fstype:lvm"
  185. done
  186. fi
  187. }
  188. menu_filesystems() {
  189. local dev fstype fssize mntpoint reformat
  190. while true; do
  191. DIALOG --title " Select the partition to edit " --menu "$MENULABEL" \
  192. ${MENUSIZE} $(show_partitions)
  193. [ $? -ne 0 ] && return
  194. dev=$(cat $ANSWER)
  195. DIALOG --title " Select the filesystem type for $dev " \
  196. --menu "$MENULABEL" ${MENUSIZE} \
  197. "btrfs" "Oracle's Btrfs" \
  198. "ext2" "Linux ext2 (no journaling)" \
  199. "ext3" "Linux ext3 (journal)" \
  200. "ext4" "Linux ext4 (journal)" \
  201. "f2fs" "Flash-Friendly Filesystem" \
  202. "swap" "Linux swap" \
  203. "vfat" "FAT32" \
  204. "xfs" "SGI's XFS"
  205. if [ $? -eq 0 ]; then
  206. fstype=$(cat $ANSWER)
  207. else
  208. continue
  209. fi
  210. if [ "$fstype" != "swap" ]; then
  211. DIALOG --inputbox "Please specify the mount point for $dev:" ${INPUTSIZE}
  212. if [ $? -eq 0 ]; then
  213. mntpoint=$(cat $ANSWER)
  214. elif [ $? -eq 1 ]; then
  215. continue
  216. fi
  217. else
  218. mntpoint=swap
  219. fi
  220. DIALOG --yesno "Do you want to create a new filesystem on $dev?" ${YESNOSIZE}
  221. if [ $? -eq 0 ]; then
  222. reformat=1
  223. elif [ $? -eq 1 ]; then
  224. reformat=0
  225. else
  226. continue
  227. fi
  228. fssize=$(lsblk -nr $dev|awk '{print $4}')
  229. set -- "$fstype" "$fssize" "$mntpoint" "$reformat"
  230. if [ -n "$1" -a -n "$2" -a -n "$3" -a -n "$4" ]; then
  231. local bdev=$(basename $dev)
  232. local ddev=$(basename $(dirname $dev))
  233. if [ "$ddev" != "dev" ]; then
  234. sed -i -e "/^MOUNTPOINT \/dev\/${ddev}\/${bdev}.*/d" $CONF_FILE
  235. else
  236. sed -i -e "/^MOUNTPOINT \/dev\/${bdev}.*/d" $CONF_FILE
  237. fi
  238. echo "MOUNTPOINT $dev $1 $2 $3 $4" >>$CONF_FILE
  239. fi
  240. done
  241. }
  242. menu_partitions() {
  243. DIALOG --title " Select the disk to partition " \
  244. --menu "$MENULABEL" ${MENUSIZE} $(show_disks)
  245. if [ $? -eq 0 ]; then
  246. local device=$(cat $ANSWER)
  247. DIALOG --title "Modify Partition Table on $device" --msgbox "\n
  248. ${BOLD}cfdisk will be executed in disk $device.${RESET}\n\n
  249. For BIOS systems, MBR or GPT partition tables are supported.\n
  250. To use GPT on PC BIOS systems an empty partition of 1MB must be added\n
  251. at the first 2GB of the disk with the TOGGLE \`bios_grub' enabled.\n
  252. ${BOLD}NOTE: you don't need this on EFI systems.${RESET}\n\n
  253. For EFI systems GPT is mandatory and a FAT32 partition with at least\n
  254. 100MB must be created with the TOGGLE \`boot', this will be used as\n
  255. EFI System Partition. This partition must have mountpoint as \`/boot/efi'.\n\n
  256. At least 1 partitions is required for the rootfs (/).\n
  257. For swap, RAM*2 must be really enough. For / 600MB are required.\n\n
  258. ${BOLD}WARNING: /usr is not supported as a separate partition.${RESET}\n
  259. ${RESET}\n" 18 80
  260. if [ $? -eq 0 ]; then
  261. while true; do
  262. clear; cfdisk $device; PARTITIONS_DONE=1
  263. break
  264. done
  265. else
  266. return
  267. fi
  268. fi
  269. }
  270. menu_keymap() {
  271. if [ -n "$SYSTEMD_INIT" ]; then
  272. local _keymaps="$(localectl --no-pager list-keymaps)"
  273. else
  274. local _keymaps="$(find /usr/share/kbd/keymaps/ -type f -iname "*.map.gz" -printf "%f\n" | sed 's|.map.gz||g' | sort)"
  275. fi
  276. local _KEYMAPS=
  277. for f in ${_keymaps}; do
  278. _KEYMAPS="${_KEYMAPS} ${f} -"
  279. done
  280. while true; do
  281. DIALOG --title " Select your keymap " --menu "$MENULABEL" 14 70 14 ${_KEYMAPS}
  282. if [ $? -eq 0 ]; then
  283. set_option KEYMAP "$(cat $ANSWER)"
  284. loadkeys "$(cat $ANSWER)"
  285. KEYBOARD_DONE=1
  286. break
  287. else
  288. return
  289. fi
  290. done
  291. }
  292. set_keymap() {
  293. local KEYMAP=$(get_option KEYMAP)
  294. if [ -f /etc/vconsole.conf ]; then
  295. sed -i -e "s|KEYMAP=.*|KEYMAP=$KEYMAP|g" $TARGETDIR/etc/vconsole.conf
  296. else
  297. sed -i -e "s|#\?KEYMAP=.*|KEYMAP=$KEYMAP|g" $TARGETDIR/etc/rc.conf
  298. fi
  299. }
  300. menu_locale() {
  301. local _locales="$(grep -E '\.UTF-8' /etc/default/libc-locales|awk '{print $1}'|sed -e 's/^#//')"
  302. local _LOCALES=
  303. for f in ${_locales}; do
  304. _LOCALES="${_LOCALES} ${f} -"
  305. done
  306. while true; do
  307. DIALOG --title " Select your locale " --menu "$MENULABEL" 14 70 14 ${_LOCALES}
  308. if [ $? -eq 0 ]; then
  309. set_option LOCALE "$(cat $ANSWER)"
  310. LOCALE_DONE=1
  311. break
  312. else
  313. return
  314. fi
  315. done
  316. }
  317. set_locale() {
  318. if [ -f $TARGETDIR/etc/default/libc-locales ]; then
  319. local LOCALE=$(get_option LOCALE)
  320. sed -i -e "s|LANG=.*|LANG=$LOCALE|g" $TARGETDIR/etc/locale.conf
  321. # Uncomment locale from /etc/default/libc-locales and regenerate it.
  322. sed -e "/${LOCALE}/s/^\#//" -i $TARGETDIR/etc/default/libc-locales
  323. echo "Running xbps-reconfigure -f glibc-locales ..." >$LOG
  324. chroot $TARGETDIR xbps-reconfigure -f glibc-locales >$LOG 2>&1
  325. fi
  326. }
  327. menu_timezone() {
  328. if [ -n "$SYSTEMD_INIT" ]; then
  329. local _tzones="$(timedatectl --no-pager list-timezones)"
  330. else
  331. local _tzones="$(cd /usr/share/zoneinfo; find Africa/ America/ Antarctica/ Arctic/ Asia/ Atlantic/ Australia/ Europe/ Indian/ Pacific/ -type f | sort)"
  332. fi
  333. local _TIMEZONES=
  334. for f in ${_tzones}; do
  335. _TIMEZONES="${_TIMEZONES} ${f} -"
  336. done
  337. while true; do
  338. DIALOG --title " Select your timezone " --menu "$MENULABEL" 14 70 14 ${_TIMEZONES}
  339. if [ $? -eq 0 ]; then
  340. set_option TIMEZONE "$(cat $ANSWER)"
  341. TIMEZONE_DONE=1
  342. break
  343. else
  344. return
  345. fi
  346. done
  347. }
  348. set_timezone() {
  349. local TIMEZONE="$(get_option TIMEZONE)"
  350. if [ -z "$SYSTEMD_INIT" ]; then
  351. sed -i -e "s|#TIMEZONE=.*|TIMEZONE=$TIMEZONE|g" $TARGETDIR/etc/rc.conf
  352. else
  353. ln -sf /usr/share/zoneinfo/${TIMEZONE} $TARGETDIR/etc/localtime
  354. fi
  355. }
  356. menu_hostname() {
  357. while true; do
  358. DIALOG --inputbox "Set the machine hostname:" ${INPUTSIZE}
  359. if [ $? -eq 0 ]; then
  360. set_option HOSTNAME "$(cat $ANSWER)"
  361. HOSTNAME_DONE=1
  362. break
  363. else
  364. return
  365. fi
  366. done
  367. }
  368. set_hostname() {
  369. echo $(get_option HOSTNAME) > $TARGETDIR/etc/hostname
  370. }
  371. menu_rootpassword() {
  372. local _firstpass= _secondpass= _desc=
  373. while true; do
  374. if [ -n "${_firstpass}" ]; then
  375. _desc="Enter the root password again (password won't be displayed)"
  376. else
  377. _desc="Enter the root password (password won't be displayed)"
  378. fi
  379. DIALOG --passwordbox "${_desc}" ${MSGBOXSIZE}
  380. if [ $? -eq 0 ]; then
  381. if [ -z "${_firstpass}" ]; then
  382. _firstpass="$(cat $ANSWER)"
  383. else
  384. _secondpass="$(cat $ANSWER)"
  385. fi
  386. if [ -n "${_firstpass}" -a -n "${_secondpass}" ]; then
  387. if [ "${_firstpass}" != "${_secondpass}" ]; then
  388. DIALOG --infobox "Passwords do not match! please reenter it again" 6 80
  389. unset _firstpass _secondpass
  390. sleep 2 && continue
  391. fi
  392. set_option ROOTPASSWORD "${_firstpass}"
  393. ROOTPASSWORD_DONE=1
  394. break
  395. fi
  396. else
  397. return
  398. fi
  399. done
  400. }
  401. set_rootpassword() {
  402. echo "root:$(get_option ROOTPASSWORD)" | chpasswd -R $TARGETDIR -c SHA512
  403. }
  404. menu_bootloader() {
  405. while true; do
  406. DIALOG --title " Select the disk to install the bootloader" \
  407. --menu "$MENULABEL" ${MENUSIZE} $(show_disks) none "Manage bootloader otherwise"
  408. if [ $? -eq 0 ]; then
  409. set_option BOOTLOADER "$(cat $ANSWER)"
  410. BOOTLOADER_DONE=1
  411. break
  412. else
  413. return
  414. fi
  415. done
  416. }
  417. set_bootloader() {
  418. local dev=$(get_option BOOTLOADER) grub_args=
  419. if [ "$dev" = "none" ]; then return; fi
  420. # Check if it's an EFI system via efivars module.
  421. if [ -n "$EFI_SYSTEM" ]; then
  422. grub_args="--target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=void_grub --recheck"
  423. fi
  424. echo "Running grub-install $grub_args $dev..." >$LOG
  425. chroot $TARGETDIR grub-install $grub_args $dev >$LOG 2>&1
  426. if [ $? -ne 0 ]; then
  427. DIALOG --msgbox "${BOLD}${RED}ERROR:${RESET} \
  428. failed to install GRUB to $dev!\nCheck $LOG for errors." ${MSGBOXSIZE}
  429. DIE 1
  430. fi
  431. echo "Running grub-mkconfig on $TARGETDIR..." >$LOG
  432. chroot $TARGETDIR grub-mkconfig -o /boot/grub/grub.cfg >$LOG 2>&1
  433. if [ $? -ne 0 ]; then
  434. DIALOG --msgbox "${BOLD}${RED}ERROR${RESET}: \
  435. failed to run grub-mkconfig!\nCheck $LOG for errors." ${MSGBOXSIZE}
  436. DIE 1
  437. fi
  438. }
  439. test_network() {
  440. rm -f xtraeme.asc && \
  441. xbps-uhelper fetch http://repo.voidlinux.eu/live/xtraeme.asc >$LOG 2>&1
  442. if [ $? -eq 0 ]; then
  443. DIALOG --msgbox "Network is working properly!" ${MSGBOXSIZE}
  444. NETWORK_DONE=1
  445. return 1
  446. fi
  447. DIALOG --msgbox "Network is unaccessible, please setup it properly." ${MSGBOXSIZE}
  448. }
  449. configure_wifi() {
  450. local dev="$1" ssid enc pass _wpasupconf=/etc/wpa_supplicant/wpa_supplicant.conf
  451. DIALOG --form "Wireless configuration for ${dev}\n(encryption type: wep or wpa)" 0 0 0 \
  452. "SSID:" 1 1 "" 1 16 30 0 \
  453. "Encryption:" 2 1 "" 2 16 3 0 \
  454. "Password:" 3 1 "" 3 16 50 0 || return 1
  455. set -- $(cat $ANSWER)
  456. ssid="$1"; enc="$2"; pass="$3";
  457. if [ -z "$ssid" ]; then
  458. DIALOG --msgbox "Invalid SSID." ${MSGBOXSIZE}
  459. return 1
  460. elif [ -z "$enc" -o "$enc" != "wep" -a "$enc" != "wpa" ]; then
  461. DIALOG --msgbox "Invalid encryption type (possible values: wep or wpa)." ${MSXBOXSIZE}
  462. return 1
  463. elif [ -z "$pass" ]; then
  464. DIALOG --msgbox "Invalid AP password." ${MSGBOXSIZE}
  465. fi
  466. rm -f ${_wpasupconf%.conf}-${dev}.conf
  467. cp -f ${_wpasupconf} ${_wpasupconf%.conf}-${dev}.conf
  468. if [ "$enc" = "wep" ]; then
  469. echo "network={" >> ${_wpasupconf%.conf}-${dev}.conf
  470. echo " ssid=\"$ssid\"" >> ${_wpasupconf%.conf}-${dev}.conf
  471. echo " wep_key0=\"$pass\"" >> ${_wpasupconf%.conf}-${dev}.conf
  472. echo " wep_tx_keyidx=0" >> ${_wpasupconf%.conf}-${dev}.conf
  473. echo " auth_alg=SHARED" >> ${_wpasupconf%.conf}-${dev}.conf
  474. echo "}" >> ${_wpasupconf%.conf}-${dev}.conf
  475. else
  476. wpa_passphrase "$ssid" "$pass" >> ${_wpasupconf%.conf}-${dev}.conf
  477. fi
  478. configure_net_dhcp $dev
  479. return $?
  480. }
  481. configure_net() {
  482. local dev="$1" rval
  483. DIALOG --yesno "Do you want to use DHCP for $dev?" ${YESNOSIZE}
  484. rval=$?
  485. if [ $rval -eq 0 ]; then
  486. configure_net_dhcp $dev
  487. elif [ $rval -eq 1 ]; then
  488. configure_net_static $dev
  489. fi
  490. }
  491. iface_setup() {
  492. ip addr show dev $1|grep -q 'inet '
  493. return $?
  494. }
  495. configure_net_dhcp() {
  496. local dev="$1"
  497. iface_setup $dev
  498. if [ $? -eq 1 ]; then
  499. dhcpcd -t 10 -w -4 -L $dev -e "wpa_supplicant_conf=/etc/wpa_supplicant/wpa_supplicant-${dev}.conf" 2>&1 | tee $LOG | \
  500. DIALOG --progressbox "Initializing $dev via DHCP..." ${WIDGET_SIZE}
  501. if [ $? -ne 0 ]; then
  502. DIALOG --msgbox "${BOLD}${RED}ERROR:${RESET} failed to run dhcpcd. See $LOG for details." ${MSGBOXSIZE}
  503. return 1
  504. fi
  505. iface_setup $dev
  506. if [ $? -eq 1 ]; then
  507. DIALOG --msgbox "${BOLD}${RED}ERROR:${RESET} DHCP request failed for $dev. Check $LOG for errors." ${MSGBOXSIZE}
  508. return 1
  509. fi
  510. fi
  511. test_network
  512. if [ $? -eq 1 ]; then
  513. set_option NETWORK "${dev} dhcp"
  514. fi
  515. }
  516. configure_net_static() {
  517. local ip gw dns1 dns2 dev=$1
  518. DIALOG --form "Static IP configuration for $dev:" 0 0 0 \
  519. "IP address:" 1 1 "192.168.0.2" 1 21 20 0 \
  520. "Gateway:" 2 1 "192.168.0.1" 2 21 20 0 \
  521. "DNS Primary" 3 1 "8.8.8.8" 3 21 20 0 \
  522. "DNS Secondary" 4 1 "8.8.4.4" 4 21 20 0 || return 1
  523. set -- $(cat $ANSWER)
  524. ip=$1; gw=$2; dns1=$3; dns2=$4
  525. echo "running: ip link set dev $dev up" >$LOG
  526. ip link set dev $dev up >$LOG 2>&1
  527. if [ $? -ne 0 ]; then
  528. DIALOG --msgbox "${BOLD}${RED}ERROR:${RESET} Failed to bring $dev interface." ${MSGBOXSIZE}
  529. return 1
  530. fi
  531. echo "running: ip addr add $ip dev $dev"
  532. ip addr add $ip dev $dev >$LOG 2>&1
  533. if [ $? -ne 0 ]; then
  534. DIALOG --msgbox "${BOLD}${RED}ERROR:${RESET} Failed to set ip to the $dev interface." ${MSGBOXSIZE}
  535. return 1
  536. fi
  537. ip route add $gw dev $dev >$LOG 2>&1
  538. if [ $? -ne 0 ]; then
  539. DIALOG --msgbox "${BOLD}${RED}ERROR:${RESET} failed to setup your gateway." ${MSGBOXSIZE}
  540. return 1
  541. fi
  542. echo "nameserver $dns1" >/etc/resolv.conf
  543. echo "nameserver $dns2" >>/etc/resolv.conf
  544. test_network
  545. if [ $? -eq 1 ]; then
  546. set_option NETWORK "${dev} static $ip $gw $dns1 $dns2"
  547. fi
  548. }
  549. menu_network() {
  550. local dev addr f DEVICES
  551. for f in $(ls /sys/class/net); do
  552. [ "$f" = "lo" ] && continue
  553. addr=$(cat /sys/class/net/$f/address)
  554. DEVICES="$DEVICES $f $addr"
  555. done
  556. DIALOG --title " Select the network interface to configure " \
  557. --menu "$MENULABEL" ${MENUSIZE} ${DEVICES}
  558. if [ $? -eq 0 ]; then
  559. dev=$(cat $ANSWER)
  560. if $(echo $dev|egrep -q "^wl.*" 2>/dev/null); then
  561. configure_wifi $dev
  562. else
  563. configure_net $dev
  564. fi
  565. fi
  566. }
  567. validate_filesystems() {
  568. local mnts dev size fstype mntpt mkfs rootfound fmt
  569. local usrfound efi_system_partition
  570. unset TARGETFS
  571. mnts=$(grep -E '^MOUNTPOINT.*' $CONF_FILE)
  572. set -- ${mnts}
  573. while [ $# -ne 0 ]; do
  574. dev=$2; fstype=$3; size=$4; mntpt="$5"; mkfs=$6
  575. shift 6
  576. if [ "$mntpt" = "/" ]; then
  577. rootfound=1
  578. elif [ "$mntpt" = "/usr" ]; then
  579. usrfound=1
  580. elif [ "$fstype" = "vfat" -a "$mntpt" = "/boot/efi" ]; then
  581. efi_system_partition=1
  582. fi
  583. if [ "$mkfs" -eq 1 ]; then
  584. fmt="NEW FILESYSTEM: "
  585. fi
  586. if [ -z "$TARGETFS" ]; then
  587. TARGETFS="${fmt}$dev ($size) mounted on $mntpt as ${fstype}\n"
  588. else
  589. TARGETFS="${TARGETFS}${fmt}${dev} ($size) mounted on $mntpt as ${fstype}\n"
  590. fi
  591. done
  592. if [ -z "$rootfound" ]; then
  593. DIALOG --msgbox "${BOLD}${RED}ERROR:${RESET} \
  594. the mount point for the root filesystem (/) has not yet been configured." ${MSGBOXSIZE}
  595. return 1
  596. elif [ -n "$usrfound" ]; then
  597. DIALOG --msgbox "${BOLD}${RED}ERROR:${RESET} \
  598. /usr mount point has been configured but is not supported, please remove it to continue." ${MSGBOXSIZE}
  599. return 1
  600. elif [ -n "$EFI_SYSTEM" -a -z "$efi_system_partition" ]; then
  601. DIALOG --msgbox "${BOLD}${RED}ERROR:${RESET} \
  602. The EFI System Partition has not yet been configured, please create it\n
  603. as FAT32, mountpoint /boot/efi and at least with 100MB of size." ${MSGBOXSIZE}
  604. fi
  605. FILESYSTEMS_DONE=1
  606. }
  607. create_filesystems() {
  608. local mnts dev mntpt fstype fspassno mkfs size rv uuid
  609. mnts=$(grep -E '^MOUNTPOINT.*' $CONF_FILE)
  610. set -- ${mnts}
  611. while [ $# -ne 0 ]; do
  612. dev=$2; fstype=$3; mntpt="$5"; mkfs=$6
  613. shift 6
  614. # swap partitions
  615. if [ "$fstype" = "swap" ]; then
  616. swapoff $dev >/dev/null 2>&1
  617. if [ "$mkfs" -eq 1 ]; then
  618. mkswap $dev >$LOG 2>&1
  619. if [ $? -ne 0 ]; then
  620. DIALOG --msgbox "${BOLD}${RED}ERROR:${RESET} \
  621. failed to create swap on ${dev}!\ncheck $LOG for errors." ${MSGBOXSIZE}
  622. DIE 1
  623. fi
  624. fi
  625. swapon $dev >$LOG 2>&1
  626. if [ $? -ne 0 ]; then
  627. DIALOG --msgbox "${BOLD}${RED}ERROR:${RESET} \
  628. failed to activate swap on $dev!\ncheck $LOG for errors." ${MSGBOXSIZE}
  629. DIE 1
  630. fi
  631. # Add entry for target fstab
  632. uuid=$(blkid -o value -s UUID "$dev")
  633. echo "UUID=$uuid none swap sw 0 0" >>$TARGET_FSTAB
  634. continue
  635. fi
  636. if [ "$mkfs" -eq 1 ]; then
  637. case "$fstype" in
  638. btrfs) MKFS="mkfs.btrfs -f"; modprobe btrfs >$LOG 2>&1;;
  639. ext2) MKFS="mke2fs -F"; modprobe ext2 >$LOG 2>&1;;
  640. ext3) MKFS="mke2fs -F -j"; modprobe ext3 >$LOG 2>&1;;
  641. ext4) MKFS="mke2fs -F -t ext4"; modprobe ext4 >$LOG 2>&1;;
  642. f2fs) MKFS="mkfs.f2fs"; modprobe f2fs >$LOG 2>&1;;
  643. vfat) MKFS="mkfs.vfat -F32"; modprobe vfat >$LOG 2>&1;;
  644. xfs) MKFS="mkfs.xfs -f"; modprobe xfs >$LOG 2>&1;;
  645. esac
  646. DIALOG --infobox "Creating filesystem $fstype on $dev for $mntpt ..." 8 60
  647. echo "Running $MKFS $dev..." >$LOG
  648. $MKFS $dev >$LOG 2>&1; rv=$?
  649. if [ $rv -ne 0 ]; then
  650. DIALOG --msgbox "${BOLD}${RED}ERROR:${RESET} \
  651. failed to create filesystem $fstype on $dev!\ncheck $LOG for errors." ${MSGBOXSIZE}
  652. DIE 1
  653. fi
  654. fi
  655. # Mount rootfs the first one.
  656. [ "$mntpt" != "/" ] && continue
  657. mkdir -p $TARGETDIR
  658. echo "Mounting $dev on $mntpt ($fstype)..." >$LOG
  659. mount -t $fstype $dev $TARGETDIR >$LOG 2>&1
  660. if [ $? -ne 0 ]; then
  661. DIALOG --msgbox "${BOLD}${RED}ERROR:${RESET} \
  662. failed to mount $dev on ${mntpt}! check $LOG for errors." ${MSGBOXSIZE}
  663. DIE 1
  664. fi
  665. # Add entry to target fstab
  666. uuid=$(blkid -o value -s UUID "$dev")
  667. if [ "$fstype" = "f2fs" ]; then
  668. fspassno=0
  669. else
  670. fspassno=1
  671. fi
  672. echo "UUID=$uuid $mntpt $fstype defaults 0 $fspassno" >>$TARGET_FSTAB
  673. done
  674. # mount all filesystems in target rootfs
  675. mnts=$(grep -E '^MOUNTPOINT.*' $CONF_FILE)
  676. set -- ${mnts}
  677. while [ $# -ne 0 ]; do
  678. dev=$2; fstype=$3; mntpt="$5"
  679. shift 6
  680. [ "$mntpt" = "/" -o "$fstype" = "swap" ] && continue
  681. mkdir -p ${TARGETDIR}${mntpt}
  682. echo "Mounting $dev on $mntpt ($fstype)..." >$LOG
  683. mount -t $fstype $dev ${TARGETDIR}${mntpt} >$LOG 2>&1
  684. if [ $? -ne 0 ]; then
  685. DIALOG --msgbox "${BOLD}${RED}ERROR:${RESET} \
  686. failed to mount $dev on $mntpt! check $LOG for errors." ${MSGBOXSIZE}
  687. DIE
  688. fi
  689. # Add entry to target fstab
  690. uuid=$(blkid -o value -s UUID "$dev")
  691. echo "UUID=$uuid $mntpt $fstype defaults 0 2" >>$TARGET_FSTAB
  692. done
  693. }
  694. mount_filesystems() {
  695. for f in sys proc dev; do
  696. [ ! -d $TARGETDIR/$f ] && mkdir $TARGETDIR/$f
  697. echo "Mounting $TARGETDIR/$f..." >$LOG
  698. mount --bind /$f $TARGETDIR/$f >$LOG 2>&1
  699. done
  700. }
  701. umount_filesystems() {
  702. local f
  703. for f in sys/fs/fuse/connections sys proc dev; do
  704. echo "Unmounting $TARGETDIR/$f..." >$LOG
  705. umount $TARGETDIR/$f >$LOG 2>&1
  706. done
  707. local mnts="$(grep -E '^MOUNTPOINT.*$' $CONF_FILE)"
  708. set -- ${mnts}
  709. while [ $# -ne 0 ]; do
  710. local dev=$2; local fstype=$3; local mntpt=$5
  711. shift 6
  712. if [ "$fstype" = "swap" ]; then
  713. echo "Disabling swap space on $dev..." >$LOG
  714. swapoff $dev >$LOG 2>&1
  715. continue
  716. fi
  717. if [ "$mntpt" != "/" ]; then
  718. echo "Unmounting $TARGETDIR/$mntpt..." >$LOG
  719. umount $TARGETDIR/$mntpt >$LOG 2>&1
  720. fi
  721. done
  722. echo "Unmounting $TARGETDIR..." >$LOG
  723. umount $TARGETDIR >$LOG 2>&1
  724. }
  725. copy_rootfs() {
  726. DIALOG --title "Check $LOG for details" \
  727. --infobox "Copying live image to target rootfs, please wait ..." 4 60
  728. LANG=C cp -axvnu / $TARGETDIR >$LOG 2>&1
  729. if [ $? -ne 0 ]; then
  730. DIE 1
  731. fi
  732. }
  733. install_packages() {
  734. local _grub= _syspkg=
  735. if [ -n "$EFI_SYSTEM" ]; then
  736. _grub="grub-x86_64-efi"
  737. else
  738. _grub="grub"
  739. fi
  740. _syspkg="base-system"
  741. mkdir -p $TARGETDIR/var/db/xbps/keys $TARGETDIR/usr/share
  742. cp -a /usr/share/xbps.d $TARGETDIR/usr/share/
  743. cp /var/db/xbps/keys/*.plist $TARGETDIR/var/db/xbps/keys
  744. mkdir -p $TARGETDIR/boot/grub
  745. _arch=$(xbps-uhelper arch)
  746. stdbuf -oL env XBPS_ARCH=${_arch} \
  747. xbps-install -r $TARGETDIR -SyU ${_syspkg} ${_grub} 2>&1 | \
  748. DIALOG --title "Installing base system packages..." \
  749. --programbox 24 80
  750. if [ $? -ne 0 ]; then
  751. DIE 1
  752. fi
  753. xbps-reconfigure -r $TARGETDIR -f base-files >/dev/null 2>&1
  754. chroot $TARGETDIR xbps-reconfigure -a
  755. }
  756. enable_dhcpd() {
  757. if [ -n "$SYSTEMD_INIT" ]; then
  758. chroot $TARGETDIR systemctl enable dhcpcd.service >$LOG 2>&1
  759. else
  760. ln -s /etc/sv/dhcpcd $TARGETDIR/etc/runit/runsvdir/default/dhcpcd
  761. fi
  762. }
  763. menu_install() {
  764. # Don't continue if filesystems are not ready.
  765. validate_filesystems || return 1
  766. ROOTPASSWORD_DONE="$(get_option ROOTPASSWORD)"
  767. BOOTLOADER_DONE="$(get_option BOOTLOADER)"
  768. if [ -z "$FILESYSTEMS_DONE" ]; then
  769. DIALOG --msgbox "${BOLD}Required filesystems were not configured, \
  770. please do so before starting the installation.${RESET}" ${MSGBOXSIZE}
  771. return 1
  772. elif [ -z "$ROOTPASSWORD_DONE" ]; then
  773. DIALOG --msgbox "${BOLD}The root password has not been configured, \
  774. please do so before starting the installation.${RESET}" ${MSGBOXSIZE}
  775. return 1
  776. elif [ -z "$BOOTLOADER_DONE" ]; then
  777. DIALOG --msgbox "${BOLD}The disk to install the bootloader has not been \
  778. configured, please do so before starting the installation.${RESET}" ${MSGBOXSIZE}
  779. return 1
  780. fi
  781. DIALOG --yesno "${BOLD}The following operations will be executed:${RESET}\n\n
  782. ${BOLD}${TARGETFS}${RESET}\n
  783. ${BOLD}${RED}WARNING: data on partitions will be COMPLETELY DESTROYED for new \
  784. filesystems.${RESET}\n\n
  785. ${BOLD}Do you want to continue?${RESET}" 20 80 || return
  786. unset TARGETFS
  787. # Create and mount filesystems
  788. create_filesystems
  789. # If source not set use defaults.
  790. if [ "$(get_option SOURCE)" = "local" -o -z "$SOURCE_DONE" ]; then
  791. copy_rootfs
  792. . /etc/default/live.conf
  793. rm -f $TARGETDIR/etc/motd
  794. rm -f $TARGETDIR/etc/issue
  795. rm -f $TARGETDIR/usr/sbin/void-installer
  796. # Remove live user.
  797. echo "Removing $USERNAME live user from targetdir ..." >$LOG
  798. chroot $TARGETDIR userdel -r $USERNAME >$LOG 2>&1
  799. DIALOG --title "Check $LOG for details" \
  800. --infobox "Rebuilding initramfs for target ..." 4 60
  801. echo "Rebuilding initramfs for target ..." >$LOG
  802. # mount required fs
  803. mount_filesystems
  804. chroot $TARGETDIR dracut --no-hostonly --add-drivers "ahci" --force >>$LOG 2>&1
  805. DIALOG --title "Check $LOG for details" \
  806. --infobox "Removing temporary packages from target ..." 4 60
  807. echo "Removing temporary packages from target ..." >$LOG
  808. xbps-remove -r $TARGETDIR -Ry dialog >>$LOG 2>&1
  809. rmdir $TARGETDIR/mnt/target
  810. else
  811. # mount required fs
  812. mount_filesystems
  813. # network install, use packages.
  814. install_packages
  815. fi
  816. DIALOG --infobox "Applying installer settings..." 4 60
  817. # copy target fstab.
  818. install -Dm644 $TARGET_FSTAB $TARGETDIR/etc/fstab
  819. # Mount /tmp as tmpfs.
  820. echo "tmpfs /tmp tmpfs defaults,nosuid,nodev 0 0" >> $TARGETDIR/etc/fstab
  821. # set up keymap, locale, timezone, hostname and root passwd.
  822. set_keymap
  823. set_locale
  824. set_timezone
  825. set_hostname
  826. set_rootpassword
  827. # Copy /etc/skel files for root.
  828. cp $TARGETDIR/etc/skel/.[bix]* $TARGETDIR/root
  829. # network settings for target
  830. if [ -n "$NETWORK_DONE" ]; then
  831. local net="$(get_option NETWORK)"
  832. set -- ${net}
  833. local _dev="$1" _type="$2" _ip="$3" _gw="$4" _dns1="$5" _dns2="$6"
  834. if [ -z "$_type" ]; then
  835. # network type empty??!!!
  836. :
  837. elif [ "$_type" = "dhcp" ]; then
  838. if [ -f /etc/wpa_supplicant/wpa_supplicant-${_dev}.conf ]; then
  839. cp /etc/wpa_supplicant/wpa_supplicant-${_dev}.conf $TARGETDIR/etc/wpa_supplicant
  840. if [ -n "$SYSTEMD_INIT" ]; then
  841. chroot $TARGETDIR systemctl enable dhcpcd@${_dev}.service >$LOG 2>&1
  842. else
  843. ln -s /etc/sv/dhcpcd-${_dev} $TARGETDIR/etc/runit/runsvdir/default/dhcpcd-${_dev}
  844. fi
  845. else
  846. enable_dhcpd
  847. fi
  848. elif [ -n "$_dev" -a "$_type" = "static" ]; then
  849. # static IP through dhcpcd.
  850. mv $TARGETDIR/etc/dhcpcd.conf $TARGETDIR/etc/dhdpcd.conf.orig
  851. echo "# Static IP configuration set by the void-installer for $_dev." \
  852. >$TARGETDIR/etc/dhcpcd.conf
  853. echo "interface $_dev" >>$TARGETDIR/etc/dhcpcd.conf
  854. echo "static ip_address=$_ip" >>$TARGETDIR/etc/dhcpcd.conf
  855. echo "static routers=$_gw" >>$TARGETDIR/etc/dhcpcd.conf
  856. echo "static domain_name_servers=$_dns1 $_dns2" >>$TARGETDIR/etc/dhcpcd.conf
  857. enable_dhcpd
  858. fi
  859. fi
  860. # install bootloader.
  861. set_bootloader
  862. sync && sync && sync
  863. # unmount all filesystems.
  864. umount_filesystems
  865. # installed successfully.
  866. DIALOG --yesno "${BOLD}Void Linux has been installed successfully!${RESET}\n
  867. Do you want to reboot the system?" ${YESNOSIZE}
  868. if [ $? -eq 0 ]; then
  869. shutdown -r now
  870. else
  871. return
  872. fi
  873. }
  874. menu_source() {
  875. local src=
  876. DIALOG --title " Select installation source " \
  877. --menu "$MENULABEL" 8 70 0 \
  878. "Local" "Packages from ISO image" \
  879. "Network" "Packages from official remote reposity"
  880. case "$(cat $ANSWER)" in
  881. "Local") src="local";;
  882. "Network") src="net"; menu_network;;
  883. *) return 1;;
  884. esac
  885. SOURCE_DONE=1
  886. set_option SOURCE $src
  887. }
  888. menu() {
  889. if [ -z "$DEFITEM" ]; then
  890. DEFITEM="Keyboard"
  891. fi
  892. DIALOG --default-item $DEFITEM \
  893. --extra-button --extra-label "Settings" \
  894. --title " Void Linux installation menu " \
  895. --menu "$MENULABEL" 10 70 0 \
  896. "Keyboard" "Set system keyboard" \
  897. "Network" "Set up the network" \
  898. "Source" "Set source installation" \
  899. "Hostname" "Set system hostname" \
  900. "Locale" "Set system locale" \
  901. "Timezone" "Set system time zone" \
  902. "RootPassword" "Set system root password" \
  903. "BootLoader" "Set disk to install bootloader" \
  904. "Partition" "Partition disk(s)" \
  905. "Filesystems" "Configure filesystems and mount points" \
  906. "Install" "Start installation with saved settings" \
  907. "Exit" "Exit installation"
  908. if [ $? -eq 3 ]; then
  909. # Show settings
  910. cp $CONF_FILE /tmp/conf_hidden.$$;
  911. sed -i "s/^ROOTPASSWORD.*/ROOTPASSWORD <-hidden->/" /tmp/conf_hidden.$$
  912. DIALOG --title "Saved settings for installation" --textbox /tmp/conf_hidden.$$ 14 60
  913. rm /tmp/conf_hidden.$$
  914. return
  915. fi
  916. case $(cat $ANSWER) in
  917. "Keyboard") menu_keymap && [ -n "$KEYBOARD_DONE" ] && DEFITEM="Network";;
  918. "Network") menu_network && [ -n "$NETWORK_DONE" ] && DEFITEM="Source";;
  919. "Source") menu_source && [ -n "$SOURCE_DONE" ] && DEFITEM="Hostname";;
  920. "Hostname") menu_hostname && [ -n "$HOSTNAME_DONE" ] && DEFITEM="Locale";;
  921. "Locale") menu_locale && [ -n "$LOCALE_DONE" ] && DEFITEM="Timezone";;
  922. "Timezone") menu_timezone && [ -n "$TIMEZONE_DONE" ] && DEFITEM="RootPassword";;
  923. "RootPassword") menu_rootpassword && [ -n "$ROOTPASSWORD_DONE" ] && DEFITEM="BootLoader";;
  924. "BootLoader") menu_bootloader && [ -n "$BOOTLOADER_DONE" ] && DEFITEM="Partition";;
  925. "Partition") menu_partitions && [ -n "$PARTITIONS_DONE" ] && DEFITEM="Filesystems";;
  926. "Filesystems") menu_filesystems && [ -n "$FILESYSTEMS_DONE" ] && DEFITEM="Install";;
  927. "Install") menu_install;;
  928. "Exit") DIE;;
  929. *) DIALOG --yesno "Abort Installation?" ${YESNOSIZE} && DIE
  930. esac
  931. }
  932. if [ ! -x /bin/dialog ]; then
  933. echo "ERROR: missing dialog command, exiting..."
  934. exit 1
  935. fi
  936. #
  937. # main()
  938. #
  939. DIALOG --title "${BOLD}${RED} Enter the void ... ${RESET}" --msgbox "\n
  940. Welcome to the Void Linux installation. A simple and minimal \
  941. Linux distribution made from scratch and built from the source package tree \
  942. available for XBPS, a new alternative binary package system.\n\n
  943. The installation should be pretty straightforward, if you are in trouble \
  944. please join us at ${BOLD}#xbps on irc.freenode.org${RESET}.\n\n
  945. ${BOLD}http://www.voidlinux.eu${RESET}\n\n" 16 80
  946. while true; do
  947. menu
  948. done
  949. exit 0
  950. # vim: set ts=4 sw=4 et: