summaryrefslogtreecommitdiff
path: root/FS/FS/part_export/prizm.pm
diff options
context:
space:
mode:
Diffstat (limited to 'FS/FS/part_export/prizm.pm')
-rw-r--r--FS/FS/part_export/prizm.pm540
1 files changed, 0 insertions, 540 deletions
diff --git a/FS/FS/part_export/prizm.pm b/FS/FS/part_export/prizm.pm
deleted file mode 100644
index 75b10a7..0000000
--- a/FS/FS/part_export/prizm.pm
+++ /dev/null
@@ -1,540 +0,0 @@
-package FS::part_export::prizm;
-
-use vars qw(@ISA %info %options $DEBUG);
-use Tie::IxHash;
-use FS::Record qw(fields dbh);
-use FS::part_export;
-
-@ISA = qw(FS::part_export);
-$DEBUG = 1;
-
-tie %options, 'Tie::IxHash',
- 'url' => { label => 'Northbound url', default=>'https://localhost:8443/prizm/nbi' },
- 'user' => { label => 'Northbound username', default=>'nbi' },
- 'password' => { label => 'Password', default => '' },
- 'ems' => { label => 'Full EMS', type => 'checkbox' },
- 'always_bam' => { label => 'Always activate/suspend authentication', type => 'checkbox' },
- 'element_name_length' => { label => 'Size of siteName (best left blank)' },
-;
-
-my $notes = <<'EOT';
-Real-time export of <b>svc_broadband</b>, <b>cust_pkg</b>, and <b>cust_main</b>
-record data to Motorola
-<a href="http://motorola.canopywireless.com/products/prizm/">Canopy Prizm
-software</a> via the Northbound interface.<br><br>
-
-Freeside will attempt to create an element in an existing network with the
-values provided in svc_broadband. Of particular interest are
-<ul>
- <li> mac address - used to identify the element
- <li> vlan profile - an exact match for a vlan profiles defined in prizm
- <li> ip address - defines the management ip address of the prizm element
- <li> latitude - GPS latitude
- <li> longitude - GPS longitude
- <li> altitude - GPS altitude
-</ul>
-
-In addition freeside attempts to set the service plan name in prizm to the
-name of the package in which the service resides.
-
-The service is associated with a customer in prizm as well, and freeside
-will create the customer should none already exist with import id matching
-the freeside customer number. The following fields are set.
-
-<ul>
- <li> importId - the freeside customer number
- <li> customerType - freeside
- <li> customerName - the name associated with the freeside shipping address
- <li> address1 - the shipping address
- <li> address2
- <li> city
- <li> state
- <li> zipCode
- <li> country
- <li> workPhone - the daytime phone number
- <li> homePhone - the night phone number
- <li> freesideId - the freeside customer number
-</ul>
-
- Additionally set on the element are
-<ul>
- <li> Site Name - The shipping name followed by the service broadband description field
- <li> Site Location - the shipping address
- <li> Site Contact - the daytime and night phone numbers
-</ul>
-
-Freeside provisions, suspends, and unsuspends elements BAM only unless the
-'Full EMS' checkbox is checked.<br><br>
-
-When freeside provisions an element the siteName is copied internally by
-prizm in such a manner that it is possible for the value to exceed the size
-of the column used in the prizm database. Therefore freeside truncates
-by default this value to 50 characters. It is thought that this
-column is the account_name column of the element_user_account table. It
-may be possible to lift this limit by modifying the prizm database and
-setting a new appropriate value on this export. This is untested and
-possibly harmful.
-
-EOT
-
-%info = (
- 'svc' => 'svc_broadband',
- 'desc' => 'Real-time export to Northbound Interface',
- 'options' => \%options,
- 'nodomain' => 'Y',
- 'notes' => $notes,
-);
-
-sub prizm_command {
- my ($self,$namespace,$method) = (shift,shift,shift);
-
- eval "use Net::Prizm 0.04 qw(CustomerInfo PrizmElement);";
- die $@ if $@;
-
- my $prizm = new Net::Prizm (
- namespace => $namespace,
- url => $self->option('url'),
- user => $self->option('user'),
- password => $self->option('password'),
- );
-
- $prizm->$method(@_);
-}
-
-sub queued_prizm_command { # subroutine
- my( $url, $user, $password, $namespace, $method, @args ) = @_;
-
- eval "use Net::Prizm 0.04 qw(CustomerInfo PrizmElement);";
- die $@ if $@;
-
- my $prizm = new Net::Prizm (
- namespace => $namespace,
- url => $url,
- user => $user,
- password => $password,
- );
-
- $err_or_som = $prizm->$method( @args);
-
- die $err_or_som
- unless ref($err_or_som);
-
- '';
-
-}
-
-sub _export_insert {
- my( $self, $svc ) = ( shift, shift );
-
- my $cust_main = $svc->cust_svc->cust_pkg->cust_main;
-
- my $err_or_som = $self->prizm_command('CustomerIfService', 'getCustomers',
- ['import_id'],
- [$cust_main->custnum],
- ['='],
- );
- return $err_or_som
- unless ref($err_or_som);
-
- my $pre = '';
- if ( defined $cust_main->dbdef_table->column('ship_last') ) {
- $pre = $cust_main->ship_last ? 'ship_' : '';
- }
- my $name = $pre ? $cust_main->ship_name : $cust_main->name;
- my $location = join(" ", map { my $method = "$pre$_"; $cust_main->$method }
- qw (address1 address2 city state zip)
- );
- my $contact = join(" ", map { my $method = "$pre$_"; $cust_main->$method }
- qw (daytime night)
- );
-
- my $pcustomer;
- if ($err_or_som->result->[0]) {
- $pcustomer = $err_or_som->result->[0]->customerId;
- }else{
- my $chashref = $cust_main->hashref;
- my $customerinfo = {
- importId => $cust_main->custnum,
- customerName => $name,
- customerType => 'freeside',
- address1 => $chashref->{"${pre}address1"},
- address2 => $chashref->{"${pre}address2"},
- city => $chashref->{"${pre}city"},
- state => $chashref->{"${pre}state"},
- zipCode => $chashref->{"${pre}zip"},
- workPhone => $chashref->{"${pre}daytime"},
- homePhone => $chashref->{"${pre}night"},
- email => @{[$cust_main->invoicing_list_emailonly]}[0],
- extraFieldNames => [ 'country', 'freesideId',
- ],
- extraFieldValues => [ $chashref->{"${pre}country"}, $cust_main->custnum,
- ],
- };
-
- $err_or_som = $self->prizm_command('CustomerIfService', 'addCustomer',
- $customerinfo);
- return $err_or_som
- unless ref($err_or_som);
-
- $pcustomer = $err_or_som->result;
- }
- warn "multiple prizm customers found for $cust_main->custnum"
- if scalar(@$pcustomer) > 1;
-
-# #kinda big question/expensive
-# $err_or_som = $self->prizm_command('NetworkIfService', 'getPrizmElements',
-# ['Network Default Gateway Address'],
-# [$svc->addr_block->ip_gateway],
-# ['='],
-# );
-# return $err_or_som
-# unless ref($err_or_som);
-#
-# return "No elements in network" unless exists $err_or_som->result->[0];
-
- my $networkid = 0;
-# for (my $i = 0; $i < $err_or_som->result->[0]->attributeNames; $i++) {
-# if ($err_or_som->result->[0]->attributeNames->[$i] eq "Network.ID"){
-# $networkid = $err_or_som->result->[0]->attributeValues->[$i];
-# last;
-# }
-# }
-
- my $element_name_length = 50;
- $element_name_length = $1
- if $self->option('element_name_length') =~ /^\s*(\d+)\s*$/;
- $err_or_som = $self->prizm_command('NetworkIfService', 'addProvisionedElement',
- $networkid,
- $svc->mac_addr,
- substr($name . " " . $svc->description,
- 0, $element_name_length),
- $location,
- $contact,
- sprintf("%032X", $svc->authkey),
- $svc->cust_svc->cust_pkg->part_pkg->pkg,
- $svc->vlan_profile,
- ($self->option('ems') ? 1 : 0 ),
- );
- return $err_or_som
- unless ref($err_or_som);
-
- my (@names) = ('Management IP',
- 'GPS Latitude',
- 'GPS Longitude',
- 'GPS Altitude',
- 'Site Name',
- 'Site Location',
- 'Site Contact',
- );
- my (@values) = ($svc->ip_addr,
- $svc->latitude,
- $svc->longitude,
- $svc->altitude,
- $name . " " . $svc->description,
- $location,
- $contact,
- );
- $element = $err_or_som->result->elementId;
- $err_or_som = $self->prizm_command('NetworkIfService', 'setElementConfig',
- [ $element ],
- \@names,
- \@values,
- 0,
- 1,
- );
- return $err_or_som
- unless ref($err_or_som);
-
- $err_or_som = $self->prizm_command('NetworkIfService', 'setElementConfigSet',
- [ $element ],
- $svc->vlan_profile,
- 0,
- 1,
- );
- return $err_or_som
- unless ref($err_or_som);
-
- $err_or_som = $self->prizm_command('NetworkIfService', 'setElementConfigSet',
- [ $element ],
- $svc->cust_svc->cust_pkg->part_pkg->pkg,
- 0,
- 1,
- );
- return $err_or_som
- unless ref($err_or_som);
-
- $err_or_som = $self->prizm_command('NetworkIfService',
- 'activateNetworkElements',
- [ $element ],
- 1,
- ( $self->option('ems') ? 1 : 0 ),
- );
-
- return $err_or_som
- unless ref($err_or_som);
-
- $err_or_som = $self->prizm_command('CustomerIfService',
- 'addElementToCustomer',
- 0,
- $cust_main->custnum,
- 0,
- $svc->mac_addr,
- );
-
- return $err_or_som
- unless ref($err_or_som);
-
- '';
-}
-
-sub _export_delete {
- my( $self, $svc ) = ( shift, shift );
-
- my $oldAutoCommit = $FS::UID::AutoCommit;
- local $FS::UID::AutoCommit = 0;
- my $dbh = dbh;
-
- my $cust_pkg = $svc->cust_svc->cust_pkg;
-
- my $depend = [];
-
- if ($cust_pkg) {
- my $queue = new FS::queue {
- 'svcnum' => $svc->svcnum,
- 'job' => 'FS::part_export::prizm::queued_prizm_command',
- };
- my $error = $queue->insert(
- ( map { $self->option($_) }
- qw( url user password ) ),
- 'CustomerIfService',
- 'removeElementFromCustomer',
- 0,
- $cust_pkg->custnum,
- 0,
- $svc->mac_addr,
- );
-
- if ($error) {
- $dbh->rollback if $oldAutoCommit;
- return $error;
- }
-
- push @$depend, $queue->jobnum;
- }
-
- my $err_or_queue =
- $self->queue_statuschange('deleteElement', $depend, $svc, 1);
-
- unless (ref($err_or_queue)) {
- $dbh->rollback if $oldAutoCommit;
- return $err_or_queue;
- }
-
- $dbh->commit or die $dbh->errstr if $oldAutoCommit;
-
- '';
-}
-
-sub _export_replace {
- my( $self, $new, $old ) = ( shift, shift, shift );
-
- my $err_or_som = $self->prizm_command('NetworkIfService', 'getPrizmElements',
- [ 'MAC Address' ],
- [ $old->mac_addr ],
- [ '=' ],
- );
- return $err_or_som
- unless ref($err_or_som);
-
- return "Can't find prizm element for " . $old->mac_addr
- unless $err_or_som->result->[0];
-
- my %freeside2prizm = ( mac_addr => 'MAC Address',
- ip_addr => 'Management IP',
- latitude => 'GPS Latitude',
- longitude => 'GPS Longitude',
- altitude => 'GPS Altitude',
- authkey => 'Authentication Key',
- );
-
- my (@values);
- my (@names) = map { push @values, $new->$_; $freeside2prizm{$_} }
- grep { $old->$_ ne $new->$_ }
- grep { exists($freeside2prizm{$_}) }
- fields( 'svc_broadband' );
-
- if ($old->description ne $new->description) {
- my $cust_main = $old->cust_svc->cust_pkg->cust_main;
- my $name = defined($cust_main->dbdef_table->column('ship_last'))
- ? $cust_main->ship_name
- : $cust_main->name;
- push @values, $name . " " . $new->description;
- push @names, "Site Name";
- }
-
- my $element = $err_or_som->result->[0]->elementId;
-
- $err_or_som = $self->prizm_command('NetworkIfService', 'setElementConfig',
- [ $element ],
- \@names,
- \@values,
- 0,
- 1,
- );
- return $err_or_som
- unless ref($err_or_som);
-
- $err_or_som = $self->prizm_command('NetworkIfService', 'setElementConfigSet',
- [ $element ],
- $new->vlan_profile,
- 0,
- 1,
- )
- if $old->vlan_profile ne $new->vlan_profile;
-
- return $err_or_som
- unless ref($err_or_som);
-
- '';
-
-}
-
-sub _export_suspend {
- my( $self, $svc ) = ( shift, shift );
- my $depend = [];
- my $ems = $self->option('ems') ? 1 : 0;
- my $err_or_queue = '';
-
- my $oldAutoCommit = $FS::UID::AutoCommit;
- local $FS::UID::AutoCommit = 0;
- my $dbh = dbh;
-
- $err_or_queue =
- $self->queue_statuschange('suspendNetworkElements', [], $svc, 1, $ems);
- unless (ref($err_or_queue)) {
- $dbh->rollback if $oldAutoCommit;
- return $err_or_queue;
- }
- push @$depend, $err_or_queue->jobnum;
-
- if ($ems && $self->option('always_bam')) {
- $err_or_queue =
- $self->queue_statuschange('suspendNetworkElements', $depend, $svc, 1, 0);
- unless (ref($err_or_queue)) {
- $dbh->rollback if $oldAutoCommit;
- return $err_or_queue;
- }
- }
-
- $dbh->commit or die $dbh->errstr if $oldAutoCommit;
-
- '';
-}
-
-sub _export_unsuspend {
- my( $self, $svc ) = ( shift, shift );
- my $depend = [];
- my $ems = $self->option('ems') ? 1 : 0;
- my $err_or_queue = '';
-
- my $oldAutoCommit = $FS::UID::AutoCommit;
- local $FS::UID::AutoCommit = 0;
- my $dbh = dbh;
-
- if ($ems && $self->option('always_bam')) {
- $err_or_queue =
- $self->queue_statuschange('activateNetworkElements', [], $svc, 1, 0);
- unless (ref($err_or_queue)) {
- $dbh->rollback if $oldAutoCommit;
- return $err_or_queue;
- }
- push @$depend, $err_or_queue->jobnum;
- }
-
- $err_or_queue =
- $self->queue_statuschange('activateNetworkElements', $depend, $svc, 1, $ems);
- unless (ref($err_or_queue)) {
- $dbh->rollback if $oldAutoCommit;
- return $err_or_queue;
- }
-
- $dbh->commit or die $dbh->errstr if $oldAutoCommit;
-
- '';
-}
-
-sub export_links {
- my( $self, $svc, $arrayref ) = ( shift, shift, shift );
-
- push @$arrayref, '<A HREF="http://'. $svc->ip_addr. '">SM</A>';
-
- '';
-}
-
-sub queue_statuschange {
- my( $self, $method, $jobs, $svc, @args ) = @_;
-
- # already in a transaction and can't die here
-
- my $queue = new FS::queue {
- 'svcnum' => $svc->svcnum,
- 'job' => 'FS::part_export::prizm::statuschange',
- };
- my $error = $queue->insert(
- ( map { $self->option($_) }
- qw( url user password ) ),
- $method,
- $svc->mac_addr,
- @args,
- );
-
- unless ($error) { # successful insertion
- foreach my $job ( @$jobs ) {
- $error ||= $queue->depend_insert($job);
- }
- }
-
- $error or $queue;
-}
-
-sub statuschange { # subroutine
- my( $url, $user, $password, $method, $mac_addr, @args) = @_;
-
- eval "use Net::Prizm 0.04 qw(CustomerInfo PrizmElement);";
- die $@ if $@;
-
- my $prizm = new Net::Prizm (
- namespace => 'NetworkIfService',
- url => $url,
- user => $user,
- password => $password,
- );
-
- my $err_or_som = $prizm->getPrizmElements( [ 'MAC Address' ],
- [ $mac_addr ],
- [ '=' ],
- );
- die $err_or_som
- unless ref($err_or_som);
-
- die "Can't find prizm element for " . $mac_addr
- unless $err_or_som->result->[0];
-
- my $arg1;
- # yuck!
- if ($method =~ /suspendNetworkElements/ || $method =~ /activateNetworkElements/) {
- $arg1 = [ $err_or_som->result->[0]->elementId ];
- }else{
- $arg1 = $err_or_som->result->[0]->elementId;
- }
- $err_or_som = $prizm->$method( $arg1, @args );
-
- die $err_or_som
- unless ref($err_or_som);
-
- '';
-
-}
-
-
-1;