Skip to content

Instantly share code, notes, and snippets.

@DennisLfromGA
Created October 31, 2017 15:33
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save DennisLfromGA/ea575097fee940b4432060bfc9323c71 to your computer and use it in GitHub Desktop.
Save DennisLfromGA/ea575097fee940b4432060bfc9323c71 to your computer and use it in GitHub Desktop.
chrx-install [chrx]
#!/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' ;;
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)' ;;
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*) _x='NG|ARM|2017|Lenovo N23 Yoga/Flex 11 Chromebook' ;;
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' ;;
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='UN|APL|2017|Lenovo Thinkpad 11e/Yoga Chromebook (G4)' ;;
QUAWKS*) _x='FS|BYT|2014|ASUS Chromebook C300' ;;
REEF_???-C*) _x='UN|APL|2017|ASUS Chromebook C213NA' ;;
REEF*) _x='UN|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' ;;
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='UN|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" ;;
#*) _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 "$@"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment