You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ngcp-panel/lib/NGCP/Panel/Utils/DeviceBootstrap.pm

235 lines
7.3 KiB

package NGCP::Panel::Utils::DeviceBootstrap;
use strict;
use warnings;
use Data::Dumper;
use NGCP::Panel::Utils::DeviceBootstrap::VendorRPC;
use NGCP::Panel::Utils::DeviceBootstrap::Panasonic;
use NGCP::Panel::Utils::DeviceBootstrap::Yealink;
use NGCP::Panel::Utils::DeviceBootstrap::Polycom;
use NGCP::Panel::Utils::DeviceBootstrap::Snom;
use NGCP::Panel::Utils::DeviceBootstrap::Grandstream;
use NGCP::Panel::Utils::DeviceBootstrap::ALE;
my $redirect_processor;
sub get_cached_redirect_processor{
return $redirect_processor;
}
sub dispatch{
my($c, $action, $fdev, $old_identifier) = @_;
if($c->config->{deviceprovisioning}->{skip_vendor_redirect}) {
$c->log->info("skipping '$action', disabled by configuration");
return;
}
my $params = {
%{get_devmod_params($c, $fdev->profile->config->device)},
mac => $fdev->identifier,
mac_old => $old_identifier,
};
return _dispatch($c, $action, $params);
}
sub dispatch_devmod{
my($c, $action, $devmod) = @_;
if($c->config->{deviceprovisioning}->{skip_vendor_redirect}) {
$c->log->info("skipping '$action', disabled by configuration");
return;
}
my $params = get_devmod_params($c,$devmod);
return _dispatch($c, $action, $params);
}
sub _dispatch{
my($c, $action, $params) = @_;
$redirect_processor = get_redirect_processor($params);
my $err;
if($redirect_processor){
$c->log->debug( "action=$action;" );
if($redirect_processor->can($action)){
$err = $redirect_processor->$action();
}else{
if( ('register' eq $action) && $params->{mac_old} && ( $params->{mac_old} ne $params->{mac} ) ){
$redirect_processor->redirect_server_call('unregister');
}
$err = $redirect_processor->redirect_server_call($action);
}
$c->log->debug( "err=$err;" );
}
return $err;
}
sub get_devmod_params{
my($c, $devmod) = @_;
my $credentials = $devmod->autoprov_redirect_credentials;
my $vcredentials;
if($credentials){
$vcredentials = { map { $_ => $credentials->$_ } qw/user password/};
}
my $sync_params_rs = $devmod->autoprov_sync->search_rs({
'autoprov_sync_parameters.bootstrap_method' => $devmod->bootstrap_method,
},{
join => 'autoprov_sync_parameters',
}
);
my $sync_params={};
foreach($sync_params_rs->all){
$sync_params->{$_->autoprov_sync_parameters->parameter_name()} = $_->parameter_value;
}
my $params = {
c => $c,
bootstrap_method => $devmod->bootstrap_method,
redirect_uri => $devmod->bootstrap_uri,
redirect_params => $sync_params,
credentials => $vcredentials,
vendor => $devmod->vendor,
};
return $params;
}
sub get_redirect_processor{
my ($params) = @_;
my $c = $params->{c};
my $bootstrap_method = $params->{bootstrap_method};
my $redirect_processor;
if('redirect_panasonic' eq $bootstrap_method){
$redirect_processor = NGCP::Panel::Utils::DeviceBootstrap::Panasonic->new( params => $params );
}elsif('redirect_yealink' eq $bootstrap_method){
$redirect_processor = NGCP::Panel::Utils::DeviceBootstrap::Yealink->new( params => $params );
}elsif('redirect_polycom' eq $bootstrap_method){
$redirect_processor = NGCP::Panel::Utils::DeviceBootstrap::Polycom->new( params => $params );
}elsif('redirect_snom' eq $bootstrap_method){
$redirect_processor = NGCP::Panel::Utils::DeviceBootstrap::Snom->new( params => $params );
}elsif('redirect_grandstream' eq $bootstrap_method){
$redirect_processor = NGCP::Panel::Utils::DeviceBootstrap::Grandstream->new( params => $params );
}elsif('redirect_ale' eq $bootstrap_method){
$redirect_processor = NGCP::Panel::Utils::DeviceBootstrap::ALE->new( params => $params );
}elsif('http' eq $bootstrap_method){
#$ret = panasonic_bootstrap_register($params);
}
elsif('none' eq $bootstrap_method){
}
return $redirect_processor;
}
sub devmod_sync_parameters_prefetch{
my($c,$devmod,$params) = @_;
my $schema = $c->model('DB');
my $bootstrap_method = $params->{'bootstrap_method'};
my $bootstrap_params_rs = $schema->resultset('autoprov_sync_parameters')->search_rs({
'me.bootstrap_method' => $bootstrap_method,
});
my @parameters = ();
foreach ($bootstrap_params_rs->all){
my $sync_parameter = {
device_id => $devmod ? $devmod->id : undef,
parameter_id => $_->id,
parameter_value => delete $params->{'bootstrap_config_'.$bootstrap_method.'_'.$_->parameter_name},
};
push @parameters,$sync_parameter;
}
return \@parameters;
}
sub devmod_sync_parameters_prefetch_api{
my($c,$item,$resource) = @_;
$resource //= {};
my $schema = $c->model('DB');
my $bootstrap_method = $item->get_column('bootstrap_method');
my $bootstrap_params_rs = $schema->resultset('autoprov_sync')->search_rs({
'autoprov_sync_parameters.bootstrap_method' => $bootstrap_method,
'me.device_id' => $item->id,
},{
join => 'autoprov_sync_parameters',
select => [qw/autoprov_sync_parameters.parameter_name me.parameter_value/],
as => [qw/parameter_name parameter_value/]
});
foreach ($bootstrap_params_rs->all){
my $param_name = 'bootstrap_config_'.$bootstrap_method.'_'.$_->get_column('parameter_name');
$resource->{$param_name} = $_->parameter_value;
}
return $resource;
}
sub devmod_sync_credentials_prefetch{
my($c,$devmod,$params) = @_;
my $schema = $c->model('DB');
my $bootstrap_method = $params->{'bootstrap_method'};
my $credentials = {
device_id => $devmod ? $devmod->id : undef,
};
foreach (qw/user password/){
$credentials->{$_} = delete $params->{'bootstrap_config_'.$bootstrap_method.'_'.$_};
}
return $credentials;
}
sub devmod_sync_credentials_store{
my($c,$devmod,$credentials) = @_;
my $schema = $c->model('DB');
my $credentials_rs = $schema->resultset('autoprov_redirect_credentials')->search_rs({
'device_id' => $devmod->id
});
if(!$credentials_rs->first){
$credentials->{device_id} = $devmod->id;
$schema->resultset('autoprov_redirect_credentials')->create($credentials);
}else{
delete $credentials->{device_id};
$credentials_rs->update($credentials);
}
}
sub devmod_sync_clear {
my($c,$params) = @_;
foreach (keys %$params){
if($_ =~/^bootstrap_config_/i){
delete $params->{$_};
}
}
}
sub devmod_sync_parameters_store {
my($c,$devmod,$sync_parameters) = @_;
my $schema = $c->model('DB');
foreach my $sync_parameter (@$sync_parameters){
$sync_parameter->{device_id} ||= $devmod ? $devmod->id : undef;
$schema->resultset('autoprov_sync')->create($sync_parameter);
}
}
1;
=head1 NAME
NGCP::Panel::Utils::DeviceBootstrap
=head1 DESCRIPTION
Make API requests to configure remote redirect servers for requested MAC with autorpov uri.
=head1 METHODS
=head2 bootstrap
Dispatch to proper vendor API call.
=head1 AUTHOR
Irina Peshinskaya C<< <ipeshinskaya@sipwise.com> >>
=head1 LICENSE
This library is free software. You can redistribute it and/or modify
it under the same terms as Perl itself.
=cut
# vim: set tabstop=4 expandtab: