summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/rest.c160
1 files changed, 121 insertions, 39 deletions
diff --git a/src/rest.c b/src/rest.c
index 20b241e..ad7573b 100644
--- a/src/rest.c
+++ b/src/rest.c
@@ -1502,41 +1502,54 @@ static int og_create_boot_file(unsigned int boot_type, const char *mac,
return 0;
}
-static int og_set_client_mode(struct og_dbi *dbi, const char *mac,
- const char *mode)
+struct og_boot_mode_params {
+ const char *ntp;
+ const char *dns;
+ const char *proxy;
+ const char *ip;
+ const char *ipserveradm;
+ const char *nombreaula;
+ const char *repoip;
+ const char *oglivedir;
+ const char *hardprofile;
+ const char *router;
+ const char *netmask;
+ const char *nombreordenador;
+ const char *netiface;
+ const char *directorio;
+ const char *resolucion;
+ int is_prof;
+ int has_unit;
+};
+
+static int og_get_client_mode_params(struct og_dbi *dbi, const char *mac, char *params, size_t params_size)
{
- char params[4096] = "\0";
+ struct og_boot_mode_params boot_params = {};
+ const char *res_prefix = " vga=";
+ const char *res_value = "788";
+ char *lang = getenv("LANG");
const char *msglog;
dbi_result result;
- unsigned int i;
-
- if (!og_boot_mode_is_valid(mode)) {
- syslog(LOG_ERR, "invalid boot mode in client (%s:%d)\n",
- __FILE__, __LINE__);
- return -1;
- }
result = dbi_conn_queryf(dbi->conn,
- "SELECT ' LANG=%s', "
- "' ip=', CONCAT_WS(':', ordenadores.ip, (@serverip:=entornos.ipserveradm), aulas.router, aulas.netmask, ordenadores.nombreordenador, ordenadores.netiface, 'none'), "
- "' group=', REPLACE(TRIM(aulas.nombreaula), ' ', '_'), "
- "' ogrepo=', (@repoip:=IFNULL(repositorios.ip, '')), "
- "' oglive=', @serverip, "
- "' oglog=', @serverip, "
- "' ogshare=', @serverip, "
- "' oglivedir=', ordenadores.oglivedir, "
- "' ogprof=', IF(ordenadores.idordenador=aulas.idordprofesor, 'true', 'false'), "
- "' server=', @serverip, "
- "IF(perfileshard.descripcion<>'', CONCAT(' hardprofile=', REPLACE(TRIM(perfileshard.descripcion), ' ', '_')), ''), "
- "IF(aulas.ntp<>'', CONCAT(' ogntp=', aulas.ntp), ''), "
- "IF(aulas.dns<>'', CONCAT(' ogdns=', aulas.dns), ''), "
- "IF(aulas.proxy<>'', CONCAT(' ogproxy=', aulas.proxy), ''), "
- "IF(entidades.ogunit=1 AND NOT centros.directorio='', CONCAT(' ogunit=', centros.directorio), ''), "
- "CASE WHEN menus.resolucion IS NULL THEN ' vga=788' "
- "WHEN menus.resolucion <= '999' THEN CONCAT(' vga=', menus.resolucion) "
- "WHEN menus.resolucion LIKE '%:%' THEN CONCAT(' video=', menus.resolucion) "
- "ELSE ' vga=788' END "
-
+ "SELECT "
+ "ordenadores.ip AS ip, "
+ "entornos.ipserveradm AS ipserveradm, "
+ "aulas.router AS router, "
+ "aulas.netmask AS netmask, "
+ "ordenadores.nombreordenador AS nombreordenador, "
+ "ordenadores.netiface AS netiface, "
+ "REPLACE(TRIM(aulas.nombreaula), ' ', '_') AS nombreaula, "
+ "IFNULL(repositorios.ip, '') AS repoip, "
+ "ordenadores.oglivedir AS oglivedir, "
+ "IF(ordenadores.idordenador = aulas.idordprofesor, 1, 0) AS is_prof, "
+ "REPLACE(TRIM(IFNULL(perfileshard.descripcion, '')), ' ', '_') AS hardprofile, "
+ "IFNULL(aulas.ntp, '') AS ntp, "
+ "IFNULL(aulas.dns, '') AS dns, "
+ "IFNULL(aulas.proxy, '') AS proxy, "
+ "IF(entidades.ogunit = 1 AND NOT centros.directorio = '', 1, 0) AS has_unit, "
+ "centros.directorio AS directorio, "
+ "IFNULL(menus.resolucion, '') AS resolucion "
"FROM ordenadores "
"JOIN aulas USING(idaula) "
"JOIN centros USING(idcentro) "
@@ -1545,8 +1558,7 @@ static int og_set_client_mode(struct og_dbi *dbi, const char *mac,
"LEFT JOIN repositorios USING(idrepositorio) "
"LEFT JOIN perfileshard USING(idperfilhard) "
"LEFT JOIN menus USING(idmenu) "
-
- "WHERE ordenadores.mac='%s'", getenv("LANG"), mac);
+ "WHERE ordenadores.mac = '%s'", mac);
if (!result) {
dbi_conn_error(dbi->conn, &msglog);
@@ -1556,21 +1568,91 @@ static int og_set_client_mode(struct og_dbi *dbi, const char *mac,
return -1;
}
- if (dbi_result_get_numrows(result) != 1) {
+ if (!dbi_result_next_row(result)) {
dbi_conn_error(dbi->conn, &msglog);
- syslog(LOG_ERR, "failed to query database (%s:%d) %s\n",
- __FILE__, __LINE__, msglog);
+ syslog(LOG_ERR, "failed to query database (%s:%d) %s\n", // TODO
+ __func__, __LINE__, msglog);
dbi_result_free(result);
+ og_dbi_close(dbi);
return -1;
}
- dbi_result_next_row(result);
- for (i = 1; i <= dbi_result_get_numfields(result); ++i)
- strncat(params, dbi_result_get_string_idx(result, i),
- sizeof(params) - strlen(params) - 1);
+ boot_params.ip = dbi_result_get_string_copy(result, "ip");
+ boot_params.ipserveradm = dbi_result_get_string_copy(result, "ipserveradm");
+ boot_params.router = dbi_result_get_string_copy(result, "router");
+ boot_params.netmask = dbi_result_get_string_copy(result, "netmask");
+ boot_params.nombreordenador = dbi_result_get_string_copy(result, "nombreordenador");
+ boot_params.netiface = dbi_result_get_string_copy(result, "netiface");
+ boot_params.nombreaula = dbi_result_get_string_copy(result, "nombreaula");
+ boot_params.repoip = dbi_result_get_string_copy(result, "repoip");
+ boot_params.oglivedir = dbi_result_get_string_copy(result, "oglivedir");
+ boot_params.hardprofile = dbi_result_get_string_copy(result, "hardprofile");
+ boot_params.ntp = dbi_result_get_string_copy(result, "ntp");
+ boot_params.dns = dbi_result_get_string_copy(result, "dns");
+ boot_params.proxy = dbi_result_get_string_copy(result, "proxy");
+ boot_params.directorio = dbi_result_get_string_copy(result, "directorio");
+ boot_params.resolucion = dbi_result_get_string_copy(result, "resolucion");
+ boot_params.has_unit = dbi_result_get_uint(result, "has_unit");
+ boot_params.is_prof = dbi_result_get_uint(result, "is_prof");
+
+ if (boot_params.resolucion[0]) {
+ res_value = boot_params.resolucion;
+ if (strchr(boot_params.resolucion, ':'))
+ res_prefix = " video=";
+ }
+
+ snprintf(params, params_size,
+ " LANG=%s ip=%s:%s:%s:%s:%s:%s:none group=%s ogrepo=%s oglive=%s oglog=%s ogshare=%s oglivedir=%s ogprof=%s server=%s"
+ "%s%s%s%s%s%s%s%s%s%s%s%s",
+ lang,
+ boot_params.ip, boot_params.ipserveradm, boot_params.router, boot_params.netmask, boot_params.nombreordenador, boot_params.netiface,
+ boot_params.nombreaula,
+ boot_params.repoip,
+ boot_params.ipserveradm, boot_params.ipserveradm, boot_params.ipserveradm,
+ boot_params.oglivedir,
+ boot_params.is_prof ? "true" : "false",
+ boot_params.ipserveradm,
+ boot_params.hardprofile[0] ? " hardprofile=" : "", boot_params.hardprofile[0] ? boot_params.hardprofile: "",
+ boot_params.ntp[0] ? " ogntp=" : "", boot_params.ntp[0] ? boot_params.ntp : "",
+ boot_params.dns[0] ? " ogdns=" : "", boot_params.dns[0] ? boot_params.dns : "",
+ boot_params.proxy[0] ? " ogproxy=" : "", boot_params.proxy[0] ? boot_params.proxy : "",
+ boot_params.has_unit ? " ogunit=" : "", boot_params.has_unit ? boot_params.directorio : "",
+ res_prefix, res_value);
dbi_result_free(result);
+ free((void *)boot_params.ip);
+ free((void *)boot_params.ipserveradm);
+ free((void *)boot_params.router);
+ free((void *)boot_params.netmask);
+ free((void *)boot_params.nombreordenador);
+ free((void *)boot_params.netiface);
+ free((void *)boot_params.nombreaula);
+ free((void *)boot_params.repoip);
+ free((void *)boot_params.oglivedir);
+ free((void *)boot_params.hardprofile);
+ free((void *)boot_params.ntp);
+ free((void *)boot_params.dns);
+ free((void *)boot_params.proxy);
+ free((void *)boot_params.directorio);
+ free((void *)boot_params.resolucion);
+
+ return 0;
+}
+
+static int og_set_client_mode(struct og_dbi *dbi, const char *mac,
+ const char *mode)
+{
+ char params[4096];
+
+ if (!og_boot_mode_is_valid(mode)) {
+ syslog(LOG_ERR, "invalid boot mode in client (%s:%d)\n",
+ __FILE__, __LINE__);
+ return -1;
+ }
+
+ og_get_client_mode_params(dbi, mac, params, sizeof(params));
+
if (og_create_boot_file(OG_TFTP_BOOT_BIOS, mac, mode, params) < 0) {
syslog(LOG_ERR, "failed to create BIOS boot file (%s:%d)\n", __FILE__, __LINE__);
return -1;