' if $DEBUG;
# Check if user can access this section
# We don't want average users seeing this page, its only for admins and operators.
# Users have a special limited page user_device.html
my $manager = $ui->get_permission_manager($r);
unless ( $manager && $manager->can($user, "access_section", 'device.html') ){
$m->comp('/generic/error.mhtml', error=>"You don't have permission to access this page");
}
if ( $id ){
unless ($o = Device->retrieve($id)){
$m->comp('/generic/error.mhtml', error=>"Could not retrieve Device with id $id");
}
}
if ( $o ){
if( $intadd ){
eval { $o->add_interfaces($intaddnum) };
if ( my $e = $@ ){
$m->comp('/generic/error.mhtml', error=>$e);
}
}elsif( defined $overwrite_if_descr ){
if ( $overwrite_if_descr == 0 || ($submit && ($submit eq 'confirm')) ){
eval { $o->set_overwrite_if_descr($overwrite_if_descr); };
if ( my $e = $@ ){
$m->comp('/generic/error.mhtml', error=>$e);
}
undef($submit);
}elsif ( $overwrite_if_descr == 1 ){
$m->comp('/generic/confirm.html',
%ARGS,
target =>'../management/device.html',
message =>'Any currently saved interface descriptions will be overwritten by '.
'SNMP-fetched data the next time the device is discovered. Are you sure?',
);
}
}elsif ( defined $if_auto_dns ){
eval { $o->set_interfaces_auto_dns($if_auto_dns); };
if ( my $e = $@ ){
$m->comp('/generic/error.mhtml', error=>$e);
}
}elsif ( $add_ip eq 'Add' ){
eval { $o->add_ip($add_ip_address, $add_ip_int) };
if ( my $e = $@ ){
$m->comp('/generic/error.mhtml', error=>$e);
}
$add_ip = undef;
}
}
if( $deviceadd && $newhost ){
if ( Device->search(name=>$newhost) ){
# It's already there
print "
Device $newhost already exists in DB";
$m->abort;
}else{
# Add device manually
eval {
$o = Device->manual_add(host=>$newhost);
};
if ( my $e = $@ ){
$m->comp('/generic/error.mhtml', error=>$e);
}
}
}elsif( $submit ){
# insert/update
my $new_digest;
if ( $o ){
$new_digest = $o->get_digest();
}
eval {
Netdot::Model->do_transaction( sub{
if ( $state_digest && $new_digest && ($state_digest ne $new_digest) ){
$ui->throw_user("This device changed while you were editing");
}
$ui->form_to_db(%ARGS);
});
};
if ( my $e = $@ ){
$m->comp('/generic/error.mhtml', error=>$e);
}
# Re-read $o to avoid seeing the old values
$o = undef;
$o = Device->retrieve($id);
}
if ( $o ){
$id = $o->id;
if ( $o->name ){
$name = (defined $o->name->name) ? $o->name->name : "Name N/A!";
$fqdn = $name . "." . $o->name->zone->name;
}else{
$m->comp('/generic/error.mhtml', error=>"Device name not set");
}
}elsif ( ! $search ){
$m->comp('/generic/error.mhtml', error=>"Cannot retrieve device");
}
if ( $view eq "Interfaces" || $view eq "Topology" || $view eq "All" ){
# Build a hash of Interface Vlans
foreach my $if ( $o->interfaces ){
if ( my @ifv = $if->vlans ){
foreach my $ifv ( @ifv ){
my $vid = $ifv->vlan->vid;
$ifvlans{$if}{$vid} = "";
$vlans{$vid} = $ifv->vlan->id;
}
}
}
}
my $refresh_url = "device.html?id=$id&view=$view";
%init>
%def>
%#######################################################################
%#
%# IP info
%#
%#######################################################################
% if ( $view eq "IP" || $view eq "All" ){
% # Get all ip address info
% my $ips;
% if ( $o && $ipsort ){
% $ips = $o->get_ips(sort_by=>$ipsort);
% }
IPs
% if ( $editips ) {
<%perl>
if (scalar @$ips){
(@headers, @rows, @row) = ();
@headers = ('Address',
'Subnet',
'Interface',
'DNS Name(s)', 'Monitored?', 'Services',
);
my $can_edit = ($manager && $manager->can($user, "edit", $o))? 1 : 0;
foreach my $ip ( @$ips ){
next if ( ! exists $ifvlans{$ip->interface}{$showvlan} &&
$showvlan ne "all" );
my (@row) = ();
push( @row,
&{sub{
my $a = "";
if ($editips){
$a .= 'id . "__delete" . '" >[del] ';
$a .= $ip->address ;
$a .= ' ';
}else{
$a .= '' . $ip->address . ' ';
}
$a;
}} );
push( @row,
&{sub{
my $a = "";
if ( $ip->parent ){
if ($editips){
$a .= $ip->parent->address . '/' . $ip->parent->prefix ;
}else{
$a .= '' . $ip->parent->address . '/' .
$ip->parent->prefix . ' ';
}
}
$a;
}} );
push( @row,
&{sub{
my @ints = $o->interfaces;
$ui->select_lookup(object=>$ip, table=>"Ipblock", column=>'interface', lookup=>"Interface",
defaults=>\@ints, edit=>$editips, returnAsVar=>1, linkPage=>"interface.html");
}} );
push( @row,
&{sub{
my $a = "";
if ( $ip->a_records ){
foreach my $ar ( $ip->a_records ){
# Don't let user delete the RR that the Device name points to
# otherwise a referential integrity error would happen
if ( $editips && ($ar->rr->id != $o->name->id) ){
$a .= 'rr->id . "__delete" . '" >[del] ';
}
$a .= $ui->form_field(object=>$ar->rr, column=>"name", edit=>0,
linkPage=>"host.html", returnValOnly=>1);
}
}
$a;
}} );
push( @row,
&{sub{
$ui->form_field(object=>$ip, table=>"Ipblock", column=>'monitored', edit=>$editips, returnValOnly=>1);
}} );
push( @row,
&{sub{
my $a = "";
if ( scalar ($ip->services) ){
foreach my $ipsrv ($ip->services){
if ( $editips ){
$a .= 'id . "__delete" . '" > [del] ';
}
$a .= '' . $ipsrv->service->name . '';
$a .= ' ';
}
}
if ( !$editips && $can_edit ){
$a .= "[add]";
}
$a;
}} );
push( @rows, \@row );
}# foreach
$m->comp('/generic/data_table.mhtml', field_headers=>\@headers, data=>\@rows );
} # endif scalar @ips
if ( !$editips ){
(@headers, @rows) = ();
if ( $add_ip ){
# Let user add a new IP
%perl>
';
}
%perl>
% if ( !$editips && !$add_ip ){
Options
% if ( $manager && $manager->can($user, 'edit', $o) ){
<%perl>
my $ipeers = $o->get_bgp_peers(type=>"internal", sort=>$peersort);
my $epeers = $o->get_bgp_peers(type=>"external", sort=>$peersort);
if ( !$ipeers && !$epeers ) {
# We may get nothing if for some reason the device's local AS
# is not set. This shows any peers as external.
$epeers = $o->get_bgp_peers(type=>"all", sort=>$peersort);
}
my $whois_url = Netdot->config->get('BGP_AS_WHOIS_URL');
%perl>
% if ( $ipeers || $epeers ){
% }
% }
%#######################################################################
%#
%# Topology
%#
%#######################################################################
%
% if ( $view eq "Topology" || $view eq "All" ){
%
Note: Depths greater than 2 may take a long time to render