#!/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,$show_help,$show_version); GetOptions( 'to-reseller|r'=> \$to_reseller, 'to-user|u' => \$to_user, '<>' => sub { push @users, shift }, 'force|f' => \$do_force, 'help|?|h' => \$show_help, 'version' => \$show_version ); if ($show_version) { print "dausertools.pl $VERSION\n"; print "Written by Phi1 'l0rdphi1' Stier.\n"; } elsif ($show_help) { &show_help; } elsif ( $to_reseller && $to_user ) { print "Sorry, you can not convert both users and resellers at the same time.\n"; } elsif ($to_reseller) { do_user(0); } elsif ($to_user) { do_user(1); } } else { &show_help; } sub do_user { my $convert = shift; my %pretty_convert = ( 1 => 'User', 0 => 'Reseller' ); for my $user (@users) { if (! -e "/usr/local/directadmin/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/u_welcome.txt"; print FH q~ Dear Customer, Thank you for chosing our service to meet your web hosting needs. Your account has been created with the following details: Username: |username| Password: |password| Domain: |domain| To log in immediately, follow this link, using your username and password: http://|ip|:2222 Once your domain resolves, you will be able to follow this link: http://www.|domain|:2222 Bandwidth: |bandwidth| Megabytes Disk Space: |quota| Megabytes Virtual Domains: |vdomains| Subdomains: |nsubdomains| POP Email Accounts: |nemails| Email Forwarders: |nemailf| Email Autoresponders: |nemailr| Email Mailing Lists: |nemailml| POP Server: mail.|domain| SMTP Server: mail.|domain| Login: |username| Password: |password| FTP accounts: |ftp| Anonymous FTP: |aftp| FTP Server: ftp.|domain| Login: |username| Password: |password| IP: |ip| Use |ip|/\~|username| to access it until the domain resolves. You must use these dns servers for your domain. They can be changed through your domain registrar. NS1: |ns1| NS1 IP: |ns1ip| NS2: |ns2| NS2 IP: |ns2ip| MySQL Databases: |mysql| Domain Pointers: |domainptr| SSH Access: |ssh| Secure Socket Layer: |ssl| CGI: |cgi| DNS control: |dnscontrol| Once again, thank you for choosing our hosting service Please don't hesitate to contact us if you have any questions ~; 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; # 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 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 " -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; }