#@file ogfunctions.lib #@brief Librería o clase para la generación del 1erFS #@class client #@brief Funciones para la generación del primers sistema (initrd) #@version 0.91 #@warning License: GNU GPLv3+ ogExportKernelParameters () { GLOBAL="cat /proc/cmdline" for i in `${GLOBAL}` do echo $i | grep "=" > /dev/null && export $i done return 0 } ogExportVarEnvironment () { #puntos de accesos al servidor ogprotocol=nfs export NFSROOTBOOT="/var/lib/tftpboot" export NFSCLIENTDIR="/opt/opengnsys/client" export NFSLOGDIR="/opt/opengnsys/log/clients" export NFSIMGDIR="/opt/opengnsys/images" #puntos de accesos al servidor ogprotocol=smb export SMBROOTBOOT="tftpboot" export SMBCLIENTDIR="ogclient" export SMBLOGDIR="oglog" export SMBIMGDIR="ogimages" #puntos de montaje local ram o cache export LOCALCLIENTDIR="/opt/opengnsys" export LOCALLOGDIR="/opt/opengnsys/log" export LOCALIMGDIR="/opt/opengnsys/images" export LOCALROOTBOOT="/opt/og2fs/tftpboot" #punto de montaje del contendor tftpboot export LOCALROOTIMG="/opt/og2fs/2ndfs" #punto de montaje donde se accede al 2nd FS mediante loop export LOCALROOTRAM="/opt/og2fs/1stfs" #punto de montaje para unionfs export LOCALROOTUNION="/opt/og2fs/unionfs" #punto de union entreo LOCALROOTIMG y LOCALROOTRAM ##INFORMACION DE OTRAS VARIABLES OBTENDIAS EN OTRAS FUNCIONES. #ogGetROOTSERVER() ip del servidor pxe, valor obtenido automaticamente desde dhcpd. #IPV4DDR #IPV4BROADCAST #IPV4NETMASK #IPV4GATEWAY #DNS0 DNS1 #HOSTNAME #ROOTSERVER #ip del servidor pxe que ha servido el kernel #REPOSERVER=ogrepo -> ogConectROOTSERVER() ip del servidor de images para separar serviicios. return 0 } ogConfigureRamfs () { mkdir -p $LOCALROOTBOOT mkdir -p $LOCALROOTIMG mkdir -p $LOCALROOTRAM mkdir -p $LOCALROOTUNION } ogLoadNetModule () { #cargando netmodule if [ -n "$ognetmodule" ] then echo "Cargando modulo de red $netmodule" insmod `find /lib/modules/ -name ${netmodule}*` fi } ogPostConfigureFS() { # configuramos el /etc/hostname. echo $HOSTNAME > /etc/hostname #configuramos el /etc/hosts echo "127.0.0.1 localhost" > /etc/hosts echo "$IPV4ADDR $HOSTNAME" >> /etc/hosts #configuramos el host.conf echo "order hosts,bind" > /etc/host.conf echo "multi on" >> /etc/host.conf # configuramos el /etc/networks #read -e NETIP NETDEFAULT <<<$(route -n | grep eth0 | awk -F" " '{print $1}') NETIP=$(route -n | grep eth0 | awk -F" " '{print $1}') && NETIP=$(echo $NETIP | cut -f1 -d" ") echo "default 0.0.0.0" > /etc/networks echo "loopback 127.0.0.0" >> /etc/networks echo "link-local 169.254.0.0" >> /etc/networks echo "localnet $NETIP" >> /etc/networks #route } ogGetROOTSERVER () { # get nfs root from dhcp if [ "x${NFSROOT}" = "xauto" ]; then # check if server ip is part of dhcp root-path if [ "${ROOTPATH#*:}" = "${ROOTPATH}" ]; then NFSROOT=${ROOTSERVER}:${ROOTPATH} else NFSROOT=${ROOTPATH} fi # nfsroot=[:][,] elif [ -n "${NFSROOT}" ]; then # nfs options are an optional arg if [ "${NFSROOT#*,}" != "${NFSROOT}" ]; then NFSOPTS="-o ${NFSROOT#*,}" fi NFSROOT=${NFSROOT%%,*} if [ "${NFSROOT#*:}" = "$NFSROOT" ]; then NFSROOT=${ROOTSERVER}:${NFSROOT} fi fi export ROOTSERVER return 0 } ogConectROOTSERVER () { local OPTIONS #params a detectar if [ $ogrepo ] then # Validar si la ip es correcta ROOTREPO=$ogrepo else ROOTREPO=$ROOTSERVER fi case "$ogprotocol" in cdrom) echo "blkid /dev/s*" blkid /dev/s* echo " mount -t iso9660 LABEL=ogClient $LOCALROOTBOOT " mount -t iso9660 LABEL=ogClient $LOCALROOTBOOT ;; httfs) echo "protocolo httfs aun no soportado" ;; sshfs) echo "protocolo sshfs aun no soportado" ;; smb) echo Preparando conexión con el Repositorio $ROOTSERVER $ogprotocol OPTIONS=" -o user=opengnsys,pass=og" mount.cifs //${ROOTSERVER}/${SMBCLIENTDIR} $LOCALCLIENTDIR $OPTIONS #&& echo "mount.cifs //${ROOTSERVER}/${SMBCLIENTDIR} $LOCALCLIENTDIR $OPTIONS "; mount.cifs //${ROOTSERVER}/${SMBLOGDIR} $LOCALLOGDIR $OPTIONS #&& echo "mount.cifs //${ROOTSERVER}/${SMBLOGDIR} $LOCALLOGDIR $OPTIONS " ; mount.cifs //${ROOTSERVER}/${SMBROOTBOOT} $LOCALROOTBOOT $OPTIONS #&& echo "mount.cifs //${ROOTSERVER}/${SMBROOTBOOT} $LOCALROOTBOOT $OPTIONS "; mount.cifs //${ROOTREPO}/${SMBIMGDIR} $LOCALIMGDIR ${OPTIONS},ro #&& echo " mount.cifs //${ROOTREPO}/${SMBIMGDIR} $LOCALIMGDIR ${OPTIONS},ro "; ;; nfs) echo Preparando conexión con el Repositorio $ROOTSERVER $ogprotocol nfsmount -o nolock,ro $ROOTSERVER:$NFSCLIENTDIR $LOCALCLIENTDIR && echo "nfsmount -o nolock,ro $ROOTSERVER:$NFSCLIENTDIR $LOCALCLIENTDIR "; nfsmount -o nolock $ROOTSERVER:$NFSLOGDIR $LOCALLOGDIR && echo "nfsmount -o nolock $ROOTSERVER:$NFSLOGDIR $LOCALLOGDIR "; nfsmount -o nolock $ROOTSERVER:$NFSROOTBOOT $LOCALROOTBOOT && echo "nfsmount -o nolock $ROOTSERVER:$NFSROOTBOOT $LOCALROOTBOOT "; nfsmount -o nolock,ro $ROOTREPO:$NFSIMGDIR $LOCALIMGDIR && echo "nfsmount -o nolock,ro $ROOTREPO:$NFSIMGDIR $LOCALIMGDIR "; #mount -t nfs -onolock,ro $ROOTSERVER:/opt/opengnsys/client /opt/opengnsys; #mount -t nfs -o nolock $ROOTSERVER:/opt/opengnsys/log/clients /opt/opengnsys/log; #mount -t nfs -o "\$MOUNTOPTS" \$SERVERNFS:/opt/opengnsys/images /opt/opengnsys/images; #mount -t tmpfs none /opt/opengnsys/images -o size=5m ;; esac } ogMerge2ndFile() { if [ -f $LOCALROOTBOOT/ogclient/ogclient.sqfs ] then cat /proc/mounts > /tmp/mtab.preunion if [ "$og2nd" == "img" ] then #para acceder al img losetup /dev/loop0 $LOCALROOTBOOT/ogclient/ogclient.img -o 32256 mount /dev/loop0 $LOCALROOTIMG else ## para acceder al squashfs mount $LOCALROOTBOOT/ogclient/ogclient.sqfs $LOCALROOTIMG -t squashfs -o loop fi for i in etc var lib bin sbin usr root boot; do unionmount $i done cat /tmp/mtab.preunion > /etc/mtab else echo "ficher imagen del cliente no encontrado" return 1 fi } unionmount() { tmpdir=/$1 #dir FUSE_OPT="-o default_permissions -o allow_other -o use_ino -o nonempty -o suid" UNION_OPT="-o cow -o noinitgroups" UBIN="unionfs-fuse" #UPATH="/unionfs" #LOCALROOTIMG="/opt/og2fs/2ndfs" #LOCALROOTRAM="/opt/og2fs/1stfs" #/unionfs/host #punto de montaje para unionfs #LOCALROOTUNION=/opt/og2fs/unionfs/" #/unionfs/union #punto de union entreo LOCALROOTIMG y LOCALROOTRAM #mkdir -p $LOCALROOTRAM #/unionfs/host #mkdir -p $LOCALROOTUNION #/unionfs/union mkdir -p $LOCALROOTRAM$tmpdir #mount --bind /$tmpdir $LOCALROOTRAM$tmpdir U1STDIR="${LOCALROOTRAM}${tmpdir}=RW" U2NDDIR="${LOCALROOTIMG}${tmpdir}=RO" UNIONDIR=$LOCALROOTUNION$tmpdir mkdir -p $UNIONDIR $UBIN $FUSE_OPT $UNION_OPT ${U1STDIR}:${U2NDDIR} $UNIONDIR mount --bind $UNIONDIR $tmpdir } unionmountOLD() { FUSE_OPT="-o default_permissions -o allow_other -o use_ino -o nonempty -o suid" UNION_OPT="-o cow -o noinitgroups" UPATH="/unionfs" UBIN="unionfs-fuse" mkdir -p /unionfs/host mkdir -p /unionfs/union dir=$1 mkdir -p /unionfs/host/$dir #mount --bind /$dir /unionfs/host/$dir mkdir -p /unionfs/union/$dir host="/unionfs/host/${dir}=RW" common="/opt/og2fs/${dir}=RO" $UBIN $FUSE_OPT $UNION_OPT ${host}:${common} /unionfs/union/$dir mount --bind /unionfs/union/$dir /$dir } ogconfigure_lo() { # for the portmapper we need localhost ifconfig lo 127.0.0.1 #/etc/init.d/portmap start } ogconfigure_networking() { IP=$IPOPTS # http://paste.ubuntu.com/427631/ Paste from yofel at Tue, 4 May 2010 13:49:56 +0000 if [ -n "${BOOTIF}" ]; then # pxelinux sets BOOTIF to a value based on the mac address of the # network card used to PXE boot, so use this value for DEVICE rather # than a hard-coded device name from initramfs.conf. this facilitates # network booting when machines may have multiple network cards. # pxelinux sets BOOTIF to 01-$mac_address # strip off the leading "01-", which isn't part of the mac # address temp_mac=${BOOTIF#*-} # convert to typical mac address format by replacing "-" with ":" bootif_mac="" IFS='-' for x in $temp_mac ; do if [ -z "$bootif_mac" ]; then bootif_mac="$x" else bootif_mac="$x:$bootif_mac" fi done unset IFS # look for devices with matching mac address, and set DEVICE to # appropriate value if match is found. for device in /sys/class/net/* ; do if [ -f "$device/address" ]; then current_mac=$(cat "$device/address") if [ "$bootif_mac" = "$current_mac" ]; then DEVICE=${device##*/} break fi fi done fi # networking already configured thus bail out [ -n "${DEVICE}" ] && [ -e /tmp/net-"${DEVICE}".conf ] && return 0 # support ip options see linux sources # Documentation/filesystems/nfsroot.txt # Documentation/frv/booting.txt for ROUNDTTT in 2 3 4 6 9 16 25 36 64 100; do # The NIC is to be configured if this file does not exist. # Ip-Config tries to create this file and when it succeds # creating the file, ipconfig is not run again. if [ -e /tmp/net-"${DEVICE}".conf ]; then break; fi case ${IP} in none|off) # Do nothing ;; ""|on|any) # Bring up device echo "Setting $DEVICE with kernel params $IP: ipconfig -t ${ROUNDTTT} ${DEVICE} " ipconfig -t ${ROUNDTTT} ${DEVICE} ;; dhcp|bootp|rarp|both) echo "Setting $DEVICE with (dhcp) kernel params $IP: ipconfig -t ${ROUNDTTT} -c ${IP} -d ${DEVICE} " ipconfig -t ${ROUNDTTT} -c ${IP} -d ${DEVICE} ;; *) echo "Setting $DEVICE with kernel params $IP: ipconfig -t ${ROUNDTTT} -d $IP " ipconfig -t ${ROUNDTTT} -d $IP # grab device entry from ip option NEW_DEVICE=${IP#*:*:*:*:*:*} if [ "${NEW_DEVICE}" != "${IP}" ]; then NEW_DEVICE=${NEW_DEVICE%:*} else # wrong parse, possibly only a partial string NEW_DEVICE= fi if [ -n "${NEW_DEVICE}" ]; then DEVICE="${NEW_DEVICE}" fi ;; esac done # source ipconfig output if [ -n "${DEVICE}" ]; then # source specific bootdevice . /tmp/net-${DEVICE}.conf else # source any interface as not exaclty specified . /tmp/net-*.conf fi } ##################################################################### # Ask yesno question. # # Usage: yesno OPTIONS QUESTION # # Options: # --timeout N Timeout if no input seen in N seconds. # --default ANS Use ANS as the default answer on timeout or # if an empty answer is provided. # # Exit status is the answer. 0=yes 1=no ogYesNo() { local ans local ok=0 local timeout=0 local default local t while [[ "$1" ]] do case "$1" in --default) shift default=$1 if [[ ! "$default" ]]; then error "Missing default value"; fi t=$(echo $default | tr '[:upper:]' '[:lower:]') if [[ "$t" != 'y' && "$t" != 'yes' && "$t" != 'n' && "$t" != 'no' ]]; then error "Illegal default answer: $default" fi default=$t shift ;; --timeout) shift timeout=$1 if [[ ! "$timeout" ]]; then error "Missing timeout value"; fi #if [[ ! "$timeout" =~ ^[0-9][0-9]*$ ]]; then error "Illegal timeout value: $timeout"; fi shift ;; -*) error "Unrecognized option: $1" ;; *) break ;; esac done if [[ $timeout -ne 0 && ! "$default" ]]; then error "Non-zero timeout requires a default answer" fi if [[ ! "$*" ]]; then error "Missing question"; fi while [[ $ok -eq 0 ]] do if [[ $timeout -ne 0 ]]; then if ! read -t $timeout -p "$*" ans; then ans=$default else # Turn off timeout if answer entered. timeout=0 if [[ ! "$ans" ]]; then ans=$default; fi fi else read -p "$*" ans if [[ ! "$ans" ]]; then ans=$default else ans=$(echo $ans | tr '[:upper:]' '[:lower:]') fi fi if [[ "$ans" == 'y' || "$ans" == 'yes' || "$ans" == 'n' || "$ans" == 'no' ]]; then ok=1 fi if [[ $ok -eq 0 ]]; then warning "Valid answers are: yes y no n"; fi done [[ "$ans" = "y" || "$ans" == "yes" ]] }