2 # Create, update or delete one project
4 require './rbac-lib.pl';
5 $access{'projects'} || &error($text{'projects_ecannot'});
7 &error_setup($text{'project_err'});
10 $projects = &list_projects();
12 $project = $projects->[$in{'idx'}];
13 $logname = $project->{'name'};
16 $project = { 'attr' => { } };
17 $logname = $in{'name'};
21 # Just delete this project
22 &delete_project($project);
26 if ($in{'new'} || $logname ne $in{'name'}) {
27 ($clash) = grep { $_->{'name'} eq $in{'name'} } @$projects;
28 $clash && &error($text{'project_eclash'});
31 # Validate and store inputs
32 $in{'name'} =~ /^[^: ]+$/ || &error($text{'project_ename'});
33 $project->{'name'} = $in{'name'};
34 $in{'id'} =~ /^\d+$/ || &error($text{'project_eid'});
35 if ($in{'new'} || $in{'id'} != $project->{'id'}) {
36 ($clash) = grep { $_->{'id'} == $in{'id'} } @$projects;
37 $clash && &error($text{'project_eidclash'});
39 $project->{'id'} = $in{'id'};
40 $in{'desc'} =~ /^[^:]*$/ || &error($text{'project_edesc'});
41 $project->{'desc'} = $in{'desc'};
42 $project->{'users'} = &parse_project_members("users");
43 $project->{'groups'} = &parse_project_members("groups");
45 # Validate resources, and build list of selected rctls
46 for($i=0; defined($rctl = $in{"rctl_$i"}); $i++) {
48 $priv = $in{"priv_$i"};
49 $limit = $in{"limit_$i"};
50 $action = $in{"action_$i"};
56 &error(&text('project_elimit', $i+1));
57 $rctls{$rctl} .= "($priv,$limit,$action)";
60 $rctls{$rctl} = undef;
63 foreach $k (keys %{$project->{'attr'}}) {
64 delete($project->{'attr'}->{$k}) if ($k =~ /\./);
66 foreach $rctl (keys %rctls) {
67 $project->{'attr'}->{$rctl} = $rctls{$rctl};
70 # Save pool and max-rss attributes
71 delete($project->{'attr'}->{'project.pool'});
72 if (!$in{'pool_def'}) {
73 $in{'pool'} =~ /^[a-z0-9\.\-]+$/i ||
74 &error($text{'project_epool'});
75 $project->{'attr'}->{'project.pool'} = $in{'pool'};
77 delete($project->{'attr'}->{'rcap.max-rss'});
78 if (!$in{'maxrss_def'}) {
79 $in{'maxrss'} =~ /^\d+$/ ||
80 &error($text{'project_emaxrss'});
81 $project->{'attr'}->{'rcap.max-rss'} =
82 $in{'maxrss'}*$in{'maxrss_units'};
85 # Save or update project
87 &create_project($project);
90 &modify_project($project);
95 &webmin_log($in{'delete'} ? "delete" : $in{'new'} ? "create" : "modify",
96 "project", $logname, $project);
97 &redirect("list_projects.cgi");