#!/bin/bash
#/**
#@file     Net.lib
#@brief    Librería o clase Net
#@class    Net
#@brief    Funciones básicas de red.
#@version  1.0.6
#@warning  License: GNU GPLv3+
#*/


#/**
# ogChangeRepo  IPREPO [ OgUnit ]
#@brief   Cambia el repositorio para el recurso remoto images.
#@param 1 Ip Repositorio 
#@param 2 Abreviatura Unidad Organizativa
#@return  Cambio recurso remoto en OGIMG.
#@version 1.1 - Primera versión para OpenGnSys.
#@author  Irina Gomez, ETSII Universidad de Sevilla
#@date    2015-06-16
#*/
function ogChangeRepo ()
{
local SRCIMG NEWREPO REPO OGUNIT

if [ "$*" == "help" ]; then
    ogHelp "$FUNCNAME" "$FUNCNAME IPREPO [ OgUnit ]" \
           "$FUNCNAME 10.1.120.3" \
           "$FUNCNAME 10.1.120.3 cdc"
    return
fi


if [ $# -lt 1 ]; then
    ogRaiseError $OG_ERR_FORMAT "$MSG_FORMAT: $FUNCNAME IPREPO [ OgUnit ]"
    return $?
fi


# Opciones de montaje: lectura o escritura
mount |grep "ogimages.*rw," &>/dev/null && RW=",rw" || RW=",ro" 

# Si REPO tomamos el repositorio y la unidad organizativa actual
REPO=$(ogGetRepoIp)
OGUNIT="$(df | awk -F " " '/ogimages/ {sub("//.*/ogimages","",$1); sub("/","",$1);  print $1}')"

# Parametros de entrada. Si $1 = "REPO" dejo el repositorio actual
[ "${1^^}" == "REPO" ] && NEWREPO="$REPO" || NEWREPO="${1}"

# Si $1 y $2 son el repositorio y la OU actual me salgo
[ "$NEWREPO" == "$REPO" ] && [ "$2" == "$OGUNIT" ]  && return 0

source /scripts/functions
source /scripts/ogfunctions
umount $OGIMG
[ "$2" == "" ] && SRCIMG="ogimages" || SRCIMG="ogimages/$2"
eval $(grep "OPTIONS=" /scripts/ogfunctions)

ogEcho session log "$MSG_HELP_ogChangeRepo $NEWREPO ${2%/}"
ogConnect $NEWREPO $ogprotocol $SRCIMG $OGIMG $RW

# Si da error volvemos a montar el inicial
if [ $? -ne 0 ]; then
    ogConnect $REPO $ogprotocol $SRCIMG $OGIMG $RW
    ogRaiseError session $OG_ERR_REPO "$NEWREPO" 
    return $?
fi

}


#/**
#         ogGetGroupDir [ str_repo ]
#@brief   Devuelve el camino del directorio para el grupo del cliente.
#@param   str_repo     repositorio de imágenes (opcional)
#@return  path_dir  -  Camino al directorio del grupo.
#@note    repo = { REPO, CACHE }     REPO por defecto
#@exception OG_ERR_FORMAT    formato incorrecto.
#@version 1.0.2 - Primera versión para OpenGnSys.
#@author  Ramon Gomez, ETSII Universidad de Sevilla
#@date    2011-10-03
#*/ 
function ogGetGroupDir ()
{
local REPO DIR GROUP
if [ "$*" == "help" ]; then
    ogHelp "$FUNCNAME" "$FUNCNAME str_repo" \
           "$FUNCNAME REPO  ==>  /opt/opengnsys/images/groups/Grupo1"
    return
fi
# Error si se recibe más de 1 parámetro.
case $# in
    0)  REPO="REPO" ;;
    1)  REPO="$1" ;;
    *)  ogRaiseError $OG_ERR_FORMAT "$*"
        return $? ;;
esac

GROUP="$(ogGetGroupName)"
if [ -n "$GROUP" ]; then
    DIR=$(ogGetPath "$REPO" "/groups/$GROUP" 2>/dev/null)
    [ -d "$DIR" ] && echo "$DIR"
fi
# Para que no haya error al fallar la condición anterior
return 0
}


#/**
#         ogGetGroupName
#@brief   Devuelve el nombre del grupo al que pertenece el cliente.
#@return  str_group - Nombre de grupo.
#@version 1.0.2 - Primera versión para OpenGnSys.
#@author  Ramon Gomez, ETSII Universidad de Sevilla
#@date    2011-10-03
#*/ 
function ogGetGroupName ()
{
if [ "$*" == "help" ]; then
    ogHelp "$FUNCNAME" "$FUNCNAME" "$FUNCNAME  =>  Grupo1"
    return
fi
[ -n "$group" ] && echo "$group"
}


#/**
#         ogGetHostname
#@brief   Muestra el nombre del cliente.
#@return  str_host - nombre de máquina
#@version 0.10 - Integración en OpenGnSys 0.10
#@author  Ramon Gomez, ETSII Universidad de Sevilla
#@date    2010-02-11
#*/ ##
function ogGetHostname ()
{
local HOST
if [ "$*" == "help" ]; then
    ogHelp "$FUNCNAME" "$FUNCNAME" "$FUNCNAME  =>  pc1"
    return
fi
# Tomar nombre de la variable HOSTNAME
HOST="$HOSTNAME"
# Si no, tomar del DHCP, opción host-name       /* (comentario para Doxygen)
[ -z "$HOST" ] && HOST=$(awk -F\" '/option host-name/ {gsub(/;/,""); host=$2}
                                   END {print host}
                                  ' /var/lib/dhcp3/dhclient.leases)
# Si no, leer el parámetro del kernel hostname  (comentario para Doxygen) */
[ -z "$HOST" ] && HOST=$(awk 'BEGIN {RS=""; FS="="}
                              $1~/hostname/ {print $2}' /proc/cmdline)
[ "$HOSTNAME" != "$HOST" ] && export HOSTNAME="$HOST"
[ -n "$HOST" ] && echo $HOST
}


#/**
#         ogGetIpAddress
#@brief   Muestra la dirección IP del sistema
#@return  str_ip - Dirección IP
#@version 0.10 - Integración en OpenGnSys 0.10
#@author  Ramon Gomez, ETSII Universidad de Sevilla
#@date    2010-02-11
#@version 1.0 - Integración OpenGnSys 0.10 Opengnsys 0.10-testing
#@note    Usa las variables utilizadas por el initrd "/etc/net-ethX.conf
#@author  Antonio J. Doblas Viso. Universidad de Malaga.
#@date    2011-02-24
#@version 1.0.2 - Soporte para varias tarjetas de red
#@author  Ramon Gomez, ETSII Universidad de Sevilla
#@date    2011-06-17
#*/ ##
function ogGetIpAddress ()
{
local IP
if [ "$*" == "help" ]; then
    ogHelp "$FUNCNAME" "$FUNCNAME" "$FUNCNAME  =>  192.168.0.10"
    return
fi
if [ -n "$IPV4ADDR" ]; then
     IP="$IPV4ADDR"
else
    # Obtener direcciones IP.
    if [ -n "$DEVICE" ]; then
        IP=$(ip -o address show up dev "$DEVICE" 2>/dev/null | awk '{if ($3~/inet$/) {printf ("%s ", $4)}}')
    else
        IP=$(ip -o address show up | awk '$2!~/lo/ {if ($3~/inet$/) {printf ("%s ", $4)}}')
    fi
fi
# Mostrar solo la primera.
echo "${IP%%/*}"       # (comentario para Doxygen) */
}


#/**
#         ogGetMacAddress
#@brief   Muestra la dirección Ethernet del cliente.
#@return  str_ether - Dirección Ethernet
#@version 0.10 - Integración en OpenGnSys 0.10
#@author  Ramon Gomez, ETSII Universidad de Sevilla
#@date    2010-02-11
#@version 1.0.2 - Soporte para varias tarjetas de red
#@author  Ramon Gomez, ETSII Universidad de Sevilla
#@date    2011-06-17
#*/ ##
function ogGetMacAddress ()
{
local MAC
if [ "$*" == "help" ]; then
    ogHelp "$FUNCNAME" "$FUNCNAME" "$FUNCNAME  =>  00:11:22:33:44:55"
    return
fi
# Obtener direcciones Ethernet.
if [ -n "$DEVICE" ]; then
    MAC=$(ip -o link show up dev "$DEVICE" 2>/dev/null | awk '{sub (/.*\\/, ""); if ($1~/ether/) printf ("%s ", toupper($2));}')
else
    MAC=$(ip -o link show up | awk '$2!~/lo/ {sub (/.*\\/, ""); if ($1~/ether/) printf ("%s ", toupper($2));}')
fi
# Mostrar sólo la primera.
echo ${MAC%% *}
}


#/**
#         ogGetNetInterface
#@brief   Muestra la interfaz de red del sistema
#@return  str_interface - interfaz de red
#@version 1.0 - Integración OpenGnSys 0.10 Opengnsys 0.10-testing
#@note    Usa las variables utilizadas por el initrd "/etc/net-ethX.conf
#@author  Antonio J. Doblas Viso. Universidad de Malaga.
#@date    2011-02-24
#*/ ##
function ogGetNetInterface ()
{
if [ "$*" == "help" ]; then
    ogHelp "$FUNCNAME" "$FUNCNAME" "$FUNCNAME  =>  eth0"
    return
fi
[ -n "$DEVICE" ] && echo "$DEVICE"
}


#/**
#         ogGetRepoIp
#@brief   Muestra la dirección IP del repositorio de datos.
#@return  str_ip - Dirección IP
#@version 0.10 - Integración en OpenGnSys 0.10
#@author  Ramon Gomez, ETSII Universidad de Sevilla
#@date    2011-01-13
#@version 1.0 - Integración OpenGnSys 0.10 Opengnsys 0.10-testing
#@note   Comprobacion segun protocolo de conexion al Repo
#@author  Antonio J. Doblas Viso. Universidad de Malaga.
#@date    2011-02-24
#@version 1.0.6 - Obtener datos del punto de montaje, evitando fallo si $ogprotocol está vacía.
#@author  Ramon Gomez, ETSII Universidad de Sevilla
#@date    2014-08-27
#*/ ##
function ogGetRepoIp ()
{
# Variables locales.
local SOURCE FSTYPE

# Mostrar ayuda.
if [ "$*" == "help" ]; then
    ogHelp "$FUNCNAME" "$FUNCNAME" "$FUNCNAME  =>  192.168.0.2"
    return
fi

# Obtener direcciones IP, según el tipo de montaje.
eval $(findmnt -P -o SOURCE,FSTYPE $OGIMG)
case "$FSTYPE" in
    nfs)   echo "$SOURCE" | cut -f1 -d: ;;
    cifs)  echo "$SOURCE" | cut -f3 -d/ ;;
esac
}


#/**
#         ogGetServerIp
#@brief   Muestra la dirección IP del Servidor de OpenGnSys.
#@return  str_ip - Dirección IP
#@version 0.10 - Integración en OpenGnSys 0.10
#@author  Ramon Gomez, ETSII Universidad de Sevilla
#@date    2011-01-13
#@version 1.0 - Integración OpenGnSys 0.10 Opengnsys 0.10-testing
#@note   Comprobacion segun protocolo de conexion al Repo
#@author  Antonio J. Doblas Viso. Universidad de Malaga.
#@date    2011-02-24
#@version 1.0.6 - Obtener datos del punto de montaje, evitando fallo si $ogprotocol está vacía.
#@author  Ramon Gomez, ETSII Universidad de Sevilla
#@date    2014-08-27
#*/ ##
function ogGetServerIp ()
{
# Variables locales.
local SOURCE FSTYPE

# Mostrar ayuda.
if [ "$*" == "help" ]; then
    ogHelp "$FUNCNAME" "$FUNCNAME" "$FUNCNAME  =>  192.168.0.2"
    return
fi

# Obtener direcciones IP, según el tipo de montaje.
eval $(findmnt -P -o SOURCE,FSTYPE $OPENGNSYS)
case "$FSTYPE" in
    nfs)   echo "$SOURCE" | cut -f1 -d: ;;
    cifs)  echo "$SOURCE" | cut -f3 -d/ ;;
esac
}


#/**
#         ogMakeGroupDir [ str_repo ]
#@brief   Crea el directorio para el grupo del cliente.
#@param   str_repo     repositorio de imágenes (opcional)
#@return  (nada)
#@note    repo = { REPO, CACHE }     REPO por defecto
#@exception OG_ERR_FORMAT    formato incorrecto.
#@version 1.0.5 - Primera versión para OpenGnSys.
#@author  Ramon Gomez, ETSII Universidad de Sevilla
#@date    2013-09-26
#*/ 
function ogMakeGroupDir ()
{
local REPO DIR GROUP
if [ "$*" == "help" ]; then
    ogHelp "$FUNCNAME" "$FUNCNAME str_repo" \
           "$FUNCNAME" "$FUNCNAME REPO"
    return
fi
# Error si se recibe más de 1 parámetro.
case $# in
    0)  REPO="REPO" ;;
    1)  REPO="$1" ;;
    *)  ogRaiseError $OG_ERR_FORMAT "$*"
        return $? ;;
esac
# Comprobar tipo de repositorio.
DIR=$(ogGetPath "$REPO" / 2>/dev/null)
[ -n "$DIR" ] || ogRaiseError $OG_ERR_FORMAT "$1"
GROUP="$(ogGetGroupName)"
if [ -n "$GROUP" ]; then
    mkdir -p "$DIR/groups/$GROUP" 2>/dev/null
fi
}

