]> andersk Git - moira.git/blobdiff - incremental/afs_create.pl
Document new blanche exit status semantics. (Don't claim success
[moira.git] / incremental / afs_create.pl
index 0330d2182099f7bb13c033f7a8b3de7dbb32f7fc..09d9c7a3f1e81d2bb2aa2486069fd9848e424e3a 100644 (file)
@@ -16,16 +16,21 @@ die "Usage: $0 locker type cell path user group\n" if (@ARGV != 6);
 
 # Lookup volume type
 ($c = $cell) =~ s/\./_/g;
-$vname = &afs_vname($locker, $type, $cell);
-die "Cannot create $type volumes in $cell\n" unless $vname;
-
-# Find free space
-($asrv,$apart) = &afs_find($cell,$type,$quota);
-die "Unable to find space to create $vname in $cell\n" unless ($asrv&&$apart);
-
-# Create volume
-system("$vos create $asrv $apart $vname -cell $cell >/dev/null") &&
-    &fatal("Unable to create $vname in $cell");
+$vtype = eval "\$vtypes_$c{$type}";
+die "Cannot create $type volumes in $cell\n" unless $vtype;
+$vname = $vtype . "." . $locker;
+$vname =~ s/[^-A-Za-z0-9_.]//g;                # strip out illegal characters
+
+# Find free space/Create volume
+$tries = 0; $code = 1;
+while ($tries<3 && $code) {
+    ($asrv,$apart) = &afs_find($cell,$type,$quota,@except);
+    die "Unable to find space to create $vname in $cell\n" unless ($asrv&&$apart);
+    $code = system("$vos create $asrv $apart $vname -cell $cell >/dev/null");
+    push(@except, $asrv);
+    $tries++;
+}
+&fatal("Unable to create $vname in $cell") if ($code); # Too many create errors
 push(@clean, "$vos remove $asrv $apart $vname -cell $cell >/dev/null");
 
 # Create mountpoint and set quota
@@ -61,10 +66,13 @@ chop($_ = <FS>);
 close(FS);
 &fatal("Can't get information about $p") if ($?);
 @tmp = (split(/ /,$_));
-system("$vos release $tmp[$#tmp] -cell $cell >/dev/null") &&
-    &fatal("Can't release $tmp[$#tmp] in cell $cell");
+if ($tmp[$#tmp] !~ /user\../) {
+    system("$vos release $tmp[$#tmp] -cell $cell >/dev/null") &&
+       &fatal("Can't release $tmp[$#tmp] in cell $cell");
+}
 
-&afs_quota_adj($cell,$asrv,$apart,$quota);
+# Update the quota records.
+&afs_quota_adj($cell,$asrv,$apart,$quota,0);
 exit(0);
 
 sub fatal
@@ -91,6 +99,8 @@ sub athena_proc
     # CONTRIB   <user> all system:anyuser rl
     # COURSE    <user> all <group> all system:facdev all system:authuser rl
     # HOMEDIR   <user> all
+    # LEASE    <user> all
+    # ORG      <user> all <group> all system:cwisfac all
     # PROJECT   <user> all <group> all
     # REF       <user> all system:anyuser rl
     # SW        <user> all system:swmaint all system:authuser rl
@@ -103,30 +113,43 @@ sub athena_proc
     @acl=("system:expunge ld");
     push(@acl,"system:facdev all") if ($type =~ /^(COURSE|UROP)/);
     push(@acl,"system:swmaint all") if ($type =~ /^(SW)/);
+    push(@acl,"system:cwisfac all") if ($type =~ /^(ORG)/);
     push(@acl,"system:administrators all") if ($type =~ /^(SYSTEM)/);
     push(@acl,"$user all")
-       if ($uid != 0 && $type =~ /^(ACTIVITY|APROJ|AREF|CONTRIB|COURSE|HOMEDIR|PROJECT|REF|SW|UROP)/);
+       if ($uid != 0 && $type =~ /^(ACTIVITY|APROJ|AREF|CONTRIB|COURSE|HOMEDIR|LEASE|ORG|PROJECT|REF|SW|UROP)/);
     push(@acl,"system:$group all")
-       if ($gid != 0 && $type =~ /^(ACTIVITY|APROJ|COURSE|PROJECT|UROP)/);
+       if ($gid != 0 && $type =~ /^(ACTIVITY|APROJ|COURSE|ORG|PROJECT|UROP)/);
     push(@acl,"system:$group rl") if ($gid != 0 && $type =~ /^(AREF)/);
     push(@acl,"system:authuser rl")
        if ($type =~ /^(COURSE|SW|UROP)/);
     push(@acl,"system:anyuser rl")
        if ($type =~ /^(ACTIVITY|APROJ|CONTRIB|REF|SYSTEM)/);
 
-    if ($type !~ /^(AREF|SYSTEM)/) {
+    if ($type !~ /^(AREF|ORG|SYSTEM)/) {
        system("$fs mkm $path/OldFiles $vname.backup");
        warn "$locker: Unable to create OldFiles mountpoint\n" if ($?);
     }
 
     if ($type =~ /ACTIVITY|APROJ|PROJECT/) {
-       chown($gid,0,$path) ||
-           die "Unable to set volume ownership\n";
+       system("/moira/bin/uchown $path $gid");
+       die "Unable to set volume ownership\n" if ($?);
     } elsif ($type =~ /HOMEDIR|UROP/) {
        chown($uid,0,$path) ||
            die "Unable to set volume ownership\n";
     }
 
+    if ($type eq "ORG") {
+       mkdir("$path/www",0755) &&
+           chown(0,0,"$path/www") || 
+               die "Unable to create subdirectories\n";
+       system("$fs sa $path/www @acl system:anyuser rl -clear") &&
+           die "Unable to set acl on www directory\n";
+
+       system("$fs sa $path @acl system:anyuser l -clear") &&
+           die "Unable to set acl on top-level directory\n";
+       return;
+    }
+
     if ($type eq "HOMEDIR") {
        die "Unable to get uid for user\n" unless ($uid);
 
This page took 0.056913 seconds and 4 git commands to generate.