From f155a58a64c660e46e74123293482561b816a39a Mon Sep 17 00:00:00 2001 From: Nishanth Aravamudan Date: Wed, 19 Aug 2015 14:05:43 -0700 Subject: [PATCH 1/1] discover: extend URL in UI to support auto-discovery The URL field currently only supports loading a particular file for static network configurations. But it makes sense in certain static network configurations to 'auto-discover' a file like petitboot does with DHCP -- based off the MAC address and IP. Extend device_handler_process_url to take those as parameters, and toggle off the URL ending in a '/' to indicate whether to 'auto-discover' or directly load the specified URL. Signed-off-by: Nishanth Aravamudan Signed-off-by: Samuel Mendoza-Jonas --- discover/device-handler.c | 27 ++++++++++++++++++++------- discover/device-handler.h | 2 +- discover/discover-server.c | 3 ++- discover/network.c | 6 +++++- discover/user-event.c | 2 +- 5 files changed, 29 insertions(+), 11 deletions(-) diff --git a/discover/device-handler.c b/discover/device-handler.c index 3804b34..5df0700 100644 --- a/discover/device-handler.c +++ b/discover/device-handler.c @@ -1125,9 +1125,8 @@ static char *device_from_addr(void *ctx, struct pb_url *url) return dev; } - void device_handler_process_url(struct device_handler *handler, - const char *url) + const char *url, const char *mac, const char *ip) { struct discover_context *ctx; struct discover_device *dev; @@ -1153,11 +1152,25 @@ void device_handler_process_url(struct device_handler *handler, event->type = EVENT_TYPE_USER; event->action = EVENT_ACTION_CONF; - event->params = talloc_array(event, struct param, 1); - param = &event->params[0]; - param->name = talloc_strdup(event, "pxeconffile"); - param->value = talloc_strdup(event, url); - event->n_params = 1; + if (url[strlen(url) - 1] == '/') { + event->params = talloc_array(event, struct param, 3); + param = &event->params[0]; + param->name = talloc_strdup(event, "pxepathprefix"); + param->value = talloc_strdup(event, url); + param = &event->params[1]; + param->name = talloc_strdup(event, "mac"); + param->value = talloc_strdup(event, mac); + param = &event->params[2]; + param->name = talloc_strdup(event, "ip"); + param->value = talloc_strdup(event, ip); + event->n_params = 3; + } else { + event->params = talloc_array(event, struct param, 1); + param = &event->params[0]; + param->name = talloc_strdup(event, "pxeconffile"); + param->value = talloc_strdup(event, url); + event->n_params = 1; + } pb_url = pb_url_parse(event, event->params->value); if (!pb_url || !pb_url->host) { diff --git a/discover/device-handler.h b/discover/device-handler.h index d18910a..e5501ec 100644 --- a/discover/device-handler.h +++ b/discover/device-handler.h @@ -133,7 +133,7 @@ void device_handler_cancel_default(struct device_handler *handler); void device_handler_update_config(struct device_handler *handler, struct config *config); void device_handler_process_url(struct device_handler *handler, - const char *url); + const char *url, const char *mac, const char *ip); void device_handler_reinit(struct device_handler *handler); int device_request_write(struct discover_device *dev, bool *release); diff --git a/discover/discover-server.c b/discover/discover-server.c index e4f3b67..6806589 100644 --- a/discover/discover-server.c +++ b/discover/discover-server.c @@ -266,7 +266,8 @@ static int discover_server_process_message(void *arg) case PB_PROTOCOL_ACTION_ADD_URL: url = pb_protocol_deserialise_string((void *) client, message); - device_handler_process_url(client->server->device_handler, url); + device_handler_process_url(client->server->device_handler, + url, NULL, NULL); break; default: diff --git a/discover/network.c b/discover/network.c index f763687..c072eec 100644 --- a/discover/network.c +++ b/discover/network.c @@ -374,7 +374,11 @@ static void configure_interface_static(struct network *network, if (config->static_config.url) { pb_log("config URL %s\n", config->static_config.url); device_handler_process_url(network->handler, - config->static_config.url); + config->static_config.url, + mac_bytes_to_string(interface->dev, + interface->hwaddr, + sizeof(interface->hwaddr)), + config->static_config.address); } return; diff --git a/discover/user-event.c b/discover/user-event.c index 8cad1a9..8926458 100644 --- a/discover/user-event.c +++ b/discover/user-event.c @@ -439,7 +439,7 @@ static int user_event_url(struct user_event *uev, struct event *event) url = event_get_param(event, "url"); if (url) - device_handler_process_url(handler, url); + device_handler_process_url(handler, url, NULL, NULL); return 0; } -- 2.39.2