Created
October 31, 2017 15:33
-
-
Save DennisLfromGA/ea575097fee940b4432060bfc9323c71 to your computer and use it in GitHub Desktop.
chrx-install [chrx]
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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