source: server/bin/setsslkey

qndtest
Last change on this file was a5d9191, checked in by Irina Gómez <irinagomez@…>, 2 years ago

#1066 #997: Support for Initrd compressed in several formats.

Adding compatibility with Ubuntu 20.04 Initrd, which is compressed in LZ4 format.
(cherry-pick 0e3e167).

  • Property mode set to 100755
File size: 4.1 KB
Line 
1#!/bin/bash
2
3#/**
4#         setsslkey
5#@file    setsslkey [NEW] [ogLive]
6#@brief   Configura las claves públicas en los ogLive para que puedan autenticarse entre ellos.
7#@param   $1 crear_key [NEW] (opcional). Crear la pareja de claves ssl. Por defecto toma la del oglive por defecto.
8#@param   $2 ogLive (opcional). ogLive al que se le incluyen las claves públicas, por defecto a todos.
9#@warning Se modifica el Initrd del cliente.
10#@version 1.1.2 - Versión inicial - Basado en setserveraddr
11#@author  Irina Gómez - ETSII Universidad Sevilla
12#@date    2019-09-25
13#*/ ##
14
15
16# Variables.
17PROG=$(basename "$0")
18PATH=$PATH:$(dirname "$(realpath "$0")")
19OPENGNSYS=${OPENGNSYS:-"/opt/opengnsys"}
20TFTPDIR=$OPENGNSYS/tftpboot
21INITRD=oginitrd.img
22TMPDIR=/tmp/oglive$$
23let CHANGES=0
24
25# Control básico de errores.
26if [ "$USER" != "root" ]; then
27    echo "$PROG: Error: solo ejecutable por root" >&2
28    exit 1
29fi
30
31# Regenerar las claves públicas aunque existan
32[ "${1^^}" == "NEW" ] && NEWKEY="NEW" && shift
33
34case $# in
35    0)  # Cambios en todos los clientes ogLive instalados.
36        if which oglivecli &>/dev/null; then
37            LIST=$(oglivecli list | awk '{print $2}')
38        else
39            LIST="ogclient"
40        fi ;;
41    1)  # Cambios en único ogLive (AVISO: puede crear inconsistencias con otros ogLive).
42        LIST="$1" ;;
43    *)  # Error de formato.
44        echo "$PROG: Error de ejecución" >&2
45        echo "Formato: $PROG ogLive"
46        exit 1 ;;
47esac
48
49# Si me salgo con error borro el directorio temporal
50trap "rm -rf $TMPDIR 2>/dev/null" 1 2 3 6 9 15
51
52# ogLive por defecto
53OGLIVEDEFAULT=$(oglivecli list |awk -v NUM=$(oglivecli get-default) '{if ($1 == NUM) print $2}')
54
55if [ "$NEWKEY" != "NEW" ]; then 
56    # Comprobamos si el ogLive por defecto contiene la clave
57    CLIENTINITRD="$TFTPDIR/$OGLIVEDEFAULT/$INITRD"
58    if [ -r "$CLIENTINITRD" ]; then
59        mkdir -p $TMPDIR
60        cd $TMPDIR || exit 3
61        COMPRESS=$(file -b "$CLIENTINITRD" | awk '{print tolower($1);}')
62        $COMPRESS -dc "$CLIENTINITRD" | cpio -im
63        if [ -r scripts/ssl/id_rsa ]; then
64            PRIVKEY=$(cat scripts/ssl/id_rsa |grep -v '\-\-\-')
65            PUBLICKEY=$(cat scripts/ssl/id_rsa.pub)
66        else
67            NEWKEY="NEW"
68        fi
69        rm -fr $TMPDIR
70    else
71        NEWKEY="NEW"
72    fi
73fi
74
75# Genero nueva clave
76if [ "$NEWKEY" == "NEW" ]; then
77    [ -d $TMPDIR ] && rm -rf $TMPDIR
78    mkdir $TMPDIR
79    ssh-keygen -N "" -f $TMPDIR/id_rsa
80    PRIVKEY=$(cat $TMPDIR/id_rsa |grep -v "\-\-\-")
81    PUBLICKEY=$(cat $TMPDIR/id_rsa.pub)
82    rm -rf $TMPDIR
83fi
84
85# Buscar todos los clients ogLive instalados.
86for OGLIVE in $LIST; do
87    # Si no hay generar nueva clave ssl no hay que modificar el ogLive por defecto
88    [ "$NEWKEY" != "NEW" ] && [ "$OGLIVE" == "$OGLIVEDEFAULT" ] && continue
89
90    # Crear clave para usuario de acceso a los recursos.
91    CLIENTINITRD="$TFTPDIR/$OGLIVE/$INITRD"
92    if [ -r "$CLIENTINITRD" ]; then
93        # Editar la parte de acceso del cliente:
94        #    descomprimir Initrd, sustituir clave y recomprimir Initrd).
95        echo "Configurando cliente \"$OGLIVE\" ..."
96        mkdir -p $TMPDIR
97        cd $TMPDIR || exit 3
98        COMPRESS=$(file -b "$CLIENTINITRD" | awk '{print tolower($1);}')
99        $COMPRESS -dc "$CLIENTINITRD" | cpio -im
100
101        # Genero archivos de claves
102        [ -d $TMPDIR/scripts/ssl ] || mkdir -p $TMPDIR/scripts/ssl
103
104        echo "-----BEGIN RSA PRIVATE KEY-----" > $TMPDIR/scripts/ssl/id_rsa
105        echo $PRIVKEY |sed s/" "/\\n/g >> $TMPDIR/scripts/ssl/id_rsa
106        echo "-----END RSA PRIVATE KEY-----" >> $TMPDIR/scripts/ssl/id_rsa
107
108        echo $PUBLICKEY > $TMPDIR/scripts/ssl/id_rsa.pub
109        echo $PUBLICKEY > $TMPDIR/scripts/ssl/authorized_keys
110
111        chmod 400 $TMPDIR/scripts/ssl/id_rsa
112        chmod 400 $TMPDIR/scripts/ssl/authorized_keys
113
114        # Generar Initrd del cliente.
115        find . | cpio -H newc -oa | gzip -9c > "$CLIENTINITRD"
116
117        rm -fr $TMPDIR
118        # Calcular suma de comprobación.
119        md5sum "$CLIENTINITRD" | cut -f1 -d" " > "$CLIENTINITRD.sum"
120        let CHANGES++
121    else
122        echo "$PROG: Cliente \"$OGLIVE\" no accesible."
123    fi
124done
125if [[ $CHANGES != 0 ]]; then
126    echo "$PROG: Se ha modificado la pareja de claves ssl en $CHANGES clientes."
127else
128    echo "$PROG: Aviso: no se ha modificado la clave de ningún cliente."
129fi
Note: See TracBrowser for help on using the repository browser.