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.
575 lines
18 KiB
575 lines
18 KiB
package NGCP::Panel::Controller::Domain;
|
|
use NGCP::Panel::Utils::Generic qw(:all);
|
|
use Sipwise::Base;
|
|
|
|
|
|
use parent 'Catalyst::Controller';
|
|
|
|
use NGCP::Panel::Form;
|
|
|
|
use NGCP::Panel::Utils::Message;
|
|
use NGCP::Panel::Utils::Navigation;
|
|
use NGCP::Panel::Utils::Prosody;
|
|
use NGCP::Panel::Utils::Preferences;
|
|
use NGCP::Panel::Utils::XMLDispatcher;
|
|
|
|
sub auto :Does(ACL) :ACLDetachTo('/denied_page') :AllowedRole(admin) :AllowedRole(reseller) :AllowedRole(ccareadmin) :AllowedRole(ccare) {
|
|
my ($self, $c) = @_;
|
|
$c->log->debug(__PACKAGE__ . '::auto');
|
|
NGCP::Panel::Utils::Navigation::check_redirect_chain(c => $c);
|
|
return 1;
|
|
}
|
|
|
|
sub dom_list :Chained('/') :PathPart('domain') :CaptureArgs(0) {
|
|
my ($self, $c) = @_;
|
|
|
|
my $resultset_role = $c->user->roles;
|
|
if ($resultset_role eq 'ccareadmin') {
|
|
$resultset_role = 'admin';
|
|
} elsif ($resultset_role eq 'ccare') {
|
|
$resultset_role = 'reseller';
|
|
}
|
|
|
|
my $dispatch_to = '_dom_resultset_' . $resultset_role;
|
|
my $dom_rs = $self->$dispatch_to($c);
|
|
|
|
$c->stash->{domain_dt_columns} = NGCP::Panel::Utils::Datatables::set_columns($c, [
|
|
{ name => 'id', search => 1, title => $c->loc('#') },
|
|
($c->user->is_superuser
|
|
? { name => "reseller.name", search => 1, title => $c->loc("Reseller") }
|
|
: ()
|
|
),
|
|
{ name => 'domain', search => 1, title => $c->loc('Domain') },
|
|
]);
|
|
|
|
$c->stash(dom_rs => $dom_rs,
|
|
template => 'domain/list.tt');
|
|
}
|
|
|
|
sub dom_list_restricted :Chained('dom_list') :PathPart('') :CaptureArgs(0) :Does(ACL) :ACLDetachTo('/denied_page') :AllowedRole(admin) :AllowedRole(reseller) {
|
|
my ($self, $c) = @_;
|
|
}
|
|
|
|
sub _dom_resultset_admin {
|
|
my ($self, $c) = @_;
|
|
return $c->model('DB')->resultset('domains');
|
|
}
|
|
|
|
sub _dom_resultset_reseller {
|
|
my ($self, $c) = @_;
|
|
|
|
return $c->model('DB')->resultset('domains')->search({
|
|
reseller_id => $c->user->reseller_id,
|
|
});
|
|
}
|
|
|
|
sub root :Chained('dom_list') :PathPart('') :Args(0) {
|
|
my ($self, $c) = @_;
|
|
}
|
|
|
|
sub create :Chained('dom_list_restricted') :PathPart('create') :Args() {
|
|
my ($self, $c, $reseller_id, $type) = @_;
|
|
|
|
my $form; my $pbx;
|
|
my $posted = ($c->request->method eq 'POST');
|
|
my $params = {};
|
|
$params = merge($params, $c->session->{created_objects});
|
|
delete $params->{domain} if exists $params->{domain};
|
|
|
|
if ($type && $type eq 'pbx') {
|
|
unless($reseller_id && is_int($reseller_id)) {
|
|
NGCP::Panel::Utils::Message::error(
|
|
c => $c,
|
|
error => 'invalid reseller id for creating pbx domain',
|
|
desc => $c->loc('Invalid reseller id detected.'),
|
|
);
|
|
NGCP::Panel::Utils::Navigation::back_or($c, $c->uri_for('/domain'));
|
|
}
|
|
if(!$c->user->is_superuser && $reseller_id != $c->user->reseller_id) {
|
|
$c->detach('/denied_page');
|
|
}
|
|
$c->stash->{reseller} = $c->model('DB')->resultset('resellers')->find($reseller_id);
|
|
unless($c->stash->{reseller}) {
|
|
NGCP::Panel::Utils::Message::error(
|
|
c => $c,
|
|
error => "reseller with id $reseller_id not found when creating pbx domain",
|
|
desc => $c->loc('Reseller not found.'),
|
|
);
|
|
NGCP::Panel::Utils::Navigation::back_or($c, $c->uri_for('/domain'));
|
|
}
|
|
$form = NGCP::Panel::Form::get("NGCP::Panel::Form::Domain::ResellerPbx", $c);
|
|
$pbx = 1;
|
|
} elsif($c->user->is_superuser) {
|
|
$form = NGCP::Panel::Form::get("NGCP::Panel::Form::Domain::Admin", $c);
|
|
} else {
|
|
$form = NGCP::Panel::Form::get("NGCP::Panel::Form::Domain::Reseller", $c);
|
|
}
|
|
|
|
$form->process(
|
|
posted => $posted,
|
|
params => $c->request->params,
|
|
item => $params,
|
|
);
|
|
|
|
NGCP::Panel::Utils::Navigation::check_form_buttons(
|
|
c => $c,
|
|
form => $form,
|
|
fields => {
|
|
'reseller.create' => $c->uri_for('/reseller/create'),
|
|
},
|
|
back_uri => $c->req->uri,
|
|
);
|
|
|
|
if ($posted && $form->validated) {
|
|
try {
|
|
if ($c->user->is_superuser) {
|
|
$form->values->{reseller_id} = delete $form->values->{reseller}{id};
|
|
} else {
|
|
$form->values->{reseller_id} = $c->user->reseller_id;
|
|
}
|
|
$c->model('DB')->schema->txn_do( sub {
|
|
my $prov_dom = $c->model('DB')->resultset('voip_domains')
|
|
->create({domain => $form->value->{domain}});
|
|
delete $c->session->{created_objects}->{reseller};
|
|
my $new_dom = $c->stash->{dom_rs}->create({
|
|
domain => $form->value->{domain},
|
|
reseller_id => $form->value->{reseller_id},
|
|
});
|
|
unless($pbx) {
|
|
} elsif($form->values->{rwr_set}) {
|
|
my $rwr_set = $c->model('DB')->resultset('voip_rewrite_rule_sets')
|
|
->find($form->values->{rwr_set});
|
|
NGCP::Panel::Utils::Preferences::set_rewrite_preferences(
|
|
c => $c,
|
|
rwrs_result => $rwr_set,
|
|
pref_rs => $prov_dom->voip_dom_preferences,
|
|
) if($rwr_set);
|
|
}
|
|
|
|
# for PBX domains, we set outbound_from_display to np_display
|
|
if($pbx) {
|
|
my $pref_rs = NGCP::Panel::Utils::Preferences::get_dom_preference_rs(
|
|
c => $c, attribute => 'outbound_from_display', prov_domain => $prov_dom
|
|
);
|
|
unless($pref_rs->first) {
|
|
$pref_rs->create({ value => 'np_display' });
|
|
} else {
|
|
$pref_rs->first->update({ value => 'np_display' });
|
|
}
|
|
}
|
|
|
|
NGCP::Panel::Utils::Prosody::activate_domain($c, $form->value->{domain})
|
|
unless($c->config->{features}->{debug});
|
|
delete $c->session->{created_objects}->{reseller};
|
|
$c->session->{created_objects}->{domain} = { id => $new_dom->id };
|
|
});
|
|
} catch ($e) {
|
|
NGCP::Panel::Utils::Message::error(
|
|
c => $c,
|
|
error => $e,
|
|
desc => $c->loc('Failed to create domain.'),
|
|
);
|
|
NGCP::Panel::Utils::Navigation::back_or($c, $c->uri_for('/domain'));
|
|
}
|
|
|
|
try {
|
|
NGCP::Panel::Utils::XMLDispatcher::sip_domain_reload($c, $form->value->{domain});
|
|
} catch ($e) {
|
|
NGCP::Panel::Utils::Message::error(
|
|
c => $c,
|
|
desc => $c->loc('Failed to activate domain. Domain was created.'),
|
|
error => $e,
|
|
);
|
|
NGCP::Panel::Utils::Navigation::back_or($c, $c->uri_for('/domain'));
|
|
}
|
|
|
|
NGCP::Panel::Utils::Message::info(
|
|
c => $c,
|
|
desc => $c->loc('Domain successfully created'),
|
|
);
|
|
NGCP::Panel::Utils::Navigation::back_or($c, $c->uri_for('/domain'));
|
|
}
|
|
|
|
$c->stash(
|
|
close_target => $c->uri_for,
|
|
create_flag => 1,
|
|
form => $form
|
|
);
|
|
}
|
|
|
|
sub base :Chained('/domain/dom_list_restricted') :PathPart('') :CaptureArgs(1) {
|
|
my ($self, $c, $domain_id) = @_;
|
|
|
|
unless($domain_id && is_int($domain_id)) {
|
|
$domain_id //= '';
|
|
NGCP::Panel::Utils::Message::error(
|
|
c => $c,
|
|
data => { domain_id => $domain_id },
|
|
desc => $c->loc('Invalid domain id detected'),
|
|
);
|
|
$c->response->redirect($c->uri_for());
|
|
$c->detach;
|
|
return;
|
|
}
|
|
|
|
my $res = $c->stash->{dom_rs}->find($domain_id);
|
|
unless(defined($res)) {
|
|
NGCP::Panel::Utils::Message::error(
|
|
c => $c,
|
|
desc => $c->loc('Domain does not exist'),
|
|
);
|
|
$c->response->redirect($c->uri_for());
|
|
$c->detach;
|
|
return;
|
|
}
|
|
|
|
$c->stash(provisioning_domain_result => $c->model('DB')
|
|
->resultset('voip_domains')
|
|
->find({domain => $res->domain}) );
|
|
|
|
$c->stash(domain => {$res->get_columns},
|
|
domain_result => $res);
|
|
}
|
|
|
|
sub edit :Chained('base') :PathPart('edit') :Args(0) {
|
|
my ($self, $c) = @_;
|
|
|
|
my $posted = ($c->request->method eq 'POST');
|
|
my $form = NGCP::Panel::Form::get("NGCP::Panel::Form::Domain::Reseller", $c);
|
|
my $params = { $c->stash->{dom_rs}->get_inflated_columns };
|
|
|
|
$form->process(
|
|
posted => $posted,
|
|
params => $c->request->params,
|
|
item => $params,
|
|
);
|
|
|
|
NGCP::Panel::Utils::Navigation::check_form_buttons(
|
|
c => $c,
|
|
form => $form,
|
|
fields => {
|
|
'reseller.create' => $c->uri_for('/reseller/create'),
|
|
},
|
|
back_uri => $c->req->uri,
|
|
);
|
|
|
|
if ($posted && $form->validated) {
|
|
try {
|
|
if($c->user->is_superuser) {
|
|
$form->values->{reseller_id} = delete $form->values->{reseller}{id};
|
|
} else {
|
|
$form->values->{reseller_id} = $c->user->reseller_id;
|
|
}
|
|
|
|
$c->model('DB')->schema->txn_do( sub {
|
|
$c->stash->{'domain_result'}->update($form->values);
|
|
delete $c->session->{created_objects}->{reseller};
|
|
$c->stash->{'provisioning_domain_result'}->update({
|
|
domain => $form->value->{domain},
|
|
});
|
|
});
|
|
} catch ($e) {
|
|
NGCP::Panel::Utils::Message::error(
|
|
c => $c,
|
|
error => $e,
|
|
desc => $c->loc('Failed to update domain.'),
|
|
);
|
|
$c->response->redirect($c->uri_for());
|
|
return;
|
|
}
|
|
|
|
try {
|
|
NGCP::Panel::Utils::XMLDispatcher::sip_domain_reload($c, $form->value->{domain});
|
|
} catch ($e) {
|
|
NGCP::Panel::Utils::Message::error(
|
|
c => $c,
|
|
desc => $c->loc('Failed to reload proxy. Domain was modified.'),
|
|
error => $e,
|
|
);
|
|
NGCP::Panel::Utils::Navigation::back_or($c, $c->uri_for('/domain'));
|
|
return;
|
|
}
|
|
NGCP::Panel::Utils::Message::info(
|
|
c => $c,
|
|
desc => $c->loc('Domain successfully updated'),
|
|
);
|
|
$c->response->redirect($c->uri_for());
|
|
return;
|
|
}
|
|
|
|
$c->stash(close_target => $c->uri_for());
|
|
$c->stash(form => $form);
|
|
$c->stash(edit_flag => 1);
|
|
}
|
|
|
|
sub delete_domain :Chained('base') :PathPart('delete') :Args(0) {
|
|
my ($self, $c) = @_;
|
|
|
|
my $domain = $c->stash->{'domain_result'}->domain;
|
|
my $prov_domain = $c->stash->{'provisioning_domain_result'};
|
|
try {
|
|
$c->model('DB')->schema->txn_do( sub {
|
|
$c->stash->{'domain_result'}->delete;
|
|
$prov_domain->voip_dbaliases->delete;
|
|
$prov_domain->voip_dom_preferences->delete;
|
|
$prov_domain->provisioning_voip_subscribers->delete;
|
|
$prov_domain->delete;
|
|
NGCP::Panel::Utils::Prosody::deactivate_domain($c, $domain)
|
|
unless($c->config->{features}->{debug});
|
|
});
|
|
} catch ($e) {
|
|
NGCP::Panel::Utils::Message::error(
|
|
c => $c,
|
|
error => $e,
|
|
desc => $c->loc('Failed to delete domain.'),
|
|
);
|
|
$c->response->redirect($c->uri_for());
|
|
return;
|
|
}
|
|
|
|
try {
|
|
NGCP::Panel::Utils::XMLDispatcher::sip_domain_reload($c);
|
|
} catch ($e) {
|
|
NGCP::Panel::Utils::Message::error(
|
|
c => $c,
|
|
desc => $c->loc('Failed to reload proxy. Domain was deleted.'),
|
|
error => $e,
|
|
);
|
|
NGCP::Panel::Utils::Navigation::back_or($c, $c->uri_for('/domain'));
|
|
return;
|
|
}
|
|
NGCP::Panel::Utils::Message::info(
|
|
c => $c,
|
|
data => { $c->stash->{domain_result}->get_inflated_columns },
|
|
desc => $c->loc('Domain successfully deleted!'),
|
|
);
|
|
$c->response->redirect($c->uri_for());
|
|
return;
|
|
}
|
|
|
|
sub ajax :Chained('dom_list') :PathPart('ajax') :Args(0) {
|
|
my ($self, $c) = @_;
|
|
|
|
my $resultset = $c->stash->{dom_rs};
|
|
NGCP::Panel::Utils::Datatables::process($c, $resultset, $c->stash->{domain_dt_columns});
|
|
$c->detach( $c->view("JSON") );
|
|
}
|
|
|
|
sub ajax_filter_reseller :Chained('dom_list') :PathPart('ajax/filter_reseller') :Args(1) {
|
|
my ($self, $c, $reseller_id) = @_;
|
|
|
|
my $resultset = $c->stash->{dom_rs}->search({
|
|
'reseller_id' => $reseller_id,
|
|
});
|
|
NGCP::Panel::Utils::Datatables::process($c, $resultset, $c->stash->{domain_dt_columns});
|
|
$c->detach( $c->view("JSON") );
|
|
}
|
|
|
|
sub preferences :Chained('base') :PathPart('preferences') :Args(0) {
|
|
my ($self, $c) = @_;
|
|
|
|
$self->load_preference_list($c);
|
|
$c->stash(template => 'domain/preferences.tt');
|
|
}
|
|
|
|
sub preferences_base :Chained('base') :PathPart('preferences') :CaptureArgs(1) {
|
|
my ($self, $c, $pref_id) = @_;
|
|
|
|
$self->load_preference_list($c);
|
|
|
|
$c->stash->{preference_meta} = $c->model('DB')
|
|
->resultset('voip_preferences')
|
|
->single({id => $pref_id});
|
|
my $domain_name = $c->stash->{domain}->{domain};
|
|
my $provisioning_domain_id = $c->stash->{provisioning_domain_result}->id;
|
|
my $blob_short_value_size = NGCP::Panel::Utils::Preferences::get_blob_short_value_size;
|
|
|
|
$c->stash->{preference} = $c->model('DB')
|
|
->resultset('voip_dom_preferences')
|
|
->search({
|
|
attribute_id => $pref_id,
|
|
domain_id => $provisioning_domain_id,
|
|
},{
|
|
join => 'blob',
|
|
'+select' => [ \"SUBSTRING(blob.value, 1, $blob_short_value_size)" ],
|
|
'+as' => [ 'short_blob_value' ],
|
|
});
|
|
$c->stash(template => 'domain/preferences.tt');
|
|
}
|
|
|
|
sub preferences_edit :Chained('preferences_base') :PathPart('edit') :Args(0) {
|
|
my ($self, $c) = @_;
|
|
|
|
$c->stash(edit_preference => 1);
|
|
|
|
my @enums = $c->stash->{preference_meta}
|
|
->voip_preferences_enums
|
|
->search({dom_pref => 1})
|
|
->all;
|
|
|
|
my $pref_rs = $c->model('DB')
|
|
->resultset('voip_dom_preferences')
|
|
->search({
|
|
domain_id => $c->stash->{provisioning_domain_result}->id,
|
|
});
|
|
|
|
NGCP::Panel::Utils::Preferences::create_preference_form( c => $c,
|
|
pref_rs => $pref_rs,
|
|
enums => \@enums,
|
|
base_uri => $c->uri_for_action('/domain/preferences', [$c->req->captures->[0]]),
|
|
edit_uri => $c->uri_for_action('/domain/preferences_edit', $c->req->captures),
|
|
blob_rs => $c->model('DB')->resultset('voip_dom_preferences_blob'),
|
|
);
|
|
}
|
|
|
|
sub load_preference_list :Private {
|
|
my ($self, $c) = @_;
|
|
|
|
my $dom_pref_values = $c->model('DB')
|
|
->resultset('voip_preferences')
|
|
->search({
|
|
domain => $c->stash->{domain}->{domain}
|
|
},{
|
|
prefetch => {'voip_dom_preferences' => 'domain'},
|
|
});
|
|
|
|
my %pref_values;
|
|
foreach my $value($dom_pref_values->all) {
|
|
if ($value->data_type eq "blob") {
|
|
$pref_values{$value->attribute} = [
|
|
map {$_->blob
|
|
? $_->blob->content_type
|
|
: ''} $value->voip_dom_preferences->all
|
|
];
|
|
} else {
|
|
$pref_values{$value->attribute} = [
|
|
map {$_->value} $value->voip_dom_preferences->all
|
|
];
|
|
}
|
|
}
|
|
|
|
my $correct_reseller_id = $c->stash->{domain_result}->reseller_id;
|
|
my $rewrite_rule_sets_rs = $c->model('DB')
|
|
->resultset('voip_rewrite_rule_sets')
|
|
->search_rs({ reseller_id => $correct_reseller_id, });
|
|
my $header_rule_sets_rs = $c->model('DB')
|
|
->resultset('voip_header_rule_sets')->search_rs({
|
|
reseller_id => $correct_reseller_id,
|
|
subscriber_id => undef,
|
|
});
|
|
$c->stash(rwr_sets_rs => $rewrite_rule_sets_rs,
|
|
rwr_sets => [$rewrite_rule_sets_rs->all],
|
|
hdr_sets_rs => $header_rule_sets_rs,
|
|
hdr_sets => [$header_rule_sets_rs->all]);
|
|
|
|
my $ncos_levels_rs = $c->model('DB')
|
|
->resultset('ncos_levels')
|
|
->search_rs({ reseller_id => $correct_reseller_id, });
|
|
$c->stash(ncos_levels_rs => $ncos_levels_rs,
|
|
ncos_levels => [$ncos_levels_rs->all]);
|
|
|
|
my $ncos_sets_rs = $c->model('DB')
|
|
->resultset('ncos_sets')
|
|
->search_rs({ reseller_id => $correct_reseller_id, });
|
|
$c->stash(ncos_sets_rs => $ncos_sets_rs,
|
|
ncos_sets => [$ncos_sets_rs->all]);
|
|
|
|
my $emergency_mapping_containers_rs = $c->model('DB')
|
|
->resultset('emergency_containers')
|
|
->search_rs({ reseller_id => $correct_reseller_id, });
|
|
$c->stash(emergency_mapping_containers_rs => $emergency_mapping_containers_rs,
|
|
emergency_mapping_containers => [$emergency_mapping_containers_rs->all]);
|
|
|
|
my $sound_sets_rs = $c->model('DB')
|
|
->resultset('voip_sound_sets')
|
|
->search_rs({ reseller_id => $correct_reseller_id, contract_id => undef, });
|
|
$c->stash(sound_sets_rs => $sound_sets_rs,
|
|
sound_sets => [$sound_sets_rs->all]);
|
|
|
|
NGCP::Panel::Utils::Preferences::load_preference_list( c => $c,
|
|
pref_values => \%pref_values,
|
|
dom_pref => 1,
|
|
);
|
|
}
|
|
|
|
1;
|
|
|
|
__END__
|
|
|
|
=head1 NAME
|
|
|
|
NGCP::Panel::Controller::Domain - Catalyst Controller
|
|
|
|
=head1 DESCRIPTION
|
|
|
|
Catalyst Controller.
|
|
|
|
=head1 METHODS
|
|
|
|
=head2 dom_list
|
|
|
|
basis for the domain controller
|
|
|
|
=head2 root
|
|
|
|
=head2 create
|
|
|
|
Provide a form to create new domains. Handle posted data and create domains.
|
|
|
|
=head2 search
|
|
|
|
obsolete
|
|
|
|
=head2 base
|
|
|
|
Fetch a domain by its id.
|
|
|
|
Data that is put on stash: domain, domain_result
|
|
|
|
=head2 edit
|
|
|
|
probably obsolete
|
|
|
|
=head2 delete
|
|
|
|
deletes a domain (defined in base)
|
|
|
|
=head2 ajax
|
|
|
|
Get domains and output them as JSON.
|
|
|
|
=head2 preferences
|
|
|
|
Show a table view of preferences.
|
|
|
|
=head2 preferences_base
|
|
|
|
Get details about one preference for further editing.
|
|
|
|
Data that is put on stash: preference_meta, preference, preference_values
|
|
|
|
=head2 preferences_edit
|
|
|
|
Use a form for editing one preference. Execute the changes that are posted.
|
|
|
|
Data that is put on stash: edit_preference, form
|
|
|
|
=head2 load_preference_list
|
|
|
|
Retrieves and processes a datastructure containing preference groups, preferences and their values, to be used in rendering the preference list.
|
|
|
|
Data that is put on stash: pref_groups
|
|
|
|
=head1 AUTHOR
|
|
|
|
Andreas Granig,,,
|
|
|
|
=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:
|