#!/usr/bin/perl use warnings; use strict; use JSON; # create-user.pl # # processes new user request files my $working_dir = "./"; my $account_dir = $working_dir."req/"; my $conf_path = $working_dir."lyadmin.conf.json"; my $ul_path = $working_dir."user_list.txt"; my $SHELL_ENUM; my @g; # Given a username... prompts and creates that user sub create($){ my $id; my $fn1; my $username; my $shell_pref; my $user_email; my $pub_key; my $p0; # Prompts... $p0 = [ "Enter username: ", "Enter pubkey: " ]; $fn1 = ""; if($_[0]){ $id = $_[0]; $fn1 = $account_dir.$id.".ident"; open IN0, $fn1 or die "could not open file $fn1"; $p0 = [ map("", @{$p0}) ]; }else{ *IN0 = *STDIN; } # read in username and validate printf($p0->[0]); $username = ; chomp $username; if(length($username) > 31 || !($username =~ /^[A-Za-z][A-Za-z0-9]+$/)){ printf("%s is an INVALID username\n", $id); die ("oh no"); } # read in email $user_email = $_[0] ? : ""; chomp $user_email; # read in shell and validate { my $s0; $s0 = $_[0] ? : "SHELL_KSH"; chomp $s0; unless($SHELL_ENUM->{$s0}){ die "invalid shell setting $s0"; } $shell_pref = $SHELL_ENUM->{$s0}; } # read in pub key printf($p0->[1]); $pub_key = ; chomp $pub_key; { # Prompt to make sure the username looks OK my $cmd; $cmd = "useradd -m -s " . $shell_pref . " " . $username; printf("Y/N is this command OK?: %s\n", $cmd); if(!( =~ /^y/i)){ die "invalid characters?!!"; } # create the user system($cmd); system("echo '".$pub_key."' > /home/$username/.ssh/authorized_keys"); system("chmod 711 /home/$username"); system("test $fn1 && mv $fn1 $fn1.done"); system("echo $username >> $ul_path"); } close IN0; } # MAIN starts here # Checks if user is root if(!(`id` =~ /uid=0/)){ die "please run this script as root"; } # Adjusts the relative file paths based on where # the script runs from if(`pwd` =~ /perl-script\/?\s*$/){ $working_dir = "../"; $account_dir = $working_dir."req/"; $conf_path = $working_dir."lyadmin.conf.json"; $ul_path = $working_dir."user_list.txt"; printf("%s\n", $conf_path); }elsif(!(join(" ", glob("./*")) =~ /perl-script/)){ $SHELL_ENUM = {"SHELL_KSH" => "/bin/ksh"}; create(0); printf("admin user is now configured\n"); printf("run the below command to continue the install\n"); printf("pkg_add wget && wget 'https://git.lain.church/gashapwn/lyadmin/raw/branch/master/perl-script/provision.pl' -O - | perl"); die "\n\n"; } # Opens the conf file to read # shell enums open FILE, $conf_path or die "could not open file $conf_path"; { my $conf_str; my $conf_obj; local $/=undef; $conf_str = ; chomp $conf_str; $conf_obj = decode_json($conf_str); $SHELL_ENUM = $conf_obj->{"shell"}; }; close FILE; # Saves all new user requests to an array @g = glob("$account_dir*"); @g = map { s/.*\/([^\/]*).ident$/$1/; $_ } grep {$_ =~ /ident$/} @g; # Iterate and create the users for my $fn (@g){ create($fn); }