X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=FS%2FFS%2Fpart_export%2Fshellcommands.pm;h=7099ca8ac835c024457029bb091062b8ea3c0d98;hb=103dfde149eec5034696d073253255f508a1be78;hp=ce136951034e971f6fc236362134f05659f06694;hpb=3d0a1bb06b895c5be6e3f0517d355442a6b1e125;p=freeside.git
diff --git a/FS/FS/part_export/shellcommands.pm b/FS/FS/part_export/shellcommands.pm
index ce1369510..7099ca8ac 100644
--- a/FS/FS/part_export/shellcommands.pm
+++ b/FS/FS/part_export/shellcommands.pm
@@ -4,8 +4,10 @@ use vars qw(@ISA %info);
use Tie::IxHash;
use Date::Format;
use String::ShellQuote;
+use Net::OpenSSH;
use FS::part_export;
use FS::Record qw( qsearch qsearchs );
+use Carp qw(carp);
@ISA = qw(FS::part_export);
@@ -96,8 +98,8 @@ tie my %options, 'Tie::IxHash',
},
'crypt' => { label => 'Default password encryption',
- type=>'select', options=>[qw(crypt md5)],
- default => 'crypt',
+ type=>'select', options=>[qw(crypt md5 sha512)],
+ default => 'sha512',
},
'groups_susp_reason' => { label =>
'Radius group mapping to reason (via template user)',
@@ -208,6 +210,7 @@ old_ for replace operations):
$reasontypenum (when suspending)
$reasontypetext (when suspending)
$pkgnum
+ $locationnum
$custnum
All other fields in svc_acct are also available.
The following fields from cust_main are also available (except during replace): company, address1, address2, city, state, zip, county, daytime, night, fax, otaker, agent_custid, locale. When used on the command line (rather than STDIN), they will be quoted for the shell already (do not add additional quotes).
@@ -265,19 +268,27 @@ sub _export_unsuspend {
sub export_pkg_change {
my( $self, $svc_acct, $new_cust_pkg, $old_cust_pkg ) = @_;
+ if ( $FS::svc_Common::noexport_hack ) {
+ carp 'export_pkg_change() suppressed by noexport_hack'
+ if $self->option('debug');
+ return;
+ }
+
my @fields = qw( pkgnum pkgpart agent_pkgid ); #others?
my @date_fields = qw( order_date start_date setup bill last_bill susp adjourn
- resume cancel uncancel expore contract_end );
+ resume cancel uncancel expire contract_end );
no strict 'vars';
{
no strict 'refs';
foreach (@fields) {
- ${"old_$_"} = $old_cust_pkg->getfield($_);
+ ${"old_$_"} = $old_cust_pkg ? $old_cust_pkg->getfield($_) : '';
${"new_$_"} = $new_cust_pkg->getfield($_);
}
foreach (@date_fields) {
- ${"old_$_"} = time2str('%Y-%m-%d', $old_cust_pkg->getfield($_));
+ ${"old_$_"} = $old_cust_pkg
+ ? time2str('%Y-%m-%d', $old_cust_pkg->getfield($_))
+ : '';
${"new_$_"} = time2str('%Y-%m-%d', $new_cust_pkg->getfield($_));
}
}
@@ -287,21 +298,69 @@ sub export_pkg_change {
sub _export_command_or_super {
my($self, $action) = (shift, shift);
+
+ if ( $FS::svc_Common::noexport_hack ) {
+ carp "_export_command_or_super($action) suppressed by noexport_hack"
+ if $self->option('debug');
+ return;
+ }
+
if ( $self->option($action) =~ /^\s*$/ ) {
my $method = "SUPER::_export_$action";
$self->$method(@_);
} else {
$self->_export_command($action, @_);
}
-};
+}
sub _export_command {
my ( $self, $action, $svc_acct) = (shift, shift, shift);
my $command = $self->option($action);
+ if ( $FS::svc_Common::noexport_hack ) {
+ carp "_export_command($action) suppressed by noexport_hack"
+ if $self->option('debug');
+ return;
+ }
+
return '' if $command =~ /^\s*$/;
my $stdin = $self->option($action."_stdin");
+ my( $command_string, $stdin_string ) =
+ $self->_export_subvars( $svc_acct, $command, $stdin );
+
+ $self->ssh_or_queue( $svc_acct, $command_string, $stdin_string );
+}
+
+sub ssh_or_queue {
+ my( $self, $svc_acct, $command_string, $stdin_string ) = @_;
+
+ my @ssh_cmd_args = (
+ user => $self->option('user') || 'root',
+ host => $self->svc_machine($svc_acct),
+ command => $command_string,
+ stdin_string => $stdin_string,
+ ignored_errors => $self->option('ignored_errors') || '',
+ ignore_all_errors => $self->option('ignore_all_errors'),
+ fail_on_output => $self->option('fail_on_output'),
+ );
+
+ if ( $self->option($action. '_no_queue') ) {
+ # discard return value just like freeside-queued.
+ eval { ssh_cmd(@ssh_cmd_args) };
+ $error = $@;
+ $error = $error->full_message if ref $error; # Exception::Class::Base
+ return $error.
+ ' ('. $self->exporttype. ' to '. $self->svc_machine($svc_acct). ')'
+ if $error;
+ } else {
+ $self->shellcommands_queue( $svc_acct->svcnum, @ssh_cmd_args );
+ }
+}
+
+sub _export_subvars {
+ my( $self, $svc_acct, $command, $stdin ) = @_;
+
no strict 'vars';
{
no strict 'refs';
@@ -380,6 +439,7 @@ sub _export_command {
}
$pkgnum = $cust_pkg ? $cust_pkg->pkgnum : '';
+ $locationnum = $cust_pkg ? $cust_pkg->locationnum : '';
$custnum = $cust_pkg ? $cust_pkg->custnum : '';
my $stdin_string = eval(qq("$stdin"));
@@ -408,27 +468,7 @@ sub _export_command {
my $command_string = eval(qq("$command"));
return "error filling in command: $@" if $@;
- my @ssh_cmd_args = (
- user => $self->option('user') || 'root',
- host => $self->svc_machine($svc_acct),
- command => $command_string,
- stdin_string => $stdin_string,
- ignored_errors => $self->option('ignored_errors') || '',
- ignore_all_errors => $self->option('ignore_all_errors'),
- fail_on_output => $self->option('fail_on_output'),
- );
-
- if ( $self->option($action. '_no_queue') ) {
- # discard return value just like freeside-queued.
- eval { ssh_cmd(@ssh_cmd_args) };
- $error = $@;
- $error = $error->full_message if ref $error; # Exception::Class::Base
- return $error.
- ' ('. $self->exporttype. ' to '. $self->svc_machine($svc_acct). ')'
- if $error;
- } else {
- $self->shellcommands_queue( $svc_acct->svcnum, @ssh_cmd_args );
- }
+ ( $command_string, $stdin_string );
}
sub _export_replace {
@@ -436,6 +476,16 @@ sub _export_replace {
my $command = $self->option('usermod');
return '' if $command =~ /^\s*$/;
my $stdin = $self->option('usermod_stdin');
+
+ my( $command_string, $stdin_string ) =
+ $self->_export_subvars_replace( $new, $old, $command, $stdin );
+
+ $self->ssh_or_queue( $new, $command_string, $stdin_string );
+}
+
+sub _export_subvars_replace {
+ my( $self, $new, $old, $command, $stdin ) = @_;
+
no strict 'vars';
{
no strict 'refs';
@@ -489,8 +539,10 @@ sub _export_replace {
$new_agent_custid = $new_cust_main ? $new_cust_main->agent_custid : '';
$new_locale = $new_cust_main ? $new_cust_main->locale : '';
$old_pkgnum = $old_cust_pkg ? $old_cust_pkg->pkgnum : '';
+ $old_locationnum = $old_cust_pkg ? $old_cust_pkg->locationnum : '';
$old_custnum = $old_cust_pkg ? $old_cust_pkg->custnum : '';
$new_pkgnum = $new_cust_pkg ? $new_cust_pkg->pkgnum : '';
+ $new_locationnum = $new_cust_pkg ? $new_cust_pkg->locationnum : '';
$new_custnum = $new_cust_pkg ? $new_cust_pkg->custnum : '';
my $stdin_string = eval(qq("$stdin"));
@@ -505,27 +557,7 @@ sub _export_replace {
my $command_string = eval(qq("$command"));
- my @ssh_cmd_args = (
- user => $self->option('user') || 'root',
- host => $self->svc_machine($new),
- command => $command_string,
- stdin_string => $stdin_string,
- ignored_errors => $self->option('ignored_errors') || '',
- ignore_all_errors => $self->option('ignore_all_errors'),
- fail_on_output => $self->option('fail_on_output'),
- );
-
- if($self->option('usermod_no_queue')) {
- # discard return value just like freeside-queued.
- eval { ssh_cmd(@ssh_cmd_args) };
- $error = $@;
- $error = $error->full_message if ref $error; # Exception::Class::Base
- return $error. ' ('. $self->exporttype. ' to '. $self->svc_machine($new). ')'
- if $error;
- }
- else {
- $self->shellcommands_queue( $new->svcnum, @ssh_cmd_args );
- }
+ ( $command_string, $stdin_string );
}
#a good idea to queue anything that could fail or take any time
@@ -539,7 +571,6 @@ sub shellcommands_queue {
}
sub ssh_cmd { #subroutine, not method
- use Net::OpenSSH;
my $opt = { @_ };
open my $def_in, '<', '/dev/null' or die "unable to open /dev/null\n";
my $ssh = Net::OpenSSH->new(