#!/usr/bin/perl use strict; use vars qw( $VERSION $DA_DIR ); $VERSION = '1.2'; $DA_DIR = '/usr/local/directadmin'; my $do_force = 0; my @users; if ( @ARGV > 0 ) { use Getopt::Long; Getopt::Long::Configure('bundling'); my ($to_reseller,$to_user,$set_owner,$show_help,$show_version); GetOptions( 'to-reseller|r'=> \$to_reseller, 'to-user|u' => \$to_user, 'set-owner|o' => \$set_owner, '<>' => sub { push @users, shift }, 'force|f' => \$do_force, 'help|?|h' => \$show_help, 'version' => \$show_version ); if (( $to_reseller && $to_user )||( $set_owner && $to_reseller )||( $set_owner && $to_user )) { print "Sorry, you can not perform multiple actions at the same time.\n"; } elsif ($show_version) { print "dausertools.pl $VERSION\n"; print "Written by Phi1 'l0rdphi1' Stier.\n"; } elsif ($show_help) { &show_help; } elsif ($to_reseller) { do_user(0); } elsif ($to_user) { do_user(1); } elsif ($set_owner) { &set_owner; } } else { &show_help; } sub do_user { my $convert = shift; my %pretty_convert = ( 1 => 'User', 0 => 'Reseller' ); for my $user (@users) { if (! -e "$DA_DIR/data/users/$user" ) { print "Invalid user `$user'. Skipping.\n"; next; } my $yn; if ( $do_force == 0 ) { print "Are you sure you want to convert `$user' to a $pretty_convert{$convert}? (y/n) [n] "; $yn = <>; } if ( $yn =~ /^y|yes$/i || $do_force == 1 ) { if ( $convert == 0 ) { # okay, convert to reseller # u_welcome.txt users.list reseller.usage reseller.conf reseller.allocation packages.list packages/ ip.list my %user_conf = load_conf("$DA_DIR/data/users/$user/user.conf"); my %user_usage = load_conf("$DA_DIR/data/users/$user/user.usage"); open FH,">$DA_DIR/data/users/$user/users.list"; close FH; open FH,">$DA_DIR/data/users/$user/reseller.usage"; print FH qq~bandwidth=$user_usage{bandwidth} domainptr=$user_usage{domainptr} ftp=$user_usage{ftp} mysql=$user_usage{mysql} nemailf=$user_usage{nemailf} nemailml=$user_usage{nemailml} nemailr=$user_usage{nemailr} nemails=$user_usage{nemails} nsubdomains=$user_usage{nsubdomains} nusers=0 quota=$user_usage{quota} vdomains=$user_usage{vdomains} ~; close FH; open FH,">$DA_DIR/data/users/$user/reseller.conf"; print FH qq~aftp=$user_conf{aftp} bandwidth=$user_conf{bandwidth} cgi=$user_conf{cgi} dns=OFF dnscontrol=$user_conf{dnscontrol} domainptr=$user_conf{domainptr} ftp=$user_conf{ftp} ip=shared ips=0 mysql=$user_conf{mysql} nemailf=$user_conf{nemailf} nemailml=$user_conf{nemailml} nemailr=$user_conf{nemailr} nemails=$user_conf{nemails} ns1=$user_conf{ns1} ns2=$user_conf{ns2} nsubdomains=$user_conf{nsubdomains} oversell=OFF package=$user_conf{package} php=$user_conf{php} quota=$user_conf{quota} sentwarning=$user_conf{sentwarning} serverip=ON ssh=$user_conf{ssh} ssl=$user_conf{ssl} subject=Your account for |domain| is now ready for use. userssh=OFF vdomains=$user_conf{vdomains} ~; close FH; open FH,">$DA_DIR/data/users/$user/reseller.allocation"; print FH qq~bandwidth=$user_conf{bandwidth} domainptr=$user_conf{domainptr} ftp=$user_conf{ftp} mysql=$user_conf{mysql} nemailf=$user_conf{nemailf} nemailml=$user_conf{nemailml} nemailr=$user_conf{nemailr} nemails=$user_conf{nemails} nsubdomains=$user_conf{nsubdomains} nusers=0 quota=$user_conf{quota} vdomains=$user_conf{vdomains} ~; close FH; open FH,">$DA_DIR/data/users/$user/packages.list"; close FH; mkdir "$DA_DIR/data/users/$user/packages", 0777; open FH,">$DA_DIR/data/users/$user/ip.list"; print FH $user_conf{ip}; close FH; `cp $DA_DIR/data/templates/custom/u_welcome.txt $DA_DIR/data/users/$user/u_welcome.txt`; # append to admin's reseller list if not already there # open FH,"$DA_DIR/data/admin/reseller.list"; my $data = do { local $/; }; close FH; if ( $data !~ /$user\n/ ) { open FH,">>$DA_DIR/data/admin/reseller.list"; print FH "$user\n"; close FH; } # change user type `perl -pi -e 's#usertype=user#usertype=reseller#g' $DA_DIR/data/users/$user/user.conf`; # now that the user is setup as a reseller, remove the user's name from his/her old reseller's user.list `perl -pi -e 's#$user\n##g' $DA_DIR/data/users/$user_conf{creator}/users.list`; # and since we're a reseller now, set our user.conf 'creator' value to admin `perl -pi -e 's#creator=.+#creator=admin#g' $DA_DIR/data/users/$user/user.conf`; # chown new files/dirs properly `chown diradmin $DA_DIR/data/users/$user/users.list`; `chown diradmin $DA_DIR/data/users/$user/u_welcome.txt`; `chown diradmin $DA_DIR/data/users/$user/reseller.usage`; `chown diradmin $DA_DIR/data/users/$user/reseller.conf`; `chown diradmin $DA_DIR/data/users/$user/reseller.allocation`; `chown diradmin $DA_DIR/data/users/$user/packages.list`; `chown diradmin $DA_DIR/data/users/$user/packages`; `chown diradmin $DA_DIR/data/users/$user/ip.list`; } elsif ( $convert == 1 ) { # convert to user # remove uneeeded reseller-sepcific files `rm -f $DA_DIR/data/users/$user/users.list`; `rm -f $DA_DIR/data/users/$user/u_welcome.txt`; `rm -f $DA_DIR/data/users/$user/reseller.usage`; `rm -f $DA_DIR/data/users/$user/reseller.conf`; `rm -f $DA_DIR/data/users/$user/reseller.allocation`; `rm -f $DA_DIR/data/users/$user/packages.list`; `rm -fr $DA_DIR/data/users/$user/packages`; `rm -f $DA_DIR/data/users/$user/ip.list`; # remove user from to admin's reseller list `perl -pi -e 's#$user\n##g' $DA_DIR/data/admin/reseller.list`; # append to admin's user list if not already there # open FH,"$DA_DIR/data/users/admin/users.list"; my $data = do { local $/; }; close FH; if ( $data !~ /$user\n/ ) { open FH,">>$DA_DIR/data/users/admin/users.list"; print FH "$user\n"; close FH; } # change user type `perl -pi -e 's#usertype=reseller#usertype=user#g' $DA_DIR/data/users/$user/user.conf`; } print "User `$user' has sucessfully been converted to a $pretty_convert{$convert}.\n"; } else { print "Skipping `$user'.\n"; next; } } } sub set_owner { my $new_owner = shift @users; if (! -e "$DA_DIR/data/users/$new_owner" ) { print "Invalid user `$new_owner'. Skipping all.\n"; return; } for my $user (@users) { if (! -e "$DA_DIR/data/users/$user" ) { print "Invalid user `$user'. Skipping.\n"; next; } my %user_conf = load_conf("$DA_DIR/data/users/$user/user.conf"); # check for same owners if ( $user_conf{creator} eq $new_owner ) { print "User `$user' already owned by `$new_owner'. Skipping.\n"; next; } # check for reseller if ( $user_conf{usertype} =~ /admin|reseller/ ) { print "Can not change owner of Resellers or Admins. Skipping `$user'.\n"; next; } my $yn; if ( $do_force == 0 ) { print "Are you sure you want to change the owner of `$user' from `$user_conf{creator}' to `$new_owner'? (y/n) [n] "; $yn = <>; } if ( $yn =~ /^y|yes$/i || $do_force == 1 ) { # set new owner in user.conf `perl -pi -e 's#creator=.+#creator=$new_owner#g' $DA_DIR/data/users/$user/user.conf`; # remove user from old owners users.list `perl -pi -e 's#$user\n##g' $DA_DIR/data/users/$user_conf{creator}/users.list`; # add to new owners users.list if not already there # open FH,"$DA_DIR/data/users/$new_owner/users.list"; my $data = do { local $/; }; close FH; if ( $data !~ /$user\n/ ) { open FH,">>$DA_DIR/data/users/$new_owner/users.list"; print FH "$user\n"; close FH; } # done. yay! print "Owner of `$user' has sucessfully been changed from `$user_conf{creator}' to `$new_owner'.\n"; } else { print "Skipping `$user'.\n"; next; } } } sub show_help { print "Usage: dausertool.pl [OPTION]... USER...\n"; print "Modify DirectAdmin USER(s).\n\n"; print " -r, --to-reseller convert USER to Reseller\n"; print " -u, --to-user convert USER to User\n"; print " -o, --set-owner set USER-0 as the owner of USER-1, USER-2, ...\n"; print " -f, --force ignore nonexistent USER(s), never prompt\n"; print " -h, -?, --help display this screen and exit\n"; print " --version output version information and exit\n"; print "\n"; print "Report bugs to .\n"; } sub load_conf { my $file = shift; my %return; open FH, $file; while () { chomp; my ($key,$value) = split /=/, $_, 2; $return{$key} = $value; } close FH; return %return; }