extern List as_mysql_remove_coord(mysql_conn_t *mysql_conn, uint32_t uid, List acct_list, slurmdb_user_cond_t *user_cond) { char *query = NULL, *object = NULL, *extra = NULL, *last_user = NULL; char *user_name = NULL; time_t now = time(NULL); int set = 0, is_admin=0, rc = SLURM_SUCCESS; ListIterator itr = NULL; slurmdb_user_rec_t *user_rec = NULL; List ret_list = NULL; List user_list = NULL; MYSQL_RES *result = NULL; MYSQL_ROW row; slurmdb_user_rec_t user; if (!user_cond && !acct_list) { error("we need something to remove"); return NULL; } else if (user_cond && user_cond->assoc_cond) user_list = user_cond->assoc_cond->user_list; if (check_connection(mysql_conn) != SLURM_SUCCESS) return NULL; memset(&user, 0, sizeof(slurmdb_user_rec_t)); user.uid = uid; if (!(is_admin = is_user_min_admin_level( mysql_conn, uid, SLURMDB_ADMIN_OPERATOR))) { if (!is_user_any_coord(mysql_conn, &user)) { error("Only admins/coordinators can " "remove coordinators"); errno = ESLURM_ACCESS_DENIED; return NULL; } } /* Leave it this way since we are using extra below */ if (user_list && list_count(user_list)) { set = 0; if (extra) xstrcat(extra, " && ("); else xstrcat(extra, "("); itr = list_iterator_create(user_list); while ((object = list_next(itr))) { if (!object[0]) continue; if (set) xstrcat(extra, " || "); xstrfmtcat(extra, "user='******'", object); set = 1; } list_iterator_destroy(itr); xstrcat(extra, ")"); } if (acct_list && list_count(acct_list)) { set = 0; if (extra) xstrcat(extra, " && ("); else xstrcat(extra, "("); itr = list_iterator_create(acct_list); while ((object = list_next(itr))) { if (!object[0]) continue; if (set) xstrcat(extra, " || "); xstrfmtcat(extra, "acct='%s'", object); set = 1; } list_iterator_destroy(itr); xstrcat(extra, ")"); } if (!extra) { errno = SLURM_ERROR; debug3("No conditions given"); return NULL; } query = xstrdup_printf( "select user, acct from %s where deleted=0 && %s order by user", acct_coord_table, extra); debug3("%d(%s:%d) query\n%s", mysql_conn->conn, THIS_FILE, __LINE__, query); if (!(result = mysql_db_query_ret(mysql_conn, query, 0))) { xfree(query); xfree(extra); errno = SLURM_ERROR; return NULL; } xfree(query); ret_list = list_create(slurm_destroy_char); user_list = list_create(slurm_destroy_char); while ((row = mysql_fetch_row(result))) { if (!is_admin) { slurmdb_coord_rec_t *coord = NULL; if (!user.coord_accts) { // This should never // happen error("We are here with no coord accts"); errno = ESLURM_ACCESS_DENIED; list_destroy(ret_list); list_destroy(user_list); xfree(extra); mysql_free_result(result); return NULL; } itr = list_iterator_create(user.coord_accts); while ((coord = list_next(itr))) { if (!strcasecmp(coord->name, row[1])) break; } list_iterator_destroy(itr); if (!coord) { error("User %s(%d) does not have the " "ability to change this account (%s)", user.name, user.uid, row[1]); errno = ESLURM_ACCESS_DENIED; list_destroy(ret_list); list_destroy(user_list); xfree(extra); mysql_free_result(result); return NULL; } } if (!last_user || strcasecmp(last_user, row[0])) { list_append(user_list, xstrdup(row[0])); last_user = row[0]; } list_append(ret_list, xstrdup_printf("U = %-9s A = %-10s", row[0], row[1])); } mysql_free_result(result); user_name = uid_to_string((uid_t) uid); rc = remove_common(mysql_conn, DBD_REMOVE_ACCOUNT_COORDS, now, user_name, acct_coord_table, extra, NULL, NULL, NULL, NULL); xfree(user_name); xfree(extra); if (rc == SLURM_ERROR) { list_destroy(ret_list); list_destroy(user_list); errno = SLURM_ERROR; return NULL; } /* get the update list set */ itr = list_iterator_create(user_list); while ((last_user = list_next(itr))) { user_rec = xmalloc(sizeof(slurmdb_user_rec_t)); user_rec->name = xstrdup(last_user); _get_user_coords(mysql_conn, user_rec); if (addto_update_list(mysql_conn->update_list, SLURMDB_REMOVE_COORD, user_rec) != SLURM_SUCCESS) slurmdb_destroy_user_rec(user_rec); } list_iterator_destroy(itr); list_destroy(user_list); return ret_list; }
extern List as_mysql_get_users(mysql_conn_t *mysql_conn, uid_t uid, slurmdb_user_cond_t *user_cond) { char *query = NULL; char *extra = NULL; char *tmp = NULL; List user_list = NULL; ListIterator itr = NULL; char *object = NULL; int set = 0; int i=0, is_admin=1; MYSQL_RES *result = NULL; MYSQL_ROW row; uint16_t private_data = 0; slurmdb_user_rec_t user; /* if this changes you will need to edit the corresponding enum */ char *user_req_inx[] = { "name", "admin_level" }; enum { USER_REQ_NAME, USER_REQ_AL, USER_REQ_COUNT }; if (check_connection(mysql_conn) != SLURM_SUCCESS) return NULL; memset(&user, 0, sizeof(slurmdb_user_rec_t)); user.uid = uid; private_data = slurm_get_private_data(); if (private_data & PRIVATE_DATA_USERS) { if (!(is_admin = is_user_min_admin_level( mysql_conn, uid, SLURMDB_ADMIN_OPERATOR))) { assoc_mgr_fill_in_user( mysql_conn, &user, 1, NULL); } if (!is_admin && !user.name) { debug("User %u has no assocations, and is not admin, " "so not returning any users.", user.uid); return NULL; } } if (!user_cond) { xstrcat(extra, "where deleted=0"); set = 1; goto empty; } if (user_cond->with_deleted) xstrcat(extra, "where (deleted=0 || deleted=1)"); else xstrcat(extra, "where deleted=0"); user_list = _get_other_user_names_to_mod(mysql_conn, uid, user_cond); if (user_list) { if (!user_cond->assoc_cond) user_cond->assoc_cond = xmalloc(sizeof(slurmdb_association_rec_t)); if (!user_cond->assoc_cond->user_list) user_cond->assoc_cond->user_list = user_list; else { list_transfer(user_cond->assoc_cond->user_list, user_list); list_destroy(user_list); } user_list = NULL; } else if ((user_cond->def_acct_list && list_count(user_cond->def_acct_list)) || (user_cond->def_wckey_list && list_count(user_cond->def_wckey_list))) return NULL; if (user_cond->assoc_cond && user_cond->assoc_cond->user_list && list_count(user_cond->assoc_cond->user_list)) { set = 0; xstrcat(extra, " && ("); itr = list_iterator_create(user_cond->assoc_cond->user_list); while ((object = list_next(itr))) { if (set) xstrcat(extra, " || "); xstrfmtcat(extra, "name='%s'", object); set = 1; } list_iterator_destroy(itr); xstrcat(extra, ")"); } if (user_cond->admin_level != SLURMDB_ADMIN_NOTSET) { xstrfmtcat(extra, " && admin_level=%u", user_cond->admin_level); set = 1; } empty: /* This is here to make sure we are looking at only this user * if this flag is set. */ if (!is_admin && (private_data & PRIVATE_DATA_USERS)) { xstrfmtcat(extra, " && name='%s'", user.name); } xfree(tmp); xstrfmtcat(tmp, "%s", user_req_inx[0]); for(i=1; i<USER_REQ_COUNT; i++) { xstrfmtcat(tmp, ", %s", user_req_inx[i]); } query = xstrdup_printf("select %s from %s %s", tmp, user_table, extra); xfree(tmp); xfree(extra); debug3("%d(%s:%d) query\n%s", mysql_conn->conn, THIS_FILE, __LINE__, query); if (!(result = mysql_db_query_ret( mysql_conn, query, 0))) { xfree(query); return NULL; } xfree(query); user_list = list_create(slurmdb_destroy_user_rec); while ((row = mysql_fetch_row(result))) { slurmdb_user_rec_t *user = xmalloc(sizeof(slurmdb_user_rec_t)); list_append(user_list, user); user->name = xstrdup(row[USER_REQ_NAME]); user->admin_level = slurm_atoul(row[USER_REQ_AL]); if (user_cond && user_cond->with_coords) _get_user_coords(mysql_conn, user); } mysql_free_result(result); if (user_cond && (user_cond->with_assocs || (user_cond->assoc_cond && user_cond->assoc_cond->only_defs))) { ListIterator assoc_itr = NULL; slurmdb_user_rec_t *user = NULL; slurmdb_association_rec_t *assoc = NULL; List assoc_list = NULL; /* Make sure we don't get any non-user associations * this is done by at least having a user_list * defined */ if (!user_cond->assoc_cond) user_cond->assoc_cond = xmalloc(sizeof(slurmdb_association_cond_t)); if (!user_cond->assoc_cond->user_list) user_cond->assoc_cond->user_list = list_create(NULL); user_cond->assoc_cond->with_deleted = user_cond->with_deleted; assoc_list = as_mysql_get_assocs( mysql_conn, uid, user_cond->assoc_cond); if (!assoc_list) { error("no associations"); goto get_wckeys; } itr = list_iterator_create(user_list); assoc_itr = list_iterator_create(assoc_list); while ((user = list_next(itr))) { while ((assoc = list_next(assoc_itr))) { if (strcmp(assoc->user, user->name)) continue; /* Set up the default. This is needed * for older versions primarily that * don't have the notion of default * account per cluster. */ if (!user->default_acct && (assoc->is_def == 1)) user->default_acct = xstrdup(assoc->acct); if (!user_cond->with_assocs) { /* We just got the default so no reason to hang around if we aren't getting the associations. */ if (user->default_acct) break; else continue; } if (!user->assoc_list) user->assoc_list = list_create( slurmdb_destroy_association_rec); list_append(user->assoc_list, assoc); list_remove(assoc_itr); } list_iterator_reset(assoc_itr); } list_iterator_destroy(itr); list_iterator_destroy(assoc_itr); list_destroy(assoc_list); } get_wckeys: if (user_cond && (user_cond->with_wckeys || (user_cond->assoc_cond && user_cond->assoc_cond->only_defs))) { ListIterator wckey_itr = NULL; slurmdb_user_rec_t *user = NULL; slurmdb_wckey_rec_t *wckey = NULL; List wckey_list = NULL; slurmdb_wckey_cond_t wckey_cond; memset(&wckey_cond, 0, sizeof(slurmdb_wckey_cond_t)); if (user_cond->assoc_cond) { wckey_cond.user_list = user_cond->assoc_cond->user_list; wckey_cond.cluster_list = user_cond->assoc_cond->cluster_list; wckey_cond.only_defs = user_cond->assoc_cond->only_defs; } wckey_list = as_mysql_get_wckeys(mysql_conn, uid, &wckey_cond); if (!wckey_list) return user_list; itr = list_iterator_create(user_list); wckey_itr = list_iterator_create(wckey_list); while ((user = list_next(itr))) { while ((wckey = list_next(wckey_itr))) { if (strcmp(wckey->user, user->name)) continue; /* Set up the default. This is needed * for older versions primarily that * don't have the notion of default * wckey per cluster. */ if (!user->default_wckey && (wckey->is_def == 1)) user->default_wckey = xstrdup(wckey->name); /* We just got the default so no reason to hang around if we aren't getting the wckeys. */ if (!user_cond->with_wckeys) { /* We just got the default so no reason to hang around if we aren't getting the wckeys. */ if (user->default_wckey) break; else continue; } if (!user->wckey_list) user->wckey_list = list_create( slurmdb_destroy_wckey_rec); list_append(user->wckey_list, wckey); list_remove(wckey_itr); } list_iterator_reset(wckey_itr); /* If a user doesn't have a default wckey (they might not of had track_wckeys on), set it now. */ if (!user->default_wckey) user->default_wckey = xstrdup(""); } list_iterator_destroy(itr); list_iterator_destroy(wckey_itr); list_destroy(wckey_list); } return user_list; }
extern int as_mysql_add_coord(mysql_conn_t *mysql_conn, uint32_t uid, List acct_list, slurmdb_user_cond_t *user_cond) { char *query = NULL, *user = NULL, *acct = NULL; char *user_name = NULL, *txn_query = NULL; ListIterator itr, itr2; time_t now = time(NULL); int rc = SLURM_SUCCESS; slurmdb_user_rec_t *user_rec = NULL; if (!user_cond || !user_cond->assoc_cond || !user_cond->assoc_cond->user_list || !list_count(user_cond->assoc_cond->user_list) || !acct_list || !list_count(acct_list)) { error("we need something to add"); return SLURM_ERROR; } if (check_connection(mysql_conn) != SLURM_SUCCESS) return ESLURM_DB_CONNECTION; user_name = uid_to_string((uid_t) uid); itr = list_iterator_create(user_cond->assoc_cond->user_list); itr2 = list_iterator_create(acct_list); while ((user = list_next(itr))) { if (!user[0]) continue; while ((acct = list_next(itr2))) { if (!acct[0]) continue; if (query) xstrfmtcat(query, ", (%ld, %ld, '%s', '%s')", (long)now, (long)now, acct, user); else query = xstrdup_printf( "insert into %s (creation_time, " "mod_time, acct, user) values " "(%ld, %ld, '%s', '%s')", acct_coord_table, (long)now, (long)now, acct, user); if (txn_query) xstrfmtcat(txn_query, ", (%ld, %u, '%s', '%s', '%s')", (long)now, DBD_ADD_ACCOUNT_COORDS, user, user_name, acct); else xstrfmtcat(txn_query, "insert into %s " "(timestamp, action, name, " "actor, info) " "values (%ld, %u, '%s', " "'%s', '%s')", txn_table, (long)now, DBD_ADD_ACCOUNT_COORDS, user, user_name, acct); } list_iterator_reset(itr2); } xfree(user_name); list_iterator_destroy(itr); list_iterator_destroy(itr2); if (query) { xstrfmtcat(query, " on duplicate key update mod_time=%ld, " "deleted=0;%s", (long)now, txn_query); debug3("%d(%s:%d) query\n%s", mysql_conn->conn, THIS_FILE, __LINE__, query); rc = mysql_db_query(mysql_conn, query); xfree(query); xfree(txn_query); if (rc != SLURM_SUCCESS) { error("Couldn't add cluster hour rollup"); return rc; } /* get the update list set */ itr = list_iterator_create(user_cond->assoc_cond->user_list); while ((user = list_next(itr))) { user_rec = xmalloc(sizeof(slurmdb_user_rec_t)); user_rec->name = xstrdup(user); _get_user_coords(mysql_conn, user_rec); if (addto_update_list(mysql_conn->update_list, SLURMDB_ADD_COORD, user_rec) != SLURM_SUCCESS) slurmdb_destroy_user_rec(user_rec); } list_iterator_destroy(itr); } return SLURM_SUCCESS; }
extern int as_mysql_add_coord(mysql_conn_t *mysql_conn, uint32_t uid, List acct_list, slurmdb_user_cond_t *user_cond) { char *query = NULL, *user = NULL, *acct = NULL; char *user_name = NULL, *txn_query = NULL; ListIterator itr, itr2; time_t now = time(NULL); int rc = SLURM_SUCCESS; slurmdb_user_rec_t *user_rec = NULL; if (!user_cond || !user_cond->assoc_cond || !user_cond->assoc_cond->user_list || !list_count(user_cond->assoc_cond->user_list) || !acct_list || !list_count(acct_list)) { error("we need something to add"); return SLURM_ERROR; } if (check_connection(mysql_conn) != SLURM_SUCCESS) return ESLURM_DB_CONNECTION; if (!is_user_min_admin_level(mysql_conn, uid, SLURMDB_ADMIN_OPERATOR)) { slurmdb_user_rec_t user; slurmdb_coord_rec_t *coord = NULL; char *acct = NULL; memset(&user, 0, sizeof(slurmdb_user_rec_t)); user.uid = uid; if (!is_user_any_coord(mysql_conn, &user)) { error("Only admins/operators/coordinators " "can add account coordinators"); return ESLURM_ACCESS_DENIED; } itr = list_iterator_create(acct_list); itr2 = list_iterator_create(user.coord_accts); while ((acct = list_next(itr))) { while ((coord = list_next(itr2))) { if (!xstrcasecmp(coord->name, acct)) break; } if (!coord) break; list_iterator_reset(itr2); } list_iterator_destroy(itr2); list_iterator_destroy(itr); if (!coord) { error("Coordinator %s(%d) tried to add another " "coordinator to an account they aren't " "coordinator over.", user.name, user.uid); return ESLURM_ACCESS_DENIED; } } user_name = uid_to_string((uid_t) uid); itr = list_iterator_create(user_cond->assoc_cond->user_list); itr2 = list_iterator_create(acct_list); while ((user = list_next(itr))) { if (!user[0]) continue; while ((acct = list_next(itr2))) { if (!acct[0]) continue; if (query) xstrfmtcat(query, ", (%ld, %ld, '%s', '%s')", (long)now, (long)now, acct, user); else query = xstrdup_printf( "insert into %s (creation_time, " "mod_time, acct, user) values " "(%ld, %ld, '%s', '%s')", acct_coord_table, (long)now, (long)now, acct, user); if (txn_query) xstrfmtcat(txn_query, ", (%ld, %u, '%s', '%s', '%s')", (long)now, DBD_ADD_ACCOUNT_COORDS, user, user_name, acct); else xstrfmtcat(txn_query, "insert into %s " "(timestamp, action, name, " "actor, info) " "values (%ld, %u, '%s', " "'%s', '%s')", txn_table, (long)now, DBD_ADD_ACCOUNT_COORDS, user, user_name, acct); } list_iterator_reset(itr2); } xfree(user_name); list_iterator_destroy(itr); list_iterator_destroy(itr2); if (query) { xstrfmtcat(query, " on duplicate key update mod_time=%ld, " "deleted=0;%s", (long)now, txn_query); if (debug_flags & DEBUG_FLAG_DB_ASSOC) DB_DEBUG(mysql_conn->conn, "query\n%s", query); rc = mysql_db_query(mysql_conn, query); xfree(query); xfree(txn_query); if (rc != SLURM_SUCCESS) { error("Couldn't add cluster hour rollup"); return rc; } /* get the update list set */ itr = list_iterator_create(user_cond->assoc_cond->user_list); while ((user = list_next(itr))) { user_rec = xmalloc(sizeof(slurmdb_user_rec_t)); user_rec->name = xstrdup(user); _get_user_coords(mysql_conn, user_rec); if (addto_update_list(mysql_conn->update_list, SLURMDB_ADD_COORD, user_rec) != SLURM_SUCCESS) slurmdb_destroy_user_rec(user_rec); } list_iterator_destroy(itr); } return SLURM_SUCCESS; }