#******************************************************************************* # Written by Thierry Nuttens # Copyright Thierry Nuttens 2010-2011-2012-2013-2014-2015-2016 # Installation script for the NuTyX system # Based on LFS scripts #******************************************************************************* # Function - boot_mesg() # # Purpose: Sending information from bootup scripts to the console # # Inputs: $1 is the message # $2 is the colorcode for the console # # Outputs: Standard Output # # Dependencies: - sed for parsing strings. # - grep for counting string length. # # Todo: #******************************************************************************* boot_mesg() { local ECHOPARM="" while true do case "${1}" in -n) ECHOPARM=" -n " shift 1 ;; -*) echo "Unknown Option: ${1}" return 1 ;; *) break ;; esac done ## Figure out the length of what is to be printed to be used ## for warning messages. STRING_LENGTH=$((${#1} + 1)) # Print the message to the screen ${ECHO} ${ECHOPARM} -e "${2}${1}" } boot_mesg_flush() { # Reset STRING_LENGTH for next message STRING_LENGTH="0" } boot_log() { # Left in for backwards compatibility : } echo_ok() { ${ECHO} -n -e "${CURS_UP}${SET_COL}${BRACKET}[${SUCCESS} OK ${BRACKET}]" ${ECHO} -e "${NORMAL}" boot_mesg_flush } echo_info() { ${ECHO} -n -e "${CURS_UP}${SET_COL}${BRACKET}[${INFO} INFO ${BRACKET}]" ${ECHO} -e "${NORMAL}" boot_mesg_flush } echo_failure() { ${ECHO} -n -e "${CURS_UP}${SET_COL}${BRACKET}[${FAILURE} FAIL ${BRACKET}]" ${ECHO} -e "${NORMAL}" boot_mesg_flush } echo_warning() { ${ECHO} -n -e "${CURS_UP}${SET_COL}${BRACKET}[${WARNING} WARN ${BRACKET}]" ${ECHO} -e "${NORMAL}" boot_mesg_flush } print_error_msg() { echo_failure ERREUR="yes" # $i is inherited by the rc script boot_mesg -n " FAILURE:\n\n You should not read this error.\n\n" ${FAILURE} boot_mesg -n " It means something went wrong with the installation" boot_mesg -n " of ${i} " boot_mesg_flush boot_mesg -n " Thanks to inform us" boot_mesg -n " via the website http://www.nutyx.org." boot_mesg " Thanks again for your collaboration.\n" boot_mesg_flush boot_mesg -n "Press Enter to continue..." ${INFO} boot_mesg "" ${NORMAL} read ENTER end exit 1 } #******************************************************************************* # Function - log_success_msg "message" # # Purpose: Print a success message # # Inputs: $@ - Message # # Outputs: Text output to screen # # Dependencies: echo # # Todo: logging # #******************************************************************************* log_success_msg() { ${ECHO} -n -e "${BOOTMESG_PREFIX}${@}" ${ECHO} -e "${SET_COL}""${BRACKET}""[""${SUCCESS}"" OK ""${BRACKET}""]""${NORMAL}" return 0 } #******************************************************************************* # Function - log_failure_msg "message" # # Purpose: Print a failure message # # Inputs: $@ - Message # # Outputs: Text output to screen # # Dependencies: echo # # Todo: logging # #******************************************************************************* log_failure_msg() { ${ECHO} -n -e "${BOOTMESG_PREFIX}${@}" ${ECHO} -e "${SET_COL}""${BRACKET}""[""${FAILURE}"" FAIL ""${BRACKET}""]""${NORMAL}" return 0 } #******************************************************************************* # Function - log_warning_msg "message" # # Purpose: print a warning message # # Inputs: $@ - Message # # Outputs: Text output to screen # # Dependencies: echo # # Todo: logging # #******************************************************************************* log_warning_msg() { ${ECHO} -n -e "${BOOTMESG_PREFIX}${@}" ${ECHO} -e "${SET_COL}""${BRACKET}""[""${WARNING}"" WARN ""${BRACKET}""]""${NORMAL}" return 0 } #******************************************************************************* # Function - unmountall # # Purpose: unmount all the mounted disks and partitions # # Inputs: $1 the full path of the Distro # # Outputs: Standard Output # # Dependencies: chroot # #******************************************************************************* unmountall() { if [ -d "$DEPOT_CD/depot" ]; then umount ${{FOLDER}/${DEPOT} umount `cat /tmp/depot` fi umount ${FOLDER}/run umount ${FOLDER}/dev/pts umount ${FOLDER}/dev umount ${FOLDER}/proc umount ${FOLDER}/sys } #******************************************************************************* # Function - setup_chroot # # Purpose: Enter the NuTyX Distribution # # Inputs: $1 the full path of the Distro # # Outputs: Standard Output # # Dependencies: chroot # #******************************************************************************* setup_chroot() { cp /etc/resolv.conf ${FOLDER}/etc/resolv.conf mount --bind /dev ${FOLDER}/dev mount -t devpts devpts ${FOLDER}/dev/pts mount -t proc proc ${FOLDER}/proc mount -t sysfs sysfs ${FOLDER}/sys mount -t tmpfs tmpfs ${FOLDER}/run if [ -h ${FOLDER}/dev/shm ]; then mkdir -p ${FOLDER}/$(readlink ${FOLDER}/dev/shm) fi } enter_chroot() { echo " ****************************** Chroot path: $DEVICE ******************************" chroot ${FOLDER} /usr/bin/env -i \ HOME=/root \ TERM="$TERM" \ PS1='\u:\w\$ ' \ /bin/bash --login } #******************************************************************************* # Function - install_pkg() # # Purpose: Install the selected package # # Inputs: $1 is the package # $2 is the group # $3 Option to install, normally nothing except for grub # Outputs: Standard Output # # Dependencies: - wget # - boot_mesg # - pkgadd # Todo: #******************************************************************************* install_pkg() { if $TMP/usr/bin/pkginfo -r $FOLDER -i| grep "^$1 " > /dev/null; then boot_mesg "$1 is already install on $DEVICE..." echo_info else packagefileToDownload=`getPackageName ${1}` boot_mesg "Downloading $1..." wget ${DEPOT_BASE}/${1}/$packagefileToDownload -O $TMP/$packagefileToDownload > /dev/null 2>&1 echo_info # Installing the package $TMP/usr/bin/pkgadd -r $FOLDER -i $packagefileToDownload || print_error_msg echo_ok fi } #******************************************************************************* # Function Check_DiskSpace # # Purpose: Check the Available space after the using amont # Inputs: $1: Mount point # $2: Amount in Kbytes going to be used # # Return: status: 0 when ok # 1 not ok # Todo: #******************************************************************************* check_diskspace() { # df|grep "$1"|awk '{print $4}' let MinSize=$2+100 let Amoung=`df|grep $FOLDER |awk '{print $(NF-2)}'`/1024 || exit 1 let Amoung=$Amoung-$MinSize status="0" if [ $Amoung -lt 0 ]; then echo "Not enough space for the installation" echo_failure status="1" else echo "Space remind after install: $Amoung Mbytes" echo_info fi if [ $status == "1" ]; then check_availablespace $1 echo "The installation needs $BaseInstall Mbytes minimum" end exit 1 fi } #******************************************************************************* # Function check_availablespace # # Purpose: Printout the Available space on the Mount point # # Inputs: $1: Mount point # # Output: Standard Output # # Todo: #******************************************************************************* check_availablespace() { let TotAmoung=`df|grep "$1"|awk '{print $4}'`/1024 || exit 1 echo "You have at the moment: ${TotAmoung} Mbytes on the destination disk" } error() { echo "" echo " $1" echo "" rm -rf $TMP exit 1 } end() { if [ "$ERREUR" == "yes" ]; then if [ ! -f $TMP/depot ]; then rm -r ${FOLDER}/${DEPOT} boot_mesg "Cleaning up temporary files.." boot_mesg "Please correct and start again" fi fi cd ~ unmountall $FOLDER > /dev/null 2>&1 rm -rf $TMP } #**************************************************************************** # Function expect # # Purpose: Check that the answer is nothing else then the supply # arguments # Inputs: $1: answer 1 # $2: answer 2 # $3: The question to ask # # Output: Standard Output # #**************************************************************************** expect(){ # echo -n "$3" # read answer while [ "$answer" != "o" ] && [ "$answer" != "n" ]; do echo -n "$3" read answer done } #**************************************************************************** # Function getPackageName # # Purpose: Get the fullname of the package # directory # Inputs: $1 is the package name # # Output: fullname of the archive without url # something like: cpio1414074943i686.cards.tar.xz #**************************************************************************** getPackageName() { local BUILD_DATE EXT HEAD wget ${DEPOT_BASE}/${1}/.PKGREPO -O $TMP/.PKGREPO > /dev/null 2>&1 HEAD=`head -1 $TMP/.PKGREPO` if [ "${HEAD:10:1}" == "#" ]; then BUILD_DATE="`echo $HEAD|cut -d "#" -f1`" EXT="`echo $HEAD|cut -d "#" -f2`" echo "${1}${BUILD_DATE}${ARCH}${EXT}" fi } install_base() { for i in \ nutyx acl attr bash bc binutils bzip2 coreutils curl \ diffutils expat file findutils flex gcc gdbm \ gettext glibc gmp gperf grep gzip inetutils kbd lzo \ libarchive libcap libpipeline mpc mpfr ncurses openssl pam \ procps-ng psmisc readline sed shadow util-linux xz zlib \ cards do install_pkg "$i" done } generate_blfs_bootscripts() { [ -f ${FOLDER}/etc/${FOLDER}/etc/blfs-bootscripts ] && return [ ! -d ${FOLDER}/etc ] && mkdir -pv ${FOLDER}/etc echo "scripts=blfs-bootscripts scriptsversion=20150924" > ${FOLDER}/etc/blfs-bootscripts } generate_etc_bashrc() { local FILE FILE="bashrc" [ -f ${FOLDER}/etc/$FILE ] && return [ ! -d ${FOLDER}/etc ] && mkdir -pv ${FOLDER}/etc if [ -f /etc/${INSTALL_COMMAND}.conf.d/$FILE ]; then cp /etc/${INSTALL_COMMAND}.conf.d/$FILE \ ${FOLDER}/etc/$FILE return fi cat > ${FOLDER}/etc/$FILE << "EOF" # Begin /etc/bashrc # Written for Beyond Linux From Scratch # by James Robertson # updated by Bruce Dubbs # System wide aliases and functions. # System wide environment variables and startup programs should go into # /etc/profile. Personal environment variables and startup programs # should go into ~/.bash_profile. Personal aliases and functions should # go into ~/.bashrc # Provides a colored /bin/ls command. Used in conjunction with code in # /etc/profile. alias ls='ls --color=auto' # Provides prompt for non-login shells, specifically shells started # in the X environment. [Review the LFS archive thread titled # PS1 Environment Variable for a great case study behind this script # addendum.] NORMAL="\[\e[0m\]" RED="\[\e[1;31m\]" GREEN="\[\e[1;32m\]" WHITE="\[\e[1;37m\]" INFOMACHINE="`date +%H:%M` `uname -m` `uname -r` `whoami`@`uname -n`" prompt_command() { # Sauvegarde de la pos courante tput sc # Calcul de la largeur let backwash=$(tput cols)-$(echo $INFOMACHINE | wc -m)-2 # Pos des curseurs à la position Y=0, X=longueur calculée tput cup 0 ${backwash} # Spécifie la couleur et la casse de la police tput setaf 4; tput bold # Affiche le chemin entre crochets echo -n "[" # Specifie la couleur du chemin tput setaf 6 # Affiche le chemin complet echo -n "$INFOMACHINE" tput setaf 4; tput bold # Affiche le crochet fermé echo -n "]" # Remet le curseur à sa place tput rc } PROMPT_COMMAND=prompt_command case $TERM in xterm|rxvt*) TITLEBAR='\[\033]0;\u@\h \007\]' ;; *) TITLEBAR='' ;; esac if [[ $EUID == 0 ]] ; then PS1="$TITLEBAR$RED\u [ $NORMAL\w$RED ]# $NORMAL" else PS1="$TITLEBAR$GREEN\u [ $NORMAL\w$GREEN ]\$ $NORMAL" fi # End /etc/bashrc EOF } generate_rc_site() { local FILE FILE="rc.site" [ -f ${FOLDER}/etc/sysconfig/$FILE ] && return [ ! -d ${FOLDER}/etc/sysconfig ] && mkdir -pv ${FOLDER}/etc/sysconfig if [ -f /etc/${INSTALL_COMMAND}.conf.d/$FILE ]; then cp /etc/${INSTALL_COMMAND}.conf.d/$FILE \ ${FOLDER}/etc/sysconfig/$FILE return fi cat > ${FOLDER}/etc/sysconfig/$FILE << "EOF" # rc.site [20:15 i686 3.18.11-NuTyX-iso thierry@nutyx] # Optional parameters for boot scripts. # Distro Information # These values, if specified here, override the defaults #DISTRO="Linux From Scratch" # The distro name #DISTRO_CONTACT="lfs-dev@linuxfromscratch.org" # Bug report address #DISTRO_MINI="LFS" # Short name used in filenames for distro config # Define custom colors used in messages printed to the screen # Please consult `man console_codes` for more information # under the "ECMA-48 Set Graphics Rendition" section # # Warning: when switching from a 8bit to a 9bit font, # the linux console will reinterpret the bold (1;) to # the top 256 glyphs of the 9bit font. This does # not affect framebuffer consoles # These values, if specified here, override the defaults #BRACKET="\\033[1;34m" # Blue #FAILURE="\\033[1;31m" # Red #INFO="\\033[1;36m" # Cyan #NORMAL="\\033[0;39m" # Grey #SUCCESS="\\033[1;32m" # Green #WARNING="\\033[1;33m" # Yellow # Use a colored prefix # These values, if specified here, override the defaults #BMPREFIX=" " #SUCCESS_PREFIX="${SUCCESS} * ${NORMAL}" #FAILURE_PREFIX="${FAILURE}*****${NORMAL}" #WARNING_PREFIX="${WARNING} *** ${NORMAL}" # Interactive startup #IPROMPT="yes" # Whether to display the interactive boot prompt #itime="3" # The amount of time (in seconds) to display the prompt # The total length of the distro welcome string, without escape codes #wlen=$(echo "Welcome to ${DISTRO}" | wc -c ) #welcome_message="Welcome to ${INFO}${DISTRO}${NORMAL}" # The total length of the interactive string, without escape codes #ilen=$(echo "Press 'I' to enter interactive startup" | wc -c ) #i_message="Press '${FAILURE}I${NORMAL}' to enter interactive startup" # Set scripts to skip the file system check on reboot #FASTBOOT=yes # Skip reading from the console #HEADLESS=yes # Write out fsck progress if yes #VERBOSE_FSCK=no # Speed up boot without waiting for settle in udev #OMIT_UDEV_SETTLE=y # Speed up boot without waiting for settle in udev_retry #OMIT_UDEV_RETRY_SETTLE=yes # Skip cleaning /tmp if yes #SKIPTMPCLEAN=no # For setclock #UTC=1 #CLOCKPARAMS= # For consolelog #LOGLEVEL=5 # For network #HOSTNAME=mylfs # Delay between TERM and KILL signals at shutdown #KILLDELAY=3 # Optional sysklogd parameters #SYSKLOGD_PARMS="-m 0" # Console parameters #UNICODE=1 #KEYMAP="de-latin1" #KEYMAP_CORRECTIONS="euro2" #FONT="lat0-16 -m 8859-15" #LEGACY_CHARSET= EOF } generate_udev_retry() { local FILE FILE="udev_retry" [ -f ${FOLDER}/etc/sysconfig/$FILE ] && return [ ! -d ${FOLDER}/etc/sysconfig ] && mkdir -pv ${FOLDER}/etc/sysconfig if [ -f /etc/${INSTALL_COMMAND}.conf.d/$FILE ]; then cp /etc/sysconfig/$FILE \ ${FOLDER}/etc/sysconfig/$FILE return fi cat > ${FOLDER}/etc/sysconfig/$FILE << "EOF" ######################################################################## # Begin /etc/sysconfig/udev_retry # # Description : udev_retry script configuration # # Authors : # # Version : 00.00 # # Notes : Each subsystem that may need to be re-triggered after mountfs # runs should be listed in this file. Probable subsystems to be # listed here are rtc (due to /var/lib/hwclock/adjtime) and sound # (due to both /var/lib/alsa/asound.state and /usr/sbin/alsactl). # Entries are whitespace-separated. ######################################################################## rtc # End /etc/sysconfig/udev_retry EOF } generate_createfiles() { local FILE FILE="createfiles" [ -f ${FOLDER}/etc/sysconfig/$FILE ] && return [ ! -d ${FOLDER}/etc/sysconfig ] && mkdir -pv ${FOLDER}/etc/sysconfig if [ -f /etc/${INSTALL_COMMAND}.conf.d/$FILE ]; then cp /etc/${INSTALL_COMMAND}.conf.d/$FILE \ ${FOLDER}/etc/sysconfig/$FILE return fi cat > ${FOLDER}/etc/sysconfig/$FILE << "EOF" ######################################################################## # Begin /etc/sysconfig/createfiles # # Description : Createfiles script config file # # Authors : # # Version : 00.00 # # Notes : The syntax of this file is as follows: # if type is equal to "file" or "dir" # # if type is equal to "dev" # # # # is the name of the file which is to be created # is either file, dir, or dev. # file creates a new file # dir creates a new directory # dev creates a new device # is either block, char or pipe # block creates a block device # char creates a character deivce # pipe creates a pipe, this will ignore the and # fields # and are the major and minor numbers used for # the device. ######################################################################## # End /etc/sysconfig/createfiles EOF } generate_modules() { local FILE FILE="modules" [ -f ${FOLDER}/etc/sysconfig/$FILE ] && return [ ! -d ${FOLDER}/etc/sysconfig ] && mkdir -pv ${FOLDER}/etc/sysconfig if [ -f /etc/${INSTALL_COMMAND}.conf.d/$FILE ]; then cp /etc/${INSTALL_COMMAND}.conf.d/$FILE \ ${FOLDER}/etc/sysconfig/$FILE return fi cat > ${FOLDER}/etc/sysconfig/$FILE << "EOF" ######################################################################## # Begin /etc/sysconfig/modules # # Description : Module auto-loading configuration # # Authors : # # Version : 00.00 # # Notes : The syntax of this file is as follows: # [ ...] # # Each module should be on its own line, and any options that you want # passed to the module should follow it. The line deliminator is either # a space or a tab. ######################################################################## # End /etc/sysconfig/modules EOF } generate_mouse() { local FILE FILE="mouse" [ -f ${FOLDER}/etc/$FILE ] && return [ ! -d ${FOLDER}/etc/sysconfig ] && mkdir -pv ${FOLDER}/etc/sysconfig if [ -f /etc/${INSTALL_COMMAND}.conf.d/$FILE ]; then cp /etc/${INSTALL_COMMAND}.conf.d/$FILE \ ${FOLDER}/etc/sysconfig/$FILE return fi cat > ${FOLDER}/etc/sysconfig/$FILE << "EOF" MDEVICE="/dev/input/mice" PROTOCOL="imps2" EOF } generate_inputrc() { local FILE FILE="inputrc" [ -f ${FOLDER}/etc/$FILE ] && return [ ! -d ${FOLDER}/etc ] && mkdir -pv ${FOLDER}/etc if [ -f /etc/${INSTALL_COMMAND}.conf.d/$FILE ]; then cp /etc/${INSTALL_COMMAND}.conf.d/$FILE \ ${FOLDER}/etc/$FILE return fi cat > ${FOLDER}/etc/$FILE << "EOF" # Begin /etc/inputrc # Modified by Chris Lynn # Allow the command prompt to wrap to the next line set horizontal-scroll-mode Off # Enable 8bit input set meta-flag On set input-meta On # Turns off 8th bit stripping set convert-meta Off # Keep the 8th bit for display set output-meta On # none, visible or audible set bell-style none # All of the following map the escape sequence of the value # contained in the 1st argument to the readline specific functions "\eOd": backward-word "\eOc": forward-word # for linux console "\e[1~": beginning-of-line "\e[4~": end-of-line "\e[5~": beginning-of-history "\e[6~": end-of-history "\e[3~": delete-char "\e[2~": quoted-insert # for xorg-term "\eOH": beginning-of-line "\eOF": end-of-line # for Konsole "\e[H": beginning-of-line "\e[F": end-of-line # End /etc/inputrc EOF } generate_hosts() { local FILE FILE="hosts" [ -f ${FOLDER}/etc/$FILE ] && return [ ! -d ${FOLDER}/etc ] && mkdir -pv ${FOLDER}/etc if [ -f /etc/${INSTALL_COMMAND}.conf.d/$FILE ]; then cp /etc/${INSTALL_COMMAND}.conf.d/$FILE \ ${FOLDER}/etc/$FILE return fi cat > ${FOLDER}/etc/$FILE << "EOF" # Begin /etc/hosts 127.0.0.1 localhost.localdomain localhost 127.0.0.1 nutyx # End /etc/hosts EOF } generate_shells() { local FILE FILE="shells" [ -f ${FOLDER}/etc/$FILE ] && return [ ! -d ${FOLDER}/etc ] && mkdir -pv ${FOLDER}/etc if [ -f /etc/${INSTALL_COMMAND}.conf.d/$FILE ]; then cp /etc/${INSTALL_COMMAND}.conf.d/$FILE \ ${FOLDER}/etc/$FILE return fi cat > ${FOLDER}/etc/$FILE << "EOF" # Begin /etc/shells /bin/sh /bin/bash # End /etc/shells EOF } generate_umask_sh() { local FILE FILE="umask.sh" [ -f ${FOLDER}/etc/profile.d/$FILE ] && return [ ! -d ${FOLDER}/etc/profile.d ] && mkdir -pv ${FOLDER}/etc/profile.d if [ -f /etc/${INSTALL_COMMAND}.conf.d/$FILE ]; then cp /etc/${INSTALL_COMMAND}.conf.d/$FILE \ ${FOLDER}/etc/profile.d/$FILE return fi cat > ${FOLDER}/etc/profile.d/$FILE << "EOF" # By default we want the umask to get set. if [ "$(id -gn)" = "$(id -un)" -a $EUID -gt 99 ] ; then umask 002 else umask 022 fi EOF } generate_readline_sh() { local FILE FILE="readline.sh" [ -f ${FOLDER}/etc/profile.d/$FILE ] && return [ ! -d ${FOLDER}/etc/profile.d ] && mkdir -pv ${FOLDER}/etc/profile.d if [ -f /etc/${INSTALL_COMMAND}.conf.d/$FILE ]; then cp /etc/${INSTALL_COMMAND}.conf.d/$FILE \ ${FOLDER}/etc/profile.d/$FILE return fi cat > ${FOLDER}/etc/profile.d/$FILE << "EOF" # Setup the INPUTRC environment variable. if [ -z "$INPUTRC" -a ! -f "$HOME/.inputrc" ] ; then INPUTRC=/etc/inputrc fi export INPUTRC EOF } generate_extrapaths_sh() { local FILE FILE="extrapaths.sh" [ -f ${FOLDER}/etc/profile.d/$FILE ] && return [ ! -d ${FOLDER}/etc/profile.d ] && mkdir -pv ${FOLDER}/etc/profile.d if [ -f /etc/${INSTALL_COMMAND}.conf.d/$FILE ]; then cp /etc/${INSTALL_COMMAND}.conf.d/$FILE \ ${FOLDER}/etc/profile.d/$FILE return fi cat > ${FOLDER}/etc/profile.d/$FILE << "EOF" if [ -d /usr/local/lib/pkgconfig ] ; then pathappend /usr/local/lib/pkgconfig PKG_CONFIG_PATH fi if [ -d /usr/local/bin ]; then pathprepend /usr/local/bin fi if [ -d /usr/local/sbin -a $EUID -eq 0 ]; then pathprepend /usr/local/sbin fi if [ -d ~/bin ]; then pathprepend ~/bin fi #if [ $EUID -gt 99 ]; then # pathappend . #fi EOF } generate_dircolors_sh() { local FILE FILE="dircolors.sh" [ -f ${FOLDER}/etc/profile.d/$FILE ] && return [ ! -d ${FOLDER}/etc/profile.d ] && mkdir -pv ${FOLDER}/etc/profile.d if [ -f /etc/${INSTALL_COMMAND}.conf.d/$FILE ]; then cp /etc/${INSTALL_COMMAND}.conf.d/$FILE \ ${FOLDER}/etc/profile.d/$FILE return fi cat > ${FOLDER}/etc/profile.d/$FILE << "EOF" # Setup for /bin/ls to support color, the alias is in /etc/bashrc. if [ -f "/etc/dircolors" ] ; then eval $(dircolors -b /etc/dircolors) if [ -f "$HOME/.dircolors" ] ; then eval $(dircolors -b $HOME/.dircolors) fi fi alias ls='ls --color=auto' EOF } generate_profile() { local FILE FILE="profile" [ -f ${FOLDER}/etc/$FILE ] && return [ ! -d ${FOLDER}/etc ] && mkdir -pv ${FOLDER}/etc if [ -f /etc/${INSTALL_COMMAND}.conf.d/$FILE ]; then cp /etc/${INSTALL_COMMAND}.conf.d/$FILE \ ${FOLDER}/etc/$FILE return fi cat > ${FOLDER}/etc/$FILE << "EOF" # Begin /etc/profile # Written for Beyond Linux From Scratch # by James Robertson # modifications by Dagmar d'Surreal # System wide environment variables and startup programs. # System wide aliases and functions should go in /etc/bashrc. Personal # environment variables and startup programs should go into # ~/.bash_profile. Personal aliases and functions should go into # ~/.bashrc. # Functions to help us manage paths. Second argument is the name of the # path variable to be modified (default: PATH) pathremove () { local IFS=':' local NEWPATH local DIR local PATHVARIABLE=${2:-PATH} for DIR in ${!PATHVARIABLE} ; do if [ "$DIR" != "$1" ] ; then NEWPATH=${NEWPATH:+$NEWPATH:}$DIR fi done export $PATHVARIABLE="$NEWPATH" } pathprepend () { pathremove $1 $2 local PATHVARIABLE=${2:-PATH} export $PATHVARIABLE="$1${!PATHVARIABLE:+:${!PATHVARIABLE}}" } pathappend () { pathremove $1 $2 local PATHVARIABLE=${2:-PATH} export $PATHVARIABLE="${!PATHVARIABLE:+${!PATHVARIABLE}:}$1" } export -f pathremove pathprepend pathappend # Set the initial path export PATH=/usr/bin:/bin:/usr/sbin:/sbin if [ $EUID -eq 0 ] ; then unset HISTFILE fi # Setup some environment variables. export HISTSIZE=1000 export HISTIGNORE="&:[bf]g:exit" # Set some defaults for graphical systems export XDG_DATA_DIRS=/usr/share/ export XDG_CONFIG_DIRS=/etc/xdg/ # Setup a red prompt for root and a green one for users. NORMAL="\[\e[0m\]" RED="\[\e[1;31m\]" GREEN="\[\e[1;32m\]" if [[ $EUID == 0 ]] ; then PS1="$RED\u [ $NORMAL\w$RED ]# $NORMAL" else PS1="$GREEN\u [ $NORMAL\w$GREEN ]\$ $NORMAL" fi for script in /etc/profile.d/*.sh ; do if [ -r $script ] ; then . $script fi done unset script RED GREEN NORMAL # End /etc/profile EOF } generate_group() { [ -f ${FOLDER}/etc/group ] && return [ ! -d ${FOLDER}/etc ] && mkdir -pv ${FOLDER}/etc cat > ${FOLDER}/etc/group << "EOF" root:x:0: bin:x:1: sys:x:2: kmem:x:3: tape:x:4: tty:x:5: daemon:x:6: floppy:x:7: disk:x:8: lp:x:9: dialout:x:10: audio:x:11:gdm video:x:12:gdm utmp:x:13: usb:x:14: cdrom:x:15: adm:x:16: atd:x:17: messagebus:x:18: lpadmin:x:19: named:x:20: gdm:x:21: fcron:x:22: www:x:24: apache:x:25: smmsp:x:26: polkitd:x:27: wheel:x:30:root exim:x:31: postfix:x:32: postdrop:x:33: mail:x:34: vmailman:x:35: news:x:36: kdm:x:37: mysql:x:40: postgres:x:41: dovecot:x:42: dovenull:x:43: ftp:x:45: proftpd:x:46: vsftpd:x:47: rsyncd:x:48: sshd:x:50: stunnel:x:51: svn:x:56: svntest:x:57: pulse:x:58: pulse-access:x:59: games:x:60: kvm:x:61: wireshark:x:62: lightdm:x:63: sddm:x:64: scanner:x:70: colord:x:71: vboxusers:x:80: ldap:x:83: avahi:x:84: avahi-autoipd:x:85: netdev:x:86: ntp:x:87: unbound:x:88: nogroup:x:99: users:x:999: EOF } generate_passwd() { [ -f ${FOLDER}/etc/passwd ] && return [ ! -d ${FOLDER}/etc ] && mkdir -pv ${FOLDER}/etc cat > ${FOLDER}/etc/passwd << "EOF" root::0:0:root:/root:/bin/bash bin:x:1:1:bin:/dev/null:/bin/false lp:x:9:9:Print Service User:/dev/null:/bin/false atd:x:17:17:add daemon:/dev/null:/bin/false messagebus:x:18:18:D-Bus Message Daemon User:/dev/null:/bin/false named:x:20:20:BIND Owner:/home/named:/bin/false gdm:x:21:21:GDM Daemon User:/var/lib/gdm:/bin/false fcron:x:22:22:Fcron User:/dev/null:/bin/false www:x:24:24:Nginx Server:/dev/null:bin/false apache:x:25:25:Apache Server:/dev/null:/bin/false smmsp:x:26:26:Sendmail Daemon:/dev/null:/bin/false polkitd:x:27:27:Policy Kit Daemon User:/etc/polkit-1:/bin/false exim:x:31:31:Exim Daemon:/dev/null:/bin/false postfix:x:32:32:Postfix Daemon User:/var/spool/postfix:/bin/false sendmail:x:34:34:Sendmail Daemon:/dev/null:/bin/false vmailman:x:35:35:Vmail Daemon:/dev/null:/bin/false news:x:36:36:News Daemon:/dev/null:/bin/false kdm:x:37:37:KDM Daemon Owner:/var/lib/kdm:/bin/false mysql:x:40:40:MySQL Server:/dev/null:/bin/false postgres:x:41:41:PostgreSQL Server:/srv/pgsql/data:/bin/bash dovecot:x:42:42:Dovecot unprivileged user:/dev/null:/bin/false dovenull:x:43:43:Dovecot login user:/dev/null:/bin/false ftp:x:45:45:anonymous_user:/home/ftp:/bin/false proftpd:x:46:46:proftpd:/srv/ftp:/usr/bin/proftpdshell vsftpd:x:47:47:vsftpd User:/dev/null:/bin/false rsyncd:x:48:48:rsyncd Daemon:/home/rsync:/bin/false sshd:x:50:50:sshd PrivSep:/var/lib/sshd:/bin/false stunnel:x:51:51:stunnel Daemon:/var/lib/stunnel:/bin/false svn:x:56:56:SVN Owner:/home/svn:/bin/false games:x:60:60:Games High Score Owner:/var/games:/bin/false lightdm:x:63:63:Light Display Manager:/var/lib/lightdm:/sbin/nologin sddm:x:64:64:Simple Desktop Display Manager:/var/lib/sddm:/bin/false colord:x:71:71:Color Daemon Owner:/var/lib/colord:/bin/false ldap:x:83:83:OpenLDAP Daemon Owner:/var/lib/openldap:/bin/false avahi:x:84:84:Avahi Daemon Owner:/var/run/avahi-daemon:/bin/false avahi-autoipd:x:85:85:Avahi autoip Daemon:/:/var/run/avahi-autoipd:/bin/false ntp:x:87:87:Network Time Protocol:/var/lib/ntp:/bin/false unbound:x:88:88:Unbound DNS resolver:/var/lib/unbound:/bin/false anonymous:x:98:99:Unprivileged User:/dev/null:/bin/false nobody:x:99:99:Unprivileged User:/dev/null:/bin/false EOF } generate_fstab() { local FILE FILE="fstab" [ -f ${FOLDER}/etc/$FILE ] && return [ ! -d ${FOLDER}/etc ] && mkdir -pv ${FOLDER}/etc if [ -f /etc/${INSTALL_COMMAND}.conf.d/$FILE ]; then cp /etc/${INSTALL_COMMAND}.conf.d/$FILE \ ${FOLDER}/etc/$FILE return fi cat > ${FOLDER}/etc/$FILE << "EOF" # Begin /etc/fstab # file system mount-point type options dump fsck # order # Exemple de montage nfs # 192.168.254.254:/home/thierry /home/thierry nfs rw,vers=3,_netdev,rsize=8192,wsize=8192 0 0 proc /proc proc nosuid,noexec,nodev 0 0 sysfs /sys sysfs nosuid,noexec,nodev 0 0 devpts /dev/pts devpts gid=5,mode=620 0 0 tmpfs /run tmpfs defaults 0 0 devtmpfs /dev devtmpfs mode=0755,nosuid 0 0 EOF } generate_dmrc() { local FILE FILE=".dmrc" [ -f ${FOLDER}/etc/skel/$FILE ] && return [ ! -d ${FOLDER}/etc/skel ] && mkdir -pv ${FOLDER}/etc/skel if [ -f /etc/${INSTALL_COMMAND}.conf.d/$FILE ]; then cp /etc/${INSTALL_COMMAND}.conf.d/$FILE \ ${FOLDER}/etc/skel/$FILE return fi cat > ${FOLDER}/etc/skel/$FILE << "EOF" [Desktop] Session=default EOF } generate_bashrc() { local FILE FILE=".bashrc" [ -f ${FOLDER}/etc/skel/$FILE ] && return [ ! -d ${FOLDER}/etc/skel ] && mkdir -pv ${FOLDER}/etc/skel if [ -f /etc/${INSTALL_COMMAND}.conf.d/$FILE ]; then cp /etc/${INSTALL_COMMAND}.conf.d/$FILE \ ${FOLDER}/etc/skel/$FILE return fi cat > ${FOLDER}/etc/skel/$FILE << "EOF" # Personal aliases and functions. # Personal environment variables and startup programs should go in # ~/.bash_profile. System wide environment variables and startup # programs are in /etc/profile. System wide aliases and functions are # in /etc/bashrc. if [ -f "/etc/bashrc" ] ; then source /etc/bashrc fi if [ $EUID -eq 0 ] ; then alias del='cards remove' alias get='cards install' alias up='cards install -u' alias check='cards sync;cards diff' else alias del='sudo cards remove' alias get='sudo cards install' alias up='sudo cards install -u' alias check='sudo cards sync;sudo cards diff' fi alias search='cards search' alias ll='ls -l' alias l='ls -alh' alias duh='du -h --max-depth=1' alias dfh='df -h' alias pkgfind='cards list | grep -i' # End ~/.bashrc EOF [ -f ${FOLDER}/root/$FILE ] && return [ ! -d ${FOLDER}/root ] && install -dv -m0750 ${FOLDER}/root cp -v ${FOLDER}/etc/skel/$FILE \ ${FOLDER}/root } generate_bash_profile() { local FILE FILE=".bash_profile" [ -f ${FOLDER}/etc/skel/$FILE ] && return [ ! -d ${FOLDER}/etc/skel ] && mkdir -pv ${FOLDER}/etc/skel if [ -f /etc/${INSTALL_COMMAND}.conf.d/$FILE ]; then cp /etc/${INSTALL_COMMAND}.conf.d/$FILE \ ${FOLDER}/etc/skel/$FILE return fi cat > ${FOLDER}/etc/skel/$FILE << "EOF" # Personal environment variables and startup programs. # Personal aliases and functions should go in ~/.bashrc. System wide # environment variables and startup programs are in /etc/profile. # System wide aliases and functions are in /etc/bashrc. append () { # First remove the directory local IFS=':' local NEWPATH for DIR in $PATH; do if [ "$DIR" != "$1" ]; then NEWPATH=${NEWPATH:+$NEWPATH:}$DIR fi done # Then append the directory export PATH=$NEWPATH:$1 } if [ -f "$HOME/.bashrc" ] ; then source $HOME/.bashrc fi # unset append # End ~/.bash_profile EOF [ ! -d ${FOLDER}/root ] && install -dv -m0750 ${FOLDER}/root [ -f ${FOLDER}/root/$FILE ] && return cp -v ${FOLDER}/etc/skel/$FILE \ ${FOLDER}/root } generate_pkgmk_conf() { local FILE FILE="pkgmk.conf" [ -f ${FOLDER}/etc/$FILE ] && return if [ -f /etc/${INSTALL_COMMAND}.conf.d/$FILE ]; then [ ! -d ${FOLDER}/etc ] && mkdir -pv ${FOLDER}/etc cp /etc/${INSTALL_COMMAND}.conf.d/$FILE \ ${FOLDER}/etc/$FILE fi } generate_cards_conf() { local FILE FILE="cards.conf" [ -f ${FOLDER}/etc/$FILE ] && return [ ! -d ${FOLDER}/etc ] && mkdir -pv ${FOLDER}/etc if [ -f /etc/${INSTALL_COMMAND}.conf.d/$FILE ]; then cp /etc/${INSTALL_COMMAND}.conf.d/$FILE \ ${FOLDER}/etc/$FILE return fi echo "## For kde5 # Comment following 2 lines # if you don't want to install kde5 # dir ${DEPOT}/kde5-extra|${URL} dir ${DEPOT}/kde5|${URL} ## ## For kde (4) # Comment following 2 lines # if you don't want to install kde (version4) # dir ${DEPOT}/kde-extra|${URL} dir ${DEPOT}/kde|${URL} # ## For cinnamon # Cinnamon is not yet ready to ude # Decomment following 2 lines # if you want to try cinnamon anyway # # dir ${DEPOT}/cinnamon-extra|${URL} # dir ${DEPOT}/cinnamon|${URL} # ## For Gnome # Comment following 2 lines # if you don't want to install gnome # dir ${DEPOT}/gnome-extra|${URL} dir ${DEPOT}/gnome|${URL} # ## For mate # Comment following 2 lines # if you don't want to install mate # dir ${DEPOT}/mate-extra|${URL} dir ${DEPOT}/mate|${URL} # ## For xfce4 # Comment following 2 lines # if you don't want to install xfce4 # dir ${DEPOT}/xfce4-extra|${URL} dir ${DEPOT}/xfce4|${URL} # ## For lxqt # Comment following 2 lines # if you don't want to install lxqt # dir ${DEPOT}/lxqt-extra|${URL} dir ${DEPOT}/lxqt|${URL} # ## For lxde # Comment following 2 lines # if you don't want to install lxde # dir ${DEPOT}/lxde-extra|${URL} dir ${DEPOT}/lxde|${URL} # ## Normally everything under this line # are needed stuffs # ## For all the graphical applications dir ${DEPOT}/gui-extra|${URL} # ## For a minimal graphical interface dir ${DEPOT}/gui|${URL} # ## For all the console applications dir ${DEPOT}/cli-extra|${URL} # ## For a minimal console interface dir ${DEPOT}/cli|${URL} # ## Strict minimum Base system to be able to boot on it dir ${DEPOT}/base-extra|${URL} # # Chroot system without reboot possibilities for a chroot dir ${DEPOT}/base|${URL} # ## Normaly you want to keep base and base ${DEPOT}/base # ## and base-extra base ${DEPOT}/base-extra # ## If you want to keep more collections remove comments below # Adjust to your needs # # base ${DEPOT}/cli # base ${DEPOT}/cli-extra # base ${DEPOT}/gui # base ${DEPOT}/gui-extra # base ${DEPOT}/..." > ${FOLDER}/etc/cards.conf } generate_nutyx_version() { local FILE FILE="nutyx-version" [ -f ${FOLDER}/var/lib/pkg/$FILE ] && return [ ! -d ${FOLDER}/var/lib/pkg ] && mkdir -pv ${FOLDER}/var/lib/pkg echo "name ${CODE_NAME} version $VERSION" > ${FOLDER}/var/lib/pkg/$FILE } install_resolv_conf() { [ -f /etc/resolv.conf ] && cp /etc/resolv.conf ${FOLDER}/etc } successfull_installation () { echo " **************************************************** * Installation of NuTyX $VERSION finished. * * * * Thanks for installing NuTyX * * * * Check http://www.nutyx.org/en/documentation.html * * or http://www.nutyx.org/fr/documentation.html * * * * Make sure to review /etc/cards.conf * * to meet your requirements in packages selection * * * **************************************************** " } check_root() { [ "$UID" != "0" ] && error " You are not root, cannot continue" } check_bash() { BASH_VERSION=`bash --version|head -n1 | cut -d " " -f4|cut -d "(" -f1|sed "s/\.//g"` if [ -z ${BASH_VERSION} ]; then error " Wrong interpreter, please use 'bash' as interpreter" fi # Checking bash version if [ ${BASH_VERSION} -lt 4333 ]; then boot_mesg " You not use 'bash' version 4.3.33 or newer..." echo_warning fi } check_tools() { if ! (`which wget > /dev/null`); then error " Command 'wget' not found, please install wget" fi if ! (`which tar > /dev/null`); then error " Command 'tar' not found, please install tar" fi if ! (`which gawk > /dev/null`); then error " Command 'gawk' not found, please install gawk" fi } check_variables() { [ -z $URL ] && URL="http://downloads.nutyx.org" [ -z $VERSION ] && VERSION="8.0" [ -z $DEPOT ] && DEPOT="/var/lib/pkg/depotrepo" [ -z $FOLDER ] && FOLDER="/mnt/hd" HOMEPAGE="${URL}" ## http://downloads.nutyx.org INSTALL_BASE="$VERSION/$ARCH" ## 8.0/x86_64 DEPOT_ROOT="$HOMEPAGE/${INSTALL_BASE}" ## http://downloads.nutyx.org/8.0/x86_64 DEPOT_BASE="$DEPOT_ROOT/$BASE" ## http://downloads.nutyx.org/8.0/x86_64/base LOCAL_DEPOT_PACKAGES="$DEPOT/$BASE" DEPOT_CD="/media/cdrom" SETUP_FILE=/tmp/setup # Size of the FullInstall in Mbytes let BASE_SIZE=450 } config() { ARCH=`uname -m` # Number of seconds between STOPSIG and FALLBACK when stopping processes KILLDELAY="3" ## Screen Dimensions # Find current screen size if [ -z "${COLUMNS}" ]; then COLUMNS=$(stty size) COLUMNS=${COLUMNS##* } fi # When using remote connections, such as a serial port, stty size returns 0 if [ "${COLUMNS}" = "0" ]; then COLUMNS=80 fi ## Measurements for positioning result messages COL=$((${COLUMNS} - 8)) WCOL=$((${COL} - 2)) ## Provide an echo that supports -e and -n # If formatting is needed, $ECHO should be used case "`echo -e -n test`" in -[en]*) ECHO=/bin/echo ;; *) ECHO=echo ;; esac ## Set Cursor Position Commands, used via $ECHO SET_COL="\\033[${COL}G" # at the $COL char SET_WCOL="\\033[${WCOL}G" # at the $WCOL char CURS_UP="\\033[1A\\033[0G" # Up one line, at the 0'th char ## Set color commands, used via $ECHO # Please consult `man console_codes for more information # under the "ECMA-48 Set Graphics Rendition" section # # Warning: when switching from a 8bit to a 9bit font, # the linux console will reinterpret the bold (1;) to # the top 256 glyphs of the 9bit font. This does # not affect framebuffer consoles NORMAL="\\033[0;39m" # Standard console grey SUCCESS="\\033[1;32m" # Success is green WARNING="\\033[1;33m" # Warnings are yellow FAILURE="\\033[1;31m" # Failures are red INFO="\\033[1;36m" # Information is light cyan BRACKET="\\033[1;34m" # Brackets are blue STRING_LENGTH="0" # the length of the current message } check_lfs() { # LFS is set ? if [ ! -z "${LFS}" ]; then DEVICE=${LFS} FOLDER=${LFS} else DEVICE=${FOLDER} fi echo " ****************************** Installation path: $DEVICE ******************************" } check_mountpoint() { [ -z $FOLDER ] && error "Variable FOLDER not define" } check_arch() { if [ "$ARCH" != "x86_64" ] && [ "$ARCH" != "i686" ]; then boot_mesg " >>> This arch ($ARCH) is not supported" echo_failure exit 1 fi } create_database() { [ ! -d ${FOLDER}/var/lib/pkg/DB ] && mkdir -p ${FOLDER}/var/lib/pkg/DB } create_locale_link() { [ ! -d ${FOLDER}/etc/locale ] && mkdir -p ${FOLDER}/etc/locale if [ -d ${FOLDER}/usr/lib/locale ]; then rm -r ${FOLDER}/usr/lib/locale ln -sv /etc/locale/ ${FOLDER}/usr/lib/locale fi } make_directories() { mkdir ${FOLDER}/{dev,sys,proc,run,tmp,home,srv,mnt} mkdir -p ${FOLDER}/var/tmp mkdir -p ${FOLDER}/usr/{,local/}lib chmod 1777 ${FOLDER}/{,var/}tmp mkdir -v ${FOLDER}/var/{mail,spool} mkdir -pv ${FOLDER}/var/run/lock mknod -m 600 ${FOLDER}/dev/console c 5 1 mknod -m 666 ${FOLDER}/dev/null c 1 3 } download_pkgadd() { if [ ! -f $TMP/usr/bin/pkgadd ]; then cd $TMP basepackagefile=`getPackageName cards` if [ "$basepackagefile" == "" ]; then error "variable 'basepackagefile' is not set" fi packagefile=`echo ${basepackagefile}|sed "s|^cards|cards.devel|"` if [ ! -f ${packagefile} ]; then wget ${DEPOT_BASE}/cards/$packagefile || print_error_msg echo_ok fi echo "Extraction of cards.devel ..." tar -xf ${packagefile} || print_error_msg echo_ok fi } check_mountfolder() { [ ! -d $FOLDER ] && mkdir -p $FOLDER } generate_setupfile() { echo "#!/bin/bash source /etc/profile cards sync cards install e2fsprogs \ reiserfsprogs \ xfsprogs jfsutils \ btrfs-progs sudo \ sysklogd sysvinit \ dhcpcd grub \ tzdata iproute2 iana-etc \ e3 eudev kmod less \ groff man-db cards.man \ nutyx.man \ lvm2 mdadm dialog cpio squashfs \ linux-firmware \ kernel-lts \ ca-certificates exit" > $FOLDER/$SETUP_FILE chmod 177 $FOLDER/$SETUP_FILE setup_chroot chroot ${FOLDER} /bin/bash -c "$SETUP_FILE" unmountall } install_configuration_files() { generate_cards_conf generate_pkgmk_conf generate_fstab generate_passwd generate_group generate_bash_profile generate_bashrc generate_dmrc generate_hosts generate_inputrc generate_shells generate_dircolors_sh generate_extrapaths_sh generate_readline_sh generate_umask_sh generate_profile generate_hosts generate_inputrc generate_modules generate_createfiles generate_mouse generate_udev_retry generate_rc_site generate_etc_bashrc generate_blfs_bootscripts generate_nutyx_version } print_help() { echo " usage: `basename ${INSTALL_COMMAND}` [options] options -p, --path will install NuTyX in -ec, --enter-chroot will enter in the chroot if exist -ic, --install-config will install all the configuration files only -h, --help print help and exit -v, --version print the version and exit " } parse_options() { while [ "$1" ]; do case $1 in -h|--help) print_help exit 0;; -ec|--enter-chroot) check_lfs "$@" check_root setup_chroot enter_chroot unmountall exit 0;; -ic|--install-config) check_variables check_lfs "$@" check_root check_mountfolder check_mountpoint make_directories create_locale_link install_configuration_files exit 0;; -p|--path) if [ ! "$2" ]; then echo "`basename $INSTALL_COMMAND`: option $1 requires an argument" exit 1 fi FOLDER="$2" shift;; -v|--version) echo "`basename $INSTALL_COMMAND` $VERSION-$RELEASE" exit 0;; /*) boot_mesg " >>> This methode is depreciate <<<: use '-p $1' instead or adjust the 'LFS' variable" echo_warning echo " press any key to continue ... " read a FOLDER="$1";; *) echo "`basename $0`: invalid option $1" exit 1 ;; esac shift done } main() { config [ -f /etc/`basename $INSTALL_COMMAND`.conf ] && source /etc/`basename $INSTALL_COMMAND`.conf check_variables "$@" parse_options "$@" check_arch check_lfs "$@" if [ $# -lt 1 ] && [ -z "$LFS" ] ; then echo " ******************************************* * You didn't specify enough arguments * * Argument 1: Folder destionation * * * * Please re-enter the command with the * * corrects arguments * ******************************************* example: ${INSTALL_COMMAND} -p /chroot " return fi check_root check_bash check_tools TMP=`mktemp -d` check_mountfolder check_mountpoint download_pkgadd create_database install_base create_locale_link make_directories install_configuration_files install_resolv_conf generate_setupfile end successfull_installation } readonly CODE_NAME="houaphan" readonly BASE="base" readonly RELEASE=2 INSTALL_COMMAND="`basename $0`" main "$@"