script:/usr/local/sbin/dgridmap.pl

From Dgiref
Jump to: navigation, search
#!/usr/bin/env perl
# 
use Getopt::Long;
 
   $base_url = "https://dispatch.fz-juelich.de:8814";
 
#  Defaultwerte
   $opt_pre  = "dg";
   $opt_cert = "/etc/grid-security";
 
   # FZK extension
   $path="/etc/grid-security/gridmapdir"; # without slash on the end of path!!
 
# funcions
   # global vars 
   my @acarr;
 
# logging output
sub logging {
        $msg=$_[0];
        print $msg;
}
 
# system/bash commands
sub mysystem {
        $cmd=$_[0];
        system $cmd;
        #logging $cmd;
        if ( $? == -1) {
                die ("Couldn't run '$cmd'");
        }
}
 
# URL encoding
sub URLEncode {
   my $theURL = $_[0];
   $theURL =~ s/([\W])/"%" . uc(sprintf("%2.2x",ord($1)))/eg;
   return $theURL;
}
 
sub getAcc {
   # required global @acarr
   my $acstr=$_[0];
   $acstr =~ s/\ *//;
   if(index($acstr, ",") != -1){
        my $nstr=substr($acstr, index($acstr, ",") + 1);
        #print substr($acstr, 0, index($acstr, ","))."\n";
        getAcc($nstr);
        my $ac=substr($acstr, 0, index($acstr, ","));
        push(@acarr, $ac);
   } else {
	push(@acarr,$acstr);
   }
 
}
 
#  Optionen einlesen
   $result = GetOptions (
		      "cert-path=s"       => \$opt_cert,
		      "pre=s"             => \$opt_pre,
		      "output-u=s"        => \$opt_outu,
		      "output-u-old=s"    => \$opt_outu_old,
		      "output-g=s"        => \$opt_outg,
		      "output-g-old=s"    => \$opt_outg_old,
		      "output-o=s"        => \$opt_outo,
		      "output-a=s"        => \$opt_outa,
		      "lcmaps"	 	  => \$lcmaps,
		      "help"              => \$opt_help
		      );
   if ((!$result) or (defined($opt_help))) {
      Usage();
      exit(-1);
   }
 
   if ((length("$opt_pre") > 2)) {
      print "############################################################\n\n";
      print "Fehler bei Option '-pre <zz>'; max. 2 Zeichen erlaubt !\n";
      Usage();
      exit(-1);
   }
 
#  Certificate-Spezifikationen
   $ca_dir    = "$opt_cert"."\/certificates";
   $cert_pub  = "$opt_cert"."\/hostcert.pem";
   $cert_priv = "$opt_cert"."\/hostkey.pem";
 
   if (not -d $ca_dir) {
      print "############################################################\n\n";
      print "Zertifikatsdirectory fuer certificates existiert nicht oder ist kein Directory ($ca_dir)!\n\n";
      print "############################################################\n\n";
      exit(-1);
   }
   if (-z $ca_dir) {
      print "############################################################\n\n";
      print "Zertifikatsdirectory fuer certificates ist leer ($ca_dir)!\n\n";
      print "############################################################\n\n";
      exit(-1);
   }
 
   if (not -f $cert_pub) {
      print "############################################################\n\n";
      print "'Grid-Server-Zertifikat' existiert nicht oder ist keine Datei ($cert_pub)!\n\n";
      print "############################################################\n\n";
      exit(-1);
   }
   if (-z $cert_pub) {
      print "############################################################\n\n";
      print "'Grid-Server-Zertifikat' ist leer ($cert_pub)!\n\n";
      print "############################################################\n\n";
      exit(-1);
   }
 
   if (not -f $cert_priv) {
      print "############################################################\n\n";
      print "'privater Schluessel des Grid-Server-Zertifikats' existiert nicht oder ist keine Datei ($cert_priv)!\n\n";
      print "############################################################\n\n";
      exit(-1);
   }
   if (-z $cert_priv) {
      print "############################################################\n\n";
      print "'privater Schluessel des Grid-Server-Zertifikats' ist leer ($cert_priv)!\n\n";
      print "############################################################\n\n";
      exit(-1);
   }
 
#  kein Output-File def. --> alle Formate mit Defaultnamen generieren
   if ((!defined($opt_outu)) and (!defined($opt_outu_old)) and (!defined($opt_outg)) and (!defined($opt_outg_old)) and (!defined($opt_outo)) and (!defined($opt_outa))) {
      $opt_outu = "uudb";
      $opt_outu_old = "uudb.old";
      $opt_outg = "gridmap";
      $opt_outg_old = "gridmap.old";
      $opt_outo = "ogsa";
      $opt_outa = "admin";
   }
 
##################################
#  ALTE !!! UUDB-Daten erzeugen  #
##################################
 
   if ((defined($opt_outu_old))) {
 
      $urlu = "get_gridmaps?pre=$opt_pre\&form=uudb_old";
      $wget_cmd = "/usr/bin/wget -nv -t 1 --ca-directory=$ca_dir --certificate=$cert_pub --private-key=$cert_priv \'$base_url/$urlu\' -o /dev/null -O-";
      @list = `exec $wget_cmd`;
      if ($? != 0) {
         print "############################################################\n\n";
         print "wget command failed for uudb_old; rc is '$?' \n\n";
         print "############################################################\n\n";
         exit(-1);
      }
 
      $err  = grep (/ERROR/,@list);
      if ($err > 0) {
         print "############################################################\n\n";
         foreach $line (@list) {print "$line\n";}
         print "############################################################\n\n";
         exit(-1);
      } 
 
# 1. Zeile lesen (enthält: !SITE!#sitename)
      $site_line =$list[0];
      $sitefound = grep (/!SITE!/,$site_line);
      if ( $sitefound > 0 ) {
         @splitsite = split(/#/,$site_line);
         $site = @splitsite[1];
         $site =~ s/ //g;
         if (("$opt_outu_old" eq "uudb.old")) {
            $opt_outu_old = "./"."$opt_outu_old".".$site";
         }
         open(UUDB,">$opt_outu_old")
             or die "Fehler beim Oeffnen der UUDB-Datei ./$opt_outu_old\n";
      } else {
         print "############################################################\n\n";
         print "ERROR: get_gridmap-Fehler (leerer Output fuer uudb_old)\n\n";
         print "############################################################\n\n";
#        exit (-1);
      } 
 
# 1. Zeile überlesen
      print UUDB @list[1..$#list];
      close (UUDB);
   }
 
#####################################
#  ALTE !!! GRIDMAP-Daten erzeugen  #
#####################################
 
   if ((defined($opt_outg_old))) {
 
      $urlg = "get_gridmaps?pre=$opt_pre\&form=grid_old";
      $wget_cmd = "/usr/bin/wget -nv -t 1 --ca-directory=$ca_dir --certificate=$cert_pub --private-key=$cert_priv \'$base_url/$urlg\' -o /dev/null -O-";
      @list = `exec $wget_cmd`;
      if ($? != 0) {
         print "############################################################\n\n";
         print "wget command failed for gridmap_old; rc is '$?' \n\n";
         print "############################################################\n\n";
         exit(-1);
      }
 
      $err  = grep (/ERROR/,@list);
      if ($err > 0) {
         print "############################################################\n\n";
         foreach $line (@list) {print "$line\n";}
         print "############################################################\n\n";
         exit(-1);
      }
 
# 1. Zeile lesen (enthält: !SITE!#sitename)
      $site_line =$list[0];
      $sitefound = grep (/!SITE!/,$site_line);
      if ( $sitefound > 0 ) {
         @splitsite = split(/#/,$site_line);
         $site = @splitsite[1];
         $site =~ s/ //g;
         if (("$opt_outg_old" eq "gridmap.old")) {
            $opt_outg_old = "./"."$opt_outg_old".".$site";
         }
         open(GRID,">$opt_outg_old")
             or die "Fehler beim Oeffnen der GRIDMAP-Datei ./$opt_outg_old\n";
      } else {
         print "############################################################\n\n";
         print "ERROR: get_gridmap-Fehler (leerer Output fuer gridmap_old)\n\n";
         print "############################################################\n\n";
#        exit (-1);
      }
 
# 1. Zeile überlesen
      print GRID @list[1..$#list];
      close(GRID);
   }
 
#########################
#  UUDB-Daten erzeugen  #
#########################
 
   if ((defined($opt_outu))) {
 
      $urlu = "get_gridmaps?pre=$opt_pre\&form=uudb";
      $wget_cmd = "/usr/bin/wget -nv -t 1 --ca-directory=$ca_dir --certificate=$cert_pub --private-key=$cert_priv \'$base_url/$urlu\' -o /dev/null -O-";
      @list = `exec $wget_cmd`;
      if ($? != 0) {
         print "############################################################\n\n";
         print "wget command failed for uudb; rc is '$?' \n\n";
         print "############################################################\n\n";
         exit(-1);
      }
 
      $err  = grep (/ERROR/,@list);
      if ($err > 0) {
         print "############################################################\n\n";
         foreach $line (@list) {print "$line\n";}
         print "############################################################\n\n";
         exit(-1);
      }
 
# 1. Zeile lesen (enthält: !SITE!#sitename)
      $site_line =$list[0];
      $sitefound = grep (/!SITE!/,$site_line);
      if ( $sitefound > 0 ) {
         @splitsite = split(/#/,$site_line);
         $site = @splitsite[1];
         $site =~ s/ //g;
         if (("$opt_outu" eq "uudb")) {
            $opt_outu = "./"."$opt_outu".".$site";
         }
         open(UUDB,">$opt_outu")
             or die "Fehler beim Oeffnen der UUDB-Datei ./$opt_outu\n";
      } else {
         print "############################################################\n\n";
         print "ERROR: get_gridmap-Fehler (leerer Output fuer uudb)\n\n";
         print "############################################################\n\n";
#        exit (-1);
      }
 
# 1. Zeile überlesen
      print UUDB @list[1..$#list];
      close (UUDB);
   }
 
############################
#  GRIDMAP-Daten erzeugen  #
############################
 
   if ((defined($opt_outg))) {
 
      $urlg = "get_gridmaps?pre=$opt_pre\&form=grid";
      $wget_cmd = "/usr/bin/wget -nv -t 1 --ca-directory=$ca_dir --certificate=$cert_pub --private-key=$cert_priv \'$base_url/$urlg\' -o /dev/null -O-";
      @list = `exec $wget_cmd`;
      if ($? != 0) {
         print "############################################################\n\n";
         print "wget command failed for gridmap; rc is '$?' \n\n";
         print "############################################################\n\n";
         exit(-1);
      }
 
      $err  = grep (/ERROR/,@list);
      if ($err > 0) {
         print "############################################################\n\n";
         foreach $line (@list) {print "$line\n";}
         print "############################################################\n\n";
         exit(-1);
      } 
 
# 1. Zeile lesen (enthält: !SITE!#sitename)
      $site_line =$list[0];
      $sitefound = grep (/!SITE!/,$site_line);
      if ( $sitefound > 0 ) {
         @splitsite = split(/#/,$site_line);
         $site = @splitsite[1];
         $site =~ s/ //g;
         if (("$opt_outg" eq "gridmap")) {
            $opt_outg = "./"."$opt_outg".".$site";
         }
         open(GRID,">$opt_outg")
             or die "Fehler beim Oeffnen der GRIDMAP-Datei ./$opt_outg\n";
      } else {
         print "############################################################\n\n";
         print "ERROR: get_gridmap-Fehler (leerer Output fuer gridmap)\n\n";
         print "############################################################\n\n";
#        exit (-1);
      } 
 
# 1. Zeile überlesen
      print $#list;
      print GRID @list[1..$#list];
      close(GRID);
 
#############################################
#  FZK extension. Create lcmaps fixed links #
 
      if(defined($lcmaps)){
 
        foreach $jline(@list){
 
        # Get all VOs. Example: dghp0008,dgkg0010,dgmd0021
        chomp($vjmap = substr($jline, rindex($jline,"\" ")+2));
 
        # parsing VOs. Add them to array @acarr
        getAcc($vjmap);
 
        # forach Account $jmap (for exm.: $jmap="dgdt003")
        foreach $jmap(@acarr){
 
                # get $vo von user with name $jmap=dgdt003
                if(-e "$path/$jmap"){
                        chomp($grsting = `groups $jmap`);
                        $vo=substr($grsting, rindex($grsting, "\:")+2); $
                        $vo="$vo";
                } else {
                        logging("ERROR: mapping for $jline $jmap-file not found! Nothing done.\n\n");
                        next;
                }
 
                # Create name for fix mapping $dn=%2fo%3dgermangrid%2fou%3dfzk%2fcn%3ddimitri%20nilsen%3adgtest
                $dn=substr( $jline, 1, rindex($jline, "\"") - 1);
                $dn =URLEncode($dn);
                $dn = lc($dn);
                $dn .= "%3a".$vo;
 
                # check if maping exists( -e %2fo%3dgermangrid%2fou%3dfzk%2fcn%3ddimitri%20nilsen%3adgtest)
                if(-e "$path/$dn"){
                        chomp($nodemk = `ls -i $path/$dn`);
                        chomp($nodeac = `ls -i $path/$jmap`);
                        $nodemk = substr($nodemk, 1);
                        $nodeac = substr($nodeac, 1);
                        $nodemk = substr($nodemk, 0, index($nodemk, " "));
                        $nodeac = substr($nodeac, 0, index($nodeac, " "));
 
                        if($nodemk ne $nodeac){
                                # Mapping exist, but to the wrong account -> re-create mapping
                                logging( "RE-created:\n".$dn."::::".$jmap."\n".$nodemk."::::".$nodeac."\n\n" );
                                mysystem( "rm -f $path/$dn" );
                                mysystem( "ln $path/$jmap $path/$dn" );
                        }
                } else {
                        # Create new mapping
                        logging ("Created:\n".$dn."::::".$jmap."\n\n");
                        mysystem ("ln $path/$jmap $path/$dn");
                }
 
        }
        @acarr=();
      } # /end foreach $jline(@julich)
 
     } # /end defined($lcmaps)
 
 
 }
 
#########################
#  OGSA-Daten erzeugen  #
#########################
 
   if ((defined($opt_outo))) {
      $urlo = "get_ogsa";
      $wget_cmd = "/usr/bin/wget -nv -t 1 --ca-directory=$ca_dir --certificate=$cert_pub --private-key=$cert_priv \'$base_url/$urlo\' -o /dev/null -O-";
      @list = `exec $wget_cmd`;
      if ($? != 0) {
         print "############################################################\n\n";
         print "wget command failed for ogsa; rc is '$?' \n\n";
         print "############################################################\n\n";
         exit(-1);
      }
 
      $err  = grep (/ERROR/,@list);
      if ($err > 0) {
         print "############################################################\n\n";
         foreach $line (@list) {print "$line\n";}
         print "############################################################\n\n";
         exit(-1);
      }
 
# 1. Zeile lesen (enthält: !SITE!#sitename)
      $site_line = $list[0];
      $sitefound = grep (/!SITE!/,$site_line);
      if ( $sitefound > 0 ) {
         @splitsite = split(/#/,$site_line);
         $site = @splitsite[1];
         $site =~ s/ //g;
         if (("$opt_outo" eq "ogsa")) {
            $opt_outo = "./"."$opt_outo".".$site";
         }
         open(OGSA,">$opt_outo")
             or die "Fehler beim Oeffnen der OGSA-Datei ./$opt_outo\n";
      } else {
         print "############################################################\n\n";
         print "ERROR: get_gridmap-Fehler (leerer Output fuer ogsa)\n\n";
         print "############################################################\n\n";
#        exit (-1);
      }
 
# 1. Zeile überlesen
      @ogsa_list = @list[1..$#list];
      foreach $line (@ogsa_list) {
         $line =~ s/\{//;
         $line =~ s/$\}//;
         print OGSA "$line";
      }
 
      close(OGSA);
   }
 
##########################
#  ADMIN-Daten erzeugen  #
##########################
 
   if ((defined($opt_outa))) {
      $urla = "get_admindata";
      $wget_cmd = "/usr/bin/wget -nv -t 1 --ca-directory=$ca_dir --certificate=$cert_pub --private-key=$cert_priv \'$base_url/$urla\' -o /dev/null -O-";
      @list = `exec $wget_cmd`;
      if ($? != 0) {
         print "############################################################\n\n";
         print "wget command failed for admin; rc is '$?' \n\n";
         print "############################################################\n\n";
         exit(-1);
      }
 
      $err  = grep (/ERROR/,@list);
      if ($err > 0) {
         print "############################################################\n\n";
         foreach $line (@list) {print "$line\n";}
         print "############################################################\n\n";
         exit(-1);
      }
 
# 1. Zeile lesen (enthält: !SITE!#sitename)
      $site_line = $list[0];
      $sitefound = grep (/!SITE!/,$site_line);
      if ( $sitefound > 0 ) {
         @splitsite = split(/#/,$site_line);
         $site = @splitsite[1];
         $site =~ s/ //g;
         if (("$opt_outa" eq "admin")) {
            $opt_outa = "./"."$opt_outa".".$site";
         }
         open(ADMIN,">$opt_outa")
             or die "Fehler beim Oeffnen der ADMIN-Datei ./$opt_outa\n";
      } else {
         print "############################################################\n\n";
         print "ERROR: get_gridmap-Fehler (leerer Output fuer admin)\n\n";
         print "############################################################\n\n";
#        exit (-1);
      }
 
# 1. Zeile überlesen
      @admin_list = @list[1..$#list];
      foreach $line (@admin_list) {
         $line =~ s/\{//;
         $line =~ s/$\}//;
         print ADMIN "$line";
      }
 
      close(ADMIN);
   }
exit(0);
 
 
 
sub Usage {
 
    print <<EndOfUsage;
 
############################################################
 
Aufruf    : 
 
    ./dgridmap   <-cert-path <certification-pathname>>
                 <-pre <zz>>  
                 <-output-u <uudb-fn>> 
                 <-output-u-old <uudb-old-fn>> 
                 <-output-g <gridmap-fn>> 
                 <-output-g-old <gridmap-old-fn>> 
                 <-output-o <ogsa-fn>> 
                 <-output-a <admin-fn>> 
 
############################################################
EndOfUsage
 
}
Personal tools