changeset 4:742a3d2c99d6

Removed commented code and timing notes left from I/O testing.
author Eris Caffee <discordia@eldalin.com>
date Mon, 18 Jul 2011 07:13:12 -0500
parents 706c20861682
children 0979af167267
files make-username.pl
diffstat 1 files changed, 115 insertions(+), 58 deletions(-) [+]
line diff
     1.1 --- a/make-username.pl	Sat Jul 16 13:23:21 2011 -0500
     1.2 +++ b/make-username.pl	Mon Jul 18 07:13:12 2011 -0500
     1.3 @@ -2,71 +2,90 @@
     1.4  
     1.5  use warnings;
     1.6  use strict;
     1.7 +use English;
     1.8 +use File::Basename;
     1.9  
    1.10 -my $base;
    1.11 -my $user ;
    1.12 +my $base ="";
    1.13 +my $user;
    1.14 +my $debug = 0;
    1.15 +my $maxlen = 8;
    1.16 +my $test = 0;
    1.17  
    1.18 -$base = "";
    1.19 -$user = make_username($base);
    1.20 -printf("%30s %s\n", $base, $user);
    1.21 +foreach my $arg (@ARGV) {
    1.22 +    if ("-d" eq $arg) {
    1.23 +	$debug = 1;
    1.24 +    } elsif ($arg =~ /^-m/) {
    1.25 +	$arg =~ s/^..//;
    1.26 +	if ($arg =~ /^(\d+)$/) {
    1.27 +	    $maxlen = $1;
    1.28 +	    $debug and print "Setting maxlen to $maxlen\n";
    1.29 +	} else {
    1.30 +	    printf(STDERR "Invalid username length specified: $arg\n");
    1.31 +	}
    1.32 +    } elsif ($arg eq "-h") {
    1.33 +	usage();
    1.34 +	exit 0;
    1.35 +    } elsif ($arg eq "-t") {
    1.36 +	$test = 1;
    1.37 +    } else {
    1.38 +	$base = $arg;
    1.39 +    }
    1.40 +}
    1.41  
    1.42 -$base = "eightchr";
    1.43 -$user = make_username($base);
    1.44 -printf("%30s %s\n", $base, $user);
    1.45 +if (! $test) {
    1.46 +    $user = make_username($base);
    1.47 +    defined $user and printf("%s\n", $user);
    1.48 +    exit 0;
    1.49 +} else {
    1.50 +    my $pwdfile = "passwd";
    1.51 +    $base = "";
    1.52 +    $user = make_username($base, $pwdfile);
    1.53 +    defined $user and printf("%30s %s\n", $base, $user);
    1.54 +    
    1.55 +    $base = "eightchr";
    1.56 +    $user = make_username($base, $pwdfile);
    1.57 +    defined $user and printf("%30s %s\n", $base, $user);
    1.58 +    
    1.59 +    $base = "short";
    1.60 +    $user = make_username($base, $pwdfile);
    1.61 +    defined $user and printf("%30s %s\n", $base, $user);
    1.62 +    
    1.63 +    $base = "this *&% is not allowed &^$%&^m";
    1.64 +    $user = make_username($base, $pwdfile);
    1.65 +    defined $user and printf("%30s %s\n", $base, $user);
    1.66  
    1.67 -$base = "short";
    1.68 -$user = make_username($base);
    1.69 -printf("%30s %s\n", $base, $user);
    1.70 +    $base = "123digits";
    1.71 +    $user = make_username($base, $pwdfile);
    1.72 +    defined $user and printf("%30s %s\n", $base, $user);
    1.73  
    1.74 -$base = "this *&% is not allowed &^$%&^m";
    1.75 -$user = make_username($base);
    1.76 -printf("%30s %s\n", $base, $user);
    1.77 +    $base = "this-is-a-domain.com";
    1.78 +    $user = make_username($base, $pwdfile);
    1.79 +    defined $user and printf("%30s %s\n", $base, $user);
    1.80  
    1.81 -$base = "123digits";
    1.82 -$user = make_username($base);
    1.83 -printf("%30s %s\n", $base, $user);
    1.84 +    $base = '&$%#&$*&$%*&';
    1.85 +    $user = make_username($base, $pwdfile);
    1.86 +    defined $user and printf("%30s %s\n", $base, $user);
    1.87  
    1.88 -$base = "this-is-a-domain.com";
    1.89 -$user = make_username($base);
    1.90 -printf("%30s %s\n", $base, $user);
    1.91 +    $base = "testqwer";
    1.92 +    $user = make_username($base, $pwdfile);
    1.93 +    defined $user and printf("%30s %s\n", $base, $user);
    1.94  
    1.95 -$base = '&$%#&$*&$%*&';
    1.96 -$user = make_username($base);
    1.97 -printf("%30s %s\n", $base, $user);
    1.98 +    $base = "testabc";
    1.99 +    $user = make_username($base, $pwdfile);
   1.100 +    defined $user and printf("%30s %s\n", $base, $user);
   1.101  
   1.102 -# For the next test, run this first in the shell as root (not on a production system, obviously!):
   1.103 -#
   1.104 -# [ ! -d /var/cpanel/users ] && mkdir -p /var/cpanel/users
   1.105 -# touch /var/cpanel/users/testqwer
   1.106 -# touch /var/cpanel/users/testabc
   1.107 -# i=1 ; while [ $i -lt 10 ] ; do touch /var/cpanel/users/testabc${i} ; let i=$i+1 ; done
   1.108 -# touch /var/cpanel/users/testzx
   1.109 -# i=1 ; while [ $i -lt 100 ] ; do touch /var/cpanel/users/testzx${i} ; let i=$i+1 ; done
   1.110 -# touch /var/cpanel/users/test
   1.111 -# i=1 ; while [ $i -lt 100 ] ; do touch /var/cpanel/users/test${i} ; let i=$i+1 ; done
   1.112 -# touch /var/cpanel/users/t
   1.113 -# i=1 ; while [ $i -lt 10346 ] ; do touch /var/cpanel/users/t${i} ; let i=$i+1 ; done
   1.114 +    $base = "testzx";
   1.115 +    $user = make_username($base, $pwdfile);
   1.116 +    defined $user and printf("%30s %s\n", $base, $user);
   1.117  
   1.118 -$base = "testqwer";
   1.119 -$user = make_username($base);
   1.120 -printf("%30s %s\n", $base, $user);
   1.121 +    $base = "test";
   1.122 +    $user = make_username($base, $pwdfile);
   1.123 +    defined $user and printf("%30s %s\n", $base, $user);
   1.124  
   1.125 -$base = "testabc";
   1.126 -$user = make_username($base);
   1.127 -printf("%30s %s\n", $base, $user);
   1.128 -
   1.129 -$base = "testzx";
   1.130 -$user = make_username($base);
   1.131 -printf("%30s %s\n", $base, $user);
   1.132 -
   1.133 -$base = "test";
   1.134 -$user = make_username($base);
   1.135 -printf("%30s %s\n", $base, $user);
   1.136 -
   1.137 -$base = "t";
   1.138 -$user = make_username($base);
   1.139 -printf("%30s %s\n", $base, $user);
   1.140 -
   1.141 +    $base = "t";
   1.142 +    $user = make_username($base, $pwdfile);
   1.143 +    defined $user and printf("%30s %s\n", $base, $user);
   1.144 +}
   1.145  
   1.146  sub make_username {
   1.147      # Arguments:
   1.148 @@ -81,12 +100,19 @@
   1.149      # A string containing the new username or undef if no username 
   1.150      # could be generated  (unlikely)
   1.151  
   1.152 -    my ($base) = @_;
   1.153 +    my ($base, $pwdfile) = @_;
   1.154  
   1.155      if ($base eq "") {
   1.156  	$base = "user";
   1.157      }
   1.158  
   1.159 +    ! defined $pwdfile and $pwdfile = "/etc/passwd";
   1.160 +
   1.161 +    if (! -e $pwdfile) {
   1.162 +	printf(STDERR "Error: non-existant passwd file specified: $pwdfile\n");
   1.163 +	return undef;
   1.164 +    }
   1.165 +
   1.166      # Remove non-alpha-numeric characters and make sure the first character is a letter.
   1.167      $base =~ s/[^A-Za-z0-9]//g;
   1.168      if ($base !~ /^[a-z]/ ) { 
   1.169 @@ -98,17 +124,48 @@
   1.170      # Print the number into the last portion of the new username.
   1.171      # Delete spaces (in case the passed username candidate was short).
   1.172      # Churn until we find an unused name.
   1.173 +    my $tries=0;
   1.174      my $i=1;
   1.175      my $numstr;
   1.176 -    my $newuser = sprintf("%.8s", $base);
   1.177 -    while ( (-e "/var/cpanel/users/$newuser") && ($i < 10000000) ) { 
   1.178 +    my $newuser = sprintf("%.".$maxlen."s", $base);
   1.179 +
   1.180 +    while ( (! system('grep -qsP "^'.$newuser.':" '.$pwdfile)) &&
   1.181 +	    ($i < 10000000) ) { 
   1.182 +	$tries = 1;
   1.183  	$numstr = sprintf("%d", $i);
   1.184 -	$newuser = sprintf("%-8s", $base);
   1.185 +	$newuser = sprintf("%-".$maxlen."s", $base);
   1.186  	substr($newuser, -length($numstr), length($numstr), $numstr);
   1.187  	$newuser =~ s/ //g;
   1.188          $i++;
   1.189      }
   1.190  
   1.191      $i == 10000000 && return undef;
   1.192 +    $debug and print "final is $newuser in $tries attempts\n";
   1.193      return $newuser;
   1.194  }
   1.195 +
   1.196 +
   1.197 +################################################################################
   1.198 +sub usage {
   1.199 +    printf( 
   1.200 +"Usage: ".basename($PROGRAM_NAME)." [-h] [-d] [-mM] [-t] [basename]
   1.201 +
   1.202 +Generate a new unused username suitable for assigning to a new account.
   1.203 +
   1.204 +basename    If specified this will be used as the basis of the new username
   1.205 +
   1.206 +            The basename will be stripped of all characters other than letters 
   1.207 +            and digits, and it will be truncated to no more than the maximum 
   1.208 +            allowed username length (8 by default, but settable with the 
   1.209 +            -m option).
   1.210 +            In the event that a user already exists by the given name a number 
   1.211 +            will be inserted at the end of the username and sequentially 
   1.212 +            increased until an available name is found.
   1.213 +            If basename is not specified, then \"user\" will be used as the base.
   1.214 +-h          Print these instructions.
   1.215 +-d          Enable debug messages.
   1.216 +-mM         Set maximum allowed username length to M (default is 8).
   1.217 +-t          Perform test code.  You must have a suitable passwd file in the 
   1.218 +            current directory in order to run this.
   1.219 +");
   1.220 +}