Mercurial > make_username
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 +}