int main(int argc, char *argv[]) { setlocale(LC_ALL, "C"); r_context_conf()->configpath = g_strdup("test/test.conf"); r_context_conf()->certpath = g_strdup("test/openssl-ca/rel/release-1.cert.pem"); r_context_conf()->keypath = g_strdup("test/openssl-ca/rel/private/release-1.pem"); r_context(); g_assert(test_prepare_dummy_file("test/", "random.dat", 256 * 1024, "/dev/urandom") == 0); g_assert(test_prepare_dummy_file("test/", "empty.dat", 0, "/dev/zero") == 0); g_test_init(&argc, &argv, NULL); g_test_add_func("/signature/sign", signature_sign); g_test_add_func("/signature/sign_file", signature_sign_file); g_test_add_func("/signature/verify", signature_verify); g_test_add_func("/signature/verify_file", signature_verify_file); g_test_add_func("/signature/loopback", signature_loopback); return g_test_run(); }
static void r_context_configure(void) { gboolean res = TRUE; GError *error = NULL; g_assert_nonnull(context); g_assert_false(context->busy); g_clear_pointer(&context->config, free_config); res = load_config(context->configpath, &context->config, &error); if (!res && error->domain==g_file_error_quark()) { g_debug("system config not found, using default values"); g_clear_error(&error); res = default_config(&context->config); } if (!res) { g_error("failed to initialize context: %s", error->message); g_clear_error(&error); } if (context->config->system_variant_type == R_CONFIG_SYS_VARIANT_DTB) { gchar *compatible = get_system_dtb_compatible(&error); if (!compatible) { g_warning("Failed to read dtb compatible: %s", error->message); g_clear_error(&error); } g_free(context->config->system_variant); context->config->system_variant = compatible; } else if (context->config->system_variant_type == R_CONFIG_SYS_VARIANT_FILE) { gchar *variant = get_variant_from_file(context->config->system_variant, &error); if (!variant) { g_warning("Failed to read system variant from file: %s", error->message); g_clear_error(&error); } g_free(context->config->system_variant); context->config->system_variant = variant; } if (context->config->systeminfo_handler && g_file_test(context->config->systeminfo_handler, G_FILE_TEST_EXISTS)) { GError *ierror = NULL; g_autoptr(GHashTable) vars = NULL; GHashTableIter iter; gchar *key = NULL; gchar *value = NULL; vars = g_hash_table_new(g_str_hash, g_str_equal); g_message("Getting Systeminfo: %s", context->config->systeminfo_handler); res = launch_and_wait_variables_handler(context->config->systeminfo_handler, vars, &ierror); if (!res) { g_error("Failed to read system-info variables: %s", ierror->message); g_clear_error(&ierror); } g_hash_table_iter_init(&iter, vars); while (g_hash_table_iter_next(&iter, (gpointer*) &key, (gpointer*) &value)) { if (g_strcmp0(key, "RAUC_SYSTEM_SERIAL") == 0) r_context_conf()->system_serial = g_strdup(value); } } if (context->bootslot == NULL) { context->bootslot = g_strdup(get_cmdline_bootname()); } if (context->mountprefix) { g_free(context->config->mount_prefix); context->config->mount_prefix = g_strdup(context->mountprefix); } if (context->keyringpath) { context->config->keyring_path = context->keyringpath; } context->pending = FALSE; }
static void cmdline_handler(int argc, char **argv) { gboolean help = FALSE, version = FALSE; gchar *confpath = NULL, *certpath = NULL, *keypath = NULL, *mount = NULL, *handlerextra = NULL; char *cmdarg = NULL; GOptionContext *context = NULL; GOptionEntry entries[] = { {"conf", 'c', 0, G_OPTION_ARG_FILENAME, &confpath, "config file", "FILENAME"}, {"cert", '\0', 0, G_OPTION_ARG_FILENAME, &certpath, "cert file", "PEMFILE"}, {"key", '\0', 0, G_OPTION_ARG_FILENAME, &keypath, "key file", "PEMFILE"}, {"mount", '\0', 0, G_OPTION_ARG_FILENAME, &mount, "mount prefix", "PATH"}, {"handler-args", '\0', 0, G_OPTION_ARG_STRING, &handlerextra, "extra handler arguments", "ARGS"}, {"version", '\0', 0, G_OPTION_ARG_NONE, &version, "display version", NULL}, {"help", 'h', 0, G_OPTION_ARG_NONE, &help, NULL, NULL}, {0} }; GOptionGroup *info_group = g_option_group_new("info", "Info options:", "help dummy", NULL, NULL); GError *error = NULL; gchar *text; RaucCommand rcommands[] = { {UNKNOWN, "help", "<COMMAND>", unknown_start, NULL, TRUE}, {INSTALL, "install", "install <BUNDLE>", install_start, NULL, FALSE}, {BUNDLE, "bundle", "bundle <FILE>", bundle_start, NULL, FALSE}, {CHECKSUM, "checksum", "checksum <DIRECTORY>", checksum_start, NULL, FALSE}, {INFO, "info", "info <FILE>", info_start, info_group, FALSE}, {STATUS, "status", "status", status_start, NULL, TRUE}, #if ENABLE_SERVICE == 1 {SERVICE, "service", "service", service_start, NULL, TRUE}, #endif {0} }; RaucCommand *rc; RaucCommand *rcommand = NULL; g_option_group_add_entries(info_group, entries_info); context = g_option_context_new("<COMMAND>"); g_option_context_set_help_enabled(context, FALSE); g_option_context_set_ignore_unknown_options(context, TRUE); g_option_context_add_main_entries(context, entries, NULL); g_option_context_set_description(context, "List of rauc commands:\n" \ " bundle\tCreate a bundle\n" \ " checksum\tUpdate a manifest with checksums (and optionally sign it)\n" \ " resign\tResign a bundle\n" \ " install\tInstall a bundle\n" \ " info\t\tShow file information\n" \ " status\tShow status"); if (!g_option_context_parse(context, &argc, &argv, &error)) { g_printerr("%s\n", error->message); g_error_free(error); r_exit_status = 1; goto done; } /* get first parameter wihtout dashes */ for (gint i = 1; i <= argc; i++) { if (argv[i] && !g_str_has_prefix (argv[i], "-")) { cmdarg = argv[i]; break; } } if (cmdarg == NULL) { if (version) { g_print(PACKAGE_STRING"\n"); goto done; } /* NO COMMAND given */ if (!help) { r_exit_status = 1; } goto print_help; } /* try to get known command */ rc = rcommands; while (rc->name) { if (g_strcmp0(rc->name, cmdarg) == 0) { rcommand = rc; break; } rc++; } if (rcommand == NULL) { /* INVALID COMMAND given */ g_message("Invalid command '%s' given\n", cmdarg); r_exit_status = 1; goto print_help; } /* re-setup option context for showing command-specific help */ g_clear_pointer(&context, g_option_context_free); context = g_option_context_new(rcommand->usage); g_option_context_set_help_enabled(context, FALSE); g_option_context_add_main_entries(context, entries, NULL); if (rcommand->options) g_option_context_add_group(context, rcommand->options); /* parse command-specific options */ if (!g_option_context_parse(context, &argc, &argv, &error)) { g_printerr("%s\n", error->message); g_error_free(error); r_exit_status = 1; goto print_help; } if (help) { goto print_help; } /* configuration updates are handled here */ if (!r_context_get_busy()) { r_context_conf(); if (confpath) r_context_conf()->configpath = confpath; if (certpath) r_context_conf()->certpath = certpath; if (keypath) r_context_conf()->keypath = keypath; if (mount) r_context_conf()->mountprefix = mount; if (handlerextra) r_context_conf()->handlerextra = handlerextra; } else { if (confpath != NULL || certpath != NULL || keypath != NULL) { g_error("rauc busy, cannot reconfigure"); r_exit_status = 1; goto done; } } if (r_context_get_busy() && !rcommand->while_busy) { g_error("rauc busy: cannot run %s", rcommand->name); r_exit_status = 1; goto done; } /* real commands are handled here */ if (rcommand->cmd_handler) { rcommand->cmd_handler(argc, argv); } goto done; print_help: text = g_option_context_get_help(context, FALSE, NULL); g_print("%s", text); g_free(text); done: g_clear_pointer(&context, g_option_context_free);; }