diff --git a/doc/man/man1/sshare.1 b/doc/man/man1/sshare.1 index d6220772eb3ded3647186d442a6dfce12035006b..f4efdf1d0cd7e142c77dd1f2db7aefc9e14f5554 100644 --- a/doc/man/man1/sshare.1 +++ b/doc/man/man1/sshare.1 @@ -74,10 +74,6 @@ Display associations. \fB\-\-accounts\fR <\fIAccount\fR> Display accounts. -.TP -\fB\-\-cluster\fR <\fICluster\fR> -Display cluster. - .TP \fB\-\-help\fP Display a description of sshare options and commands. @@ -128,14 +124,6 @@ The name of a bank account. .RE -.SH "CLUSTER " - -.TP -\fICluster\fP -The name of the cluster. - -.RE - .SH " USER " .TP diff --git a/src/common/assoc_mgr.c b/src/common/assoc_mgr.c index 13de1bab413d1373eda5b19787c73a2f6d08f52f..03b2d83361db1627f548765a5c948253c8bebb20 100644 --- a/src/common/assoc_mgr.c +++ b/src/common/assoc_mgr.c @@ -1098,7 +1098,8 @@ extern int assoc_mgr_is_user_acct_coord(void *db_conn, return 0; } -extern List assoc_mgr_get_shares(List acct_list, List user_list) +extern List assoc_mgr_get_shares(void *db_conn, + uid_t uid, List acct_list, List user_list) { ListIterator itr = NULL; ListIterator user_itr = NULL; @@ -1107,22 +1108,42 @@ extern List assoc_mgr_get_shares(List acct_list, List user_list) association_shares_object_t *share = NULL; List ret_list = NULL; char *tmp_char = NULL; + acct_user_rec_t user; + int is_admin=1; + uint16_t private_data = slurm_get_private_data(); if(!assoc_mgr_association_list || !list_count(assoc_mgr_association_list)) return NULL; + + memset(&user, 0, sizeof(acct_user_rec_t)); + user.uid = uid; + if(user_list && list_count(user_list)) user_itr = list_iterator_create(user_list); if(acct_list && list_count(acct_list)) acct_itr = list_iterator_create(acct_list); - + + if (private_data & PRIVATE_DATA_USAGE) { + uint32_t slurm_uid = slurm_get_slurm_user_id(); + is_admin = 0; + /* Check permissions of the requesting user. + */ + if((uid == slurm_uid || uid == 0) + || assoc_mgr_get_admin_level(db_conn, uid) + >= ACCT_ADMIN_OPERATOR) + is_admin = 1; + else { + assoc_mgr_fill_in_user(db_conn, &user, 1, NULL); + } + } + ret_list = list_create(slurm_destroy_association_shares_object); slurm_mutex_lock(&assoc_mgr_association_lock); itr = list_iterator_create(assoc_mgr_association_list); - while((assoc = list_next(itr))) { - + while((assoc = list_next(itr))) { if(user_itr && assoc->user) { while((tmp_char = list_next(user_itr))) { if(!strcasecmp(tmp_char, assoc->user)) @@ -1130,9 +1151,10 @@ extern List assoc_mgr_get_shares(List acct_list, List user_list) } list_iterator_reset(user_itr); /* not correct user */ - if(!tmp_char) + if(!tmp_char) continue; } + if(acct_itr) { while((tmp_char = list_next(acct_itr))) { if(!strcasecmp(tmp_char, assoc->acct)) @@ -1140,9 +1162,46 @@ extern List assoc_mgr_get_shares(List acct_list, List user_list) } list_iterator_reset(acct_itr); /* not correct account */ - if(!tmp_char) + if(!tmp_char) + continue; + } + + if (private_data & PRIVATE_DATA_USAGE) { + if(!is_admin) { + ListIterator itr = NULL; + acct_coord_rec_t *coord = NULL; + + if(assoc->user && + !strcmp(assoc->user, user.name)) + goto is_user; + + if(!user.coord_accts) { + debug4("This user isn't a coord."); + goto bad_user; + } + + if(!assoc->acct) { + debug("No account name given " + "in association."); + goto bad_user; + } + + itr = list_iterator_create(user.coord_accts); + while((coord = list_next(itr))) { + if(!strcasecmp(coord->name, + assoc->acct)) + break; + } + list_iterator_destroy(itr); + + if(coord) + goto is_user; + + bad_user: continue; + } } + is_user: share = xmalloc(sizeof(association_shares_object_t)); list_append(ret_list, share); diff --git a/src/common/assoc_mgr.h b/src/common/assoc_mgr.h index a88483d523fa70022c0fa5304e3d7a0b912d7857..495e4b84e37df23ff56dd2d0cc7dd4aeb4e8e297 100644 --- a/src/common/assoc_mgr.h +++ b/src/common/assoc_mgr.h @@ -151,10 +151,12 @@ extern int assoc_mgr_set_cpu_shares(uint32_t procs, uint32_t half_life); /* * get the share information from the association list in the form of * a list containing association_share_object_t's + * IN: uid: uid_t of user issuing the request * IN: acct_list: char * list of accounts you want (NULL for all) * IN: user_list: char * list of user names you want (NULL for all) */ -extern List assoc_mgr_get_shares(List acct_list, List user_list); +extern List assoc_mgr_get_shares( + void *db_conn, uid_t uid, List acct_list, List user_list); /* * update associations in cache diff --git a/src/slurmctld/proc_req.c b/src/slurmctld/proc_req.c index b03d1463e1e15e04c9e65a8fe22ee0713c271ba3..91c24dd2c8bccb459c5762d4fd21d92c330e9613 100644 --- a/src/slurmctld/proc_req.c +++ b/src/slurmctld/proc_req.c @@ -858,7 +858,9 @@ static void _slurm_rpc_get_shares(slurm_msg_t *msg) debug2("Processing RPC: REQUEST GET SHARES from uid=%u", (unsigned int)uid); resp_msg.tot_shares = assoc_mgr_root_assoc->cpu_shares; - resp_msg.assoc_shares_list = assoc_mgr_get_shares(req_msg->acct_list, + resp_msg.assoc_shares_list = assoc_mgr_get_shares(acct_db_conn, + uid, + req_msg->acct_list, req_msg->user_list); slurm_msg_t_init(&response_msg); response_msg.address = msg->address; diff --git a/src/sshare/sshare.c b/src/sshare/sshare.c index 17d9ccc92dea1173af63fdc6133ad96b319ed671..0c85cc9a3a643b7612f5ec57cc24e57fdab6f7c9 100644 --- a/src/sshare/sshare.c +++ b/src/sshare/sshare.c @@ -52,8 +52,8 @@ uint32_t my_uid = 0; static int _set_time_format(char *format); static int _get_info(shares_request_msg_t *shares_req, shares_response_msg_t **shares_resp); -static int _addto_id_char_list(List char_list, char *names, bool gid); -static char * _convert_to_id(char *name, bool gid); +static int _addto_name_char_list(List char_list, char *names, bool gid); +static char * _convert_to_name(int id, bool gid); static void _print_version( void ); static void _usage (); @@ -71,7 +71,6 @@ main (int argc, char *argv[]) static struct option long_options[] = { {"all", 0,0, 'a'}, {"accounts", 1, 0, 'A'}, - {"cluster", 1, 0, 'C'}, {"help", 0, 0, 'h'}, {"no_header", 0, 0, 'n'}, {"parsable", 0, 0, 'p'}, @@ -85,6 +84,17 @@ main (int argc, char *argv[]) {NULL, 0, 0, 0} }; + /* Check to see if we are running a supported accounting plugin */ + temp = slurm_get_priority_type(); + if(strcasecmp(temp, "priority/multifactor")) { + fprintf (stderr, "You are not running a supported " + "priority plugin\n(%s).\n" + "Only 'priority/multifactor' is supported.\n", + temp); + xfree(temp); + exit(1); + } + xfree(temp); exit_code = 0; quiet_flag = 0; @@ -136,7 +146,7 @@ main (int argc, char *argv[]) if(!req_msg.user_list) req_msg.user_list = list_create(slurm_destroy_char); - _addto_id_char_list(req_msg.user_list, optarg, 0); + _addto_name_char_list(req_msg.user_list, optarg, 0); break; case 't': _set_time_format(optarg); @@ -163,17 +173,49 @@ main (int argc, char *argv[]) log_alter(opts, 0, NULL); } - /* Check to see if we are running a supported accounting plugin */ - temp = slurm_get_priority_type(); - if(strcasecmp(temp, "priority/multifactor")) { - fprintf (stderr, "You are not running a supported " - "priority plugin\n(%s).\n" - "Only 'priority/multifactor' is supported.\n", - temp); - xfree(temp); - exit(1); + if(all_users) { + if(req_msg.user_list + && list_count(req_msg.user_list)) { + list_destroy(req_msg.user_list); + req_msg.user_list = NULL; + } + if(verbosity) + fprintf(stderr, "Users requested:\n\t: all\n"); + } else if (verbosity && req_msg.user_list + && list_count(req_msg.user_list)) { + fprintf(stderr, "Users requested:\n"); + ListIterator itr = list_iterator_create(req_msg.user_list); + while((temp = list_next(itr))) + fprintf(stderr, "\t: %s\n", temp); + list_iterator_destroy(itr); + } else if(!req_msg.user_list || !list_count(req_msg.user_list)) { + struct passwd *pwd = getpwuid(getuid()); + if(!req_msg.user_list) + req_msg.user_list = list_create(slurm_destroy_char); + temp = xstrdup(pwd->pw_name); + list_append(req_msg.user_list, temp); + if(verbosity) { + fprintf(stderr, "Users requested:\n"); + fprintf(stderr, "\t: %s\n", temp); + } + } + + if(req_msg.acct_list && list_count(req_msg.acct_list)) { + fprintf(stderr, "Accounts requested:\n"); + ListIterator itr = list_iterator_create(req_msg.acct_list); + while((temp = list_next(itr))) + fprintf(stderr, "\t: %s\n", temp); + list_iterator_destroy(itr); + } else { + if(req_msg.acct_list + && list_count(req_msg.acct_list)) { + list_destroy(req_msg.acct_list); + req_msg.acct_list = NULL; + } + if(verbosity) + fprintf(stderr, "Accounts requested:\n\t: all\n"); + } - xfree(temp); error_code = _get_info(&req_msg, &resp_msg); @@ -250,7 +292,7 @@ static int _get_info(shares_request_msg_t *shares_req, } /* returns number of objects added to list */ -static int _addto_id_char_list(List char_list, char *names, bool gid) +static int _addto_name_char_list(List char_list, char *names, bool gid) { int i=0, start=0; char *name = NULL, *tmp_char = NULL; @@ -283,9 +325,11 @@ static int _addto_id_char_list(List char_list, char *names, bool gid) name = xmalloc((i-start+1)); memcpy(name, names+start, (i-start)); //info("got %s %d", name, i-start); - if (!isdigit((int) *name)) { - name = _convert_to_id( - name, gid); + if (isdigit((int) *name)) { + int id = atoi(name); + xfree(name); + name = _convert_to_name( + id, gid); } while((tmp_char = list_next(itr))) { @@ -315,8 +359,10 @@ static int _addto_id_char_list(List char_list, char *names, bool gid) name = xmalloc((i-start)+1); memcpy(name, names+start, (i-start)); - if (!isdigit((int) *name)) { - name = _convert_to_id(name, gid); + if (isdigit((int) *name)) { + int id = atoi(name); + xfree(name); + name = _convert_to_name(id, gid); } while((tmp_char = list_next(itr))) { @@ -335,24 +381,24 @@ static int _addto_id_char_list(List char_list, char *names, bool gid) return count; } -static char *_convert_to_id(char *name, bool gid) +static char *_convert_to_name(int id, bool gid) { + char *name = NULL; + if(gid) { struct group *grp; - if (!(grp=getgrnam(name))) { + if (!(grp=getgrgid(id))) { fprintf(stderr, "Invalid group id: %s\n", name); exit(1); } - xfree(name); - name = xstrdup_printf("%d", grp->gr_gid); + name = xstrdup(grp->gr_name); } else { struct passwd *pwd; - if (!(pwd=getpwnam(name))) { + if (!(pwd=getpwuid(id))) { fprintf(stderr, "Invalid user id: %s\n", name); exit(1); } - xfree(name); - name = xstrdup_printf("%d", pwd->pw_uid); + name = xstrdup(pwd->pw_name); } return name; } @@ -376,7 +422,6 @@ sshare [<OPTION>] [<COMMAND>] \n\ Valid <OPTION> values are: \n\ -a or --all: equivalent to \"all\" command \n\ -A or --accounts: equivalent to \"accounts\" command \n\ - -C or --cluster: equivalent to \"cluster\" command \n\ -h or --help or --usage: equivalent to \"help\" command \n\ -n or --no_header: no header will be added to the beginning of output \n\ -p or --parsable: output will be '|' delimited with a '|' at the end \n\ @@ -390,19 +435,18 @@ sshare [<OPTION>] [<COMMAND>] \n\ \n\ \n\ Valid <COMMAND> values are: \n\ - --all list all \n\ - --accounts <Account> list accounts \n\ - --cluster <Cluster> list cluster \n\ - --help print this description of use. \n\ - --no_header output without a header \n\ + --all list all \n\ + --accounts <Account> list accounts (comma separated list) \n\ + --help print this description of use. \n\ + --no_header output without a header \n\ --parsable output will be | delimited with an ending '|'\n\ --parsable2 output will be | delimited without an ending '|'\n\ --quiet print no messages other than error messages. \n\ - --uid list help \n\ - --usage show help \n\ - --user <User> list user \n\ - --verbose wordy and windy output. \n\ - --version display tool version number. \n\ + --uid list uid (comma separated list) \n\ + --usage show help \n\ + --user <User> list user (comma separated list) \n\ + --verbose wordy and windy output. \n\ + --version display tool version number. \n\ \n\ \n\ \n\