summaryrefslogtreecommitdiffstats
path: root/discover/parser.c
diff options
context:
space:
mode:
authorNeelesh Gupta <neelegup@linux.vnet.ibm.com>2013-10-28 12:45:21 +0530
committerJeremy Kerr <jk@ozlabs.org>2013-11-06 16:34:26 +0800
commitb8e53cb4b96eb17dc7fa0ffc505dfebae37e6cbf (patch)
tree2049ee274a9a7872366da8b95dbecaffc215df3a /discover/parser.c
parentf385e8cacbc574e213b0805a8d383373f29a8058 (diff)
downloadtalos-petitboot-b8e53cb4b96eb17dc7fa0ffc505dfebae37e6cbf.tar.gz
talos-petitboot-b8e53cb4b96eb17dc7fa0ffc505dfebae37e6cbf.zip
discover: Change parsers to explicitly request configuration files
Add a new function parser_request_url() to read the data from configuration files present remotely. We deprecate iterate_parser_files() and download_config() functions along with the 'filenames' and 'method' members of the 'parser' structure so that individual parsers would now require to request the configuration files data from the parser code and doesn't necessarily export the list of configuration files. Add the support to handle incoming DHCP event, done by passing all the relevant environment variables of the udhcpc to the discover code. Also, update the pxe parser code to populate the list of configuration file names as per PXELINUX convention of fallback names using mac and ip addresses of the booting machine. Signed-off-by: Neelesh Gupta <neelegup@linux.vnet.ibm.com> Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
Diffstat (limited to 'discover/parser.c')
-rw-r--r--discover/parser.c83
1 files changed, 15 insertions, 68 deletions
diff --git a/discover/parser.c b/discover/parser.c
index 7b70118..21b48de 100644
--- a/discover/parser.c
+++ b/discover/parser.c
@@ -78,97 +78,44 @@ int parser_replace_file(struct discover_context *ctx,
return rc;
}
-static int download_config(struct discover_context *ctx, char **buf, int *len)
+int parser_request_url(struct discover_context *ctx, struct pb_url *url,
+ char **buf, int *len)
{
struct load_url_result *result;
int rc;
- result = load_url(ctx, ctx->conf_url);
+ result = load_url(ctx, url);
if (!result)
- return -1;
+ goto out;
rc = read_file(ctx, result->local, buf, len);
- if (rc)
+ if (rc) {
+ pb_log("Read failed for the parser %s on file %s\n",
+ ctx->parser->name, result->local);
goto out_clean;
+ }
return 0;
out_clean:
if (result->cleanup_local)
unlink(result->local);
+out:
return -1;
}
-static void iterate_parser_files(struct discover_context *ctx,
- const struct parser *parser)
-{
- const char * const *filename;
- const char *path;
-
- if (!parser->filenames)
- return;
-
- for (filename = parser->filenames; *filename; filename++) {
- int rc, len;
- char *buf;
-
- path = local_path(ctx, ctx->device, *filename);
- if (!path)
- continue;
-
- rc = read_file(ctx, path, &buf, &len);
- if (!rc) {
- pb_log("Running parser %s on file %s\n",
- parser->name, *filename);
- parser->parse(ctx, buf, len);
- talloc_free(buf);
- }
- }
-}
-
-void iterate_parsers(struct discover_context *ctx, enum conf_method method)
+void iterate_parsers(struct discover_context *ctx)
{
struct p_item* i;
- int rc, len;
- char *buf;
pb_log("trying parsers for %s\n", ctx->device->device->id);
- switch (method) {
- case CONF_METHOD_LOCAL_FILE:
- list_for_each_entry(&parsers, i, list) {
- if (i->parser->method != CONF_METHOD_LOCAL_FILE)
- continue;
-
- pb_debug("\ttrying parser '%s'\n", i->parser->name);
- ctx->parser = i->parser;
- iterate_parser_files(ctx, ctx->parser);
- }
- ctx->parser = NULL;
- break;
-
- case CONF_METHOD_DHCP:
- rc = download_config(ctx, &buf, &len);
- if (rc) {
- pb_log("\tdownload failed, aborting\n");
- return;
- }
-
- list_for_each_entry(&parsers, i, list) {
- if (i->parser->method != method)
- continue;
-
- pb_debug("\ttrying parser '%s'\n", i->parser->name);
- ctx->parser = i->parser;
- i->parser->parse(ctx, buf, len);
- }
-
- break;
-
- case CONF_METHOD_UNKNOWN:
- break;
-
+ list_for_each_entry(&parsers, i, list) {
+ pb_debug("\ttrying parser '%s'\n", i->parser->name);
+ ctx->parser = i->parser;
+ i->parser->parse(ctx);
}
+ ctx->parser = NULL;
}
static void *parsers_ctx;
OpenPOWER on IntegriCloud