Difference between revisions of "Using nxshell to automate bulk operations"

From NetXMS Wiki
Jump to navigation Jump to search
Line 119: Line 119:
for node in [o for o in s.getAllObjects() if isinstance(o, objects.Node)]: # filter all objects for objects.Node
for node in [o for o in s.getAllObjects() if isinstance(o, objects.Node)]: # filter all objects for objects.Node
     for interface in node.getAllChilds(objects.GenericObject.OBJECT_INTERFACE):
     for interface in node.getAllChilds(objects.GenericObject.OBJECT_INTERFACE):
        w.writerow([
            node.getObjectId(),
            interface.getObjectId(),
            node.getObjectName(),
            interface.getPrimaryIP().getHostAddress(),
            interface.getSubnetMask().getHostAddress()
        ])
</syntaxhighlight>
== List free(administratively down) ethernet ports on switches ==
<syntaxhighlight lang="python">
import csv
import sys
w = csv.writer(sys.stdout, dialect='excel')
w.writerow(['node_id', 'interface_id', 'name', 'ip', 'mask']) # Header
for node in filter(lambda x: isinstance(x, objects.Node), s.getAllObjects()):
    allInterfaces = node.getAllChilds(objects.GenericObject.OBJECT_INTERFACE)
    # iftype=6 - ethernetCsmacd, http://www.net-snmp.org/docs/mibs/interfaces.html#IANAifType
    #            or check IFTYPE_* constants in src/nms_common.h
    interfaces = filter(lambda i: i.getIfType==6 and i.getOperState() == objects.Interface.ADMIN_STATE_DOWN, allInterfaces)
    for interface in interfaces:
         w.writerow([
         w.writerow([
             node.getObjectId(),
             node.getObjectId(),

Revision as of 15:16, 12 February 2013

Introduction

NxShell is based on Jython and provide access to NetXMS Java API using interactive shell. NxShell is build as single jar file, which includes all required libraries.

Download: http://www.netxms.org/download/nxshell-1.2.5.jar (change 1.2.5 to required version)

Usage

Start as interactive shell:

java -jar nxshell-1.2.5.jar

Execute script "test.py":

java -jar nxshell-1.2.5.jar test.py

When NxShell is started, it tries to get server IP, login and password from command line parameters. In interactive mode, user will be asked for details, otherwise default values will be used.

Start as interactive shell, with IP and Login provided (password will be asked):

java -Dnetxms.server=127.0.0.1 -Dnetxms.login=admin -jar nxshell-1.2.5.jar

Properties

These properties should be set with JVM's "-D" option. Please make sure that all "-D" options are before "-jar".

Parameter Default Value
netxms.server 127.0.0.1
netxms.login admin
netxms.password netxms

Scripting

For details on API please refer to javadoc at http://www.netxms.org/documentation/javadoc/latest/.

NxShell provide user with already connected and synchronised session to simplify scripting. Most required packages are imported as well to minimize typing.

Global Variables

Variable Type Notes
session org.netxms.client.NXCSession
s org.netxms.client.NXCSession Alias for "session"

Helper Functions

Sample Scripts

Create Container and some nodes

parentId = objects.GenericObject.SERVICEROOT # Infrastructure Services root
cd = NXCObjectCreationData(objects.GenericObject.OBJECT_CONTAINER, "Sample Container", parentId);
containerId = session.createObject(cd) # createObject return ID of newly created object
print '"Sample Container" created, id=%d' % (containerId, )

flags = NXCObjectCreationData.CF_DISABLE_ICMP | \
        NXCObjectCreationData.CF_DISABLE_NXCP | \
        NXCObjectCreationData.CF_DISABLE_SNMP
for i in xrange(0, 5):
    name = "Node %d" % (i + 1, )
    cd = NXCObjectCreationData(objects.GenericObject.OBJECT_NODE, name, containerId);
    cd.setCreationFlags(flags);
    cd.setPrimaryName("0.0.0.0") # Create node without IP address
    nodeId = session.createObject(cd)
    print '"%s" created, id=%d' % (name, nodeId)

Change Object comments

for name in open("nodes.txt").readlines():
    node = session.findObjectByName(name.strip())
    if node:
        comments = "New Comment"
        existingComments = node.getComments() # will return null if there are no comments
        if existingComments:
            comments += "\n" + existingComments
        session.updateObjectComments(node.getObjectId(), comments)

Manage / Unmanage interfaces based on the name

(works for any Object).

from org.netxms.client.objects import GenericObject, Node, Interface

for name in open("nodes.txt").readlines():
    node = session.findObjectByName(name.strip())
    if node:
        for interface in node.getAllChilds(GenericObject.OBJECT_INTERFACE): # 3 == interface
            name = interface.getObjectName()
            if name.startswith('lo'):
                session.setObjectManaged(interface.getObjectId(), True)
            else:
                session.setObjectManaged(interface.getObjectId(), False)

Disable SNMP polling for node

from org.netxms.client.objects import Node

for name in open("nodes.txt").readlines():
    node = session.findObjectByName(name.strip())
    if node:
        md = NXCObjectModificationData(node.getObjectId())
        newFlags = node.getFlags() | Node.NF_DISABLE_SNMP
        md.setObjectFlags(newFlags)
        session.modifyObject(md)

Export list of interfaces to CSV file

import csv, sys

w = csv.writer(sys.stdout, dialect='excel')
w.writerow(['node_id', 'interface_id', 'name', 'ip', 'mask']) # Header

for node in [o for o in s.getAllObjects() if isinstance(o, objects.Node)]: # filter all objects for objects.Node
    for interface in node.getAllChilds(objects.GenericObject.OBJECT_INTERFACE):
        w.writerow([
            node.getObjectId(),
            interface.getObjectId(),
            node.getObjectName(),
            interface.getPrimaryIP().getHostAddress(),
            interface.getSubnetMask().getHostAddress()
        ])

List free(administratively down) ethernet ports on switches

import csv
import sys

w = csv.writer(sys.stdout, dialect='excel')
w.writerow(['node_id', 'interface_id', 'name', 'ip', 'mask']) # Header

for node in filter(lambda x: isinstance(x, objects.Node), s.getAllObjects()):
    allInterfaces = node.getAllChilds(objects.GenericObject.OBJECT_INTERFACE)
    # iftype=6 - ethernetCsmacd, http://www.net-snmp.org/docs/mibs/interfaces.html#IANAifType
    #            or check IFTYPE_* constants in src/nms_common.h
    interfaces = filter(lambda i: i.getIfType==6 and i.getOperState() == objects.Interface.ADMIN_STATE_DOWN, allInterfaces)
    for interface in interfaces:
        w.writerow([
            node.getObjectId(),
            interface.getObjectId(),
            node.getObjectName(),
            interface.getPrimaryIP().getHostAddress(),
            interface.getSubnetMask().getHostAddress()
        ])