ramsey@NPIRS.Purdue.EDU (Ed Ramsey) (12/27/90)
has anyone done much with account administration/creation/deletion scripts in perl? I would like to find some already done (well :-), and work from there. Thanks. -Ed Ed Ramsey NPIRS User Services Manager ramsey@npirs.purdue.edu 317/494-6616 FAX 317/494-0535 "You gave your life to become the person you are right now. Was it worth it?" Richard Bach, *One*
stergios@portia.Stanford.EDU (Stergios) (12/27/90)
here's what I use to add a new (or clobber an old) group to /etc/group. sm ********************************************************************** #!/usr/local/bin/perl $ENV{'PATH'} = '/bin:/usr/bin:/usr/ucb/bin:/usr/etc'; $path = $ENV{'PATH'}; $ENV{'SHELL'} = '/bin/sh' if $ENV{'SHELL'} ne ''; $ENV{'IFS'} = '' if $ENV{'IFS'} ne '' ; if ($#ARGV < 1) { &usage ; } $ngname = shift ; $ngmembers = join(',', @ARGV ) ; $#ARGV = -1 ; $file = '/etc/group' ; $gid = -1 ; open(GROUP, "<$file") ; while(<GROUP>) { ($name,$star,$junkgid,$rest) = split(/:/) ; $groupbygid{$junkgid} = $groupbyname{$name} = $_ ; } close (GROUP) ; ;# check if new group name already exists ;# and verify if it should be clobbered ;# if it gets clobbered use the same gid ;# as it had previously. if ( defined $groupbyname{$ngname} ) { print "$ngname already exists.\t$groupbyname{$ngname}" ; print "Clobber anyway? [y/n] : " ; $gid = (split(':',$groupbyname{$ngname}))[2] ; $_ = <> ; chop ; if(/y/i) { print "ok, good luck.\n" ; } else { print "exiting\n" ; exit ( 2 ) ; } } else { print "$ngname is a new group.\n" ; } ;# search for a free gid if necessary. ;# $gid is nonzero now if the requested group ;# name was found to already exist. If it was found ;# $gid was set to the existing group name's $gid. if ( $gid == -1 ) { $gid = 500 ; findfreegid: while ( 1 ) { if ( ! defined $groupbygid{$gid} ) { print "$gid is not currently used. accept? [y/n] : " ; $_ = <> ; chop ; if(/y/i) { print "ok, good luck.\n" ; last findfreegid ; } } $gid++ ; } } ;# form the new group entry $newgroupentry = join (':', ($ngname, '*', $gid, $ngmembers)) ; $newgroupentry .= "\n" ; print "New Group Entry ->$newgroupentry" ; print "This look ok to enter into /etc/group? [y/n] : " ; $_ = <> ; if (! /y/i) { exit ( 2) ; } $groupbygid{$gid} = $newgroupentry ; $filename = "/tmp/junk.$$" ; open (OUTPUT, ">$filename") ; foreach (sort bynumber keys %groupbygid) { print OUTPUT $groupbygid{$_} ; } close OUTPUT ; ;# /tmp and /etc are on the same partition on my system. will this ;# work if this is not the case??? rename("/etc/group", "/tmp/group.bak") ; rename($filename, "/etc/group") ; exit (0) ; ;# SUBROUTINES sub bynumber { $a - $b ; } sub usage { print 'Usage: $0 <groupname> <groupmembers>', "\n" ; exit (2) ; }