1 package FS::part_export::phone_shellcommands;
4 use vars qw(@ISA %info);
6 use String::ShellQuote;
9 @ISA = qw(FS::part_export);
12 #- modify command (get something from freepbx for changing PINs)
13 #- suspension/unsuspension
15 tie my %options, 'Tie::IxHash',
16 'user' => { label=>'Remote username', default=>'root', },
17 'useradd' => { label=>'Insert command', },
18 'userdel' => { label=>'Delete command', },
19 'usermod' => { label=>'Modify command', },
20 'suspend' => { label=>'Suspension command', },
21 'unsuspend' => { label=>'Unsuspension command', },
26 'desc' => 'Run remote commands via SSH, for phone numbers',
27 'options' => \%options,
29 Run remote commands via SSH, for phone numbers. You will need to
30 <a href="../docs/ssh.html">setup SSH for unattended operation</a>.
31 <BR><BR>Use these buttons for some useful presets:
34 <INPUT TYPE="button" VALUE="FreePBX (build_exten CLI module needed)" onClick='
35 this.form.user.value = "root";
36 this.form.useradd.value = "build_exten.php --create --exten $phonenum --name $cust_name --vm-password $pin && /usr/share/asterisk/bin/module_admin reload";
37 this.form.userdel.value = "build_exten.php --delete --exten $phonenum && /usr/share/asterisk/bin/module_admin reload";
38 this.form.usermod.value = "";
39 this.form.suspend.value = "";
40 this.form.unsuspend.value = "";
44 The following variables are available for interpolation (prefixed with new_ or
45 old_ for replace operations):
47 <LI><code>$countrycode</code> - Country code
48 <LI><code>$phonenum</code> - Phone number
49 <LI><code>$pin</code> - Personal identification number
50 <LI><code>$cust_name</code> - Customer name
55 sub rebless { shift; }
59 $self->_export_command('useradd', @_);
64 $self->_export_command('userdel', @_);
69 $self->_export_command('suspend', @_);
72 sub _export_unsuspend {
74 $self->_export_command('unsuspend', @_);
78 my ( $self, $action, $svc_phone) = (shift, shift, shift);
79 my $command = $self->option($action);
80 return '' if $command =~ /^\s*$/;
82 #set variable for the command
86 ${$_} = $svc_phone->getfield($_) foreach $svc_phone->fields;
88 my $cust_pkg = $svc_phone->cust_svc->cust_pkg;
89 my $cust_name = $cust_pkg ? $cust_pkg->cust_main->name : '';
90 $cust_name = shell_quote $cust_name;
91 #done setting variables for the command
93 $self->shellcommands_queue( $svc_phone->svcnum,
94 user => $self->option('user')||'root',
95 host => $self->machine,
96 command => eval(qq("$command")),
100 sub _export_replace {
101 my($self, $new, $old ) = (shift, shift, shift);
102 my $command = $self->option('usermod');
104 #set variable for the command
108 ${"old_$_"} = $old->getfield($_) foreach $old->fields;
109 ${"new_$_"} = $new->getfield($_) foreach $new->fields;
112 my $cust_pkg = $new->cust_svc->cust_pkg;
113 my $new_cust_name = $cust_pkg ? $cust_pkg->cust_main->name : '';
114 $new_cust_name = shell_quote $new_cust_name;
115 #done setting variables for the command
117 $self->shellcommands_queue( $new->svcnum,
118 user => $self->option('user')||'root',
119 host => $self->machine,
120 command => eval(qq("$command")),
124 #a good idea to queue anything that could fail or take any time
125 sub shellcommands_queue {
126 my( $self, $svcnum ) = (shift, shift);
127 my $queue = new FS::queue {
129 'job' => "FS::part_export::phone_shellcommands::ssh_cmd",
131 $queue->insert( @_ );
134 sub ssh_cmd { #subroutine, not method
136 &Net::SSH::ssh_cmd( { @_ } );