void run_server_global_scripts( execute_on_t execute_on, char *config) { identlist_t pp_scriptlist; disk_t *dp; am_host_t *host; GHashTable* executed = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, NULL); for (host = get_hostlist(); host != NULL; host = host->next) { for (dp = host->disks; dp != NULL; dp = dp->hostnext) { if (dp->todo) { for (pp_scriptlist = dp->pp_scriptlist; pp_scriptlist != NULL; pp_scriptlist = pp_scriptlist->next) { int todo = 1; pp_script_t *pp_script = lookup_pp_script((char *)pp_scriptlist->data); g_assert(pp_script != NULL); if (pp_script_get_single_execution(pp_script)) { todo = g_hash_table_lookup(executed, pp_script_get_plugin(pp_script)) == NULL; } if (todo) { run_server_script(pp_script, execute_on, config, dp, -1); if (pp_script_get_single_execution(pp_script)) { g_hash_table_insert(executed, pp_script_get_plugin(pp_script), GINT_TO_POINTER(1)); } } } } } } g_hash_table_destroy(executed); }
void run_server_script( pp_script_t *pp_script, execute_on_t execute_on, char *config, disk_t *dp, int level) { pid_t scriptpid; int scriptin, scriptout, scripterr; char *cmd; char *command = NULL; GPtrArray *argv_ptr = g_ptr_array_new(); FILE *streamout; char *line; char *plugin; char level_number[NUM_STR_SIZE]; if ((pp_script_get_execute_on(pp_script) & execute_on) == 0) return; if (pp_script_get_execute_where(pp_script) != ES_SERVER) return; plugin = pp_script_get_plugin(pp_script); cmd = vstralloc(APPLICATION_DIR, "/", plugin, NULL); g_ptr_array_add(argv_ptr, stralloc(plugin)); switch (execute_on) { case EXECUTE_ON_PRE_DLE_AMCHECK: command = "PRE-DLE-AMCHECK"; break; case EXECUTE_ON_PRE_HOST_AMCHECK: command = "PRE-HOST-AMCHECK"; break; case EXECUTE_ON_POST_DLE_AMCHECK: command = "POST-DLE-AMCHECK"; break; case EXECUTE_ON_POST_HOST_AMCHECK: command = "POST-HOST-AMCHECK"; break; case EXECUTE_ON_PRE_DLE_ESTIMATE: command = "PRE-DLE-ESTIMATE"; break; case EXECUTE_ON_PRE_HOST_ESTIMATE: command = "PRE-HOST-ESTIMATE"; break; case EXECUTE_ON_POST_DLE_ESTIMATE: command = "POST-DLE-ESTIMATE"; break; case EXECUTE_ON_POST_HOST_ESTIMATE: command = "POST-HOST-ESTIMATE"; break; case EXECUTE_ON_PRE_DLE_BACKUP: command = "PRE-DLE-BACKUP"; break; case EXECUTE_ON_PRE_HOST_BACKUP: command = "PRE-HOST-BACKUP"; break; case EXECUTE_ON_POST_DLE_BACKUP: command = "POST-DLE-BACKUP"; break; case EXECUTE_ON_POST_HOST_BACKUP: command = "POST-HOST-BACKUP"; break; case EXECUTE_ON_PRE_RECOVER: case EXECUTE_ON_POST_RECOVER: case EXECUTE_ON_PRE_LEVEL_RECOVER: case EXECUTE_ON_POST_LEVEL_RECOVER: case EXECUTE_ON_INTER_LEVEL_RECOVER: { // ERROR these script can't be executed on server. return; } } g_ptr_array_add(argv_ptr, stralloc(command)); g_ptr_array_add(argv_ptr, stralloc("--execute-where")); g_ptr_array_add(argv_ptr, stralloc("server")); if (config) { g_ptr_array_add(argv_ptr, stralloc("--config")); g_ptr_array_add(argv_ptr, stralloc(config)); } if (dp->host->hostname) { g_ptr_array_add(argv_ptr, stralloc("--host")); g_ptr_array_add(argv_ptr, stralloc(dp->host->hostname)); } if (dp->name) { g_ptr_array_add(argv_ptr, stralloc("--disk")); g_ptr_array_add(argv_ptr, stralloc(dp->name)); } if (dp->device) { g_ptr_array_add(argv_ptr, stralloc("--device")); g_ptr_array_add(argv_ptr, stralloc(dp->device)); } if (level >= 0) { g_snprintf(level_number, SIZEOF(level_number), "%d", level); g_ptr_array_add(argv_ptr, stralloc("--level")); g_ptr_array_add(argv_ptr, stralloc(level_number)); } property_add_to_argv(argv_ptr, pp_script_get_property(pp_script)); g_ptr_array_add(argv_ptr, NULL); scripterr = fileno(stderr); scriptpid = pipespawnv(cmd, STDIN_PIPE|STDOUT_PIPE, 0, &scriptin, &scriptout, &scripterr, (char **)argv_ptr->pdata); close(scriptin); streamout = fdopen(scriptout, "r"); if (streamout) { while((line = agets(streamout)) != NULL) { dbprintf("script: %s\n", line); } } fclose(streamout); waitpid(scriptpid, NULL, 0); g_ptr_array_free_full(argv_ptr); }