NMIS provides comprehensive device (node) management capabilities for organizing and configuring your monitored network infrastructure. Devices can be grouped, tagged, and configured with custom properties to match your operational needs.
Node Configuration
Configure device properties, SNMP settings, and polling behavior
Groups & Tags
Organize devices using logical groups and custom tags
Bulk Operations
Manage multiple devices simultaneously with bulk actions
Node Lifecycle
Create, update, rename, activate, and delete nodes
Every device in NMIS is represented as a Node object with these core attributes:
# From Node.pm:75-89sub new { my ( $class, %args ) = @_; return if ( !$args{nmisng} ); return if ( !$args{uuid} ); # UUID is required my $self = { _dirty => {}, _nmisng => $args{nmisng}, _id => $args{_id} // $args{id} // undef, uuid => $args{uuid}, collection => $args{nmisng}->nodes_collection(), encryption_enabled => NMISNG::Util::getbool($args{nmisng}->config->{'global_enable_password_encryption'}) }; bless( $self, $class );}
UUID: Each node has a unique identifier (UUID) that remains constant even if the node is renamed. This ensures data continuity and relationship integrity.
# Show all node propertiesnmis-cli act=show node=router1# Show specific propertynmis-cli act=show node=router1 property=group# List all nodesnmis-cli act=list-nodes# List nodes in groupnmis-cli act=list-nodes group=Core# Export node configurationnmis-cli act=export node=router1 > router1-config.json
# From Node.pm:516-527sub activated { my ($self, $newstate) = @_; if (ref($newstate) eq "HASH") { $self->_dirty(1, "activated"); $self->{_activated} = $newstate; # Propagate to old-style active flag for compat $self->{_configuration}->{active} = $newstate->{NMIS}? 1:0; } return Clone::clone($self->{_activated});}
# From Node.pm:1431-1460sub rename { my ($self, %args) = @_; my $newname = $args{new_name}; my $old = $self->name; return (0, "Invalid new_name argument") if (!$newname); # '/' is forbidden in node names return (0, "new_name contains forbidden character '/'") if ($newname =~ m!/!); my $nodenamerule = $self->nmisng->config->{node_name_rule} || qr/^[a-zA-Z0-9_. -]+$/; return (0, "new node name does not match 'node_name_rule' regex") if ($newname !~ $nodenamerule); return (1, "new_name same as current, nothing to do") if ($newname eq $old); my $clash = $self->nmisng->get_nodes_model(name => $newname); return (0, "A node named \"$newname\" already exists!") if ($clash->count);}
# Rename a node (preserves all data via UUID)nmis-cli act=rename node=oldname new_name=newname# Rename with confirmationnmis-cli act=rename node=router-old new_name=router-new confirm=true
Renaming nodes updates the name but preserves all historical data through the UUID. However, this operation:
# From Node.pm:614-774sub delete { my ($self,%args) = @_; my $keeprrd = NMISNG::Util::getbool($args{keep_rrd}); return (1, "Node already deleted") if ($self->{_deleted}); return (1, "Node has never been saved") if ($self->is_new); # Deactivate first my $curcfg = $self->configuration; if ($curcfg->{activated}->{NMIS}) { $curcfg->{activated}->{NMIS} = $curcfg->{active} = 0; $self->configuration($curcfg); $self->save; } # Remove queued jobs # Delete all inventory instances # Clean up RRD files (unless keep_rrd) # Delete all events # Remove opstatus entries}
# Delete node and all datanmis-cli act=delete node=router1 confirm=yes# Delete but keep RRD filesnmis-cli act=delete node=switch1 keep_rrd=true confirm=yes# Delete multiple nodesnmis-cli act=delete-nodes nodes=router1,router2,router3 confirm=yes
# From Node.pm:1212-1284sub coarse_status { my ($self, %args) = @_; # 1 for reachable # 0 for unreachable # -1 for degraded my $status = 1; # Check for Node Down event if (my $erec = $self->eventExist($node_down)) { $status = 0; } # Pingable but dead SNMP/WMI -> degraded elsif (NMISNG::Util::getbool($catchall_data->{collect}) and ($self->eventExist($snmp_down) or $self->eventExist($wmi_down_event))) { $status = -1; } return $status;}