]> git.ozlabs.org Git - petitboot/blobdiff - discover/device-handler.c
discover/device-handler: Be ready for user events earlier
[petitboot] / discover / device-handler.c
index 3ef48ada77394e2252249b4495af81c8efe94291..f1270c8ca660b7c771f0e08023e4559345f1e5bc 100644 (file)
@@ -87,6 +87,7 @@ struct device_handler {
 
        struct plugin_option    **plugins;
        unsigned int            n_plugins;
+       bool                    plugin_installing;
 };
 
 static int mount_device(struct discover_device *dev);
@@ -637,6 +638,21 @@ void device_handler_status_download(struct device_handler *handler,
        }
 }
 
+static void device_handler_plugin_scan_device(struct device_handler *handler,
+               struct discover_device *dev)
+{
+       int rc;
+
+       pb_debug("Scanning %s for plugin files\n", dev->device->id);
+
+       rc = process_run_simple(handler, pb_system_apps.pb_plugin,
+                               "scan", dev->mount_path,
+                               NULL);
+       if (rc)
+               pb_log("Error from pb-plugin scan %s\n",
+                               dev->mount_path);
+}
+
 void device_handler_status_download_remove(struct device_handler *handler,
                struct process_info *procinfo)
 {
@@ -1103,6 +1119,9 @@ int device_handler_discover(struct device_handler *handler,
        device_handler_discover_context_commit(handler, ctx);
 
        process_boot_option_queue(handler);
+
+       /* Check this device for pb-plugins */
+       device_handler_plugin_scan_device(handler, dev);
 out:
        talloc_unlink(handler, ctx);
 
@@ -1388,6 +1407,61 @@ void device_handler_process_url(struct device_handler *handler,
        talloc_unlink(handler, ctx);
 }
 
+static void plugin_install_cb(struct process *process)
+{
+       struct device_handler *handler = process->data;
+
+       if (!handler) {
+               pb_log("%s: Missing data!\n", __func__);
+               return;
+       }
+
+       handler->plugin_installing = false;
+       if (process->exit_status) {
+               device_handler_status_err(handler, "Plugin failed to install!");
+               pb_log("Failed to install plugin:\n%s\n", process->stdout_buf);
+       }
+}
+
+void device_handler_install_plugin(struct device_handler *handler,
+               const char *plugin_file)
+{
+       struct process *p;
+       int result;
+
+       if (handler->plugin_installing) {
+               pb_log("Plugin install cancelled - install already running");
+               return;
+       }
+
+       p = process_create(handler);
+       if (!p) {
+               pb_log("install_plugin: Failed to create process\n");
+               return;
+       }
+
+       const char *argv[] = {
+               pb_system_apps.pb_plugin,
+               "install",
+               "auto",
+               plugin_file,
+               NULL
+       };
+
+       p->path = pb_system_apps.pb_plugin;
+       p->argv = argv;
+       p->exit_cb = plugin_install_cb;
+       p->data = handler;
+       p->keep_stdout = true;
+
+       result = process_run_async(p);
+
+       if (result)
+               device_handler_status_err(handler, "Could not install plugin");
+       else
+               handler->plugin_installing = true;
+}
+
 #ifndef PETITBOOT_TEST
 
 /**
@@ -1489,6 +1563,10 @@ static void device_handler_update_lang(const char *lang)
 static int device_handler_init_sources(struct device_handler *handler)
 {
        /* init our device sources: udev, network and user events */
+       handler->user_event = user_event_init(handler, handler->waitset);
+       if (!handler->user_event)
+               return -1;
+
        handler->network = network_init(handler, handler->waitset,
                        handler->dry_run);
        if (!handler->network)
@@ -1498,10 +1576,6 @@ static int device_handler_init_sources(struct device_handler *handler)
        if (!handler->udev)
                return -1;
 
-       handler->user_event = user_event_init(handler, handler->waitset);
-       if (!handler->user_event)
-               return -1;
-
        return 0;
 }