#!/usr/bin/perl -w use strict; use diagnostics; use Term::Cap; use Term::ReadKey; use Term::ReadLine; #-------Exits------------------------------ #This little bit is important as the Term::* stuf # _will_ hose your connection if you do not exit # properly. $SIG{INT} = sub { done("Ouch!") }; #-----Variables----------------------------- my $key; my $count = 0; my $count2 = 0; my $timeout = 1; my $entry; my $stuf; my $dataDescr; my $SAVE = ""; my $section = 'u'; my $numOsections = 1; my $item = ""; #---Get data on classes from the cstgroups file. The file is formated # CLASS:GROUP_NUMBER:HOME_DIR:UID_START # CLASS = class name in the catalog # GROUP_NUMBER = group number for the class # HOME_DIR = over directory where to place the user's directory # UID_START = UID fed to adduser, adduser then takes the next avalible # ":" is the separator # open GROUPDATA, ")) { my @tosplit = split(':', $item); my $class = $tosplit[0]; $AGItems{$class} = [ @tosplit ]; } close GROUPDATA; my @CSTclasses; $item = ""; my @Values = values %AGItems; while( $item = pop @Values) { push @CSTclasses, @$item->[0]; } my $t = new Term::ReadLine::Gnu 'Data Entry'; #----------Start menu-------------------------------------------------------- my $data = ""; system("clear"); print "Select class with arrow keys\n" . "\t\tor\'q\' to quit\n\n"; my @CST = @CSTclasses; $item = ""; while($stuf = pop @CST) { $item = $item . " $stuf "; if ( $count == 3 ) { print "$item\n"; $item = ""; $count = 0; } else { $count++; } } print "$item\n\n\n"; #--Create the history list for arrow keys @CST = @CSTclasses; $t->clear_history; #dump the history so we can use it. while ( defined($data = pop @CST)) { #seperate each item to an entry on the history list $t->addhistory($data); } $t->addhistory("q"); my $Class = $t->readline("Which Course > ", "cst1030"); chomp $Class; if ($Class eq 'q') { done("See ya");} my $numOfStudents = $t->readline("How many seats in each class > ", "25"); chomp $numOfStudents; $section = $t->readline("How Many sections in for this class? ", "1"); chomp $section; if ($section != '1') { #--With eight char usernames we need an easy ID # The system policy has been "c" for CST, the four number # ID from the catalog and "u" for user(?). Mulit sections # were just created by adding users, but then you get 108 class # members and which set of users goes with which instructor? # So I broke it so that we use a letter other than "u" for sections # $numOsections = $t->readline("Please give a single digit number for " . "this section ", "1"); { #--perl switch if ($numOsections == 1) { $section = 'a'; last;} if ($numOsections == 2) { $section = 'b'; last;} if ($numOsections == 3) { $section = 'c'; last;} if ($numOsections == 4) { $section = 'd'; last;} if ($numOsections == 5) { $section = 'e'; last;} if ($numOsections == 6) { $section = 'f'; last;} if ($numOsections == 7) { $section = 'g'; last;} if ($numOsections == 8) { $section = 'h'; last;} if ($numOsections == 9) { $section = 'i'; last;} } } else #or not { $section = 'u'; } $key = $t->readline("Create $numOfStudents accounts for $Class ", "Yes"); if (!($key eq "Yes")) { done("No Accounts Made");} $Class = lc $Class; my $uid_base= $AGItems{$Class}[3]; my $gid = $AGItems{$Class}[1]; my $name = $Class; $name =~ s/cst/c/; my $passwdfile = "$Class" . "-passwd"; open WRITEIT, "> $passwdfile" || die "\ncan't open write file\n"; print WRITEIT "username+password\n"; my $HOME = $AGItems{$Class}[2]; if(!(-e $HOME)) { system("mkdir $HOME"); } foreach my $number (1..$numOfStudents) { my $username= $name . $section . '0' x (2 - length($number)) . $number; my $Password = Pass(); chomp $Password; #--This file works great for making labels through your favorite WP print WRITEIT "$username+$Password\n"; # Make the account. # You might wonder at using the system command. I like the feedback as # as the accounts are made, and I like to use the 'system' way. system("./adduser $username $Password $gid 17 \"Account for $Class\" " . "$HOME/$username"); # Make the directory system("mkdir $HOME/$username"); # Copy skelton files into place print "setting up home for student $username\n"; system("cp /usr/local/skeleton/students/cshrc $HOME/$username/.cshrc"); system("cp /usr/local/skeleton/students/login $HOME/$username/.login"); system("cp /usr/local/skeleton/students/logout $HOME/$username/.logout"); system("cp /usr/local/skeleton/newaccount $HOME/$username/.newaccount"); print "setting files to owner $username\n"; system("chown $username $HOME/$username"); system("chown $username $HOME/$username/.[cln]*"); system("chgrp $gid $HOME/$username"); system("chgrp $gid $HOME/$username/.[cln]*"); #---send mail so /var/mail/$user is made, # print "sending first mail\n"; system("mail $username < /usr8/user/welcome.user"); sleep 10; #sometimes sendmail is slow... print "setting mail for $username\n"; system("chown $username /var/mail/$username"); system("chgrp mail /var/mail/$username"); } close WRITEIT; #------------------------------------------------- sub Pass #Got this from a discusion I had on permonks # http://perlmonks.org/index.pl?node_id=9924&lastnode_id=864& { my @password_chars = ( 0 .. 9, 'A' .. 'Z', 'a' .. 'z' ); return $password_chars[rand(@password_chars)] . $password_chars[rand(@password_chars)] . $password_chars[rand(@password_chars)] . $password_chars[rand(@password_chars)] . $password_chars[rand(@password_chars)] . $password_chars[rand(@password_chars)] . $password_chars[rand(@password_chars)] . $password_chars[rand(@password_chars)]; } #------------------------------------------------- #I found this somewhere. It's a nice way to # deal with Term::* habit of hoseing your session sub done { print "@_\n\n"; exit; }