#!/bin/bash # # chrx-install # # chromebook unix installer # CHRX_VERSION="2.4.1" CHRX_OS_DISTRO="galliumos" CHRX_OS_ENVIRONMENT="desktop" CHRX_OS_RELEASE="latest" CHRX_OS_ARCH="amd64" CHRX_OS_MIRROR="primary" CHRX_TARGET_DISK="" CHRX_ADD_PKGS= CHRX_OS="linux" CHRX_HOSTNAME="chrx" CHRX_USERNAME="chrx" CHRX_LOCALE="en_US.UTF-8" CHRX_TZ="America/New_York" CHRX_CACHE_DIR="/var/cache/chrx" CHRX_INSTALL_ROOT="/tmp/chrxroot" VERBOSITY="" VERBOSITY_APTGET="-q" VERBOSITY_MKFS="-q" VERBOSITY_CURL="-#" VERBOSITY_DNF="" VERBOSITY_INSTALL="" CHRX_PROMPT_ENABLED=1 CHRX_NOTIFY_ENABLED=1 CHRX_CUSTOMIZATION_ENABLED=1 CHRX_CONFIGURE_GRUB_ENABLED= USAGE=" chrx installer, version ${CHRX_VERSION} Usage: $0 [ option ... ] Options -d DISTRIBUTION OS-specific distribution to install [${CHRX_OS_DISTRO}] galliumos, ubuntu, lubuntu, xubuntu, kubuntu, edubuntu, fedora -e ENVIRONMENT distribution-specific environment [${CHRX_OS_ENVIRONMENT}] galliumos: desktop ubuntu etc: desktop, minimal, standard, server fedora: desktop, workstation, kde, xfce, lxde, mate, cinnamon, sugar -r RELEASE distribution release number or name [${CHRX_OS_RELEASE}] galliumos: latest, 2.0, xenon, nightly ubuntu etc: latest, lts, dev, 16.04, 16.10, xenial, etc fedora: latest, 23, 24, 25 -a ARCH processor architecture (i386, amd64) [${CHRX_OS_ARCH}] -m MIRROR distribution-specific download mirror [${CHRX_OS_MIRROR}] galliumos: ny1.us, va1.us, ca1.us, rb1.fr -t TARGETDISK target disk (/dev/mmcblk1, /dev/sdb, etc) [${CHRX_TARGET_DISK}] -p PACKAGE additional packages to install, may repeat [${CHRX_ADD_PKGS}] kodi, minecraft, steam, etc, see chrx.org for more (not yet supported on fedora) -H HOSTNAME hostname for new system [${CHRX_HOSTNAME}] -U USERNAME username of first created user [${CHRX_USERNAME}] -L LOCALE locale for new system [${CHRX_LOCALE}] -Z TIMEZONE timezone for new system, Eggert convention [${CHRX_TZ}] America/San_Francisco, Europe/Amsterdam, Etc/UTC, etc -n disable success/failure notifications -s skip all customization, install stock OS only -y run non-interactively, take defaults and do not confirm -v increase output verbosity -h show this help Default values are shown in brackets, e.g.: [default]. If TARGETDISK is not specified, chrx will select the internal SSD. " ANSI_RED=$'\033[1;31m' ANSI_YEL=$'\033[1;33m' ANSI_GRN=$'\033[1;32m' ANSI_VIO=$'\033[1;35m' ANSI_BLU=$'\033[1;36m' ANSI_WHT=$'\033[1;37m' ANSI_RST=$'\033[0m' echo_cmd() { echo -e "${ANSI_BLU}${@}${ANSI_RST}"; } echo_note() { echo -e "${ANSI_YEL}${@}${ANSI_RST}"; } echo_info() { echo -e "${ANSI_GRN}${@}${ANSI_RST}"; } echo_prompt() { echo -e "${ANSI_WHT}${@}${ANSI_RST}"; } echo_warn() { echo -e "${ANSI_YEL}${@}${ANSI_RST}"; } echo_debug() { echo -e "${ANSI_VIO}${@}${ANSI_RST}"; } echo_fail() { echo -e "${ANSI_RED}${@}${ANSI_RST}"; } usage() { echo "${USAGE}"; exit; } eval_try() { #set +e local _cmd=$@ [ "$VERBOSE" ] && echo_cmd "$_cmd" eval $_cmd #set -e } eval_crit() { #set +e local _cmd=$@ [ "$VERBOSE" ] && echo_cmd "$_cmd" eval $_cmd rc=$? if [ "$rc" -ne 0 ]; then echo_fail "fatal: return code ${rc} from command \"${_cmd}\"" exit $rc fi #set -e } prompt_if_interactive() { ## TODO this would be better with passed (lexical) refs PROMPT_RESPONSE= if [ "${CHRX_PROMPT_ENABLED}" ]; then read PROMPT_RESPONSE else echo fi } ping_chrx_org() { msg=$1 [ "$2" ] && deviceinfo="(${2})" CHRX_UA="chrx/${CHRX_VERSION} hw=${CHRX_HWID}${deviceinfo} sw=${CHRX_OS},${CHRX_OS_DISTRO}-${CHRX_OS_ENVIRONMENT},${CHRX_OS_RELEASE:-"-"},${CHRX_OS_VERSION:-"(tbd)"},${CHRX_OS_ARCH}" if [ "${CHRX_NOTIFY_ENABLED}" ]; then curl -s -m 7 -A "${CHRX_UA}" http://ping.chrx.org/${msg} fi } downcase() { echo "$@" | tr '[:upper:]' '[:lower:]'; } # ref1, ref2 identify_hardware() { local _outvar_hwid=$1 local _outvar_desc=$2 local _outvar_year=$3 local _outvar_cpuf=$4 local _outvar_prognosis=$5 local _hwid_raw local _hwid local _prognosis local _desc local _cpuf local _year local _x _hwid_raw=$(crossystem hwid 2>/dev/null) [ "$_hwid_raw" ] || _hwid_raw=$(dmidecode -s system-product-name) _hwid=$(echo "$_hwid_raw" | head -1 | tr a-z A-Z | sed 's/ /_/g') case "$_hwid" in #TBD*) _x='UN|...|2015|Dell 11P' ;; ACER_ZGB*) _x='EF|PNV|2011|Acer AC700 Chromebook' ;; ARKHAM*) _x='NG|ARM|2015|ASUS OnHub SRT-AC1900 Router' ;; ASUKA*) _x='RS|SKL|2017|Dell Chromebook 13 (3380)' ;; BANJO*) _x='FS|BYT|2015|Acer Chromebook 15 (CB3-531)' ;; BANON*) _x='FS|BSW|2016|Acer Chromebook 15 (CB3-532)' ;; BIG*) _x='NG|ARM|2014|Acer Chromebook 13 (CB5-311)' ;; BLAZE*) _x='NG|ARM|2014|HP Chromebook 14 G3' ;; BOB*) _x='NG|ARM|2017|ASUS Chromebook Flip C101PA' ;; BUDDY*) _x='ES|BDW|2016|Acer Chromebase 24' ;; BUTTERFLY*) _x='UN|SNB|2013|HP Pavilion Chromebook 14' ;; CANDY*) _x='FS|BYT|2015|Dell Chromebook 11' ;; CAROLINE*) _x='RS|SKL|2017|Samsung Chromebook Pro' ;; CAVE*) _x='RS|SKL|2016|ASUS Chromebook Flip C302' ;; CELES*) _x='FS|BSW|2016|Samsung Chromebook 3' ;; CHELL*) _x='RS|SKL|2016|HP Chromebook 13 G1' ;; CLAPPER*) _x='FS|BYT|2014|Lenovo N20/N20P Chromebook' ;; CYAN*) _x='FS|BSW|2015|Acer Chromebook R11 (CB5-132T, C738T)' ;; EDGAR*) _x='FS|BSW|2016|Acer Chromebook 14 (CB3-431)' ;; ELM*) _x='NG|ARM|2016|Acer Chromebook R13 (CB5-312T)' ;; ENGUARDE_???-???-??A*) _x='FS|BYT|2014|CTL N6 Education Chromebook' ;; ENGUARDE_???-???-??B*) _x='FS|BYT|2014|M&A Chromebook' ;; ENGUARDE_???-???-??C*) _x='FS|BYT|2014|Senkatel C1101 Chromebook' ;; ENGUARDE_???-???-??D*) _x='FS|BYT|2014|Edxis Education Chromebook' ;; ENGUARDE_???-???-??E*) _x='FS|BYT|2015|Lenovo N21 Chromebook' ;; ENGUARDE_???-???-??F*) _x='FS|BYT|2016|RGS Education Chromebook' ;; ENGUARDE_???-???-??G*) _x='FS|BYT|2016|Crambo Chromebook' ;; ENGUARDE_???-???-??H*) _x='FS|BYT|2016|True IDC Chromebook' ;; ENGUARDE_???-???-??I*) _x='FS|BYT|2016|Videonet Chromebook' ;; ENGUARDE_???-???-??J*) _x='FS|BYT|2016|eduGear Chromebook R' ;; ENGUARDE_???-???-??K*) _x='FS|BYT|2016|ASI Chromebook' ;; ENGUARDE*) _x='FS|BYT|201x|(unknown ENGUARDE)' ;; EXPRESSO_???-???-??A*) _x='NG|ARM|2014|HEXA Chromebook Pi' ;; EXPRESSO_???-???-??B*) _x='NG|ARM|2014|Bobicus Chromebook 11' ;; EXPRESSO_???-???-??C*) _x='NG|ARM|2014|Edxis Chromebook' ;; EXPRESSO*) _x='NG|ARM|201x|(unknown EXPRESSO)' ;; EVE*) _x='UN|KBL|2017|Google Pixelbook' ;; FALCO*) _x='OK|HSW|2013|HP Chromebook 14' ;; FIEVEL*) _x='NG|ARM|2017|AOPEN Chromebox Mini' ;; GANDOF*) _x='OK|BDW|2015|Toshiba Chromebook 2 CB30/CB35' ;; GLIMMER*) _x='FS|BYT|2014|Lenovo ThinkPad 11e/Yoga Chromebook' ;; _GLIMMER*) _x='FS|BYT|2014|Lenovo ThinkPad Yoga Chromebook' ;; _GLIMMER*) _x='FS|BYT|2015|Lenovo Thinkpad 11e Chromebook' ;; GNAWTY_???-???-??A*) _x='FS|BYT|2014|Acer Chromebook 11 (CB3-111,C730,C730E)' ;; GNAWTY_???-???-??B*) _x='FS|BYT|2016|Acer Chromebook 11 (CB3-131,C735)' ;; GNAWTY*) _x='FS|BYT|201x|(unknown GNAWTY)' ;; GUADO*) _x='ES|BDW|2015|ASUS Chromebox CN62' ;; HANA_???-???-??A*) _x='NG|ARM|2017|Lenovo N23 Yoga/Flex 11 Chromebook' ;; HANA_???-???-??B*) _x='NG|ARM|2017|Poin2 Chromebook 14' ;; HANA*) _x='NG|ARM|2017|(unknown HANA)' ;; HELI*) _x='FS|BYT|2015|Haier Chromebook G2' ;; #HELI*) _x='FS|BYT|2015|Huaqin 11' ;; IEC_MARIO*) _x='UN|PNV|2011|Google Cr-48' ;; JAQ_???-???-???-A*) _x='NG|ARM|2015|Haier Chromebook 11' ;; JAQ_???-???-???-B*) _x='NG|ARM|2015|True IDC Chromebook 11' ;; JAQ_???-???-???-C*) _x='NG|ARM|2015|Xolo Chromebook' ;; JAQ_???-???-???-D*) _x='NG|ARM|2016|Medion Akoya S2013 Chromebook' ;; JAQ*) _x='NG|ARM|201x|(unknown JAQ)' ;; JERRY_???-???-???-A*) _x='NG|ARM|2015|HiSense Chromebook 11' ;; JERRY_???-???-???-B*) _x='NG|ARM|2015|CTL J2/J4 Chromebook for Education' ;; JERRY_???-???-???-C*) _x='NG|ARM|2015|Poin2 Chromebook 11' ;; JERRY_???-???-???-D*) _x='NG|ARM|2015|eduGear Chromebook K Series' ;; JERRY_???-???-???-E*) _x='NG|ARM|2016|NComputing Chromebook CX100/110' ;; JERRY_???-???-???-F*) _x='NG|ARM|2016|Epik Chromebook' ;; JERRY_???-???-???-G*) _x='NG|ARM|2017|Positivo Chromebook CH1190' ;; JERRY_???-???-???-H*) _x='NG|ARM|2016|Mecer Chromebook' ;; JERRY*) _x='NG|ARM|201x|(unknown JERRY)' ;; KEFKA_???-A*) _x='RS|BSW|2017|Dell Chromebook 11 (3180)' ;; KEFKA_???-B*) _x='RS|BSW|2017|Dell Chromebook 11 (3189)' ;; KEFKA*) _x='RS|BSW|2017|(unknown KEFKA)' ;; KEVIN*) _x='NG|ARM|2017|Samsung Chromebook Plus' ;; KIP_[ABC]*) _x='FS|BYT|2015|HP Chromebook 11 G3/G4' ;; KIP_[DE]*) _x='FS|BYT|2015|HP Chromebook 14 G4' ;; KIP*) _x='FS|BYT|201x|(unknown KIP)' ;; KITTY*) _x='NG|ARM|2015|Acer Chromebase' ;; LARS*) _x='RS|SKL|2016|Acer Chromebook 14 for Work' ;; LEON*) _x='OK|HSW|2014|Toshiba CB30/CB35 Chromebook' ;; LILI*) _x='RS|SKL|2017|Acer Chromebook 11 (C771, C771T)' ;; LINK*) _x='RS|IVB|2013|Google Chromebook Pixel' ;; X86_LINK*) _x='RS|IVB|2013|Google TEST Chromebook Pixel' ;; LULU*) _x='OK|BDW|2015|Dell Chromebook 13 (7310)' ;; LUMPY*) _x='UN|SNB|2012|Samsung Chromebook Series 5 550' ;; MCCLOUD*) _x='RS|HSW|2014|Acer Chromebox CXI' ;; MICKEY*) _x='NG|ARM|2015|ASUS Chromebit CS10' ;; MIGHTY_???-???-???-A*) _x='NG|ARM|2015|Haier Chromebook 11e' ;; MIGHTY_???-???-???-B*) _x='NG|ARM|2015|Nexian Chromebook' ;; MIGHTY_???-???-???-D*) _x='NG|ARM|2015|eduGear Chromebook M Series' ;; MIGHTY_???-???-???-E*) _x='NG|ARM|2015|Sector 5 E1 Rugged Chromebook' ;; MIGHTY_???-???-???-F*) _x='NG|ARM|2015|Viglen Chromebook 11' ;; MIGHTY_???-???-???-G*) _x='NG|ARM|2016|PCmerge Chromebook PCM-116E' ;; MIGHTY_???-???-???-H*) _x='NG|ARM|2016|Lumos Education Chromebook' ;; MIGHTY_???-???-???-I*) _x='NG|ARM|2016|MEDION Chromebook S2015' ;; MIGHTY_???-???-???-J*) _x='NG|ARM|2017|Prowise 11 Chromebook' ;; MIGHTY*) _x='NG|ARM|201x|(unknown MIGHTY)' ;; MINNIE*) _x='NG|ARM|2015|ASUS Chromebook Flip C100PA' ;; MONROE_?[23]?*) _x='ES|HSW|2014|LG Chromebase 22CV241' ;; MONROE_?4?*) _x='ES|HSW|2016|LG Chromebase 22CB25S' ;; MONROE*) _x='ES|HSW|201x|(unknown MONROE)' ;; NINJA*) _x='FS|BYT|2015|AOPEN Chromebox Commercial' ;; ORCO*) _x='FS|BYT|2015|Lenovo Ideapad 100S Chromebook' ;; PAINE*) _x='OK|BDW|2014|Acer Chromebook 11 (C740)' ;; PANTHER*) _x='RS|HSW|2014|ASUS Chromebox CN60' ;; PARROT*) _x='UN|IVB|2012|Acer C7 / C710 Chromebook' ;; X86_PARROT*) _x='UN|IVB|2012|Acer C7 / C710 TEST Chromebook' ;; PEPPY*) _x='OK|HSW|2013|Acer C720, C720P Chromebook' ;; X86_PEPPY*) _x='OK|HSW|2013|Acer C720, C720P TEST Chromebook' ;; PIT*) _x='NG|ARM|2014|Samsung Chromebook 2 (XE503C12)' ;; PI*) _x='NG|ARM|2014|Samsung Chromebook 2 (XE503C32)' ;; PYRO*) _x='FS|APL|2017|Lenovo Thinkpad 11e/Yoga Chromebook (G4)' ;; QUAWKS*) _x='FS|BYT|2014|ASUS Chromebook C300' ;; REEF_???-C*) _x='FS|APL|2017|ASUS Chromebook C213NA' ;; REEF*) _x='FS|APL|2017|Acer Chromebook Spin 11 (R751T)' ;; REKS_???-???-???-B*) _x='FS|BSW|2016|Lenovo N42 Chromebook' ;; REKS_???-???-???-C*) _x='FS|BSW|2017|Lenovo N23 Chromebook (Touch)' ;; REKS_???-???-???-D*) _x='FS|BSW|2017|Lenovo N23 Chromebook' ;; REKS_???-???-???-*) _x='FS|BSW|2016|Lenovo N22 Chromebook' ;; REKS*) _x='FS|BSW|2016|(unknown REKS)' ;; #RELM_???-A*) _x='FS|BSW|2016|n/a' ;; RELM_???-B*) _x='FS|BSW|2016|CTL NL61 Chromebook' ;; RELM_???-C*) _x='FS|BSW|2016|Edxis Education Chromebook' ;; RELM_???-F*) _x='FS|BSW|2016|Mecer V2 Chromebook' ;; RELM_???-G*) _x='FS|BSW|2016|HP Chromebook 11 G5 EE' ;; RELM_???-H*) _x='FS|BSW|2017|Acer Chromebook 11 N7 (C731)' ;; RELM_???-Z*) _x='FS|BSW|2016|Quanta OEM Chromebook' ;; RELM*) _x='FS|BSW|2016|(unknown RELM)' ;; RIKKU*) _x='ES|BDW|2015|Acer Chromebox CXI2' ;; SAMS_ALEX*) _x='EF|PNV|2011|Samsung Chromebook Series 5' ;; SAMUS*) _x='OK|BDW|2015|Google Chromebook Pixel' ;; SAND*) _x='FS|APL|2017|Acer Chromebook 15 CB515-1HT/1H' ;; SENTRY*) _x='RS|SKL|2016|Lenovo Thinkpad 13 Chromebook' ;; SETZER*) _x='FS|BSW|2016|HP Chromebook 11 G5/11-vxxx' ;; SKATE*) _x='NG|ARM|2013|HP Chromebook 11 G2' ;; SNAPPY*) _x='FS|APL|2017|HP Chromebook x360 11 G1 EE' ;; SNOW*) _x='NG|ARM|2012|Samsung Chromebook' ;; DAISY*) _x='NG|ARM|2012|Samsung Chromebook XE303C12 (SNOW)' ;; SPEEDY*) _x='NG|ARM|2015|ASUS Chromebook C201PA' ;; SPRING*) _x='NG|ARM|2013|HP Chromebook 11 G1' ;; SQUAWKS*) _x='FS|BYT|2014|ASUS Chromebook C200' ;; STOUT*) _x='UN|IVB|2013|Lenovo Thinkpad X131e Chromebook' ;; STUMPY*) _x='UN|SNB|2012|Samsung Chromebox Series 3' ;; SUMO*) _x='FS|BYT|2015|AOPEN Chromebase Commercial' ;; SWANKY*) _x='FS|BYT|2014|Toshiba Chromebook 2 CB30/CB35' ;; TERRA_???-???-???-A*) _x='FS|BSW|2016|ASUS Chromebook C202SA' ;; TERRA_???-???-???-B*) _x='FS|BSW|2016|ASUS Chromebook C300SA/C301SA' ;; TERRA*) _x='FS|BSW|2016|(unknown TERRA)' ;; TIDUS*) _x='ES|BDW|2015|Lenovo ThinkCentre Chromebox' ;; TIGER*) _x='NG|ARM|2017|AOPEN Chromebase Mini' ;; TRICKY*) _x='RS|HSW|2014|Dell Chromebox' ;; ULTIMA*) _x='FS|BSW|2016|Lenovo ThinkPad 11e/Yoga Chromebook (G3)' ;; WHIRLWIND*) _x='NG|ARM|2015|TP-Link OnHub TGR1900 Router' ;; WINKY*) _x='FS|BYT|2014|Samsung Chromebook 2 (XE500C12)' ;; WIZPIG_???-???-??A*) _x='FS|BSW|2016|CTL Chromebook J5' ;; WIZPIG_???-???-??B*) _x='FS|BSW|2016|Edugear CMT Chromebook' ;; WIZPIG_???-???-??C*) _x='FS|BSW|2016|Haier Convertible Chromebook 11 C' ;; WIZPIG_???-???-??D*) _x='FS|BSW|2016|Viglen Chromebook 360' ;; WIZPIG_???-???-??G*) _x='FS|BSW|2017|Prowise ProLine Chromebook' ;; WIZPIG_???-???-??H*) _x='FS|BSW|2016|PCMerge Chromebook PCM-116T-432B' ;; WIZPIG*) _x='FS|BSW|2016|(unknown WIZPIG)' ;; WOLF*) _x='RS|HSW|2014|Dell Chromebook 11' ;; X86_WOLF*) _x='RS|HSW|2014|Dell Chromebook 11' ;; YUNA*) _x='OK|BDW|2014|Acer Chromebook 15 (CB5-571, C910)' ;; AURON_YUNA*) _x='OK|BDW|2014|Acer Chromebook 15 (CB5-571, C910)' ;; ZAKO*) _x='RS|HSW|2014|HP Chromebox CB1/G1/for Meetings' ;; #*) _='|||' ;; esac _prognosis=`echo $_x | cut -d\| -f1` _cpuf=`echo $_x | cut -d\| -f2` _year=`echo $_x | cut -d\| -f3` _desc=`echo $_x | cut -d\| -f4-` ## CPU family, Processor core, other distinguishing characteristic case "$_cpuf" in ARM) _cpuf="ARM" ;; PNV) _cpuf="Intel Pineview" ;; SNB) _cpuf="Intel Sandy Bridge" ;; IVB) _cpuf="Intel Ivy Bridge" ;; HSW) _cpuf="Intel Haswell" ;; BYT) _cpuf="Intel Bay Trail" ;; BDW) _cpuf="Intel Broadwell" ;; BSW) _cpuf="Intel Braswell" ;; SKL) _cpuf="Intel Skylake" ;; APL) _cpuf="Intel Apollo Lake" ;; KBL) _cpuf="Intel Kaby Lake" ;; #*) _cpuf="(unrecognized)" ;; esac eval $_outvar_hwid=\$_hwid eval $_outvar_desc=\$_desc eval $_outvar_year=\$_year eval $_outvar_cpuf=\$_cpuf eval $_outvar_prognosis=\$_prognosis } get_os_version_and_core_url_dev_ubuntu() { release_log_fn="meta-release-development" release_log_url="http://changelogs.ubuntu.com/${release_log_fn}" release_log="`curl -s ${release_log_url}`" codename=`echo "${release_log}"|grep "^Dist: "|tail -1|awk '{print $2}'` CHRX_OS_VERSION=`echo "${release_log}"|grep "^Version: "|tail -1|awk '{print $2}'` CHRX_OS_CORE_IMAGE_URL="http://cdimage.ubuntu.com/ubuntu-base/daily/current/${codename}-base-${CHRX_OS_ARCH}.tar.gz" } get_os_version_ubuntu() { tag=$1 release_log_fn="meta-release" release_log_url="http://changelogs.ubuntu.com/${release_log_fn}" version_list="`curl -s ${release_log_url} | grep '^Version: '`" [ "$tag" = "lts" ] && version_list=`echo "${version_list}" | grep "LTS"` CHRX_OS_VERSION=`echo "${version_list}" | tail -1 | awk '{print $2}'` } determine_osv_ubuntu() { case "${CHRX_OS_RELEASE}" in trusty) CHRX_OS_VERSION="14.04.5" ;; utopic) CHRX_OS_VERSION="14.10" ;; vivid) CHRX_OS_VERSION="15.04" ;; wily) CHRX_OS_VERSION="15.10" ;; xenial) CHRX_OS_VERSION="16.04.2" ;; zesty) CHRX_OS_VERSION="16.10" ;; dev) get_os_version_and_core_url_dev_ubuntu $CHRX_OS_RELEASE ;; lts) get_os_version_ubuntu $CHRX_OS_RELEASE ;; latest) get_os_version_ubuntu $CHRX_OS_RELEASE ;; *) CHRX_OS_VERSION=${CHRX_OS_RELEASE} ;; esac local _ubuntu_corebase='base' case "${CHRX_OS_VERSION}" in '14.04'|'14.04.1'|'14.04.2'|'14.04.3'|'14.04.4') _ubuntu_corebase='core' msg_os_version="${ANSI_YEL}(CAUTION: not well-tested!)${ANSI_RST}" ;; "14.04.*") msg_os_version="${ANSI_YEL}(CAUTION: not well-tested!)${ANSI_RST}" ;; '14.10'|'15.04'|'15.10') msg_os_version="${ANSI_YEL}(ERROR: no longer available!)${ANSI_RST}" FAIL=1 ;; '16.04') _ubuntu_corebase='core' ;; "16.04.*") ;; '16.10') ;; *) if [ "`echo ${CHRX_OS_VERSION} | grep "^[0-9.][0-9.]*$"`" ]; then msg_os_version="${ANSI_YEL}(CAUTION: untested!)${ANSI_RST}" else msg_os_version="${ANSI_RED}(invalid!)${ANSI_RST}" FAIL=1 fi ;; esac if [ -z "${CHRX_OS_CORE_IMAGE_URL}" ]; then CHRX_OS_CORE_IMAGE_URL="http://cdimage.ubuntu.com/ubuntu-base/releases/${CHRX_OS_VERSION}/release/ubuntu-base-${CHRX_OS_VERSION}-${_ubuntu_corebase}-${CHRX_OS_ARCH}.tar.gz" fi } get_os_version_galliumos() { local _release=$1 CHRX_OS_VERSION="2.1" } get_mirror_url_galliumos() { local _mirror=$1 case "$_mirror" in #ny1.us) CHRX_OS_MIRROR="https://galliumos.org/releases" ;; va1.us) CHRX_OS_MIRROR="https://va1.us.mirror.galliumos.org/releases" ;; ca1.us) CHRX_OS_MIRROR="https://ca1.us.mirror.galliumos.org/releases" ;; rb1.fr) CHRX_OS_MIRROR="https://rb1.fr.mirror.galliumos.org/releases" ;; *) CHRX_OS_MIRROR="https://galliumos.org/releases" ;; esac echo "$CHRX_OS_MIRROR" } determine_osv_galliumos() { local _url_base=$(get_mirror_url_galliumos $CHRX_OS_MIRROR) local _url_path local _versions_file_url="${_url_base_primary}/VERSIONS" #versions_file="`curl -s ${versions_file_url}`" case "${CHRX_OS_RELEASE}" in '1.0'|vivid) CHRX_OS_VERSION="1.0" ;; '2.0') CHRX_OS_VERSION="2.0" ;; '2.1'|xenon) CHRX_OS_VERSION="2.1" ;; latest) get_os_version_galliumos $CHRX_OS_RELEASE ;; dev|nightly) CHRX_OS_VERSION="nightly" msg_os_version="${ANSI_YEL}(NOTE: nightly build!)${ANSI_RST}" _url_path="/nightly/galliumos-generic-coreimage-xenon-latest.tgz" CHRX_OS_CORE_IMAGE_URL="${_url_base}${_url_path}" ;; *) msg_os_version="${ANSI_YEL}(NOTE: unrecognized!)${ANSI_RST}" CHRX_OS_VERSION=${CHRX_OS_RELEASE} ;; esac if [ -z "${CHRX_OS_CORE_IMAGE_URL}" ]; then _url_path="/$CHRX_OS_VERSION/galliumos-generic-coreimage-$CHRX_OS_VERSION.tgz" CHRX_OS_CORE_IMAGE_URL="${_url_base}${_url_path}" fi case "${CHRX_OS_VERSION}" in '1.0') msg_os_version="${ANSI_YEL}(CAUTION: deprecated!)${ANSI_RST}" ;; '2.0') msg_os_version="${ANSI_YEL}(NOTE: newer version available)${ANSI_RST}" ;; '2.1') ;; esac } get_os_version_fedora() { release_log_url="http://dl.fedoraproject.org/pub/fedora/linux/releases/" version_list=$(curl -s ${release_log_url} | grep -Eo ">[0-9][0-9]/" | grep -o "[0-9][0-9]") CHRX_OS_VERSION=$(echo "${version_list}" | sort | tail -1) # default to 25 if [[ $CHRX_OS_VERSION != [0-9][0-9] ]]; then CHRX_OS_VERSION=25 fi } determine_osv_fedora() { msg_os_version="${ANSI_YEL}(CAUTION: chrx support is beta!)${ANSI_RST}" case "${CHRX_OS_RELEASE}" in latest) get_os_version_fedora ;; 24,25) CHRX_OS_VERSION=${CHRX_OS_RELEASE} ;; rawhide) CHRX_OS_VERSION=${CHRX_OS_RELEASE} msg_os_version="${ANSI_YEL}(CAUTION: development version; may not work!)${ANSI_RST}" ;; *) if [[ ${CHRX_OS_RELEASE} == [0-9][0-9] ]]; then CHRX_OS_VERSION=${CHRX_OS_RELEASE} msg_os_version="${ANSI_YEL}(CAUTION: untested!)${ANSI_RST}" else msg_os_version="${ANSI_RED}(invalid!)${ANSI_RST}" FAIL=1 fi ;; esac CHRX_OS_CORE_IMAGE_URL='https://download.fedoraproject.org/pub/fedora/linux/releases/25/Docker/x86_64/images/Fedora-Docker-Base-25-1.3.x86_64.tar.xz' } set_customizations_ubuntu() { SKEL_FILES=" etc/skel/.config/lxpanel/Lubuntu/config etc/skel/.config/lxpanel/Lubuntu/panels/panel etc/skel/.xbindkeysrc etc/skel/.xsessionrc " CONF_FILES=" etc/modprobe.d/ath9k.conf etc/modprobe.d/snd-hda-intel.conf etc/udev/rules.d/10-disable-ehci.rules etc/X11/xorg.conf etc/X11/xorg.conf.d/20-intel-graphics.conf etc/X11/xorg.conf.d/50-cyapa-touchpad.conf " EXEC_FILES=" etc/rc.local etc/initramfs-tools/scripts/init-top/unbind_ehci etc/pm/sleep.d/50-audio-intel-driver etc/pm/sleep.d/89-wifi-ath9k-module " #etc/init.d/chrx-firstboot APPENDED_FILES=" etc/sysctl.conf etc/systemd/logind.conf " set_hidden_partitions_conf CHRX_CONFIGURE_GRUB_ENABLED=1 } set_customizations_galliumos() { set_hidden_partitions_conf CHRX_CONFIGURE_GRUB_ENABLED=1 } set_customizations_fedora() { SKEL_FILES=" etc/skel/.xbindkeysrc etc/skel/.config/autostart/xbindkeys.desktop etc/skel/.config/autostart/chrx_touchpad_support.desktop " CONF_FILES=" etc/modprobe.d/ath9k.conf etc/modprobe.d/snd-hda-intel.conf etc/udev/rules.d/10-disable-ehci.rules etc/X11/xorg.conf.d/20-intel-graphics.conf etc/X11/xorg.conf.d/50-cyapa-touchpad.conf etc/X11/xorg.conf.d/70-synaptics.conf etc/selinux/config " EXEC_FILES=" etc/rc.local etc/initramfs-tools/scripts/init-top/unbind_ehci etc/pm/sleep.d/50-audio-intel-driver etc/pm/sleep.d/89-wifi-ath9k-module etc/skel/.local/bin/chrx_touchpad_support.sh " APPENDED_FILES=" etc/sysctl.conf etc/systemd/logind.conf " set_hidden_partitions_conf CHRX_CONFIGURE_GRUB_ENABLED= } set_hidden_partitions_conf() { local _rootdev=$(rootdev -d -s) case "$_rootdev" in "/dev/mmcblk0") CONF_FILES+="etc/udev/rules.d/99-hide-disks-mmc.rules " if [ "$CHRX_OS_DISTRO" = "fedora" ]; then CONF_FILES+="etc/dracut.conf.d/mmc.conf " fi ;; "/dev/sda") CONF_FILES+="etc/udev/rules.d/99-hide-disks-sda.rules " ;; *) echo_warn "unexpected root device \"$_rootdev\"" ;; esac } install_customizations() { echo_info "\nInstalling chrx customization files for ${CHRX_OS_DISTRO_DISPLAYNAME}." for fpath in ${CONF_FILES} ${EXEC_FILES} ${SKEL_FILES} ${APPENDED_FILES}; do if [ ! -d "${CHRX_INSTALL_ROOT}/`dirname ${fpath}`" ]; then #echo mkdir -p "${CHRX_INSTALL_ROOT}/`dirname ${fpath}`" install ${VERBOSITY_INSTALL} -d "${CHRX_INSTALL_ROOT}/`dirname ${fpath}`" fi done for fpath in ${SKEL_FILES}; do install ${VERBOSITY_INSTALL} -m 644 ./dist/${fpath} ${CHRX_INSTALL_ROOT}/${fpath} done for fpath in ${CONF_FILES}; do install ${VERBOSITY_INSTALL} -m 644 ./dist/${fpath} ${CHRX_INSTALL_ROOT}/${fpath} done for fpath in ${EXEC_FILES}; do install ${VERBOSITY_INSTALL} -m 755 ./dist/${fpath} ${CHRX_INSTALL_ROOT}/${fpath} done for fpath in ${APPENDED_FILES}; do cat ./dist/${fpath}-append >> ${CHRX_INSTALL_ROOT}/${fpath} done } report_unrecognized_device() { dmi_sm=`dmidecode -s system-manufacturer` dmi_pv=`dmidecode -s processor-version` cat <<- EOMSG ... You're running an unrecognized Chrome device! That's exciting. ... ... Inspecting your hardware reveals: ... hardware-id: ${CHRX_HWID-(unknown)} ... system-manufacturer: ${dmi_sm} ... processor-version: ${dmi_pv} ... ... Please take a moment to describe your device (manufacturer, ... model, country of sale) and we will add it to the database. ... ... Example: "Google, Chromebook Pixel, US" ... ... Thank you for your help. If you've already sent your device info, ... we apologize for the repeated requests. The database should be ... updated soon! ... ... (to skip, just enter a blank line) EOMSG echo_prompt "Please describe your device: \c" prompt_if_interactive if [ "${PROMPT_RESPONSE}" ]; then ping_chrx_org "unrecognized_device" "${dmi_sm}/${dmi_pv}/${PROMPT_RESPONSE}" echo "Thanks! We'll add your device to the database!" fi } check_support_for_legacy_boot() { echo_info "Checking hardware support for legacy boot... \c" if [ ! -x /usr/sbin/mosys ]; then echo_fail "ERROR" cat <<- EOMSG ${ANSI_RED} Can't find /usr/sbin/mosys. Make sure you are running the default developer mode Linux shell, logged in as chronos@localhost. ${ANSI_RST} EOMSG ping_chrx_org "fail_mosys" exit 1 fi if [ -z "`/usr/sbin/mosys eeprom map | grep RW_LEGACY`" ]; then echo_fail "ERROR" cat <<- EOMSG ${ANSI_RED} This Chrome device does not support CTRL-L Legacy SeaBIOS booting. You might have better luck with the old ChrUbuntu script. ${ANSI_RST} EOMSG ping_chrx_org "fail_rwlegacy" exit 1 else echo_info "OK" fi } setup_and_validate_environment() { if [ "`initctl status powerd | grep running 2>/dev/null`" ]; then initctl stop powerd > /dev/null 2>&1 fi ## prevent screen blanking whilst installing ## setterm --blank doesn't work in new VT2 shell, which claims xterm #export TERM=linux ## ? #setterm -blank 0 cat <<- EOMSG Hardware ID: ${CHRX_HWID} Model: ${CHRX_HWDESC-(unknown)} Released: ${CHRX_HWYEAR-(unknown)} CPU Family: ${CHRX_HWCPUF-(unknown)} EOMSG echo -e " Prognosis: \c" case "${CHRX_HWSTATUS}" in OK) echo_info "success likely, model is well-tested" ;; RS) echo_info "success likely, per field reports" ;; FS) echo_warn "success likely, ONLY IF FIRMWARE HAS BEEN UPDATED!" ;; ES) echo_warn "success likely, but unverified" ;; UN) echo_warn "uncertain; no field reports" ;; EF) echo_fail "failure likely, but unverified" ;; RF) echo_fail "failure likely, per field reports" ;; NG) echo_fail "FAILURE! cannot possibly succeed" ;; *) echo_warn "UNKNOWN, model is unrecognized and untested" ;; esac echo if [ -z "${CHRX_HWDESC}" ]; then report_unrecognized_device fi HOST_IS_CHROMEOS=$(grep "^CHROMEOS" /etc/lsb-release) if [ "$HOST_IS_CHROMEOS" ]; then check_support_for_legacy_boot else echo -e "Skipping legacy boot check, because this is not ChromeOS.\n" fi } setup_storage() { SETUP_STORAGE_ERROR="failed" curl -Os -A "${CHRX_UA}" ${CHRX_WEB_ROOT}/chrx-setup-storage [ -r ./chrx-setup-storage ] && . ./chrx-setup-storage if [ "${SETUP_STORAGE_ERROR}" ]; then echo_fail "fatal error from chrx-setup-storage. exiting!" exit 1 fi } validate_config() { ## validate config case "${CHRX_OS}" in linux) ;; *) msg_os="${ANSI_RED}invalid${ANSI_RST}" ; FAIL=1 ;; esac case "${CHRX_OS_DISTRO}" in ubuntu) CHRX_OS_DISTRO_DISPLAYNAME='Ubuntu' osv_method="ubuntu" customization_set="ubuntu" valid_envs="minimal,standard,desktop" ;; edubuntu) CHRX_OS_DISTRO_DISPLAYNAME='Edubuntu' osv_method="ubuntu" customization_set="ubuntu" valid_envs="server,desktop" ;; kubuntu) CHRX_OS_DISTRO_DISPLAYNAME='Kubuntu' osv_method="ubuntu" customization_set="ubuntu" valid_envs="desktop" ;; lubuntu) CHRX_OS_DISTRO_DISPLAYNAME='Lubuntu' osv_method="ubuntu" customization_set="ubuntu" valid_envs="desktop" ;; xubuntu) CHRX_OS_DISTRO_DISPLAYNAME='Xubuntu' osv_method="ubuntu" customization_set="ubuntu" valid_envs="desktop" ;; galliumos) CHRX_OS_DISTRO_DISPLAYNAME='GalliumOS' osv_method="galliumos" customization_set="galliumos" valid_envs="desktop" ;; fedora) CHRX_OS_DISTRO_DISPLAYNAME='Fedora' osv_method="fedora" customization_set="fedora" valid_envs="desktop,workstation,kde,xfce,lxde,mate,cinnamon,sugar,minimal,basic" ;; *) CHRX_OS_DISTRO_DISPLAYNAME='Unix/Linux' msg_os_dist="${ANSI_RED}invalid${ANSI_RST}" FAIL=1 ;; esac if [ -z "${FAIL}" -a -z "`echo ${valid_envs} | grep -w ${CHRX_OS_ENVIRONMENT}`" ]; then msg_os_env="${ANSI_RED}invalid${ANSI_RST}, try ${valid_envs}" FAIL=1 fi CHRX_OS_DISTENV="${CHRX_OS_DISTRO}-${CHRX_OS_ENVIRONMENT}" case "${osv_method}" in ubuntu) determine_osv_ubuntu ;; galliumos) determine_osv_galliumos ;; fedora) determine_osv_fedora ;; esac case "${customization_set}" in ubuntu) set_customizations_ubuntu ;; galliumos) set_customizations_galliumos ;; fedora) set_customizations_fedora ;; esac case "${CHRX_OS_ARCH}" in i386|amd64) ;; *) msg_os_arch="${ANSI_RED}invalid${ANSI_RST}" ; FAIL=1 ;; esac if [ "$CHRX_OS_DISTRO" != "galliumos" -a ! -z "$CHRX_OS_MIRROR" ]; then msg_os_mirror="${ANSI_RED}unknown, will use primary${ANSI_RST}" fi } confirm_config() { validate_config cat <<- EOCONFIG Installing operating system: ${CHRX_OS} ${msg_os} distribution (-d): ${CHRX_OS_DISTRO} ${msg_os_dist} environment (-e): ${CHRX_OS_ENVIRONMENT} ${msg_os_env} release (-r): ${CHRX_OS_RELEASE} ${msg_os_release} version: ${CHRX_OS_VERSION} ${msg_os_version} architecture (-a): ${CHRX_OS_ARCH} ${msg_os_arch} mirror (-m): ${CHRX_OS_MIRROR} ${msg_os_mirror} target_disk (-t): ${CHRX_TARGET_DISK} packages (-p): ${CHRX_ADD_PKGS}${msg_os_pkgs} System Configuration hostname (-H): ${CHRX_HOSTNAME} username (-U): ${CHRX_USERNAME} locale (-L): ${CHRX_LOCALE} timezone (-Z): ${CHRX_TZ} EOCONFIG if [ "${FAIL}" ]; then echo_fail "fatal error(s) in configuration options (see above). exiting!" exit 1 fi if [ -z "${CHRX_CUSTOMIZATION_ENABLED}" ]; then cat <<- EOMSG ${ANSI_YEL}\ .----------------------------------------------------------------. | NOTE: Installing stock OS only, skipping chrx customizations. | '----------------------------------------------------------------' ${ANSI_RST} EOMSG fi echo_note "Press [enter] to confirm and continue: \c" prompt_if_interactive } do_install() { start_date=`date` start_secs=`date +%s` if [ -z "${CHRX_OS_CORE_IMAGE_URL}" ]; then echo_fail "fatal: cannot determine core image URL from options specified. This might be a bug!" exit 1 fi echo_info "\nFetching ${CHRX_OS_DISTRO_DISPLAYNAME} core image file..." echo_info "HTTP GET ${CHRX_OS_CORE_IMAGE_URL}" ## "--retry 8 --continue-at -" opts won't help when piped to tar, and ## /tmp is only 1GB on some devices, so we have no good options here. ## TODO: add opts to other (non-piped) curl calls. case "${osv_method}" in galliumos|ubuntu) curl -o - ${VERBOSITY_CURL} ${CHRX_OS_CORE_IMAGE_URL} | tar xzp -C ${CHRX_INSTALL_ROOT} if [ ${PIPESTATUS[0]} -ne 0 -o ${PIPESTATUS[1]} -ne 0 ]; then echo_fail "fatal: unable to download and extract core image file." exit 1 fi ;; fedora) ## There is no good source of images for all versions of fedora, so ## pull in a docker image and use this to install a core version ## of fedora mkdir -p ${CHRX_INSTALL_ROOT}/fedora curl -L -o - ${VERBOSITY_CURL} ${CHRX_OS_CORE_IMAGE_URL} | tar xJp -C ${CHRX_INSTALL_ROOT}/fedora if [ ${PIPESTATUS[0]} -ne 0 -o ${PIPESTATUS[1]} -ne 0 ]; then echo_fail "fatal: unable to download and extract core image file." exit 1 fi tar xfp ${CHRX_INSTALL_ROOT}/fedora/*/layer.tar -C ${CHRX_INSTALL_ROOT}/fedora cat /etc/resolv.conf > ${CHRX_INSTALL_ROOT}/fedora/etc/resolv.conf eval_crit mount -o bind /proc ${CHRX_INSTALL_ROOT}/fedora/proc eval_crit mount -o bind /dev ${CHRX_INSTALL_ROOT}/fedora/dev eval_crit mount -o bind /dev/pts ${CHRX_INSTALL_ROOT}/fedora/dev/pts eval_crit mount -o bind /sys ${CHRX_INSTALL_ROOT}/fedora/sys eval_crit mount -o bind /run ${CHRX_INSTALL_ROOT}/fedora/run eval_crit mount -o bind ${CHRX_INSTALL_ROOT} ${CHRX_INSTALL_ROOT}/fedora/mnt echo_info "\nInstalling Fedora core packages..." chroot ${CHRX_INSTALL_ROOT}/fedora /bin/bash -c "dnf ${VERBOSITY_DNF} -y --nogpgcheck --releasever=${CHRX_OS_VERSION} --installroot=/mnt/ group install core" umount ${CHRX_INSTALL_ROOT}/fedora/mnt umount ${CHRX_INSTALL_ROOT}/fedora/proc umount ${CHRX_INSTALL_ROOT}/fedora/dev/pts umount ${CHRX_INSTALL_ROOT}/fedora/dev umount ${CHRX_INSTALL_ROOT}/fedora/sys umount ${CHRX_INSTALL_ROOT}/fedora/run rm -rf ${CHRX_INSTALL_ROOT}/fedora ;; esac eval_crit mount -o bind /proc ${CHRX_INSTALL_ROOT}/proc eval_crit mount -o bind /dev ${CHRX_INSTALL_ROOT}/dev eval_crit mount -o bind /dev/pts ${CHRX_INSTALL_ROOT}/dev/pts eval_crit mount -o bind /sys ${CHRX_INSTALL_ROOT}/sys eval_crit mount -o bind /run ${CHRX_INSTALL_ROOT}/run if [ -f /usr/bin/old_bins/cgpt ]; then cp /usr/bin/old_bins/cgpt ${CHRX_INSTALL_ROOT}/usr/bin/ else cp /usr/bin/cgpt ${CHRX_INSTALL_ROOT}/usr/bin/ fi chmod a+rx ${CHRX_INSTALL_ROOT}/usr/bin/cgpt ## The chroot needs a valid resolv.conf, so bring it over from ChromeOS ## cat in case resolv.conf is a symlink (e.g. into /run/resolvconf etc) ## sometimes /etc/resolv.conf is a dangling symlink, so fix parent dirs mkdir -p ${CHRX_INSTALL_ROOT}/run/resolvconf cat /etc/resolv.conf > ${CHRX_INSTALL_ROOT}/etc/resolv.conf echo ${CHRX_HOSTNAME} > ${CHRX_INSTALL_ROOT}/etc/hostname echo -e "\n127.0.0.1 ${CHRX_HOSTNAME}" >> ${CHRX_INSTALL_ROOT}/etc/hosts ## get customization files mkdir -p ${CHRX_INSTALL_ROOT}${CHRX_CACHE_DIR} cd ${CHRX_INSTALL_ROOT}${CHRX_CACHE_DIR} curl ${VERBOSITY_CURL} ${CHRX_WEB_ROOT}/dist.tar.gz | tar xz --no-same-owner if [ "${CHRX_CUSTOMIZATION_ENABLED}" ]; then install_customizations else echo_warn "\n(skipping installation of chrx customization files)" fi ## chroot export CHRX_OS_DISTRO CHRX_OS_ENVIRONMENT CHRX_OS_DISTENV export CHRX_CUSTOMIZATION_ENABLED export CHRX_OS_DISTRO_DISPLAYNAME CHRX_HWCPUF export CHRX_TZ CHRX_LOCALE CHRX_USERNAME export CHRX_TARGET_DISK CHRX_ROOT_PARTITION CHRX_CACHE_DIR CHRX_INSTALL_ROOT export CHRX_OS_RELEASE CHRX_ADD_PKGS CHRX_CONFIGURE_GRUB_ENABLED export VERBOSITY VERBOSITY_APTGET VERBOSITY_CURL VERBOSITY_DNF export ANSI_RED ANSI_YEL ANSI_GRN ANSI_VIO ANSI_BLU ANSI_WHT ANSI_RST export -f echo_info ## this does not reach the chroot install ${VERBOSITY_INSTALL} -m 755 ./dist/chrx-install-chroot ${CHRX_INSTALL_ROOT}${CHRX_CACHE_DIR} echo ">> entering chroot" chroot ${CHRX_INSTALL_ROOT} /bin/bash -c ${CHRX_CACHE_DIR}/chrx-install-chroot # | tee -a ${CHRX_LOGFILE} echo "<< exiting chroot" ## untested bits from ChrUbuntu ... TODO: test #if echo `crossystem hwid` | grep -q "^PANTHER "; then # echo_green "Fixing SeaBIOS on ASUS Chromebox" # echo_green "Thanks to John Lewis" # echo_green "http://johnlewis.ie/asus-chromebox-owners-rejoice/" # wget http://johnlewis.ie/asus-chromebox-SeaBIOS-new.bin # flashrom -w -i RW_LEGACY:asus-chromebox-SeaBIOS-new.bin #fi ## set eeprom bits #crossystem dev_boot_legacy=1 dev_boot_signed_only=1 [ "$HOST_IS_CHROMEOS" ] && crossystem dev_boot_legacy=1 ## wind up finish_date=`date` finish_secs=`date +%s` elapsed_time=$(( (${finish_secs}-${start_secs})/60 ))m$(( (${finish_secs}-${start_secs})%60 ))s cat <<- EOMSG ${ANSI_YEL}chrx installer is finished!${ANSI_RST} started: ${start_date} finished: ${finish_date} elapsed: ${elapsed_time} Installation log files will be preserved in ${CHRX_CACHE_DIR} After reboot, at the white "OS verification is OFF" screen, press: ${ANSI_YEL}CTRL-D${ANSI_RST} to boot ChromeOS, or ${ANSI_GRN}CTRL-L${ANSI_RST} to boot ${CHRX_OS_DISTRO_DISPLAYNAME}. Your login is: username: ${ANSI_WHT}${CHRX_USERNAME}${ANSI_RST} password: ${ANSI_WHT}${CHRX_USERNAME}${ANSI_RST} ${ANSI_RED}Be sure to change your password after log in!${ANSI_RST} EOMSG cp -r ${CHRX_CACHE0_DIR}/chrx-* ${CHRX_INSTALL_ROOT}${CHRX_CACHE_DIR}/ } parse_opts() { ## parse command line options ## TODO: lubuntu[-desktop[-latest]] should be parseable while getopts ":d:e:r:a:m:t:p:H:U:L:Z:nsyvh" OPTION do case "$OPTION" in d) CHRX_OS_DISTRO=$(downcase $OPTARG) ;; e) CHRX_OS_ENVIRONMENT=$(downcase $OPTARG) ;; r) CHRX_OS_RELEASE=$(downcase $OPTARG) ;; a) CHRX_OS_ARCH=$(downcase $OPTARG) ;; m) CHRX_OS_MIRROR=$(downcase $OPTARG) ;; t) CHRX_TARGET_DISK=$OPTARG ;; p) CHRX_ADD_PKGS="${CHRX_ADD_PKGS}$(downcase $OPTARG) " ;; H) CHRX_HOSTNAME=$OPTARG ;; U) CHRX_USERNAME=$OPTARG ;; L) CHRX_LOCALE=$OPTARG ;; Z) CHRX_TZ=$OPTARG ;; n) CHRX_NOTIFY_ENABLED= ;; s) CHRX_CUSTOMIZATION_ENABLED= ;; y) CHRX_PROMPT_ENABLED= ;; v) VERBOSITY="v" VERBOSITY_APTGET="" VERBOSITY_MKFS="" VERBOSITY_CURL="" VERBOSITY_DNF="-v" VERBOSITY_INSTALL="-v" ;; h) usage ;; '?') [ "$OPTARG" = "?" ] && usage echo_fail "unrecognized option: '-${OPTARG}'" ; exit 1 ;; esac done } main() { parse_opts "$@" echo_note "chrx installer, version ${CHRX_VERSION}\n" identify_hardware CHRX_HWID CHRX_HWDESC CHRX_HWYEAR CHRX_HWCPUF CHRX_HWSTATUS ping_chrx_org "begin" setup_and_validate_environment setup_storage confirm_config do_install ping_chrx_org "end_ok" echo_note "Press [enter] when ready to reboot: \c" prompt_if_interactive ## reboot without dropping user back to shell if [ -z "$CHRX_NO_REBOOT" ]; then reboot sleep 10 fi } #set -e main "$@"