841 lines
25 KiB
Plaintext
841 lines
25 KiB
Plaintext
#/**
|
|
#@file ogfunctions.lib
|
|
#@brief Librería o clase para la gestion del sistema operativo de los clientes OpenGnsys.
|
|
#@class client
|
|
#@version 1.1.0
|
|
#@warning License: GNU GPLv3+
|
|
#*/ ##
|
|
|
|
|
|
#/**
|
|
# ogGetNetworkDevice
|
|
#@brief Devuelve el nombre de dispositivo de red correpondiente al índice indicado.
|
|
#@param int_devindex índice de dispositivo de red.
|
|
#@return str_devname nombre de dispositivo de red.
|
|
#@note Índice 0 debe corresponder a interfaz "lo" y a partir de 1 para las reales.
|
|
#@version 1.1.0 - Primera versión de la función.
|
|
#@author Ramón Gómez, ETSII Universidad de Sevilla
|
|
#@date 2016/04/20
|
|
#*/ ##
|
|
ogGetNetworkDevice ()
|
|
{
|
|
# Mantener retrocompatibilidad con interfaces antiguas tipo eth.
|
|
case "$1" in
|
|
eth0) ind=1 ;;
|
|
eth1) ind=2 ;;
|
|
eth2) ind=3 ;;
|
|
*) ind="$1" ;;
|
|
esac
|
|
# Buscar el dispositivo del índice.
|
|
dev=""
|
|
for f in /sys/class/net/*/uevent; do
|
|
source $f
|
|
let aux=$IFINDEX-1
|
|
[ "$ind" = "$INTERFACE" -o "$ind" = $aux ] && dev="$INTERFACE"
|
|
done
|
|
[ -n "$dev" ] && echo "$dev"
|
|
}
|
|
|
|
|
|
#/**
|
|
# ogExportKernelParameters
|
|
#@brief Exporta los parametros pasados al kernel
|
|
#@exception OG_ERR_FORMAT Formato incorrecto.
|
|
#@version 0.7 - Primera versión de la función.
|
|
#@author Antonio J. Doblas. Universidad de Malaga.
|
|
#@date 2010/05/24
|
|
#@version 1.1.0 - Sustituir índice de interfaz de red por su dispositivo.
|
|
#@author Ramón Gómez, ETSII Universidad de Sevilla
|
|
#@date 2016/04/20
|
|
#*/ ##
|
|
ogExportKernelParameters ()
|
|
{
|
|
GLOBAL="cat /proc/cmdline"
|
|
for i in `${GLOBAL}`
|
|
do
|
|
echo $i | grep "=" > /dev/null && export $i
|
|
done
|
|
# Sustituir índice de interfaz de red por su dispositivo.
|
|
DEVIND=$(echo "$ip" | cut -f6 -d:)
|
|
if [ -n "$DEVIND" ]; then
|
|
PRE=$(echo "$ip" | cut -f1-5 -d:)
|
|
POST=$(echo "$ip" | cut -f7- -d:)
|
|
DEVICE=$(ogGetNetworkDevice $DEVIND)
|
|
[ -n "$DEVICE" ] && export ip="$PRE:$DEVICE:${POST:-none}"
|
|
fi
|
|
return 0
|
|
}
|
|
|
|
|
|
#/**
|
|
# ogChangeVideoResolution
|
|
#@brief Cambia la resolución de vídeo utilizando el parámetro "video" del Kernel
|
|
# (sustituye al parámetro "vga").
|
|
#@note Formato del parámetro vídeo: video=DRIVER:RESXxRESY-BITS
|
|
#@note El valor por defecto es: video=uvesafb:640x480-16
|
|
#@todo Control de errores en el foramto de la variable "video".
|
|
#@version 1.0.5 - Primera versión de la función.
|
|
#@author Ramón Gómez, ETSII Universidad de Sevilla
|
|
#@date 2013/02/18
|
|
#*/ ##
|
|
ogChangeVideoResolution ()
|
|
{
|
|
# Variables locales.
|
|
local DRIVER MODE
|
|
# Mostrar resolución y driver por defecto si solo hay una opción disponible.
|
|
if [ $(grep -c "" /sys/class/graphics/fb0/modes) -eq 1 ]; then
|
|
echo "Default screen mode: $(cat /sys/class/graphics/fb0/modes),$(cat /sys/class/graphics/fb0/bits_per_pixel)bpp$(lsmod|awk '$1=="video" && $3>0 {printf " (%s)",$4}')."
|
|
else
|
|
# Obtener driver y resolución.
|
|
DRIVER="$(echo $video|cut -f1 -d:)"
|
|
MODE="$(echo $video|cut -f2 -d:)"
|
|
case "$DRIVER" in
|
|
# Cambiar resolución para driver "uvesafb".
|
|
uvesafb)
|
|
# Obtener modo por defecto si parámetro "video=uvesafb:D".
|
|
[ "$MODE" == "D" ] && MODE=$(awk -F: '$1=="D" {print $2; nextfile}' /sys/class/graphics/fb0/modes)
|
|
# Cambiar resolución según valor del parámetro "video".
|
|
grep ":$(echo ${MODE/p/}|cut -f1 -d-)p" /sys/class/graphics/fb0/modes | head -1 > /sys/class/graphics/fb0/mode 2>&1
|
|
echo "$(echo $MODE|cut -f2 -d-)" > /sys/class/graphics/fb0/bits_per_pixel 2>&1
|
|
echo "Screen mode: $(cat /sys/class/graphics/fb0/mode),$(cat /sys/class/graphics/fb0/bits_per_pixel)bpp."
|
|
;;
|
|
# Resolución por defecto para el resto de casos.
|
|
*) echo "Unknown video driver, using default mode."
|
|
;;
|
|
esac
|
|
fi
|
|
}
|
|
|
|
|
|
#/**
|
|
# ogExportVarEnvironment
|
|
#@brief Exporta las variables usadas en el proceso de inicio OpenGnsys y las almacena en /tmp
|
|
#@param
|
|
#@return
|
|
#@exception OG_ERR_FORMAT Formato incorrecto.
|
|
#@version 0.9
|
|
#@author Antonio J. Doblas. Universidad de Malaga.
|
|
#@date 2011/05/24
|
|
#*/ ##
|
|
ogExportVarEnvironment ()
|
|
{
|
|
export CFGINITRD="/tmp/initrd.cfg"
|
|
OGPROTOCOL="${ogprotocol:-smb}"
|
|
[ "$ogunit" != "" ] && OGUNIT="/$ogunit"
|
|
# OPTIONS Para samba y local (a nfs no le afecta)
|
|
export OPTIONS=" -o vers=1.0,sec=ntlm,user=opengnsys,pass=og"
|
|
DEFOGLIVE="ogclient"
|
|
export OGLIVEDIR="${oglivedir:-$DEFOGLIVE}" && echo "OGLIVEDIR=$OGLIVEDIR" >> $CFGINITRD
|
|
case "$OGPROTOCOL" in
|
|
nfs|NFS)
|
|
export SRCOGLIVE="/var/lib/tftpboot" && echo "SRCOGLIVE=$SRCOGLIVE" >> $CFGINITRD
|
|
export SRCOGSHARE="/opt/opengnsys/client" && echo "SRCOGSHARE=$SRCOGSHARE" >> $CFGINITRD
|
|
export SRCOGLOG="/opt/opengnsys/log/clients" && echo "SRCOGLOG=$SRCOGLOG" >> $CFGINITRD
|
|
export SRCOGIMAGES="/opt/opengnsys/images$OGUNIT" && echo "SRCOGIMAGES=$SRCOGIMAGES" >> $CFGINITRD
|
|
;;
|
|
smb|SMB|cifs|CIFS|samba|SAMBA)
|
|
export SRCOGLIVE="tftpboot" && echo "SRCOGLIVE=$SRCOGLIVE" >> $CFGINITRD
|
|
export SRCOGSHARE="ogclient" && echo "SRCOGSHARE=$SRCOGSHARE" >> $CFGINITRD
|
|
export SRCOGLOG="oglog" && echo "SRCOGLOG=$SRCOGLOG" >> $CFGINITRD
|
|
export SRCOGIMAGES="ogimages$OGUNIT" && echo "SRCOGIMAGES=$SRCOGIMAGES" >> $CFGINITRD
|
|
;;
|
|
local|LOCAL)
|
|
# Ponemos variables SRC compatibles con smb y nfs.
|
|
export SRCOGLIVE="local"
|
|
export SRCOGSHARE="client" && echo "SRCOGSHARE=$SRCOGSHARE" >> $CFGINITRD
|
|
export SRCOGLOG="log" && echo "SRCOGLOG=$SRCOGLOG" >> $CFGINITRD
|
|
export SRCOGIMAGES="images" && echo "SRCOGIMAGES=$SRCOGIMAGES" >> $CFGINITRD
|
|
;;
|
|
esac
|
|
#punto de acceso al boot-tools live
|
|
export DSTOGLIVE="/opt/oglive/tftpboot"
|
|
#punto de montaje para unionfs
|
|
export OGLIVERAMFS="/opt/oglive/ramfs" && echo "OGLIVERAMFS=$OGLIVERAMFS" >> $CFGINITRD
|
|
#punto de montaje donde se accede al 2nd FS mediante loop
|
|
export OGLIVEROOTFS="/opt/oglive/rootfs" && echo "OGLIVEROOTFS=$OGLIVEROOTFS" >> $CFGINITRD
|
|
#punto de union entre LOCALROOTIMG y LOCALROOTRAM
|
|
export OGLIVEUNIONFS="/opt/oglive/unionfs" && echo "OGLIVEUNIONFS=$OGLIVEUNIONFS" >> $CFGINITRD
|
|
#etiquta para los dispositivos offline
|
|
export OGLIVELABEL="ogClient"
|
|
|
|
#echo "puntos de montajes para los demas accesos"
|
|
#echo "acceso al client, engine, scritps, interfaz"
|
|
export DSTOGSHARE="/opt/opengnsys" && echo "DSTOGSHARE=$DSTOGSHARE" >> $CFGINITRD
|
|
export DSTOGLOG="/opt/opengnsys/log" && echo "DSTOGLOG=$DSTOGLOG" >> $CFGINITRD
|
|
export DSTOGIMAGES="/opt/opengnsys/images" && echo "DSTOGIMAGES=$DSTOGIMAGES" >> $CFGINITRD
|
|
|
|
##INFORMACION DE OTRAS VARIABLES OBTENDIAS EN OTRAS FUNCIONES ogConfigureNetwork.
|
|
#DEVICE
|
|
#IPV4DDR
|
|
#IPV4BROADCAST
|
|
#IPV4NETMASK
|
|
#IPV4GATEWAY
|
|
#HOSTNAME
|
|
#INFORMACION de otras variasbles obteneidas desde ogGetROOTSERVER
|
|
#ROOTSERVER si ip=dhcp -> ROOTSERVER=NEXT-SERVER; si ip=host:rootserver:gw:mask:hostname:interfaz -> ROOTSERVER=rootserver
|
|
#BOOTIF -> si el gestor remoto es pxelinux.0 y se añade una linea más tipo "IPAPPEND 2" esta variable tendrá la mac de la interfaz.
|
|
#$OGSERVERLIVE
|
|
#$OGSERVERSHARE
|
|
#$OGSERVERLOG
|
|
#$OGSERVERIMAGES
|
|
return 0
|
|
}
|
|
|
|
|
|
#/**
|
|
# ogConfigureRamfs
|
|
#@brief Configura el initrd para adaptarlo al sistema raiz.
|
|
#@param
|
|
#@return
|
|
#@exception OG_ERR_FORMAT Formato incorrecto.
|
|
#@version 0.9
|
|
#@author Antonio J. Doblas. Universidad de Malaga.
|
|
#@date 2010/05/24
|
|
#*/ ##
|
|
ogConfigureRamfs ()
|
|
{
|
|
mkdir -p $DSTOGLIVE
|
|
mkdir -p $OGLIVERAMFS
|
|
mkdir -p $OGLIVEROOTFS
|
|
mkdir -p $OGLIVEUNIONFS
|
|
|
|
touch /etc/fstab
|
|
}
|
|
|
|
|
|
#/**
|
|
# ogLoadNetModule
|
|
#@brief Carga en un demerminado modulo de red, requiere compilación previo del modulo
|
|
#@param
|
|
#@return
|
|
#@exception OG_ERR_FORMAT Formato incorrecto.
|
|
#@version 0.9
|
|
#@author Antonio J. Doblas. Universidad de Malaga.
|
|
#@date 2010/05/24
|
|
#*/ ##
|
|
ogLoadNetModule ()
|
|
{
|
|
if [ -n "$ognetmodule" ]
|
|
then
|
|
echo "Cargando modulo de red $ognetmodule"
|
|
modprobe ${ognetmodule}
|
|
fi
|
|
}
|
|
|
|
|
|
#/**
|
|
# ogPostConfigureFS
|
|
#@brief Configura el sistema raiz, para independizarlo entre los clientes.
|
|
#@param
|
|
#@return
|
|
#@exception OG_ERR_FORMAT Formato incorrecto.
|
|
#@version 0.9
|
|
#@author Antonio J. Doblas. Universidad de Malaga.
|
|
#@date 2010/05/24
|
|
#*/ ##
|
|
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 dns anterior ubuntu 12.04 (parámetro del Kernel "ogdns=IP_DNS")
|
|
if [ -n "$ogdns" ]; then
|
|
mkdir -p /run/resolvconf
|
|
echo "nameserver $ogdns" > /run/resolvconf/resolv.conf
|
|
fi
|
|
|
|
#configuramos el uso del servicio http proxy (parámetro del Kernel "ogproxy=URL_Proxy")
|
|
if [ -n "${ogproxy}" ]; then
|
|
export http_proxy="$ogproxy"
|
|
export https_proxy="$ogproxy"
|
|
export ftp_proxy="$ogproxy"
|
|
export ftps_proxy="$ogproxy"
|
|
fi
|
|
|
|
# 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
|
|
|
|
#echo "ogLive1.0.2" > /etc/debian_chroot
|
|
|
|
#enlace si iniciamos desde ogprotocolo=local { cdrom, usb, cache } .
|
|
# monta el raiz del dispositivo local en /opt/og2fs/tftpboot - acceso al fichero .sqfs
|
|
# y monta el sistema root sqfs en /opt/og2fs/2ndfs
|
|
#[ "$LOCALMEDIA" == "CACHE" ] && ln -s $DSTOGLIVE /opt/opengnsys/cache
|
|
#[ "$ogprotocol" == "local" ] && ln -s ${OGLIVEROOTFS}/opt/opengnsys/* /opt/opengnsys/
|
|
if [ "$ogprotocol" == "local" ]; then
|
|
# Creamos los subdirectorios de /opt/opengnsys/
|
|
[ "$ogstatus" == "offline" ] && ln -s ${OGLIVEROOTFS}/opt/opengnsys/* /opt/opengnsys/
|
|
# Montamos CACHE
|
|
# Si existe particion identificada como CACHE se monta.
|
|
DEVICECACHE=$(blkid -L "CACHE")
|
|
if [ "$DEVICECACHE" != "" ]; then
|
|
# Se monta diferente segun el dispositivo de cache igual o no al de ogclient.
|
|
DEVICEOGLIVE=$(df |grep $DSTOGLIVE|awk '{print $1}')
|
|
if [[ "$DEVICECACHE" == "*$DEVICEOGLIVE*" ]];then
|
|
mount --bind $DSTOGLIVE /opt/opengnsys/cache
|
|
else
|
|
mount $DEVICECACHE /opt/opengnsys/cache
|
|
fi
|
|
if [ "$ogstatus" == "offline" ]; then
|
|
[ -d /opt/opengnsys/cache/log ] || mkdir /opt/opengnsys/cache/log
|
|
mount --bind /opt/opengnsys/cache/log /opt/opengnsys/log
|
|
fi
|
|
fi
|
|
# Montamos REPO
|
|
if [ "$ogstatus" == "offline" ]; then
|
|
# Si estatus distinto de online buscamos un dispositivo con etiqueta repo
|
|
# y si no existe montamos la cache como repo (si existe).
|
|
TYPE=$(blkid | grep REPO | awk -F"TYPE=" '{print $2}' | tr -d \")
|
|
if [ "$TYPE" == "" ]; then
|
|
[ -d "/opt/opengnsys/cache$DSTOGIMAGES" ] && mount --bind /opt/opengnsys/cache$DSTOGIMAGES $DSTOGIMAGES
|
|
else
|
|
mount -t $TYPE LABEL=REPO $DSTOGIMAGES &>/dev/null
|
|
fi
|
|
fi
|
|
fi
|
|
|
|
#Montamos un directorio temporal para permitir instalacion de softare desde el comando apt-get (parametor kernel "ogtmpfs=50" valor en megas
|
|
ogtmpfs="${ogtmpfs:-15}"
|
|
mount tmpfs /var/cache/apt/archives -t tmpfs -o size=${ogtmpfs}M
|
|
mkdir -p /var/cache/apt/archives/partial
|
|
}
|
|
|
|
|
|
#/**
|
|
# ogGetROOTSERVER
|
|
#@brief Determina los puntos de accesos a los distintos recursos.
|
|
#Requiere ogConfigureNetworking.
|
|
#Exporta ROOTSERVER
|
|
# si la red ha sido configurada con dhcp el valor de ROOTSERVER será el valor de next-server del dhcp
|
|
# si la red ha sido configurada con el parametro de kernel ip, será el segundo valor.
|
|
## ip=iphost:ipnext-server:ipgateway:netmask:hostname:iface:none
|
|
## ip=172.17.36.21:62.36.225.150:172.17.36.254:255.255.255.0:prueba1:eth0:none
|
|
#@param
|
|
#@return
|
|
#@exception OG_ERR_FORMAT Formato incorrecto.
|
|
#@version 0.9
|
|
#@author Antonio J. Doblas. Universidad de Malaga.
|
|
#@date 2010/05/24
|
|
#*/ ##
|
|
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=[<server-ip>:]<root-dir>[,<nfs-options>]
|
|
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
|
|
echo "ROOTSERVER=$ROOTSERVER" >> $CFGINITRD
|
|
|
|
#si oglive no oglive=R
|
|
export OGSERVERIMAGES="${ogrepo:-$ROOTSERVER}" && echo "OGSERVERIMAGES=$OGSERVERIMAGES" >> $CFGINITRD
|
|
export OGSERVERSHARE="${ogshare:-$ROOTSERVER}" && echo "OGSERVERSHARE=$OGSERVERSHARE" >> $CFGINITRD
|
|
export OGSERVERLOG="${oglog:-$ROOTSERVER}" && echo "OGSERVERLOG=$OGSERVERLOG" >> $CFGINITRD
|
|
export OGSERVERLIVE="${oglive:-$OGSERVERIMAGES}" && echo "OGSERVERLIVE=$OGSERVERLIVE" >> $CFGINITRD
|
|
|
|
return 0
|
|
}
|
|
|
|
|
|
|
|
# ogUpdateInitrd
|
|
#@brief Actualiza el initrd de la cache desde el servidor. Si el arranque ha sido desde cache, comprueba desde el servidor nueva version del initird.
|
|
#@param1
|
|
#@return
|
|
#@exception OG_ERR_FORMAT Formato incorrecto.
|
|
#@version 0.9
|
|
#@author Antonio J. Doblas. Universidad de Malaga.
|
|
#@date 2011/05/24
|
|
#@version 1.1.0 - Permite varios ogLive dentro de subdirectorios
|
|
#@author Irina Gómez. ETSII Universidad de Sevilla
|
|
#@date 2017/04/27
|
|
#@version 1.1.0 - Se permite varios ogLives en la CACHE
|
|
#@author Antonio J. Doblas Viso. Universidad de Malaga
|
|
#@date 2017/05/31
|
|
#*/ ##
|
|
|
|
ogUpdateInitrd ()
|
|
{
|
|
local OGLIVEDIR
|
|
OGLIVEDIR=${oglivedir:-"ogclient"}
|
|
cd /tmp
|
|
mkdir /tmp/cache
|
|
TYPE=$(blkid -po export $(blkid -L CACHE) 2>/dev/null | awk -F= '$1=="TYPE" { print $2}')
|
|
# Salir si no se detecta caché.
|
|
[ -z "$TYPE" ] && return
|
|
mount -t $TYPE LABEL=CACHE /tmp/cache || return
|
|
mkdir -p /tmp/cache/boot/$OGLIVEDIR
|
|
|
|
|
|
# comparamos los del server
|
|
busybox tftp -g -r $OGLIVEDIR/ogvmlinuz.sum $ROOTSERVER
|
|
busybox tftp -g -r $OGLIVEDIR/oginitrd.img.sum $ROOTSERVER
|
|
SERVERVMLINUZ=`cat ogvmlinuz.sum`
|
|
SERVERINITRD=`cat oginitrd.img.sum`
|
|
|
|
|
|
#comparamos los de la cache
|
|
CACHEVMLINUZ=`cat /tmp/cache/boot/$OGLIVEDIR/ogvmlinuz.sum`
|
|
CACHEINITRD=`cat /tmp/cache/boot/$OGLIVEDIR/oginitrd.img.sum`
|
|
|
|
echo "MD5 on SERVER: $SERVERVMLINUZ $SERVERINITRD"
|
|
echo "MD5 on CACHE: $CACHEVMLINUZ $CACHEINITRD"
|
|
|
|
cd /tmp/cache/boot/$OGLIVEDIR || mkdir -p /tmp/cache/boot/$OGLIVEDIR
|
|
|
|
if [ "$CACHEVMLINUZ" != "$SERVERVMLINUZ" ]
|
|
then
|
|
echo "ogvmlinuz updating"
|
|
busybox tftp -g -r $OGLIVEDIR/ogvmlinuz $ROOTSERVER
|
|
busybox tftp -g -r $OGLIVEDIR/ogvmlinuz.sum $ROOTSERVER
|
|
DOREBOOT=true
|
|
fi
|
|
if [ "$CACHEINITRD" != "$SERVERINITRD" ]
|
|
then
|
|
echo "oginitrd updating"
|
|
busybox tftp -g -r $OGLIVEDIR/oginitrd.img $ROOTSERVER
|
|
busybox tftp -g -r $OGLIVEDIR/oginitrd.img.sum $ROOTSERVER
|
|
DOREBOOT=true
|
|
fi
|
|
|
|
cd /; umount /tmp/cache
|
|
|
|
[ "$DOREBOOT" == "true" ] && reboot -f
|
|
|
|
}
|
|
|
|
#/**
|
|
# ogConnect
|
|
#@brief Conecta con los recursos necesarios para opengnsys
|
|
#@param1 ip del servidor TODO:dns
|
|
#@param2 protocolo
|
|
#@param3 punto de acceso remoto
|
|
#@param4 punto de montaje local
|
|
#@param5 acceso de lectura tipo ",ro"
|
|
#@return
|
|
#@exception OG_ERR_FORMAT Formato incorrecto.
|
|
#@version 0.9
|
|
#@author Antonio J. Doblas. Universidad de Malaga.
|
|
#@date 2011/05/24
|
|
#*/ ##
|
|
|
|
ogConnect ()
|
|
{
|
|
SERVER=$1
|
|
PROTOCOL=$2
|
|
SRC=$3
|
|
DST=$4
|
|
READONLY=$5
|
|
|
|
case "$PROTOCOL" in
|
|
nfs)
|
|
nfsmount ${SERVER}:${SRC} ${DST} -o nolock${READONLY} 2> /dev/null || mount.nfs ${SERVER}:${SRC} ${DST} -o nolock${READONLY}
|
|
;;
|
|
smb)
|
|
mount.cifs //${SERVER}/${SRC} ${DST} ${OPTIONS}${READONLY}
|
|
;;
|
|
local)
|
|
# Comprobamos que estatus sea online y que la variable del server no esta vacia.
|
|
if [ "$ogstatus" != "offline" -a "$SERVER" != "" -a "$SRC" != "" ]; then
|
|
# Comprobamos que existe un servicio de samba.
|
|
smbclient -L $SERVER -N &>/dev/null
|
|
if [ $? -eq 0 ]; then
|
|
mount.cifs //${SERVER}/og${SRC} ${DST} ${OPTIONS}${READONLY}
|
|
fi
|
|
# TODO: buscar condicion para NFS
|
|
fi
|
|
;;
|
|
*)
|
|
return 1
|
|
;;
|
|
esac
|
|
return $?
|
|
}
|
|
|
|
|
|
#/**
|
|
# ogConnectOgLive
|
|
#@brief Conecta con el recurso para usar el sistema raiz externo, remoto o local
|
|
#@param1
|
|
#@return
|
|
#@exception OG_ERR_FORMAT Formato incorrecto.
|
|
#@version 0.9
|
|
#@author Antonio J. Doblas. Universidad de Malaga.
|
|
#@date 2011/05/24
|
|
ogConnectOgLive ()
|
|
{
|
|
# Si ogprotocol=local, la funcion ogExportVar => SRCOGLIVE=local
|
|
if [ "$SRCOGLIVE" == "local" ]
|
|
then
|
|
echo "Montar imagen del sistema root desde dispositivo local"
|
|
for i in $(blkid /dev/s* | grep $OGLIVELABEL | awk -F: '{print $2}' | tr -d \"); do export $i; done
|
|
# si local usb| cd con partcion es identificada como label $OGLIVELABEL
|
|
mount -t $TYPE LABEL=$OGLIVELABEL $DSTOGLIVE
|
|
if [ $? != 0 ]
|
|
then
|
|
# Si local es particion CACHE es identificada como CACHE
|
|
mount LABEL=CACHE $DSTOGLIVE
|
|
#export LOCALMEDIA=CACHE
|
|
fi
|
|
else
|
|
# Si ogprotocol es remoto. TODO en smb rw y en nfs ro??
|
|
ogConnect $OGSERVERLIVE $OGPROTOCOL $SRCOGLIVE $DSTOGLIVE
|
|
fi
|
|
# Si el montaje ha sido correcto, tanto en local como en remoto. Procedemos con la union
|
|
ogMergeLive
|
|
}
|
|
|
|
|
|
#/**
|
|
# ogMergeLive
|
|
#@brief Metafuncion para fusionar el initrd con el sistema raiz.
|
|
#@param1
|
|
#@return
|
|
#@exception OG_ERR_FORMAT Formato incorrecto.
|
|
#@version 0.9
|
|
#@author Antonio J. Doblas. Universidad de Malaga.
|
|
#@date 2011/05/24
|
|
ogMergeLive()
|
|
{
|
|
#Si existe en el punto de acceso del del oglive el fichero ogclient.sqfs
|
|
if [ ! -d $DSTOGLIVE/$OGLIVEDIR ]; then
|
|
echo "Usando ogLive por defecto."
|
|
export OGLIVEDIR=$DEFOGLIVE
|
|
fi
|
|
if [ -f $DSTOGLIVE/$OGLIVEDIR/ogclient.sqfs ]
|
|
then
|
|
cat /proc/mounts > /tmp/mtab.preunion
|
|
if [ "$og2nd" == "img" ]
|
|
then
|
|
#Montamos el ROOTFS tipo img, para desarrolladores
|
|
#TODO: comprobar que se tiene acceso de escritura
|
|
losetup /dev/loop0 $DSTOGLIVE/$OGLIVEDIR/ogclient.img -o 32256
|
|
mount /dev/loop0 $OGLIVEROOTFS
|
|
else
|
|
## Montamos el ROOTFS tipo squashfs
|
|
mount $DSTOGLIVE/$OGLIVEDIR/ogclient.sqfs $OGLIVEROOTFS -t squashfs -o loop
|
|
fi
|
|
# Realizamos la union entre el ogliveram(initrd) y el ogliverootfs(ogclient.sqfs)
|
|
# Nota: el orden es muy importante para evitar errores de montaje.
|
|
[ -d $OGLIVEROOTFS/lib32 ] && LIBS=lib32
|
|
for i in bin sbin lib $LIBS etc var usr root boot; do
|
|
ogUnionLiveDir $i
|
|
done
|
|
[ -L /etc/mtab ] || cat /tmp/mtab.preunion > /etc/mtab
|
|
else
|
|
echo "Fichero imagen del cliente no encontrado"
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
|
|
|
|
#/**
|
|
# ogUnionLiveDir
|
|
#@brief fusiona dos directorios con unionfs
|
|
#@param1
|
|
#@return
|
|
#@exception OG_ERR_FORMAT Formato incorrecto.
|
|
#@version 0.9
|
|
#@author Antonio J. Doblas. Universidad de Malaga.
|
|
#@date 2011/05/24
|
|
ogUnionLiveDir()
|
|
{
|
|
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"
|
|
|
|
mkdir -p $OGLIVERAMFS$TMPDIR
|
|
U1STDIR="${OGLIVERAMFS}${TMPDIR}=RW"
|
|
U2NDDIR="${OGLIVEROOTFS}${TMPDIR}=RO"
|
|
UNIONDIR=${OGLIVEUNIONFS}${TMPDIR}
|
|
mkdir -p $UNIONDIR $TMPDIR
|
|
$UBIN $FUSE_OPT $UNION_OPT ${U1STDIR}:${U2NDDIR} $UNIONDIR
|
|
mount --bind $UNIONDIR $TMPDIR
|
|
}
|
|
|
|
|
|
|
|
#/**
|
|
# ogConfigureLoopback
|
|
#@brief Configura la interfaz loopback para cliente torrent
|
|
#@param
|
|
#@return
|
|
#@exception OG_ERR_FORMAT Formato incorrecto.
|
|
#@version 0.9 Usando funciones generales de ubuntu
|
|
#@author Antonio J. Doblas. Universidad de Malaga.
|
|
#@date 2010/05/24
|
|
#@version 1.0.1 Deteccion automatica de interfaz con enlace activo.
|
|
#@author Antonio J. Doblas. Universidad de Malaga.
|
|
#@date 2011/05/24
|
|
#*/ ##
|
|
ogConfigureLoopback()
|
|
{
|
|
# for the portmapper we need localhost
|
|
ifconfig lo 127.0.0.1
|
|
#/etc/init.d/portmap start
|
|
}
|
|
|
|
#/**
|
|
# ogConfigureNetworking
|
|
#@brief Configura la interfaz de red usada en el pxe
|
|
#@param
|
|
#@return
|
|
#@exception OG_ERR_FORMAT Formato incorrecto.
|
|
#@version 0.9
|
|
#@author Antonio J. Doblas. Universidad de Malaga.
|
|
#@date 2010/05/24
|
|
#*/ ##
|
|
ogConfigureNetworking()
|
|
{
|
|
#echo "ogConfigureNetworking: Buscando interfaz a configurar DEVICE"
|
|
if [ -n "${BOOTIF}" ]
|
|
then
|
|
#echo " variable BOOTIF exportada con pxelinux.0 con valor $BOOTIF"
|
|
IP=$IPOPTS
|
|
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
|
|
else
|
|
#echo "variable BOOTIF no exportada, intentamos detectar que interfaz se ha iniciado"
|
|
IP=$ip
|
|
#TODO Detectar que interfaz se ha iniciado
|
|
case "$IP" in
|
|
none|off)
|
|
return 0
|
|
;;
|
|
""|on|any)
|
|
# Bring up device
|
|
DEVICE=1
|
|
;;
|
|
dhcp|bootp|rarp|both)
|
|
DEVICE=1
|
|
;;
|
|
*)
|
|
DEVICE=`echo $IP | cut -f6 -d:`
|
|
;;
|
|
esac
|
|
fi
|
|
DEVICE=$(ogGetNetworkDevice $DEVICE)
|
|
if [ -z "${DEVICE}" ]; then
|
|
echo "variable DEVICE con valor $DEVICE no encontrada, llamamos de nuevo a ogconfigure_networking"
|
|
ogConfigureNetworking
|
|
fi
|
|
|
|
[ -n "${DEVICE}" ] && [ -e /run/net-"${DEVICE}".conf ] && return 0
|
|
#if [ -n "${DEVICE}" ] && [ -e /run/net-"${DEVICE}".conf ]; then
|
|
# echo "variable DEVICE con valor $DEVICE y fichero /run/net-$DEVICE encontrados"
|
|
# return 0
|
|
#else
|
|
# echo "variable DEVICE con valor $DEVICE encontrada, procedemos a configurala y a crear el fichero /run/net-$DEVICE"
|
|
#fi
|
|
|
|
# Activamos la interfaz antes de configurar.
|
|
ip address flush $DEVICE
|
|
ip link set dev $DEVICE up
|
|
# Si no se detecta señal portadora volver a configurar.
|
|
sleep 1
|
|
CARRIER=$(cat /sys/class/net/${DEVICE}/carrier)
|
|
if [ "$CARRIER" != "1" ]
|
|
then
|
|
ogConfigureNetworking
|
|
fi
|
|
|
|
# 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 /run/net-"${DEVICE}".conf ]; then
|
|
break;
|
|
fi
|
|
case "$IP" in
|
|
none|off)
|
|
return 0
|
|
;;
|
|
""|on|any)
|
|
# Bring up device
|
|
echo "Setting $DEVICE with option:on|any and Variable IP= $IP: ipconfig -t ${ROUNDTTT} ${DEVICE} "
|
|
ipconfig -t ${ROUNDTTT} ${DEVICE}
|
|
;;
|
|
dhcp|bootp|rarp|both)
|
|
echo "Setting $DEVICE with option:dhcp|bootp|rarp|both and Variable IP= $IP: ipconfig -t ${ROUNDTTT} -c ${IP} -d ${DEVICE} "
|
|
ipconfig -t ${ROUNDTTT} -c ${IP} -d ${DEVICE}
|
|
;;
|
|
*)
|
|
echo "Setting $DEVICE with option * and Variable IP= $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
|
|
export DEVICE
|
|
export DEVICECFG="/run/net-${DEVICE}.conf"
|
|
# En algunos casos, el fichero de configuración está en /tmp.
|
|
[ ! -f $DEVICECFG -a -f ${DEVICECFG/run/tmp} ] && mv ${DEVICECFG/run/tmp} $DEVICECFG
|
|
source $DEVICECFG
|
|
echo "DEVICE=$DEVICE" >> $CFGINITRD
|
|
echo "DEVICECFG=$DEVICECFG" >> $CFGINITRD
|
|
echo "exportando variable DEVICE con valor = $DEVICE y DEVICECFG con valor $DEVICECFG"
|
|
# Compatibilidad con versiones anteriores.
|
|
ln -fs $DEVICECFG /tmp
|
|
else
|
|
# source any interface as not exaclty specified
|
|
source /run/net-*.conf
|
|
fi
|
|
}
|
|
|
|
|
|
#/**
|
|
# ogYesNo
|
|
#@brief Gestion de peticiones de usuario en modo ogdebug=true
|
|
#@param1 OPTIONS --timeout N --default ANSWER
|
|
#@param1 Questions
|
|
#@return 1=yes 0=no
|
|
#@exception OG_ERR_FORMAT Formato incorrecto.
|
|
#@version 0.9
|
|
#@author:
|
|
#@date 2010/05/24
|
|
#*/ ##
|
|
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" ]]
|
|
}
|
|
|