X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=FS%2FFS%2Fpart_export%2Fshellcommands.pm;h=a514f9375da4852d6cfba48d6311c9a5da5c43b9;hb=77d08ccf7db6719dc7ad0e58eec8a8ca41f4115a;hp=e99c382a4d88162b08dca1aff6ca0d91151e1507;hpb=9bf26ed4b065b12826fc2980ff277a2f3be25c1d;p=freeside.git diff --git a/FS/FS/part_export/shellcommands.pm b/FS/FS/part_export/shellcommands.pm index e99c382a4..a514f9375 100644 --- a/FS/FS/part_export/shellcommands.pm +++ b/FS/FS/part_export/shellcommands.pm @@ -1,42 +1,69 @@ package FS::part_export::shellcommands; -use vars qw(@ISA); +use vars qw(@ISA @saltset); +use String::ShellQuote; use FS::part_export; @ISA = qw(FS::part_export); +@saltset = ( 'a'..'z' , 'A'..'Z' , '0'..'9' , '.' , '/' ); + sub rebless { shift; } sub _export_insert { my($self) = shift; - $self->_export_command($self, 'useradd', @_); + $self->_export_command('useradd', @_); } sub _export_delete { my($self) = shift; - $self->_export_command($self, 'userdel', @_); + $self->_export_command('userdel', @_); } sub _export_command { my ( $self, $action, $svc_acct) = (shift, shift, shift); my $command = $self->option($action); - no strict 'refs'; - ${$_} = $svc_acct->getfield($_) foreach $svc_acct->fields; - $self->shellcommands_queue( - $self->options('user')||'root'. "\@". $self->options('machine'), - eval(qq("$command")) + my $stdin = $self->option($action."_stdin"); + no strict 'vars'; + { + no strict 'refs'; + ${$_} = $svc_acct->getfield($_) foreach $svc_acct->fields; + } + $finger = shell_quote $finger; + $quoted_password = shell_quote $_password; + $domain = $svc_acct->domain; + $crypt_password = ''; #surpress "used only once" warnings + $crypt_password = crypt( $svc_acct->_password, + $saltset[int(rand(64))].$saltset[int(rand(64))] ); + $self->shellcommands_queue( $svc_acct->svcnum, + user => $self->option('user')||'root', + host => $self->machine, + command => eval(qq("$command")), + stdin_string => eval(qq("$stdin")), ); } sub _export_replace { my($self, $new, $old ) = (shift, shift, shift); my $command = $self->option('usermod'); - no strict 'refs'; - ${"old_$_"} = $old->getfield($_) foreach $old->fields; - ${"new_$_"} = $new->getfield($_) foreach $new->fields; - $self->shellcommands_queue( - $self->options('user')||'root'. "\@". $self->options('machine'), - eval(qq("$command")) + my $stdin = $self->option('usermod_stdin'); + no strict 'vars'; + { + no strict 'refs'; + ${"old_$_"} = $old->getfield($_) foreach $old->fields; + ${"new_$_"} = $new->getfield($_) foreach $new->fields; + } + $new_finger = shell_quote $new_finger; + $quoted_new__password = shell_quote $new__password; + $new_domain = $new->domain; + $new_crypt_password = ''; #surpress "used only once" warnings + $new_crypt_password = crypt( $new->_password, + $saltset[int(rand(64))].$saltset[int(rand(64))]); + $self->shellcommands_queue( $new->svcnum, + user => $self->option('user')||'root', + host => $self->machine, + command => eval(qq("$command")), + stdin_string => eval(qq("$stdin")), ); } @@ -45,11 +72,16 @@ sub shellcommands_queue { my( $self, $svcnum ) = (shift, shift); my $queue = new FS::queue { 'svcnum' => $svcnum, - 'job' => "Net::SSH::ssh_cmd", #freeside-queued pre-uses... + 'job' => "FS::part_export::shellcommands::ssh_cmd", }; $queue->insert( @_ ); } +sub ssh_cmd { #subroutine, not method + use Net::SSH '0.07'; + &Net::SSH::ssh_cmd( { @_ } ); +} + #sub shellcommands_insert { #subroutine, not method #} #sub shellcommands_replace { #subroutine, not method