add modification command to broadband_shellcommands export, RT#19897
[freeside.git] / FS / FS / part_export / broadband_shellcommands.pm
1 package FS::part_export::broadband_shellcommands;
2
3 use strict;
4 use vars qw(@ISA %info);
5 use Tie::IxHash;
6 use FS::part_export;
7
8 @ISA = qw(FS::part_export);
9
10 tie my %options, 'Tie::IxHash',
11   'user'          => { label   => 'Remote username',
12                        default => 'freeside' },
13   'insert'        => { label   => 'Insert command',
14                        default => 'php provision.php --mac=$mac_addr --plan=$plan_id --account=active',
15                      },
16   'delete'        => { label   => 'Delete command',
17                        default  => '',
18                      },
19   'replace'       => { label   => 'Modification command',
20                        default => '',
21                      },
22   'suspend'       => { label   => 'Suspension command',
23                        default => 'php provision.php --mac=$mac_addr --plan=$plan_id --account=suspend',
24                      },
25   'unsuspend'     => { label   => 'Unsuspension command',
26                        default => '',
27                      },
28   'uppercase_mac' => { label   => 'Force MACs to uppercase', 
29                        type   => 'checkbox',
30                      }
31 ;
32
33 %info = (
34   'svc'     => 'svc_broadband',
35   'desc'    => 'Run remote commands via SSH, for svc_broadband services',
36   'options' => \%options,
37   'notes'   => <<'END'
38 Run remote commands via SSH, for broadband services.
39 <BR><BR>
40 All fields in svc_broadband are available for interpolation (prefixed with
41 <code>new_</code> or <code>old_</code> for replace operations).
42 END
43 );
44
45
46 sub rebless { shift; }
47
48 sub _export_insert {
49   my($self) = shift;
50   $self->_export_command('insert', @_);
51 }
52
53 sub _export_delete {
54   my($self) = shift;
55   $self->_export_command('delete', @_);
56 }
57
58 sub _export_suspend {
59   my($self) = shift;
60   $self->_export_command('suspend', @_);
61 }
62
63 sub _export_unsuspend {
64   my($self) = shift;
65   $self->_export_command('unsuspend', @_);
66 }
67
68 sub _export_command {
69   my ( $self, $action, $svc_broadband) = (shift, shift, shift);
70   my $command = $self->option($action);
71   return '' if $command =~ /^\s*$/;
72
73   #set variables for the command
74   no strict 'vars';
75   {
76     no strict 'refs';
77     ${$_} = $svc_broadband->getfield($_) foreach $svc_broadband->fields;
78   }
79
80   $mac_addr = uc $mac_addr
81     if $self->option('uppercase_mac');
82
83   #done setting variables for the command
84
85   $self->shellcommands_queue( $svc_broadband->svcnum,
86     user    => $self->option('user')||'root',
87     host    => $self->machine,
88     command => eval(qq("$command")),
89   );
90 }
91
92 sub _export_replace {
93   my($self, $new, $old ) = (shift, shift, shift);
94   my $command = $self->option('replace');
95
96   #set variable for the command
97   no strict 'vars';
98   {
99     no strict 'refs';
100     ${"old_$_"} = $old->getfield($_) foreach $old->fields;
101     ${"new_$_"} = $new->getfield($_) foreach $new->fields;
102   }
103
104   if ( $self->option('uppercase_mac') ) {
105     $old_mac_addr = uc $old_mac_addr;
106     $new_mac_addr = uc $new_mac_addr;
107   }
108
109   #done setting variables for the command
110
111   $self->shellcommands_queue( $new->svcnum,
112     user    => $self->option('user')||'root',
113     host    => $self->machine,
114     command => eval(qq("$command")),
115   );
116 }
117
118 #a good idea to queue anything that could fail or take any time
119 sub shellcommands_queue {
120   my( $self, $svcnum ) = (shift, shift);
121   my $queue = new FS::queue {
122     'svcnum' => $svcnum,
123     'job'    => "FS::part_export::broadband_shellcommands::ssh_cmd",
124   };
125   $queue->insert( @_ );
126 }
127
128 sub ssh_cmd { #subroutine, not method
129   use Net::OpenSSH;
130   my $opt = { @_ };
131   my $ssh = Net::OpenSSH->new($opt->{'user'}.'@'.$opt->{'host'});
132   die "Couldn't establish SSH connection: ". $ssh->error if $ssh->error;
133   my ($output, $errput) = $ssh->capture2($opt->{'command'});
134   die "Error running SSH command: ". $ssh->error if $ssh->error;
135   die $errput if $errput;
136   die $output if $output;
137   '';
138 }
139
140 1;