X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Fgnome2-console%2Fconsole_conf.c;h=91ad6d2f3dccbf722febf41efd6dcbf7180e9af4;hb=44c8fb4a8bd89c42465453970929d5fb2a2538de;hp=84cc55e7ad8d3cc2ebd6b30ea6352e3c765a182c;hpb=783a0ae0bd6f070cbdea7f1c38a75e33ba63a11a;p=bacula%2Fbacula diff --git a/bacula/src/gnome2-console/console_conf.c b/bacula/src/gnome2-console/console_conf.c index 84cc55e7ad..91ad6d2f3d 100644 --- a/bacula/src/gnome2-console/console_conf.c +++ b/bacula/src/gnome2-console/console_conf.c @@ -1,3 +1,30 @@ +/* + Bacula® - The Network Backup Solution + + Copyright (C) 2000-2008 Free Software Foundation Europe e.V. + + The main author of Bacula is Kern Sibbald, with contributions from + many others, a complete list can be found in the file AUTHORS. + This program is Free Software; you can redistribute it and/or + modify it under the terms of version two of the GNU General Public + License as published by the Free Software Foundation and included + in the file LICENSE. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. + + Bacula® is a registered trademark of Kern Sibbald. + The licensor of Bacula is the Free Software Foundation Europe + (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich, + Switzerland, email:ftf@fsfeurope.org. +*/ /* * Main configuration file parser for Bacula User Agent * some parts may be split into separate files such as @@ -7,39 +34,21 @@ * * 1. The generic lexical scanner in lib/lex.c and lib/lex.h * - * 2. The generic config scanner in lib/parse_config.c and - * lib/parse_config.h. - * These files contain the parser code, some utility - * routines, and the common store routines (name, int, - * string). + * 2. The generic config scanner in lib/parse_config.c and + * lib/parse_config.h. + * These files contain the parser code, some utility + * routines, and the common store routines (name, int, + * string). * * 3. The daemon specific file, which contains the Resource - * definitions as well as any specific store routines - * for the resource records. + * definitions as well as any specific store routines + * for the resource records. * * Kern Sibbald, January MM, September MM * * Version $Id$ */ -/* - Copyright (C) 2000, 2001 Kern Sibbald and John Walker - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2 - of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - #include "bacula.h" #include "console_conf.h" @@ -47,8 +56,10 @@ * types. Note, these should be unique for each * daemon though not a requirement. */ -int r_first = R_FIRST; -int r_last = R_LAST; +int32_t r_first = R_FIRST; +int32_t r_last = R_LAST; +static RES *sres_head[R_LAST - R_FIRST + 1]; +RES **res_head = sres_head; /* Forward referenced subroutines */ @@ -59,48 +70,57 @@ int r_last = R_LAST; * scan is complete. */ URES res_all; -int res_all_size = sizeof(res_all); +int32_t res_all_size = sizeof(res_all); /* Definition of records permitted within each - * resource with the routine to process the record + * resource with the routine to process the record * information. - */ + */ static RES_ITEM dir_items[] = { {"name", store_name, ITEM(dir_res.hdr.name), 0, ITEM_REQUIRED, 0}, {"description", store_str, ITEM(dir_res.hdr.desc), 0, 0, 0}, - {"dirport", store_int, ITEM(dir_res.DIRport), 0, ITEM_DEFAULT, 9101}, + {"dirport", store_pint32, ITEM(dir_res.DIRport), 0, ITEM_DEFAULT, 9101}, {"address", store_str, ITEM(dir_res.address), 0, ITEM_REQUIRED, 0}, {"password", store_password, ITEM(dir_res.password), 0, 0, 0}, - {"enablessl", store_yesno, ITEM(dir_res.enable_ssl), 1, ITEM_DEFAULT, 0}, - {NULL, NULL, NULL, 0, 0, 0} + {"tlsenable", store_bool, ITEM(dir_res.tls_enable), 1, 0, 0}, + {"tlsrequire", store_bool, ITEM(dir_res.tls_require), 1, 0, 0}, + {"tlscacertificatefile", store_dir, ITEM(dir_res.tls_ca_certfile), 0, 0, 0}, + {"tlscacertificatedir", store_dir, ITEM(dir_res.tls_ca_certdir), 0, 0, 0}, + {"tlscertificate", store_dir, ITEM(dir_res.tls_certfile), 0, 0, 0}, + {"tlskey", store_dir, ITEM(dir_res.tls_keyfile), 0, 0, 0}, + {NULL, NULL, {0}, 0, 0, 0} }; static RES_ITEM con_items[] = { {"name", store_name, ITEM(con_res.hdr.name), 0, ITEM_REQUIRED, 0}, {"description", store_str, ITEM(con_res.hdr.desc), 0, 0, 0}, {"password", store_password, ITEM(con_res.password), 0, ITEM_REQUIRED, 0}, - {"requiressl", store_yesno, ITEM(con_res.require_ssl), 1, ITEM_DEFAULT, 0}, - {NULL, NULL, NULL, 0, 0, 0} + {"tlsenable", store_bool, ITEM(con_res.tls_enable), 1, 0, 0}, + {"tlsrequire", store_bool, ITEM(con_res.tls_require), 1, 0, 0}, + {"tlscacertificatefile", store_dir, ITEM(con_res.tls_ca_certfile), 0, 0, 0}, + {"tlscacertificatedir", store_dir, ITEM(con_res.tls_ca_certdir), 0, 0, 0}, + {"tlscertificate", store_dir, ITEM(con_res.tls_certfile), 0, 0, 0}, + {"tlskey", store_dir, ITEM(con_res.tls_keyfile), 0, 0, 0}, + {NULL, NULL, {0}, 0, 0, 0} }; static RES_ITEM con_font_items[] = { {"name", store_name, ITEM(con_font.hdr.name), 0, ITEM_REQUIRED, 0}, {"description", store_str, ITEM(con_font.hdr.desc), 0, 0, 0}, {"font", store_str, ITEM(con_font.fontface), 0, 0, 0}, - {"requiressl", store_yesno, ITEM(con_font.require_ssl), 1, ITEM_DEFAULT, 0}, - {NULL, NULL, NULL, 0, 0, 0} + {NULL, NULL, {0}, 0, 0, 0} }; -/* - * This is the master resource definition. +/* + * This is the master resource definition. * It must have one item for each of the resources. */ RES_TABLE resources[] = { - {"director", dir_items, R_DIRECTOR, NULL}, - {"console", con_items, R_CONSOLE, NULL}, - {"consolefont", con_font_items, R_CONSOLE_FONT, NULL}, - {NULL, NULL, 0, NULL} + {"director", dir_items, R_DIRECTOR}, + {"console", con_items, R_CONSOLE}, + {"consolefont", con_font_items, R_CONSOLE_FONT}, + {NULL, NULL, 0} }; @@ -111,37 +131,37 @@ void dump_resource(int type, RES *reshdr, void sendit(void *sock, const char *fm bool recurse = true; if (res == NULL) { - printf("No record for %d %s\n", type, res_to_str(type)); + printf(_("No record for %d %s\n"), type, res_to_str(type)); return; } - if (type < 0) { /* no recursion */ + if (type < 0) { /* no recursion */ type = - type; recurse = false; } switch (type) { case R_DIRECTOR: - printf("Director: name=%s address=%s DIRport=%d\n", reshdr->name, - res->dir_res.address, res->dir_res.DIRport); + printf(_("Director: name=%s address=%s DIRport=%d\n"), reshdr->name, + res->dir_res.address, res->dir_res.DIRport); break; case R_CONSOLE: - printf("Console: name=%s\n", reshdr->name); + printf(_("Console: name=%s\n"), reshdr->name); break; case R_CONSOLE_FONT: - printf("ConsoleFont: name=%s font face=%s\n", - reshdr->name, NPRT(res->con_font.fontface)); + printf(_("ConsoleFont: name=%s font face=%s\n"), + reshdr->name, NPRT(res->con_font.fontface)); break; default: - printf("Unknown resource type %d\n", type); + printf(_("Unknown resource type %d\n"), type); } if (recurse && res->dir_res.hdr.next) { dump_resource(type, res->dir_res.hdr.next, sendit, sock); } } -/* - * Free memory of resource. +/* + * Free memory of resource. * NB, we don't need to worry about freeing any references - * to other resources as they will be freed when that + * to other resources as they will be freed when that * resource chain is traversed. Mainly we worry about freeing * allocated strings (names). */ @@ -165,21 +185,51 @@ void free_resource(RES *sres, int type) switch (type) { case R_DIRECTOR: if (res->dir_res.address) { - free(res->dir_res.address); + free(res->dir_res.address); + } + if (res->dir_res.tls_ctx) { + free_tls_context(res->dir_res.tls_ctx); + } + if (res->dir_res.tls_ca_certfile) { + free(res->dir_res.tls_ca_certfile); + } + if (res->dir_res.tls_ca_certdir) { + free(res->dir_res.tls_ca_certdir); + } + if (res->dir_res.tls_certfile) { + free(res->dir_res.tls_certfile); + } + if (res->dir_res.tls_keyfile) { + free(res->dir_res.tls_keyfile); } break; case R_CONSOLE: if (res->con_res.password) { - free(res->con_res.password); + free(res->con_res.password); + } + if (res->con_res.tls_ctx) { + free_tls_context(res->con_res.tls_ctx); + } + if (res->con_res.tls_ca_certfile) { + free(res->con_res.tls_ca_certfile); + } + if (res->con_res.tls_ca_certdir) { + free(res->con_res.tls_ca_certdir); + } + if (res->con_res.tls_certfile) { + free(res->con_res.tls_certfile); + } + if (res->con_res.tls_keyfile) { + free(res->con_res.tls_keyfile); } break; case R_CONSOLE_FONT: if (res->con_font.fontface) { - free(res->con_font.fontface); + free(res->con_font.fontface); } break; default: - printf("Unknown resource type %d\n", type); + printf(_("Unknown resource type %d\n"), type); } /* Common stuff again -- free the resource, recurse to next one */ free(res); @@ -199,15 +249,15 @@ void save_resource(int type, RES_ITEM *items, int pass) int i, size = 0; int error = 0; - /* + /* * Ensure that all required items are present */ for (i=0; items[i].name; i++) { if (items[i].flags & ITEM_REQUIRED) { - if (!bit_is_set(i, res_all.dir_res.hdr.item_present)) { - Emsg2(M_ABORT, 0, "%s item is required in %s resource, but not found.\n", - items[i].name, resources[rindex]); - } + if (!bit_is_set(i, res_all.dir_res.hdr.item_present)) { + Emsg2(M_ABORT, 0, _("%s item is required in %s resource, but not found.\n"), + items[i].name, resources[rindex]); + } } } @@ -220,27 +270,27 @@ void save_resource(int type, RES_ITEM *items, int pass) switch (type) { /* Resources not containing a resource */ case R_DIRECTOR: - break; + break; case R_CONSOLE: case R_CONSOLE_FONT: - break; + break; default: - Emsg1(M_ERROR, 0, "Unknown resource type %d\n", type); - error = 1; - break; + Emsg1(M_ERROR, 0, _("Unknown resource type %d\n"), type); + error = 1; + break; } /* Note, the resoure name was already saved during pass 1, * so here, we can just release it. */ if (res_all.dir_res.hdr.name) { - free(res_all.dir_res.hdr.name); - res_all.dir_res.hdr.name = NULL; + free(res_all.dir_res.hdr.name); + res_all.dir_res.hdr.name = NULL; } if (res_all.dir_res.hdr.desc) { - free(res_all.dir_res.hdr.desc); - res_all.dir_res.hdr.desc = NULL; + free(res_all.dir_res.hdr.desc); + res_all.dir_res.hdr.desc = NULL; } return; } @@ -257,7 +307,7 @@ void save_resource(int type, RES_ITEM *items, int pass) size = sizeof(CONRES); break; default: - printf("Unknown resource type %d\n", type); + printf(_("Unknown resource type %d\n"), type); error = 1; break; } @@ -265,21 +315,29 @@ void save_resource(int type, RES_ITEM *items, int pass) if (!error) { res = (URES *)malloc(size); memcpy(res, &res_all, size); - if (!resources[rindex].res_head) { - resources[rindex].res_head = (RES *)res; /* store first entry */ + if (!res_head[rindex]) { + res_head[rindex] = (RES *)res; /* store first entry */ } else { - RES *next; - /* Add new res to end of chain */ - for (next=resources[rindex].res_head; next->next; next=next->next) { - if (strcmp(next->name, res->dir_res.hdr.name) == 0) { - Emsg2(M_ERROR_TERM, 0, + RES *next, *last; + /* Add new res to end of chain */ + for (last=next=res_head[rindex]; next; next=next->next) { + last = next; + if (strcmp(next->name, res->dir_res.hdr.name) == 0) { + Emsg2(M_ERROR_TERM, 0, _("Attempt to define second %s resource named \"%s\" is not permitted.\n"), - resources[rindex].name, res->dir_res.hdr.name); - } - } - next->next = (RES *)res; + resources[rindex].name, res->dir_res.hdr.name); + } + } + last->next = (RES *)res; Dmsg2(90, "Inserting %s res: %s\n", res_to_str(type), - res->dir_res.hdr.name); + res->dir_res.hdr.name); } } } + +bool parse_gcons_config(CONFIG *config, const char *configfile, int exit_code) +{ + config->init(configfile, NULL, exit_code, (void *)&res_all, res_all_size, + r_first, r_last, resources, res_head); + return config->parse_config(); +}