Skip to content

Commit

Permalink
Merge branch 'work'
Browse files Browse the repository at this point in the history
* work:
  mx_util: remove inline attribute from mx_stribeginswithany
  mxqd: unlink bad (left over) fspool files, so we don't try them over and over
  web: don't show the same set of data columns in any group table
  mxqd: rename output files as user
  mxqd: maintain supplementary group IDs of server
  • Loading branch information
donald committed Jul 13, 2016
2 parents e7ee4bd + 19b1545 commit 28d69ae
Show file tree
Hide file tree
Showing 4 changed files with 126 additions and 60 deletions.
2 changes: 1 addition & 1 deletion mx_util.c
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ inline int mx_strbeginswithany(char *str, char **starts, char **endptr)
return _mx_strbeginswithany(str, starts, endptr, 0);
}

inline int mx_stribeginswithany(char *str, char **starts, char **endptr)
int mx_stribeginswithany(char *str, char **starts, char **endptr)
{
return _mx_strbeginswithany(str, starts, endptr, 1);
}
Expand Down
60 changes: 57 additions & 3 deletions mxqd.c
Original file line number Diff line number Diff line change
Expand Up @@ -554,6 +554,19 @@ int server_init(struct mxq_server *server, int argc, char *argv[])
return -EX_IOERR;
}

i=server->supgid_cnt=getgroups(0,NULL);
if (i<0) {
mx_log_err("MAIN: getgroups(0,NULL) : %m");
return -errno;
}
server->supgid=mx_calloc_forever(i,sizeof(*server->supgid));
server->supgid_cnt=i;
res=getgroups(i,server->supgid);
if (res<0) {
mx_log_err("MAIN: getgroups() : %m");
return -errno;
}

if (arg_daemonize) {
res = mx_daemon(0, 1);
if (res == -1) {
Expand Down Expand Up @@ -1439,6 +1452,7 @@ void server_free(struct mxq_server *server)
mx_free_null(server->host_id);
mx_free_null(server->finished_jobsdir);
mx_flock_free(server->flock);
mx_free_null(server->supgid);

mx_log_finish();
}
Expand Down Expand Up @@ -1679,12 +1693,30 @@ int killall_cancelled(struct mxq_server *server)
return 0;
}

static void rename_outfiles(struct mxq_group *group, struct mxq_job *job)
static void rename_outfiles(struct mxq_server *server, struct mxq_group *group, struct mxq_job *job)
{
int res;

mxq_job_set_tmpfilenames(group, job);

if(RUNNING_AS_ROOT) {
res=initgroups(group->user_name,group->user_gid);
if (res==-1) {
mx_log_err("initgroups(\"%s\",%d): %m",group->user_name,group->user_gid);
exit(-errno);
}
res=setegid(group->user_gid);
if (res==-1) {
mx_log_err("setedid(%d): %m",group->user_gid);
exit(-errno);
}
res=seteuid(group->user_uid);
if (res==-1) {
mx_log_err("seteuid(%d): %m",group->user_uid);
exit(-errno);
}
}

if (!mx_streq(job->job_stdout, "/dev/null")) {
res = rename(job->tmp_stdout, job->job_stdout);
if (res == -1) {
Expand All @@ -1708,6 +1740,26 @@ static void rename_outfiles(struct mxq_group *group, struct mxq_job *job)
job->host_pid);
}
}

if(RUNNING_AS_ROOT) {
uid_t uid=getuid();
uid_t gid=getgid();
res=seteuid(uid);
if (res==-1) {
mx_log_err("seteuid(%d): %m",uid);
exit(-errno);
}
res=setegid(gid);
if (res==-1) {
mx_log_err("setegid(%d): %m",gid);
exit(-errno);
}
res=setgroups(server->supgid_cnt,server->supgid);
if (res==-1) {
mx_log_err("setgroups(): %m");
exit(-errno);
}
}
}

static int job_has_finished(struct mxq_server *server, struct mxq_group *group, struct mxq_job_list *jlist)
Expand All @@ -1719,7 +1771,7 @@ static int job_has_finished(struct mxq_server *server, struct mxq_group *group,

mxq_set_job_status_exited(server->mysql, job);

rename_outfiles(group, job);
rename_outfiles(server, group, job);

cnt = jlist->group->slots_per_job;
cpuset_clear_running(&server->cpu_set_running, &job->host_cpu_set);
Expand All @@ -1742,7 +1794,7 @@ static int job_is_lost(struct mxq_server *server,struct mxq_group *group, struct
group->group_jobs_unknown++;
group->group_jobs_running--;

rename_outfiles(group, job);
rename_outfiles(server, group, job);

cnt = jlist->group->slots_per_job;
cpuset_clear_running(&server->cpu_set_running, &job->host_cpu_set);
Expand Down Expand Up @@ -1812,6 +1864,7 @@ static int fspool_process_file(struct mxq_server *server,char *filename, uint64_
jlist = server_remove_job_list_by_job_id(server, job_id);
if (!jlist) {
mx_log_warning("fspool_process_file: %s : job unknown on server", filename);
unlink(filename);
return -(errno=ENOENT);
}

Expand All @@ -1821,6 +1874,7 @@ static int fspool_process_file(struct mxq_server *server,char *filename, uint64_
filename,
job->job_id,
job_id);
unlink(filename);
return -(errno=EINVAL);
}

Expand Down
3 changes: 3 additions & 0 deletions mxqd.h
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,9 @@ struct mxq_server {
char *initial_path;
char *initial_tmpdir;
char recoveronly;

size_t supgid_cnt;
gid_t *supgid;
};


Expand Down
121 changes: 65 additions & 56 deletions web/pages/mxq/mxq.in
Original file line number Diff line number Diff line change
Expand Up @@ -414,14 +414,40 @@ EOF
return $out;
}

sub group_table_rows {
my ($sth,$head)=@_;
my $out='';
sub group_table {

$out.='<table class="groups">';
my ($sql_clause,$sql_binds)=@_;

$sql_clause||='true';

my $out;
my (@cols,@head);

$out.=$q->Tr($q->th($head));
$out .= '<h2>Active Groups</h2>';

@cols=qw(
group_id group_name job_threads user_name
group_mtime
group_status
group_jobs
group_jobs_inq group_jobs_running
group_jobs_finished group_jobs_failed group_jobs_cancelled group_jobs_unknown
);

@head=qw(
group_id group_name threads user_name
group_mtime
group_status
jobs
inq running
finished failed cancelled unknown
);

my $sth=$dbh->prepare('SELECT '.join(',',@cols).' FROM mxq_group WHERE '.$sql_clause.' AND (group_jobs_running>0 OR group_jobs_inq>0) ORDER BY group_id DESC');
$sth->execute(@$sql_binds);

$out.='<table class="groups">';
$out.=$q->Tr($q->th(\@head));
while (my $row=$sth->fetchrow_arrayref()) {
my ($group_id,$group_name,$job_threads,$user_name,$group_mtime,$group_status,
$group_jobs,$group_jobs_inq,$group_jobs_running,$group_jobs_finished,$group_jobs_failed,$group_jobs_cancelled,$group_jobs_unknown
Expand All @@ -441,70 +467,53 @@ sub group_table_rows {
$q->td({class=>'number'},$group_jobs_failed),
$q->td({class=>'number'},$group_jobs_cancelled),
$q->td({class=>'number'},$group_jobs_unknown)

);
}
$out.='</table>';
return $out;
}

sub group_table {

my ($sql_clause,$sql_binds)=@_;

$sql_clause||='true';

my $out;

my @cols=qw(
group_id group_name job_threads user_name group_mtime group_status
group_jobs group_jobs_inq group_jobs_running group_jobs_finished group_jobs_failed group_jobs_cancelled group_jobs_unknown
);
my @head=qw(
group_id group_name threads user_name group_mtime group_status
jobs inq running finished failed cancelled unknown
);


$out .= '<h2>Active Groups</h2>';

my $sth=$dbh->prepare('SELECT '.join(',',@cols).' FROM mxq_group WHERE '.$sql_clause.' AND (group_jobs_running>0 OR group_jobs_inq>0) ORDER BY group_id DESC');
$sth->execute(@$sql_binds);
$out.=group_table_rows($sth,\@head);
$out .= '<h2>Finished Groups (last 7 days) </h2>';

@cols=qw(
group_id
group_name
job_threads
user_name
group_date_end
group_status
group_jobs
group_jobs_finished
group_jobs_failed
group_jobs_cancelled
group_jobs_unknown
group_id group_name job_threads user_name
group_date_end
group_status
group_jobs
group_jobs_finished group_jobs_failed group_jobs_cancelled group_jobs_unknown
);

@head=qw(
group_id
group_name
threads
user_name
date_end
group_status
jobs
finished
failed
cancelled
unknown
group_id group_name threads user_name
date_end
group_status
jobs
finished failed cancelled unknown
);

$out .= '<h2>Finished Groups (last 7 days) </h2>';

$sth=$dbh->prepare('SELECT '.join(',',@cols).' FROM mxq_group WHERE '.$sql_clause.' AND (group_jobs_running=0 AND group_jobs_inq=0) AND group_mtime >= DATE_SUB(NOW(),INTERVAL 7 DAY) ORDER BY group_id DESC');
$sth->execute(@$sql_binds);
$out.=group_table_rows($sth,\@head);

$out.='<table class="groups">';
$out.=$q->Tr($q->th(\@head));
while (my $row=$sth->fetchrow_arrayref()) {
my ($group_id,$group_name,$job_threads,$user_name,$group_date_end,$group_status,
$group_jobs,$group_jobs_finished,$group_jobs_failed,$group_jobs_cancelled,$group_jobs_unknown
)=@$row;

$out.=$q->Tr(
$q->td({class=>'number'},$q->a({href=>selfurl("/group/$group_id")},$group_id)),
$q->td($group_name),
$q->td({class=>'number'},$job_threads),
$q->td($q->a({href=>my_url('groups',{user_name=>$user_name})},$user_name)),
$q->td($group_date_end),
$q->td(group_status($group_status)),
$q->td({class=>'number'},$group_jobs),
$q->td({class=>'number'},$group_jobs_finished),
$q->td({class=>'number'},$group_jobs_failed),
$q->td({class=>'number'},$group_jobs_cancelled),
$q->td({class=>'number'},$group_jobs_unknown)
);
}
$out.='</table>';

return $out;
}
Expand Down

0 comments on commit 28d69ae

Please sign in to comment.