source: ogServer-Git/src/ogAdmServer.c @ 6e70916

Last change on this file since 6e70916 was 6e70916, checked in by OpenGnSys Support Team <soporte-og@…>, 3 years ago

#915 remove shim code to update database after image restore command

Make direct call to dbi API to update database instead.

  • Property mode set to 100644
File size: 33.3 KB
RevLine 
[6fc28cd]1// *******************************************************************************************************
[b9eb98b]2// Servicio: ogAdmServer
3// Autor: José Manuel Alonso (E.T.S.I.I.) Universidad de Sevilla
4// Fecha Creación: Marzo-2010
5// Fecha Última modificación: Marzo-2010
6// Nombre del fichero: ogAdmServer.cpp
7// Descripción :Este fichero implementa el servicio de administración general del sistema
[6fc28cd]8// *******************************************************************************************************
[b9eb98b]9#include "ogAdmServer.h"
[0fbdcf2]10#include "dbi.h"
[f4e7832]11#include "utils.h"
[96b9bb8]12#include "list.h"
[04ca20e]13#include "rest.h"
14#include "client.h"
15#include "json.h"
[83b242c]16#include "schedule.h"
[96b02b5]17#include "wol.h"
[ef6e3d2]18#include <syslog.h>
[2baf362]19#include <sys/ioctl.h>
[c6020f2]20#include <sys/types.h>
21#include <sys/stat.h>
22#include <fcntl.h>
[95e6520]23#include <jansson.h>
[83b242c]24#include <time.h>
[2427e9d]25
[b9eb98b]26// ________________________________________________________________________________________________________
27// Función: actualizaConfiguracion
28//
29//      Descripción:
30//              Esta función actualiza la base de datos con la configuracion de particiones de un cliente
31//      Parámetros:
32//              - db: Objeto base de datos (ya operativo)
33//              - tbl: Objeto tabla
34//              - cfg: cadena con una Configuración
35//              - ido: Identificador del ordenador cliente
36//      Devuelve:
[9dea2d6]37//              true: Si el proceso es correcto
38//              false: En caso de ocurrir algún error
[b9eb98b]39//      Especificaciones:
40//              Los parametros de la configuración son:
41//                      par= Número de partición
42//                      cpt= Codigo o tipo de partición
43//                      sfi= Sistema de ficheros que está implementado en la partición
44//                      soi= Nombre del sistema de ficheros instalado en la partición
45//                      tam= Tamaño de la partición
46// ________________________________________________________________________________________________________
[fa6b891]47bool actualizaConfiguracion(struct og_dbi *dbi, char *cfg, int ido)
[b9eb98b]48{
[827bac5]49        int lon, p, c,i, dato, swu, idsoi, idsfi,k;
[12d8fff]50        char *ptrPar[MAXPAR], *ptrCfg[8], *ptrDual[2], tbPar[LONSTD];
51        char *ser, *disk, *disk_type, *par, *cpt, *sfi, *soi, *tam, *uso; // Parametros de configuración.
[fa6b891]52        dbi_result result, result_update;
53        const char *msglog;
[b9eb98b]54
[9a2dc88]55        lon = 0;
[b9eb98b]56        p = splitCadena(ptrPar, cfg, '\n');
57        for (i = 0; i < p; i++) {
58                c = splitCadena(ptrCfg, ptrPar[i], '\t');
[24df599]59
60                // Si la 1ª línea solo incluye el número de serie del equipo; actualizar BD.
61                if (i == 0 && c == 1) {
62                        splitCadena(ptrDual, ptrCfg[0], '=');
63                        ser = ptrDual[1];
[f844a1b]64                        if (ser && strlen(ser) > 0) {
[24df599]65                                // Solo actualizar si número de serie no existía.
[fa6b891]66                                result = dbi_conn_queryf(dbi->conn,
67                                                "UPDATE ordenadores SET numserie='%s'"
[b502279]68                                                " WHERE idordenador=%d AND numserie IS NULL",
[24df599]69                                                ser, ido);
[fa6b891]70                                if (!result) {
71                                        dbi_conn_error(dbi->conn, &msglog);
[bf8ba6c]72                                        syslog(LOG_ERR, "failed to query database (%s:%d) %s\n",
73                                               __func__, __LINE__, msglog);
[9dea2d6]74                                        return false;
[24df599]75                                }
[bf8ba6c]76                                dbi_result_free(result);
[24df599]77                        }
78                        continue;
79                }
80
81                // Distribución de particionado.
[12d8fff]82                disk = disk_type = par = cpt = sfi = soi = tam = uso = NULL;
[24df599]83
[b9eb98b]84                splitCadena(ptrDual, ptrCfg[0], '=');
[99f74d8]85                disk = ptrDual[1]; // Número de disco
[b9eb98b]86
87                splitCadena(ptrDual, ptrCfg[1], '=');
[99f74d8]88                par = ptrDual[1]; // Número de partición
89
[d1e9613]90                k=splitCadena(ptrDual, ptrCfg[2], '=');
91                if(k==2){
92                        cpt = ptrDual[1]; // Código de partición
93                }else{
[24df599]94                        cpt = (char*)"0";
[d1e9613]95                }
[b9eb98b]96
[99f74d8]97                k=splitCadena(ptrDual, ptrCfg[3], '=');
[b9eb98b]98                if(k==2){
99                        sfi = ptrDual[1]; // Sistema de ficheros
[eb99080]100                        /* Comprueba existencia del s0xistema de ficheros instalado */
[fa6b891]101                        idsfi = checkDato(dbi, sfi, "sistemasficheros", "descripcion","idsistemafichero");
[b9eb98b]102                }
103                else
104                        idsfi=0;
105
[99f74d8]106                k=splitCadena(ptrDual, ptrCfg[4], '=');
[b9eb98b]107                if(k==2){ // Sistema operativo detecdtado
108                        soi = ptrDual[1]; // Nombre del S.O. instalado
109                        /* Comprueba existencia del sistema operativo instalado */
[fa6b891]110                        idsoi = checkDato(dbi, soi, "nombresos", "nombreso", "idnombreso");
[b9eb98b]111                }
112                else
113                        idsoi=0;
114
[99f74d8]115                splitCadena(ptrDual, ptrCfg[5], '=');
[b9eb98b]116                tam = ptrDual[1]; // Tamaño de la partición
117
[c4b75b1]118                splitCadena(ptrDual, ptrCfg[6], '=');
119                uso = ptrDual[1]; // Porcentaje de uso del S.F.
120
[12d8fff]121                k = splitCadena(ptrDual, ptrCfg[7], '=');
122                if (k == 2)
123                        disk_type = ptrDual[1];
124                else
125                        disk_type = NULL;
126
[9a2dc88]127                lon += sprintf(tbPar + lon, "(%s, %s),", disk, par);
[b9eb98b]128
[fa6b891]129                result = dbi_conn_queryf(dbi->conn,
130                                "SELECT numdisk, numpar, tamano, uso, idsistemafichero, idnombreso"
[c4b75b1]131                                "  FROM ordenadores_particiones"
132                                " WHERE idordenador=%d AND numdisk=%s AND numpar=%s",
[99f74d8]133                                ido, disk, par);
[fa6b891]134                if (!result) {
135                        dbi_conn_error(dbi->conn, &msglog);
[b56cbeb]136                        syslog(LOG_ERR, "failed to query database (%s:%d) %s\n",
137                               __func__, __LINE__, msglog);
[9dea2d6]138                        return false;
[b9eb98b]139                }
[fa6b891]140                if (!dbi_result_next_row(result)) {
141                        result_update = dbi_conn_queryf(dbi->conn,
[12d8fff]142                                        "INSERT INTO ordenadores_particiones(idordenador,numdisk,disk_type,numpar,codpar,tamano,uso,idsistemafichero,idnombreso,idimagen)"
143                                        " VALUES(%d,%s,'%s',%s,0x%s,%s,%s,%d,%d,0)",
144                                        ido, disk, disk_type, par, cpt, tam, uso, idsfi, idsoi);
[fa6b891]145                        if (!result_update) {
146                                dbi_conn_error(dbi->conn, &msglog);
[bf8ba6c]147                                syslog(LOG_ERR, "failed to query database (%s:%d) %s\n",
148                                       __func__, __LINE__, msglog);
[9dea2d6]149                                return false;
[b9eb98b]150                        }
[fa6b891]151                        dbi_result_free(result_update);
152
[b9eb98b]153                } else { // Existe el registro
[9dea2d6]154                        swu = true; // Se supone que algún dato ha cambiado
[fa6b891]155
[ab32ed8]156                        dato = dbi_result_get_longlong(result, "tamano");
[fa6b891]157                        if (atoi(tam) == dato) {// Parámetro tamaño igual al almacenado
158                                dato = dbi_result_get_uint(result, "idsistemafichero");
159                                if (idsfi == dato) {// Parámetro sistema de fichero igual al almacenado
160                                        dato = dbi_result_get_uint(result, "idnombreso");
161                                        if (idsoi == dato) {// Parámetro sistema de fichero distinto al almacenado
[1845104]162                                                swu = false; // Todos los parámetros de la partición son iguales, no se actualiza
[b9eb98b]163                                        }
164                                }
165                        }
166                        if (swu) { // Hay que actualizar los parámetros de la partición
[fa6b891]167                                result_update = dbi_conn_queryf(dbi->conn,
168                                        "UPDATE ordenadores_particiones SET "
[b9eb98b]169                                        " codpar=0x%s,"
170                                        " tamano=%s,"
[c4b75b1]171                                        " uso=%s,"
[b9eb98b]172                                        " idsistemafichero=%d,"
173                                        " idnombreso=%d,"
[599c505]174                                        " idimagen=0,"
175                                        " idperfilsoft=0,"
176                                        " fechadespliegue=NULL"
[99f74d8]177                                        " WHERE idordenador=%d AND numdisk=%s AND numpar=%s",
[c4b75b1]178                                        cpt, tam, uso, idsfi, idsoi, ido, disk, par);
[d56675d]179                        } else {  // Actualizar porcentaje de uso.
[fa6b891]180                                result_update = dbi_conn_queryf(dbi->conn,
181                                        "UPDATE ordenadores_particiones SET "
[696c5bb]182                                        " codpar=0x%s,"
[d56675d]183                                        " uso=%s"
184                                        " WHERE idordenador=%d AND numdisk=%s AND numpar=%s",
[696c5bb]185                                        cpt, uso, ido, disk, par);
[d56675d]186                        }
[fa6b891]187                        if (!result_update) {
188                                dbi_conn_error(dbi->conn, &msglog);
[b56cbeb]189                                syslog(LOG_ERR, "failed to query database (%s:%d) %s\n",
190                                       __func__, __LINE__, msglog);
[9dea2d6]191                                return false;
[b9eb98b]192                        }
[fa6b891]193
194                        dbi_result_free(result_update);
[b9eb98b]195                }
[bf8ba6c]196                dbi_result_free(result);
[b9eb98b]197        }
[9a2dc88]198        lon += sprintf(tbPar + lon, "(0,0)");
[b9eb98b]199        // Eliminar particiones almacenadas que ya no existen
[fa6b891]200        result_update = dbi_conn_queryf(dbi->conn,
201                "DELETE FROM ordenadores_particiones WHERE idordenador=%d AND (numdisk, numpar) NOT IN (%s)",
[9a2dc88]202                        ido, tbPar);
[fa6b891]203        if (!result_update) {
204                dbi_conn_error(dbi->conn, &msglog);
[b56cbeb]205                syslog(LOG_ERR, "failed to query database (%s:%d) %s\n",
206                       __func__, __LINE__, msglog);
[9dea2d6]207                return false;
[b9eb98b]208        }
[fa6b891]209        dbi_result_free(result_update);
210
[9dea2d6]211        return true;
[b9eb98b]212}
213// ________________________________________________________________________________________________________
214// Función: checkDato
215//
216//      Descripción:
217//               Esta función comprueba si existe un dato en una tabla y si no es así lo incluye. devuelve en
218//              cualquier caso el identificador del registro existenet o del insertado
219//      Parámetros:
220//              - db: Objeto base de datos (ya operativo)
221//              - tbl: Objeto tabla
222//              - dato: Dato
223//              - tabla: Nombre de la tabla
224//              - nomdato: Nombre del dato en la tabla
225//              - nomidentificador: Nombre del identificador en la tabla
226//      Devuelve:
227//              El identificador del registro existente o el del insertado
228//
229//      Especificaciones:
230//              En caso de producirse algún error se devuelve el valor 0
231// ________________________________________________________________________________________________________
232
[fa6b891]233int checkDato(struct og_dbi *dbi, char *dato, const char *tabla,
[59fb4d5]234                     const char *nomdato, const char *nomidentificador)
235{
[fa6b891]236        const char *msglog;
[b9eb98b]237        int identificador;
[fa6b891]238        dbi_result result;
[b9eb98b]239
240        if (strlen(dato) == 0)
241                return (0); // EL dato no tiene valor
[fa6b891]242        result = dbi_conn_queryf(dbi->conn,
243                        "SELECT %s FROM %s WHERE %s ='%s'", nomidentificador,
[b9eb98b]244                        tabla, nomdato, dato);
245
246        // Ejecuta consulta
[fa6b891]247        if (!result) {
248                dbi_conn_error(dbi->conn, &msglog);
[b56cbeb]249                syslog(LOG_ERR, "failed to query database (%s:%d) %s\n",
250                       __func__, __LINE__, msglog);
[b9eb98b]251                return (0);
252        }
[fa6b891]253        if (!dbi_result_next_row(result)) { //  Software NO existente
254                dbi_result_free(result);
255
256                result = dbi_conn_queryf(dbi->conn,
257                                "INSERT INTO %s (%s) VALUES('%s')", tabla, nomdato, dato);
258                if (!result) {
259                        dbi_conn_error(dbi->conn, &msglog);
[9c8a139]260                        syslog(LOG_ERR, "failed to query database (%s:%d) %s\n",
261                               __func__, __LINE__, msglog);
[b9eb98b]262                        return (0);
263                }
264                // Recupera el identificador del software
[fa6b891]265                identificador = dbi_conn_sequence_last(dbi->conn, NULL);
[b9eb98b]266        } else {
[fa6b891]267                identificador = dbi_result_get_uint(result, nomidentificador);
[b9eb98b]268        }
[fa6b891]269        dbi_result_free(result);
270
[b9eb98b]271        return (identificador);
272}
[96b9bb8]273
[2baf362]274enum wol_delivery_type {
275        OG_WOL_BROADCAST = 1,
276        OG_WOL_UNICAST = 2
277};
278
[b9eb98b]279//_____________________________________________________________________________________________________________
280// Función: WakeUp
281//
282//       Descripción:
283//              Enciende el ordenador cuya MAC se pasa como parámetro
284//      Parámetros:
285//              - s : Socket para enviar trama magic packet
[0cee7a6]286//              - iph : Cadena con la dirección ip
[b9eb98b]287//              - mac : Cadena con la dirección mac en formato XXXXXXXXXXXX
[0cee7a6]288//              - mar: Método de arranque (1=Broadcast, 2=Unicast)
[b9eb98b]289//      Devuelve:
[9dea2d6]290//              true: Si el proceso es correcto
291//              false: En caso de ocurrir algún error
[b9eb98b]292//_____________________________________________________________________________________________________________
[0cee7a6]293//
[41ac15d]294bool WakeUp(int s, const char *iph, const char *mac, const char *netmask, const char *mar)
[0cee7a6]295{
[06af0c2]296        struct in_addr addr, netmask_addr, broadcast_addr ={};
[429bd36]297        unsigned int macaddr[OG_WOL_MACADDR_LEN];
[2baf362]298        char HDaddress_bin[OG_WOL_MACADDR_LEN];
299        struct sockaddr_in WakeUpCliente;
300        struct wol_msg Trama_WakeUp;
301        bool ret;
302        int i;
[b9eb98b]303
[4bd4097]304        if (!inet_aton(iph, &addr)) {
[06af0c2]305                syslog(LOG_ERR, "bad IP address\n");
306                return false;
307        }
308
[4bd4097]309        if (!inet_aton(netmask, &netmask_addr)) {
[06af0c2]310                syslog(LOG_ERR, "bad netmask address: %s\n", netmask);
311                return false;
312        }
313
314        broadcast_addr.s_addr = addr.s_addr | ~netmask_addr.s_addr;
315
[b9eb98b]316        for (i = 0; i < 6; i++) // Primera secuencia de la trama Wake Up (0xFFFFFFFFFFFF)
317                Trama_WakeUp.secuencia_FF[i] = 0xFF;
318
[63a3d4d]319        sscanf(mac, "%02x%02x%02x%02x%02x%02x",
[429bd36]320               &macaddr[0], &macaddr[1], &macaddr[2],
321               &macaddr[3], &macaddr[4], &macaddr[5]);
322
323        for (i = 0; i < 6; i++)
324                HDaddress_bin[i] = (uint8_t)macaddr[i];
[b9eb98b]325
326        for (i = 0; i < 16; i++) // Segunda secuencia de la trama Wake Up , repetir 16 veces su la MAC
327                memcpy(&Trama_WakeUp.macbin[i][0], &HDaddress_bin, 6);
328
329        /* Creación de socket del cliente que recibe la trama magic packet */
330        WakeUpCliente.sin_family = AF_INET;
331        WakeUpCliente.sin_port = htons((short) PUERTO_WAKEUP);
332
[2baf362]333        switch (atoi(mar)) {
334        case OG_WOL_BROADCAST:
[b38ed0d]335                ret = wake_up_broadcast(s, &WakeUpCliente, &Trama_WakeUp);
[96b02b5]336                ret &= wake_up_send(s, &WakeUpCliente, &Trama_WakeUp,
337                                    &broadcast_addr);
[2baf362]338                break;
339        case OG_WOL_UNICAST:
[96b02b5]340                ret = wake_up_send(s, &WakeUpCliente, &Trama_WakeUp, &addr);
[2baf362]341                break;
342        default:
343                syslog(LOG_ERR, "unknown wol type\n");
344                ret = false;
345                break;
346        }
347        return ret;
[b9eb98b]348}
349
350// ________________________________________________________________________________________________________
351// Función: actualizaCreacionImagen
352//
353//      Descripción:
354//              Esta función actualiza la base de datos con el resultado de la creación de una imagen
355//      Parámetros:
356//              - db: Objeto base de datos (ya operativo)
357//              - tbl: Objeto tabla
358//              - idi: Identificador de la imagen
[599c505]359//              - dsk: Disco de donde se creó
[b9eb98b]360//              - par: Partición de donde se creó
361//              - cpt: Código de partición
362//              - ipr: Ip del repositorio
363//              - ido: Identificador del ordenador modelo
364//      Devuelve:
[9dea2d6]365//              true: Si el proceso es correcto
366//              false: En caso de ocurrir algún error
[b9eb98b]367// ________________________________________________________________________________________________________
[9cc156c]368bool actualizaCreacionImagen(struct og_dbi *dbi, char *idi, char *dsk,
[59fb4d5]369                             char *par, char *cpt, char *ipr, char *ido)
370{
[9cc156c]371        const char *msglog;
372        dbi_result result;
[ed05cd5]373        int idr,ifs;
[b9eb98b]374
[80d1dfd]375        /* Toma identificador del repositorio correspondiente al ordenador modelo */
[9cc156c]376        result = dbi_conn_queryf(dbi->conn,
[599c505]377                        "SELECT repositorios.idrepositorio"
[80d1dfd]378                        "  FROM repositorios"
379                        "  LEFT JOIN ordenadores USING (idrepositorio)"
380                        " WHERE repositorios.ip='%s' AND ordenadores.idordenador=%s", ipr, ido);
[b9eb98b]381
[9cc156c]382        if (!result) {
383                dbi_conn_error(dbi->conn, &msglog);
[b56cbeb]384                syslog(LOG_ERR, "failed to query database (%s:%d) %s\n",
385                       __func__, __LINE__, msglog);
[9dea2d6]386                return false;
[b9eb98b]387        }
[9cc156c]388        if (!dbi_result_next_row(result)) {
389                syslog(LOG_ERR,
390                       "repository does not exist in database (%s:%d)\n",
391                       __func__, __LINE__);
392                dbi_result_free(result);
[9dea2d6]393                return false;
[b9eb98b]394        }
[9cc156c]395        idr = dbi_result_get_uint(result, "idrepositorio");
396        dbi_result_free(result);
[b9eb98b]397
398        /* Toma identificador del perfilsoftware */
[9cc156c]399        result = dbi_conn_queryf(dbi->conn,
[599c505]400                        "SELECT idperfilsoft"
401                        "  FROM ordenadores_particiones"
402                        " WHERE idordenador=%s AND numdisk=%s AND numpar=%s", ido, dsk, par);
[b9eb98b]403
[9cc156c]404        if (!result) {
405                dbi_conn_error(dbi->conn, &msglog);
[b56cbeb]406                syslog(LOG_ERR, "failed to query database (%s:%d) %s\n",
407                       __func__, __LINE__, msglog);
[9dea2d6]408                return false;
[b9eb98b]409        }
[9cc156c]410        if (!dbi_result_next_row(result)) {
411                syslog(LOG_ERR,
412                       "software profile does not exist in database (%s:%d)\n",
413                       __func__, __LINE__);
414                dbi_result_free(result);
[9dea2d6]415                return false;
[b9eb98b]416        }
[9cc156c]417        ifs = dbi_result_get_uint(result, "idperfilsoft");
418        dbi_result_free(result);
[b9eb98b]419
420        /* Actualizar los datos de la imagen */
[9cc156c]421        result = dbi_conn_queryf(dbi->conn,
[faee12e]422                "UPDATE imagenes"
423                "   SET idordenador=%s, numdisk=%s, numpar=%s, codpar=%s,"
424                "       idperfilsoft=%d, idrepositorio=%d,"
425                "       fechacreacion=NOW(), revision=revision+1"
426                " WHERE idimagen=%s", ido, dsk, par, cpt, ifs, idr, idi);
[b9eb98b]427
[9cc156c]428        if (!result) {
429                dbi_conn_error(dbi->conn, &msglog);
[b56cbeb]430                syslog(LOG_ERR, "failed to query database (%s:%d) %s\n",
431                       __func__, __LINE__, msglog);
[9dea2d6]432                return false;
[b9eb98b]433        }
[9cc156c]434        dbi_result_free(result);
435
[faee12e]436        /* Actualizar los datos en el cliente */
[9cc156c]437        result = dbi_conn_queryf(dbi->conn,
[faee12e]438                "UPDATE ordenadores_particiones"
[ed05cd5]439                "   SET idimagen=%s, revision=(SELECT revision FROM imagenes WHERE idimagen=%s),"
440                "       fechadespliegue=NOW()"
[faee12e]441                " WHERE idordenador=%s AND numdisk=%s AND numpar=%s",
[ed05cd5]442                idi, idi, ido, dsk, par);
[9cc156c]443        if (!result) {
444                dbi_conn_error(dbi->conn, &msglog);
[b56cbeb]445                syslog(LOG_ERR, "failed to query database (%s:%d) %s\n",
446                       __func__, __LINE__, msglog);
[9dea2d6]447                return false;
[faee12e]448        }
[e81d230]449        dbi_result_free(result);
[b9eb98b]450
[e81d230]451        return true;
[eb99080]452}
[e81d230]453
[eb99080]454// ________________________________________________________________________________________________________
[b9eb98b]455// Función: actualizaHardware
456//
457//              Descripción:
458//                      Actualiza la base de datos con la configuracion hardware del cliente
459//              Parámetros:
460//                      - db: Objeto base de datos (ya operativo)
461//                      - tbl: Objeto tabla
462//                      - hrd: cadena con el inventario hardware
463//                      - ido: Identificador del ordenador
464//                      - npc: Nombre del ordenador
465//                      - idc: Identificador del centro o Unidad organizativa
466// ________________________________________________________________________________________________________
[eb99080]467//
[03f1941]468bool actualizaHardware(struct og_dbi *dbi, char *hrd, char *ido, char *npc,
[59fb4d5]469                       char *idc)
[eb99080]470{
[03f1941]471        const char *msglog;
[b9eb98b]472        int idtipohardware, idperfilhard;
473        int lon, i, j, aux;
[7f46c45]474        bool retval;
[eb99080]475        char *whard;
[b9eb98b]476        int tbidhardware[MAXHARDWARE];
[03f1941]477        char *tbHardware[MAXHARDWARE],*dualHardware[2], strInt[LONINT], *idhardwares;
478        dbi_result result;
[b9eb98b]479
480        /* Toma Centro (Unidad Organizativa) */
[03f1941]481        result = dbi_conn_queryf(dbi->conn,
482                                 "SELECT idperfilhard FROM ordenadores WHERE idordenador=%s",
483                                 ido);
484        if (!result) {
485                dbi_conn_error(dbi->conn, &msglog);
[b56cbeb]486                syslog(LOG_ERR, "failed to query database (%s:%d) %s\n",
487                       __func__, __LINE__, msglog);
[9dea2d6]488                return false;
[b9eb98b]489        }
[03f1941]490        if (!dbi_result_next_row(result)) {
491                syslog(LOG_ERR, "client does not exist in database (%s:%d)\n",
492                       __func__, __LINE__);
493                dbi_result_free(result);
[9dea2d6]494                return false;
[b9eb98b]495        }
[03f1941]496        idperfilhard = dbi_result_get_uint(result, "idperfilhard");
497        dbi_result_free(result);
498
[eb99080]499        whard=escaparCadena(hrd); // Codificar comillas simples
500        if(!whard)
[9dea2d6]501                return false;
[b9eb98b]502        /* Recorre componentes hardware*/
[eb99080]503        lon = splitCadena(tbHardware, whard, '\n');
[b9eb98b]504        if (lon > MAXHARDWARE)
505                lon = MAXHARDWARE; // Limita el número de componentes hardware
506        /*
507         for (i=0;i<lon;i++){
508         sprintf(msglog,"Linea de inventario: %s",tbHardware[i]);
[9dea2d6]509         RegistraLog(msglog,false);
[b9eb98b]510         }
511         */
512        for (i = 0; i < lon; i++) {
513                splitCadena(dualHardware, rTrim(tbHardware[i]), '=');
514                //sprintf(msglog,"nemonico: %s",dualHardware[0]);
[9dea2d6]515                //RegistraLog(msglog,false);
[b9eb98b]516                //sprintf(msglog,"valor: %s",dualHardware[1]);
[9dea2d6]517                //RegistraLog(msglog,false);
[03f1941]518                result = dbi_conn_queryf(dbi->conn,
519                                         "SELECT idtipohardware,descripcion FROM tipohardwares WHERE nemonico='%s'",
520                                         dualHardware[0]);
521                if (!result) {
522                        dbi_conn_error(dbi->conn, &msglog);
[b56cbeb]523                        syslog(LOG_ERR, "failed to query database (%s:%d) %s\n",
524                               __func__, __LINE__, msglog);
[9dea2d6]525                        return false;
[b9eb98b]526                }
[03f1941]527                if (!dbi_result_next_row(result)) { //  Tipo de Hardware NO existente
528                        dbi_result_free(result);
[9dea2d6]529                        return false;
[b9eb98b]530                } else { //  Tipo de Hardware Existe
[03f1941]531                        idtipohardware = dbi_result_get_uint(result, "idtipohardware");
532                        dbi_result_free(result);
[b9eb98b]533
[03f1941]534                        result = dbi_conn_queryf(dbi->conn,
535                                                 "SELECT idhardware FROM hardwares WHERE idtipohardware=%d AND descripcion='%s'",
536                                                 idtipohardware, dualHardware[1]);
[b9eb98b]537
[03f1941]538                        if (!result) {
539                                dbi_conn_error(dbi->conn, &msglog);
[b56cbeb]540                                syslog(LOG_ERR, "failed to query database (%s:%d) %s\n",
541                                       __func__, __LINE__, msglog);
[9dea2d6]542                                return false;
[b9eb98b]543                        }
544
[03f1941]545                        if (!dbi_result_next_row(result)) { //  Hardware NO existente
546                                dbi_result_free(result);
547                                result = dbi_conn_queryf(dbi->conn,
548                                                        "INSERT hardwares (idtipohardware,descripcion,idcentro,grupoid) "
[b9eb98b]549                                                        " VALUES(%d,'%s',%s,0)", idtipohardware,
550                                                dualHardware[1], idc);
[03f1941]551                                if (!result) {
552                                        dbi_conn_error(dbi->conn, &msglog);
[b56cbeb]553                                        syslog(LOG_ERR, "failed to query database (%s:%d) %s\n",
554                                               __func__, __LINE__, msglog);
[9dea2d6]555                                        return false;
[b9eb98b]556                                }
[03f1941]557
558                                // Recupera el identificador del hardware
559                                tbidhardware[i] = dbi_conn_sequence_last(dbi->conn, NULL);
[b9eb98b]560                        } else {
[03f1941]561                                tbidhardware[i] = dbi_result_get_uint(result, "idhardware");
[b9eb98b]562                        }
[03f1941]563                        dbi_result_free(result);
[b9eb98b]564                }
565        }
566        // Ordena tabla de identificadores para cosultar si existe un pefil con esas especificaciones
567
568        for (i = 0; i < lon - 1; i++) {
569                for (j = i + 1; j < lon; j++) {
570                        if (tbidhardware[i] > tbidhardware[j]) {
571                                aux = tbidhardware[i];
572                                tbidhardware[i] = tbidhardware[j];
573                                tbidhardware[j] = aux;
574                        }
575                }
576        }
577        /* Crea cadena de identificadores de componentes hardware separados por coma */
578        sprintf(strInt, "%d", tbidhardware[lon - 1]); // Pasa a cadena el último identificador que es de mayor longitud
579        aux = strlen(strInt); // Calcula longitud de cadena para reservar espacio a todos los perfiles
[eba3c79]580        idhardwares = calloc(1, sizeof(aux) * lon + lon);
[b9eb98b]581        if (idhardwares == NULL) {
[b56cbeb]582                syslog(LOG_ERR, "%s:%d OOM\n", __FILE__, __LINE__);
[9dea2d6]583                return false;
[b9eb98b]584        }
585        aux = sprintf(idhardwares, "%d", tbidhardware[0]);
586        for (i = 1; i < lon; i++)
587                aux += sprintf(idhardwares + aux, ",%d", tbidhardware[i]);
588
[03f1941]589        if (!cuestionPerfilHardware(dbi, idc, ido, idperfilhard, idhardwares,
[b9eb98b]590                        npc, tbidhardware, lon)) {
[b56cbeb]591                syslog(LOG_ERR, "Problem updating client hardware\n");
[9dea2d6]592                retval=false;
[01586d6]593        } else {
[9dea2d6]594                retval=true;
[7f46c45]595        }
[01586d6]596        free(whard);
597        free(idhardwares);
598
[7f46c45]599        return (retval);
[b9eb98b]600}
601// ________________________________________________________________________________________________________
602// Función: cuestionPerfilHardware
603//
604//              Descripción:
605//                      Comprueba existencia de perfil hardware y actualización de éste para el ordenador
606//              Parámetros:
607//                      - db: Objeto base de datos (ya operativo)
608//                      - tbl: Objeto tabla
609//                      - idc: Identificador de la Unidad organizativa donde se encuentra el cliente
610//                      - ido: Identificador del ordenador
611//                      - tbidhardware: Identificador del tipo de hardware
612//                      - con: Número de componentes detectados para configurar un el perfil hardware
613//                      - npc: Nombre del cliente
614// ________________________________________________________________________________________________________
[03f1941]615bool cuestionPerfilHardware(struct og_dbi *dbi, char *idc, char *ido,
[59fb4d5]616                int idperfilhardware, char *idhardwares, char *npc, int *tbidhardware,
[b9eb98b]617                int lon)
618{
[03f1941]619        const char *msglog;
620        dbi_result result;
[b9eb98b]621        int i;
622        int nwidperfilhard;
623
624        // Busca perfil hard del ordenador que contenga todos los componentes hardware encontrados
[03f1941]625        result = dbi_conn_queryf(dbi->conn,
626                "SELECT idperfilhard FROM"
[b9eb98b]627                " (SELECT perfileshard_hardwares.idperfilhard as idperfilhard,"
628                "       group_concat(cast(perfileshard_hardwares.idhardware AS char( 11) )"
629                "       ORDER BY perfileshard_hardwares.idhardware SEPARATOR ',' ) AS idhardwares"
630                " FROM  perfileshard_hardwares"
631                " GROUP BY perfileshard_hardwares.idperfilhard) AS temp"
632                " WHERE idhardwares LIKE '%s'", idhardwares);
[b56cbeb]633
[03f1941]634        if (!result) {
635                dbi_conn_error(dbi->conn, &msglog);
[b56cbeb]636                syslog(LOG_ERR, "failed to query database (%s:%d) %s\n",
637                       __func__, __LINE__, msglog);
[9dea2d6]638                return false;
[b9eb98b]639        }
[03f1941]640        if (!dbi_result_next_row(result)) {
641                // No existe un perfil hardware con esos componentes de componentes hardware, lo crea
642                dbi_result_free(result);
643                result = dbi_conn_queryf(dbi->conn,
644                                "INSERT perfileshard  (descripcion,idcentro,grupoid)"
[bde1389]645                                " VALUES('Perfil hardware (%s) ',%s,0)", npc, idc);
[03f1941]646                if (!result) {
647                        dbi_conn_error(dbi->conn, &msglog);
648                        syslog(LOG_ERR, "failed to query database (%s:%d) %s\n",
649                               __func__, __LINE__, msglog);
[9dea2d6]650                        return false;
[b9eb98b]651                }
[03f1941]652                dbi_result_free(result);
653
[b9eb98b]654                // Recupera el identificador del nuevo perfil hardware
[03f1941]655                nwidperfilhard = dbi_conn_sequence_last(dbi->conn, NULL);
656
[b9eb98b]657                // Crea la relación entre perfiles y componenetes hardware
658                for (i = 0; i < lon; i++) {
[03f1941]659                        result = dbi_conn_queryf(dbi->conn,
660                                        "INSERT perfileshard_hardwares  (idperfilhard,idhardware)"
[b9eb98b]661                                                " VALUES(%d,%d)", nwidperfilhard, tbidhardware[i]);
[03f1941]662                        if (!result) {
663                                dbi_conn_error(dbi->conn, &msglog);
664                                syslog(LOG_ERR, "failed to query database (%s:%d) %s\n",
665                                       __func__, __LINE__, msglog);
[9dea2d6]666                                return false;
[b9eb98b]667                        }
[03f1941]668                        dbi_result_free(result);
[b9eb98b]669                }
670        } else { // Existe un perfil con todos esos componentes
[03f1941]671                nwidperfilhard = dbi_result_get_uint(result, "idperfilhard");
672                dbi_result_free(result);
[b9eb98b]673        }
674        if (idperfilhardware != nwidperfilhard) { // No coinciden los perfiles
675                // Actualiza el identificador del perfil hardware del ordenador
[03f1941]676                result = dbi_conn_queryf(dbi->conn,
677                        "UPDATE ordenadores SET idperfilhard=%d"
[b9eb98b]678                        " WHERE idordenador=%s", nwidperfilhard, ido);
[03f1941]679                if (!result) {
680                        dbi_conn_error(dbi->conn, &msglog);
681                        syslog(LOG_ERR, "failed to query database (%s:%d) %s\n",
682                               __func__, __LINE__, msglog);
[9dea2d6]683                        return false;
[b9eb98b]684                }
[03f1941]685                dbi_result_free(result);
[b9eb98b]686        }
687        /* Eliminar Relación de hardwares con Perfiles hardware que quedan húerfanos */
[03f1941]688        result = dbi_conn_queryf(dbi->conn,
689                "DELETE FROM perfileshard_hardwares WHERE idperfilhard IN "
[b9eb98b]690                " (SELECT idperfilhard FROM perfileshard WHERE idperfilhard NOT IN"
691                " (SELECT DISTINCT idperfilhard from ordenadores))");
[03f1941]692        if (!result) {
693                dbi_conn_error(dbi->conn, &msglog);
694                syslog(LOG_ERR, "failed to query database (%s:%d) %s\n",
695                       __func__, __LINE__, msglog);
[9dea2d6]696                return false;
[b9eb98b]697        }
[03f1941]698        dbi_result_free(result);
[b9eb98b]699
700        /* Eliminar Perfiles hardware que quedan húerfanos */
[03f1941]701        result = dbi_conn_queryf(dbi->conn,
702                        "DELETE FROM perfileshard WHERE idperfilhard NOT IN"
[7f46c45]703                        " (SELECT DISTINCT idperfilhard FROM ordenadores)");
[03f1941]704        if (!result) {
705                dbi_conn_error(dbi->conn, &msglog);
706                syslog(LOG_ERR, "failed to query database (%s:%d) %s\n",
707                       __func__, __LINE__, msglog);
[9dea2d6]708                return false;
[b9eb98b]709        }
[03f1941]710        dbi_result_free(result);
711
[b9eb98b]712        /* Eliminar Relación de hardwares con Perfiles hardware que quedan húerfanos */
[03f1941]713        result = dbi_conn_queryf(dbi->conn,
714                        "DELETE FROM perfileshard_hardwares WHERE idperfilhard NOT IN"
[7f46c45]715                        " (SELECT idperfilhard FROM perfileshard)");
[03f1941]716        if (!result) {
717                dbi_conn_error(dbi->conn, &msglog);
718                syslog(LOG_ERR, "failed to query database (%s:%d) %s\n",
719                       __func__, __LINE__, msglog);
[9dea2d6]720                return false;
[b9eb98b]721        }
[03f1941]722        dbi_result_free(result);
723
[9dea2d6]724        return true;
[b9eb98b]725}
726// ________________________________________________________________________________________________________
727// Función: actualizaSoftware
728//
729//      Descripción:
730//              Actualiza la base de datos con la configuración software del cliente
731//      Parámetros:
732//              - db: Objeto base de datos (ya operativo)
733//              - tbl: Objeto tabla
734//              - sft: cadena con el inventario software
735//              - par: Número de la partición
736//              - ido: Identificador del ordenador del cliente en la tabla
737//              - npc: Nombre del ordenador
738//              - idc: Identificador del centro o Unidad organizativa
739//      Devuelve:
[9dea2d6]740//              true: Si el proceso es correcto
741//              false: En caso de ocurrir algún error
[8712fd9]742//
743//      Versión 1.1.0: Se incluye el sistema operativo. Autora: Irina Gómez - ETSII Universidad Sevilla
[b9eb98b]744// ________________________________________________________________________________________________________
[fa6b891]745bool actualizaSoftware(struct og_dbi *dbi, char *sft, char *par,char *ido,
[59fb4d5]746                       char *npc, char *idc)
[eb99080]747{
[8712fd9]748        int i, j, lon, aux, idperfilsoft, idnombreso;
[7f46c45]749        bool retval;
[eb99080]750        char *wsft;
[b9eb98b]751        int tbidsoftware[MAXSOFTWARE];
[fa6b891]752        char *tbSoftware[MAXSOFTWARE], strInt[LONINT], *idsoftwares;
753        const char *msglog;
754        dbi_result result;
[b9eb98b]755
756        /* Toma Centro (Unidad Organizativa) y perfil software */
[fa6b891]757        result = dbi_conn_queryf(dbi->conn,
758                "SELECT idperfilsoft,numpar"
[b9eb98b]759                " FROM ordenadores_particiones"
760                " WHERE idordenador=%s", ido);
[fa6b891]761        if (!result) {
762                dbi_conn_error(dbi->conn, &msglog);
[b56cbeb]763                syslog(LOG_ERR, "failed to query database (%s:%d) %s\n",
764                       __func__, __LINE__, msglog);
[9dea2d6]765                return false;
[b9eb98b]766        }
767        idperfilsoft = 0; // Por defecto se supone que el ordenador no tiene aún detectado el perfil software
[fa6b891]768        while (dbi_result_next_row(result)) {
769                aux = dbi_result_get_uint(result, "numpar");
[b9eb98b]770                if (aux == atoi(par)) { // Se encuentra la partición
[fa6b891]771                        idperfilsoft = dbi_result_get_uint(result, "idperfilsoft");
[b9eb98b]772                        break;
773                }
774        }
[fa6b891]775        dbi_result_free(result);
[eb99080]776        wsft=escaparCadena(sft); // Codificar comillas simples
777        if(!wsft)
[9dea2d6]778                return false;
[b9eb98b]779
780        /* Recorre componentes software*/
[eb99080]781        lon = splitCadena(tbSoftware, wsft, '\n');
782
[b9eb98b]783        if (lon == 0)
[9dea2d6]784                return true; // No hay lineas que procesar
[b9eb98b]785        if (lon > MAXSOFTWARE)
786                lon = MAXSOFTWARE; // Limita el número de componentes software
787
[1c0eaf2]788        idnombreso = 0;
[b9eb98b]789        for (i = 0; i < lon; i++) {
[8712fd9]790                // Primera línea es el sistema operativo: se obtiene identificador
791                if (i == 0) {
[fa6b891]792                        idnombreso = checkDato(dbi, rTrim(tbSoftware[i]), "nombresos", "nombreso", "idnombreso");
[8712fd9]793                        continue;
794                }
795
[fa6b891]796                result = dbi_conn_queryf(dbi->conn,
[b9eb98b]797                                "SELECT idsoftware FROM softwares WHERE descripcion ='%s'",
798                                rTrim(tbSoftware[i]));
[fa6b891]799                if (!result) {
800                        dbi_conn_error(dbi->conn, &msglog);
[b56cbeb]801                        syslog(LOG_ERR, "failed to query database (%s:%d) %s\n",
802                               __func__, __LINE__, msglog);
[9dea2d6]803                        return false;
[b9eb98b]804                }
805
[fa6b891]806                if (!dbi_result_next_row(result)) {
807                        dbi_result_free(result);
808                        result = dbi_conn_queryf(dbi->conn,
809                                                "INSERT INTO softwares (idtiposoftware,descripcion,idcentro,grupoid)"
[b9eb98b]810                                                " VALUES(2,'%s',%s,0)", tbSoftware[i], idc);
[fa6b891]811                        if (!result) { // Error al insertar
812                                dbi_conn_error(dbi->conn, &msglog);
[26736ed]813                                syslog(LOG_ERR, "failed to query database (%s:%d) %s\n",
814                                       __func__, __LINE__, msglog);
[9dea2d6]815                                return false;
[b9eb98b]816                        }
[fa6b891]817
[b9eb98b]818                        // Recupera el identificador del software
[6fc89cd]819                        tbidsoftware[i - 1] = dbi_conn_sequence_last(dbi->conn, NULL);
[b9eb98b]820                } else {
[6fc89cd]821                        tbidsoftware[i - 1] = dbi_result_get_uint(result, "idsoftware");
[b9eb98b]822                }
[26736ed]823                dbi_result_free(result);
[b9eb98b]824        }
[6fc89cd]825        lon--;
[b9eb98b]826
827        // Ordena tabla de identificadores para cosultar si existe un pefil con esas especificaciones
828
829        for (i = 0; i < lon - 1; i++) {
830                for (j = i + 1; j < lon; j++) {
831                        if (tbidsoftware[i] > tbidsoftware[j]) {
832                                aux = tbidsoftware[i];
833                                tbidsoftware[i] = tbidsoftware[j];
834                                tbidsoftware[j] = aux;
835                        }
836                }
837        }
838        /* Crea cadena de identificadores de componentes software separados por coma */
839        sprintf(strInt, "%d", tbidsoftware[lon - 1]); // Pasa a cadena el último identificador que es de mayor longitud
840        aux = strlen(strInt); // Calcula longitud de cadena para reservar espacio a todos los perfiles
[eba3c79]841        idsoftwares = calloc(1, (sizeof(aux)+1) * lon + lon);
[b9eb98b]842        if (idsoftwares == NULL) {
[b56cbeb]843                syslog(LOG_ERR, "%s:%d OOM\n", __FILE__, __LINE__);
[9dea2d6]844                return false;
[b9eb98b]845        }
846        aux = sprintf(idsoftwares, "%d", tbidsoftware[0]);
847        for (i = 1; i < lon; i++)
848                aux += sprintf(idsoftwares + aux, ",%d", tbidsoftware[i]);
849
850        // Comprueba existencia de perfil software y actualización de éste para el ordenador
[fa6b891]851        if (!cuestionPerfilSoftware(dbi, idc, ido, idperfilsoft, idnombreso, idsoftwares,
[b9eb98b]852                        npc, par, tbidsoftware, lon)) {
[9c8a139]853                syslog(LOG_ERR, "failed to query database (%s:%d) %s\n",
854                       __func__, __LINE__, msglog);
[9dea2d6]855                retval=false;
[01586d6]856        } else {
[9dea2d6]857                retval=true;
[7f46c45]858        }
[01586d6]859        free(wsft);
860        free(idsoftwares);
861
862        return retval;
[b9eb98b]863}
864// ________________________________________________________________________________________________________
865// Función: CuestionPerfilSoftware
866//
867//      Parámetros:
868//              - db: Objeto base de datos (ya operativo)
869//              - tbl: Objeto tabla
870//              - idcentro: Identificador del centro en la tabla
871//              - ido: Identificador del ordenador del cliente en la tabla
[8712fd9]872//              - idnombreso: Identificador del sistema operativo
[b9eb98b]873//              - idsoftwares: Cadena con los identificadores de componentes software separados por comas
874//              - npc: Nombre del ordenador del cliente
875//              - particion: Número de la partición
876//              - tbidsoftware: Array con los identificadores de componentes software
877//              - lon: Número de componentes
878//      Devuelve:
[9dea2d6]879//              true: Si el proceso es correcto
880//              false: En caso de ocurrir algún error
[8712fd9]881//
882//      Versión 1.1.0: Se incluye el sistema operativo. Autora: Irina Gómez - ETSII Universidad Sevilla
883//_________________________________________________________________________________________________________
[fa6b891]884bool cuestionPerfilSoftware(struct og_dbi *dbi, char *idc, char *ido,
[59fb4d5]885                            int idperfilsoftware, int idnombreso,
886                            char *idsoftwares, char *npc, char *par,
887                            int *tbidsoftware, int lon)
888{
[b9eb98b]889        int i, nwidperfilsoft;
[fa6b891]890        const char *msglog;
891        dbi_result result;
[b9eb98b]892
893        // Busca perfil soft del ordenador que contenga todos los componentes software encontrados
[fa6b891]894        result = dbi_conn_queryf(dbi->conn,
895                "SELECT idperfilsoft FROM"
[b9eb98b]896                " (SELECT perfilessoft_softwares.idperfilsoft as idperfilsoft,"
897                "       group_concat(cast(perfilessoft_softwares.idsoftware AS char( 11) )"
898                "       ORDER BY perfilessoft_softwares.idsoftware SEPARATOR ',' ) AS idsoftwares"
899                " FROM  perfilessoft_softwares"
900                " GROUP BY perfilessoft_softwares.idperfilsoft) AS temp"
901                " WHERE idsoftwares LIKE '%s'", idsoftwares);
[b56cbeb]902
[fa6b891]903        if (!result) {
904                dbi_conn_error(dbi->conn, &msglog);
[b56cbeb]905                syslog(LOG_ERR, "failed to query database (%s:%d) %s\n",
906                       __func__, __LINE__, msglog);
[9dea2d6]907                return false;
[b9eb98b]908        }
[fa6b891]909        if (!dbi_result_next_row(result)) { // No existe un perfil software con esos componentes de componentes software, lo crea
910                dbi_result_free(result);
911                result = dbi_conn_queryf(dbi->conn,
912                                "INSERT perfilessoft  (descripcion, idcentro, grupoid, idnombreso)"
[8712fd9]913                                " VALUES('Perfil Software (%s, Part:%s) ',%s,0,%i)", npc, par, idc,idnombreso);
[fa6b891]914                if (!result) {
915                        dbi_conn_error(dbi->conn, &msglog);
[9c8a139]916                        syslog(LOG_ERR, "failed to query database (%s:%d) %s\n",
917                               __func__, __LINE__, msglog);
[9dea2d6]918                        return false;
[b9eb98b]919                }
[fa6b891]920
921                dbi_result_free(result);
[b9eb98b]922                // Recupera el identificador del nuevo perfil software
[fa6b891]923                nwidperfilsoft = dbi_conn_sequence_last(dbi->conn, NULL);
924
[b9eb98b]925                // Crea la relación entre perfiles y componenetes software
926                for (i = 0; i < lon; i++) {
[fa6b891]927                        result = dbi_conn_queryf(dbi->conn,
928                                                "INSERT perfilessoft_softwares (idperfilsoft,idsoftware)"
[b9eb98b]929                                                " VALUES(%d,%d)", nwidperfilsoft, tbidsoftware[i]);
[fa6b891]930                        if (!result) {
931                                dbi_conn_error(dbi->conn, &msglog);
[9c8a139]932                                syslog(LOG_ERR, "failed to query database (%s:%d) %s\n",
933                                       __func__, __LINE__, msglog);
[9dea2d6]934                                return false;
[b9eb98b]935                        }
[fa6b891]936                        dbi_result_free(result);
[b9eb98b]937                }
938        } else { // Existe un perfil con todos esos componentes
[fa6b891]939                nwidperfilsoft = dbi_result_get_uint(result, "idperfilsoft");
940                dbi_result_free(result);
[b9eb98b]941        }
942
943        if (idperfilsoftware != nwidperfilsoft) { // No coinciden los perfiles
944                // Actualiza el identificador del perfil software del ordenador
[fa6b891]945                result = dbi_conn_queryf(dbi->conn,
946                                "UPDATE ordenadores_particiones SET idperfilsoft=%d,idimagen=0"
[7f46c45]947                                " WHERE idordenador=%s AND numpar=%s", nwidperfilsoft, ido, par);
[fa6b891]948                if (!result) { // Error al insertar
949                        dbi_conn_error(dbi->conn, &msglog);
[9c8a139]950                        syslog(LOG_ERR, "failed to query database (%s:%d) %s\n",
951                               __func__, __LINE__, msglog);
[9dea2d6]952                        return false;
[b9eb98b]953                }
[fa6b891]954                dbi_result_free(result);
[b9eb98b]955        }
956
957        /* DEPURACIÓN DE PERFILES SOFTWARE */
958
959        /* Eliminar Perfiles software que quedan húerfanos */
[fa6b891]960        result = dbi_conn_queryf(dbi->conn,
961                "DELETE FROM perfilessoft WHERE idperfilsoft NOT IN"
[b9eb98b]962                " (SELECT DISTINCT idperfilsoft from ordenadores_particiones)"\
963                " AND  idperfilsoft NOT IN"\
964                " (SELECT DISTINCT idperfilsoft from imagenes)");
[fa6b891]965        if (!result) {
966                dbi_conn_error(dbi->conn, &msglog);
[9c8a139]967                syslog(LOG_ERR, "failed to query database (%s:%d) %s\n",
968                       __func__, __LINE__, msglog);
[9dea2d6]969                return false;
[b9eb98b]970        }
[fa6b891]971        dbi_result_free(result),
972
[b9eb98b]973        /* Eliminar Relación de softwares con Perfiles software que quedan húerfanos */
[fa6b891]974        result = dbi_conn_queryf(dbi->conn,
975                        "DELETE FROM perfilessoft_softwares WHERE idperfilsoft NOT IN"
[7f46c45]976                        " (SELECT idperfilsoft from perfilessoft)");
[fa6b891]977        if (!result) {
978                dbi_conn_error(dbi->conn, &msglog);
[9c8a139]979                syslog(LOG_ERR, "failed to query database (%s:%d) %s\n",
980                       __func__, __LINE__, msglog);
[9dea2d6]981                return false;
[b9eb98b]982        }
[fa6b891]983        dbi_result_free(result);
984
[9dea2d6]985        return true;
[b9eb98b]986}
Note: See TracBrowser for help on using the repository browser.