#!/bin/bash #----------------------------------------------------------------------------- # Title: setup.sh # Date: 2020-05-31 # Version: 2.0 # Author: chris@cromer.cl # Options: #----------------------------------------------------------------------------- # Copyright 2020 Chris Cromer # Copyright 2019 Baho Utot #----------------------------------------------------------------------------- # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . #----------------------------------------------------------------------------- set -o errexit # exit if error...insurance ;) set -o nounset # exit if variable not initalized set +h # disable hashall #----------------------------------------------------------------------------- # Common variables PRGNAME=${0##*/} # Script name minus the path TOPDIR=${PWD} # This directory LFS=/mnt/lfs # Where LFS will be installed to PARENT=/usr/src/LFS-RPM # Where build system wil live SWAP_FILE_SIZE=1024 # Size of swap file in MB #----------------------------------------------------------------------------- # Common support functions function die { local _red="\\033[1;31m" local _normal="\\033[0;39m" [ -n "$*" ] && printf "${_red}$*${_normal}\n" false exit 1 } function msg { printf "%s\n" "${1}" return } function msg_line { printf "%s" "${1}" return } function msg_failure { local _red="\\033[1;31m" local _normal="\\033[0;39m" printf "${_red}%s${_normal}\n" "FAILURE" exit 2 } function msg_success { local _green="\\033[1;32m" local _normal="\\033[0;39m" printf "${_green}%s${_normal}\n" "SUCCESS" return } function msg_log { printf "\n%s\n\n" "${1}" >> ${_logfile} 2>&1 return } function end_run { local _green="\\033[1;32m" local _normal="\\033[0;39m" printf "${_green}%s${_normal}\n" "Run Complete - ${PRGNAME}" return } #----------------------------------------------------------------------------- # Local functions function _sanity { local size="" msg_line " Checking to see if running as root: " [ "$EUID" -ne 0 ] && die "You need be running as root for this script" msg_success msg_line " Checking if LFS variable is set: " [ -v LFS ] || die "LFS environment variable missing/not set" msg_success msg_line " Checking if ${LFS} is mounted: " mountpoint -q ${LFS} || die "${LFS} is not mounted" msg_success # check for swap space and add some in there is no swap size=$(free | grep 'Swap:' | tr -d ' ' | cut -d ':' -f2) case ${size} in "000") msg " Creating swap file: ${LFS}/swapfile: " dd if=/dev/zero of=${LFS}/swapfile status=progress bs=1M count=${SWAP_FILE_SIZE} chmod 600 ${LFS}/swapfile mkswap ${LFS}/swapfile swapon -v ${LFS}/swapfile msg_success ;; *) ;; esac return } function _chapter_3 { # 3. Packages and Patches # Introduction # All Packages # Needed Patches local i="" local list="" if [ ${PWD} != ${LFS}${PARENT} ]; then msg_line " Install build system: " [ -d ${LFS}/${PARENT} ] || install -dm 755 ${LFS}${PARENT} cp -ar ${TOPDIR}/BOOK ${LFS}${PARENT} cp -ar ${TOPDIR}/SOURCES ${LFS}${PARENT} cp -ar ${TOPDIR}/SPECS ${LFS}${PARENT} cp -a ${TOPDIR}/README ${LFS}${PARENT} cp -a ${TOPDIR}/*.sh ${LFS}${PARENT} chmod +x ${LFS}${PARENT}/*.sh msg_success fi # Create download list while IFS= read -r i; do list+="${i} " done < "${TOPDIR}/BOOK/wget-list" list+="ftp://anduin.linuxfromscratch.org/BLFS/popt/popt-1.16.tar.gz " list+="http://ftp.rpm.org/releases/rpm-4.15.x/rpm-4.15.1.tar.bz2 " list+="https://download.oracle.com/berkeley-db/db-5.3.28.tar.gz " list+="https://ftp.gnu.org/gnu/cpio/cpio-2.13.tar.bz2 " list+="https://ftp.gnu.org/gnu/wget/wget-1.20.3.tar.gz " for i in ${list}; do msg_line " Fetching: ${i}: " wget --quiet --no-clobber --no-check-certificate --continue --directory-prefix=${LFS}${PARENT}/SOURCES ${i} || die "${PRGNAME}: Error: ${i}: Fetching tarball" msg_success done # Create md5sum list while read i;do pushd ${LFS}${PARENT}/SOURCES > /dev/null 2>&1 printf "%s\n" "${i}" > md5sums msg_line " Verifying: ${i#*' '}: " md5sum --status -c md5sums && msg_success || msg_failure popd > /dev/null 2>&1 done < "${TOPDIR}/BOOK/md5sums" return } function _chapter_4 { # 4. Final Preparations # Introduction # Creating the $LFS/tools Directory # Adding the LFS User # Setting Up the Environment # About SBUs # About the Test Suites local target="" # Creating the $LFS/tools Directory msg_line " Checking for ${LFS}/tools directory: " [ -d ${LFS}/tools ] || install -dm 755 ${LFS}/tools msg_success msg_line " Checking for /tools symlink: " [ -h /tools ] || ln -s ${LFS}/tools / msg_success msg_line " Creating lfs user: " getent group lfs > /dev/null 2>&1 || groupadd lfs > /dev/null 2>&1 getent passwd lfs > /dev/null 2>&1 || useradd -c 'LFS user' -g lfs -m -k /dev/null -s /bin/bash lfs > /dev/null 2>&1 getent passwd lfs > /dev/null 2>&1 && passwd --delete lfs > /dev/null 2>&1 msg_success msg_line " Setting Up the Environment: " [ -d /home/lfs ] || install -dm 755 /home/lfs cat > /home/lfs/.bash_profile <<- EOF exec env -i HOME=/home/lfs TERM=${TERM} PS1='\u:\w\$ ' /bin/bash EOF cat > /home/lfs/.bashrc <<- EOF set +h umask 022 LFS=/mnt/lfs LC_ALL=POSIX LFS_TGT=$(uname -m)-lfs-${OSTYPE} PATH=/tools/bin:/bin:/usr/bin export LFS LC_ALL LFS_TGT PATH EOF chown -R lfs:lfs /home/lfs || die "${PRGNAME}: ${FUNCNAME}: FAILURE" chown -R lfs:lfs ${LFS} || die "${PRGNAME}: ${FUNCNAME}: FAILURE" msg_success return } #----------------------------------------------------------------------------- # Main line LIST="" LIST+="_sanity " # Sanity checks LIST+="_chapter_3 " # Chapter 3 Packages and Patches LIST+="_chapter_4 " # Chapter 4 Final Preparations for i in ${LIST};do ${i};done end_run