static void _admin_front_end(GtkTreeModel *model, GtkTreeIter *iter, char *type, char *node_list) { uint16_t state = (uint16_t) NO_VAL; update_front_end_msg_t front_end_update_msg; char *new_type = NULL, *reason = NULL; char tmp_char[100]; char *lower; int rc; GtkWidget *label = NULL; GtkWidget *entry = NULL; GtkWidget *popup = NULL; if (cluster_flags & CLUSTER_FLAG_FED) { display_fed_disabled_popup(type); global_entry_changed = 0; return; } popup = gtk_dialog_new_with_buttons( type, GTK_WINDOW(main_window), GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, NULL); gtk_window_set_transient_for(GTK_WINDOW(popup), NULL); label = gtk_dialog_add_button(GTK_DIALOG(popup), GTK_STOCK_YES, GTK_RESPONSE_OK); gtk_window_set_default(GTK_WINDOW(popup), label); gtk_dialog_add_button(GTK_DIALOG(popup), GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL); if (!strncasecmp("Drain", type, 5)) { new_type = "DRAIN"; reason = "\n\nPlease enter reason."; state = NODE_STATE_DRAIN; entry = create_entry(); } else if (!strncasecmp("Resume", type, 6)) { new_type = "RESUME"; reason = ""; state = NODE_RESUME; } snprintf(tmp_char, sizeof(tmp_char), "Are you sure you want to set state of front end node %s " "to %s?%s", node_list, new_type, reason); label = gtk_label_new(tmp_char); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(popup)->vbox), label, false, false, 0); if (entry) gtk_box_pack_start(GTK_BOX(GTK_DIALOG(popup)->vbox), entry, true, true, 0); gtk_widget_show_all(popup); rc = gtk_dialog_run (GTK_DIALOG(popup)); slurm_init_update_front_end_msg(&front_end_update_msg); if (rc == GTK_RESPONSE_OK) { front_end_update_msg.name = node_list; front_end_update_msg.node_state = state; if (entry) { front_end_update_msg.reason = xstrdup( gtk_entry_get_text(GTK_ENTRY(entry))); if (!front_end_update_msg.reason || !strlen(front_end_update_msg.reason)) { lower = g_strdup_printf( "You need a reason to do that."); display_edit_note(lower); g_free(lower); goto end_it; } rc = uid_from_string(getlogin(), &front_end_update_msg.reason_uid); if (rc < 0) front_end_update_msg.reason_uid = getuid(); } rc = slurm_update_front_end(&front_end_update_msg); if (rc == SLURM_SUCCESS) { lower = g_strdup_printf( "Nodes %s updated successfully.", node_list); display_edit_note(lower); g_free(lower); } else { lower = g_strdup_printf( "Problem updating nodes %s: %s", node_list, slurm_strerror(rc)); display_edit_note(lower); g_free(lower); } } end_it: global_entry_changed = 0; xfree(front_end_update_msg.reason); gtk_widget_destroy(popup); if (got_edit_signal) { type = got_edit_signal; got_edit_signal = NULL; _admin_front_end(model, iter, type, node_list); xfree(type); } return; }
/* * scontrol_update_front_end - update the slurm front_end node configuration * per the supplied arguments * IN argc - count of arguments * IN argv - list of arguments * RET 0 if no slurm error, errno otherwise. parsing error prints * error message and returns 0 */ extern int scontrol_update_front_end (int argc, char **argv) { int i, rc = 0, update_cnt = 0; update_front_end_msg_t front_end_msg; char *reason_str = NULL; char *tag, *val; int tag_len, val_len; slurm_init_update_front_end_msg(&front_end_msg); for (i=0; i<argc; i++) { tag = argv[i]; val = strchr(argv[i], '='); if (val) { tag_len = val - argv[i]; val++; val_len = strlen(val); } else { exit_code = 1; error("Invalid input: %s Request aborted", argv[i]); return -1; } if (xstrncasecmp(tag, "FrontendName", MAX(tag_len, 1)) == 0) front_end_msg.name = val; else if (xstrncasecmp(tag, "Reason", MAX(tag_len, 1)) == 0) { int len = strlen(val); reason_str = xmalloc(len+1); if (*val == '"') strcpy(reason_str, val+1); else strcpy(reason_str, val); len = strlen(reason_str) - 1; if ((len >= 0) && (reason_str[len] == '"')) reason_str[len] = '\0'; front_end_msg.reason = reason_str; if ((getlogin() == NULL) || (uid_from_string(getlogin(), &front_end_msg.reason_uid) < 0)) { front_end_msg.reason_uid = getuid(); } update_cnt++; } else if (xstrncasecmp(tag, "State", MAX(tag_len, 1)) == 0) { if (xstrncasecmp(val, "DRAIN", MAX(val_len, 3)) == 0) { front_end_msg.node_state = NODE_STATE_DRAIN; update_cnt++; } else if (xstrncasecmp(val, "DOWN", MAX(val_len, 3)) == 0) { front_end_msg.node_state = NODE_STATE_DOWN; update_cnt++; } else if (xstrncasecmp(val, "RESUME", MAX(val_len, 3)) == 0) { front_end_msg.node_state = NODE_RESUME; update_cnt++; } else { exit_code = 1; fprintf(stderr, "Invalid input: %s\n" "Request aborted\n" "Valid states are: DRAIN RESUME\n", argv[i]); goto done; } } else { exit_code = 1; fprintf(stderr, "Update of this parameter is not " "supported: %s\n", argv[i]); fprintf(stderr, "Request aborted\n"); goto done; } } if ((front_end_msg.node_state == NODE_STATE_DOWN) && ((front_end_msg.reason == NULL) || (strlen(front_end_msg.reason) == 0))) { fprintf (stderr, "You must specify a reason when DOWNING a " "frontend node\nRequest aborted\n"); goto done; } if ((front_end_msg.node_state == NODE_STATE_DRAIN) && ((front_end_msg.reason == NULL) || (strlen(front_end_msg.reason) == 0))) { fprintf (stderr, "You must specify a reason when DRAINING a " "frontend node\nRequest aborted\n"); goto done; } if (update_cnt == 0) { exit_code = 1; fprintf(stderr, "No changes specified\n"); return 0; } rc = slurm_update_front_end(&front_end_msg); done: xfree(reason_str); if (rc) { exit_code = 1; return slurm_get_errno (); } else return 0; }