| 1 | [[TOC(heading=Índice)]] |
| 2 | |
| 3 | {{{ |
| 4 | #!div style="width:50%; background: #ffd; font: bold italic large sans-serif"> |
| 5 | Propuesta de API REST para debatir en el grupo de desarrollo. |
| 6 | }}} |
| 7 | |
| 8 | = Cliente de Opengnsys con varios repositorios y unidades organizativas en directorios separados = |
| 9 | Son dos funcionalidades distintas pero ambas afectan al montaje del recurso ogimages en el cliente de opengnsys, por ello la solución ha de ser conjunta. |
| 10 | |
| 11 | == Cliente de Opengnsys con varios repositorios == |
| 12 | |
| 13 | El cliente de opengnsys tendrá un repositorio por defecto, pero podrá restaurar y crear imágenes de otros diferente. La condición es que '''todos los repositorios tengan la misma clave ''' de samba para el usuario de opengnsys. |
| 14 | |
| 15 | El cliente al arrancar monta el recurso ogimages del repositorio por defecto. |
| 16 | |
| 17 | Los comandos de gestión de imágenes admiten además de REPO, CACHE y el valor de la ip del repositorio que queremos cambiar. |
| 18 | * En caso de ser una ip el primer paso será comprobar si el valor que nos han dado es repositorio que está y lo cambie si es necesario. |
| 19 | * Si el valor es REPO, se consultará la ip del repositorio por defecto y se cambiará al mismo si es necesario. |
| 20 | |
| 21 | Desde el lado del cliente la información del repositorio se optiene a partir del recurso remoto que está montado en /opt/opengnsys/images. Por ejemplo, la ip del servidor se obtiene revisando la ip del recurso remoto ogimages, el tamaño de las imágenes se calcula haciendo referencia a la ruta "local" en el cliente, el espacio libre en el repositorio según el espacio que quede en el sistema de ficheros montado en /opt/opengnsys/images, etc. Por este motivo las funciones del motor de clonación van a necesitar pocos cambio, en las pruebas realizadas hasta ahora no ha habido que modificar ninguna. |
| 22 | |
| 23 | Hasta ahora se ha conseguido utilizar deployImages y updateCache con varios repositorios en todos los protocolos. Lo demás no se ha mirado, posiblemente sae igual de fácil. |
| 24 | |
| 25 | El cambio se ha basado en la funcion '''ogChangeRepo''', que añadimos al principio de los script deployImages y updateCache. |
| 26 | |
| 27 | === ogChangeRepo === |
| 28 | La función cambia el recurso remoto de /opt/opengnsys/images, es decir muestra las imágenes del repositorio que digamos. Toma como argumento: |
| 29 | * IPREPO|REPO: la ip del repositorio, si le pasamos la cadena "REPO" busca el valor de la ip del repositorio por defecto (parámetro PXE) |
| 30 | * Unidad organizativa: Abreviatura unidad organizativa del repositorio, para la otra funcionalidad. |
| 31 | |
| 32 | El montaje si el cliente esta en modo admin es de lectura y escritura y si está en modo user sólo de lectura. |
| 33 | |
| 34 | {{{ |
| 35 | ogChangeRepo IPREPO|REPO [ OgUnit ] |
| 36 | ej: ogChangeRepo 10.1.120.3 |
| 37 | ej: ogChangeRepo REPO |
| 38 | ej: ogChangeRepo 10.1.120.3 cdc |
| 39 | }}} |
| 40 | |
| 41 | Falta hacer control de errores, si no se puede montar el recurso remoto que deje el repositorio por defecto y salga dando error. |
| 42 | |
| 43 | === Cambios en los script === |
| 44 | |
| 45 | El script deployImage sí admitía como valor del repositorio la ip, podía ser la del repositorio o la del cliente que cambiaba respectivamente por las cadenas REPO o CACHE, updateCache no lo tenía en cuenta. |
| 46 | |
| 47 | Se añade al principio antes de cualquier consulta que necesite el punto de montaje de samba: |
| 48 | |
| 49 | {{{ |
| 50 | # Valor por defecto para el repositorio. |
| 51 | #[ "$REPO" == "$(ogGetRepoIp)" ] && REPO="REPO" -> lo hace ogChangeRepo |
| 52 | [ "$REPO" == "$(ogGetIpAddress)" ] && REPO="CACHE" |
| 53 | # Si es una ip distinta cambiamos de REPO. |
| 54 | if ogCheckIpAddress $REPO >/dev/null ; then |
| 55 | # Si falla el cambio -> salimos con error repositorio no valido |
| 56 | ogChangeRepo $REPO || exit $(ogRaiseError $OG_ERR_NOTFOUND '$REPO'; echo $?) |
| 57 | REPO="REPO" |
| 58 | fi |
| 59 | }}} |
| 60 | Nota: La tercera línea sólo en deployImage, ya que updateCache no admite CACHE como valor. |
| 61 | |
| 62 | === Pruebas realizadas === |
| 63 | Como hemos dicho anteriormente se ha probado con éxito los comandos deployImage y updateCache con varios repositorios en todos los protocolos. Pruebas realizadas. |
| 64 | |
| 65 | {{{ |
| 66 | ogChangeRepo REPO |
| 67 | ogChangeRepo 10.1.14.8 |
| 68 | ogChangeRepo 10.1.14.6 |
| 69 | ogChangeRepo en modo admin -> rw |
| 70 | ogChangeRepo en modo user -> ro |
| 71 | |
| 72 | updateCache 10.1.14.8 Ubuntu12.img UNICAST |
| 73 | updateCache 10.1.14.8 Ubuntu12.img MULTICAST 9000:full-duplex:239.194.17.2:70M:20:300 |
| 74 | updateCache 10.1.14.8 Ubuntu12.img TORRENT seeder:1000 |
| 75 | |
| 76 | deployImage 10.1.14.8 Ubuntu12 1 6 UNICAST-DIRECT |
| 77 | deployImage 10.1.14.8 Ubuntu12 1 6 UNICAST |
| 78 | deployImage 10.1.14.6 Ubuntu12BIEN 1 6 UNICAST |
| 79 | deployImage 10.1.14.8 Ubuntu12 1 6 MULTICAST-DIRECT 9000:full-duplex:239.194.17.2:150M:20:20 |
| 80 | deployImage 10.1.14.8 Ubuntu12 1 6 MULTICAST 9000:full-duplex:239.194.17.2:150M:20:20 |
| 81 | deployImage 10.1.14.8 Ubuntu12 1 6 TORRENT seeder:1000 |
| 82 | }}} |
| 83 | |
| 84 | |
| 85 | == Unidades organizativas en directorios separados == |
| 86 | |
| 87 | Cuando un repositorio tiene dos unidades organizativas sus imágenes se sitúan en el mismo directorio pudiendo tener problemas, por ejemplo si coinciden los nombres o se llena el espacio. |
| 88 | |
| 89 | Cada unidad organizativa tendrá sus imágenes en un subdirectorio de /opt/opengnsys/images, el nombre del subdirectorio será una abreviatura de la unidad organizativa. Está abreviatura será una propiedad más del aula en la consola y se le enviará al cliente por PXE en la variable ogunit. |
| 90 | |
| 91 | El cliente montará en /opt/opengnsys/images el recurso ogimages/ogunit, de forma que el cambio es transparente del lado del cliente. Cuando un comando le pida una imagen al servidor sí necesita la especificar a qué unidad organizativa se refiere, como los comandos aceptan que la imagen este en subdirectorios bastaría enviarle al servidor como nombre de la imagen "$OGUNIT/$IMAGENAME" |
| 92 | |
| 93 | En la cache no establecemos distinción entre las unidades organizativas ni creamos subdirectorios. |
| 94 | |
| 95 | === Cambios en el montaje del ogimages === |
| 96 | |
| 97 | Cuando montamos el recurso ogimages consultamos si existe el valor de ogunit y lo añadimos al path del recurso remoto. El montaje se realiza en dos pasos: |
| 98 | |
| 99 | 1) En el initrd tenemos la función ogExportVarEnvironment donde se definen los recursos remotos del cliente opengnsys (ogimages, oglog,...). Solo cambian las líneas: |
| 100 | |
| 101 | {{{ |
| 102 | diff ogfunctions ogfunctions.orig |
| 103 | < [ "$ogunit" != "" ] && OGUNIT="/$ogunit" |
| 104 | |
| 105 | < export SRCOGIMAGES="/opt/opengnsys/images$OGUNIT" && echo "SRCOGIMAGES=$SRCOGIMAGES" >> $CFGINITRD |
| 106 | > export SRCOGIMAGES="/opt/opengnsys/images" && echo "SRCOGIMAGES=$SRCOGIMAGES" >> $CFGINITRD |
| 107 | |
| 108 | < export SRCOGIMAGES="ogimages$OGUNIT" && echo "SRCOGIMAGES=$SRCOGIMAGES" >> $CFGINITRD |
| 109 | > export SRCOGIMAGES="ogimages" && echo "SRCOGIMAGES=$SRCOGIMAGES" >> $CFGINITRD |
| 110 | }}} |
| 111 | |
| 112 | 2) Cuando se está terminando de arrancar el script /etc/preinit/mountrepo.sh si el cliente de OpenGnSys está en modo de administración monta el recurso ogimages en modo lectura-escritura. Los cambios son: |
| 113 | {{{ |
| 114 | < [ "$ogunit" != "" ] && OGUNIT="/$ogunit" |
| 115 | |
| 116 | < nfs) mount.nfs ${ROOTREPO}:$OGIMG$OGUNIT $OGIMG -o rw,nolock ;; |
| 117 | > nfs) mount.nfs ${ROOTREPO}:$OGIMG $OGIMG -o rw,nolock ;; |
| 118 | |
| 119 | < mount.cifs //${ROOTREPO}/ogimages$OGUNIT $OGIMG -o rw,serverino,acl,username=opengnsys,password=$PASS |
| 120 | > mount.cifs //${ROOTREPO}/ogimages $OGIMG -o rw,serverino,acl,username=opengnsys,password=$PASS |
| 121 | }}} |
| 122 | |
| 123 | |
| 124 | === Cambios en los script === |
| 125 | |
| 126 | En todos los pasos se crea la variable del nombre de la imagen construida poniendo delante del mismo subdirectorio de la unidad organizativa y sustituyendo esta variable donde se usaba el argumento de entrada de comando. Ejemplo: |
| 127 | {{{ |
| 128 | [ "$ogunit" != "" -a "$3" == "REPO" ] && IMGNAME="$ogunit/$2" || IMGNAME="$2" |
| 129 | |
| 130 | ogExecAndLog command ogRestoreImage "$REPO" "$IMGNAME" "$DISK" "$PART" |
| 131 | }}} |
| 132 | |
| 133 | Las funciones no deben verse afectadas ya que están pensadas para que las imágenes pueda estar en subdirectorios. Hay que repasarlas todas. |
| 134 | |
| 135 | El script de servidor bin/torrent-creator, que genera las sumas de comprobación de las imágenes y los ficheros torrent, hay que modificarlo para que revise los subdirectorios de primer nivel del /opt/opengnsys/images. El cambio sería: |
| 136 | |
| 137 | {{{ |
| 138 | diff torrent-creator torrent-creator.orig |
| 139 | < for IMG in *.{img,pgz,diff} */*.{img,pgz,diff}; do |
| 140 | > for IMG in *.{img,pgz,diff}; do |
| 141 | }}} |
| 142 | |
| 143 | |
| 144 | === Pasamos al cliente el parámetro de la unidad organizativa por PXE === |
| 145 | |
| 146 | Al cliente de opengnsys se le debe pasar como parámetro del kernel la abreviatura de la unidad organizativa. Inicialmente la incorporamos en las plantillas de PXE: Ejemplo: |
| 147 | {{{ |
| 148 | title OpenGnSys-NET |
| 149 | keeppxe |
| 150 | kernel (pd)/ogclient/ogvmlinuz ro boot=oginit vga=788 irqpoll acpi=on og2nd=sqfs ogprotocol=smb ogactiveadmin=true ogdebug=true ogupdateinitrd=true ogunit=cdc INFOHOST |
| 151 | initrd (pd)/ogclient/oginitrd.img |
| 152 | boot |
| 153 | }}} |
| 154 | |
| 155 | Como solución definitiva de debe estar en la base de datos como el campo "abreviatura" en la tabla centros. Cuando se cree el fichero PXE a partir de la plantilla también habrá que consultar este dato. |
| 156 | |
| 157 | La consulta para obtener la unidad organizativa de un equipo será: |
| 158 | {{{ |
| 159 | select ordenadores.idordenador, aulas.idcentro, centros.abreviatura from ordenadores inner join aulas inner join centros where ordenadores.idaula=aulas.idaula and aulas.idcentro=centros.idcentro and ordenadores.ip='$IP'; |
| 160 | +-------------+----------+-------------+ |
| 161 | | idordenador | idcentro | abreviatura | |
| 162 | +-------------+----------+-------------+ |
| 163 | | 1 | 1 | cdc | |
| 164 | +-------------+----------+-------------+ |
| 165 | }}} |
| 166 | |
| 167 | === Problema con el protocolo torrent === |
| 168 | La transferencia del protocolo torrent se basa en dos procesos del servidor, btlaunchmany.bittornado y bttrack, el semillero y el tracker respectivamente. Uno de ellos no ve los subdirectorios. Habría que ver qué solución tiene. |
| 169 | |
| 170 | == Compatibilidad varios repositorios y varias unidades organizativas == |
| 171 | En caso de querer incluir las dos funcionalidades hay que decidir cómo pasar los parámetros a los comandos, ya que tendríamos que pasar la ip del repositorio y la unidad organizativa. |
| 172 | |
| 173 | Una posibilidad sería incluirla en el argumento del repo separada por dos puntos: |
| 174 | |
| 175 | {{{ |
| 176 | $REPO=$IPREPO|REPO[:$OGUNIT] |
| 177 | }}} |
| 178 | Por ejemplo: |
| 179 | {{{ |
| 180 | restoreImage 10.1.15.2:cdc Ubuntu12 1 2 |
| 181 | }}} |
| 182 | |
| 183 | == Unificar el montaje de ogimages en un único paso == |
| 184 | |
| 185 | Esto es independiente de las nuevas funcionalidades. |
| 186 | |
| 187 | El montaje se realiza en dos pasos pero podría hacerse en uno sólo, me parece que no existe ninguna comprobación intermedia que aporte algo. |
| 188 | |
| 189 | En el segundo paso el script mountrepo consulta el parámetro PXE "ogactiveadmin" para decidir si monta el repositorio en modo escritura. |
| 190 | |
| 191 | En el primer paso el script oginit del initrd llama a la función ogConnect con el parámetro "ro", bastaría comprobar el parámetro PXE ogactiveadmin y montar el recurso ogimages con los permisos correctos para cada caso. El cambio sería el siguiente: |
| 192 | |
| 193 | {{{ |
| 194 | diff oginit oginit.orig |
| 195 | <[ "$ogactiveadmin" == "true" ] && RWOPT=',rw' || RWOPT=',ro' |
| 196 | < ogConnect $OGSERVERIMAGES $OGPROTOCOL $SRCOGIMAGES $DSTOGIMAGES $RWOPT |
| 197 | > ogConnect $OGSERVERIMAGES $OGPROTOCOL $SRCOGIMAGES $DSTOGIMAGES ,ro |