#!/bin/bash set -e # exit on error set -o pipefail # exit on pipeline error set -u # treat unset variable as error #set -x SCRIPT_DIR="$(dirname "$(readlink -f "$0")")" CMD=(setup_host install_pkg finish_up) function help() { # if $1 is set, use $1 as headline message in help() if [ -z ${1+x} ]; then echo -e "This script builds Ubuntu from scratch" echo -e else echo -e $1 echo fi echo -e "Supported commands : ${CMD[*]}" echo -e echo -e "Syntax: $0 [start_cmd] [-] [end_cmd]" echo -e "\trun from start_cmd to end_end" echo -e "\tif start_cmd is omitted, start from first command" echo -e "\tif end_cmd is omitted, end with last command" echo -e "\tenter single cmd to run the specific command" echo -e "\tenter '-' as only argument to run all commands" echo -e exit 0 } function find_index() { local ret; local i; for ((i=0; i<${#CMD[*]}; i++)); do if [ "${CMD[i]}" == "$1" ]; then index=$i; return; fi done help "Command not found : $1" } function check_host() { if [ $(id -u) -ne 0 ]; then echo "This script should be run as 'root'" exit 1 fi export HOME=/root export LC_ALL=C } function setup_host() { echo "=====> running setup_host ..." echo "ubuntu-fs-live" > /etc/hostname # we need to install systemd first, to configure machine id apt-get update apt-get install -y libterm-readline-gnu-perl systemd-sysv #configure machine id dbus-uuidgen > /etc/machine-id ln -fs /etc/machine-id /var/lib/dbus/machine-id # don't understand why, but multiple sources indicate this dpkg-divert --local --rename --add /sbin/initctl ln -s /bin/true /sbin/initctl } function install_pkg() { echo "=====> running install_pkg ... will take a long time ..." apt-get -y upgrade # install live linux packages apt-get install -y \ ubuntu-standard \ casper \ lupin-casper \ discover \ laptop-detect \ os-prober \ network-manager \ resolvconf \ net-tools \ wireless-tools \ wpagui \ locales \ linux-generic # graphic installer - ubiquity apt-get install -y \ ubiquity \ ubiquity-casper \ ubiquity-frontend-gtk \ ubiquity-slideshow-ubuntu \ ubiquity-ubuntu-artwork # install graphics and desktop apt-get install -y \ plymouth-theme-ubuntu-logo \ ubuntu-gnome-desktop \ ubuntu-gnome-wallpapers # useful tools apt-get install -y \ clamav-daemon \ terminator \ apt-transport-https \ curl \ vim \ nano \ less # purge apt-get purge -y \ transmission-gtk \ transmission-common \ gnome-mahjongg \ gnome-mines \ gnome-sudoku \ aisleriot \ hitori # remove unused and clean up apt cache apt-get autoremove -y # final touch dpkg-reconfigure locales dpkg-reconfigure resolvconf # network manager cat < /etc/NetworkManager/NetworkManager.conf [main] rc-manager=resolvconf plugins=ifupdown,keyfile dns=dnsmasq [ifupdown] managed=false EOF dpkg-reconfigure network-manager apt-get clean -y } function finish_up() { echo "=====> finish_up" # truncate machine id (why??) truncate -s 0 /etc/machine-id # remove diversion (why??) rm /sbin/initctl dpkg-divert --rename --remove /sbin/initctl rm -rf /tmp/* ~/.bash_history } # ============= main ================ check_host # check number of args if [[ $# == 0 || $# > 3 ]]; then help; fi # loop through args dash_flag=false start_index=0 end_index=${#CMD[*]} for ii in "$@"; do if [[ $ii == "-" ]]; then dash_flag=true continue fi find_index $ii if [[ $dash_flag == false ]]; then start_index=$index else end_index=$(($index+1)) fi done if [[ $dash_flag == false ]]; then end_index=$(($start_index + 1)) fi # loop through the commands for ((ii=$start_index; ii<$end_index; ii++)); do ${CMD[ii]} done echo "$0 - Initial build is done!"