# HG changeset patch # User Eris Caffee # Date 1310999840 18000 # Node ID 0979af167267f3f8a625222beeae98320f394571 # Parent 742a3d2c99d64face2f7f7668cd6af9c681cae09 Removed commented code and timing notes left from I/O testing. diff -r 742a3d2c99d6 -r 0979af167267 make-username.pl --- a/make-username.pl Mon Jul 18 07:13:12 2011 -0500 +++ b/make-username.pl Mon Jul 18 09:37:20 2011 -0500 @@ -1,5 +1,28 @@ #!/usr/bin/env perl +################################################################################ +# +# Copyright (C) 2011 Sarah Eris Horsley Caffee +# +# This is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +################################################################################ +# +# Returns a new unused username for use on a *nix server. +# +################################################################################ + use warnings; use strict; use English; @@ -39,52 +62,76 @@ } else { my $pwdfile = "passwd"; $base = ""; + my $t1 = time; $user = make_username($base, $pwdfile); - defined $user and printf("%30s %s\n", $base, $user); + my $t2 = time; + defined $user and printf("%30s %-".$maxlen."s in %ds\n", $base, $user, $t2 - $t1); $base = "eightchr"; + $t1 = time; $user = make_username($base, $pwdfile); - defined $user and printf("%30s %s\n", $base, $user); + $t2 = time; + defined $user and printf("%30s %-".$maxlen."s in %ds\n", $base, $user, $t2 - $t1); $base = "short"; + $t1 = time; $user = make_username($base, $pwdfile); - defined $user and printf("%30s %s\n", $base, $user); + $t2 = time; + defined $user and printf("%30s %-".$maxlen."s in %ds\n", $base, $user, $t2 - $t1); $base = "this *&% is not allowed &^$%&^m"; + $t1 = time; $user = make_username($base, $pwdfile); - defined $user and printf("%30s %s\n", $base, $user); + $t2 = time; + defined $user and printf("%30s %-".$maxlen."s in %ds\n", $base, $user, $t2 - $t1); $base = "123digits"; + $t1 = time; $user = make_username($base, $pwdfile); - defined $user and printf("%30s %s\n", $base, $user); + $t2 = time; + defined $user and printf("%30s %-".$maxlen."s in %ds\n", $base, $user, $t2 - $t1); $base = "this-is-a-domain.com"; + $t1 = time; $user = make_username($base, $pwdfile); - defined $user and printf("%30s %s\n", $base, $user); + $t2 = time; + defined $user and printf("%30s %-".$maxlen."s in %ds\n", $base, $user, $t2 - $t1); $base = '&$%#&$*&$%*&'; + $t1 = time; $user = make_username($base, $pwdfile); - defined $user and printf("%30s %s\n", $base, $user); + $t2 = time; + defined $user and printf("%30s %-".$maxlen."s in %ds\n", $base, $user, $t2 - $t1); $base = "testqwer"; + $t1 = time; $user = make_username($base, $pwdfile); - defined $user and printf("%30s %s\n", $base, $user); + $t2 = time; + defined $user and printf("%30s %-".$maxlen."s in %ds\n", $base, $user, $t2 - $t1); $base = "testabc"; + $t1 = time; $user = make_username($base, $pwdfile); - defined $user and printf("%30s %s\n", $base, $user); + $t2 = time; + defined $user and printf("%30s %-".$maxlen."s in %ds\n", $base, $user, $t2 - $t1); $base = "testzx"; + $t1 = time; $user = make_username($base, $pwdfile); - defined $user and printf("%30s %s\n", $base, $user); + $t2 = time; + defined $user and printf("%30s %-".$maxlen."s in %ds\n", $base, $user, $t2 - $t1); $base = "test"; + $t1 = time; $user = make_username($base, $pwdfile); - defined $user and printf("%30s %s\n", $base, $user); + $t2 = time; + defined $user and printf("%30s %-".$maxlen."s in %ds\n", $base, $user, $t2 - $t1); $base = "t"; + $t1 = time; $user = make_username($base, $pwdfile); - defined $user and printf("%30s %s\n", $base, $user); + $t2 = time; + defined $user and printf("%30s %-".$maxlen."s in %ds\n", $base, $user, $t2 - $t1); } sub make_username { @@ -113,7 +160,8 @@ return undef; } - # Remove non-alpha-numeric characters and make sure the first character is a letter. + # Remove non-alpha-numeric characters and make sure the first character + # is a letter. $base =~ s/[^A-Za-z0-9]//g; if ($base !~ /^[a-z]/ ) { $base = "a".$base; @@ -129,21 +177,38 @@ my $numstr; my $newuser = sprintf("%.".$maxlen."s", $base); - while ( (! system('grep -qsP "^'.$newuser.':" '.$pwdfile)) && - ($i < 10000000) ) { + while ( (user_exists($newuser, $pwdfile)) && ($i < 10000000) ) { $tries = 1; $numstr = sprintf("%d", $i); $newuser = sprintf("%-".$maxlen."s", $base); substr($newuser, -length($numstr), length($numstr), $numstr); $newuser =~ s/ //g; $i++; + $debug and printf(STDERR "Checking for $newuser\n"); } - $i == 10000000 && return undef; + $i == 10000000 and return undef; $debug and print "final is $newuser in $tries attempts\n"; return $newuser; } +sub user_exists { + my ($user, $pwdfile) = @_; + + my $retval = 0; + my $i; + my $buffer; + + open my $handle, "<", $pwdfile; + while (sysread($handle, $buffer, 65536, 0)) { + if ($buffer =~ /(^|\n)${user}:/) { + $retval = 1; + last; + } + } + close $handle; + return $retval; +} ################################################################################ sub usage { diff -r 742a3d2c99d6 -r 0979af167267 passwd-huge.gz Binary file passwd-huge.gz has changed diff -r 742a3d2c99d6 -r 0979af167267 passwd.gz Binary file passwd.gz has changed