diff options
author | ramon <ramongomez@us.es> | 2011-06-15 11:32:53 +0000 |
---|---|---|
committer | ramon <ramongomez@us.es> | 2011-06-15 11:32:53 +0000 |
commit | ecd8d9ac7a4419618f471815d748a51923d90aea (patch) | |
tree | 5e4e60b889df53993b557f907e00d468bc7fde71 /client | |
parent | 61dabee7d4cd985599233fd3e9c07a76e5e85f84 (diff) |
Integrar OpenGnSys 1.0.1 en rama principal (modifica #413).
git-svn-id: https://opengnsys.es/svn/trunk@2065 a21b9725-9963-47de-94b9-378ad31fedc9
Diffstat (limited to 'client')
31 files changed, 1973 insertions, 482 deletions
diff --git a/client/boot-tools/clientstructure/etc/initramfs-tools/hooks/oghooks b/client/boot-tools/clientstructure/etc/initramfs-tools/hooks/oghooks index 51f452ff..67f807ab 100755 --- a/client/boot-tools/clientstructure/etc/initramfs-tools/hooks/oghooks +++ b/client/boot-tools/clientstructure/etc/initramfs-tools/hooks/oghooks @@ -43,6 +43,8 @@ mkdir -p ${DESTDIR}/boot; copy_exec /bin/bash-static /bin/bash copy_exec /usr/bin/unionfs-fuse copy_exec /sbin/mount.cifs +copy_exec /sbin/mount.smbfs +copy_exec /bin/lsmod # Insert OpenGnsys Engine @@ -54,5 +56,7 @@ manual_add_modules cifs manual_add_modules smbfs manual_add_modules atl1e manual_add_modules squashfs +manual_add_modules md4 + diff --git a/client/boot-tools/clientstructure/etc/initramfs-tools/scripts/ogfunctions b/client/boot-tools/clientstructure/etc/initramfs-tools/scripts/ogfunctions index ef6f00c8..16539dd6 100644 --- a/client/boot-tools/clientstructure/etc/initramfs-tools/scripts/ogfunctions +++ b/client/boot-tools/clientstructure/etc/initramfs-tools/scripts/ogfunctions @@ -20,25 +20,31 @@ 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 + export CFGINITRD="/tmp/initrd.cfg" + echo "puntos de accesos al servidor ogprotocol=nfs" >> $CFGINITRD + export NFSROOTBOOT="/var/lib/tftpboot" && echo "NFSROOTBOOT=$NFSROOTBOOT" >> $CFGINITRD + export NFSCLIENTDIR="/opt/opengnsys/client" && echo "NFSCLIENDIR=$NFSCLIENTDIR" >> $CFGINITRD + export NFSLOGDIR="/opt/opengnsys/log/clients" && echo "NFSLOGDIR=$NFSLOGDIR" >> $CFGINITRD + export NFSIMGDIR="/opt/opengnsys/images" && echo "NFSIMGDIR=$NFSIMGDIR" >> $CFGINITRD + echo "puntos de accesos al servidor ogprotocol=smb" >> $CFGINITRD + export SMBROOTBOOT="tftpboot" && echo "SMBROOTBOOT=$SMBROOTBOOT" >> $CFGINITRD + export SMBCLIENTDIR="ogclient" && echo "SMBCLIENTDIR=$SMBCLIENTDIR" >> $CFGINITRD + export SMBLOGDIR="oglog" && echo "SMBLOGDIR=$SMBLOGDIR" >> $CFGINITRD + export SMBIMGDIR="ogimages" && echo "SMBIMGDIR=$SMBIMGDIR" >> $CFGINITRD + + echo "puntos de montaje local para los contenedores" >> $CFGINITRD + export LOCALROOTBOOT="/opt/og2fs/tftpboot" && echo "LOCALROOTBOOT=$LOCALROOTBOOT" >> $CFGINITRD + export LOCALCLIENTDIR="/opt/opengnsys" && echo "LOCALCLIENTDIR=$LOCALCLIENTDIR" >> $CFGINITRD + export LOCALLOGDIR="/opt/opengnsys/log" && echo "LOCALLOGDIR=$LOCALLOGDIR" >> $CFGINITRD + export LOCALIMGDIR="/opt/opengnsys/images" && echo "LOCALIMGDIR=$LOCALIMGDIR" >> $CFGINITRD + + echo "puntos de montajes para realizar la integración unionfs entre el initrd y el sistema root" >> $CFGINITRD + #punto de montaje donde se accede al 2nd FS mediante loop + export LOCALROOTIMG="/opt/og2fs/2ndfs" && echo "LOCALROOTIMG=$LOCALROOTIMG" >> $CFGINITRD + #punto de montaje para unionfs + export LOCALROOTRAM="/opt/og2fs/1stfs" && echo "LOCALROOTRAM=$LOCALROOTRAM" >> $CFGINITRD + #punto de union entreo LOCALROOTIMG y LOCALROOTRAM + export LOCALROOTUNION="/opt/og2fs/unionfs" && echo "LOCALROOTUNION=$LOCALROOTUNION" >> $CFGINITRD ##INFORMACION DE OTRAS VARIABLES OBTENDIAS EN OTRAS FUNCIONES. #ogGetROOTSERVER() ip del servidor pxe, valor obtenido automaticamente desde dhcpd. #IPV4DDR @@ -92,6 +98,14 @@ ogPostConfigureFS() echo "link-local 169.254.0.0" >> /etc/networks echo "localnet $NETIP" >> /etc/networks #route + + #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 /opt/og2fs/tftpboot /opt/opengnsys/cache + [ "$ogprotocol" == "local" ] && ln -s /opt/og2fs/2ndfs/opt/opengnsys/* /opt/opengnsys/ + + } @@ -120,6 +134,7 @@ ogGetROOTSERVER () fi fi export ROOTSERVER + echo "ROOTSERVER=$ROOTSERVER" >> $CFGINITRD return 0 } @@ -136,10 +151,15 @@ else fi case "$ogprotocol" in - cdrom) - echo "Montar imagen de CD-ROM" - blkid /dev/s* - mount -t iso9660 LABEL=ogClient $LOCALROOTBOOT + local) + echo "Montar imagen del sistema root desde dispositivo local" + for i in $(blkid /dev/s* | grep ogClient | awk -F: '{print $2}' | tr -d \"); do export $i; done + mount -t $TYPE LABEL=$LABEL $LOCALROOTBOOT + if [ $? != 0 ] + then + mount -t reiserfs LABEL=CACHE $LOCALROOTBOOT + export LOCALMEDIA=CACHE + fi ;; httfs) echo "protocolo httfs aun no soportado" @@ -240,77 +260,104 @@ ifconfig lo 127.0.0.1 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 +#echo "ogconfigure_networking: 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=eth0 + ;; + dhcp|bootp|rarp|both) + DEVICE=eth0 + ;; + *) + DEVICE=`echo $IP | cut -f6 -d:` + ;; + esac +fi +if [ -z "${DEVICE}" ]; then + echo "variable DEVICE con valor $DEVICE no encontrada, llamamos de nuevo a ogconfigure_networking" + ogconfigure_networking +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 +[ -n "${DEVICE}" ] && [ -e /tmp/net-"${DEVICE}".conf ] && return 0 +#if [ -n "${DEVICE}" ] && [ -e /tmp/net-"${DEVICE}".conf ]; then +# echo "variable DEVICE con valor $DEVICE y fichero /tmp/net-$DEVICE encontrados" +# return 0 +#else +# echo "variable DEVICE con valor $DEVICE encontrada, procedemos a configurala y a crear el fichero /tmp/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 + ogconfigure_networking +fi - case ${IP} in - none|off) - # Do nothing - ;; - ""|on|any) +# 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) + return 0 + ;; + ""|on|any) # Bring up device - echo "Setting $DEVICE with kernel params $IP: ipconfig -t ${ROUNDTTT} ${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 (dhcp) kernel params $IP: ipconfig -t ${ROUNDTTT} -c ${IP} -d ${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 kernel params $IP: ipconfig -t ${ROUNDTTT} -d $IP " + ;; + *) + 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 @@ -322,18 +369,23 @@ IP=$IPOPTS 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 + ;; + esac +done + +# source ipconfig output +if [ -n "${DEVICE}" ]; then + . /tmp/net-${DEVICE}.conf + DEVICECFG="/tmp/net-${DEVICE}" + export DEVICECFG + export DEVICE + echo "DEVICE=$DEVICE" >> $CFGINITRD + echo "DEVICECFG=$DEVICECFG" >> $CFGINITRD + echo "exportando variable DEVICE con valor = $DEVICE y el DEVICECFG con valor $DEVICECFG" +else + # source any interface as not exaclty specified + . /tmp/net-*.conf +fi } ##################################################################### diff --git a/client/boot-tools/clientstructure/etc/ssh/sshd_config b/client/boot-tools/clientstructure/etc/ssh/sshd_config index ea0303b3..80900684 100644 --- a/client/boot-tools/clientstructure/etc/ssh/sshd_config +++ b/client/boot-tools/clientstructure/etc/ssh/sshd_config @@ -11,7 +11,7 @@ Protocol 2 HostKey /etc/ssh/ssh_host_rsa_key HostKey /etc/ssh/ssh_host_dsa_key #Privilege Separation is turned on for security -UsePrivilegeSeparation yes +UsePrivilegeSeparation no # Lifetime and size of ephemeral version 1 server key KeyRegenerationInterval 3600 diff --git a/client/boot-tools/kernelParameterOG.es.txt b/client/boot-tools/kernelParameterOG.es.txt index 4ec96c8a..66d7fcfa 100644 --- a/client/boot-tools/kernelParameterOG.es.txt +++ b/client/boot-tools/kernelParameterOG.es.txt @@ -28,7 +28,10 @@ ip= og2nd=sqfs|img #protocolo de acceso al og2nd. - ogprotocol=smb|nfs + ogprotocol=smb|nfs|local + #local para cdrom, usb a partir de la iso. labelparticionusbUNETBOOTIN=ogClient + #loacl tambien para fichero.sqfs en cache. + # modo de funcionalidad del browser con shell root activa. ogactiveadmin=true|false diff --git a/client/boot-tools/ogClientManager.lib b/client/boot-tools/ogClientManager.lib index 438ee56a..9f56ec4a 100644 --- a/client/boot-tools/ogClientManager.lib +++ b/client/boot-tools/ogClientManager.lib @@ -385,6 +385,117 @@ rm /tmp/id_dsa.pub } + +function ogCrearISO { +apt-get install syslinux genisoimage +#TODO: deb http://free.nchc.org.tw/drbl-core drbl stable +#apt-get install gpxe +mkdir -p /tmp/iso/isolinux +#cd tmp/iso/ +cp -prv /usr/lib/syslinux/* /tmp/iso/isolinux/ +cp -prv /usr/share/gpxe/* /tmp/iso/isolinux/ +mkdir -p /tmp/iso/ogclient +#el ogclienteToISO debe tener una copia del ogvmlinuz como linuxISO +cp -prv /var/lib/tftpboot/ogclientToIso/* /tmp/iso/ogclient + + +cat << FIN > /tmp/iso/isolinux/isolinux.cfg +DEFAULT menu.c32 +PROMPT 0 +ALLOWOPTIONS 1 + +MENU TITLE OpenGnsys 1.0.1 v00 + +LABEL gpxe +MENU LABEL gpxe +KERNEL /clonezilla/live/vmlinuz1 +APPEND initrd=/clonezilla/live/initrd1.img boot=live union=aufs noswap vga=788 ip=frommedia + + +#default 0 +#prompt 1 +#timeout 100 + +#display mensaje.txt + + + + +LABEL 0 +MENU LABEL ogClient vga irqpool acpi ogdebug ip:none +KERNEL /ogclient/linuxISO +APPEND initrd=/ogclient/oginitrd.img ro vga=788 irqpoll acpi=on boot=oginit og2nd=sqfs ogprotocol=local ogactiveadmin=true ogdebug=true ip=none + +LABEL 1 +MENU LABEL ogClient irqpoll acpi ip:none +KERNEL /ogclient/linuxISO +APPEND initrd=/ogclient/oginitrd.img ro irqpoll acpi=on boot=oginit og2nd=sqfs ogprotocol=local ogactiveadmin=true ogdebug=false ip=none + +LABEL 2 +MENU LABEL ogClient acpi debug ip=dhcp +KERNEL /ogclient/linuxISO +APPEND initrd=/ogclient/oginitrd.img ro acpi=on boot=oginit og2nd=sqfs ogprotocol=local ogactiveadmin=true ogdebug=true ip=dhcp + +LABEL 3 +MENU LABEL ogClient ip=dhcp +KERNEL /ogclient/linuxISO +APPEND initrd=/ogclient/oginitrd.img ro acpi=off boot=oginit og2nd=sqfs ogprotocol=local ogactiveadmin=true ogdebug=false ip=dhcp + + +#LABEL ogclient +#KERNEL /ogclient/linuxISO +#APPEND initrd=/ogclient/initrdISO.img + +#KERNEL linuxISO +#APPEND initrd=initrdISO.img + +LABEL 4 +MENU LABEL local +localboot 0x80 +append - + + +label 5 +MENU LABEL Network boot via gPXE lkrn +KERNEL gpxe.lkrn + +label 5 +MENU LABEL Network boot via gPXE usb +KERNEL gpxe.usb + +label 5 +MENU LABEL Network boot via gPXE pxe +KERNEL gpxe.pxe + +label 5 +MENU LABEL Network boot via gPXE iso +KERNEL gpxe.iso +FIN +#### /tmp/iso# +mkisofs -V ogClient -o ogClient.iso -b isolinux/isolinux.bin -c isolinux/boot.cat -J -no-emul-boot -boot-load-size 4 -boot-info-table tmp/iso + +### vi /etc/grub.d/40_custom +## +#menuentry "og cache " { +#set root=(hd0,4) +#linux /ogvmlinuz ro vga=788 irqpoll acpi=on boot=oginit og2nd=sqfs ogprotocol=local ogactiveadmin=true ogdebug=true ip=none +#initrd /oginitrd.img +#} + + +} + +function ogprobarISO { +#/tmp/iso +qemu -m 256 -boot d -cdrom ogClient.iso +} + + + + + + + ogClientConfpxe() { ################## DEJAMOS FICHERO DE EJEMPLOS PARA: diff --git a/client/engine/Boot.lib b/client/engine/Boot.lib index 424bee3a..8731580f 100755 --- a/client/engine/Boot.lib +++ b/client/engine/Boot.lib @@ -68,9 +68,21 @@ case "$TYPE" in [ -z "$LOADER" ] && ogRaiseError $OG_ERR_NOTOS && return $? # Activar la partición y copiar Grub4DOS. ogSetPartitionActive $1 $2 - cp $OGLIB/grub4dos/* $MNTDIR # */ (Comentario Doxygen) - #kexec -l $MNTDIR/grub.exe --append=--config-file="find --set-root /$LOADER; chainloader /$LOADER; tpm --init" - kexec -l $MNTDIR/grub.exe --append=--config-file="root (hd$[$1-1],$[$2-1]); chainloader (hd$[$1-1],$[$2-1])/$LOADER; tpm --init" + #FIXME: activar seguimiento inicio sesion XP con grub4dos + #if `ogGetOsVersion $1 $2 | grep "XP" > /dev/null` + #then + # dd if=/dev/zero of=${MNTDIR}/ogboot.me bs=1024 count=3 + # dd if=/dev/zero of=${MNTDIR}/ogboot.firstboot bs=1024 count=3 + # dd if=/dev/zero of=${MNTDIR}/ogboot.secondboot bs=1024 count=3 + # ogLoadHiveWindows $1 $2 + # ogHiveNTRunMachine "cmd /c del c:\ogboot.* " ogcleanboot + # ogUpdateHiveWindows + # reboot + #else + cp $OGLIB/grub4dos/* $MNTDIR # */ (Comentario Doxygen) + ##kexec -l $MNTDIR/grub.exe --append=--config-file="find --set-root /$LOADER; chainloader /$LOADER; tpm --init" + kexec -l $MNTDIR/grub.exe --append=--config-file="root (hd$[$1-1],$[$2-1]); chainloader (hd$[$1-1],$[$2-1])/$LOADER; tpm --init" + #fi ;; *) ogRaiseError $OG_ERR_PARTITION "$1, $2" return $? @@ -83,54 +95,6 @@ kexec -e #/** -# ogGetRegistryValue path_mountpoint str_registrytype str_valuename -#@brief Devuelve el dato de un valor del registro de Windows. -#@param path_mountpoint directorio donde está montado el sistema Windows -#@param str_registrytype tipo de registro a leer -#@param str_valuename valor de registro -#@return str_valuedata - valor de la clave. -#@exception OG_ERR_FORMAT Formato incorrecto. -#@exception OG_ERR_NOTFOUND Disco o partición no corresponden con un dispositivo. -#@exception OG_ERR_PARTITION Tipo de partición desconocido o no se puede montar. -#@note registrytype = { default, sam, security, software, system, components } -#@warning Requisitos: chntpw, awk -#@warning La partición de Windows debe estar montada previamente. -#@version 0.9 - Adaptación para OpenGNSys. -#@author Ramon Gomez, ETSII Universidad de Sevilla -#@date 2009-09-11 -#*/ ## -function ogGetRegistryValue () -{ -# Variables locales. -local FILE FILENT FILEXP - -# Si se solicita, mostrar ayuda. -if [ "$*" == "help" ]; then - ogHelp "$FUNCNAME" "$FUNCNAME path_mountpoint str_registrytype str_key" - return -fi -# Error si no se reciben 3 parámetros. -[ $# == 3 ] || ogRaiseError $OG_ERR_FORMAT || return $? - -# Camino del fichero de registro en NT/2000 o XP/Vista/7. -FILENT=$(ogGetPath "/$1/winnt/system32/config/$2") -[ -f $FILENT ] && FILE="$FILENT" -FILEXP=$(ogGetPath "/$1/windows/system32/config/$2") -[ -f $FLEHXP ] && FILE="$FILEXP" -[ ! -f $FILE ] && ogRaiseError OG_ERR_NOTFOUND "$1,$2" && return $? - -# Devolver el dato del valor de registro. -# /* (comentario Doxygen) -chntpw $FILE << FIN 2>/dev/null | awk '/> Value/ {getline;print $0;}' -cd ${3%\\*} -cat ${3##*\\} -q -FIN -# (comentario Doxygen) */ -} - - -#/** # ogGetWindowsName int_ndisk int_npartition #@brief Muestra el nombre del equipo en el registro de Windows. #@param int_ndisk nº de orden del disco @@ -167,51 +131,6 @@ ogGetRegistryValue $MNTDIR system '\ControlSet001\Control\ComputerName\ComputerN #/** -# ogListRegistryKeys path_mountpoint str_registrytype str_key -#@brief Lista los nombres de claves de una determinada clave del registro de Windows. -#@param path_mountpoint directorio donde está montado el sistema Windows -#@param str_registrytype tipo de registro a leer -#@param str_key clave de registro -#@return str_key ... - lista de claves de registro -#@exception OG_ERR_FORMAT Formato incorrecto. -#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo. -#@exception OG_ERR_PARTITION Tipo de partición desconocido o no se puede montar. -#@note registrytype = { default, sam, security, software, system, components } -#@warning Requisitos: chntpw, awk -#@warning La partición de Windows debe estar montada previamente. -#@version 0.9 - Adaptación para OpenGNSys. -#@author Ramon Gomez, ETSII Universidad de Sevilla -#@date 2009-09-23 -#*/ ## -function ogListRegistryKeys () -{ -# Variables locales. -local FILE FILENT FILEXP - -# Si se solicita, mostrar ayuda. -if [ "$*" == "help" ]; then - ogHelp "$FUNCNAME" "$FUNCNAME path_mountpoint str_registrytype str_key" - return -fi -# Error si no se reciben 3 parámetros. -[ $# == 3 ] || ogRaiseError $OG_ERR_FORMAT || return $? - -# Camino del fichero de registro en NT/2000 o XP/Vista/7. -FILENT=$(ogGetPath "/$1/winnt/system32/config/$2") -[ -f $FILENT ] && FILE="$FILENT" -FILEXP=$(ogGetPath "/$1/windows/system32/config/$2") -[ -f $FLEHXP ] && FILE="$FILEXP" -[ ! -f $FILE ] && ogRaiseError OG_ERR_NOTFOUND "$1,$2" && return $? - -# Devolver la lista de claves de registro. -chntpw $FILE << FIN 2>/dev/null | awk 'BEGIN {FS="[<>]"} $1~/^ $/ {print $2}' -ls $3 -q -FIN -} - - -#/** # ogLinuxBootParameters int_ndisk int_npartition #@brief Muestra los parámetros de arranque de un sistema de archivos Linux. #@param int_ndisk nº de orden del disco @@ -273,55 +192,6 @@ awk 'BEGIN {cont=-1;} } - -#/** -# ogSetRegistryValue path_mountpoint str_registrytype str_valuename str_valuedata -#@brief Establece el dato asociado a un valor del registro de Windows. -#@param path_mountpoint directorio donde está montado el sistema Windows -#@param str_registrytype tipo de registro -#@param str_valuename nombre del valor de registro -#@param str_valuedata dato del valor de registro -#@return (nada) -#@exception OG_ERR_FORMAT Formato incorrecto. -#@exception OG_ERR_NOTFOUND Disco o partición no corresponden con un dispositivo. -#@exception OG_ERR_PARTITION Tipo de partición desconocido o no se puede montar. -#@note registrytype = { default, sam, security, software, system, components } -#@warning Requisitos: chntpw, awk -#@warning La partición de Windows debe estar montada previamente. -#@version 0.9 - Adaptación para OpenGNSys. -#@author Ramon Gomez, ETSII Universidad de Sevilla -#@date 2009-09-24 -#*/ ## -function ogSetRegistryValue () -{ -# Variables locales. -local FILE FILENT FILEXP - -# Si se solicita, mostrar ayuda. -if [ "$*" == "help" ]; then - ogHelp "$FUNCNAME" "$FUNCNAME path_mountpoint str_registrytype str_key" - return -fi -# Error si no se reciben 4 parámetros. -[ $# == 4 ] || ogRaiseError $OG_ERR_FORMAT || return $? - -# Camino del fichero de registro en NT/2000 o XP/Vista/7. -FILENT=$(ogGetPath "/$1/winnt/system32/config/$2") -[ -f $FILENT ] && FILE="$FILENT" -FILEXP=$(ogGetPath "/$1/windows/system32/config/$2") -[ -f $FLEHXP ] && FILE="$FILEXP" -[ ! -f $FILE ] && ogRaiseError OG_ERR_NOTFOUND "$1,$2" && return $? - -# Cambiar el dato del valor de registro. -chntpw $FILE << FIN &>/dev/null -ed $3 -$4 -q -y -FIN -} - - #/** # ogSetWindowsName int_ndisk int_npartition str_name #@brief Establece el nombre del equipo en el registro de Windows. @@ -403,7 +273,7 @@ ogSetRegistryValue $MNTDIR SOFTWARE '\Microsoft\Windows NT\CurrentVersion\Winlog #/** -# ogNewMbrXP int_ndisk +# ogBootMbrXP int_ndisk #@brief Genera un nuevo Master Boot Record en el disco duro indicado, compatible con los SO tipo Windows #@param int_ndisk nº de orden del disco #@return salida del programa my-sys @@ -414,7 +284,7 @@ ogSetRegistryValue $MNTDIR SOFTWARE '\Microsoft\Windows NT\CurrentVersion\Winlog #@date 2009-09-24 #*/ ## -function ogNewMbrXP () +function ogBootMbrXP () { # Variables locales. local PART @@ -433,3 +303,279 @@ ms-sys -z -f $PART ms-sys -m -f $PART } + +#/** +# ogBootMbrGeneric int_ndisk +#@brief Genera un nuevo Codigo de arranque en el MBR del disco indicado, compatible con los SO tipo Windows, Linux. +#@param int_ndisk nº de orden del disco +#@return salida del programa my-sys +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_NOTFOUND Tipo de partición desconocido o no se puede montar. +#@version 0.9 - Adaptación a OpenGNSys. +#@author Antonio J. Doblas Viso. Universidad de Málaga +#@date 2009-09-24 +#*/ ## + +function ogBootMbrGeneric () +{ +# Variables locales. +local PART + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk " \ + "$FUNCNAME 1 " + return +fi +# Error si no se reciben 1 parámetros. +[ $# == 1 ] || return $(ogRaiseError $OG_ERR_FORMAT; echo $?) + +PART="$(ogDiskToDev $1)" || return $(ogRaiseError $OG_ERR_NOTFOUND; echo $?) +ms-sys -z -f $PART +ms-sys -s -f $PART +} + + + + +#/** +# ogFixBootSector int_ndisk int_parition +#@brief Corrige el boot sector de una particion activa para MS windows/dos -fat-ntfs +#@param int_ndisk nº de orden del disco +#@param int_partition nº de particion +#@return +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_PARTITION Tipo de partición desconocido o no se puede montar. +#@version 0.9 - Adaptación a OpenGNSys. +#@author Antonio J. Doblas Viso. Universidad de Málaga +#@date 2009-09-24 +#*/ ## + +function ogFixBootSector () +{ +# Variables locales. +local PART DISK FILE + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_partition " \ + "$FUNCNAME 1 1 " + return +fi + +# Error si no se reciben 2 parámetros. +[ $# == 2 ] || return $(ogRaiseError $OG_ERR_FORMAT; echo $?) + +#TODO, solo si la particion existe +#TODO, solo si es ntfs o fat +PARTYPE=$(ogGetPartitionId $1 $2) +case $PARTYPE in + 1|4|6|7|b|c|e|f) + ;; + *) + return $(ogRaiseError $OG_ERR_PARTITION; echo $?) + ;; +esac + +ogUnmount $1 $2 || return $(ogRaiseError $OG_ERR_PARTITION; echo $?) + +#Preparando instruccion +let DISK=$1-1 +PART=$2 +FILE=/tmp/temporal +cat > $FILE <<EOF +disk=$DISK +main_part=$PART +fix_first_sector=yes +EOF + +spartlnx.run -cui -nm -a -f $FILE + +} + + + +#/** +# ogWindowsBootParameters int_ndisk int_parition +#@brief Configura el gestor de arranque de windows 7 / vista / XP / 2000 +#@param int_ndisk nº de orden del disco +#@param int_partition nº de particion +#@return +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_PARTITION Tipo de partición desconocido o no se puede montar. +#@version 0.9 - Integración desde EAC para OpenGNSys. +#@author Antonio J. Doblas Viso. Universidad de Málaga +#@date 2009-09-24 +#@version 1.0.1 - Adapatacion para OpenGnsys. +#@author Antonio J. Doblas Viso. Universidad de Málaga +#@date 2011-05-20 +#*/ ## + + +function ogWindowsBootParameters () +{ +# Variables locales. +local PART DISK FILE +#Preparando variables adaptadas a sintaxis windows. +let DISK=$1-1 +PART=$2 +FILE=/tmp/temporal + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_partition " \ + "$FUNCNAME 1 1 " + return +fi + +# Error si no se reciben 2 parámetros. +[ $# == 2 ] || return $(ogRaiseError $OG_ERR_FORMAT; echo $?) + +ogDiskToDev $1 $2 || return $(ogRaiseError $OG_ERR_PARTITION; echo $?) + +VERSION=$(ogGetOsVersion $1 $2) + +if echo "$VERSION" | grep "Windows 7" +then + WINVER="Windows 7" +elif echo "$VERSION" | grep "Windows Seven" +then + WINVER="Windows Vista" +elif echo "$VERSION" | grep "XP" +then + MOUNT=$(ogMount $1 $2) + [ -f ${MOUNT}/boot.ini ] || return $(ogRaiseError $OG_ERR_NOTOS; echo $?) + cat ${MOUNT}/boot.ini | sed s/partition\([0-9]\)/partition\($PART\)/g | sed s/rdisk\([0-9]\)/rdisk\($DISK\)/g > ${MOUNT}/tmp.boot.ini; mv ${MOUNT}/tmp.boot.ini ${MOUNT}/boot.ini + return 0 +else + return $(ogRaiseError $OG_ERR_NOTOS; echo $?) +fi + +ogUnmount $1 $2 || return $(ogRaiseError $OG_ERR_PARTITION; echo $?) + + +#Preparando instruccion Windows Resume Application +cat > $FILE <<EOF +boot_disk=$DISK +boot_main_part=$PART +disk=$DISK +main_part=$PART +boot_entry=Windows Resume Application +EOF +spartlnx.run -cui -nm -w -f $FILE + +#Preparando instruccion tipo windows +cat > $FILE <<EOF +boot_disk=$DISK +boot_main_part=$PART +disk=$DISK +main_part=$PART +boot_entry=$WINVER +EOF +spartlnx.run -cui -nm -w -f $FILE + +##Preparando instruccion Ramdisk Options +#cat > $FILE <<EOF +#boot_disk=$DISK +#boot_main_part=$PART +#disk=$DISK +#main_part=$PART +#boot_entry=Ramdisk Options +#EOF +#spartlnx.run -cui -nm -w -f $FILE + +#Preparando instruccion Windows Boot Manager +cat > $FILE <<EOF +boot_disk=$DISK +boot_main_part=$PART +disk=$DISK +main_part=$PART +boot_entry=Windows Boot Manager +EOF +spartlnx.run -cui -nm -w -f $FILE + +#Preparando instruccion Herramienta de diagnóstico de memoria de Windows +#cat > $FILE <<EOF +#boot_disk=$DISK +#boot_main_part=$PART +#disk=$DISK +#main_part=$PART +#boot_entry=Herramienta de diagnóstico de memoria de Windows +#EOF +#spartlnx.run -cui -nm -w -f $FILE + +} + + +# ogWindowsRegisterPartition int_ndisk int_partiton str_volume int_disk int_partition +#@brief Registra una partición en windows con un determinado volumen. +#@param int_ndisk nº de orden del disco a registrar +#@param int_partition nº de particion a registrar +#@param str_volumen volumen a resgistar +#@param int_ndisk_windows nº de orden del disco donde esta windows +#@param int_partition_windows nº de particion donde esta windows +#@return +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_PARTITION Tipo de partición desconocido o no se puede montar. +#@version 0.9 - Adaptación a OpenGNSys. +#@author Antonio J. Doblas Viso. Universidad de Málaga +#@date 2009-09-24 +#*/ ## + + +function ogWindowsRegisterPartition () +{ +# Variables locales. +local PART DISK FILE + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk_TO_registre int_partition_TO_registre str_NewVolume int_disk int_parition " \ + "$FUNCNAME 1 1 c: 1 1" + return +fi + +# Error si no se reciben 5 parámetros. +[ $# == 5 ] || return $(ogRaiseError $OG_ERR_FORMAT; echo $?) + +REGISTREDDISK=$1 +REGISTREDPART=$2 +REGISTREDVOL=$(echo $3 | cut -c1 | tr '[:lower:]' '[:upper:]') +DISK=$4 +PART=$5 +FILE=/tmp/temporal + +ogDiskToDev $REGISTREDDISK $REGISTREDPART || return $(ogRaiseError $OG_ERR_PARTITION "particion a registrar "; echo $?) +ogDiskToDev $DISK $PART || return $(ogRaiseError $OG_ERR_PARTITION "particion de windows"; echo $?) + +ogGetOsType $DISK $PART | grep "Windows" || return $(ogRaiseError $OG_ERR_NOTOS "no es windows"; echo $?) + +VERSION=$(ogGetOsVersion $DISK $PART) + +#Systemroot + +if ogGetPath $DISK $PART WINDOWS +then + SYSTEMROOT="Windows" +elif ogGetPath $DISK $PART WINNT +then + SYSTEMROOT="winnt" +else + return $(ogRaiseError $OG_ERR_NOTOS; echo $?) +fi + +ogUnmount $DISK $PART +let DISK=$DISK-1 +let REGISTREDDISK=$REGISTREDDISK-1 +#Preparando instruccion Windows Boot Manager +cat > $FILE <<EOF +windows_disk=$DISK +windows_main_part=$PART +windows_dir=$SYSTEMROOT +disk=$REGISTREDDISK +main_part=$REGISTREDPART +;ext_part +part_letter=$REGISTREDVOL +EOF +spartlnx.run -cui -nm -u -f $FILE +} diff --git a/client/engine/Disk.lib b/client/engine/Disk.lib index 8f7fd0d7..7d4f0642 100755 --- a/client/engine/Disk.lib +++ b/client/engine/Disk.lib @@ -332,6 +332,31 @@ sfdisk -s $DISK #/** +# ogGetDiskType path_device +#@brief Muestra el tipo de disco (real, RAID, meta-disco, etc.). +#@warning Función en pruebas +#*/ ## +function ogGetDiskType () +{ +local DEV MAJOR TYPE + +# Obtener el driver del dispositivo de bloques. +[ -b "$1" ] || ogRaiseError $OG_ERR_FORMAT || return $? +DEV=${1#/dev/} +MAJOR=$(awk -v D="$DEV" '{if ($4==D) print $1;}' /proc/partitions) +TYPE=$(awk -v D=$MAJOR '/Block/ {bl=1} {if ($1==D&&bl) print toupper($2)}' /proc/devices) +# Devolver mnemónico del driver de dispositivo. +case "$TYPE" in + SD) TYPE="DISK" ;; + SR|IDE*) TYPE="CDROM" ;; # FIXME Comprobar discos IDE. + MD|CCISS*) TYPE="RAID" ;; + DEVICE-MAPPER) TYPE="MAPPER" ;; # FIXME Comprobar LVM y RAID. +esac +echo $TYPE +} + + +#/** # ogGetPartitionActive int_ndisk #@brief Muestra que particion de un disco esta marcada como de activa. #@param int_ndisk nº de orden del disco diff --git a/client/engine/File.lib b/client/engine/File.lib index bb91a6d1..52b48075 100755 --- a/client/engine/File.lib +++ b/client/engine/File.lib @@ -259,11 +259,14 @@ ogGetPath $PARENT # ogIsNewerFile [ str_repo | int_ndisk int_npart ] path_source [ str_repo | int_ndisk int_npart ] path_target #@brief Metafunción que indica se un fichero es más nuevo que otro. #@see ogGetPath -#@return int_code Código de salida +#@return Código de salida: 0 - nuevo, 1 - antiguo o error #@warning Deben existir tanto el fichero origen como el destino. #@version 0.9.2 - Primera versión para OpenGnSys. #@author Ramon Gomez, ETSII Universidad de Sevilla #@date 2010-07-24 +#@version 1.0.1 - Devolver falso en caso de error. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2011-05-18 #*/ ## function ogIsNewerFile () { @@ -289,9 +292,9 @@ case "$1" in shift 2 ;; esac # Comprobar que existen los ficheros origen y destino. -[ -n "$SOURCE" ] || ogRaiseError $OG_ERR_NOTFOUND "${ARGS% $*}" || return $? +[ -n "$SOURCE" ] || ogRaiseError $OG_ERR_NOTFOUND "${ARGS% $*}" || return 1 TARGET=$(ogGetPath "$@") -[ -n "$TARGET" ] || ogRaiseError $OG_ERR_NOTFOUND "$@" || return $? +[ -n "$TARGET" ] || ogRaiseError $OG_ERR_NOTFOUND "$@" || return 1 # Devolver si el primer fichero se ha modificado después que el segundo. test "$SOURCE" -nt "$TARGET" } diff --git a/client/engine/FileSystem.lib b/client/engine/FileSystem.lib index b54854b3..ca4486b0 100755 --- a/client/engine/FileSystem.lib +++ b/client/engine/FileSystem.lib @@ -367,10 +367,13 @@ mount | awk -v P=$PART '{if ($1==P) {print $3}}' #@brief Comprueba si un sistema de archivos está formateado. #@param int_ndisk nº de orden del disco o volumen. #@param int_npartition nº de orden del sistema de archivos. -#@return int_code Código de salida +#@return Código de salida: 0 - formateado, 1 - sin formato o error. #@version 0.91 - Adaptación inicial para comprobar que existe caché. #@author Ramon Gomez, ETSII Universidad de Sevilla #@date 2010-03-18 +#@version 1.0.1 - Devolver falso en caso de error. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2011-05-18 #*/ ## function ogIsFormated () { @@ -381,10 +384,10 @@ if [ "$*" == "help" ]; then "if $FUNCNAME 1 1; then ... ; fi" return fi -# Error si no se reciben 2 parámetros. -[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $? +# Falso, en caso de error. +[ $# == 2 ] || return 1 -DISK=$(ogDiskToDev "$1") +DISK=$(ogDiskToDev "$1") || return 1 test -n "$(parted -sm $DISK print 2>/dev/null | \ awk -F: -v fs=$2 '{if ($1==fs) print $5}')" } @@ -395,10 +398,13 @@ test -n "$(parted -sm $DISK print 2>/dev/null | \ #@brief Comprueba si un sistema de archivos está montado. #@param int_ndisk nº de orden del disco #@param int_npartition nº de orden de la partición -#@return Código de salida: 0 - sin montar, 1 - montado. +#@return Código de salida: 0 - montado, 1 - sin montar o error. #@version 0.9 - Primera versión para OpenGNSys. #@author Ramon Gomez, ETSII Universidad de Sevilla #@date 2009-10-15 +#@version 1.0.1 - Devolver falso en caso de error. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2011-05-18 #*/ ## function ogIsMounted () { @@ -408,8 +414,8 @@ if [ "$*" == "help" ]; then "if $FUNCNAME 1 1; then ... ; fi" return fi -# Error si no se reciben 2 parámetros. -[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $? +# Falso, en caso de error. +[ $# == 2 ] || return 1 test -n "$(ogGetMountPoint $1 $2)" } @@ -420,11 +426,14 @@ test -n "$(ogGetMountPoint $1 $2)" #@brief Comprueba si una partición está bloqueada por una operación de uso exclusivo. #@param int_ndisk nº de orden del disco #@param int_npartition nº de orden de la partición -#@return Código de salida: 0 - sin bloquear, 1 - bloqueada. +#@return Código de salida: 0 - bloqueado, 1 - sin bloquear o error. #@note El fichero de bloqueo se localiza en \c /var/lock/part, siendo \c part el dispositivo de la partición, sustituyendo el carácter "/" por "-". #@version 0.9 - Primera versión para OpenGNSys. #@author Ramon Gomez, ETSII Universidad de Sevilla #@date 2009-09-03 +#@version 1.0.1 - Devolver falso en caso de error. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2011-05-18 #*/ ## function ogIsLocked () { @@ -437,11 +446,11 @@ if [ "$*" == "help" ]; then "if $FUNCNAME 1 1; then ... ; fi" return fi -# Error si no se reciben 2 parámetros. -[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $? +# Falso, en caso de error. +[ $# == 2 ] || return 1 # Obtener partición. -PART="$(ogDiskToDev $1 $2)" || return $? +PART="$(ogDiskToDev $1 $2)" || return 1 # Comprobar existencia del fichero de bloqueo. LOCKFILE="/var/lock/lock${PART//\//-}" diff --git a/client/engine/Image.lib b/client/engine/Image.lib index 399e3da1..a4b82b02 100755 --- a/client/engine/Image.lib +++ b/client/engine/Image.lib @@ -387,12 +387,15 @@ dd if="$DISK" of="$IMGFILE" bs=446 count=1 || ogRaiseError $OG_ERR_IMAGE "$1 $IM #@brief Comprueba si una imagen está bloqueada para uso exclusivo. #@param str_repo repositorio de imágenes (opcional) #@param path_image camino de la imagen (sin extensión) -#@return Código de salida: 0 - sin bloquear, 1 - bloqueada. +#@return Código de salida: 0 - bloqueado, 1 - sin bloquear o error. #@note repo = { REPO, CACHE } #@exception OG_ERR_FORMAT formato incorrecto. #@version 1.0 - Adaptación a OpenGnSys 1.0 #@author Ramon Gomez, ETSII Universidad de Sevilla #@date 2011/03/10 +#@version 1.0.1 - Devolver falso en caso de error. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2011-05-18 #*/ ## function ogIsImageLocked () { @@ -404,7 +407,7 @@ if [ "$*" == "help" ]; then return fi # Error si no se reciben 1 o 2 parámetros. -[ $# -lt 1 -o $# -gt 2 ] && ogRaiseError $OG_ERR_FORMAT && return $? +[ $# -lt 1 -o $# -gt 2 ] && return 1 # Comprobar si existe el fichero de bloqueo. test -n "$(ogGetPath $@.lock)" @@ -453,10 +456,12 @@ touch $IMGDIR/$(basename "${!#}").lock #@param int_ndisk nº de orden del disco #@param int_npartition nº de orden de la partición #@return (por determinar) -#@exception OG_ERR_FORMAT formato incorrecto. -#@exception OG_ERR_NOTFOUND fichero de imagen o partición no detectados. -#@exception OG_ERR_LOCKED partición bloqueada por otra operación. -#@exception OG_ERR_IMAGE error al restaurar la imagen del sistema. +#@exception OG_ERR_FORMAT 1 formato incorrecto. +#@exception OG_ERR_NOTFOUND 2 fichero de imagen o partición no detectados. +#@exception OG_ERR_PARTITION 3 # Error en partición de disco. +#@exception OG_ERR_LOCKED 4 partición bloqueada por otra operación. +#@exception OG_ERR_IMAGE 5 error al restaurar la imagen del sistema. +#@exception OG_ERR_IMGSIZEPARTITION 30 Tamaño de la particion es menor al tamaño de la imagen. #@todo Comprobar incongruencias partición-imagen, control de errores, definir parámetros, caché/repositorio, etc. #@version 0.1 - Integracion para Opengnsys - HIDRA:RestaurarImagen{EXT3, NTFS}.sh; EAC: RestorePartitionFromImage() en Deploy.lib #@author Ramon Gomez, ETSII Universidad de Sevilla @@ -466,6 +471,12 @@ touch $IMGDIR/$(basename "${!#}").lock #@version 0.9 - Primera version muy en pruebas para OpenGnSys #@author Ramon Gomez, ETSII Universidad de Sevilla #@date 2009/09/10 +#@version 1.0 - generacion sintaxis de restauracion +#@author Antonio J. Doblas Viso, Universidad de Malaga +#@date 2011/02/01 +#@version 1.0.1 - Control errores, tamaño particion, fichero-imagen +#@author Antonio J. Doblas Viso, Universidad de Malaga +#@date 2011/05/11 #*/ ## function ogRestoreImage () { @@ -479,21 +490,26 @@ if [ "$*" == "help" ]; then return fi # Error si no se reciben 4 parámetros. -[ $# -lt 4 ] && ogRaiseError $OG_ERR_FORMAT && return $? +[ $# -lt 4 ] && return $(ogRaiseError $OG_ERR_FORMAT; echo $?) # Procesar parámetros. -PART="$(ogDiskToDev "$3" "$4")" || return $? +PART="$(ogDiskToDev $3 $4)" || return $(ogRaiseError $OG_ERR_NOTFOUND " $3 $4"; echo $?) #IMGTYPE=$(ogGetImageType "$1" "$2") IMGTYPE=img -IMGFILE=$(ogGetPath "$1" "$2.$IMGTYPE") -[ -r "$IMGFILE" ] || ogRaiseError OG_ERR_NOTFOUND "$IMGFILE" || return $? +IMGFILE=$(ogGetPath "$1" "$2.$IMGTYPE") +[ -r "$IMGFILE" ] || return $(ogRaiseError $OG_ERR_NOTFOUND " $3 $4"; echo $?) +# comprobamos consistencia de la imagen +ogGetImageInfo $IMGFILE >/dev/null || return $(ogRaiseError $OG_ERR_IMAGE " $1 $2"; echo $?) + # Error si la imagen no cabe en la particion. -IMGSIZE=$(ogGetImageSize "$1" "$2") -PARTSIZE=$(ogGetPartitionSize $3 $4) +IMGSIZE=$(ogGetImageSize "$1" "$2") || return $(ogRaiseError $OG_ERR_IMAGE " $1 $2"; echo $?) +#TODO: +#Si la particion no esta formateado o tiene problemas formateamos +ogMount $3 $4 || ogFormat $3 $4 +PARTSIZE=$(parted `ogDiskToDev $3 $4` unit kB print | awk '{y=x; x=$4};END{print y}' | tr -d kB) if [ $IMGSIZE -gt $PARTSIZE ]; then - ogRaiseError $OG_ERR_PARTITION "$IMGSIZE > $PARTSIZE" + ogRaiseError $OG_ERR_IMGSIZEPARTITION " $PARTSIZE < $IMGSIZE" return $? fi - # Comprobar el bloqueo de la imagen y de la partición. if ogIsImageLocked "$IMGFILE"; then ogRaiseError $OG_ERR_LOCKED "$MSG_IMAGE $1, $2.$IMGTYPE" @@ -504,8 +520,8 @@ if ogIsLocked $3 $4; then return $? fi # Desmontar y bloquear partición. -ogUnmount $3 $4 2>/dev/null || return $? -ogLock $3 $4 || return $? +ogUnmount $3 $4 2>/dev/null || return $(ogRaiseError $OG_ERR_PARTITION " $3 $4"; echo $?) +ogLock $3 $4 || return $(ogRaiseError $OG_ERR_PARTITION " $3 $4"; echo $?) trap "ogUnlock $3 $4" 1 2 3 6 9 # Restaurar según el tipo de imagen. @@ -677,7 +693,7 @@ then then TOOLS=PARTCLONE FS=$(echo $PARTCLONEINFO | awk '{gsub(/\: /,"\n"); print toupper($8);}') - echo $PARTCLONEINFO | grep GB > /dev/null && SIZEFACTOR=1048576 || SIZEFACTOR=1024 + echo $PARTCLONEINFO | grep GB > /dev/null && SIZEFACTOR=1000000 || SIZEFACTOR=1024 SIZE=$(echo $PARTCLONEINFO | awk -v FACTOR=$SIZEFACTOR '{gsub(/\: /,"\n"); printf "%d\n", $11*FACTOR;}') IMGDETECT="TRUE" fi @@ -751,8 +767,8 @@ local IMGFILE # Si se solicita, mostrar ayuda. if [ "$*" == "help" ]; then - ogHelp "$FUNCNAME" "$FUNCNAME testing path_dir str_image int_ndisk int_npart" \ - "$FUNCNAME 1 1 REPO /aula1/winxp ==> 5642158" + ogHelp "$FUNCNAME" "$FUNCNAME REPO|CACHE /str_image" \ + "$FUNCNAME REPO /aula1/winxp ==> 5642158" return fi # Error si no se reciben menos de 2 parámetros. diff --git a/client/engine/PostConfEAC.lib b/client/engine/PostConfEAC.lib new file mode 100755 index 00000000..642b9118 --- /dev/null +++ b/client/engine/PostConfEAC.lib @@ -0,0 +1,575 @@ +#!/bin/bash + +# ogLoadHiveWindows int_ndisk int_partiton +#@brief Localiza los hive del registro de windows (de sistema y usuarios) +#@param int_ndisk nº de orden del disco +#@param int_partition nº de particion +#@return +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_PARTITION Tipo de partición desconocido o no se puede montar. +#@version 0.9 - Adaptación a OpenGNSys. +#@author Antonio J. Doblas Viso. Universidad de Málaga +#@date 2009-09-24 +#*/ ## + + +function ogLoadHiveWindows () { +# Variables locales. +local PART DISK + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_partition" \ + "$FUNCNAME 1 1 " + return +fi + +# Error si no se reciben 2 parámetros. +[ $# == 2 ] || return $(ogRaiseError $OG_ERR_FORMAT; echo $?) + +DISK=$1; PART=$2; + +#Comprobaciones redundantes: borrar" +#ogDiskToDev $DISK $PART || return $(ogRaiseError $OG_ERR_PARTITION "particion de windows no detectada"; echo $?) +#ogGetOsType $DISK $PART | grep "Windows" || return $(ogRaiseError $OG_ERR_NOTOS "no es windows"; echo $?) +#VERSION=$(ogGetOsVersion $DISK $PART) +#Fin Comprobaciones redundantes: borrar" + +if ogGetPath $DISK $PART WINDOWS +then + SYSTEMROOT="Windows" +elif ogGetPath $DISK $PART WINNT +then + SYSTEMROOT="winnt" +else + return $(ogRaiseError $OG_ERR_NOTOS "version windows no detectada"; echo $?) +fi + +hiveSAM=$(ogGetPath $DISK $PART /${SYSTEMROOT}/system32/config/SAM) && export hiveSAM || return $(ogRaiseError $OG_ERR_NOTOS " hive SAM no detectada"; echo $?) +hiveSYSTEM=$(ogGetPath $DISK $PART /${SYSTEMROOT}/system32/config/system) && export hiveSYSTEM || return $(ogRaiseError $OG_ERR_NOTOS "hive SYSTEM no detectada"; echo $?) +hiveSOFTWARE=$(ogGetPath $DISK $PART /${SYSTEMROOT}/system32/config/software) && export hiveSOFTWARE || return $(ogRaiseError $OG_ERR_NOTOS "hive SOFTWARE no detectada"; echo $?) +export TEMPhive=/tmp/tmpregistry + +## borrar elementos de la primera integracion +#export particion=`ogMount $DISK $PART` +#mkfifo pipe 2>/dev/null +#declare -i count +#declare -A HivePathUser +#count=3 +# fin borrar elementos de la primera integracion + +declare -i COUNT +COUNT=3 +BASEHOMEDIR=$(ogGetPath 1 1 /"Documents and Settings") +TMPUSERFILE="/tmp/WuserRegAndDAT.tmp" +find "$BASEHOMEDIR/" -type f -name NTUSER.DAT > $TMPUSERFILE +LISTUSERS=$(drbl-chntpw -l $hiveSAM | grep RID | awk -F"<" '{print $2}' | awk -F">" '{print $1}') +#echo "$BASEHOMEDIR" $LISTUSERS +for user in $LISTUSERS +do + # borrar elementos de la primera integracion. + #if find ${particion}/ -type f -name NTUSER.DAT > pipe| cat pipe | grep $user > /tmp/path.txt.$count + #then + #echo pefil de $user encontrado, para utilizar este usuario con funciones utilizar id_hive= $count o \$usuario + #read camino < /tmp/path.txt.$count + #echo $camino | sed -e 's/ /\\ /g' > /tmp/path.txt.$count + #camino2=$(echo $camino | sed -e 's/ /\\ /g') + #echo $camino2 | sed -e 's/\\/\\\\/g' > /tmp/path.txt.$count + #export `echo $user=hiveUSER$count` + #export `echo hiveUSER$count`="$camino2" + #count=${count}+1 + #fiecho $user + # Fin borrar elementos de la primera integracion. + + # Comprobamos que el usuario registrado tiene .DAT + if HOMEDIR=$(cat $TMPUSERFILE | grep -w $user) + then + #echo "$user exportamos los usuarios de windows como variables, y como valor hiveUSERX; donde la X es 3 4 5 6 ... X" + export `echo $user=hiveUSER$COUNT` + #echo "$user exportamos la variable hiveUSERX con el valor del home de la variable-usuario_windows" + ##export `echo hiveUSER$COUNT`="$(echo $HOMEDIR | sed -e 's/ /\\ /'g | sed -e 's/\\/\\\\/g')" + export `echo hiveUSER$COUNT`="$(echo $HOMEDIR)" + #echo " estas variables \$USUARIO -> Identificador del HIVE ; \${!USUARIO} -> path del HIVE " + COUNT=${COUNT}+1 + fi + +done +COUNT=0 +} + + +# ogUpdateHiveWindows +#@brief Actualiza los hive de windows. +#@param int_ndisk +#@param int_partition +#@return +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_PARTITION Tipo de partición desconocido o no se puede montar. +#@version 0.9 - Adaptación a OpenGNSys. +#@author Antonio J. Doblas Viso. Universidad de Málaga +#@date 2009-09-24 +#*/ ## + + +function ogUpdateHiveWindows (){ +# Variables locales. +local PART DISK FILE + +#TODO detectar llamada a ogLoadHiveWindows + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME " \ + "$FUNCNAME " + return +fi + +echo drbl-chntpw -f $TEMPhive $hiveSAM $hiveSYSTEM $hiveSOFTWARE \"${hiveUSER3}\" \"${hiveUSER4}\" \"${hiveUSER5}\" \"${hiveUSER6}\" \"${hiveUSER7}\" \"${hiveUSER8}\" \"${hiveUSER9}\" > /tmp/run.sh +cat /tmp/run.sh; sh /tmp/run.sh; rm -fr $TEMPhive; rm /tmp/run.sh + +unset hiveSAM hiveSYSTEM hiveSOFTWARE TEMPhive hiveUSER3 hiveUSER4 hiveUSER5 hiveUSER6 hiveUSER7 hiveUSER8 hiveUSER9 + + +} + + + +function ogHiveNTRunMachine () { +#echo sintaxis: PathScripts idScripts +#echo ejemplo: c:\\\\WINDOSWS\\\\crearusuarios.bat scripts1 +#echo IMPORTANTE: el path debe llevar dos barras \\, pero como se deben 'escapar' debes poner cuatro \\\\ +#echo "identifica 0=$hiveSAM 1=$hiveSystem 2=$hiveSoftware 3=$HiveUser3" + +local PART DISK FILE + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME PathScripts|command keyName " \ + "$FUNCNAME c:\\\\Windows\\\\crearusuarios.cmd scripts_crearUsuarios "\ + "$FUNCNAME "cmd /c del c:\ogboot.*" ogcleanboot "\ + "$FUNCNAME Requiere la previa ejecución de ogLoadHive int_disk int_part"\ + "$FUNCNAME Despues requiere el ogUpdateHive" + return +fi + + +# Error si no se reciben al menos 1 parámetros. +[ $# == 2 ] || return $(ogRaiseError $OG_ERR_FORMAT; echo $?) + + +cat >> $TEMPhive << EOF +h 2 +cd \Microsoft\Windows\CurrentVersion\Run +nv 1 $2 +ed $2 +$1 +EOF +#ogGetRegistryValue /mnt/sda1 software '\Microsoft\Windows\CurrentVersion\Run\og3' +} + +function ogNTPolUserOn () { + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME id_hive_user " \ + "$FUNCNAME NombreUsuario"\ + "$FUNCNAME " + return +fi + +# TODO: error si no se ha llamado previamente a ogLoadHiveWindows +[ -n $hiveSAM ] || return $(ogRaiseError $OG_ERR_FORMAT "se debe utilizar primero la utilidad ogLoadHiveWindows"; echo $?) + +# TODO: error si el usuario no tiene cuenta en windows. +drbl-chntpw -l $hiveSAM | grep RID | grep -w $1 || return $(ogRaiseError $OG_ERR_FORMAT "el usuario $1 no tiene cuenta en este windows: Compruebe mayusculas o minusculas"; echo $?) + +# TODO: error si no el usario no no tiene HIVE asociado. +[ -n "${!1}" ] || return $(ogRaiseError $OG_ERR_FORMAT "el usuario no tiene hive creado"; echo $?) + + +HIVEID=$(echo ${!1} | tr -d "hiveUSER") + + +#echo "IMPORTANTE: la variable HiveUser3=/mnt/windows/Document/\ and/\ Seeting\alumnmos\NTUSER.dat" +echo $HIVEID +#cp /var/EAC/admin/utilswin/Fondo.BMP ${particion}/WINDOWS/ + +cat >> $TEMPhive << EOF +h $HIVEID +cd \Control Panel\Desktop +ed Wallpaper +C:\\WINDOWS\\fondo.bmp + +cd \Software\Microsoft\Windows\CurrentVersion\Policies +nk Explorer +cd Explorer + +nv 4 NoDesktop +ed NoDesktop +1 + +nv 4 NoSimpleStartMenu +ed NoSimpleStartMenu +1 +nv 4 NoWindowsUpdate +ed NoWindowsUpdate +1 + +nv 4 NoSMConfigurePrograms +ed NoSMConfigurePrograms +1 + +nv 4 NoChangeStartMenu +ed NoChangeStartMenu +1 + +nv 4 Intellimenus +ed Intellimenus +1 + +nv 4 NoRun +ed NoRun +1 + +nv 4 NoRecentDocsHistory +ed NoRecentDocsHistory +1 +EOF +} + + + + + +########################################################## +########################################################## +#####librerias de PostConfiguracion v0.1para Advanced Deploy enViorenment########### +# Liberado bajo licencia GPL <http://www.gnu.org/licenses/gpl.html>################ +############# 2008 Antonio Jes�s Doblas Viso adv@uma.es ########################## +########### Universidad de Malaga (Spain)############################ +########################################################## + + + + + +function NTChangeName () { +if [ $# = 0 ] +then +echo sintaxis: NTChangeNAME str_$var +echo ejemplos: NTCHangeName adi${IPcuatro}-xp +fi +cat >> $temporal << EOF +h 1 +ed ControlSet001\Control\ComputerName\ComputerName\ComputerName +$1 +ed ControlSet001\Services\Tcpip\Parameters\Hostname +$1 +ed ControlSet001\Services\Tcpip\Parameters\NV Hostname +$1 +h 2 +cd \Microsoft\Windows NT\CurrentVersion\Winlogon +ed DefaultDomainName +$1 +EOF +} + + + +function NTSetGroupName () { +if [ $# = 0 ] +then +echo sintaxis: NTSetGroupName str_$var +echo ejemplos: NTSetGroupName adi +fi +cat >> $temporal << EOF +h 2 +ed \Microsoft\Windows NT\CurrentVersion\Winlogon\DefaultDomainName +$1 +EOF +} + + +function NTSetOwner (){ +if [ $# = 0 ] +then +echo sintaxis: NtSetOwner str_propietario str_organizacion +echo ejemplos: NTSetOwner eu\ politecnica universidad\ de\ malaga +fi +cat >> $temporal << EOF +h 2 +ed \Microsoft\Windows NT\CurrentVersion\RegisteredOwner +$1 +ed \Microsoft\Windows NT\CurrentVersion\RegisteredOrganization +$2 +EOF +} + + +function NTAutoLogon (){ +if [ $# = 0 ] +then +echo sintaxis: Int_Activar Int_nves str_usuario str_passwd str_equipo +echo ejemplos: 1 2 administrador 3451 $equipo +echo IMPORTANTE: cuando AutoLogonCount llegue a 0, activa el AutoAdminLogon a 0. Pero no borra los valores de DefaultPassword +return 2 +fi +echo la pass es $4 +export temporal=/tmp/tmpregistry +cat >> $temporal << EOF +hive 2 +cd \Microsoft\Windows NT\CurrentVersion\Winlogon +nv 1 AutoAdminLogon +ed AutoAdminLogon +$1 +nv 1 AutoLogonCount +ed AutoLogonCount +$2 +nv 1 DefaultUserName +ed DefaultUserName +$3 +nv 1 DefaultDomainName +ed DefaultDomainName +$5 +EOF +if [ "$4" == none ] +then +echo "debe aparecer done" $4 +cat >> $temporal << EOF +dv DefaultPassword + + +EOF +else +cat >> $temporal << EOF +nv 1 DefaultPassword +ed DefaultPassword +$4 +EOF +fi +} + +function NTStatusRatonTeclado (){ +if [ $# = 0 ] +then +echo sintaxis: Int-StatusRaton Int-StatusTeclado +echo ejemplos: int=1 activo int=4 desactivado +return 2 +fi +cat >> $temporal << EOF +hive 1 +cd \ControlSet001\Services\Mouclass +ed Start +$1 +cd \ControlSet001\Services\Kbdclass +ed Start +$2 +EOF +} + +function NTRunOnceMachine () { +if [ $# = 0 ] +then +echo sintaxis: PathScripts idScripts +echo "ejemplo: c:\\\\WINDOSWS\\\\crearusuarios.bat scripts1" +echo "IMPORTANTE: el path debe llevar dos barras \\, pero como se deben 'escapar' debes poner cuatro \\\\" +return 2 +fi +export temporal=/tmp/tmpregistry +cat >> $temporal << EOF +h 2 +cd \Microsoft\Windows\CurrentVersion\RunOnce +nv 1 $2 +ed $2 +$1 +EOF +} + +function NTRunMachine () { +if [ $# = 0 ] +then +echo sintaxis: PathScripts idScripts +echo ejemplo: c:\\\\WINDOSWS\\\\crearusuarios.bat scripts1 +echo IMPORTANTE: el path debe llevar dos barras \\, pero como se deben 'escapar' debes poner cuatro \\\\ +return 2 +fi +export temporal=/tmp/tmpregistry +cat >> $temporal << EOF +h 2 +cd \Microsoft\Windows\CurrentVersion\Run +nv 1 $2 +ed $2 +$1 +EOF +} + +function NTRunUser () { +if [ $# = 0 ] +then +echo sintaxis: str_PathWINScripts str_idScripts Int_hive||\$usuario +echo ejemplo: c:\\\\WINDOSWS\\\\crearusuarios.bat scripts1 3 +echo IMPORTANTE: el pathWIN debe llevar dos barras \\, pero como se deben 'escapar' debes poner cuatro \\\\ +echo IMPORTANTE: el pathLinux si lleva espacios debe escaparse con una barra \\ +echo IMPORTANTE Int_hive: 3 para el primer usuario, 4 para el segundo usuario +echo requiere export un HiveUser3=/mnt/windows/Document\ and\ Seeting\alumnmos\NTUSER.dat +return 2 +fi +cat >> $temporal << EOF +h $3 +cd \Software\Microsoft\Windows\CurrentVersion\Run +nv 1 $2 +ed $2 +$1 +EOF +} + + + +function NTPolUserOn () { +if [ $# = 0 ] +then +Msg "requiere LoadRegistryUser str_user1 str_user2..." orange +echo "sintaxis: Int_hive" +echo "ejemplo: NTPolUserOn 3" +echo "IMPORTANTE: la variable HiveUser3=/mnt/windows/Document/\ and/\ Seeting\alumnmos\NTUSER.dat" +return 2 +fi +cp /var/EAC/admin/utilswin/Fondo.BMP ${particion}/WINDOWS/ +cat >> $temporal << EOF +h $1 +cd \Control Panel\Desktop +ed Wallpaper +C:\\WINDOWS\\fondo.bmp + +cd \Software\Microsoft\Windows\CurrentVersion\Policies +nk Explorer +cd Explorer + +nv 4 NoDesktop +ed NoDesktop +1 + +nv 4 NoSimpleStartMenu +ed NoSimpleStartMenu +1 +nv 4 NoWindowsUpdate +ed NoWindowsUpdate +1 + +nv 4 NoSMConfigurePrograms +ed NoSMConfigurePrograms +1 + +nv 4 NoChangeStartMenu +ed NoChangeStartMenu +1 + +nv 4 Intellimenus +ed Intellimenus +1 + +nv 4 NoRun +ed NoRun +1 + +nv 4 NoRecentDocsHistory +ed NoRecentDocsHistory +1 +EOF +} + +function NTPolUserOFF () { +if [ $# = 0 ] +then +Msg "requiere LoadRegistryUser str_user1 str_user2..." orange +echo "sintaxis: Int_hive" +echo "ejemplo: NTPolUserOFF 3" +echo "IMPORTANTE: la variable HiveUser3=/mnt/windows/Document/\ and/\ Seeting\alumnmos\NTUSER.dat" +return 2 +fi +cat >> $temporal << EOF +h $1 +cd \Control Panel\Desktop +ed Wallpaper +C:\\WINDOWS\\web\\wallpaper\\Felicidad.bmp + +cd \Software\Microsoft\Windows\CurrentVersion\ +rdel Policies +nk Policies +1 +EOF +} + + +function NTStatusBootChk () { +if [ $# = 0 ] +then +echo sintaxis: Int-Status +echo ejemplos: int=0 desactivado int=1 activado +return 2 +fi +[ $1 = 0 ] && valor="none" +[ $1 = 1 ] && valor="autocheck autochk *" +cat >> $temporal << EOF +hive 1 +cd \ControlSet001\Control\Session Manager +ed BootExecute +$valor +--n +EOF +} + + +function ogSchrootLinux () { + +# Variables locales. +local PART DISK DIRCONF SCHROOTDEVICE + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_partition" \ + "$FUNCNAME 1 1 " + return +fi + +# Error si no se reciben 2 parámetros. +[ $# == 2 ] || return $(ogRaiseError $OG_ERR_FORMAT; echo $?) + +DISK=$1; PART=$2; DIRCONF="/etc/schroot" + + +VERSION=$(ogGetOsVersion $DISK $PART) +echo $VERSION | grep "Linux" || return $(ogRaiseError $OG_ERR_NOTOS "no es linux"; echo $?) + +ogUnmount $DISK $PART || return $(ogRaiseError $OG_ERR_NOTOS "no es linux"; echo $?) + +SCHROOTDEVICE=$(ogDiskToDev $DISK $PART) + + +rm ${DIRCONF}/mount-defaults +rm ${DIRCONF}/schroot.conf + +cat >> ${DIRCONF}/mount-defaults << EOF +# <file system> <mount point> <type> <options> <dump> <pass> +proc /proc proc defaults 0 0 +/dev /dev none rw,bind 0 0 +/dev/pts /dev/pts none rw,bind 0 0 +/dev/shm /dev/shm none rw,bind 0 0 +EOF + + +cat >> ${DIRCONF}/schroot.conf << EOF +[linux] +description=$VERSION +type=block-device +device=$SCHROOTDEVICE +EOF + + + + +schroot -c linux + +schroot -end-sessiona --all-sessions +} + diff --git a/client/engine/Protocol.lib b/client/engine/Protocol.lib index 8fa1d85c..ecc0d43b 100755 --- a/client/engine/Protocol.lib +++ b/client/engine/Protocol.lib @@ -853,7 +853,7 @@ then case "$MODE" in peer|PEER) echo "Donwloading Torrent as peer" ### echo "ctorrent -X 'sleep $TIME; kill -9 \$(pidof ctorrent)' -C 100 $SOURCE -s $TARGET -b ${SOURCE}.bf" - ctorrent -f -X "sleep 15; kill -2 \$(pidof ctorrent)" -C 100 ${SOURCE} -s ${TARGET} -b ${SOURCE}.bf >> $OGLOGFILE + ctorrent -f -X "sleep 15; kill -2 \$(pidof ctorrent)" -C 100 ${SOURCE} -s ${TARGET} -b ${SOURCE}.bf ;; leecher|LEECHER) echo "Donwloading Torrent as leecher" # echo "ctorrent ${SOURCE} -X 'sleep $TIME; kill -9 \$(pidof ctorrent)' -C 100 -U 0" @@ -969,64 +969,66 @@ if [ "$*" == "help" ]; then return fi +#TODO: return 0->true, 1->false; si error, aunque sintaxis devuelve > 1 + # Error si no se reciben los argumentos ARG necesarios según la opcion. -[ $# == "2" ] || ogRaiseError $OG_ERR_FORMAT "Parametros no admitidos"|| return $? +#[ $# == "2" ] || ogRaiseError $OG_ERR_FORMAT "Parametros no admitidos"|| return $? +#ogCheckStringInGroup "$1" "REPO repo" || ogRaiseError $OG_ERR_FORMAT "El contendor $1 no es valido, solo se admite REPO" || return $? +[ $# == "2" ] || return $(ogRaiseError $OG_ERR_NOTFOUND " $1 $2"; echo $?) +ogCheckStringInGroup "$1" "REPO repo" || return $(ogRaiseError $OG_ERR_NOTFOUND " $1 $2"; echo $?) -ogCheckStringInGroup "$1" "REPO repo" || ogRaiseError $OG_ERR_FORMAT "El contendor $1 no es valido, solo se admite REPO" || return $? -FILESOURCE=`ogGetPath $1 $2` -FILETARGET=`ogGetPath CACHE $2` +FILESOURCE=`ogGetPath $1 $2` || return $(ogRaiseError $OG_ERR_NOTFOUND " $1 $2"; echo $?) -echo "paso 1. si no existe la imagen, confirmamos que es necesaria la actualizacion de la cache." +#echo "paso 1. si no existe la imagen, confirmamos que es necesaria la actualizacion de la cache." +FILETARGET=`ogGetPath CACHE $2` if [ -z $FILETARGET ] then # borramos el fichero bf del torrent, en el caso de que se hubiese quedado de algun proceso fallido ogDeleteFile CACHE /$2.torrent.bf &> /dev/null ogDeleteFile CACHE /$2.sum &> /dev/null - echo "Salida con valor 0, paso 1, la cache no contiene esa imagen " + echo "TRUE=0, es necesario actualizar. Paso 1, la cache no contiene esa imagen " return 0 fi -echo "Paso 2. Comprobamos que la imagen no estuviese en un proceso previo torrent" + +#echo "Paso 2. Comprobamos que la imagen no estuviese en un proceso previo torrent" if ogGetPath $FILETARGET.torrent.bf > /dev/null then - echo "Salida con valor 0, paso 2 la imagen esta en un estado de descarga torrent interrumpido." #TODO: comprobar los md5 para asegurarnos que la imagen es la misma. + echo "TRUE=0, es necesario actualizar. Paso 2, la imagen esta en un estado de descarga torrent interrumpido" return 0 fi + ## En este punto la imagen en el repo y en la cache se llaman igual, -echo "paso 4. recuperamos o calculamos los md5 de los ficheros" +#echo "paso 4. recuperamos o calculamos los md5 de los ficheros" if [ -f $FILESOURCE.sum ] then - echo "leyendo el sum del fichero sum del repo" + # echo "leyendo el sum del fichero sum del repo" MD5SOURCE=$(cat $FILESOURCE.sum) -#elif [ -f $FILETARGET.torrent ] -#then -# echo "leyendo el sum del fichero torrent de la cache" -# MD5SOURCE=$(ctorrent -x $FILETARGET.torrent | grep Comment | awk -F": " '{print $2}') else - echo "calculando el sun del repo" + # echo "calculando el sun del repo" MD5SOURCE=$(md5sum $FILESOURCE | cut -f1 -d" ") fi if [ -f $FILETARGET.sum ] then - echo "leyendo el sum de la cache" + #echo "leyendo el sum de la cache" MD5TARGET=$(cat $FILETARGET.sum) else - echo "calculando el sum de la cache" + #echo "calculando el sum de la cache" md5sum $FILETARGET | cut -f1 -d" " > $FILETARGET.sum MD5TARGET=$(cat $FILETARGET.sum) fi -echo "Paso 5. comparamos los md5" +#echo "Paso 5. comparamos los md5" #TODO: que hacer cuando los md5 son distintos. Por defecto borrar. if [ "$MD5SOURCE" == "$MD5TARGET" ] then - echo "paso5.A la imagen esta en cache" + echo "FALSE=1, No es neceario actualizar. Paso5.A la imagen esta en cache" return 1 else - echo "paso 5.b la imagen en cache es distinta, borramos la imagen anterior y devolvemos 0 para confirmar la actualizacion" + echo "TRUE=0, Si es necesario actualizar. paso 5.b la imagen en cache es distinta, borramos la imagen anterior y devolvemos 0 para confirmar la actualizacion" rm $FILETARGET return 0 fi diff --git a/client/engine/README.es.txt b/client/engine/README.es.txt index 10b20779..9fc6862b 100644 --- a/client/engine/README.es.txt +++ b/client/engine/README.es.txt @@ -19,11 +19,15 @@ Librerías: - Boot.lib funciones de arranque y posconfiguración de sistemas operativos. +- Cache.lib funciones de gestión de la caché local del cliente. - Disk.lib funciones de control de dispositivos de disco. - File.lib funciones de manipulación de ficheros. - FileSystem.lib funciones de gestión de sistemas de ficheros. - Image.lib funciones de administración de imágenes de sistemas operativos. - Inventory.lib funciones de control de inventario e informes. +- Net.lib funciones básicas de control de acceso a la red. +- Protocol.lib funciones de implementación de protocolos de comunicación. +- Registry.lib funciones básicas de gestión del registro de Windows. - System.lib funciones básicas del sistema. diff --git a/client/engine/Registry.lib b/client/engine/Registry.lib new file mode 100755 index 00000000..437f5102 --- /dev/null +++ b/client/engine/Registry.lib @@ -0,0 +1,397 @@ +#!/bin/bash +#/** +#@file Registry.lib +#@brief Librería o clase Registry +#@class Boot +#@brief Funciones para gestión del registro de Windows. +#@version 1.0.1 +#@warning License: GNU GPLv3+ +#*/ + + +#/** +# ogAddRegistryKey path_mountpoint str_hive str_keyname +#@brief Añade una nueva clave al registro de Windows. +#@param path_mountpoint directorio donde está montado el sistema Windows +#@param str_hive sección del registro +#@param str_keyname nombre de la clave +#@return (nada) +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_NOTFOUND Fichero de registro no encontrado. +#@note hive = { default, sam, security, software, system, components } +#@warning Requisitos: chntpw +#@warning El sistema de archivos de Windows debe estar montada previamente. +#@version 1.0.1 - Nueva función +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2011-05-25 +#*/ ## +function ogAddRegistryKey () +{ +# Variables locales. +local FILE + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME path_mountpoint str_hive str_key" \ + "$FUNCNAME /mnt/sda1 SOFTWARE '\Microsoft\NewKey'" + return +fi +# Error si no se reciben 3 parámetros. +[ $# == 3 ] || ogRaiseError $OG_ERR_FORMAT || return $? +# Camino del fichero de registro. +FILE=$(ogGetHivePath "$1" "$2") || return $? + +# Añadir nueva clave. +chntpw "$FILE" << EOT 2>/dev/null +cd ${3%\\*} +nk ${3##*\\} +q +y +EOT +} + +#/** +# ogAddRegistryValue path_mountpoint str_hive str_valuename [str_valuetype] +#@brief Añade un nuevo valor al registro de Windows, indicando su tipo de datos. +#@param path_mountpoint directorio donde está montado el sistema Windows +#@param str_hive sección del registro +#@param str_valuename nombre del valor +#@param str_valuetype tipo de datos del valor (opcional) +#@return (nada) +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_NOTFOUND Fichero de registro no encontrado. +#@note hive = { default, sam, security, software, system, components } +#@note valuetype = { string, binary, dword }, por defecto: string +#@warning Requisitos: chntpw +#@warning El sistema de archivos de Windows debe estar montada previamente. +#@version 1.0.1 - Nueva función +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2011-05-25 +#*/ ## +function ogAddRegistryValue () +{ +# Variables locales. +local FILE TYPE + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME path_mountpoint str_hive str_valuename [str_valuetype]" \ + "$FUNCNAME /mnt/sda1 SOFTWARE '\Microsoft\NewKey\Value1'" \ + "$FUNCNAME /mnt/sda1 SOFTWARE '\Microsoft\NewKey\Value1' DWORD" + return +fi +# Error si no se reciben 3 o 4 parámetros. +[ $# == 3 -o $# == 4 ] || ogRaiseError $OG_ERR_FORMAT || return $? +# Camino del fichero de registro. +FILE=$(ogGetHivePath "$1" "$2") || return $? +case "$4" in + string|STRING|"") TYPE=1 ;; + binary|BINARY) TYPE=3 ;; + dword|DWORD) TYPE=4 ;; + *) ogRaiseError $OG_ERR_OUTOFLIMIT "$4" + exit $? ;; +esac + +# Devolver el dato del valor de registro. +# /* (comentario Doxygen) +chntpw "$FILE" << EOT 2>/dev/null +cd ${3%\\*} +nv $TYPE ${3##*\\} +q +y +EOT +# (comentario Doxygen) */ +} + + +#/** +# ogDeleteRegistryKey path_mountpoint str_hive str_keyname +#@brief Elimina una clave del registro de Windows con todo su contenido. +#@param path_mountpoint directorio donde está montado el sistema Windows +#@param str_hive sección del registro +#@param str_keyname nombre de la clave +#@return (nada) +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_NOTFOUND Fichero de registro no encontrado. +#@note hive = { default, sam, security, software, system, components } +#@warning Requisitos: chntpw +#@warning El sistema de archivos de Windows debe estar montada previamente. +#@warning La clave debe estar vacía para poder ser borrada. +#@version 1.0.1 - Nueva función +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2011-05-25 +#*/ ## +function ogDeleteRegistryKey () +{ +# Variables locales. +local FILE + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME path_mountpoint str_hive str_key" \ + "$FUNCNAME /mnt/sda1 SOFTWARE '\Microsoft\NewKey'" + return +fi +# Error si no se reciben 3 parámetros. +[ $# == 3 ] || ogRaiseError $OG_ERR_FORMAT || return $? +# Camino del fichero de registro. +FILE=$(ogGetHivePath "$1" "$2") || return $? + +# Añadir nueva clave. +chntpw "$FILE" << EOT 2>/dev/null +cd ${3%\\*} +dk ${3##*\\} +q +y +EOT +} + +#/** +# ogDeleteRegistryValue path_mountpoint str_hive str_valuename +#@brief Elimina un valor del registro de Windows. +#@param path_mountpoint directorio donde está montado el sistema Windows +#@param str_hive sección del registro +#@param str_valuename nombre del valor +#@return (nada) +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_NOTFOUND Fichero de registro no encontrado. +#@note hive = { default, sam, security, software, system, components } +#@warning Requisitos: chntpw +#@warning El sistema de archivos de Windows debe estar montada previamente. +#@version 1.0.1 - Nueva función +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2011-05-25 +#*/ ## +function ogDeleteRegistryValue () +{ +# Variables locales. +local FILE + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME path_mountpoint str_hive str_valuename" \ + "$FUNCNAME /mnt/sda1 SOFTWARE '\Microsoft\NewKey\Value1'" + return +fi +# Error si no se reciben 3 parámetros. +[ $# == 3 ] || ogRaiseError $OG_ERR_FORMAT || return $? +# Camino del fichero de registro. +FILE=$(ogGetHivePath "$1" "$2") || return $? + +# Devolver el dato del valor de registro. +# /* (comentario Doxygen) +chntpw "$FILE" << EOT 2>/dev/null +cd ${3%\\*} +dv ${3##*\\} +q +y +EOT +# (comentario Doxygen) */ +} + + +#/** +# ogGetHivePath path_mountpoint str_hive +#@brief Función básica que devuelve el camino del fichero con una sección del registro. +#@param path_mountpoint directorio donde está montado el sistema Windows +#@param str_hive sección del registro +#@return str_path - camino del fichero de registro +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_NOTFOUND Fichero de registro no encontrado. +#@note hive = { default, sam, security, software, system, components } +#@warning El sistema de archivos de Windows debe estar montada previamente. +#@version 1.0.1 - Nueva función +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2011-05-18 +#*/ ## +function ogGetHivePath () +{ +# Variables locales. +local FILE FILENT FILEXP + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME path_mountpoint str_hive" + "$FUNCNAME /mnt/sda1 SOFTWARE" + return +fi +# Error si no se reciben 2 parámetros. +[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $? + +# Camino del fichero de registro en NT/2000 o XP/Vista/7. +FILENT=$(ogGetPath "/$1/winnt/system32/config/$2") +[ -f $FILENT ] && FILE="$FILENT" +FILEXP=$(ogGetPath "/$1/windows/system32/config/$2") +[ -f $FLEHXP ] && FILE="$FILEXP" +[ ! -f $FILE ] && ogRaiseError OG_ERR_NOTFOUND "$1,$2" && return $? + +echo "$FILE" +} + + +#/** +# ogGetRegistryValue path_mountpoint str_hive str_valuename +#@brief Devuelve el dato de un valor del registro de Windows. +#@param path_mountpoint directorio donde está montado el sistema Windows +#@param str_hive sección del registro +#@param str_valuename nombre del valor +#@return str_valuedata - datos del valor. +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_NOTFOUND Fichero de registro no encontrado. +#@note hive = { default, sam, security, software, system, components } +#@warning Requisitos: chntpw, awk +#@warning El sistema de archivos de Windows debe estar montado previamente. +#@version 0.9 - Adaptación para OpenGNSys. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2009-09-11 +#*/ ## +function ogGetRegistryValue () +{ +# Variables locales. +local FILE + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME path_mountpoint str_hive str_valuename" \ + "$FUNCNAME /mnt/sda1 SOFTWARE '\Microsoft\NewKey\Value1' ==> 1" + return +fi +# Error si no se reciben 3 parámetros. +[ $# == 3 ] || ogRaiseError $OG_ERR_FORMAT || return $? +# Camino del fichero de registro. +FILE=$(ogGetHivePath "$1" "$2") || return $? + +# Devolver el dato del valor de registro. +# /* (comentario Doxygen) +chntpw "$FILE" << EOT 2>/dev/null | awk '/> Value/ {getline;print $0;}' +cd ${3%\\*} +cat ${3##*\\} +q +EOT +# (comentario Doxygen) */ +} + + +#/** +# ogListRegistryKeys path_mountpoint str_hive str_key +#@brief Lista los nombres de subclaves de una determinada clave del registro de Windows. +#@param path_mountpoint directorio donde está montado el sistema Windows +#@param str_hive sección del registro +#@param str_key clave de registro +#@return str_subkey ... - lista de subclaves +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_NOTFOUND Fichero de registro no encontrado. +#@note hive = { default, sam, security, software, system, components } +#@warning Requisitos: chntpw, awk +#@warning El sistema de archivos de Windows debe estar montado previamente. +#@version 0.9 - Adaptación para OpenGNSys. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2009-09-23 +#*/ ## +function ogListRegistryKeys () +{ +# Variables locales. +local FILE + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME path_mountpoint str_hive str_key" \ + "$FUNCNAME /mnt/sda1 SOFTWARE '\Microsoft\Windows\CurrentVersion'" + return +fi +# Error si no se reciben 3 parámetros. +[ $# == 3 ] || ogRaiseError $OG_ERR_FORMAT || return $? + +# Camino del fichero de registro. +FILE=$(ogGetHivePath "$1" "$2") || return $? + +# Devolver la lista de claves de registro. +chntpw "$FILE" << EOT 2>/dev/null | awk 'BEGIN {FS="[<>]"} $1~/^ $/ {print $2}' +ls $3 +q +EOT +} + + +#/** +# ogListRegistryValues path_mountpoint str_hive str_key +#@brief Lista los nombres de valores de una determinada clave del registro de Windows. +#@param path_mountpoint directorio donde está montado el sistema Windows +#@param str_hive sección del registro +#@param str_key clave de registro +#@return str_value ... - lista de valores +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_NOTFOUND Fichero de registro no encontrado. +#@note hive = { default, sam, security, software, system, components } +#@warning Requisitos: chntpw, awk +#@warning El sistema de archivos de Windows debe estar montado previamente. +#@version 1.0.1 - Nueva función. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2011-05-26 +#*/ ## +function ogListRegistryValues () +{ +# Variables locales. +local FILE + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME path_mountpoint str_hive str_key" \ + "$FUNCNAME /mnt/sda1 SOFTWARE '\Microsoft\Windows\CurrentVersion'" + return +fi +# Error si no se reciben 3 parámetros. +[ $# == 3 ] || ogRaiseError $OG_ERR_FORMAT || return $? +# Camino del fichero de registro. +FILE=$(ogGetHivePath "$1" "$2") || return $? + +# Devolver la lista de claves de registro. +chntpw "$FILE" << EOT 2>/dev/null | awk 'BEGIN {FS="[<>]"} $1~/REG_/ {print $2}' +ls $3 +q +EOT +} + + +#/** +# ogSetRegistryValue path_mountpoint str_hive str_valuename str_valuedata +#@brief Establece el dato asociado a un valor del registro de Windows. +#@param path_mountpoint directorio donde está montado el sistema Windows +#@param str_hive sección del registro +#@param str_valuename nombre del valor de registro +#@param str_valuedata dato del valor de registro +#@return (nada) +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_NOTFOUND Fichero de registro no encontrado. +#@note hive = { default, sam, security, software, system, components } +#@warning Requisitos: chntpw +#@warning El sistema de archivos de Windows debe estar montado previamente. +#@version 0.9 - Adaptación para OpenGNSys. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2009-09-24 +#*/ ## +function ogSetRegistryValue () +{ +# Variables locales. +local FILE + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME path_mountpoint str_hive str_valuename str_data" + "$FUNCNAME /mnt/sda1 SOFTWARE '\Microsoft\NewKey\Value1' 1" + return +fi +# Error si no se reciben 4 parámetros. +[ $# == 4 ] || ogRaiseError $OG_ERR_FORMAT || return $? +# Camino del fichero de registro. +FILE=$(ogGetHivePath "$1" "$2") || return $? + +# Cambiar el dato del valor de registro. +chntpw "$FILE" << EOT &>/dev/null +ed $3 +$4 +q +y +EOT +} + diff --git a/client/engine/String.lib b/client/engine/String.lib index a81e3b07..a81e3b07 100644..100755 --- a/client/engine/String.lib +++ b/client/engine/String.lib diff --git a/client/engine/System.lib b/client/engine/System.lib index 9973b596..020692d5 100755 --- a/client/engine/System.lib +++ b/client/engine/System.lib @@ -74,7 +74,24 @@ case "$CODE" in $OG_ERR_IMAGE) MSG="$MSG_ERR_IMAGE \"$2\"" ;; $OG_ERR_NOTOS) MSG="$MSG_ERR_NOTOS \"$2\"" ;; $OG_ERR_NOTEXEC) MSG="$MSG_ERR_NOTEXEC \"$2\"" ;; - *) MSG="$MSG_ERR_GENERIC"; CODE=$OG_ERR_GENERIC ;; + $OG_ERR_NOTWRITE) MSG="$MSG_ERR_NOTWRITE \"$2\"" ;; + $OG_ERR_NOTCACHE) MSG="$MSG_ERR_NOTCACHE \"$2\"" ;; + $OG_ERR_CACHESIZE) MSG="$MSG_ERR_CACHESIZE \"$2\"" ;; + $OG_ERR_REDUCEFS) MSG="$MSG_ERR_REDUCEFS \"$2\"" ;; + $OG_ERR_EXTENDFS) MSG="$MSG_ERR_EXTENDFS \"$2\"" ;; + $OG_ERR_IMGSIZEPARTITION) MSG="$MSG_ERR_IMGSIZEPARTITION \"$2\"" ;; + $OG_ERR_UCASTSYNTAXT) MSG="$MSG_ERR_UCASTSYNTAXT \"$2\"" ;; + $OG_ERR_UCASTSENDPARTITION) MSG="$MSG_ERR_UCASTSENDPARTITION \"$2\"" ;; + $OG_ERR_UCASTSENDFILE) MSG="$MSG_ERR_UCASTSENDFILE \"$2\"" ;; + $OG_ERR_UCASTRECEIVERPARTITION) MSG="$MSG_ERR_UCASTRECEIVERPARTITION \"$2\"" ;; + $OG_ERR_UCASTRECEIVERFILE) MSG="$MSG_ERR_UCASTRECEIVERFILE \"$2\"" ;; + $OG_ERR_MCASTSYNTAXT) MSG="$MSG_ERR_MCASTSYNTAXT \"$2\"" ;; + $OG_ERR_MCASTSENDFILE) MSG="$MSG_ERR_MCASTSENDFILE \"$2\"" ;; + $OG_ERR_MCASTRECEIVERFILE) MSG="$MSG_ERR_MCASTRECEIVERFILE \"$2\"" ;; + $OG_ERR_MCASTSENDPARTITION) MSG="$MSG_ERR_MCASTSENDPARTITION \"$2\"" ;; + $OG_ERR_MCASTRECEIVERPARTITION) MSG="$MSG_ERR_MCASTRECEIVERPARTITION \"$2\"" ;; + $OG_ERR_PROTOCOLJOINMASTER) MSG="$MSG_ERR_PROTOCOLJOINMASTER \"$2\"" ;; + *) MSG="$MSG_ERR_GENERIC"; CODE=$OG_ERR_GENERIC ;; esac # Mostrar mensaje de error y salir con el código indicado. @@ -104,23 +121,26 @@ basename $(ps hlp $PPID | awk '{if ($13~/bash/ && $14!="") print $14; # ogIsRepoLocked #@brief Comprueba si el repositorio está siendo usado (tiene ficheros abiertos). #@param No. -#@return Código de salida: 0 - sin bloquear (libre), 1 - bloqueado. +#@return Código de salida: 0 - bloqueado, 1 - sin bloquear o error. #@version 0.10 - Primera versión para OpenGnSys. #@author Ramon Gomez, ETSII Universidad de Sevilla #@date 2011-01-17 +#@version 1.0.1 - Devolver falso en caso de error. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2011-05-18 #*/ -function ogIsRepoLocked () { - +function ogIsRepoLocked () +{ # Variables locales. local f FILES # No hacer nada, si no está definido el punto de montaje del repositorio. -[ -z "$OGIMG" ] && return +[ -z "$OGIMG" ] && return 1 # Comprobar si alguno de los ficheros abiertos por los procesos activos está en el # punto de montaje del repositorio de imágenes. FILES=$(for f in /proc/[0-9]*/fd/*; do readlink -f "$f"; done | grep "^$OGIMG") # */ (comentario Doxygen) -[ -n "$FILES" ] +test -n "$FILES" } diff --git a/client/shared/etc/init/default.sh b/client/shared/etc/init/default.sh index fe43dacc..51f31dc0 100755 --- a/client/shared/etc/init/default.sh +++ b/client/shared/etc/init/default.sh @@ -3,7 +3,8 @@ # TODO Separar esta sección en otro script # Lanzar servicios complementarios del cliente. echo -ne "og\nog\n" | passwd root -/etc/init.d/ssh restart +#Compatibilidad ssh con el boot-tools 1.0.2 +/etc/init.d/ssh restart || /usr/sbin/sshd #setterm -blank 0 -powersave off -powerdown 0 < /dev/console > /dev/console 2>&1 ethtool -s $DEVICE wol g 2>/dev/null diff --git a/client/shared/etc/lang.es_ES.conf b/client/shared/etc/lang.es_ES.conf index 061ccef8..305ed9c9 100644 --- a/client/shared/etc/lang.es_ES.conf +++ b/client/shared/etc/lang.es_ES.conf @@ -14,7 +14,7 @@ MSG_ERR_IMAGE="No se puede crear o restaurar una image de sistema" MSG_ERR_NOTEXEC="Programa o función no ejecutable" MSG_ERR_NOTWRITE="No hay acceso de escritura" MSG_ERR_NOTCACHE="No existe particion Cache en el cliente" -MSG_ERR_CACHESIZE="No existe particion Cache en el cliente" +MSG_ERR_CACHESIZE="El espacio de la cache local o remota no es suficiente" MSG_ERR_REDUCEFS="Error al reducir el sistema de archivos" MSG_ERR_EXTENDFS="Error al expandir el sistema de archivos" MSG_ERR_IMGSIZEPARTITION="Error al restaurar: Particion mas pequeña que la imagen" @@ -63,6 +63,8 @@ MSG_MAKELINKS="Crear enlaces simbólicos." MSG_MOUNTREPO="Montar repositorio por %s en modo %s." MSG_OFFLINEMODE="Modo de arranque sin conexión." +MSG_HELP_ogAddRegistryKey="Añade una nueva clave al registro de Windows." +MSG_HELP_ogAddRegistryValue="Añade un nuevo valor al registro de Windows." MSG_HELP_ogBoot="Arranca un sistema operativo instalado." MSG_HELP_ogCalculateChecksum="Calcula la suma de comprobación (checksum) de un fichero." MSG_HELP_ogCheckFs="Comprueba la consistencia de un sistema de archivos." @@ -73,6 +75,8 @@ MSG_HELP_ogCreateImage="Genera una imagen exacta de un sistema operativo instala MSG_HELP_ogCreateMbrImage="Genera una imagen del sector de arranque (MBR)." MSG_HELP_ogCreatePartitions="Define la estructura de particiones de un disco." MSG_HELP_ogDeleteFile="Borra un fichero de un espacio de almacenamiento." +MSG_HELP_ogDeleteRegistryKey="Borra una clave vacía del registro de Windows." +MSG_HELP_ogDeleteRegistryValue="Borra un valor del registro de Windows." MSG_HELP_ogDeleteTree="Borra un árbol de directorios de un espacio de almacenamiento." MSG_HELP_ogDevToDisk="Devuelve el nº de orden de dicso o de partición correspondiente al camino del fichero de dispositivo." MSG_HELP_ogDiskToDev="Devuelve el camino del fichero de dispositivo correspondiente al nº de orden de dicso o de partición." @@ -82,10 +86,12 @@ MSG_HELP_ogFindCache="Indica la partición reservada para caché local." MSG_HELP_ogFormat="Formatea o reformatea un sistema de archivos." MSG_HELP_ogFormatCache="Formatea (inicia) el sistema de caché local." MSG_HELP_ogFormatFs=$MSG_HELP_ogFormat +MSG_HELP_ogGetArch="Devuelve el tipo de arquitectura del cliente." MSG_HELP_ogGetCacheSize="Devuelve el tamaño de la partición de caché local." MSG_HELP_ogGetCacheSpace="Devuelve el espacio máximo disponible que puede ser reservado para la partición de caché local." MSG_HELP_ogGetFsSize="Devuelve el tamaño de un sistema de archivos." MSG_HELP_ogGetFsType="Devuelve el mnemónico de tipo de sistema de archivos." +MSG_HELP_ogGetHivePath="Devuelve el camino completo del fichero de una sección del registro de Windows." MSG_HELP_ogGetHostname="Devuelve el nombre de la máquina local." MSG_HELP_ogGetIpAddress="Devuelve la dirección IP del cliente." MSG_HELP_ogGetImageSize="Devuelve el tamaño de una imagen de sistema." @@ -100,20 +106,25 @@ MSG_HELP_ogGetPartitionSize="Devuelve el tamaño de una partición." MSG_HELP_ogGetPartitionType="Devuelve el mnemónico de tipo de una partición." MSG_HELP_ogGetPath="Devuelve el camino completo de un fichero de sistema OpenGnSys." MSG_HELP_ogGetRegistryValue="Devuelve el dato de un valor del registro de Windows." +MSG_HELP_ogGetRepoIp="Devuelve la dirección IP del repositorio de datos." +MSG_HELP_ogGetServerIp="Devuelve la dirección IP del servidor principal." MSG_HELP_ogGetWindowsName="Devuelve el nombre del cliente guardado en el registro de Windows." MSG_HELP_ogHelp="Muestra mensajes de ayudas para las funciones." MSG_HELP_ogHidePartition="Oculta una partición de Windows." MSG_HELP_ogIdToType="Devuelve el mnemónico asociado al identificador de tipo de partición." +MSG_HELP_ogIsFormated="Comprueba si un sistema de archivos está formateado." MSG_HELP_ogIsLocked="Comprueba si una partición está bloqueada por una operación de uso exclusivo." MSG_HELP_ogIsImageLocked="Comprueba si una imagen está bloqueada por una operación de uso exclusivo." MSG_HELP_ogIsPartitionLocked=$MSG_HELP_ogIsLocked -MSG_HELP_ogIsMounted="Comprueba si un sistema operativo está montado." -MSG_HELP_ogIsNewerFile="Comprueba si un fichero es más nuevo (se modificado después) que otro." +MSG_HELP_ogIsMounted="Comprueba si un sistema de archivos está montado." +MSG_HELP_ogIsNewerFile="Comprueba si un fichero es más nuevo (se ha modificado después) que otro." MSG_HELP_ogIsValidType="Comprueba si el tipo de sistema de archivos es válido para un identificador de partición." MSG_HELP_ogLinuxBootParameters="Devuelve los parámetros de arranque de un sistema operativo Linux instalado." MSG_HELP_ogListHardwareInfo="Lista el inventario de dispositivos del cliente." MSG_HELP_ogListPartitions="Lista la estructura de particiones de un disco." -MSG_HELP_ogListRegistryKeys="Lista los nombres de las claves incluidas en una clave del registro de Windows." +MSG_HELP_ogListRegistryKeys="Lista los nombres de las subclaves incluidas en una clave del registro de Windows." +MSG_HELP_ogListRegistryValues="Lista los nombres de los valores incluidos en una clave del registro de Windows." +MSG_HELP_ogListSoftware="Lista el inventario de programas instalados en un sistema operativo." MSG_HELP_ogLock="Bloquea una partición para operación de uso exclusivo." MSG_HELP_ogLockImage="Bloquea una imagen para operación de uso exclusivo." MSG_HELP_ogLockPartition=$MSG_HELP_ogLock diff --git a/client/shared/lib/grub4dos/badgrub.exe b/client/shared/lib/grub4dos/badgrub.exe Binary files differindex 3cd26a61..92b924d2 100644 --- a/client/shared/lib/grub4dos/badgrub.exe +++ b/client/shared/lib/grub4dos/badgrub.exe diff --git a/client/shared/lib/grub4dos/bootlace.com b/client/shared/lib/grub4dos/bootlace.com Binary files differindex 199831f6..58ae01f9 100755..100644 --- a/client/shared/lib/grub4dos/bootlace.com +++ b/client/shared/lib/grub4dos/bootlace.com diff --git a/client/shared/lib/grub4dos/grldr b/client/shared/lib/grub4dos/grldr Binary files differindex a31e27bd..16ed4c77 100644 --- a/client/shared/lib/grub4dos/grldr +++ b/client/shared/lib/grub4dos/grldr diff --git a/client/shared/lib/grub4dos/grldr.mbr b/client/shared/lib/grub4dos/grldr.mbr Binary files differindex 6130129d..7af7ed3c 100644 --- a/client/shared/lib/grub4dos/grldr.mbr +++ b/client/shared/lib/grub4dos/grldr.mbr diff --git a/client/shared/lib/grub4dos/grub.exe b/client/shared/lib/grub4dos/grub.exe Binary files differindex 8df2433f..57b890d2 100644 --- a/client/shared/lib/grub4dos/grub.exe +++ b/client/shared/lib/grub4dos/grub.exe diff --git a/client/shared/lib/grub4dos/menu.lst b/client/shared/lib/grub4dos/menu.lst deleted file mode 100644 index e7641534..00000000 --- a/client/shared/lib/grub4dos/menu.lst +++ /dev/null @@ -1,83 +0,0 @@ -# This is a sample menu.lst file. You should make some changes to it.
-# The old install method of booting via the stage-files has been removed.
-# Please install GRLDR boot strap code to MBR with the bootlace.com
-# utility under DOS/Win9x or Linux.
-
-color black/cyan yellow/cyan
-timeout 30
-default /default
-
-title find and load NTLDR of Windows NT/2K/XP
-fallback 1
-find --set-root /ntldr
-chainloader /ntldr
-savedefault --wait=2
-
-title find and load CMLDR, the Recovery Console of Windows NT/2K/XP
-fallback 2
-find --set-root /cmldr
-chainloader /cmldr
-#####################################################################
-# write string "cmdcons" to memory 0000:7C03 in 2 steps:
-#####################################################################
-# step 1. Write 4 chars "cmdc" at 0000:7C03
-write 0x7C03 0x63646D63
-# step 2. Write 3 chars "ons" and an ending null at 0000:7C07
-write 0x7C07 0x00736E6F
-savedefault --wait=2
-
-title find and load IO.SYS of Windows 9x/Me
-fallback 3
-find --set-root /io.sys
-chainloader /io.sys
-savedefault --wait=2
-
-title find and boot Mandriva with menu.lst already installed
-fallback 4
-find --set-root /etc/mandriva-release
-savedefault --wait=2
-configfile /boot/grub/menu.lst
-
-title find and boot Linux with menu.lst already installed
-fallback 5
-find --set-root /sbin/init
-savedefault --wait=2
-configfile /boot/grub/menu.lst
-
-title commandline
-savedefault --wait=2
-commandline
-
-title floppy (fd0)
-chainloader (fd0)+1
-rootnoverify (fd0)
-savedefault --wait=2
-
-title back to dos
-savedefault --wait=2
-quit
-
-title reboot
-savedefault --wait=2
-reboot
-
-title halt
-savedefault --wait=2
-halt
-
-title memdrive duplicated from floppy image file (hd0,0)/sbm.bin
-map --mem (hd0,0)/sbm.bin (fd0)
-map --hook
-chainloader (fd0)+1
-rootnoverify (fd0)
-savedefault --wait=2
-
-title memdrive based on win98 partition (hd0,6)
-map --mem (hd0,6)+1 (hd0)
-# map --mem (hd0,0)/win98.gz (hd0)
-map --hook
-chainloader (hd0)+1
-rootnoverify (hd0)
-savedefault --wait=2
-
-
diff --git a/client/shared/scripts/cloneRemoteFromMaster b/client/shared/scripts/cloneRemoteFromMaster index a7a5e11b..6516b587 100755 --- a/client/shared/scripts/cloneRemoteFromMaster +++ b/client/shared/scripts/cloneRemoteFromMaster @@ -44,12 +44,29 @@ #@version 1.0 - control de errores para el ogAdmServer #@author Antonio J. Doblas Viso. Universidad de Malaga. #@date 2011/04/24 +#@version 1.0 - Uso de parted para controlar tamaño particion destino. Requiere Formateo FS previo -parted usa FS para el tamanyo". +#@author Antonio J. Doblas Viso. Universidad de Malaga. +#@date 2011/04/24 +#@version 1.0.1 - Se elimina la operación de reducir la particion. +#@author Antonio J. Doblas Viso. Universidad de Malaga. +#@date 2011/05/16 + #*/ ## +#test 1. cliente sin particiones. Detectado TODO: crear estrucutras de particiones +#test 2. cliente con particion mas pequeña. Detectado. +#test 3. cleinte con particion destinio no formateado. Detectado. +#test 4. cliente con particion destino ocupado por el usuario pwd . FALLO. +#test 5. master sin origen particion. +#test 6. master sin origen fichero. + + + +trap "pkill faucet; exit 1" 0 1 2 3 6 9 14 15 TIME1=$SECONDS PROG="$(basename $0)" -if [ $# -lt 1 ]; then +if [ $# -lt 1 -o "$1" == "help" ]; then echo "cloneRemoteFromMaster ipmaster disk init [MULTICAST|UNICAST] session disk part tool comp" exit 1 fi @@ -76,7 +93,10 @@ case $PROTOCOL in UNICAST|unicast) SESSIONUCASTSERVER=$5 SESSIONUCASTCLIENT=`echo $5 | awk -F: '{print $1}'`:$MASTERIP - ;; + ;; + *) + exit $(ogRaiseError $OG_ERR_FORMAT "Protocolo $PROTOCOL no soportado en esta operacion"; echo $?) + ;; esac # contenedor destino (disco particion) DISKTARGET=$6 @@ -102,29 +122,36 @@ case $MASTERIP in ogRaiseError $OG_ERR_NOTFOUND "$2 $3"; exit $? fi echo $MODEMASTER - # Preparando instrucción del Master segun $MODEMASTER{SENDPARTITION SENDFILE} - + # Preparando instrucción del Master segun $MODEMASTER{SENDPARTITION SENDFILE} case "$MODEMASTER" in SENDPARTITION) echo "[5] Master en modo $MODEMASTER: informacion inicial a los clientes-slaves" - faucet 4000 --out echo "WORKING" & + if ps aux | grep -v grep | grep "faucet 4000" + then + ogRaiseError $OG_ERR_NOTFOUND "MASTER: puerto en uso: 118"; exit $? + else + faucet 4000 --out echo "WORKING" & + fi echo "[10]: Desmontando DISK:$DISKSOURCE PARTITION:$PARTSOURCE" - ogUnmount $2 $3 || exit $? - echo "[15]: Calculando la reduccion del sistema de archivos DISK:$DISKSOURCE PARTITION:$PARTSOURCE SIZE:$SIZE" + ogUnmount $2 $3 || exit $(ogRaiseError $OG_ERR_LOCKED "no se puede desmontar $2 $3 l124"; echo $?) #Obtener tamaño de la partición. - SIZE=$(ogGetPartitionSize $2 $3) - # Reducir el sistema de archvios. - ogReduceFs $2 $3 || exit $? - REDSIZE=$(ogGetFsSize $2 $3) + SIZE=$(ogGetPartitionSize $2 $3) || exit $(ogRaiseError $OG_ERR_REDUCEFS "Error al detectar tamaño partcion $2 $3 l127"; echo $?) + echo "[15]: Calculando la reduccion del sistema de archivos DISK:$DISKSOURCE PARTITION:$PARTSOURCE SIZE:$SIZE" + ogReduceFs $2 $3 || exit $(ogRaiseError $OG_ERR_REDUCEFS "Error al reducir el FS $2 $3 l129"; echo $?) + REDSIZE=$(ogGetFsSize $2 $3) || exit $(ogRaiseError $OG_ERR_REDUCEFS "Error al detectar el nuevo FS $2 $3 l130"; echo $?) echo "[20]: Reducido el sistema de archivos a $REDSIZE $DISKSOURCE $PARTSOURCE" - if [ $REDSIZE -lt $SIZE ]; then - echo "[24] Redimensionar partición a $REDSIZE KB." - ogSetPartitionSize $2 $3 $REDSIZE - fi + #if [ $REDSIZE -lt $SIZE ]; then + # echo "[24] Redimensionar partición a $REDSIZE KB." + # ogSetPartitionSize $2 $3 $REDSIZE + #fi echo "[25] Master en Modo $MODEMASTER: informacion de transferencia a los clientes-slaves $PROTOCOL $TOOLCLONE $COMPRESOR $REDSIZE" pkill faucet - faucet 4000 --out echo "READY $TOOLCLONE $COMPRESOR $REDSIZE" & - + if ps aux | grep -v grep | grep "faucet 4000" + then + ogRaiseError $OG_ERR_NOTFOUND "MASTER: puerto en uso: 140"; exit $? + else + faucet 4000 --out echo "READY $TOOLCLONE $COMPRESOR $REDSIZE" & + fi case $PROTOCOL in MULTICAST|multicast) echo "[29] ogMcastSendPartition $DISKSOURCE $PARTSOURCE $SESSIONMCASTSERVER $TOOLCLONE $COMPRESOR" @@ -137,22 +164,34 @@ case $MASTERIP in ;; esac - if [ $REDSIZE -lt $SIZE ]; then - echo "[85] Redimensionar partición a $SIZE KB." - ogSetPartitionSize $2 $3 $SIZE + #if [ $REDSIZE -lt $SIZE ]; then + # echo "[85] Redimensionar partición a $SIZE KB." + # ogSetPartitionSize $2 $3 $SIZE echo "[90] Extender sistema de archivos." ogExtendFs $2 $3 - fi + #fi pkill faucet + if [ $RETVAL == 0 ] + then + exit 0 + else + exit $(ogRaiseError $OG_ERR_MCASTSENDPARTITION "Error al enviar la particion $2 $3 con protocolo $PROTOCOL l167"; echo $?) + fi + ;; SENDFILE) echo "[5] Master en modo $MODEMASTER: informacion inicial a los clientes-slaves" echo "[10]: Preparando Imagen: $IMG" - TOOLCLONE=$(ogGetImageProgram $2 $3) - COMPRESOR=$(ogGetImageCompressor $2 $3) - REDSIZE=$(ogGetImageSize $2 $3) + TOOLCLONE=$(ogGetImageProgram $2 $3) || exit $(ogRaiseError $OG_ERR_LOCKED "TOOLCLONE no detectado l174"; echo $?) + COMPRESOR=$(ogGetImageCompressor $2 $3) || exit $(ogRaiseError $OG_ERR_LOCKED "COMPRESOR NO DETECTADO l175"; echo $?) + REDSIZE=$(ogGetImageSize $2 $3) || exit $(ogRaiseError $OG_ERR_LOCKED "REDSIZE NO DETECTADO l176"; echo $?) echo "[25] Master en Modo $MODEMASTER: informacion de transferencia a los clientes-slaves $PROTOCOL $TOOLCLONE $COMPRESOR $REDSIZE" - faucet 4000 --out echo "READY $TOOLCLONE $COMPRESOR $REDSIZE" & + if ps aux | grep -v grep | grep "faucet 4000" + then + ogRaiseError $OG_ERR_NOTFOUND "MASTER: puerto en uso: 140"; exit $? + else + faucet 4000 --out echo "READY $TOOLCLONE $COMPRESOR $REDSIZE" & + fi case $PROTOCOL in MULTICAST|multicast) echo "[29] ogMcastSendFile $2 $3.img $SESSIONMCASTSERVER " @@ -165,15 +204,27 @@ case $MASTERIP in ;; esac pkill faucet + if [ $RETVAL == 0 ] + then + exit 0 + else + exit $(ogRaiseError $OG_ERR_MCASTSENDFILE "Error al enviar la image $2 $3.img con protocolo $PROTOCOL l200"; echo $?) + fi ;; esac - #exit $RETVAL - exit 0 # FIN Preparando instrucción del Master segun $MODEMASTER{SENDPARTITION SENDFILE} ;; *) - echo "[1] Equipo -Client- preparando para recibir datos" - ogUnmount $DISKTARGET $PARTTARGET || exit $? + echo "[1] Equipo -Client- preparando para recibir datos $PROTOCOL" + ogDiskToDev $DISKTARGET $PARTTARGET &>/dev/null || exit $(ogRaiseError $OG_ERR_LOCKED "El cliente no tiene esas particiones $DISKTARGET $PARTTARGET l211"; echo $?) + # TODO: si el cliente no está en la lista de clientes UNICAST salir. + case $PROTOCOL in + UNICAST|unicast) + echo "$SESSIONUCASTSERVER" | grep $HOSTIP || exit $(ogRaiseError $OG_ERR_PROTOCOLJOINMASTER "Este cliente no pertence a la sesion UNICAST l214"; echo $?) + ;; + esac + echo "[2] Desmontando particion destino" + ogUnmount $DISKTARGET $PARTTARGET || exit $(ogRaiseError $OG_ERR_LOCKED "no se puede desmontar la particion destino $2 $3 l218"; echo $?) echo -n "[25] Buscando informacion extra sobre la clonacion con el master $MASTERIP: " sleep 10 TIMEWAITMASTER=120 @@ -183,9 +234,9 @@ case $MASTERIP in do INFOEXTRA=`hose $MASTERIP 4000 --in cat 2>/dev/null` sleep 10; echo -n "." - #Si no consigue conectar con Master, comienza el timeout $TIMEWAITMASTER para abortar + echo comienza el timeout $TIMEWAITMASTER para abortar [ -z "$INFOEXTRA" ] && let TIMEWAITMASTER=$TIMEWAITMASTER-10 - [ "$TIMEWAITMASTER" -gt "0" ] || ogRaiseError $OG_ERR_PROTOCOLJOINMASTER " " || exit $? + [ "$TIMEWAITMASTER" -gt "0" ] || exit $(ogRaiseError $OG_ERR_PROTOCOLJOINMASTER " l230 "; echo $?) #Si primer parametro desde el server es READY, salimos del bucle GETINFO=$(echo $INFOEXTRA | awk '{print $1}') [ "$GETINFO" == "READY" ] && GETINFO=OK @@ -194,36 +245,29 @@ case $MASTERIP in TOOLCLONE=$(echo $INFOEXTRA | awk '{print $2}') COMPRESOR=$(echo $INFOEXTRA | awk '{print $3}') SIZEIMAGE=$(echo $INFOEXTRA | awk '{print $4}') - echo -n "[25] $INFOEXTRA = herramienta= $TOOLCLONE compresor= $COMPRESOR size= $SIZEIMAGE " + echo -n "[26] $INFOEXTRA = herramienta= $TOOLCLONE compresor= $COMPRESOR size= $SIZEIMAGE " + ogMount $DISKTARGET $PARTTARGET || ogFormat $DISKTARGET $PARTTARGET + SIZEPARTTARGET=$(parted `ogDiskToDev $DISKTARGET $PARTTARGET` unit kB print | awk '{y=x; x=$4};END{print y}' | tr -d kB) + echo "[29] comprobando que el tamaño de la imagen $SIZEIMAGE es menor que el de la particion destino $SIZEPARTTARGET" # comprobamos que el tamaño de a imagen es menor que la del cliente. - SIZEPARTTARGET=$(ogGetPartitionSize $DISKTARGET $PARTTARGET) if [ "$SIZEIMAGE" -lt "$SIZEPARTTARGET" ] then echo "[30] Iniciando Cliente $PROTOCOL " case $PROTOCOL in MULTICAST|multicast) echo ogMcastReceiverPartition $DISKTARGET $PARTTARGET $SESSIONMCASTCLIENT $TOOLCLONE $COMPRESOR - ogMcastReceiverPartition "$DISKTARGET" "$PARTTARGET" "$SESSIONMCASTCLIENT" "$TOOLCLONE" "$COMPRESOR" || exit $? - ;; + ogMcastReceiverPartition "$DISKTARGET" "$PARTTARGET" "$SESSIONMCASTCLIENT" "$TOOLCLONE" "$COMPRESOR" || exit $(ogRaiseError $OG_ERR_MCASTRECEIVERPARTITION " l251 "; echo $?) + ;; UNICAST|unicast) echo ogUcastReceiverPartition $DISKTARGET $PARTTARGET $SESSIONUCASTCLIENT $TOOLCLONE $COMPRESOR - ogUcastReceiverPartition $DISKTARGET $PARTTARGET $SESSIONUCASTCLIENT $TOOLCLONE $COMPRESOR || exit $? + ogUcastReceiverPartition $DISKTARGET $PARTTARGET $SESSIONUCASTCLIENT $TOOLCLONE $COMPRESOR || exit $(ogRaiseError $OG_ERR_UCASTRECEIVERPARTITION " l230 "; echo $?) ;; - esac - - - echo "[90] Extender sistema de archivos" - ogExtendFs $DISKTARGET $PARTTARGET - # Cambiar nombre en sistemas Windows. - if [ "$(ogGetOsType $DISKTARGET $PARTTARGET)" = "Windows" ]; then - HOST=$(ogGetHostname) - HOST=${HOST:-"UNKNOWN"} - echo "[90] Cambiar nombre Windows a \"$HOST\"." - ogSetWindowsName $DISKTARGET $PARTTARGET "$HOST" - fi + esac + echo "[90] llamando a configureOS $DISKTARGET $PARTTARGET" + configureOs $DISKTARGET $PARTTARGET else # Si el tamaño de los datos recibidos es más grande que la particion destino - ogRaiseError $OG_ERR_IMGSIZEPARTITION "ERROR tamanio particion= $SIZEPARTTARGET tamanio de la imagen= $SIZEIMAGE"; exit $? + ogRaiseError $OG_ERR_IMGSIZEPARTITION "ERROR tamanio particion= $SIZEPARTTARGET menor que la imagen= $SIZEIMAGE"; exit $? fi ;; esac diff --git a/client/shared/scripts/configureOs b/client/shared/scripts/configureOs new file mode 100755 index 00000000..64249c9b --- /dev/null +++ b/client/shared/scripts/configureOs @@ -0,0 +1,46 @@ +#!/bin/bash + +#/** +# configureOS +#@brief Scirpt de ejemplo para realizar la configuracion del sistema operativo restaurado. +#@brief (puede usarse como base para el programa de creación de imágenes usado por OpenGnSys Admin). +#@param 1 disco +#@param 2 particion +#@return +#@TODO comprobar que el tipo de particion corresponde con el sistema de archivos. +#@exception OG_ERR_FORMAT # 1 formato incorrecto. +#@version 1.0.1 - Integracion cambio de nombre, extender fs, chequear particion activa +#@author +#@date 2011-05-11 +#@version 1.0.1 - Configura el sector de la particion y el gestor de windows para iniciarse desde cualquier particion. +#@author Antonio J. Doblas Viso. Universidad de Malaga. +#@date 2011-05-20 + + + +# Si el sistema de archivos no esta extendido. Realizar. +PARTSIZE=$(ogGetPartitionSize $1 $2) +FSSIZE=$(ogGetFsSize $1 $2) +if [ $FSSIZE -lt $PARTSIZE ]; then + echo "Extender sistema de archivos." + ogExtendFs $1 $2 +fi + +#Si no existe particion activa, activar este sistema. +FLAGACTIVE=$(ogGetPartitionActive $1) +[ -z $FLAGACTIVE ] && ogSetPartitionActive $1 $2 + +# Cambiar nombre en sistemas Windows y quitar usuario de acceso por defecto. +if [ "$(ogGetOsType $1 $2)" = "Windows" ]; then + HOST=$(ogGetHostname) + HOST=${HOST:-"pc"} + echo " Cambiar nombre Windows a \"$HOST\" " + ogSetWindowsName $1 $2 "$HOST" + #ogSetWinlogonUser $1 $2 " " # Descomentar para cambiar usuario de inicio. + # Configurar el boot sector de la particion windows. + ogFixBootSector $1 $2 + # Configura el gestor de arranque de windows xp vista seven + ogWindowsBootParameters $1 $2 + # Registra en windows que la particion indicada es su nueva unidad c:\ + ogWindowsRegisterPartition $1 $2 C $1 $2 +fi
\ No newline at end of file diff --git a/client/shared/scripts/createImage b/client/shared/scripts/createImage index 8e98113a..3643d1af 100755 --- a/client/shared/scripts/createImage +++ b/client/shared/scripts/createImage @@ -1,6 +1,39 @@ #!/bin/bash -# createImage - Scirpt de ejemplo para crear una imagen de un sistema de archivos. -# (puede usarse como base para el programa de creación de imágenes usado por OpenGnSys Admin). + +#/** +# createImage +#@brief Scirpt de ejemplo para crear una imagen de un sistema de archivos. +#@brief (puede usarse como base para el programa de creación de imágenes usado por OpenGnSys Admin). +#@param 1 disco +#@param 2 particion +#@param 3 REPO|CACHE +#@param 4 imagen +#@return +#@exception OG_ERR_FORMAT # 1 formato incorrecto. +#@exception OG_ERR_PARTITION # 3 Error en partición de disco o en su sistema de archivos +#@exception OG_ERR_IMAGE # 5 Error en funcion ogCreateImage o ogRestoreImage. +#@exception OG_ERR_NOTWRITE # 14 error de escritura +#@exception OG_ERR_NOTCACHE # 15 si cache no existe 15 +#@exception OG_ERR_CACHESIZE # 16 si espacio de la cache local o remota no tiene espacio 16 +#@exception OG_ERR_REDUCEFS # 17 error al reducir sistema de archivos. +#@exception OG_ERR_EXTENDFS # 18 Errror al expandir el sistema de archivos. +#@note +#@todo: que hacer, si el tamaño de la cache es sufciente, pero no tiene espacio libre +#@todo: que hacer, si hay una imagen con igual nombre en la cache +#@version 1.0 - control de errores para el ogAdmServer +#@author +#@date 2011-04-10 +#@version 1.0.1 - Fin de control de errores para el ogAdmServer +#@author +#@date 2011-05-10 + +#*/ ## + +# Test 1. crear una imagen en un REPO sin espacio libre. +# test 2. crear una imagen en un REPO en modo solo lectura. +# test 3. intentar crear una imagen en la cache de un equipo que no la disponga. +# test 4. crear una imagen en la Cache sin espacio sufiente. +# test 5. intentar crear una imagen, en la que no se puede reducir el FS. TIME1=$SECONDS PROG="$(basename $0)" @@ -16,20 +49,22 @@ IMGEXT="img" # Si el repositorio es CACHE comprobamos que exista if [ "$3" == "CACHE" -o "$3" == "cache" ]; then - if ! $(ogFindCache >/dev/null); then - ogRaiseError $OG_ERR_NOTFOUND "CACHE" - exit $? - fi + ! ogFindCache >/dev/null && exit $(ogRaiseError $OG_ERR_NOTCACHE "CACHE "; echo $?) fi # Obtener información de los parámetros de entrada. -PART=$(ogDiskToDev "$1" "$2") || exit $? +PART=$(ogDiskToDev "$1" "$2" 2>/dev/null) || exit $(ogRaiseError $OG_ERR_PARTITION "$1 $2"; echo $?) + +#Comprobamos acceso de escritura. +DIRTEMP=$(date +%Y%m%d-%H%M%S) +ogMakeDir $3 /$4$DIRTEMP 2>/dev/null || exit $(ogRaiseError $OG_ERR_NOTWRITE "$3"; echo $?) && ogDeleteTree $3 /$4$DIRTEMP + IMGDIR=$(ogGetParentPath "$3" "/$4") # Si no existe, crear subdirectorio de la imagen. if [ $? != 0 ]; then echo "[5] Crear subdirectorio de la imagen \"$3 $(dirname "$4")." - ogMakeDir "$3" $(dirname "/$4") - IMGDIR=$(ogGetParentPath "$3" "/$4") || exit $? + ogMakeDir "$3" $(dirname "/$4") || exit $(ogRaiseError $OG_ERR_NOTWRITE "$3 /$4"; echo $?) + IMGDIR=$(ogGetParentPath "$3" "/$4") || exit $(ogRaiseError $OG_ERR_NOTWRITE "$3 /$4"; echo $?) fi IMGFILE=$IMGDIR/$(basename "/$4").$IMGEXT # Renombrar el fichero de imagen si ya existe. @@ -38,24 +73,47 @@ if [ -f "$IMGFILE" ]; then mv "$IMGFILE" "$IMGFILE.ant" mv "$IMGFILE.torrent" "$IMGFILE.torrent.ant" 2>/dev/null fi + +#Comprobar espacio que requerira la imagen para ser almacenada +if ogMount $1 $2 &>/dev/null +then + SIZEDATA=$(df -k | grep $PART | awk '{print $3}') + #Aplicar factor de compresion + FACTORGZIP=55/100 + FACTORLZOP=65/100 + let SIZEREQUIRED=$SIZEDATA*$FACTORLZOP + #Comprobar espacio libre en el contenedor. + [ "$3" == "CACHE" ] && SIZEFREE=$(ogGetFreeSize `ogFindCache`) + [ "$3" == "REPO" ] && SIZEFREE=$(df -k | grep $OGIMG | awk '{print $3}') +else + ogRaiseError $OG_ERR_PARTITION "$1 $2" + exit $? +fi + # Mostrar información. echo "[15] $PROG: Origen=$PART, Destino=$IMGFILE" +echo "[16] $PROG: TamañoRequerido=$SIZEREQUIRED EspacioDisponible=$SIZEFREE" + +[ "$SIZEREQUIRED" -gt "$SIZEFREE" ] && exit $(ogRaiseError $OG_ERR_CACHESIZE "$3" || echo $?) + + +# TODO: que hacer si la cache no tiene espacio libre. # Comprobar consistencia del sistema de archivos. echo "[20] Comprobar sistema de archivos." ogUnmount $1 $2 -ogCheckFs $1 $2 +ogCheckFs $1 $2 || exit $(ogRaiseError $OG_ERR_PARTITION "ogCheckFs $1 $2" && echo $?) echo "[30]: Reducir sistema de archivos." -ogReduceFs $1 $2 || exit 1 +ogReduceFs $1 $2 || exit $(ogRaiseError $OG_ERR_REDUCEFS "$1 $2"; echo $?) # Crear la imagen. -echo "[40] Crear imagen." -ogCreateImage $1 "$2" $3 $4 "$IMGPROG" "$IMGCOMP" || exit $? -#ogCreateImage $1 "$2" $3 $4 || exit $? +echo "[40] Crear imagen con: ogCreateImage $1 $2 $3 $4 $IMGPROG $IMGCOMP" +ogCreateImage $1 "$2" $3 $4 "$IMGPROG" "$IMGCOMP" || exit $(ogRaiseError $OG_ERR_IMAGE "ogCreteImage"; echo $?) echo "[90] Extender sistema de archivos." -ogExtendFs $1 $2 +ogExtendFs $1 $2 || exit $(ogRaiseError $OG_ERR_EXTENDFS "$1 $2"; echo $?) + TIME=$[SECONDS-TIME1] echo "[100] Duracion de la operacion $[TIME/60]m $[TIME%60]s" diff --git a/client/shared/scripts/deployImage b/client/shared/scripts/deployImage index 15392ec7..16a403cc 100755 --- a/client/shared/scripts/deployImage +++ b/client/shared/scripts/deployImage @@ -8,13 +8,20 @@ if [ $# -lt 4 ]; then fi #controlar param1 REPO - +echo "Realizando un updateCache REPO $2.img $5 $6" updateCache REPO $2.img $5 $6 -if [ $? != "0" ] +RETVAL=$? +if [ "$RETVAL" != "0" ] then - echo "fin del updateCache REPO $2.img $5 $6 con errores" - exit 1 + echo "fin del updateCache REPO $2.img $5 $6 con error $RETVAL" + # RC=15 No hay cache + # RC=16 no hay espacio sufiente + exit $RETVAL + else - echo "comenzamos con restoreImage CACHE $2 $3 $4" - restoreImage CACHE $2 $3 $4 + echo "iniciando un ogRestore CACHE desde deployImage" + ogRestoreImage CACHE /$2 $3 $4 + RETVAL=$? + [ "$RETVAL" == "0" ] && configureOs $3 $4 + exit $RETVAL fi
\ No newline at end of file diff --git a/client/shared/scripts/generateMenuDefault b/client/shared/scripts/generateMenuDefault new file mode 100755 index 00000000..0437cd3d --- /dev/null +++ b/client/shared/scripts/generateMenuDefault @@ -0,0 +1,30 @@ +#ª/bin/bash + +source /tmp/net-eth0.conf +FILEINFOHTML=/opt/opengnsys/log/`ogGetIpAddress`.info.html + +SPEED=$(ethtool $DEVICE | grep Speed | awk -F": " '{print $2}') +DUPLEX=$(ethtool $DEVICE | grep Duplex | awk -F": " '{print $2}') + +# +# echo ''; +# + +cat > $FILEINFOHTML << EOF +<div align="center" style="font-family: Arial, Helvetica, sans-serif;">' +<p style="color:#999999; font-size: 16px; margin: 2em;"> + +<table border=1> +<tr> +<TD rowspan=2><P align=left><IMG border=0 src="../images/iconos/logoopengnsys.png"><P> </td> +<td> Hostname: </td> <td> IP </td> <td> MAC </td> <td> Speed </td> <td> duplex </td> </tr> +<tr> <td> $HOSTNAME </td> <td> $(ogGetIpAddress) </td> <td> $(ogGetMacAddress) </td> <td> $SPEED </td> <td> $DUPLEX </td> </tr> +</table> + + +</p> +<p style="font-size: 14px; margin: 2em;"> +</p> +</div> + +EOF
\ No newline at end of file diff --git a/client/shared/scripts/updateBootCache b/client/shared/scripts/updateBootCache new file mode 100755 index 00000000..af2267a2 --- /dev/null +++ b/client/shared/scripts/updateBootCache @@ -0,0 +1,7 @@ +#!/bin/bash +OGBTFTP="/opt/og2fs/tftpboot/ogclient/" +ogMountCache || exit 1 +echo $OGCAC +[ -d $OGCAC/boot ] || mkdir -p $OGCAC/boot +[ -f ${OGCAC}/boot/ogvmlinuz ] || cp ${OGBTFTP}ogvmlinuz ${OGCAC}/boot/ogvmlinuz +[ -f ${OGCAC}/boot/oginitrd.img ] || cp ${OGBTFTP}oginitrd.img ${OGCAC}/boot/oginitrd.img
\ No newline at end of file diff --git a/client/shared/scripts/updateCache b/client/shared/scripts/updateCache index f6f61e34..bebb1153 100755 --- a/client/shared/scripts/updateCache +++ b/client/shared/scripts/updateCache @@ -14,7 +14,7 @@ PROG="$(basename $0)" -if [ $# -lt 4 ]; then +if [ $# -lt 3 ]; then ogRaiseError $OG_ERR_FORMAT "$MSG_FORMAT: $PROG str_REPO _str_Relative_Path_OGIMG_with_/ PROTOCOLO OPCIONES_PROTOCOLO OPCIONES_UPDATECACHE" exit $? fi @@ -26,13 +26,17 @@ REPOIP=$(ogGetRepoIp) echo $REPOSITORIO $REPOIP $PROTOCOLO $OPTPROTOCOLO # Si el repositorio local CACHE no existe salimos. if ! $(ogFindCache >/dev/null); then - ogRaiseError $OG_ERR_NOTFOUND "CACHE" + ogRaiseError $OG_ERR_NOTCACHE "CACHE" exit $? fi #Comprobamos si Actualizacion - existe una imagen con igual nombre pero distinto sum- #TODO: ogUpdateCacheIsNecesary debe borrar la imagen que tenga igual nombre pero distinto sum- -ogUpdateCacheIsNecesary $1 $2 || exit 0 +ogUpdateCacheIsNecesary $1 $2; RETVAL=$? +# si RETVAL=0 => actualizamos si RETVAL=1 no actaulizasmo-exit 0 || si RETVAL>2 exit 1 +[ "$RETVAL" == "1" ] && exit 0 +[ "$RETVAL" -gt "1" ] && exit 1 + CACHESIZEFREE=$(ogGetFreeSize `ogFindCache`) FILESIZE=$(ls -sk $(ogGetPath $1 $2) | cut -f1 -d" ") @@ -40,10 +44,14 @@ FILESIZE=$(ls -sk $(ogGetPath $1 $2) | cut -f1 -d" ") if [ "$FILESIZE" -ge "$CACHESIZEFREE" ] then echo "el tamanio del fichero $2 = $FILESIZE es mayor que el espacio dispinible en la cache = $CACHESIZEFREE" - exit 1 + ogRaiseError $OG_ERR_CACHESIZE "CACHE" + exit $? fi -ogUpdateCacheIsNecesary $1 $2 || exit 0 +ogUpdateCacheIsNecesary $1 $2; RETVAL=$? +# si RETVAL=0 => actualizamos si RETVAL=1 no actaulizasmo-exit 0 || si RETVAL>2 exit 1 +[ "$RETVAL" == "1" ] && exit 0 +[ "$RETVAL" -gt "1" ] && exit 1 ogMountCache @@ -96,18 +104,13 @@ case "$PROTOCOLO" in ;; unicast | UNICAST ) echo "unicast" + ogCopyFile $1 $2 $OGCAC$OGIMG ;; esac -if ogUpdateCacheIsNecesary $1 $2 -then - echo "algo ha fallado" - exit 1 -else - echo "updateCache ok" - exit 0 -fi - - -#
\ No newline at end of file +ogUpdateCacheIsNecesary $1 $2; RETVAL=$? +# si RETVAL=0 => actualizamos si RETVAL=1 no actaulizasmo-exit 0 || si RETVAL>2 exit 1 +[ "$RETVAL" == "0" ] && exit 1 +[ "$RETVAL" == "1" ] && exit 0 +[ "$RETVAL" -gt "1" ] && exit 1
\ No newline at end of file |