Benutzer:Kirmse/delixs-groupadd

Aus Delixs
Version vom 15. Juni 2009, 07:04 Uhr von Kirmse (Diskussion | Beiträge) (Beschreibung des Aufrufs korrigiert)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Zur Navigation springen Zur Suche springen

delixs-groupadd

  • Dieses Script dient dazu, in einer der Delixs-Gruppen hadmin, cadmin, tadmin, fachl, material, online und internet Lehrer (User) einzutragen.
  • Parameter: --help oder -h, --user oder -u, --group oder -g
  • Aufruf: delixs-groupadd -g hadmin -u mmustermann


das Script

<source lang="perl">

  1. !/usr/bin/perl

use warnings; use strict;

use Net::LDAP; use Getopt::Long;

my ($ldap, $ldap_base, $pass, $entry, @entries, $mesg, $gid, $group,

   $member, @members, $anzahl, @groups);

@groups = qw(hadmin cadmin tadmin fachl material online internet);

  1. Initialisieren der Variablen fuer die Parameter

$member = ; $group = ;

  1. wir holen uns zuerst die Parameter,
  2. falls --help, dann Ausgabe der Hilfe (siehe &help) und beenden

GetOptions('user=s' => \$member,

          'group=s'=> \$group,
          'help'   => \&help);
  1. Wenn kein Parameter -u oder --user uebergeben wurde, dann Abbruch

if ($member eq ) {

 die "Abbruch: es wurde kein Loginname uebergeben!\n";

}

  1. Wenn kein Parameter -g oder --group uebergeben wurde, dann Abbruch

if ($group eq ) {

 die "Abbruch: es wurde keine Gruppe uebergeben!\n";

}

  1. Der Parameter -g muss in @groups aufgelistet sein

$anzahl = grep /^$group$/, @groups; if ( $anzahl == 0) {

 die "Abbruch: $group ist keine Delixs-Gruppe!\n"; 

}

  1. Wenn wir keine root-Rechte haben, dann Abbruch

if ($> != 0) { # siehe $EFFECTIVE_USER_ID,$EUID

 die "Abbruch: das Script muss mit root-Rechten ausgefuehrt werden!\n";

}

  1. wir holen uns die Such-Basis ($ldap_base) aus der ldap.conf

open DATEI, '<', '/etc/ldap/ldap.conf'

 or die "Abbruch: konnte ldap.conf nicht oeffnen, $!\n";

while (my $zeile = <DATEI>) {

 if ($zeile =~ m/^\s*base\s+(\w.*\w)\s*$/i) {
   $ldap_base = $1;
   last;
 }

} close DATEI;

  1. da wir (spaeter) in den LDAP schreiben wollen, brauchen wir noch das Passwort

open DATEI, '<', '/etc/ldap.secret'

 or die "Abbruch: konnte ldap.secret nicht oeffnen, $!\n";

$pass = <DATEI>; chomp($pass); close DATEI;

  1. wir verbinden uns mit dem LDAP

$ldap = Net::LDAP->new('127.0.0.1', version => 3) or die "Abbruch: $@"; $ldap->bind( dn => "cn=admin, $ldap_base", password => $pass)

 or die "Abbruch: konnte mich nicht mit dem LDAP verbinden";
  1. Wir ueberpruefen, ob der Parameter -u ein gueltiges Login ist

$mesg = $ldap->search(base => "ou=people,ou=accounts,$ldap_base",

                     filter => "uid=$member",
                     attrs  => ['uid', 'gidNumber'] );
  1. wenn Fehlercode, dann das Script mit Fehlermeldung sterben lassen

$mesg->code and die $mesg->error;

  1. Wenn der uebergebene Parameter kein User ist, dann Abbruch

if (scalar ($mesg->entries) == 0) {

 die "Abbruch: $member ist kein gueltiger Account!\n";

}

  1. Wenn der uebergebene Parameter kein Lehrer ist, dann Abbruch
  2. diesen Test bei 'online' und 'internet' nicht machen

unless (($group eq 'online') or ($group eq 'internet')) {

 $entry = ($mesg->entries)[0];              # nur ein Element in der Liste
 $gid   = $entry->get_value('gidNumber');   # die GID von $newmember holen
 if ( $gid != 1001) {
   die "Abbruch: $member ist kein Lehrer!\n"; # ungleich 1002, dann Abbruch
 } 

}

  1. wir suchen in der Gruppe, ob es schon einen Eintrag fuer $member gibt

$mesg = $ldap->search(base => "cn=$group,ou=groups,$ldap_base",

                     filter => "cn=$group",
                     attrs  => ['memberUid'] );

$entry = ($mesg->entries)[0]; # nur ein Element in der Liste @members = $entry->get_value('memberUid'); $anzahl = grep /^$member$/, @members; if ( $anzahl > 0) {

 die "Abbruch: $member ist schon in der Gruppe $group!\n"; 

}

  1. wir fuegen dem Entry einen weiteren Eintrag fuer memberUid hinzu

$mesg = $ldap->modify( "cn=$group,ou=groups,$ldap_base",

                       add => { memberUid => [ $member ] } );
  1. wenn Fehlercode, dann das Script mit Fehlermeldung sterben lassen

$mesg->code and die $mesg->error;

  1. wir trennen uns vom LDAP

$ldap->unbind;

  1. Ausgabe auf der Konsole (Rueckmeldung)

print "User $member wurde in die Gruppe $group eingetragen.\n";


                                      1. Programm-Ende #####################################
  1. Wenn Parameter -h uebergeben wurde, dann Hilfe ausgegeben und beenden

sub help {

  print "Hilfe muss noch erstellt werden.\n";
  exit (0);

}

__END__

</source>