diff options
author | ramon <ramongomez@us.es> | 2012-07-18 12:00:06 +0000 |
---|---|---|
committer | ramon <ramongomez@us.es> | 2012-07-18 12:00:06 +0000 |
commit | d0df50b67a1392f81e6faecd27523c639e1ba845 (patch) | |
tree | ab5f37fe113fa7447b92f98e073c8618b64d2215 /client | |
parent | 1c93532b21492afae588da93f6ff59dd11a6e6d7 (diff) |
Versión 1.0.4, #531: Integrar versión 1.0.4 en rama principal.
git-svn-id: https://opengnsys.es/svn/trunk@3259 a21b9725-9963-47de-94b9-378ad31fedc9
Diffstat (limited to 'client')
40 files changed, 1410 insertions, 644 deletions
diff --git a/client/boot-tools/boottoolsfunctions.lib b/client/boot-tools/boottoolsfunctions.lib index c8fef78c..b1f00d05 100644..100755 --- a/client/boot-tools/boottoolsfunctions.lib +++ b/client/boot-tools/boottoolsfunctions.lib @@ -332,28 +332,24 @@ ALLOWOPTIONS 1 MENU TITLE OpenGnsys ${NAMEISOCLIENT} -LABEL gpxe -MENU LABEL gpxe -KERNEL /clonezilla/live/vmlinuz1 -APPEND initrd=/clonezilla/live/initrd1.img boot=live union=aufs noswap vga=788 ip=frommedia LABEL 0 -MENU LABEL ogClient vga irqpool acpi ogdebug ip:none +MENU LABEL ogLive 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 +MENU LABEL ogLive 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 +MENU LABEL ogLive 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 +MENU LABEL ogLive 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 @@ -377,6 +373,11 @@ KERNEL gpxe.pxe label 8 MENU LABEL Network boot via gPXE iso KERNEL gpxe.iso + +label 9 +MENU LABEL gpxe +KERNEL /clonezilla/live/vmlinuz1 +APPEND initrd=/clonezilla/live/initrd1.img boot=live union=aufs noswap vga=788 ip=frommedia FIN diff --git a/client/boot-tools/includes/etc/initramfs-tools/hooks/oghooks b/client/boot-tools/includes/etc/initramfs-tools/hooks/oghooks index afe21be6..e3c25677 100755 --- a/client/boot-tools/includes/etc/initramfs-tools/hooks/oghooks +++ b/client/boot-tools/includes/etc/initramfs-tools/hooks/oghooks @@ -51,7 +51,6 @@ copy_exec /bin/lsmod #mkdir -p ${DESTDIR}/opt/opengnsys/lib/engine #cp -prv /opt/opengnsys/client/lib/engine ${DESTDIR}/opt/opengnsys/lib/engine -#rm -fr ${DESTDIR}/lib/modules/2.6.32-21-generic-pae/kernel/drivers/net/atl* manual_add_modules cifs manual_add_modules smbfs manual_add_modules atl1e diff --git a/client/boot-tools/includes/etc/initramfs-tools/scripts/ogfunctions b/client/boot-tools/includes/etc/initramfs-tools/scripts/ogfunctions index 35b24f9b..89cd2c65 100644 --- a/client/boot-tools/includes/etc/initramfs-tools/scripts/ogfunctions +++ b/client/boot-tools/includes/etc/initramfs-tools/scripts/ogfunctions @@ -156,8 +156,9 @@ ogPostConfigureFS() echo "order hosts,bind" > /etc/host.conf echo "multi on" >> /etc/host.conf - #configuramos el dns - echo "nameserver $ogdns" > /etc/resolv.conf + #configuramos el dns + #echo "nameserver $ogdns" > /etc/resolv.conf + echo "nameserver $ogdns" > /etc/resolvconf/resolv.conf.d/tail # configuramos el /etc/networks diff --git a/client/boot-tools/includes/etc/initramfs-tools/scripts/oginit b/client/boot-tools/includes/etc/initramfs-tools/scripts/oginit index 95efe282..61c68b96 100755 --- a/client/boot-tools/includes/etc/initramfs-tools/scripts/oginit +++ b/client/boot-tools/includes/etc/initramfs-tools/scripts/oginit @@ -70,7 +70,13 @@ mountroot () [ "$ogdebug" == "true" ] && ogYesNo --timeout 5 --default no "Stop before configure networking: y/N " [ $? == 0 ] && sh || echo " " - ogConfigureNetworking + if [ -n "$oglive" ] + then + while !(ping -c 1 $oglive &> /dev/null) + do + ogConfigureNetworking + done + fi log_success_msg "config networking" ogConfigureLoopback log_success_msg "config loopback" @@ -85,7 +91,10 @@ mountroot () ogYesNo --timeout 5 --default no "Stop before check updating initrd: y/N " [ $? == 0 ] && sh || echo " " fi - [ "$ogupdateinitrd" == "true" ] && ogUpdateInitrd + # Actualizar Initrd si se solicita o si no se corresponde con su kernel. + if [ "$ogupdateinitrd" == "true" -o ! -d /lib/modules/$(uname -r) ]; then + ogUpdateInitrd + fi [ "$ogdebug" == "true" ] && ogYesNo --timeout 5 --default no "Stop before connect and merging the rootfs -ogLive- with $OGSERVERLIVE: y/N " [ $? == 0 ] && sh || echo " " diff --git a/client/boot-tools/includes/usr/bin/boot-tools/boottoolsBootGraphics.sh b/client/boot-tools/includes/usr/bin/boot-tools/boottoolsBootGraphics.sh index edd0dc00..edd0dc00 100644..100755 --- a/client/boot-tools/includes/usr/bin/boot-tools/boottoolsBootGraphics.sh +++ b/client/boot-tools/includes/usr/bin/boot-tools/boottoolsBootGraphics.sh diff --git a/client/boot-tools/includes/usr/bin/boot-tools/boottoolsFsOpengnsys.sh b/client/boot-tools/includes/usr/bin/boot-tools/boottoolsFsOpengnsys.sh index 21b7a54d..13f4703e 100644..100755 --- a/client/boot-tools/includes/usr/bin/boot-tools/boottoolsFsOpengnsys.sh +++ b/client/boot-tools/includes/usr/bin/boot-tools/boottoolsFsOpengnsys.sh @@ -6,13 +6,13 @@ find /tmp/opengnsys_installer/ -name .svn -type d -exec rm -fr {} \; 2>/dev/null; apt-get -y --force-yes install subversion -export SVNURL="http://opengnsys.es/svn/branches/version1.0/client/" -VERSIONSVN=$(LANG=C svn info $SVNURL | awk '/Revision:/ {print "r"$2}') - +#export SVNURL="http://opengnsys.es/svn/branches/version1.0/client/" +#VERSIONSVN=$(LANG=C svn info $SVNURL | awk '/Revision:/ {print "r"$2}') +VERSIONSVN=$(cat /tmp/versionsvn.txt) VERSIONBOOTTOOLS=ogLive -NAMEISOCLIENT="/tmp/opengnsys_info_rootfs" -NAMEHOSTCLIENT="/tmp/opengnsys_chroot" +NAMEISOCLIENTFILE="/tmp/opengnsys_info_rootfs" +NAMEHOSTCLIENTFILE="/tmp/opengnsys_chroot" SVNCLIENTDIR=/tmp/opengnsys_installer/opengnsys/client/boot-tools SVNCLIENTSTRUCTURE=/tmp/opengnsys_installer/opengnsys/client/shared @@ -115,10 +115,9 @@ cp -prv ${SVNOG2}/job_executer $OGCLIENTMOUNT/opt/opengnsys/bin/ cp ${SVNCLIENTSTRUCTURE}/bin/ogAdmClient $OGCLIENTMOUNT/bin -echo ${VERSIONBOOTTOOLS}-${OSCODENAME}-${OSRELEASE}-${VERSIONSVN} > $NAMEISOCLIENT -echo ${VERSIONBOOTTOOLS}-${OSCODENAME}-${VERSIONSVN} > $NAMEHOSTCLIENT -echo ${VERSIONBOOTTOOLS}-${OSCODENAME}-${VERSIONSVN} > /etc/debian_chroot -echo ${VERSIONBOOTTOOLS}-${OSCODENAME}-${VERSIONSVN} > /etc/opengnsys_chroot +echo ${VERSIONBOOTTOOLS}-${OSCODENAME}-${OSRELEASE}-${VERSIONSVN} > $NAMEISOCLIENTFILE +echo ${VERSIONBOOTTOOLS}-${OSCODENAME}-${VERSIONSVN} > $NAMEHOSTCLIENTFILE + history -c diff --git a/client/boot-tools/includes/usr/bin/boot-tools/boottoolsSoftwareCompile.sh b/client/boot-tools/includes/usr/bin/boot-tools/boottoolsSoftwareCompile.sh index 8d0cede9..ca721c22 100755 --- a/client/boot-tools/includes/usr/bin/boot-tools/boottoolsSoftwareCompile.sh +++ b/client/boot-tools/includes/usr/bin/boot-tools/boottoolsSoftwareCompile.sh @@ -29,11 +29,32 @@ gdebi -n /var/cache/apt/archivesOG/xvesa.deb echo "partclone" gdebi -n /var/cache/apt/archivesOG/partclone_0.2.38_i386.deb -#echo "busybox" -#gdebi -n /var/cache/apt/archivesOG/busybox_1.17.1-10ubuntu1_i386.deb - -echo "busybox-static" +echo "busybox-static 1.17.1 en rootfs" +#echo "busybox-static 1.17.1 en ogLive rootfs permite reboot y poweroff +apt-get remove -y busybox-static gdebi -n /var/cache/apt/archivesOG/busybox-static_1.17.1-10ubuntu1_i386.deb +cp /bin/busybox /bin/busyboxOLD +/bin/busyboxOLD +echo "busybox-static 1.18.5 en initrd" +apt-get install -y busybox-static +cp /bin/busybox /bin/busyboxNEW +/bin/busyboxNEW +# en scripts reboot y poweroff hacer llamada a busyboxOLD reboot|poweroff + + + +#gpt +apt-get install -y uuid-dev libicu-dev libpopt-dev libpopt0 ncurses-base libncurses5-dev +wget -O download.tgz http://sourceforge.net/projects/gptfdisk/files/gptfdisk/0.8.2/gptfdisk-0.8.2.tar.gz/download +mkdir download +tar xzvf download.tgz -C download +cd download/gptfdisk-0.8.2 +make +cp sgdisk gdisk fixparts cgdisk /sbin +cd .. +rm -fr download* + + history -c
\ No newline at end of file diff --git a/client/boot-tools/includes/usr/bin/boot-tools/boottoolsSoftwareXwindows b/client/boot-tools/includes/usr/bin/boot-tools/boottoolsSoftwareXwindows index 41824f18..41824f18 100644..100755 --- a/client/boot-tools/includes/usr/bin/boot-tools/boottoolsSoftwareXwindows +++ b/client/boot-tools/includes/usr/bin/boot-tools/boottoolsSoftwareXwindows diff --git a/client/boot-tools/includes/usr/bin/boot-tools/listpackages/sw.basic b/client/boot-tools/includes/usr/bin/boot-tools/listpackages/sw.basic index e65da70e..358b76ed 100644 --- a/client/boot-tools/includes/usr/bin/boot-tools/listpackages/sw.basic +++ b/client/boot-tools/includes/usr/bin/boot-tools/listpackages/sw.basic @@ -4,11 +4,14 @@ install man-db install fbset install gdebi-core install bash-static -#install busybox-static #la version en oneiric no incluye el reboot y poweroff -> ver compilacion software +#La gestion del busybox-static (incompatibilidades reboot y poweroff) en boottoolSoftwareCompile.sh +#install busybox-static install console-data install locales install lshw install gawk install subversion install python-openssl -install python
\ No newline at end of file +install python +install dmidecode +install hwinfo
\ No newline at end of file diff --git a/client/boot-tools/includes/usr/bin/boot-tools/listpackages/sw.cloning b/client/boot-tools/includes/usr/bin/boot-tools/listpackages/sw.cloning index 9eda4b6b..2585f56f 100644 --- a/client/boot-tools/includes/usr/bin/boot-tools/listpackages/sw.cloning +++ b/client/boot-tools/includes/usr/bin/boot-tools/listpackages/sw.cloning @@ -13,4 +13,5 @@ install reglookup install libparse-win32registry-perl install grokevt install libhivex0 -install libhivex-bin
\ No newline at end of file +install libhivex-bin +install rsync
\ No newline at end of file diff --git a/client/engine/Boot.lib b/client/engine/Boot.lib index 2b8e1a3a..7a858fac 100755 --- a/client/engine/Boot.lib +++ b/client/engine/Boot.lib @@ -4,7 +4,7 @@ #@brief Librería o clase Boot #@class Boot #@brief Funciones para arranque y post-configuración de sistemas de archivos. -#@version 0.9 +#@version 1.0.4 #@warning License: GNU GPLv3+ #*/ @@ -26,11 +26,14 @@ #@version 0.9 - Adaptación para OpenGnSys. #@author Ramon Gomez, ETSII Universidad de Sevilla #@date 2009-09-11 +#@version 1.0.4 - Soporta modo de arranque Windows (parámetro de inicio "winboot"). +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2012-04-12 #*/ ## function ogBoot () { # Variables locales. -local PART TYPE MNTDIR PARAMS KERNEL INITRD APPEND FILE LOADER +local PART TYPE MNTDIR PARAMS KERNEL INITRD APPEND FILE LOADER f # Si se solicita, mostrar ayuda. if [ "$*" == "help" ]; then @@ -58,6 +61,7 @@ case "$TYPE" in [ -e "$MNTDIR/etc" ] && APPEND=$(echo $APPEND | awk -v P="$PART " '{sub (/root=[-+=_/a-zA-Z0-9]* /,"root="P);print}') # Configurar kernel Linux con los parámetros leídos de su GRUB. kexec -l "${MNTDIR}${KERNEL}" --append="$APPEND" --initrd="${MNTDIR}${INITRD}" + kexec -e & ;; NTFS|HNTFS|FAT32|HFAT32) # Compruebar si hay un cargador de Windows. @@ -66,10 +70,18 @@ case "$TYPE" in [ -n "$FILE" ] && LOADER="$f" done [ -z "$LOADER" ] && ogRaiseError $OG_ERR_NOTOS && return $? - # Activar la partición y copiar Grub4DOS. + # Activar la partición. ogSetPartitionActive $1 $2 - #FIXME: activar seguimiento inicio sesion Windows con grub4dos - if [ "$(ogGetOsType $1 $2)" == "Windows" ]; then + ogSetRegistryValue $MNTDIR SYSTEM '\ControlSet001\services\Cliente Opengnsys\Start' '2' + ogSetRegistryValue $MNTDIR SYSTEM '\ControlSet002\services\Cliente Opengnsys\Start' '2' + ogSetRegistryValue $MNTDIR SYSTEM '\ControlSet003\services\Cliente Opengnsys\Start' '2' + if [ "$winboot" == "kexec" ]; then + # Modo de arranque en caliente (con kexec). + cp $OGLIB/grub4dos/* $MNTDIR # */ (Comentario Doxygen) + kexec -l $MNTDIR/grub.exe --append=--config-file="root (hd$[$1-1],$[$2-1]); chainloader (hd$[$1-1],$[$2-1])/$LOADER; tpm --init" + kexec -e & + else + # Modo de arranque por reinicio (con reboot). 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 @@ -77,9 +89,6 @@ case "$TYPE" in ogHiveNTRunMachine "cmd /c del c:\ogboot.*" ogcleanboot ogUpdateHiveWindows reboot - else - cp $OGLIB/grub4dos/* $MNTDIR # */ (Comentario Doxygen) - 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" @@ -87,8 +96,7 @@ case "$TYPE" in ;; esac -# Arrancar. -kexec -e & +# Parar Browser para evitar cuelgues. pkill browser } diff --git a/client/engine/Cache.lib b/client/engine/Cache.lib index 50cd01de..118bc65b 100755 --- a/client/engine/Cache.lib +++ b/client/engine/Cache.lib @@ -4,7 +4,7 @@ #@brief Librería o clase Cache #@class Cache #@brief Funciones para gestión de la caché local de disco. -#@version 0.9.1 +#@version 1.0.4 #@warning License: GNU GPLv3+ #*/ @@ -24,40 +24,66 @@ #@version 0.9.2 - Corrección definición de límites. #@author Ramon Gomez, ETSII Universidad de Sevilla #@date 2010/06/01 +#@version 1.0.4 - Soporte para discos GPT. +#@author Universidad de Huelva +#@date 2012/03/13 #*/ ## function ogCreateCache () { # Variables locales. -local DISK PART SECTORS CYLS START END SIZE MINSIZE MAXSIZE ENDPART3 +local FINDCACHE NDSK PART DISK START END ENDPREVPART SIZE MINSIZE MAXSIZE PTTYPE ID # Si se solicita, mostrar ayuda. if [ "$*" == "help" ]; then ogHelp "$FUNCNAME" "$FUNCNAME int_partsize" "$FUNCNAME 10000000" return fi -# Error si no se recibe 1 parámetro. +# Error si no se recibe 1 parámetro que sea un número entero. [ $# == 1 ] || ogRaiseError $OG_ERR_FORMAT || return $? +[[ $1 =~ ([0-9]*) ]] || ogRaiseError $OG_ERR_FORMAT "$1" || return $? -DISK=$(ogDiskToDev 1) || return $? -PART="4" -SECTORS=$(awk -v D=${DISK#/dev/} '{if ($4==D) {print $3*2}}' /proc/partitions) -CYLS=$(sfdisk -g $DISK | cut -f2 -d" ") -END=$[SECTORS/CYLS*CYLS-1] # Sector final del disco -SIZE=$(echo $1|awk '{print $0*2}') # En sectores de 512 B. +FINDCACHE="1 4" # Partición de caché (ndisco npart). +NDSK=${FINDCACHE% *} +PART=${FINDCACHE#* } +DISK=$(ogDiskToDev $NDSK) || return $? +END=$[$(ogGetLastSector $NDSK 2>/dev/null)] # Sector final del disco. +SIZE=$[$1*2] # Tamaño en sectores de 512 B. START=$[END-SIZE+1] -ENDPART3=$(sfdisk -uS -l $DISK | awk -v P="${DISK}3" '{if ($1==P) print $3}') -# Error si tamaño no está entre límites permitidos o si se solapa con la partición 3. -MINSIZE=100000 # Error de formateo si tamaño < 50 MB. +ENDPREVPART=$[$(ogGetLastSector $NDSK $[PART-1] 2>/dev/null)] +# Error si tamaño no está entre límites permitidos o si se solapa con la partición anterior. +MINSIZE=25000 # Error de formateo si tamaño < 50 MB. MAXSIZE=$[END/2] # No permitir tamaño > mitad del disco. -if [ $SIZE -lt $MINSIZE -o $SIZE -gt $MAXSIZE -o $START -le $ENDPART3 ]; then +if [ $SIZE -lt $MINSIZE -o $SIZE -gt $MAXSIZE -o $START -le $ENDPREVPART ]; then ogRaiseError $OG_ERR_FORMAT "$1" || return $? fi # Desmontar todos los sistemas de archivos del disco. ogUnmountAll 1 2>/dev/null -# Si la tabla de particiones no es valida, volver a generarla. -[ $(parted -s $DISK print >/dev/null) ] || fdisk $DISK <<< "w" # Definir particiones y notificar al kernel. -sfdisk -f $DISK -uS -N$PART <<<"$START,$SIZE,ca" 2>/dev/null && partprobe +# En el caso de ser disco GPT, de momento se borra la particion y se vuelve a crear, +# por lo que se pierden los datos. +PTTYPE=$(ogGetPartitionTableType $NDSK) +if [ -z "$PTTYPE" ]; then + PTTYPE="MSDOS" # Por defecto para discos vacíos. + ogCreatePartitionTable $NDSK $PTTYPE +fi +case "$(ogGetPartitionTableType $NDSK)" in + GPT) + # Si la tabla de particiones no es valida, volver a generarla. + [ ! $(sgdisk -p $DISK 2>&1 >/dev/null) ] || echo -e "2\nw\nY\n" | gdisk $DISK + # Si existe la cache se borra previamente + [ -n $(ogFindCache) && ogDeleteCache + # Capturamos el codigo de particion GPT para cache + ID=$(ogTypeToId CACHE GPT) + sgdisk $DISK -n$PART:$START:$END -c$PART:CACHE -t$PART:$ID 2>/dev/null && partprobe + ;; + MSDOS) + # Si la tabla de particiones no es valida, volver a generarla. + [ $(parted -s $DISK print >/dev/null) ] || fdisk $DISK <<< "w" + # Definir particiones y notificar al kernel. + ID=$(ogTypeToId CACHE MSDOS) + sfdisk -f $DISK -uS -N$PART <<<"$START,$SIZE,$ID" 2>/dev/null && partprobe + ;; +esac } @@ -70,6 +96,9 @@ sfdisk -f $DISK -uS -N$PART <<<"$START,$SIZE,ca" 2>/dev/null && partprobe #@version 0.91 - Definición de caché local. #@author Ramon Gomez, ETSII Universidad de Sevilla #@date 2010/03/11 +#@version 1.0.4 - Soporte para discos GPT. +#@author Universidad de Huelva +#@date 2012/03/13 #*/ ## function ogDeleteCache () { @@ -87,10 +116,19 @@ DISK=$(ogDiskToDev $NDISK) # Desmontar todos los sistemas de archivos del disco. ogUnmountAll $NDISK 2>/dev/null -# Si la tabla de particiones no es valida, volver a generarla. -[ $(parted -s $DISK print >/dev/null) ] || fdisk $DISK <<< "w" -# Eliminar (poner a 0) la partición de caché. -sfdisk -f $DISK -N$NPART <<<"0,0,0" 2>/dev/null && partprobe +case "$(ogGetPartitionTableType $1)" in + GPT) + # Si la tabla de particiones no es valida, volver a generarla. + [ ! $(sgdisk -p $DISK 2>&1 >/dev/null) ] || echo -e "2\nw\nY\n" | gdisk $DISK + sgdisk $DISK -d$NPART 2>/dev/null && partprobe + ;; + MSDOS) + # Si la tabla de particiones no es valida, volver a generarla. + [ $(parted -s $DISK print >/dev/null) ] || fdisk $DISK <<< "w" + # Eliminar (poner a 0) la partición de caché. + sfdisk -f $DISK -N$NPART <<<"0,0,0" 2>/dev/null && partprobe + ;; +esac # Borrar etiqueta de la caché. rm -f /dev/disk/by-label/CACHE } @@ -123,7 +161,7 @@ fi # Obtener el sistema de archivos etiquetado con "CACHE". PART=$(realpath /dev/disk/by-label/CACHE 2>/dev/null) # Si no, obtener la 1ª partición marcada como de tipo caché. -PART=${PART:-$(sfdisk -l | awk '$6~/ca|a7/ {print $1}')} +PART=${PART:-$(sfdisk -l 2>/dev/null | awk '$6~/ca|a7/ {print $1}')} PART=${PART%% *} ogDevToDisk $PART 2>/dev/null @@ -160,10 +198,7 @@ DEV=$(ogDiskToDev $DEV) || return $? # Formatear sistema de ficheros. ogUnmountCache 2>/dev/null - # Orden para formateo Ext4 mkfs.ext4 -q -F $DEV -L "CACHE" -O extent,large_file 2>/dev/null || ogRaiseError $OG_ERR_PARTITION "CACHE" || return $? - # Orden para formateo Reiser 3 - #mkfs.reiserfs -f $DEV -l "CACHE" 2>/dev/null || ogRaiseError $OG_ERR_PARTITION "CACHE" || return $? # Crear estructura básica. MNTDIR=$(ogMountCache) mkdir -p $MNTDIR/$OGIMG @@ -264,7 +299,6 @@ if [ "$*" == "help" ]; then fi ogMountFs $(ogFindCache) 2>/dev/null || ogRaiseError $OG_ERR_PARTITION "$MSG_NOCACHE" || return $? - } diff --git a/client/engine/Disk.lib b/client/engine/Disk.lib index fbedc66d..f9031d55 100755 --- a/client/engine/Disk.lib +++ b/client/engine/Disk.lib @@ -4,7 +4,7 @@ #@brief Librería o clase Disk #@class Disk #@brief Funciones para gestión de discos y particiones. -#@version 0.9 +#@version 1.0.4 #@warning License: GNU GPLv3+ #*/ @@ -16,8 +16,9 @@ #@param str_parttype mnemónico del tipo de partición #@param int_partsize tamaño de la partición (en KB) #@return (nada, por determinar) -#@exception OG_ERR_FORMAT formato incorrecto. -#@exception OG_ERR_NOTFOUND disco o particion no detectado (no es un dispositivo). +#@exception OG_ERR_FORMAT formato incorrecto. +#@exception OG_ERR_NOTFOUND disco o partición no detectado (no es un dispositivo). +#@exception OG_ERR_PARTITION error en partición o en tabla de particiones. #@attention El nº de partición se indica por el orden de los párametros \c parttype:partsize #@attention Pueden definirse particiones vacías de tipo \c EMPTY #@attention No puede definirse partición de cache y no se modifica si existe. @@ -29,11 +30,14 @@ #@version 0.9.1 - Corrección del redondeo del tamaño del disco. #@author Ramon Gomez, ETSII Universidad de Sevilla #@date 2010/03/09 +#@version 1.0.4 - Llamada a función específica para tablas GPT. +#@author Universidad de Huelva +#@date 2012/03/30 #*/ ## function ogCreatePartitions () { # Variables locales. -local ND DISK PART SECTORS CYLS START SIZE TYPE CACHEPART CACHESIZE EXTSTART EXTSIZE tmpsfdisk +local ND DISK PTTYPE PART SECTORS START SIZE TYPE CACHEPART CACHESIZE EXTSTART EXTSIZE tmpsfdisk # Si se solicita, mostrar ayuda. if [ "$*" == "help" ]; then ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk str_parttype:int_partsize ..." \ @@ -46,14 +50,20 @@ fi # Nº total de sectores, para evitar desbordamiento (evitar redondeo). ND="$1" DISK=$(ogDiskToDev "$ND") || return $? -SECTORS=$(awk -v D=${DISK#/dev/} '{if ($4==D) {print $3*2}}' /proc/partitions) -CYLS=$(sfdisk -g $DISK | cut -f2 -d" ") -SECTORS=$[SECTORS/CYLS*CYLS-1] +PTTYPE=$(ogGetPartitionTableType $1) +PTTYPE=${PTTYPE:-"MSDOS"} # Por defecto para discos vacíos. +case "$PTTYPE" in + GPT) ogCreateGptPartitions "$@" + return $? ;; + MSDOS) ;; + *) ogRaiseError $OG_ERR_PARTITION "$PTTYPE" + return $? ;; +esac +SECTORS=$(ogGetLastSector $1) # Se recalcula el nº de sectores del disco 1, si existe partición de caché. CACHEPART=$(ogFindCache 2>/dev/null) [ "$ND" = "${CACHEPART% *}" ] && CACHESIZE=$(ogGetCacheSize 2>/dev/null | awk '{print $0*2}') [ -n "$CACHESIZE" ] && SECTORS=$[SECTORS-CACHESIZE] -ENDPART3=$(sfdisk -uS -l $DISK | awk -v P="${DISK}3" '{if ($1==P) print $3}') # Sector de inicio (la partición 1 empieza en el sector 63). START=63 PART=1 @@ -77,7 +87,7 @@ while [ $# -gt 0 ]; do TYPE="${1%%:*}" SIZE="${1#*:}" # Obtener identificador de tipo de partición válido. - ID=$(ogFsToId "$TYPE") + ID=$(ogTypeToId "$TYPE" MSDOS) [ "$TYPE" != "CACHE" -a -n "$ID" ] || ogRaiseError $OG_ERR_PARTITION "$TYPE" || return $? # Comprobar tamaño numérico y convertir en sectores de 512 B. [[ "$SIZE" == *([0-9]) ]] || ogRaiseError $OG_ERR_FORMAT "$SIZE" || return $? @@ -121,7 +131,7 @@ ogUnmountAll $ND 2>/dev/null [ -n "$CACHESIZE" ] && ogUnmountCache 2>/dev/null # Si la tabla de particiones no es valida, volver a generarla. -[ $(parted -s $DISK print >/dev/null) ] || fdisk $DISK <<< "w" +ogCreatePartitionTable $ND # Definir particiones y notificar al kernel. sfdisk -f $DISK < $tmpsfdisk 2>/dev/null && partprobe $DISK rm -f $tmpsfdisk @@ -130,6 +140,210 @@ rm -f $tmpsfdisk #/** +# ogCreateGptPartitions int_ndisk str_parttype:int_partsize ... +#@brief Define el conjunto de particiones de un disco GPT +#@param int_ndisk nº de orden del disco +#@param str_parttype mnemónico del tipo de partición +#@param int_partsize tamaño de la partición (en KB) +#@return (nada, por determinar) +#@exception OG_ERR_FORMAT formato incorrecto. +#@exception OG_ERR_NOTFOUND disco o partición no detectado (no es un dispositivo). +#@exception OG_ERR_PARTITION error en partición o en tabla de particiones. +#@attention El nº de partición se indica por el orden de los párametros \c parttype:partsize +#@attention Pueden definirse particiones vacías de tipo \c EMPTY +#@attention No puede definirse partición de caché y no se modifica si existe. +#@note Requisitos: sfdisk, parted, partprobe, awk +#@todo Definir atributos (arranque, oculta) y tamaños en MB, GB, etc. +#@version 1.0.4 - Primera versión para OpenGnSys +#@author Universidad de Huelva +#@date 2012/03/30 +#*/ ## +function ogCreateGptPartitions () +{ +# Variables locales. +local ND DISK PART SECTORS ALIGN START SIZE TYPE CACHEPART CACHESIZE DELOPTIONS OPTIONS +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk str_parttype:int_partsize ..." \ + "$FUNCNAME 1 NTFS:10000000 EXT3:5000000 LINUX-SWAP:1000000" + return +fi +# Error si no se reciben menos de 2 parámetros. +[ $# -ge 2 ] || ogRaiseError $OG_ERR_FORMAT || return $? + +# Nº total de sectores, para evitar desbordamiento (evitar redondeo). +ND="$1" +DISK=$(ogDiskToDev "$ND") || return $? +# Se calcula el ultimo sector del disco (total de sectores usables) +SECTORS=$(ogGetLastSector $1) +[ "$ND" = "${CACHEPART% *}" ] && CACHESIZE=$(ogGetCacheSize 2>/dev/null | awk '{print $0*2}') +[ -n "$CACHESIZE" ] && SECTORS=$[SECTORS-CACHESIZE] +# Si el disco es GPT empieza en el sector 2048 por defecto, pero podria cambiarse +ALIGN=$(sgdisk -D $DISK 2>/dev/null) +START=$ALIGN +PART=1 + +# Leer parámetros con definición de particionado. +shift + +while [ $# -gt 0 ]; do + # Si PART es la cache, nos la saltamos y seguimos con el siguiente numero para conservar los datos de la partición de caché. + if [ "$ND $PART" == "$CACHEPART" -a -n "$CACHESIZE" ]; then + PART=$[PART+1] + fi + # Leer formato de cada parámetro - Tipo:Tamaño + TYPE="${1%%:*}" + SIZE="${1#*:}" + # Error si la partición es extendida (no válida en discos GPT). + if [ "$TYPE" == "EXTENDED" ]; then + ogRaiseError $OG_ERR_PARTITION "EXTENDED" + return $? + fi + # Comprobar si existe la particion actual, capturamos su tamaño para ver si cambio o no + PARTSIZE=$(ogGetPartitionSize $ND $PART 2>/dev/null) + # En sgdisk no se pueden redimensionar las particiones, es necesario borrarlas y volver a crealas + [ $PARTSIZE ] && DELOPTIONS="$DELOPTIONS -d$PART" + # Creamos la particion + # Obtener identificador de tipo de partición válido. + ID=$(ogTypeToId "$TYPE" GPT) + [ "$TYPE" != "CACHE" -a -n "$ID" ] || ogRaiseError $OG_ERR_PARTITION "$TYPE" || return $? + # Comprobar tamaño numérico y convertir en sectores de 512 B. + [[ "$SIZE" == *([0-9]) ]] || ogRaiseError $OG_ERR_FORMAT "$SIZE" || return $? + SIZE=$[SIZE*2] + # SIZE debe ser múltiplo de ALIGN, si no gdisk lo mueve automáticamente. + DIV=$[$SIZE/$ALIGN] + SIZE=$[$DIV*$ALIGN] + # En el caso de que la partición sea EMPTY no se crea nada + if [ "$TYPE" != "EMPTY" ]; then + OPTIONS="$OPTIONS -n$PART:$START:+$SIZE -t$PART:$ID " + fi + START=$[START+SIZE] + # Error si se supera el nº total de sectores. + [ $START -le $SECTORS ] || ogRaiseError $OG_ERR_FORMAT "$[START/2] > $[SECTORS/2]" || return $? + PART=$[PART+1] + shift +done + +# Desmontar los sistemas de archivos del disco antes de realizar las operaciones. +ogUnmountAll $ND 2>/dev/null +[ -n "$CACHESIZE" ] && ogUnmountCache 2>/dev/null + +# Si la tabla de particiones no es valida, volver a generarla. +ogCreatePartitionTable $ND +# Definir particiones y notificar al kernel. +# Borramos primero las particiones y luego creamos las nuevas +sgdisk $DELOPTIONS $OPTIONS $DISK 2>/dev/null && partprobe $DISK +[ -n "$CACHESIZE" ] && ogMountCache 2>/dev/null +} + + +#/** +# ogCreatePartitionTable int_ndisk [str_tabletype] +#@brief Genera una tabla de particiones en caso de que no sea valida, si es valida no hace nada. +#@param int_ndisk nº de orden del disco +#@param str_tabletype tipo de tabla de particiones (opcional) +#@return (por determinar) +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo. +#@note tabletype: { MSDOS, GPT } +#@note Requisitos: sfdisk, sgdisk +#@version 1.0.4 - Primera versión compatible con OpenGNSys. +#@author Universidad de Huelva +#@date 2012/03/06 +#*/ ## +function ogCreatePartitionTable () +{ +# Variables locales. +local DISK PTTYPE CREATE CREATEPTT + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME int_ndisk [str_partype]" \ + "$FUNCNAME 1 GPT" "$FUNCNAME 1" + return +fi +# Error si no se reciben 1 o 2 parámetros. +case $# in + 1) CREATEPTT="" ;; + 2) CREATEPTT="$2" ;; + *) ogRaiseError $OG_ERR_FORMAT + return $? ;; +esac + +# Capturamos el tipo de tabla de particiones actual +DISK=$(ogDiskToDev $1) || return $? +PTTYPE=$(ogGetPartitionTableType $1) +PTTYPE=${PTTYPE:-"MSDOS"} # Por defecto para discos vacíos. +CREATEPTT=${CREATEPTT:-"$PTTYPE"} + +# Si la tabla actual y la que se indica son iguales, se comprueba si hay que regenerarla. +if [ "$CREATEPTT" == "$PTTYPE" ]; then + case "$PTTYPE" in + GPT) [ ! $(sgdisk -p $DISK 2>&1 >/dev/null) ] || CREATE="GPT" ;; + MSDOS) [ $(parted -s $DISK print >/dev/null) ] || CREATE="MSDOS" ;; + esac +else + CREATE="$CREATEPTT" +fi +# Dependiendo del valor de CREATE, creamos la tabla de particiones en cada caso. +case "$CREATE" in + GPT) + # Si es necesario crear una tabla GPT pero la actual es MSDOS + if [ "$PTTYPE" == "MSDOS" ]; then + sgdisk -g $DISK + else + echo -e "2\nw\nY\n" | gdisk $DISK + fi + partprobe $DISK 2>/dev/null + ;; + MSDOS) + # Si es necesario crear una tabla MSDOS pero la actual es GPT + if [ "$PTTYPE" == "GPT" ]; then + sgdisk -Z $DISK + fi + fdisk $DISK <<< "w" + partprobe $DISK 2>/dev/null + ;; +esac +} + + +#/** +# ogDeletePartitionTable ndisk +#@brief Borra la tabla de particiones del disco. +#@param int_ndisk nº de orden del disco +#@return la informacion propia del fdisk +#@version 0.1 - Integracion para OpenGnSys +#@author Antonio J. Doblas Viso. Universidad de Malaga +#@date 2008/10/27 +#@version 1.0.4 - Adaptado para su uso con discos GPT +#@author Universidad de Huelva +#@date 2012/03/13 +#*/ ## +function ogDeletePartitionTable () +{ +# Variables locales. +local DISK + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME int_ndisk" "$FUNCNAME 1" + return +fi +# Error si no se reciben 1 parámetros. +[ $# == 1 ] || ogRaiseError $OG_ERR_FORMAT || return $? + +# Obteniendo Identificador linux del disco. +DISK=$(ogDiskToDev $1) || return $? +# Crear una tabla de particiones vacía. +case "$(ogGetPartitionTableType $1)" in + GPT) sgdisk -o $DISK ;; + MSDOS) echo -ne "o\nw" | fdisk $DISK ;; +esac +} + + +#/** # ogDevToDisk path_device #@brief Devuelve el nº de orden de dicso (y partición) correspondiente al nombre de fichero de dispositivo. #@param path_device Camino del fichero de dispositivo. @@ -251,50 +465,111 @@ esac #/** # ogFsToId str_fstype -#@brief Devuelve el identificador de partición correspondiente a un tipo de sistema de archivos. -#@param str_fstype mnemónico de tipo de sistema de archivos -#@return int_idpart nº identificador de tipo de partición. +#@see ogTypeToId +#*/ ## +function ogFsToId () +{ +ogTypeToId "$@" +} + + +#/** +# ogTypeToId str_parttype str_tabletype +#@brief Devuelve el identificador correspondiente a un tipo de partición. +#@param str_parttype mnemónico de tipo de partición. +#@param str_tabletype mnemónico de tipo de tabla de particiones (MSDOS por defecto). +#@return int_idpart identificador de tipo de partición. #@exception OG_ERR_FORMAT Formato incorrecto. +#@note tabletype = { MSDOS, GPT } #@version 0.1 - Integracion para Opengnsys - EAC: TypeFS () en ATA.lib #@author Antonio J. Doblas Viso, Universidad de Malaga #@date 2008/10/27 #@version 0.9 - Primera version para OpenGNSys #@author Ramon Gomez, ETSII Universidad Sevilla #@date 2009-12-14 +#@version 1.0.4 - Soportar discos GPT (sustituye a ogFsToId). +#@author Universidad de Huelva +#@date 2012/03/30 #*/ ## -function ogFsToId () +function ogTypeToId () { # Variables locales -local ID +local PTTYPE ID # Si se solicita, mostrar ayuda. if [ "$*" == "help" ]; then - ogHelp "$FUNCNAME" "$FUNCNAME str_fstype" "$FUNCNAME EXT3 => 83" + ogHelp "$FUNCNAME" "$FUNCNAME str_parttype [str_tabletype]" \ + "$FUNCNAME LINUX => 83" \ + "$FUNCNAME LINUX MSDOS => 83" return fi -# Error si no se recibe 1 parámetro. -[ $# == 1 ] || ogRaiseError $OG_ERR_FORMAT || return $? +# Error si no se reciben 2 parámetro. +[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $? -# Asociar id. de partición para su mnemónico de sistema de archivos. -case "$1" in - EMPTY) ID=0 ;; - FAT12) ID=1 ;; - EXTENDED) ID=5 ;; - FAT16) ID=6 ;; - NTFS|EXFAT) ID=7 ;; - FAT32) ID=b ;; - HFAT12) ID=11 ;; - HFAT16) ID=16 ;; - HNTFS) ID=17 ;; - HFAT32) ID=1b ;; - LINUX-SWAP) ID=82 ;; - LINUX|EXT[234]|REISERFS|REISER4|XFS|JFS) - ID=83 ;; - LINUX-LVM) ID=8e ;; - SOLARIS) ID=bf ;; - CACHE) ID=ca ;; - LINUX-RAID) ID=fd ;; - *) ID="" ;; +# Asociar id. de partición para su mnemónico. +PTTYPE=${2:-"MSDOS"} +case "$PTTYPE" in + GPT) # Se incluyen mnemónicos compatibles con tablas MSDOS. + case "$1" in + EMPTY) ID=0 ;; + WINDOWS|NTFS|EXFAT|FAT32|FAT16|FAT12|HNTFS|HFAT32|HFAT16|HFAT12) + ID=0700 ;; + WIN-RESERV) ID=0C01 ;; + CHROMEOS-KRN) ID=7F00 ;; + CHROMEOS) ID=7F01 ;; + CHROMEOS-RESERV) ID=7F02 ;; + LINUX-SWAP) ID=8200 ;; + LINUX|EXT[234]|REISERFS|REISER4|XFS|JFS) + ID=8300 ;; + LINUX-RESERV) ID=8301 ;; + LINUX-LVM) ID=8E00 ;; + FREEBSD-DISK) ID=A500 ;; + FREEBSD-BOOT) ID=A501 ;; + FREEBSD-SWAP) ID=A502 ;; + FREEBSD) ID=A503 ;; + HFS|HFS+) ID=AF00 ;; + HFS-RAID) ID=AF01 ;; + SOLARIS-BOOT) ID=BE00 ;; + SOLARIS) ID=BF00 ;; + SOLARIS-SWAP) ID=BF02 ;; + SOLARIS-DISK) ID=BF03 ;; + CACHE) ID=CA00;; + EFI) ID=EF00 ;; + LINUX-RAID) ID=FD00 ;; + *) ID="" ;; + esac + ;; + MSDOS) + case "$1" in + EMPTY) ID=0 ;; + FAT12) ID=1 ;; + EXTENDED) ID=5 ;; + FAT16) ID=6 ;; + WINDOWS|NTFS|EXFAT) + ID=7 ;; + FAT32) ID=b ;; + HFAT12) ID=11 ;; + HFAT16) ID=16 ;; + HNTFS) ID=17 ;; + HFAT32) ID=1b ;; + LINUX-SWAP) ID=82 ;; + LINUX|EXT[234]|REISERFS|REISER4|XFS|JFS) + ID=83 ;; + LINUX-LVM) ID=8e ;; + FREEBSD) ID=a5 ;; + OPENBSD) ID=a6 ;; + HFS|HFS+) ID=af ;; + SOLARIS-BOOT) ID=be ;; + SOLARIS) ID=bf ;; + CACHE) ID=ca ;; + DATA) ID=da ;; + GPT) ID=ee ;; + EFI) ID=ef ;; + VMFS) ID=fb ;; + LINUX-RAID) ID=fd ;; + *) ID="" ;; + esac + ;; esac echo $ID } @@ -325,9 +600,9 @@ fi # Error si no se recibe 1 parámetro. [ $# == 1 ] || ogRaiseError $OG_ERR_FORMAT || return $? -# Obtener el tamaño de la partición. +# Obtener el tamaño del disco. DISK="$(ogDiskToDev $1)" || return $? -sfdisk -s $DISK +awk -v D=${DISK#/dev/} '{if ($4==D) {print $3}}' /proc/partitions } @@ -357,6 +632,68 @@ echo $TYPE #/** +# ogGetLastSector int_ndisk [int_npart] +#@brief Devuelve el último sector usable del disco o de una partición. +#@param int_ndisk nº de orden del disco +#@param int_npart nº de orden de la partición (opcional) +#@return Último sector usable. +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_NOTFOUND Disco o partición no corresponde con un dispositivo. +#@note Requisitos: sfdisk, sgdisk +#@version 1.0.4 - Primera versión compatible con OpenGnSys. +#@author Universidad de Huelva +#@date 2012/06/03 +#*/ ## + +function ogGetLastSector () +{ +# Variables locales +local DISK PART PTTYPE LASTSECTOR SECTORS CYLS +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk [int_npart]" \ + "$FUNCNAME 1 => 488392064" \ + "$FUNCNAME 1 1 => 102400062" + return +fi +# Error si no se reciben 1 o 2 parámetros. +case $# in + 1) DISK=$(ogDiskToDev $1) || return $? + ;; + 2) DISK=$(ogDiskToDev $1) || return $? + PART=$(ogDiskToDev $1 $2) || return $? + ;; + *) ogRaiseError $OG_ERR_FORMAT + return $? ;; +esac + +# Hay que comprobar si el disco es GPT +PTTYPE=$(ogGetPartitionTableType $1) +PTTYPE=${PTTYPE:-"MSDOS"} # Por defecto para discos vacíos. +case "$PTTYPE" in + GPT) + if [ $# == 1 ]; then + LASTSECTOR=$(LANG=C sgdisk -p $DISK | awk '/last usable sector/ {print($(NF))}') + else + LASTSECTOR=$(LANG=C sgdisk -p $DISK | awk -v P="$2" '{if ($1==P) print $3}') + fi + ;; + MSDOS) + if [ $# == 1 ]; then + SECTORS=$(awk -v D=${DISK#/dev/} '{if ($4==D) {print $3*2}}' /proc/partitions) + CYLS=$(sfdisk -g $DISK | cut -f2 -d" ") + LASTSECTOR=$[SECTORS/CYLS*CYLS-1] + else + LASTSECTOR=$(sfdisk -uS -l $DISK 2>/dev/null | \ + awk -v P="$PART" '{if ($1==P) {if ($2=="*") print $4; else print $3} }') + fi + ;; +esac +echo $LASTSECTOR +} + + +#/** # ogGetPartitionActive int_ndisk #@brief Muestra que particion de un disco esta marcada como de activa. #@param int_ndisk nº de orden del disco @@ -399,15 +736,15 @@ parted $DISK print 2>/dev/null | awk '/boot/ {print $1}' #@note Requisitos: sfdisk #@version 0.9 - Primera versión compatible con OpenGnSys. #@author Ramon Gomez, ETSII Universidad de Sevilla -#@date 25/03/2009 +#@date 2009/03/25 #@version 1.0.2 - Detectar partición vacía. #@author Ramon Gomez, ETSII Universidad de Sevilla -#@date 23/12/2011 +#@date 2011/12/23 #*/ ## function ogGetPartitionId () { # Variables locales. -local DISK ID +local DISK PART ID # Si se solicita, mostrar ayuda. if [ "$*" == "help" ]; then @@ -420,7 +757,13 @@ fi # Detectar id. de tipo de partición y codificar al mnemónico. DISK=$(ogDiskToDev $1) || return $? -ID=$(sfdisk --id $DISK $2 2>/dev/null) || ogRaiseError $OG_ERR_NOTFOUND "$1,$2" || return $? +PART=$(ogDiskToDev $1 $2) || return $? +case "$(ogGetPartitionTableType $1)" in + GPT) ID=$(sgdisk -p $DISK 2>/dev/null | awk -v p="$2" '{if ($1==p) print $6;}') || ogRaiseError $OG_ERR_NOTFOUND "$1,$2" || return $? + [ "$ID" == "8301" -a "$1 $2" == "$(ogFindCache)" ] && ID=CA00 + ;; + MSDOS) ID=$(sfdisk --id $DISK $2 2>/dev/null) || ogRaiseError $OG_ERR_NOTFOUND "$1,$2" || return $? ;; +esac echo $ID } @@ -470,6 +813,78 @@ esac #/** +# ogGetPartitionsNumber int_ndisk +#@brief Detecta el numero de particiones del disco duro indicado. +#@param int_ndisk nº de orden del disco +#@return Devuelve el numero paritiones del disco duro indicado +#@warning Salidas de errores no determinada +#@attention Requisitos: parted +#@note Notas sin especificar +#@version 0.1 - Integracion para Opengnsys - EAC: DetectNumberPartition () en ATA.lib +#@author Antonio J. Doblas Viso. Universidad de Malaga +#@date Date: 27/10/2008 +#@version 1.0 - Uso de sfdisk Primera version para OpenGnSys +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2009/07/24 +#@version 1.0.4 - Uso de /proc/partitions para detectar el numero de particiones +#@author Universidad de Huelva +#@date 2012/03/28 +#*/ ## +function ogGetPartitionsNumber () +{ +# Variables locales. +local DISK +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk" \ + "$FUNCNAME 1 => 3" + return +fi +# Error si no se recibe 1 parámetro. +[ $# == 1 ] || ogRaiseError $OG_ERR_FORMAT || return $? + +# Contar el nº de veces que aparece el disco en su lista de particiones. +DISK=$(ogDiskToDev $1) 2>/dev/null +case "$(ogGetPartitionTableType $1)" in + GPT) grep -c "${DISK#/dev/}." /proc/partitions ;; + MSDOS) sfdisk -l $DISK 2>/dev/null | grep -c "^$DISK" ;; +esac +} + + +#/** +# ogGetPartitionTableType int_ndisk +#@brief Devuelve el tipo de tabla de particiones del disco (GPT o MSDOS) +#@param int_ndisk nº de orden del disco +#@return str_tabletype - Tipo de tabla de paritiones +#@warning Salidas de errores no determinada +#@note tabletype = { MSDOS, GPT } +#@note Requisitos: parted +#@version 1.0.4 - Primera versión para OpenGnSys +#@author Universidad de Huelva +#@date 2012/03/01 +#*/ ## +function ogGetPartitionTableType () +{ +# Variables locales. +local DISK + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk" \ + "$FUNCNAME 1 => MSDOS" + return +fi +# Error si no se recibe 1 parámetro. +[ $# == 1 ] || ogRaiseError $OG_ERR_FORMAT || return $? + +# Sustituye n de disco por su dispositivo. +DISK=`ogDiskToDev $1` || return $? +parted -sm $DISK print | awk -F: -v D=$DISK '{ if($1 == D) print toupper($6)}' +} + + +#/** # ogGetPartitionType int_ndisk int_npartition #@brief Devuelve el mnemonico con el tipo de partición. #@param int_ndisk nº de orden del disco @@ -510,21 +925,42 @@ case "$ID" in 5|f) TYPE="EXTENDED" ;; 6|e) TYPE="FAT16" ;; 7) TYPE="NTFS" ;; + 700|0700) TYPE="WINDOWS" ;; b|c) TYPE="FAT32" ;; + C01|0C01) TYPE="WIN-RESERV" ;; 11) TYPE="HFAT12" ;; 12) TYPE="COMPAQDIAG" ;; 16|1e) TYPE="HFAT16" ;; 17) TYPE="HNTFS" ;; 1b|1c) TYPE="HFAT32" ;; 42) TYPE="WIN-DYNAMIC" ;; - 82) TYPE="LINUX-SWAP" ;; - 83) TYPE="LINUX" ;; - 8e) TYPE="LINUX-LVM" ;; + 7F00) TYPE="CHROMEOS-KRN" ;; + 7F01) TYPE="CHROMEOS" ;; + 7F02) TYPE="CHROMEOS-RESERV" ;; + 82|8200) TYPE="LINUX-SWAP" ;; + 83|8300) TYPE="LINUX" ;; + 8301) TYPE="LINUX-RESERV" ;; + 8e|8E00) TYPE="LINUX-LVM" ;; + a5|A503) TYPE="FREEBSD" ;; + A500) TYPE="FREEBSD-DISK" ;; + A501) TYPE="FREEBSD-BOOT" ;; + A502) TYPE="FREEBSD-SWAP" ;; + a6) TYPE="OPENBSD" ;; a7) TYPE="CACHE" ;; # (compatibilidad con Brutalix) - af) TYPE="HFS" ;; - bf) TYPE="SOLARIS" ;; - ca) TYPE="CACHE" ;; - fd) TYPE="LINUX-RAID" ;; + af|AF00) TYPE="HFS" ;; + Af01) TYPE="HFS-RAID" ;; + be|BE00) TYPE="SOLARIS-BOOT" ;; + bf|BF0[0145]) TYPE="SOLARIS" ;; + BF02) TYPE="SOLARIS-SWAP" ;; + BF03) TYPE="SOLARIS-DISK" ;; + ca|CA00) TYPE="CACHE" ;; + da) TYPE="DATA" ;; + ee) TYPE="GPT" ;; + ef|EF00) TYPE="EFI" ;; + EF01) TYPE="MBR" ;; + EF02) TYPE="BIOS-BOOT" ;; + fb) TYPE="VMFS" ;; + fd|FD00) TYPE="LINUX-RAID" ;; *) TYPE="UNKNOWN" ;; esac echo "$TYPE" @@ -619,31 +1055,37 @@ echo #/** # ogListPrimaryPartitions int_ndisk -#@brief Metafunción que lista las particiones primarias no vacías definidas en un disco. +#@brief Metafunción que lista las particiones primarias no vacías de un disco. #@param int_ndisk nº de orden del disco #@see ogListPartitions #*/ ## function ogListPrimaryPartitions () { # Variables locales. -local PARTS +local PTTYPE PARTS +PTTYPE=$(ogGetPartitionTableType $1) || return $? PARTS=$(ogListPartitions "$@") || return $? -echo $PARTS | cut -sf1-4 -d" " | sed 's/\( EMPTY:0\)*$//' +case "$PTTYPE" in + GPT) echo $PARTS | sed 's/\( EMPTY:0\)*$//' ;; + MSDOS) echo $PARTS | cut -sf1-4 -d" " | sed 's/\( EMPTY:0\)*$//' ;; +esac } #/** # ogListLogicalPartitions int_ndisk -#@brief Metafunción que lista las particiones lógicas definidas en un disco. +#@brief Metafunción que lista las particiones lógicas de una tabla tipo MSDOS. #@param int_ndisk nº de orden del disco #@see ogListPartitions #*/ ## function ogListLogicalPartitions () { # Variables locales. -local PARTS +local PTTYPE PARTS +PTTYPE=$(ogGetPartitionTableType $1) || return $? +[ "$PTTYPE" == "MSDOS" ] || ogRaiseError $OG_ERR_PARTITION "" || return $? PARTS=$(ogListPartitions "$@") || return $? echo $PARTS | cut -sf5- -d" " } @@ -687,9 +1129,54 @@ parted -s $DISK set $2 boot on 2>/dev/null #/** +# ogSetPartitionId int_ndisk int_npartition str_type +#@brief Cambia el identificador de la partición. +#@param int_ndisk nº de orden del disco +#@param int_npartition nº de orden de la partición +#@param str_partid mnemónico de tipo de partición +#@return (nada) +#@attention Requisitos: fdisk, sgdisk +#@version 0.1 - Integracion para Opengnsys - SetPartitionType() en ATA.lib +#@author Antonio J. Doblas Viso. Universidad de Malaga +#@date 2008/10/27 +#@version 1.0.4 - Soporte para discos GPT. +#@author Universidad de Huelva +#@date 2012/03/13 +#*/ ## +function ogSetPartitionId () +{ +# Variables locales +local DISK PART PTTYPE ID + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition str_type" \ + "$FUNCNAME 1 1 NTFS" + return +fi +# Error si no se reciben 3 parámetros. +[ $# == 3 ] || ogRaiseError $OG_ERR_FORMAT || return $? + +# Sustituye nº de disco por su dispositivo. +DISK=`ogDiskToDev $1` || return $? +PART=`ogDiskToDev $1 $2` || return $? + +# Elección del tipo de partición. +PTTYPE=$(ogGetPartitionTableType $1) +ID=$(ogTypeToId "$3" "$PTTYPE") +[ -n "$ID" ] || ogRaiseError $OG_ERR_PARTITION "$3,$PTTYPE" || return $? +case "$PTTYPE" in + GPT) sgdisk $DISK -t$PART:$ID 2>/dev/null ;; + MSDOS) echo -ne "t\n$2\n${ID}\nw\n" | fdisk $DISK &>/dev/null ;; +esac +partprobe $DISK 2>/dev/null +} + + +#/** # ogSetPartitionSize int_ndisk int_npartition int_size #@brief Muestra el tamano en KB de una particion determinada. -#@param int_ndisk nº de orden del disco +#@param int_ndisk nº de orden del disco #@param int_npartition nº de orden de la partición #@param int_size tamaño de la partición (en KB) #@return (nada) @@ -722,9 +1209,10 @@ PART="$(ogDiskToDev $1 $2)" || return $? SIZE=$[$3*2] || ogRaiseError $OG_ERR_FORMAT || return $? # Redefinir el tamaño de la partición. sfdisk -f -uS -N$2 $DISK <<< ",$SIZE" &>/dev/null || ogRaiseError $OG_ERR_PARTITION "$1,$2" || return $? -partprobe 2>/dev/null +partprobe $DISK 2>/dev/null } + #/** # ogUnhidePartition int_ndisk int_npartition #@brief Hace visible una partición oculta. @@ -788,35 +1276,6 @@ done } - -#/** -# ogGetPartitionsNumber int_ndisk -#@brief Detecta el numero de particiones del disco duro indicado. -#@param int_ndisk nº de orden del disco -#@return Devuelve el numero paritiones del disco duro indicado -#@warning Salidas de errores no determinada -#@attention Requisitos: parted -#@note Notas sin especificar -#@version 0.1 - Integracion para Opengnsys - EAC: DetectNumberPartition () en ATA.lib -#@author Antonio J. Doblas Viso. Universidad de Malaga -#@date Date: 27/10/2008 -#@version 1.0 - Uso de sfdisk Primera version para OpenGnSys -#@author Ramon Gomez, ETSII Universidad de Sevilla -#@date 2009/07/24 -#*/ ## -function ogGetPartitionsNumber () -{ - #local disco totalpart - #disco=`ogDiskToDev $1` - #totalpart=`parted $disco print | egrep ^" [0123456789] " -c` - #echo $totalpart -local DISK -# Contar el nº de veces que aparece el disco en su lista de particiones. -DISK=$(ogDiskToDev $1) 2>/dev/null -sfdisk -l $DISK 2>/dev/null | grep -c "^$DISK" -} - - #/** @function ogDiskToRelativeDev: @brief Traduce los ID de discos o particiones EAC a ID Linux relativos, es decir 1 1 => sda1 #@param Admite 1 parametro: $1 int_numdisk #@param Admite 2 parametro: $1 int_numdisk $2 int_partition @@ -843,71 +1302,6 @@ PART=$(ogDiskToDev|cut -f$1 -d' ')$2 echo $PART | cut -f3 -d \/ } -#/** @function ogDeletePartitionTable: @brief Borra la tabla de particiones del disco. -#@param $1 opcion A (identificador LINUX) str_ID_linux (/dev/sda) -#@param $1 opcion B (Identifiador EAC) int_numdiskEAC(1) -#@return la informacion propia del fdisk -#@warning no definidos -#@attention -#@note -#@version 0.1 - Integracion para Opengnsys - EAC: DeletePartitionTable () en ATA.lib -#@author Antonio J. Doblas Viso. Universidad de Malaga -#@date 27/10/2008 -#*/ -function ogDeletePartitionTable () { -if [ $# = 0 ] -then - Msg "sintaxis1: ogDeletePartitionTable int_disk" red - Msg "sintaxis2: ogDeletePartitionTable str_/dev/sdX" red - return -fi -if [ -n "${1%/dev/*}" ] - then - dev=`DiskToDev $1` - else - dev=$1 -fi -echo -ne "o\nw" | fdisk $dev -} - - -#/** @function ogSetPartitionId: @brief Cambia el identificador de la particion, pero no su sistema de archivos. -#@param $1 int_numdiskEAC -#@param $2 int_numpartitionEAC -#@param $3 str_tipoPartition admite EXT2 EXT3 NTFS FAT32 SWAP CACHE -#@return la propia del fdisk -#@warning no controla los parametros, si se introducen mal o simplemente no se introducen no muestra mensaje -#@warning Identifica por nombre del sistema de archivos no por número -#@attention Requisitos: fdisk -#@note -#@version 0.1 - Integracion para Opengnsys - SetPartitionType() en ATA.lib -#@author Antonio J. Doblas Viso. Universidad de Malaga -#@date 27/10/2008 -#*/ -function ogSetPartitionId() { -# Variables locales -local DISK PART ID - -# Si se solicita, mostrar ayuda. -if [ "$*" == "help" ]; then - ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition str_type" \ - "$FUNCNAME 1 1 NTFS" - return -fi -# Error si no se reciben 3 parámetros. -[ $# == 3 ] || ogRaiseError $OG_ERR_FORMAT || return $? - -# Sustituye nº de disco por su dispositivo. -DISK=`ogDiskToDev $1` || return $? -PART=`ogDiskToDev $1 $2` || return $? - -# Elección del tipo de partición. -ID=$(ogFsToId "$3") -[ -n "$ID" ] || ogRaiseError $OG_ERR_PARTITION "$3" || return $? - -echo -ne "t\n$2\n${ID}\nw\n" | fdisk $DISK 1>/dev/null 2>&1 -} - #/** @function ogDeletePartitionsLabels: @brief Elimina la informacion que tiene el kernel del cliente og sobre los labels de los sistemas de archivos #@param No requiere @@ -920,6 +1314,13 @@ echo -ne "t\n$2\n${ID}\nw\n" | fdisk $DISK 1>/dev/null 2>&1 #@date 27/10/2008 #*/ function ogDeletePartitionsLabels () { +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME " \ + "$FUNCNAME " + return +fi + rm /dev/disk/by-label/* # */ COMENTARIO OBLIGATORIO PARA DOXYGEN } diff --git a/client/engine/File.lib b/client/engine/File.lib index b04d2278..ea3956e6 100755 --- a/client/engine/File.lib +++ b/client/engine/File.lib @@ -4,7 +4,7 @@ #@brief Librería o clase File #@class File #@brief Funciones para gestión de archivos y directorios. -#@version 0.9.2 +#@version 1.0.4 #@warning License: GNU GPLv3+ #*/ @@ -20,6 +20,9 @@ #@version 0.9.2 - Primera versión para OpenGnSys. #@author Ramon Gomez, ETSII Universidad de Sevilla #@date 2010-07-24 +#@version 1.0.4 - Calcula solo el checksum del último MB del fichero. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2012-03-16 #*/ ## function ogCalculateChecksum () { @@ -34,7 +37,7 @@ fi # Comprobar que existe el fichero y devolver sus datos. FILE=$(ogGetPath "$@") [ -n "$FILE" ] || ogRaiseError $OG_ERR_NOTFOUND "$*" || return $? -md5sum "$FILE" 2>&1 | cut -f1 -d" " +tail -c1M "$FILE" | md5sum -b 2>&1 | cut -f1 -d" " } @@ -80,10 +83,14 @@ test "$(cat "$SOURCE.sum" 2>/dev/null)" == "$(cat "$TARGET.sum" 2>/dev/null)" # ogCopyFile [ str_repo | int_ndisk int_npart ] path_source [ str_repo | int_ndisk int_npart ] path_target #@brief Metafunción para copiar un fichero de sistema OpenGnSys a un directorio. #@see ogGetPath +#@return Progreso de la copia. #@warning Deben existir tanto el fichero origen como el directorio destino. #@version 0.9 - Pruebas con OpenGnSys. #@author Ramon Gomez, ETSII Universidad de Sevilla #@date 2009-10-20 +#@version 1.0.4 - Copiar usando rsync. +#@author Universidad de Huelva +#@date 2012-07-06 #*/ ## function ogCopyFile () { @@ -111,8 +118,8 @@ esac [ -n "$SOURCE" ] || ogRaiseError $OG_ERR_NOTFOUND "${ARGS% $*}" || return $? TARGET="$(ogGetPath "$@")" [ -n "$TARGET" ] || ogRaiseError $OG_ERR_NOTFOUND "$@" || return $? -# Copiar fichero. -cp -a "$SOURCE" "$TARGET" # (definir posible error) +# Copiar fichero (para evitar problemas de comunicaciones las copias se hacen con rsync en vez de cp). +rsync --progress -avh "$SOURCE" "$TARGET" } diff --git a/client/engine/FileSystem.lib b/client/engine/FileSystem.lib index 1af06de8..0f23c91b 100755 --- a/client/engine/FileSystem.lib +++ b/client/engine/FileSystem.lib @@ -4,7 +4,7 @@ #@brief Librería o clase FileSystem #@class FileSystem #@brief Funciones para gestión de sistemas de archivos. -#@version 0.9 +#@version 1.0.4 #@warning License: GNU GPLv3+ #*/ @@ -27,7 +27,10 @@ #@version 1.0.2 - Ignorar códigos de salida de comprobación (no erróneos). #@author Ramon Gomez, ETSII Universidad de Sevilla #@date 2011-09-23 -#*/ +#@version 1.0.4 - Soportar HFS/HFS+. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2012-05-21 +#*/ ## function ogCheckFs () { # Variables locales. @@ -55,6 +58,8 @@ case "$TYPE" in FAT32) PROG="dosfsck"; PARAMS="-a"; CODES=1 ;; FAT16) PROG="dosfsck"; PARAMS="-a"; CODES=1 ;; FAT12) PROG="dosfsck"; PARAMS="-a"; CODES=1 ;; + HFS) PROG="fsck.hfs" ;; + HFS+) PROG="fsck.hfsplus" ;; *) ogRaiseError $OG_ERR_PARTITION "$1, $2, $TYPE" return $? ;; esac @@ -69,6 +74,7 @@ if ogIsLocked $1 $2; then fi # Comprobar en modo uso exclusivo. ogLock $1 $2 +trap "ogUnlock $1 $2" 1 2 3 6 9 eval $PROG $PARAMS $PART ERRCODE=$? case $ERRCODE in @@ -100,7 +106,7 @@ return $ERRCODE #@version 0.9 - Primera adaptacion para OpenGNSys. #@author Ramon Gomez, ETSII Universidad de Sevilla #@date 2009-09-23 -#*/ +#*/ ## function ogExtendFs () { # Variables locales. @@ -124,6 +130,7 @@ TYPE=$(ogGetFsType $1 $2) case "$TYPE" in EXT[234]) PROG="resize2fs"; PARAMS="-f" ;; REISERFS) PROG="resize_reiserfs"; PARAMS="-f" ;; +# BTRFS) PROG="btrfs"; PARAMS="filesystem resize max" ;; NTFS) PROG="ntfsresize"; PARAMS="<<<\"y\" -f" ;; *) ogRaiseError $OG_ERR_PARTITION "$1 $2 $TYPE" return $? ;; @@ -139,6 +146,7 @@ if ogIsLocked $1 $2; then fi # Redimensionar en modo uso exclusivo. ogLock $1 $2 +trap "ogUnlock $1 $2" 1 2 3 6 9 eval $PROG $PARAMS $PART &>/dev/null ERRCODE=$? case $ERRCODE in @@ -156,7 +164,7 @@ return $ERRCODE #/** # ogFormat int_ndisk int_npartition | CACHE #@see ogFormatFs ogFormatCache -#*/ +#*/ ## function ogFormat () { case "$*" in @@ -183,6 +191,9 @@ esac #@version 0.9 - Primera versión para OpenGNSys. #@author Ramon Gomez, ETSII Universidad de Sevilla #@date 2009-10-08 +#@version 1.0.4 - Solucionado error cuando no se detecta tipo de sistema de ficheros pero si se indica +#@author Universidad de Huelva +#@date 2012-04-11 #*/ ## function ogFormatFs () { @@ -202,15 +213,26 @@ fi [ $# -ge 2 -a $# -le 4 ] || ogRaiseError $OG_ERR_FORMAT || return $? # Obtener dispositivo y tipo de sisitema de archivos. PART="$(ogDiskToDev $1 $2)" || return $? -TYPE="$(ogGetFsType $1 $2)" || return $? +TYPE="$(ogGetFsType $1 $2)" +# Si no se detecto el tipo de sistema de ficheros +if [ -z "$TYPE" ]; then + # Si no se indico ningun tipo de sistema de ficheros se retorna + if [ -z "$3" ]; then + return $? + else + # Si no se detecto, se asigna el indicado + TYPE="$3" + fi +fi # Elegir tipo de formato segun el tipo de particion. case "$3" in - EXT2) ID=83; PROG="mkfs.ext2";; - EXT3) ID=83; PROG="mkfs.ext3";; - EXT4) ID=83; PROG="mkfs.ext4";; + EXT2) ID=83; PROG="mkfs.ext2" ;; + EXT3) ID=83; PROG="mkfs.ext3" ;; + EXT4) ID=83; PROG="mkfs.ext4" ;; + BTRFS) ID=83; PROG="mkfs.btrfs" ;; REISERFS) ID=83; PROG="mkfs.reiserfs"; PARAMS="-f" ;; - REISER4) ID=83; PROG="mkfs.reiser4";; + REISER4) ID=83; PROG="mkfs.reiser4" ;; XFS) ID=83; PROG="mkfs.xfs"; PARAMS="-f" ;; JFS) ID=83; PROG="mkfs.jfs"; PARAMS="<<<\"y\"";; NTFS) ID=7; PROG="mkntfs"; PARAMS="-f" ;; @@ -221,16 +243,20 @@ case "$3" in HFAT16) ID=16; PROG="mkdosfs"; PARAMS="-F 16" ;; FAT12) ID=1; PROG="mkdosfs"; PARAMS="-F 12" ;; HFAT12) ID=11; PROG="mkdosfs"; PARAMS="-F 12" ;; + HFS) ID=af; PROG="mkfs.hfs" ;; + HFS+) ID=af; PROG="mkfs.hfsplus" ;; + UFS) ID=bf; PROG="mkfs.ufs"; PARAMS="-O 2" ;; *) LABEL="$3" ;; esac # Si no se indica explícitamente, detectar el tipo de sistema de archivos. if [ -z "$PROG" ]; then case "$TYPE" in - EXT2) PROG="mkfs.ext2";; - EXT3) PROG="mkfs.ext3";; - EXT4) PROG="mkfs.ext4";; + EXT2) PROG="mkfs.ext2" ;; + EXT3) PROG="mkfs.ext3" ;; + EXT4) PROG="mkfs.ext4" ;; + BTRFS) PROG="mkfs.btrfs" ;; REISERFS) PROG="mkfs.reiserfs"; PARAMS="-f" ;; - REISER4) PROG="mkfs.reiser4";; + REISER4) PROG="mkfs.reiser4" ;; XFS) PROG="mkfs.xfs"; PARAMS="-f" ;; JFS) PROG="mkfs.jfs"; PARAMS="<<<\"y\"" ;; LINUX-SWAP) PROG="mkswap" ;; @@ -238,6 +264,9 @@ if [ -z "$PROG" ]; then FAT32|HFAT32) PROG="mkdosfs"; PARAMS="-F 32" ;; FAT16|HFAT16) PROG="mkdosfs"; PARAMS="-F 16" ;; FAT12|HFAT12) PROG="mkdosfs"; PARAMS="-F 12" ;; + HFS) PROG="mkfs.hfs" ;; + HFS+) PROG="mkfs.hfsplus" ;; + UFS) PROG="mkfs.ufs"; PARAMS="-O 2" ;; *) ogRaiseError $OG_ERR_PARTITION "$1 $2 $TYPE" return $? ;; esac @@ -266,6 +295,7 @@ if ogIsLocked $1 $2; then fi # Formatear en modo uso exclusivo. ogLock $1 $2 +trap "ogUnlock $1 $2" 1 2 3 6 9 eval $PROG $PARAMS $PART 2>/dev/null ERRCODE=$? case $ERRCODE in @@ -279,6 +309,62 @@ return $ERRCODE #/** +# ogGetFsSize int_ndisk int_npartition [str_unit] +#@brief Muestra el tamanio del sistema de archivos indicado, permite definir la unidad de medida, por defecto GB +#@param int_ndisk nº de orden del disco +#@param int_npartition nº de orden de la partición +#@param str_unit unidad (opcional, por defecto: KB) +#@return float_size - Tamaño del sistema de archivos +#@note str_unit = { KB, MB, GB, TB } +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_NOTFOUND Disco o partición no corresponden con un dispositivo. +#@version 0.1 - Integracion para Opengnsys - EAC: SizeFileSystem() en FileSystem.lib +#@author Antonio J. Doblas Viso. Universidad de Malaga +#@date 2008-10-27 +#@version 1.0.4 - Adaptación de las salidas. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2012-06-18 +#*/ ## +function ogGetFsSize () +{ +# Variables locales. +local MNTDIR UNIT VALUE FACTOR SIZE +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition [str_unit]" \ + "$FUNCNAME 1 1 => 15624188" \ + "$FUNCNAME 1 1 KB => 15624188" + return +fi +# Error si no se reciben 2 o 3 parámetros. +[ $# == 2 ] || [ $# == 3 ] || ogRaiseError $OG_ERR_FORMAT || return $? +# Obtener unidad y factor de medida. +UNIT="$3" +UNIT=${UNIT:-"KB"} +case "$UNIT" in + [kK]B) + FACTOR=1 ;; + MB) FACTOR=1024 ;; + GB) FACTOR=$[1024*1024] ;; + TB) FACTOR=$[1024*1024*1024] ;; + *) ogRaiseError $OG_ERR_FORMAT "$3 != { KB, MB, GB, TB }" + return $? ;; +esac + +# Obtener el tamaño del sistema de archivo (si no está formateado; tamaño = 0). +MNTDIR="$(ogMount $1 $2 2>/dev/null)" +if [ -n "$MNTDIR" ]; then + VALUE=$(df -BK "$MNTDIR" | awk '{getline; print $2}') + SIZE=$(echo "$VALUE $FACTOR" | awk '{printf "%f\n", $1/$2}') +else + SIZE=0 +fi +# Devolver el tamaño (quitar decimales si son 0). +echo ${SIZE%.0*} +} + + +#/** # ogGetFsType int_ndisk int_npartition #@brief Devuelve el mnemonico con el tipo de sistema de archivos. #@param int_ndisk nº de orden del disco @@ -313,9 +399,10 @@ fi # Detectar id. de tipo de partición y codificar al mnemonico. DISK=$(ogDiskToDev "$1") || return $? ID=$(ogGetPartitionId "$1" "$2") || return $? +[ "$ID" == "a7" ] && ID="ca" # Traducir antiguo id. de partición de caché. TYPE="" case "$ID" in - ca|a7) # Detectar Caché local. + ca|CA00) # Detectar caché local (revisar detección en tablas GPT). ogIsFormated $1 $2 2>/dev/null && TYPE="CACHE" ;; *) # Detectar sistema de ficheros. @@ -537,6 +624,9 @@ esac #@version 0.9 - Primera version para OpenGNSys. #@author Ramon Gomez, ETSII Universidad de Sevilla #@date 2009-09-28 +#@version 1.0.4 - Soportar HFS/HFS+. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2012-05-21 #*/ ## function ogMountFs () { @@ -585,6 +675,7 @@ if [ -z "$MNTDIR" ]; then NTFS|HNTFS) MOUNT=ntfs-3g ;; FAT16|FAT32|HFAT16|HFAT32) MOUNT=mount; PARAMS="-t vfat" ;; + HFS|HFS+) MOUNT=mount; PARAMS="-o force" ;; *) #/// Error, si la partición no es montable. rmdir $MNTDIR ogRaiseError $OG_ERR_PARTITION "$1, $2, $TYPE" @@ -673,18 +764,18 @@ case "$(ogGetFsType $1 $2)" in # ;; NTFS|HNTFS) ogDeleteFile $1 $2 pagefile.sys - ogDeleteFile $1 $2 hiberfile.sys + ogDeleteFile $1 $2 hiberfil.sys ogUnmount $1 $2 2>/dev/null ## NTFS: Obtiene tamaño mínimo en MB. #SIZE=$(ntfsresize -fi $PART | awk '/resize at/ {print int($8*1.1)}') #ntfsresize -fns "${SIZE}M" $PART >/dev/null || ogRaiseError $OG_ERR_PARTITION "$1,$2" || return $? #ntfsresize -fs "${SIZE}M" $PART <<<"y" >/dev/null || ogRaiseError $OG_ERR_PARTITION "$1,$2" || return $? - SIZE=$(ogReduceFsCheck $1 $2) - [ "$SIZE" == 0 ] && return 1 + SIZE=$(ogReduceFsCheck $1 $2) + [ "$SIZE" == 0 ] && return 1 ntfsresize -fs "${SIZE}M" $PART <<<"y" || ogRaiseError $OG_ERR_PARTITION "error reduciendo $1,$2" || return $? - ;; + ;; *) ogRaiseError $OG_ERR_PARTITION "$1,$2" - return $? ;; + return $? ;; esac ogGetFsSize $1 $2 } @@ -749,7 +840,7 @@ esac #/** # ogUnlock int_ndisk int_npartition #@see ogUnlockPartition -#*/ +#*/ ## function ogUnlock () { ogUnlockPartition "$@" @@ -794,7 +885,7 @@ rm -f $LOCKFILE #/** # ogUnmount int_ndisk int_npartition #@see ogUnmountFs -#*/ +#*/ ## function ogUnmount () { ogUnmountFs "$@" @@ -883,57 +974,6 @@ for ((PART=1; PART<=$(ogGetPartitionsNumber $1); PART++)); do done } -#/** @function ogGetFsSize: @brief Muestra el tamanio del sistema de archivos indicado, permite definir la unidad de medida, por defecto GB -#@param $1 int_diskEAC -#@param $2 int_PartitionEAC -#@param $3 str_UnidadMediada parametro opcional, admite [ kB MB GB -default GB] -#@return cadena con int_TotalSize:int_DataSize:int_DataFree -#@warning Salidas de errores no determinada -#@warning -#@attention -#@version 0.1 - Integracion para Opengnsys - EAC: SizeFileSystem() en FileSystem.lib -#@author Antonio J. Doblas Viso. Universidad de Malaga -#@date 2008-10-27 -#*/ -function ogGetFsSize () { -if [ $# = 0 ] -then - echo "sintaxis: ogGetFsSize int_disco int_partition str_SizeOutput [ kB MB GB -default GB]-]" red - echo "devuelve int_size : int_data : int_free" red -return -fi -if [ $# -ge 2 ] -then - particion=`ogMount $1 $2 ` #1>/dev/null 2>&1 - if [ -z $3 ] - then - unit=kB # s B kB MB GB TB % - else - unit=$3 - fi - case $unit in - kB) - factor="1.024"; - # valor=`df | grep $particion | awk -F" " '{size=$2*1.024; used=$3*1.024; free=$4*1.024; printf "%d:%d:%d", size,used,free}'` - valor=`df | grep $particion | awk -F" " '{size=$2*1.024; used=$3*1.024; free=$4*1.024; printf "%d", size}'` - ;; - MB) - factor="1.024/1000"; - valor=`df | grep $particion | awk -F" " '{size=$2*1.024/1000; used=$3*1.024/1000; free=$4*1.024/1000; printf "%d:%d:%d", size,used,free}'` - ;; - GB) - factor="1.024/1000000"; - valor=`df | grep $particion | awk -F" " '{size=$2*1.024/1000000; used=$3*1.024/1000000; free=$4*1.024/1000000; printf "%f:%f:%f", size,used,free}'` - ;; - esac - #echo $valor - #NumberRound $valor - #valor=`NumberRound $valor`; - ogUnmount $1 $2 1>/dev/null 2>&1 - echo $valor - -fi -} function ogGetFreeSize () { if [ $# = 0 ] @@ -975,37 +1015,3 @@ then fi } - - -function ogDeletePartitionsLabels () -{ -# Si se solicita, mostrar ayuda. -if [ "$*" == "help" ]; then - ogHelp "$FUNCNAME" "$FUNCNAME " \ - "$FUNCNAME " - return -fi -rm /dev/disk/by-label/* 2>/dev/null # */ COMENTARIO OBLIGATORIO PARA DOXYGEN -} - -function ogDeletePartitionTable () -{ - -# Variables locales. -local DISK - -# Si se solicita, mostrar ayuda. -if [ "$*" == "help" ]; then - ogHelp "$FUNCNAME int_disk" \ - "$FUNCNAME 1" - return -fi -# Error si no se reciben 1 parámetros. -[ $# == 1 ] || ogRaiseError $OG_ERR_FORMAT || return $? - -# Obteniendo Identificador linux de la particion. -DISK=$(ogDiskToDev $1) || return $? - -# Elimando las particiones con fdisk -echo -ne "o\nw" | fdisk $DISK -} diff --git a/client/engine/Image.lib b/client/engine/Image.lib index 5ce8aa1c..6c53d5da 100755 --- a/client/engine/Image.lib +++ b/client/engine/Image.lib @@ -787,82 +787,3 @@ IMGFILE=$(ogGetPath "$1" "$2.img") || return $? ogGetImageInfo $IMGFILE | awk -F: '{print $4}' } - -#/** -# ogGetImageFs str_repo path_image -#@brief Devuelve el tipo de sistema de archivos almacenado en un fichero de imagen. -#@param str_repo repositorio de imágenes o caché local -#@param path_image camino de la imagen -#@return str_imgtype - mnemónico del tipo de sistema de archivos -#@exception OG_ERR_FORMAT formato incorrecto. -#@exception OG_ERR_NOTFOUND fichero de imagen no encontrado. -#@todo Comprobar salidas para todos los tipos de sistemas de archivos. -#/** -function ogGetImageFsUS () -{ -local IMGFILE IMGTYPE -IMGTYPE=$(ogGetImageType "$1" "$2") -IMGFILE=$(ogGetPath "$1" "$2.$IMGTYPE") || return $? -[ -r "$IMGFILE" ] || ogRaiseError OG_ERR_NOTFOUND "$IMGFILE" || return $? -case "$IMGTYPE" in - img) # Partimage. - partimage -B gui=no imginfo "$IMGFILE" 2>&1 | \ - awk '/^Filesystem/ {sub(/\.\.+/," "); if ($2=="ntfs") print NTFS; - else { sub(/fs$/,""); print toupper($2);} }' - ;; - pgz) # Partclone / GZip - gzip -dc "$IMGFILE" | partclone.chkimg -C -s - 2>&1 | \ - awk '/^File system/ {if ($2=="EXTFS") print "EXT3"; else print $3;}' - ;; - *) # Error si el fichero de imagen no es accesible. - ogRaiseError OG_ERR_NOTFOUND "$IMGFILE" - return $? ;; -esac -} - - -# ogGetImageSize str_repo path_image -#@brief Devuelve el tamaño del sistema de archivos almacenado en un fichero de imagen. -#@param str_repo repositorio de imágenes o caché local -#@param path_image camino de la imagen -#@return int_size - tamaño (en KB) -#@exception OG_ERR_FORMAT formato incorrecto. -#@exception OG_ERR_NOTFOUND fichero de imagen no encontrado. -#*/ -#@warning En pruebas iniciales -#@todo Definición de parámetros y salidas. -#@version 0.1 - Primera versión muy en pruebas para OpenGNSys -#@author Ramon Gomez, ETSII Universidad de Sevilla -#@date 2009/09/11 -#*/ ## -function ogGetImageSizeUS () -{ -# Variables locales -local IMGFILE IMGTYPE - -# Si se solicita, mostrar ayuda. -if [ "$*" == "help" ]; then - ogHelp "$FUNCNAME" "$FUNCNAME path_dir str_image int_ndisk int_npart" \ - "$FUNCNAME 1 1 REPO /aula1/winxp ==> 5642158" - return -fi -# Error si no se reciben menos de 2 parámetros. -[ $# -ne 2 ] && ogRaiseError $OG_ERR_FORMAT && return $? -# Devuelve el tamaño de la imagen en KB. -IMGTYPE=$(ogGetImageType "$1" "$2") -IMGFILE=$(ogGetPath "$1" "$2.$IMGTYPE") -case "$IMGTYPE" in - img) # Partimage. - partimage -B gui=no imginfo "$IMGFILE" 2>&1 | \ - awk '/Partition size/ {sub(/\.\.+/," "); ps=$3} END {print ps*1024*1024;}' - ;; - pgz) # Partclone / GZip - gzip -dc "$IMGFILE" | partclone.chkimg -C -s - 2>&1 | \ - awk -F: '/Block size/ {bs=$2} /Used block/ {ub=$2} END {print bs*ub/1024}' - ;; - *) # Error si el fichero de imagen no es accesible. - ogRaiseError OG_ERR_NOTFOUND "$IMGFILE" - return $? ;; -esac -} - diff --git a/client/engine/PostConf.lib b/client/engine/PostConf.lib new file mode 100755 index 00000000..80c0b24f --- /dev/null +++ b/client/engine/PostConf.lib @@ -0,0 +1,380 @@ +#!/bin/bash +#/** +#@file PostConf.lib +#@brief Librería o clase PostConf +#@class PostConf +#@brief Funciones para la postconfiguración de sistemas operativos. +#@version 1.0.4 +#@warning License: GNU GPLv3+ +#*/ + + +#/** +# ogAddCmd int_ndisk int_npartition str_filename str_commands +#@brief Añade comandos al cmd creado por ogInstalMiniSetup +#@param int_ndisk nº de orden del disco +#@param int_npartition nº de orden de la partición +#@param str_filename nombre del fichero cmd (siempre se guardara en windows\system32\para que sea visible por el sistema +#@param str_commands comando o comandos que se añadiran al fichero +#@return +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_PARTITION Tipo de partición desconocido o no se puede montar. +#@version 1.0.2 - Nueva función +#@author Jonathan Alonso Martinez - Universidad Autonoma de Barcelona +#@date 2011-06-29 +#@version 1.0.4 - Cambios en los parametros de entrada de la funcion +#@author Jonathan Alonso Martinez - Universidad Autonoma de Barcelona +#@date 2012-04-16 +#*/ ## +function ogAddCmd () +{ +local MOUNTPOINT CMDFILE +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition str_filename str_commands" \ + "$FUNCNAME 1 1 filename.cmd command" + return +fi +# Error si no se reciben 4 parámetros. +[ $# == 4 ] || return $(ogRaiseError $OG_ERR_FORMAT; echo $?) +# Punto de montaje +MOUNTPOINT="$(ogMount "$1" "$2")" || return $? +# Comprobar que existe el fichero de comandos. +CMDFILE=$(ogGetPath "$MOUNTPOINT/windows/system32/$3") +[ -n "$CMDFILE" ] || ogRaiseError $OG_ERR_NOTFOUND "$MOUNTPOINT/windows/system32/$3" || return $? + +# Concatenamos el comando en el fichero de comandos +cat >> "$CMDFILE" << EOF +$4 +EOF +} + + +#/** +# ogDomainScript int_ndisk int_npartition str_domain str_user str_password +#@brief Crea un script .vbs para unir al dominio una maquina windows y el comando adequado en el archivo cmd creado por ogInstallMiniSetup +#@param int_ndisk nº de orden del disco +#@param int_npartition nº de orden de la partición +#@param str_filename nombre del fichero cmd donde deberemos introducir el comando de ejecutar el script vbs +#@param str_domain dominio donde se quiere conectar +#@param str_user usuario con privilegios para unir al dominio +#@param str_password password del usuario con privilegios +#@return +#@exception OG_ERR_FORMAT Formato incorrecto. +#@version 1.0.2 - Nueva función +#@author Jonathan Alonso Martinez - Universidad Autonoma de Barcelona +#@date 2011-06-29 +#@version 1.0.4 - Cambios en los parametros de entrada de la funcion +#@author Jonathan Alonso Martinez - Universidad Autonoma de Barcelona +#@date 2012-04-16 +#*/ ## +function ogDomainScript () +{ +local CMDDIR +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" \ + "$FUNCNAME int_ndisk int_npartition str_filename str_domain str_user str_password" \ + "$FUNCNAME 1 1 filename.cmd domain user password_user" + return +fi +# Error si no se reciben 6 parámetros. +[ $# == 6 ] || return $(ogRaiseError $OG_ERR_FORMAT; echo $?) +# Punto de montaje +MOUNTPOINT="$(ogMount "$1" "$2")" || return $? +# Comprobar que existe el directorio de comandos. +CMDDIR=$(ogGetPath "$MOUNTPOINT/windows/system32") +[ -n "$CMDDIR" ] || ogRaiseError $OG_ERR_NOTFOUND "$1/windows/system32" || return $? + +# Añadimos en el cmd que se ejecutara al arranque, el comando de ejecutar el script que añade al dominio. +ogAddCmd $1 $2 "$3" "CSCRIPT joindomain.vbs" +# Eliminamos el script porque tiene el usuario de administrador de dominio en claro +ogAddCmd $1 $2 "$3" "DEL /Q C:\Windows\System32\joindomain.vbs" +# Metemos unas claves de registro para que el dominio salga seleccionado por defecto +ogAddCmd $1 $2 "$3" "REG ADD \"HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\" /v DefaultDomainName /t REG_SZ /d \"$3\" /f" + +# Creamos el archivo joindomain.vbs que nos introduce la maquina en el dominio +cat > "$CMDDIR/joindomain.vbs" << EOF +Const JOIN_DOMAIN = 1 +Const ACCT_CREATE = 2 +Const ACCT_DELETE = 4 +Const WIN9X_UPGRADE = 16 +Const DOMAIN_JOIN_IF_JOINED = 32 +Const JOIN_UNSECURE = 64 +Const MACHINE_PASSWORD_PASSED = 128 +Const DEFERRED_SPN_SET = 256 +Const INSTALL_INVOCATION = 262144 + +strDomain = "$4" +strUser = "$5" +strPassword = "$6" + +Set objNetwork = CreateObject("WScript.Network") +strComputer = objNetwork.ComputerName + +Set objComputer = GetObject("winmgmts:{impersonationLevel=Impersonate}!\\\" & _ + strComputer & "\root\cimv2:Win32_ComputerSystem.Name='" & strComputer & "'") + +ReturnValue = objComputer.JoinDomainOrWorkGroup(strDomain, strPassword, _ + strDomain & "\" & strUser, NULL, JOIN_DOMAIN + ACCT_CREATE) +EOF +} + + +#/** +# ogInstallLinuxClient int_ndisk int_filesys +#@brief Instala el cliente OpenGnSys para sistemas operativos Linux. +#@param int_ndisk nº de orden del disco +#@param int_filesys nº de orden del sistema de archivos +#@return (nada) +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_NOTFOUND Fichero o dispositivo no encontrado. +#@exception OG_ERR_PARTITION Paritición o sistema de archivos incorrectos. +#@exception OG_ERR_LOCKED Sistema de archivos bloqueado. +#@version 1.0.4 - Primera adaptación para OpenGnSys. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2012-04-10 +#*/ ## +function ogInstallLinuxClient () +{ +# Variables locales. +local PART MNTDIR CLIENTFILE i SBINDIR ETCDIR RCLOCAL +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_filesys" \ + "$FUNCNAME 1 1" + return +fi + +# Error si no se reciben 2 parámetros. +[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $? +# Obtener sistema de archvios. +PART="$(ogDiskToDev $1 $2)" || return $? +# Comprobar si el sistema de archivos no está bloqueado. +MNTDIR=$(ogMount $1 $2) 2>/dev/null +[ -n "$MNTDIR" ] || ogRaiseError OG_ERR_PARTITION "$1, $2" || return $? +# Comprobar si existe el cliente y los directorios y ficheros destino. +CLIENTFILE=$OGLIB/ogclient/ogAdmLnxClient +[ -f $CLIENTFILE ] || ogRaiseError $OG_ERR_FOUND "$CLIENTFILE" || return $? +for i in /usr/local/sbin /sbin /usr/sbin; do + [ -d $MNTDIR/$i ] && SBINDIR=$i +done +[ -n "$SBINDIR" ] || ogRaiseError $OG_ERR_NOTFOUND "$1 $2 sbin" || return $? +for i in /usr/local/etc /etc; do + [ -d $MNTDIR/$i ] && ETCDIR=$i +done +[ -n "$ETCDIR" ] || ogRaiseError $OG_ERR_NOTFOUND "$1 $2 etc" || return $? +for i in $ETCDIR/rc.local $ETCDIR/rc.d/rc.local; do + [ -f $i ] && RCLOCAL=$i +done +[ -n "$RCLOCAL" ] || ogRaiseError $OG_ERR_NOTFOUND "$1 $2 rc.local" || return $? +# Realizar la instalación en modo uso exclusivo. +ogLock $1 $2 +trap "ogUnlock $1 $2" 1 2 3 6 9 +# Copiar cliente, generar fichero de configuración e incluir en el arranque. +cp -a $CLIENTFILE $MNTDIR/$SBINDIR +cat > $MNTDIR/$ETCDIR/ogAdmLnxClient.cfg << EOT +ServidorAdm=$(ogGetServerIp) +PUERTO=2008 +IPLOCAL=$(ogGetIpAddress) +EOT +cp -a $MNTDIR/$RCLOCAL /tmp/rclocal +awk -v sbin=$SBINDIR -v etc=$ETCDIR \ + '{ if (/^#/) { print; } + else { + if (loc==0) { + printf "%s/ogAdmLnxClient -f %s/ogAdmLnxClient.cfg &\n",sbin,etc; + loc=1; } + print; } + }' /tmp/rclocal > $MNTDIR/$RCLOCAL +rm /tmp/rclocal +ogUnlock $1 $2 +} + + +#/** +# ogInstallMiniSetup int_ndisk int_npartition str_filename [str_admuser str_admpassword bool_autologin [str_autouser str_autopassword] ] +#@brief Metafunción para instalar archivo que se ejecutará en el arranque de Windows. +#@see ogInstallFirstBoot ogInstallRunonce +#*/ ## +function ogInstallMiniSetup () +{ +case $# in + 3) # Ejecución en el primer arranque de la máquina. + ogInstallFirstBoot "$@" ;; + 6|8) # Ejecución en el "runonce". + ogInstallRunonce "$@" ;; + *) ogRaiseError $OG_ERR_FORMAT + exit $? ;; +esac +} + + +#/** +# ogInstallFirstBoot int_ndisk int_npartition str_filename +#@brief Crea unas claves del registro y el archivo cmd que se ejecutara en el primer arranque estando la maquina en un estado bloqueado +#@param int_ndisk nº de orden del disco +#@param int_npartition nº de orden de la partición +#@param str_filename nombre del archivo .cmd a ejecutar en el arranque +#@return (nada) +#@exception OG_ERR_FORMAT Formato incorrecto. +#@note El archivo estará en system32 y será visible por el sistema. +#@version 1.0.2 - Nueva función +#@author Jonathan Alonso Martinez - Universidad Autonoma de Barcelona +#@date 2011-06-29 +#@version 1.0.4 - Heredada de antigua función ogInstallMiniSetup. +#@author Jonathan Alonso Martinez - Universidad Autonoma de Barcelona +#@date 2012-04-16 +#*/ ## +function ogInstallFirstBoot () +{ +local MNTDIR DIR CMDDIR CMDFILE +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition str_filename" \ + "$FUNCNAME 1 1 filename.cmd" + return +fi +# Error si no se reciben 2 parámetros. +[ $# == 3 ] || return $(ogRaiseError $OG_ERR_FORMAT; echo $?) +# Comprobar que existe el directorio del fichero de comandos. +MNTDIR=$(ogMount "$1" "$2") || return $? +for i in winnt windows; do + DIR=$(ogGetPath $MNTDIR/$i/system32) + [ -n "$DIR" ] && CMDDIR=$DIR +done +[ -n "$CMDDIR" ] || ogRaiseError $OG_ERR_NOTFOUND "$MNTDIR/windows/system32" || return $? +CMDFILE="$CMDDIR/$2" + +# Creamos el archivo cmd y creamos un par de comandos para que una vez acabe la +# postconfiguracion resetee el mini setup, sino lo haria en cada arranque. +cat > "$CMDFILE" << EOF +REG ADD HKLM\System\Setup /v SystemSetupInProgress /t REG_DWORD /d 0 /f +REG ADD HKLM\System\Setup /v CmdLine /t REG_SZ /d "" /f +EOF + +#Creamos las claves de registro necesarias para que se haga la ejecucion del .cmd al aranque +ogSetRegistryValue "$MNTDIR" SYSTEM "\Setup\SystemSetupInProgress" 1 +ogSetRegistryValue "$MNTDIR" SYSTEM "\Setup\SetupType" 4 +ogSetRegistryValue "$MNTDIR" SYSTEM "\Setup\CmdLine" "cmd.exe /c $2" +} + + +#/** +# ogInstallRunonce int_ndisk int_npartition str_filename str_adm_user str_adm_password bool_autologin [str_auto_user str_auto_password] +#@brief Crea el archivo cmd que se ejecutara en el runonce de un usuario administrador +#@param int_ndisk nº de orden del disco +#@param int_npartition nº de orden de la partición +#@param str_filename nombre del archivo .cmd a ejecutar en el arranque (estara en system32 y sera visible por el sistema) +#@param str_adm_user usuario administrador para hacer autologin y ejecutar el runonce +#@param str_adm_password password del usuario administrador +#@param bool_autologin si despues de la postconfiguracion queremos que la maquina haga autologin (0 o 1) +#@param str_auto_user Usuario con el que queremos que haga autologin despues de la postconfiguracion +#@param str_auto_password Password del usuario que hara autologin +#@return (nada) +#@exception OG_ERR_FORMAT Formato incorrecto. +#@version 1.0.2 - Nueva función +#@author Jonathan Alonso Martinez - Universidad Autonoma de Barcelona +#@date 2011-06-29 +#@version 1.0.4 - Heredado de antigua función ogInstallMiniSetup +#@author Jonathan Alonso Martinez - Universidad Autonoma de Barcelona +#@date 2012-04-16 +#*/ ## +function ogInstallRunonce () +{ +local MOUNTPOINT DIR CMDDIR CMDFILE +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition str_filename str_adm_user str_adm_password bool_autologin [str_auto_user str_auto_password]" \ + "$FUNCNAME 1 1 filename.cmd administrator passadmin 1 userauto passuserauto" \ + "$FUNCNAME 1 1 filename.cmd administrator passadmin 0" + return +fi +# Error si no se reciben 6 u 8 parámetros. +[ $# == 6 -o $# == 8 ] || return $(ogRaiseError $OG_ERR_FORMAT; echo $?) +# Punto de montaje. +MOUNTPOINT="$(ogGetPath "$1" "$2" /)" +# Comprobar que existe el directorio del fichero de comandos. +for i in winnt windows; do + DIR=$(ogGetPath $MOUNTPOINT/$i/system32) + [ -n "$DIR" ] && CMDDIR=$DIR +done +[ -n "$CMDDIR" ] || ogRaiseError $OG_ERR_NOTFOUND "$MOUNTPOINT/Windows/System32" || return $? +CMDFILE="$CMDDIR/$3" + +if [ $6 == 0 ]; then + # Si no volem fer autologin despres de la postconfiguracio o indiquem a las claus de registre + cat > "$CMDFILE" << EOF +DEL C:\ogboot.* +REG ADD "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v AutoAdminLogon /t REG_SZ /d 0 /f +REG ADD "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v DefaultUserName /t REG_SZ /d "" /f +REG DELETE "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v DefaultPassword /f +EOF +else + # Si volem fer autologin despres de la postconfiguracio introduim l'informacio a les claus de registre + cat > "$CMDFILE" << EOF +DEL C:\ogboot.* +REG ADD "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v AutoAdminLogon /t REG_SZ /d 1 /f +REG ADD "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v DefaultUserName /t REG_SZ /d "$7" /f +REG ADD "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v DefaultPassword /t REG_SZ /d "$8" /f +EOF +fi +#Creamos las claves de registro necesarias para que meter el cmd en el runonce del usuario y este haga autologin +ogAddRegistryValue $MOUNTPOINT software '\Microsoft\Windows\CurrentVersion\RunOnce\PostConfiguracion' 2>/dev/null +ogSetRegistryValue $MOUNTPOINT software '\Microsoft\Windows\CurrentVersion\RunOnce\PostConfiguracion' "C:\windows\system32\\$3" 2>/dev/null +ogSetRegistryValue $MOUNTPOINT software '\Microsoft\Windows NT\CurrentVersion\Winlogon\AutoAdminLogon' 1 2>/dev/null +ogSetRegistryValue $MOUNTPOINT software '\Microsoft\Windows NT\CurrentVersion\Winlogon\DefaultUserName' "$4" 2>/dev/null +ogAddRegistryValue $MOUNTPOINT software '\Microsoft\Windows NT\CurrentVersion\Winlogon\DefaultPassword' 2>/dev/null +ogSetRegistryValue $MOUNTPOINT software '\Microsoft\Windows NT\CurrentVersion\Winlogon\DefaultPassword' "$5" 2>/dev/null +} + + +#/** +# ogInstallWindowsClient int_ndisk int_filesys +#@brief Instala el cliente OpenGnSys para sistemas operativos Windows. +#@param int_ndisk nº de orden del disco +#@param int_filesys nº de orden del sistema de archivos +#@return (nada) +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_NOTFOUND Fichero o dispositivo no encontrado. +#@exception OG_ERR_PARTITION Paritición o sistema de archivos incorrectos. +#@exception OG_ERR_LOCKED Sistema de archivos bloqueado. +#@version 1.0.4 - Primera adaptación para OpenGnSys. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2012-04-11 +#*/ ## +function ogInstallWindowsClient () +{ +# Variables locales. +local PART MNTDIR CLIENTFILE i SBINDIR ETCDIR RCLOCAL +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_filesys" \ + return +fi + +# Error si no se reciben 2 parámetros. +[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $? +# Obtener sistema de archvios. +PART="$(ogDiskToDev $1 $2)" || return $? +# Comprobar si el sistema de archivos no está bloqueado. +MNTDIR=$(ogMount $1 $2) 2>/dev/null +[ -n "$MNTDIR" ] || ogRaiseError OG_ERR_PARTITION "$1, $2" || return $? +# Comprobar si existe el cliente y los directorios y ficheros destino. +CLIENTFILE=$OGLIB/ogclient/ogAdmWinClient.exe +[ -f $CLIENTFILE ] || ogRaiseError $OG_ERR_FOUND "$CLIENTFILE" || return $? +for i in winnt windows; do + DIR=$(ogGetPath $MNTDIR/$i) + [ -n "$DIR" ] && WINDIR=$DIR +done +[ -n "$WINDIR " ] || ogRaiseError $OG_ERR_NOTFOUND "$1 $2 windows" || return $? +# Realizar la instalación en modo uso exclusivo. +ogLock $1 $2 +trap "ogUnlock $1 $2" 1 2 3 6 9 +# Copiar cliente, generar fichero de configuración e incluir en el arranque. +cp -a $CLIENTFILE "$WINDIR" +ogInstallMiniSetup $1 $2 ogclient.cmd +ogAddCmd $1 $2 ogclient.cmd "ogAdmWinClient -install -s $(ogGetServerIp) -p 2008 -i $(ogGetIpAddress)" +ogUnlock $1 $2 +} + diff --git a/client/engine/PostConfEAC.lib b/client/engine/PostConfEAC.lib index 33667f47..d950319b 100755 --- a/client/engine/PostConfEAC.lib +++ b/client/engine/PostConfEAC.lib @@ -601,144 +601,3 @@ schroot -c linux schroot -end-sessiona --all-sessions } -#################################################################################### -################### Funciones para postconfiguracion windows ####################### -############# 2011 Jonathan Alonso Martinez jonathan.alonso@uab.cat ############### -#################### Universidad Autonoma de Barcelona (Spain)###################### -#################################################################################### - -#/** -# ogInstallMiniSetup path_mountpoint str_filename -#@brief Crea unas claves del registro y el archivo cmd que se ejecutara en el primer arranque estando la maquina en un estado bloqueado -#@param path_mountpoint directorio donde está montado el sistema Windows -#@param str_filename nombre del archivo .cmd a ejecutar en el arranque (estara en system32 y sera visible por el sistema) -#@return (nada) -#@exception OG_ERR_FORMAT Formato incorrecto. -#@version 1.0.2 - Nueva función -#@author Jonathan Alonso Martinez - Universidad Autonoma de Barcelona -#@date 2011-06-29 -#*/ ## -function ogInstallMiniSetup () -{ -local CMDDIR CMDFILE -# Si se solicita, mostrar ayuda. -if [ "$*" == "help" ]; then - ogHelp "$FUNCNAME" "$FUNCNAME path_mountpoint str_filename" \ - "$FUNCNAME /mnt/sda1 filename.cmd" - return -fi -# Error si no se reciben 2 parámetros. -[ $# == 2 ] || return $(ogRaiseError $OG_ERR_FORMAT; echo $?) -# Comprobar que existe el directorio del fichero de comandos. -CMDDIR=$(ogGetPath "$1/windows/system32") -[ -n "$CMDDIR" ] || ogRaiseError $OG_ERR_NOTFOUND "$1/windows/system32" || return $? -CMDFILE="$CMDDIR/$2" - -# Creamos el archivo cmd y creamos un par de comandos para que una vez acabe la -# postconfiguracion resetee el mini setup, sino lo haria en cada arranque. -cat > "$CMDFILE" << EOF -REG ADD HKLM\System\Setup /v SystemSetupInProgress /t REG_DWORD /d 0 /f -REG ADD HKLM\System\Setup /v CmdLine /t REG_SZ /d "" /f -EOF - -#Creamos las claves de registro necesarias para que se haga la ejecucion del .cmd al aranque -ogSetRegistryValue "$1" SYSTEM "\Setup\SystemSetupInProgress" 1 -ogSetRegistryValue "$1" SYSTEM "\Setup\SetupType" 4 -ogSetRegistryValue "$1" SYSTEM "\Setup\CmdLine" "cmd.exe /c $2" -} - - -# ogAddCmd path_mountpoint str_filename str_commands -#@brief Añade comandos al cmd creado por ogInstalMiniSetup -#@param path_mountpoint directorio donde está montado el sistema Windows -#@param str_filename nombre del fichero cmd (siempre se guardara en windows\system32\para que sea visible por el sistema -#@param str_commands comando o comandos que se añadiran al fichero -#@return -#@exception OG_ERR_FORMAT Formato incorrecto. -#@exception OG_ERR_PARTITION Tipo de partición desconocido o no se puede montar. -#@version 1.0.2 - Nueva función -#@author Jonathan Alonso Martinez - Universidad Autonoma de Barcelona -#@date 2011-06-29 -#*/ ## - -function ogAddCmd () -{ -local CMDFILE -# Si se solicita, mostrar ayuda. -if [ "$*" == "help" ]; then - ogHelp "$FUNCNAME" "$FUNCNAME path_mountpoint str_filename str_commands" \ - "$FUNCNAME /mnt/sda1 filename.cmd command" - return -fi -# Error si no se reciben 3 parámetros. -[ $# == 3 ] || return $(ogRaiseError $OG_ERR_FORMAT; echo $?) -# Comprobar que existe el fichero de comandos. -CMDFILE=$(ogGetPath "$1/windows/system32/$2") -[ -n "$CMDFILE" ] || ogRaiseError $OG_ERR_NOTFOUND "$1/windows/system32/$2" || return $? - -cat >> "$CMDFILE" << EOF -$3 -EOF -} - -# ogDomainScript path_mountpoint str_domain str_user str_password -#@brief Crea un script .vbs para unir al dominio una maquina windows y el comando adequado en el archivo cmd creado por ogInstallMiniSetup -#@param path_mountpoint directorio donde está montado el sistema Windows -#@param str_filename nombre del fichero cmd donde deberemos introducir el comando de ejecutar el script vbs -#@param str_domain Dominio donde se quiere conectar -#@param str_user Usuario con privilegios para unir al dominio -#@param str_password Password del usuario con privilegios -#@return -#@exception OG_ERR_FORMAT Formato incorrecto. -#@version 1.0.2 - Nueva función -#@author Jonathan Alonso Martinez - Universidad Autonoma de Barcelona -#@date 2011-06-29 -#*/ ## - -function ogDomainScript () -{ -local CMDDIR -# Si se solicita, mostrar ayuda. -if [ "$*" == "help" ]; then - ogHelp "$FUNCNAME" "$FUNCNAME path_mountpoint str_filename str_domain str_user str_password" \ - "$FUNCNAME /mnt/sda1 filename.cmd domain user password_user" - return -fi -# Error si no se reciben 4 parámetros. -[ $# == 5 ] || return $(ogRaiseError $OG_ERR_FORMAT; echo $?) -# Comprobar que existe el directorio de comandos. -CMDDIR=$(ogGetPath "$1/windows/system32") -[ -n "$CMDDIR" ] || ogRaiseError $OG_ERR_NOTFOUND "$1/windows/system32" || return $? - -# Añadimos en el cmd que se ejecutara al arranque, el comando de ejecutar el script que añade al dominio. -ogAddCmd $1 "$2" "CSCRIPT joindomain.vbs" -# Eliminamos el script porque tiene el usuario de administrador de dominio en claro -ogAddCmd $1 "$2" "del /Q C:\Windows\System32\joindomain.vbs" - -# Creamos el archivo joindomain.vbs que nos introduce la maquina en el dominio -cat > "$CMDDIR/joindomain.vbs" << EOF -Const JOIN_DOMAIN = 1 -Const ACCT_CREATE = 2 -Const ACCT_DELETE = 4 -Const WIN9X_UPGRADE = 16 -Const DOMAIN_JOIN_IF_JOINED = 32 -Const JOIN_UNSECURE = 64 -Const MACHINE_PASSWORD_PASSED = 128 -Const DEFERRED_SPN_SET = 256 -Const INSTALL_INVOCATION = 262144 - -strDomain = "$3" -strUser = "$4" -strPassword = "$5" - -Set objNetwork = CreateObject("WScript.Network") -strComputer = objNetwork.ComputerName - -Set objComputer = GetObject("winmgmts:{impersonationLevel=Impersonate}!\\\" & _ - strComputer & "\root\cimv2:Win32_ComputerSystem.Name='" & strComputer & "'") - -ReturnValue = objComputer.JoinDomainOrWorkGroup(strDomain, strPassword, _ - strDomain & "\" & strUser, NULL, JOIN_DOMAIN + ACCT_CREATE) -EOF -} - diff --git a/client/engine/Protocol.lib b/client/engine/Protocol.lib index 5fe2bc74..102ed1c7 100755 --- a/client/engine/Protocol.lib +++ b/client/engine/Protocol.lib @@ -382,14 +382,14 @@ OIFS=$IFS; IFS=':' ; SESSION=($2); IFS=$OIFS #controlamos el PORTBASE de la sesion. Comun.- PORTBASE=${SESSION[0]} -ogCheckStringInGroup ${SESSION[0]} "9000 9002 9004 9006 9008 9010" || ogRaiseError $OG_ERR_FORMAT "McastSession portbase ${SESSION[0]}" || PERROR=3 #return $? +ogCheckStringInGroup ${SESSION[0]} "$(seq 9000 2 9050)" || ogRaiseError $OG_ERR_FORMAT "McastSession portbase ${SESSION[0]}" || PERROR=3 #return $? if [ $MODE == "server" ] then ogCheckStringInGroup ${SESSION[1]} "full-duplex FULL-DUPLEX half-duplex HALF-DUPLEX broadcast BROADCAST" || ogRaiseError $OG_ERR_FORMAT "McastSession method ${SESSION[1]}" || PERROR=4 #return $? METHOD=${SESSION[1]} ogCheckIpAddress ${SESSION[2]} || ogRaiseError $OG_ERR_FORMAT "McastSession address ${SESSION[2]}" || PERROR=5 #return $? ADDRESS=${SESSION[2]} - ogCheckStringInReg ${SESSION[3]} "^[0-9]{1,2}\M$" || ogRaiseError $OG_ERR_FORMAT "McastSession bitrate ${SESSION[3]}" || PERROR=6 # return $? + ogCheckStringInReg ${SESSION[3]} "^[0-9]{1,3}\M$" || ogRaiseError $OG_ERR_FORMAT "McastSession bitrate ${SESSION[3]}" || PERROR=6 # return $? BITRATE=${SESSION[3]} ogCheckStringInReg ${SESSION[4]} "^[0-9]{1,10}$" || ogRaiseError $OG_ERR_FORMAT "McastSession nclients ${SESSION[4]}" || PERROR=7 # return $? NCLIENTS=${SESSION[4]} @@ -846,11 +846,11 @@ 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 + ctorrent -f -X "sleep $TIME; 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" - ctorrent ${SOURCE} -X "sleep $TIME; kill -2 \$(pidof ctorrent)" -C 100 -U 0 + echo "Donwloading Torrent as leecher" # echo "ctorrent ${SOURCE} -X 'sleep 30; kill -9 \$(pidof ctorrent)' -C 100 -U 0" + ctorrent ${SOURCE} -X "sleep 30; kill -2 \$(pidof ctorrent)" -C 100 -U 0 ;; seeder|SEEDER) echo "MODE seeder ctorrent" #### ${SOURCE} -X 'sleep $TIME; kill -9 \$(pidof ctorrent)' -C 100" @@ -998,21 +998,12 @@ fi #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" MD5SOURCE=$(cat $FILESOURCE.sum) else - # 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" - MD5TARGET=$(cat $FILETARGET.sum) -else - #echo "calculando el sum de la cache" - md5sum $FILETARGET | cut -f1 -d" " > $FILETARGET.sum - MD5TARGET=$(cat $FILETARGET.sum) + MD5SOURCE=$(ogCalculateChecksum $FILESOURCE) fi +[ ! -f $FILETARGET.sum ] && ogCalculateChecksum $FILETARGET > $FILETARGET.sum +MD5TARGET=$(cat $FILETARGET.sum) #echo "Paso 5. comparamos los md5" #TODO: que hacer cuando los md5 son distintos. Por defecto borrar. diff --git a/client/engine/README.es.txt b/client/engine/README.es.txt index 9fc6862b..c2b90b4b 100644 --- a/client/engine/README.es.txt +++ b/client/engine/README.es.txt @@ -1,9 +1,9 @@ -OpenGNSys Client Cloning Engine README +OpenGnSys Client Cloning Engine README ======================================= En este directorio se incluirán las funciones del motor de -clonación de OpenGNSys y la documentación asociada. +clonación de OpenGnSys y la documentación asociada. Este directorio estará localizado en el directorio del servidor /opt/opengnsys/client/lib/engine/bin @@ -11,8 +11,8 @@ Este directorio estará localizado en el directorio del servidor Las funciones serán accesibles por el cliente en el directorio /opt/opengnsys/lib/engine/bin -OpenGNSys Client Cloning Engine se distribuye en un conjunto -de librerías que incluyen funciones BASH que deben ser exportadas +OpenGnSys Client Cloning Engine se distribuye en un conjunto de +librerías que incluyen funciones BASH que deben ser exportadas al entorno del cliente. Librerías: @@ -27,7 +27,10 @@ Librerías: 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. +- Postconf.lib funciones de post-configuración de sistemas + operativos. +- Protocol.lib funciones de implementación de protocolos de + comunicaciones. +- Registry.lib funciones de gestión del registro de Windows. - System.lib funciones básicas del sistema. diff --git a/client/engine/System.lib b/client/engine/System.lib index 0d060f29..ed6f24b6 100755 --- a/client/engine/System.lib +++ b/client/engine/System.lib @@ -4,7 +4,7 @@ #@brief Librería o clase System #@class System #@brief Funciones básicas del sistema. -#@version 0.9 +#@version 1.0.4 #@warning License: GNU GPLv3+ #*/ @@ -24,7 +24,7 @@ function ogEcho () { # Variables locales -local LOGLEVEL LOGFILE DATETIME +local LOGLEVEL DATETIME # Selección del nivel de registro (opcional). case "$1" in @@ -37,7 +37,7 @@ esac DATETIME=$(date +"%F %T") if [ -n "$LOGLEVEL" ]; then - logger -s -t "OpenGnSys $LOGLEVEL" -f $LOGFILE "$DATETIME $*" + logger -s -t "OpenGnSys $LOGLEVEL" -f $OGLOGFILE "$DATETIME $*" logger -t "OpenGnSys $LOGLEVEL" -f $OGLOGCOMMAND "$DATETIME $*" logger -t "OpenGnSys $LOGLEVEL" -f $OGLOGSESSION "$DATETIME $*" else @@ -72,6 +72,7 @@ case "$CODE" in $OG_ERR_PARTITION) MSG="$MSG_ERR_PARTITION \"$2\"" ;; $OG_ERR_LOCKED) MSG="$MSG_ERR_LOCKED \"$2\"" ;; $OG_ERR_CACHE) MSG="$MSG_ERR_CACHE \"$2\"" ;; + $OG_ERR_NOGPT) MSG="$MSG_ERR_NOGPT \"$2\"" ;; $OG_ERR_FILESYS) MSG="$MSG_ERR_FILESYS \"$2\"" ;; $OG_ERR_IMAGE) MSG="$MSG_ERR_IMAGE \"$2\"" ;; $OG_ERR_NOTOS) MSG="$MSG_ERR_NOTOS \"$2\"" ;; @@ -92,7 +93,7 @@ case "$CODE" in $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\"" ;; + $OG_ERR_PROTOCOLJOINMASTER) MSG="$MSG_ERR_PROTOCOLJOINMASTER \"$2\"" ;; *) MSG="$MSG_ERR_GENERIC"; CODE=$OG_ERR_GENERIC ;; esac diff --git a/client/shared/etc/engine.cfg b/client/shared/etc/engine.cfg index 1bf98b5d..59b4a5b6 100644 --- a/client/shared/etc/engine.cfg +++ b/client/shared/etc/engine.cfg @@ -3,13 +3,14 @@ OGENGINECONFIGURATE="TRUE" OGLOGSESSION="/tmp/session.log" OGLOGCOMMAND="/tmp/command.log" -#Definicion PostConfiguracion OS WIndows +##Configuracion de la PostConfiguracion OS WIndows +#Hacer chkdisk tras la clonacion OGWINCHKDISK=TRUE -#interface restauracion -#Que hacer cuando la cache no tenga espacio libre. [ NONE] -- en desarrollo -> |DELETE|FORMAT] +#Configuracion de interface restauracion +#Que hacer cuando la cache no tenga espacio libre. [ NONE | FORMAT ] ] ACTIONCACHEFULL=NONE -# Definimos el protocolo a usar en el caso de que no exita cache o no haya espacio sufiencie. +# Protocolo a usar en el caso de que no exita cache o no haya espacio sufiencie. RESTOREPROTOCOLNOCACHE=UNICAST #script Creacion imagen @@ -18,5 +19,6 @@ IMGCOMP="lzop" IMGEXT="img" IMGREDUCE="TRUE" -#scripts Clonacion remota usando master +#Configuracion del asistente de Clonacion remota usando master +#Al enviar particion reducir el sistema de archivos previamente. OGWINREDUCE=TRUE
\ No newline at end of file diff --git a/client/shared/etc/lang.es_ES.conf b/client/shared/etc/lang.es_ES.conf index 93e2503c..8510381c 100644 --- a/client/shared/etc/lang.es_ES.conf +++ b/client/shared/etc/lang.es_ES.conf @@ -8,6 +8,7 @@ MSG_ERR_NOTFOUND="Fichero o dispositivo no encontrado" MSG_ERR_PARTITION="Partición errónea o desconocida" MSG_ERR_LOCKED="Recurso bloqueado por operación de uso exclusivo" MSG_ERR_CACHE="Error en partición de caché local" +MSG_ERR_NOGPT="El disco indicado no contiene una particion GPT" MSG_ERR_FILESYS="Sistema de archivos desconocido o no se puede montar" MSG_ERR_NOTOS="Sistema operativo no instalado o no detectado" MSG_ERR_IMAGE="No se puede crear o restaurar una image de sistema" @@ -68,6 +69,7 @@ MSG_ERRLOADUDEB="$MSG_ERROR: No se puede cargar el paquete udeb %s." MSG_LOADUDEBS="Cargar paquetes udeb." # Mensajes de descripción breve de las funciones de la API. +MSG_HELP_ogAddCmd="Añade comandos al fichero creado por la función ogInstalMiniSetup." 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." @@ -79,6 +81,8 @@ MSG_HELP_ogCreateCache="Reserva espacio para la partición de caché al final de MSG_HELP_ogCreateImage="Genera una imagen exacta de un sistema operativo instalado localmente." MSG_HELP_ogCreateMbrImage="Genera una imagen del sector de arranque (MBR)." MSG_HELP_ogCreatePartitions="Define la estructura de particiones de un disco." +MSG_HELP_ogCreatePartitionTable="Genera una tabla de particiones en caso de que no sea valida." +MSG_HELP_ogDeleteCache="Elimina la partición de caché local." MSG_HELP_ogDeleteFile="Borra un fichero de un espacio de almacenamiento." MSG_HELP_ogDeletePartitionTable="Elimina la tabla de particiones del disco" MSG_HELP_ogDeleteRegistryKey="Borra una clave vacía del registro de Windows." @@ -95,20 +99,25 @@ 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_ogGetDiskSize="Devuelve el tamaño del disco." 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_ogGetGroupDir="Devuelve el cmaino del directorio por defecto para el grupo del cliente." +MSG_HELP_ogGetGroupName="Devuelve el nombre del grupo al que pertenece el cliente." 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." +MSG_HELP_ogGetLastSector="Devuelve el último sector usable del disco o de una partición." MSG_HELP_ogGetMacAddress="Devuelve la dirección Ethernet del cliente." MSG_HELP_ogGetMountPoint="Devuelve el directorio donde está montado un sistema de archivos local." MSG_HELP_ogGetOsType="Devuelve el tipo de un sistema operativo instalado." MSG_HELP_ogGetOsVersion="Devuelve el tipo y la versión de un sistema operativo instalado." -MSG_HELP_ogGetParentPath=$"Devuelve el camino completo del directorio padre de un fichero de sistema OpenGnSys." +MSG_HELP_ogGetParentPath="Devuelve el camino completo del directorio padre de un fichero de sistema OpenGnSys." MSG_HELP_ogGetPartitionActive="Indica cual es la partición marcada como activa en un disco." MSG_HELP_ogGetPartitionId="Devuelve el identificador de tipo de una partición." MSG_HELP_ogGetPartitionSize="Devuelve el tamaño de una partición." +MSG_HELP_ogGetPartitionTableType="Devuelve el tipo de tabla de particiones del disco" 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." @@ -118,6 +127,9 @@ MSG_HELP_ogGetWindowsName="Devuelve el nombre del cliente guardado en el registr 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_ogInstallLinuxClient="Instala el cliente OpenGnSys en un sistema operativo GNU/Linux." +MSG_HELP_ogInstallMiniSetup="Instala un archivo que se ejecutará en el arranque de Windows." +MSG_HELP_ogInstallWindowsClient="Instala el cliente OpenGnSys en un sistema operativo Window." 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." @@ -163,10 +175,10 @@ MSG_HELP_ogUpdatePartitionTable="Actualiza informacion tabla particiones del dis # Mensajes de descripción breve de la interfaz. -MSG_INTERFACE_START="[START Interface ] Ejecutar comando: " +MSG_INTERFACE_START="[START Interface] Ejecutar comando: " MSG_INTERFACE_END="[END Interface] Comando terminado con este código: " -# SCRIPTS messages. +# Mensajes de scripts. MSG_SCRIPTS_START=" INICIO scripts : " MSG_SCRIPTS_END=" FIN scripts: " @@ -174,11 +186,11 @@ MSG_SCRIPTS_TASK_SLEEP="Esperando para iniciar" MSG_SCRIPTS_TASK_START="Iniciando" MSG_SCRIPTS_TASK_ERR="Error" -# scripts createImage +# Script createImage. MSG_SCRIPTS_FILE_RENAME=" Renombrar fichero-imagen previo: " MSG_SCRIPTS_CREATE_SIZE=" Calcular espacio (KB) requerido para almacenarlo y el disponible: " -#scripts updateCache +# Script updateCache. MSG_SCRIPTS_UPDATECACHE_DOUPDATE="Comprobamos si Actualizacion - existe una imagen con igual nombre pero distinto sum-" MSG_SCRIPTS_UPDATECACHE_CHECKSIZECACHE="Comprobar que el tamaño de la cache es mayor que el fichero a descargar." MSG_SCRIPTS_UPDATECACHE_IFNOTCACHEDO="Comprobar el espacio libre de la cache y actuar según engine.cfg" @@ -196,5 +208,6 @@ MSG_SCRIPTS_OS_CONFIGURE="Iniciar la configuracion del sistema restaurado" MSG_SCRIPTS_TIME_TOTAL="tiempo total del proceso" MSG_SCRIPTS_TIME_PARTIAL="tiempo parcial del subproceso" -#HTTPLOG -MSG_HTTPLOG_NOUSE="No apague este ordenador por favor"
\ No newline at end of file +# HTTPLOG +MSG_HTTPLOG_NOUSE="No apague este ordenador por favor" + diff --git a/client/shared/etc/preinit/fileslinks.sh b/client/shared/etc/preinit/fileslinks.sh index 7089ce46..ddea1198 100755 --- a/client/shared/etc/preinit/fileslinks.sh +++ b/client/shared/etc/preinit/fileslinks.sh @@ -20,7 +20,11 @@ if [ -n "$OPENGNSYS" ]; then ln -fs /bin/bash /bin/sh # Crear directorio de bloqueos - mkdir -p /var/lock || mkdir -p /run/lock + mkdir -p /var/lock 2>/dev/null || mkdir -p /run/lock + + # Crear ficheros temporales. + touch $OGLOGCOMMAND $OGLOGCOMMAND.tmp $OGLOGSESSION /tmp/menu.tmp + chmod 777 $OGLOGCOMMAND $OGLOGCOMMAND.tmp $OGLOGSESSION /tmp/menu.tmp # # Directorio de tipos de letras para el browser. QTDIR="/usr/local" diff --git a/client/shared/etc/preinit/loadenviron.sh b/client/shared/etc/preinit/loadenviron.sh index 1260c973..1aa248d4 100755 --- a/client/shared/etc/preinit/loadenviron.sh +++ b/client/shared/etc/preinit/loadenviron.sh @@ -60,6 +60,8 @@ if [ -d $OPENGNSYS ]; then # Cargar configuración del engine. [ -f ${OGETC}/engine.cfg ] && source ${OGETC}/engine.cfg + export OGLOGCOMMAND=${OGLOGCOMMAND:-/tmp/command.log} + export OGLOGSESSION=${OGLOGSESSION:-/tmp/session.log} # Cargar las APIs según engine. if [ -n "$ogengine" ]; then diff --git a/client/shared/lib/httpd/LogCommand.sh b/client/shared/lib/httpd/LogCommand.sh index 9a116f7c..9a116f7c 100644..100755 --- a/client/shared/lib/httpd/LogCommand.sh +++ b/client/shared/lib/httpd/LogCommand.sh diff --git a/client/shared/lib/httpd/LogSession.sh b/client/shared/lib/httpd/LogSession.sh index a5d18e68..a5d18e68 100644..100755 --- a/client/shared/lib/httpd/LogSession.sh +++ b/client/shared/lib/httpd/LogSession.sh diff --git a/client/shared/lib/httpd/bandwidth.sh b/client/shared/lib/httpd/bandwidth.sh index 9e7833c3..9e7833c3 100644..100755 --- a/client/shared/lib/httpd/bandwidth.sh +++ b/client/shared/lib/httpd/bandwidth.sh diff --git a/client/shared/lib/httpd/cache.sh b/client/shared/lib/httpd/cache.sh new file mode 100755 index 00000000..a2e40093 --- /dev/null +++ b/client/shared/lib/httpd/cache.sh @@ -0,0 +1,22 @@ +#!/bin/bash +echo "Content-type: text/html" +echo "" +echo "<html><head> <meta http-equiv='Refresh' content='5,URL=./cache.sh'> <title>Listado de la Cache" +echo "</title>" +echo "<style type='text/css'>" +echo "<!--" +echo "TEXTAREA {" +echo "background-color: navy;" +echo "border: black 2px solid;" +echo "color: white;" +echo "font-family: arial, verdana, ms sans serif;" +echo "font-size: 8pt;" +echo "font-weight: normal" +echo "} " +echo "-->" +echo "</style>" +echo "</head><body>" +echo "<TEXTAREA NAME='contenido' ROWS='30' COLS='150' >" +echo "$(ls -lh /opt/opengnsys/cache/opt/opengnsys/images )" +echo "</TEXTAREA>" +echo "</body></html>"
\ No newline at end of file diff --git a/client/shared/lib/httpd/httpd-log.sh b/client/shared/lib/httpd/httpd-log.sh index ae76b5fe..58ee6ec6 100644..100755 --- a/client/shared/lib/httpd/httpd-log.sh +++ b/client/shared/lib/httpd/httpd-log.sh @@ -8,7 +8,7 @@ echo "<html><head><title>OpenGnsys Client</title></head><body>" echo "<h1> $(./httpd-runengine.sh 'ogEcho $MSG_HTTPLOG_NOUSE' ) . host $(hostname -s)</h1> " echo "<IFRAME SRC='bandwidth.sh' WIDTH=250 HEIGHT=80> <A HREF="bandwidth.sh">link</A> </IFRAME> " - +echo "<IFRAME SRC='cache.sh' WIDTH=590 HEIGHT=90><A HREF="cache.sh">link</a> </IFRAME><br>" echo "<IFRAME SRC='LogSession.sh' WIDTH=850 HEIGHT=230> <A HREF="LogSession.sh">link</A> </IFRAME>" echo "<IFRAME SRC='LogCommand.sh' WIDTH=850 HEIGHT=250> <A HREF="LogCommand.sh">link</A> </IFRAME>" diff --git a/client/shared/lib/httpd/httpd-menu.sh b/client/shared/lib/httpd/httpd-menu.sh index c5e58364..c5e58364 100644..100755 --- a/client/shared/lib/httpd/httpd-menu.sh +++ b/client/shared/lib/httpd/httpd-menu.sh diff --git a/client/shared/lib/httpd/lighttpd.conf b/client/shared/lib/httpd/lighttpd.conf index 7a11040b..7a11040b 100755..100644 --- a/client/shared/lib/httpd/lighttpd.conf +++ b/client/shared/lib/httpd/lighttpd.conf diff --git a/client/shared/lib/ogclient/ogAdmLnxClient b/client/shared/lib/ogclient/ogAdmLnxClient Binary files differnew file mode 100755 index 00000000..cd34d121 --- /dev/null +++ b/client/shared/lib/ogclient/ogAdmLnxClient diff --git a/client/shared/lib/ogclient/ogAdmWinClient.exe b/client/shared/lib/ogclient/ogAdmWinClient.exe Binary files differnew file mode 100644 index 00000000..56f1899d --- /dev/null +++ b/client/shared/lib/ogclient/ogAdmWinClient.exe diff --git a/client/shared/scripts/configureOs b/client/shared/scripts/configureOs index 06745748..b0ab3d33 100755 --- a/client/shared/scripts/configureOs +++ b/client/shared/scripts/configureOs @@ -1,9 +1,8 @@ #!/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). +# configureOs +#@brief Scirpt para realizar la configuracion del sistema operativo restaurado. #@param 1 disco #@param 2 particion #@return @@ -21,39 +20,51 @@ #@version 1.0.3 - Configura el chkdisk en el arranque de windows, segun variable OGWINCHKDISK del engine.cfg. #@author Antonio J. Doblas Viso. Universidad de Malaga. #@date 2011-12-23 +#@version 1.0.4 - Inyecta el cliente para gestión del sistema operativo. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2012-04-11 -#Carga del configurador del engine +# Carga el configurador del engine y los parámetros de red. [ -z $OGENGINECONFIGURATE ] && source /opt/opengnsys/etc/engine.cfg +[ -f $DEVICECFG ] && source $DEVICECFG -# Si el sistema de archivos no esta extendido. Realizar. -PARTSIZE=$(ogGetPartitionSize $1 $2) +# Si el sistema de archivos no esta extendido, ampliarlo al tamaño de su partición. +PARTSIZE=$(ogGetPartitionSize $1 $2) || exit $? 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. +# Si no existe partición 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 - # Cambiar nombre en sistemas Windows. - HOST=$(ogGetHostname) - HOST=${HOST:-"pc"} - ogSetWindowsName $1 $2 "$HOST" - # Descomentar la siguiente línea para cambiar usuario de inicio. - #ogSetWinlogonUser $1 $2 " " - # Configurar el boot sector de la partición Windows. - ogFixBootSector $1 $2 - # Configurar el gestor de arranque de Windows XP/Vista/7. - ogWindowsBootParameters $1 $2 - # Registrar en Windows que la partición indicada es su nueva unidad C:\ - ogWindowsRegisterPartition $1 $2 C $1 $2 - ogLoadHiveWindows $1 $2; ogSetWindowsChkdisk $OGWINCHKDISK; ogUpdateHiveWindows -fi +# Post-configuración personalizada para cada tipo de sistema operativo. +OSTYPE="$(ogGetOsType $1 $2)" +case "$OSTYPE" in + Windows) + # Cambiar nombre en sistemas Windows. + HOST=$(ogGetHostname) + HOST=${HOST:-"pc"} + ogSetWindowsName $1 $2 "$HOST" + # Descomentar la siguiente línea para cambiar usuario de inicio. + #ogSetWinlogonUser $1 $2 " " + # Configurar el boot sector de la partición Windows. + ogFixBootSector $1 $2 + # Configurar el gestor de arranque de Windows XP/Vista/7. + ogWindowsBootParameters $1 $2 + # Registrar en Windows que la partición indicada es su nueva unidad C:\ + ogWindowsRegisterPartition $1 $2 C $1 $2 + ogLoadHiveWindows $1 $2; ogSetWindowsChkdisk $OGWINCHKDISK; ogUpdateHiveWindows + # Instalar cliente para Windows. + ogInstallWindowsClient $1 $2 + ;; + Linux) + ## Install and Configure Grub based on OS installed and Grub 1st stage location. + ogGrubInstallPartition $1 $2 + # Instalar cliente para Linux. + ogInstallLinuxClient $1 $2 + ;; +esac -if [ "$(ogGetOsType $1 $2)" = "Linux" ]; then - ogGrubInstallPartition $1 $2 -fi
\ No newline at end of file diff --git a/client/shared/scripts/generateMenuDefault b/client/shared/scripts/generateMenuDefault index 0437cd3d..404de375 100755 --- a/client/shared/scripts/generateMenuDefault +++ b/client/shared/scripts/generateMenuDefault @@ -1,30 +1,48 @@ #ª/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}') +FILEINFOHTML=$OGLOG/`ogGetIpAddress`.info.html +FILEINFOCACHE=$OGLOG/`ogGetIpAddress`.cache.txt +ogMountCache 2>/dev/null +CACHECONTENIDO=`ls -m $OGCAC/$OGIMG 2>/dev/null` + +SPEED=$(LANG=C ethtool $DEVICE 2>/dev/null | awk '$1~/Speed/ {print $2}') +case "$SPEED" in + 1000[Mm]b/s) ;; + 100[Mm]b/s) SPEED="<font color=\"blue\">$SPEED</font>" ;; + 10[Mm]b/s) SPEED="<font color=\"grey\">$SPEED</font>" ;; + *) SPEED="<font color=\"red\">$SPEED</font>" ;; +esac +DUPLEX=$(LANG=C ethtool $DEVICE 2>/dev/null | awk '$1~/Duplex/ {print $2}') +case "$DUPLEX" in + [Ff]ull) ;; + *) DUPLEX="<font color=\"red\">$DUPLEX</font>" +esac +CACHESIZEFREE=$(ogGetFreeSize `ogFindCache`) +expr $CACHESIZEFREE / 1024 > $FILEINFOCACHE 2>/dev/null && echo '.MB,' >> $FILEINFOCACHE # # echo ''; # cat > $FILEINFOHTML << EOF -<div align="center" style="font-family: Arial, Helvetica, sans-serif;">' +<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 border=1 width="100%"> +<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 +EOF +cat >> $FILEINFOCACHE << EOF +$CACHECONTENIDO +EOF + diff --git a/client/shared/scripts/poweroff b/client/shared/scripts/poweroff index bf867467..3be97ed0 100755 --- a/client/shared/scripts/poweroff +++ b/client/shared/scripts/poweroff @@ -13,6 +13,6 @@ echo "[50] Desmontar cache local." ogUnmountCache echo "[70] Apagando el equipo." ethtool -s $DEVICE wol g -(sleep 5 && busybox poweroff) & +(sleep 5 && busyboxOLD poweroff) & diff --git a/client/shared/scripts/reboot b/client/shared/scripts/reboot index 7b7f3c94..7966b9a3 100755 --- a/client/shared/scripts/reboot +++ b/client/shared/scripts/reboot @@ -13,5 +13,5 @@ echo "[50] Desmontar cache local." ogUnmountCache echo "[90] Reiniciar el equipo." ethtool -s $DEVICE wol g -(sleep 5 && busybox reboot) & +(sleep 5 && busyboxOLD reboot) & diff --git a/client/shared/scripts/runhttplog.sh b/client/shared/scripts/runhttplog.sh index 04d3e530..82115b14 100755 --- a/client/shared/scripts/runhttplog.sh +++ b/client/shared/scripts/runhttplog.sh @@ -1,10 +1,5 @@ #!/bin/bash -echo "export OGLOGCOMMAND=/tmp/command.log" >> /etc/profile.d/loadenviron.sh -echo "export OGLOGSESSION=/tmp/session.log" >> /etc/profile.d/loadenviron.sh - export OGLOGCOMMAND=/tmp/command.log - export OGLOGSESSION=/tmp/session.log - #httd-log-status cp /etc/lighttpd/lighttpd.conf /etc/lighttpd/lighttpd.conf.back cp /opt/opengnsys/lib/httpd/lighttpd.conf /etc/lighttpd/ @@ -15,16 +10,5 @@ chmod 755 /opt cp /opt/opengnsys/lib/httpd/* /usr/lib/cgi-bin #TODO: dstat -dn 10 > /tmp/bandwidth & -#Se pasan al loadenviro para su uso en ssh -#export OGLOGSESSION=/tmp/session.log -#export OGLOGCOMMAND=/tmp/command.log -touch $OGLOGCOMMAND -touch $OGLOGSESSION -touch ${OGLOGCOMMAND}.tmp -chmod 777 $OGLOGCOMMAND -chmod 777 $OGLOGSESSION -chmod 777 ${OGLOGCOMMAND}.tmp -touch /tmp/menu.tmp -chmod 777 /tmp/menu.tmp echo "WAITING" >> $OGLOGSESSION -# http-log-status
\ No newline at end of file +# http-log-status diff --git a/client/shared/scripts/samples/configureGroup b/client/shared/scripts/samples/configureGroup new file mode 100755 index 00000000..65638438 --- /dev/null +++ b/client/shared/scripts/samples/configureGroup @@ -0,0 +1,65 @@ +#!/bin/bash +#/** +#@file configureGroup +#@brief Script de ejemplo de post-configuracion del sistema operativo especifica de cada grupo de ordenadores. +#@brief El directorio del grupo en el repositorio se situa en /opt/opengnsys/groups/Nombre_Grupo +#@brief Se ponen archivos o marcas dentro del directorio del grupo (si queremos que afecte a todas las imagenes) +#@brief o del subdirectorio de la imagen dentro del grupo. Los archivos se copian en el sitio correcto del sistema +#@brief y las marcas se comprueba que existen para inicar una accion (ej: cambiar registro) +#@param str_repo repositorio de imágenes (remoto o caché local) +#@param path_image camino de la imagen (sin extensión) +#@param int_ndisk nº de orden del disco +#@param int_npartition nº de orden de la particion +#@return +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_PARTITION Tipo de partición desconocido o no se puede montar. +#@warning License: GNU GPLv3+ +#*/ + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$0" "$0 path_dir str_image int_ndisk int_npart" \ + "$0 REPO /aula1/winxp 1 1" + exit +fi + +# Error si no se reciben 4 parámetros. +[ $# -eq 4 ] || ogRaiseError $OG_ERR_FORMAT || exit $? + +# Procesar parámetros. +PART=$(ogMount $3 $4) || ogRaiseError $OG_ERR_PARTITION "$3 $4" || exit $? +IMGNAME=$(basename $2) +GROUPDIR=$(ogGetGroupDir) +IMGDIR=$GROUPDIR/$IMGNAME + +# Comprobamos que exista GROUPDIR. Si no existe no es error, nada que configurar +[ ! -x "$GROUPDIR" ] && exit 0 + + +TYPE=$(ogGetOsVersion $3 $4) + +case "$TYPE" in + Linux*) echo "PostConfiguracion de Linux para el grupo $group" + # Si existen estos ficheros en el directorio del grupo o de la imagen se copian a la particion + [ -e $IMGDIR/menu.lst ] && echo "cp -f $IMGDIR/menu.lst $PART/boot/grub/menu.lst" && cp -f $IMGDIR/menu.lst $PART/boot/grub/menu.lst + [ -e $IMGDIR/grub.cfg ] && echo "cp $IMGDIR/grub.cfg $PART/boot/grub/grub.cfg" && cp -f $IMGDIR/grub.cfg $PART/boot/grub/grub.cfg + [ -e $IMGDIR/hosts ] && echo "cp -f $IMGDIR/hosts $PART/etc/hosts" && cp -f $IMGDIR/hosts $PART/etc/hosts + [ -e $IMGDIR/fstab ] && echo "cp -f $IMGDIR/fstab $PART/etc/fstab" && cp -f $IMGDIR/fstab $PART/etc/fstab + [ -e $IMGDIR/xorg.conf ] && echo "cp -f $IMGDIR/xorg.conf $PART/etc/X11/xorg.conf" && cp -f $IMGDIR/xorg.conf $PART/etc/X11/xorg.conf + [ -e $IMGDIR/rc.local ] && echo "cp -f $IMGDIR/rc.local $PART/etc/rc.local" && cp -f $IMGDIR/rc.local $PART/etc/rc.local + [ -e $IMGDIR/interfaces ] && echo "cp -f $IMGDIR/interfaces $PART/etc/network/interfaces" && cp -f $IMGDIR/interfaces $PART/etc/network/interfaces + [ -e $IMGDIR/passwd ] && echo "cp -f $IMGDIR/passwd $PART/etc/passwd" && cp -f $IMGDIR/passwd $PART/etc/passwd + ;; + + *Windows\ XP) echo "PostConfiguracion de XP para el grupo $group" + # Si existen estos ficheros en el directorio del grupo o de la imagen se copian a la particion + [ -e $IMGDIR/SAM ] && echo "cp -f $IMGDIR/SAM $PART/Windows/System32/config/SAM" && cp -f $IMGDIR/SAM $PART/Windows/System32/config/SAM + ;; + *Windows\ 7*) echo "Postconfiguracion de W7 para el grupo $group" + # Si existen estos ficheros en el directorio del grupo o de la imagen se copian a la particion + [ -e $IMGDIR/SAM ] && echo "cp -f $IMGDIR/SAM $PART/Windows/System32/config/SAM" && cp -f $IMGDIR/SAM $PART/Windows/System32/config/SAM + ;; + *) exit 0 + ;; + esac + |