Files
netdisco/share/views/layouts/main.tt
Oliver Gorwits dc1f76c1aa Feature to gather SNMP Walk, use as Pseudo Device, and Browse Objects
* fix anomalous name

* add gather worker

* fix encoding of binary storage

* store results back to job

* now parsing mbis report to translate

* fix the broken report parser

* rename gather to snapshot

* implement walk code copied from SNMP::Info

* can now bulkwalk and parse mibs report and store resolved walk in cache

* add func/glob aliasing broken

* better aliasing

* implement aliasing from globals and funcs

* fix regexp for matching netdisco-mibs report

* fake cache entry for all ND2 methods called, add comments

* also save to logs/snapshots/IP

* add doc for netdisco-do

* add is_pseudo column to device table

* support for loading cache for pseudo devices

* check for hrSystemUptime as well as sysUpTime for snmp connect

* display pseudo devices with yellow pill for name

* color all cells for layers for pseudo

* no need to b64 encode binary data in scalars as we b64 whole thing after

* tweaked uptime check

* store snapshot to database instead of Job

* expose snapshots in device details tab

* small ux improvements on snap download

* fixes for errors in subnet mask searching

* hide snapshot management for pseudo devices

* update to use new netdisco-mibs object cache

* update for new format oids file

* start of work on loading walk into db for browsing

* store values and meta

* add auto increment col and oid index to browser

* start web plugin for browser

* add virtual search for oid children

* have all oid in separte table (60 seconds load on my laptop)

* rename table and add relation

* store oid as int array

* fix sql for children

* make jstree start working

* working very slow tree expand

* fix to work when first displaying tree

* store both oid and oid_parts

* simplify SQL to speed up (more complicated perl)

* fix sql bug, add better index, prettify tree

* render the snmp node detail

* add node template, make scrollable, pretty print data values (insecure)

* store munge hint

* some dubious code to munge the data

* make sure to filter by IP on device_browser

* make safer the rendering of value data (but need to come back to key ordering)

* fix sorting on object values

* limit the opening of child nodes to keep response good and unclutter

* factor out the munge and make safer

* reject unknown mungers

* show the munger and option (not working) to change

* additional js for munge select

* complete custom munge

* change so that saving to database is only at CLI and on request

* hide snmp tab if no browser rows in the db

* add helpful message when no browser rows for the device

* stub handler for search and add recurse control

* working search

* minor ui fixes

* implement typeahead for leaf search

* limit rows in typeahead

* make sure device_browser is visited in delete and renumber

* add requirements for this branch

* update manifest

* make sure node search and typeahead are restricted to current device only
2021-11-06 07:47:29 +00:00

209 lines
11 KiB
Plaintext

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-type" content="text/html; charset=[% settings.charset | html_entity %]" />
<link rel="shortcut icon" href="[% uri_base | none %]/images/favicon.ico" type="image/x-icon">
<link rel="icon" href="[% uri_base | none %]/images/favicon.ico" type="image/x-icon">
<title>Netdisco</title>
<!-- HTML5 shim, for IE6-8 support of HTML elements -->
<!--[if lt IE 9]>
<script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
<script type="text/javascript" src="[% uri_base | none %]/javascripts/jquery-latest.min.js"></script>
<!-- <script type="text/javascript" src="http://code.jquery.com/jquery-migrate-1.1.1.js"></script> -->
<script type="text/javascript" src="[% uri_base | none %]/javascripts/jquery-ui.custom.min.js"></script>
<script type="text/javascript" src="[% uri_base | none %]/javascripts/jquery-history.js"></script>
<!-- <script type="text/javascript" src="[% uri_base | none %]/javascripts/jquery.cookie.js"></script> -->
<script type="text/javascript" src="[% uri_base | none %]/javascripts/jquery-deserialize.js"></script>
<script type="text/javascript" src="[% uri_base | none %]/javascripts/bootstrap.min.js"></script>
<script type="text/javascript" src="[% uri_base | none %]/javascripts/bootstrap2-toggle.min.js"></script>
<script type="text/javascript" src="[% uri_base | none %]/javascripts/underscore.min.js"></script>
<script type="text/javascript" src="[% uri_base | none %]/javascripts/jquery.qtip.min.js"></script>
<script type="text/javascript" src="[% uri_base | none %]/javascripts/d3-3.5.17.min.js"></script>
<script type="text/javascript" src="[% uri_base | none %]/javascripts/d3-force-network-chart.js"></script>
<script type="text/javascript" src="[% uri_base | none %]/javascripts/toastr.js"></script>
<script type="text/javascript" src="[% uri_base | none %]/javascripts/jquery.floatThead.js"></script>
<script type="text/javascript" src="[% uri_base | none %]/javascripts/daterangepicker.js"></script>
<script type="text/javascript" src="[% uri_base | none %]/javascripts/moment.min.js"></script>
<script type="text/javascript" src="[% uri_base | none %]/javascripts/jquery.dataTables.min.js"></script>
<script type="text/javascript" src="[% uri_base | none %]/javascripts/dataTables.bootstrap.js"></script>
<script type="text/javascript" src="[% uri_base | none %]/javascripts/dataTables.ip-address-detect.js"></script>
<script type="text/javascript" src="[% uri_base | none %]/javascripts/dataTables.ip-address-sort.js"></script>
<script type="text/javascript" src="[% uri_base | none %]/javascripts/jstree/jstree.min.js"></script>
<script type="text/javascript" src="[% uri_base | none %]/javascripts/he.js"></script>
<script type="text/javascript" src="[% uri_base | none %]/javascripts/natural.js"></script>
<script type="text/javascript" src="[% uri_base | none %]/javascripts/portsort.js"></script>
<script type="text/javascript" src="[% uri_base | none %]/javascripts/versionsort.js"></script>
<script type="text/javascript">
var uri_base = '[% uri_base | none %]';
var nd_check_userlog = '[% settings.check_userlog | html_entity %]';
</script>
<script type="text/javascript" src="[% uri_base | none %]/javascripts/netdisco.js"></script>
[% IF user_has_role('port_control') %]
<script type="text/javascript" src="[% uri_base | none %]/javascripts/netdisco_portcontrol.js"></script>
[% END %]
[% FOREACH add_js IN settings._additional_javascript %]
<script type="text/javascript" src="[% uri_base | none %]/plugin/[% add_js | none %]/[% add_js | none %].js"></script>
[% END %]
<link rel="stylesheet" href="[% uri_base | none %]/css/bootstrap.min.css"/>
<link rel="stylesheet" href="[% uri_base | none %]/css/bootstrap2-toggle.min.css"/>
<link rel="stylesheet" href="[% uri_base | none %]/css/awesome-bootstrap-checkbox.css"/>
<link rel="stylesheet" href="[% uri_base | none %]/css/jquery.qtip.min.css"/>
<link rel="stylesheet" href="[% uri_base | none %]/css/smoothness/jquery-ui.custom.min.css"/>
<link rel="stylesheet" href="[% uri_base | none %]/css/font-awesome.min.css"/>
<link rel="stylesheet" href="[% uri_base | none %]/css/toastr.css"/>
<link rel="stylesheet" href="[% uri_base | none %]/css/d3-force-network-chart.css"/>
<link rel="stylesheet" href="[% uri_base | none %]/css/netdisco.css"/>
<link rel="stylesheet" href="[% uri_base | none %]/css/bootstrap-tree.css"/>
<link rel="stylesheet" href="[% uri_base | none %]/javascripts/jstree/themes/proton/style.min.css"/>
<link rel="stylesheet" href="[% uri_base | none %]/css/daterangepicker-bs2.css"/>
<link rel="stylesheet" href="[% uri_base | none %]/css/dataTables.bootstrap.css"/>
<link rel="stylesheet" href="[% uri_base | none %]/css/nd_print.css" media="print"/>
[% FOREACH add_css IN settings._additional_css %]
<link rel="stylesheet" href="[% uri_base | none %]/plugin/[% add_css | none %]/[% add_css | none %].css"/>
[% END %]
</head>
<body>
<div class="navbar navbar-inverse navbar-fixed-top">
<div class="navbar-inner">
<div class="container">
<a class="brand" href="[% uri_for('/') | none %]">Netdisco</a>
[% IF session.logged_in_user %]
<ul class="nav">
[% FOREACH ni IN settings._navbar_items %]
<li[% ' class="active"' IF vars.nav == ni.tag %]>
<a href="[% uri_for(ni.path) | none %]">[% ni.label | html_entity %]</a>
</li>
[% END %]
[% IF settings._reports.size %]
<li class="dropdown[% ' active' IF vars.nav == 'reports' %]">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">Reports <b class="caret"></b></a>
<ul class="dropdown-menu">
[% FOREACH category IN settings._report_order %]
[% IF settings._reports_menu.$category.size %]
<li class="dropdown-submenu">
<a href="#">[% category | html_entity %]</a>
<ul class="dropdown-menu">
[% FOREACH item IN settings._reports_menu.$category %]
[% NEXT IF settings._reports.$item.hidden %]
<li><a href="[% uri_for('/report/' _ item) %]?firstsearch=on">[% settings._reports.$item.label | html_entity %]</a></li>
[% END %]
</ul>
</li>
[% END %]
[% END %]
</ul>
</li> <!-- /dropdown -->
[% END %]
[% IF user_has_role('admin') %]
<li class="dropdown[% ' active' IF vars.nav == 'admin' %]">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">Admin <b class="caret"></b></a>
<ul class="dropdown-menu">
<li>
<form method="post" class="nd_inline-form" action="[% uri_for('/admin/discoverall') | none %]">
<button type="submit" class="btn btn-link nd_btn-link">Discover All</button>
</form>
</li>
<li>
<form method="post" class="nd_inline-form" action="[% uri_for('/admin/arpwalk') | none %]">
<button type="submit" class="btn btn-link nd_btn-link">Arpnip All</button>
</form>
</li>
<li>
<form method="post" class="nd_inline-form" action="[% uri_for('/admin/macwalk') | none %]">
<button type="submit" class="btn btn-link nd_btn-link">Macsuck All</button>
</form>
</li>
<li>
<form method="post" class="nd_inline-form" action="[% uri_for('/admin/nbtwalk') | none %]">
<button type="submit" class="btn btn-link nd_btn-link">NBTstat All</button>
</form>
</li>
<li>
<form method="post" class="nd_inline-form" action="[% uri_for('/admin/expire') | none %]">
<button type="submit" class="btn btn-link nd_btn-link">Run Expire Job</button>
</form>
</li>
<li>
<form method="post" class="nd_inline-form" action="[% uri_for('/admin/stats') | none %]">
<button type="submit" class="btn btn-link nd_btn-link">Update Statistics</button>
</form>
</li>
[% IF settings._admin_tasks.size %]
<li class="divider"></li>
[% FOREACH ai IN settings._admin_order %]
[% NEXT IF settings._admin_tasks.$ai.hidden %]
<li><a href="[% uri_for('/admin/' _ ai) %]">[% settings._admin_tasks.$ai.label | html_entity %]</a></li>
[% END %]
[% END %]
</ul>
</li> <!-- /dropdown -->
[% END %]
</ul>
<form class="navbar-search pull-left" method="get" action="[% uri_for('/search') | none %]">
<input placeholder="Find Anything" class="search-query span3"
id="nq" name="q" value="[% display_name | html_entity %]" type="text" autocomplete="off"/>
<input name="firstsearch" type="hidden" value="on">
<div class="btn-group nd_navbar-search-group">
<button class="btn btn-inverse nd_navbar-search-icon">
<span style="font-size: 18px;">
<i id="navsearchgo" class="icon-search"></i>
</span>
</button>
<button class="btn btn-inverse dropdown-toggle nd_navbar-search-caret" data-toggle="dropdown">
<span class="caret" style="border-top-color: #999; border-bottom-color: #999"></span>
</button>
<ul class="dropdown-menu">
<li><a class="nd_navsearchgo-specific" href="" data-tab="device">Search Devices</a></li>
<li><a class="nd_navsearchgo-specific" href="" data-tab="node">Search Nodes</a></li>
<li><a class="nd_navsearchgo-specific" href="" data-tab="vlan">Search VLANs</a></li>
<li><a class="nd_navsearchgo-specific" href="" data-tab="port">Search Ports</a></li>
</ul>
</div>
</form>
<ul class="nav pull-right">
<li class="nd_navbar-text">Logged in as&nbsp;</li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">
[% IF user_has_role('admin') %]
<i class="icon-user text-error"></i>
[% ELSIF user_has_role('port_control') %]
<i class="icon-user text-warning"></i>
[% ELSE %]
<i class="icon-user"></i>
[% END %]&nbsp;
[% session.logged_in_fullname || session.logged_in_user | html_entity %] <b class="caret"></b>
</a>
<ul class="dropdown-menu">
[% IF NOT ( user_has_role('ldap') OR user_has_role('radius') ) %]
<li><a href="[% uri_for('/password') | none %]">Change Password</a></li>
[% END %]
[% IF NOT settings.no_auth %]
<li><a href="[% uri_for('/logout') | none %]">Log Out</a></li>
[% END %]
</ul>
</li> <!-- /dropdown -->
</ul>
[% END %]
</div>
</div>
</div>
[% content | none %]
<script type="text/javascript">
[%+ INCLUDE 'js/common.js' -%]
</script>
</body>
</html>