New features in IDM 4.5 dxcmd

0 Likes
One of the new features in IDM 4.5 is the addition of Java statistics in the 'dxcmd' tool.

You can read more about new features in IDM 4.5 in some of these articles:
Series: What's new in IDM 4.5


For what is new in Designer 4.5 you can read these articles:
What’s new in Designer 4.5 – Part 1
What’s new in Designer 4.5 – Part 2
Deprecating packages in Designer

Gee, looks like there was more than just the few items listed in the "Whats New" in the readme for this IDM release. Actually, having gone through the exercise of working through all the changes, I was kind of disappointed at the set that got called out in the readme. I think there are more interesting and exciting changes than they called out.

If you are not familiar with dxcmd and run an Identity Manager system, then you should definitely try it out right now. It is a Java tool (and actually the Java classes are available if you want in policy) that lets you monitor and manage an IDM system. If you have used the Nagios plugin to monitor IDM drivers you should read the script since it calls dxcmd to get a bunch of stats that would otherwise not be available any other way.


https://www.netiq.com/communities/cool-solutions/cool_tools/monitor-dirxmlidm-driver-states-with-nagios/


It is available on all platforms IDM runs on. It is dxcmd.bat on Windows and a shell script on Linux variants. On Linux it is in the path, so you can just execute it as 'dxcmd'. You need to login, obviously, and the format is dotted name, so something like admin.admins.myOU.myO would suffice.

I often find go in and out of dxcmd multiple times when working with it, so I use one of the MANY command line options, -user and sometimes -password to save myself time.

dxcmd -user admin.admins.myOU.myO -password MyPassword

If you do not use the -user and -password command line parameters you will get prompted interactively. I just like typing it once, and reusing it out of history. However, since this is an eDirectory Admin account you may not wish to have that in your .history file. (If so, consider just the -user and not the -password switch, it still saves you typing).

This gets you to an interface that looks like:

DirXML commands:

 1: Start driver
 2: Stop driver
 3: Driver operations...
 4: Driver set operations...
 5: Log events operations...
 6: Get DirXML version
 7: Job operations...
 8: Get JVM statstics
99: Quit


Enter choice:

The various options are interesting and probably worth an article on its own, and if you have never seen these you should look into them.

Some quick tips though while here. Option 4, Driver set operations, is quite useful. When adding a new server to a driverset, I find doing it in Designer has a major downfall that requires you to deploy the change to the driver set object. This implies updating all the drivers in the driverset. When you are first setting up your IDM system, this is fine. But once you have a modern, complex system, and say 30 drivers, then deploying them takes a long time, and has the possibility to break stuff. The Deploy functionality works, but has important caveats. For example passwords (Driver, Remote, Application, Named Passwords, etc) need to be deployed to be pushed out. However, if you imported your project from the Identity Vault, then you do NOT have the passwords in your project and if you deploy an object holding one of those passwords you will be overwriting the existing passwords with null. This has the nasty side effect of breaking your entire system. If you entered the passwords by hand into this Designer project, then they exist and will deploy properly. If you imported them, you do not have them. (Copying the project they were entered into or importing a ZIP project export should be fine, but not a Live - Import). This is a very annoying (and potentially dangerous) issue in how Designer works. Technically it is working as designed. It is just a bad design.

Thus when I have a mature IDM system and need to add a new server to a driver set, I could use iManager to do it, or dxcmd's Driver Set operations which allows me to assign this server to a driver set.

Option 3, Driver options, now adds a new feature as well, support for the new DirXML-AssociationsLite attribute format. In very large IDM instances (in the 10s of million objects) the overhead of using a DN reference in the traditional DirXML-Associations attribute becomes a problem. For cases like that, NetIQ added a new per-driver option to switch to use a string based attribute, DirXML-AssociationsLite, that looks like the LDAP representation of DirXML-Associations (\TREE\O\OU\DriverSet\Driver#0#Associationvalue). Note that the format is in IDM format (backslash) and not LDAP format.

Regardless as you can imagine, enabling this is one thing, converting your drivers over could be 'challenging' especially when you have millions of associations! Turns out there are options to convert existing attributes to the new format, and back if you change your mind. These are here in dxcmd as well.

Option 8 however is the main reason for this article, "Get JVM statistics".

When you choose option 8, you see the next submenu:

Select a JVM Stat option:

 1: All Statistics
 2: Memory
 3: Thread
 4: Runtime
 5: Classloader
 6: Operation System
 7: Garbage Collector
99: Exit


Here you can select the elements you want, which is smart, since option 1, All Statistics generates way too much stuff. I have a sample, and will include the entire thing for reference here at the end of this article.

Usually the thing we care about in terms of monitoring Java statistics is the memory, so lets focus on option 2, Memory. If you chose option 2, you will get a result something like this:

<nds dtdversion="4.0" ndsversion="8.x">
<source>
<product edition="Advanced" version="4.5.0.2">DirXML</product>
<contact>NetIQ Corporation</contact>
</source>
<output>
<MEMORY_STATS>
<HEAP>
<INITIAL>128.00 MB</INITIAL>
<COMITTED>123.50 MB</COMITTED>
<USED>14.251 MB</USED>
<TOTAL>455.00 MB</TOTAL>
</HEAP>
<NON_HEAP>
<INITIAL>23.438 MB</INITIAL>
<COMITTED>23.438 MB</COMITTED>
<USED>7281.2 KB</USED>
<TOTAL>130.00 MB</TOTAL>
</NON_HEAP>
</MEMORY_STATS>
</output>
</nds>


Well that is handy, looks just like an XDS event, and shows us heap and non-heap values. You may recall an article I wrote a long time ago that discussed how you might do this in policy. (Though it violates the XDS DTD, which is fine, but but that is ok.

http://www.novell.com/communities/node/5033/reading-and-displaying-value-java-heap-identity-manager-rules

Basically you call a Java function that returns the memory in use. That worked if you wanted to know the values inside a policy, and I used that often, especially in large systems, since it those are places where you might actually have to increase the default heap of 64 Megs higher. IDM is surprisingly efficient and the default of 64 megs was sufficient for surprisingly large systems. But you will one day hit a point where you need to go higher.

On large system, I often find I set up a driver that basically writes out the heap stack sizes to a file, so I can graph it in Excel and see if there was a pattern.

Here we have a value you can query in a script which can be helpful. You can imagine how you could now extend the Nagios plugin, to retrieve these stats and start warning you if you are running high on heap. Be much nicer to know this is happening in advance from your monitoring tool than to have it happen in the field when you are not expecting it.

If you go get the Nagios monitoring script, you can see how this works.

Just grabbing a sample line, it says:
DXCMD_OUTPUT=`$DXCMD -user "$USERNDAP" -password "$PASSWD" -getdriverstats "$DRV_NDAP" $STATFILE 2>>$LOGFILE`

It builds variables DXCMD (path to the file), $USERNDAP (user DN in period notation), $PASSWD (password) and then calls the -getdriverstats for the $DRV_NDAP (driver DN in dot format) to STATFILE (Name of temp file).

You can imagine changing this to also add in the Java stats. Then of course you have to parse them for what you find interesting. Alas, if you look you will see that it tells you the TOTAL and USED values, but not a FREE value. So you will have to do the math in Nagios instead.

The next option (3, Thread Stats) is probably not that helpful in terms of monitoring but has some interesting information for troubleshooting. I guess the number of threads, and th epeak threads would be interesting, but not quite alot that is workable. (Amusing that the first in the list is probably dxcmd getting this info since the top of the stack is: sun.management.ThreadImpl.dumpThreads0 )

<THREAD_STATS>
<DAEMON_COUNT>3</DAEMON_COUNT>
<CURRENT_COUNT>8</CURRENT_COUNT>
<PEAK_COUNT>8</PEAK_COUNT>
<TOTAL_STARTED_COUNT>10</TOTAL_STARTED_COUNT>
<THREAD_INFO>
<THREAD ID="13" LOCK="" NAME="Thread-4" STATE="RUNNABLE" WAIT_TIME="-1 ms">
<STACKTRACE>sun.management.ThreadImpl.dumpThreads0(Native Method)
sun.management.ThreadImpl.getThreadInfo(ThreadImpl.java:440)
com.novell.nds.dirxml.engine.verb.GetJVMStatistics.getThreadInfo(GetJVMStatistics.java:280)
com.novell.nds.dirxml.engine.verb.GetJVMStatistics.processSubVerb(GetJVMStatistics.java:133)
com.novell.nds.dirxml.engine.verb.DirXMLVerbs$GetVerbHandler.processVerb(DirXMLVerbs.java:640)
com.novell.nds.dhutil.VerbProcessor$HandlerThread.run(VerbProcessor.java:507)
java.lang.Thread.run(Thread.java:745)
</STACKTRACE>
</THREAD>
<THREAD ID="11" LOCK="" NAME="Thread-2" STATE="RUNNABLE" WAIT_TIME="-1 ms">
<STACKTRACE>com.novell.nds.events.EventNotification.processEvents(Native Method)
com.novell.nds.events.EventNotification.access$500(EventNotification.java:56)
com.novell.nds.events.EventNotification$EventThread.run(EventNotification.java:1149)
java.lang.Thread.run(Thread.java:745)
</STACKTRACE>
</THREAD>
<THREAD ID="10" LOCK="" NAME="Thread-1" STATE="RUNNABLE" WAIT_TIME="-1 ms">
<STACKTRACE>
com.novell.nds.events.EventNotification.processEvents(Native Method)
com.novell.nds.events.EventNotification.access$500(EventNotification.java:56)
com.novell.nds.events.EventNotification$EventThread.run(EventNotification.java:1149)
java.lang.Thread.run(Thread.java:745)
</STACKTRACE>
</THREAD>
<THREAD ID="9" LOCK="" NAME="Thread-0" STATE="RUNNABLE" WAIT_TIME="-1 ms">
<STACKTRACE>
com.novell.nds.dhutil.VerbProcessor.waitForVerbs(Native Method)
com.novell.nds.dhutil.VerbProcessor.access$100(VerbProcessor.java:77)
com.novell.nds.dhutil.VerbProcessor$JNIThread.run(VerbProcessor.java:461)
java.lang.Thread.run(Thread.java:745)
</STACKTRACE>
</THREAD>
<THREAD ID="8" LOCK="" NAME="DirXML" STATE="RUNNABLE" WAIT_TIME="-1 ms">
<STACKTRACE>
com.novell.nds.dirxml.engine.DirXML.waitToExit(Native Method)
com.novell.nds.dirxml.engine.DirXML.run(DirXML.java:343)
java.lang.Thread.run(Thread.java:745)
</STACKTRACE>
</THREAD>
<THREAD ID="4" LOCK="" NAME="Signal Dispatcher" STATE="RUNNABLE" WAIT_TIME="-1 ms">
<STACKTRACE>
</STACKTRACE>
</THREAD>
<THREAD ID="3" LOCK="java.lang.ref.ReferenceQueue$Lock@221bcd1b" NAME="Finalizer" STATE="WAITING" WAIT_TIME="-1 ms">
<STACKTRACE>
java.lang.Object.wait(Native Method)
java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:135)
java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:151)
java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:209)
</STACKTRACE>
</THREAD>
<THREAD ID="2" LOCK="java.lang.ref.Reference$Lock@4f36b91b" NAME="Reference Handler" STATE="WAITING" WAIT_TIME="-1 ms">
<STACKTRACE>
java.lang.Object.wait(Native Method)
java.lang.Object.wait(Object.java:503)
java.lang.ref.Reference$ReferenceHandler.run(Reference.java:133)
</STACKTRACE>
</THREAD>
</THREAD_INFO>
</THREAD_STATS>


Option 4 (Runtime stats) is sort of interesting as well. More for troubleshooting, less for monitoring. I trimmed out a bunch of options to make this more readable (Full output will be at the bottom of this article). I figured I would leave the mostly interesting ones here instead.

<RUNTIME_STATS>
<START_TIME>Fri Apr 03 13:55:57 EDT 2015</START_TIME>
<UPTIME>18 seconds 831 milliseconds</UPTIME>
<SYSTEM_PROPERTIES>
<PROPERTY><NAME>java.vm.version</NAME>
<VALUE>24.65-b04</VALUE>
</PROPERTY>
<PROPERTY>
<NAME>sun.jnu.encoding</NAME>
<VALUE>UTF-8</VALUE>
</PROPERTY>
<PROPERTY>
<NAME>user.dir</NAME>
<VALUE>/var/opt/novell/eDirectory/data/data/dib</VALUE>
</PROPERTY>
<PROPERTY>
<NAME>java.version</NAME>
<VALUE>1.7.0_65</VALUE>
</PROPERTY>
<PROPERTY>
<NAME>java.vm.vendor</NAME>
<VALUE>Oracle Corporation</VALUE>
</PROPERTY>
<PROPERTY>
<NAME>java.class.path</NAME>
<VALUE>/opt/novell/eDirectory/lib64/nds-modules/jre/lib/javaws.jar:/opt/novell/eDirectory/lib64/nds-modules/jre/lib/management-agent.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/mail.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/SentinelRESTShim.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/jms.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/NxSettings.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes
... Hundreds of lines deleted....
</VALUE>
</PROPERTY>
<PROPERTY>
<NAME>java.runtime.version</NAME>
<VALUE>1.7.0_65-b17</VALUE>
</PROPERTY>
<PROPERTY>
<NAME>java.vm.name</NAME>
<VALUE>Java HotSpot(TM) 64-Bit Server VM</VALUE>
</PROPERTY>
<PROPERTY>
<NAME>java.home</NAME>
<VALUE>/opt/novell/eDirectory/lib64/nds-modules/jre</VALUE>
</PROPERTY>
<PROPERTY>
<NAME>user.timezone</NAME>
<VALUE>America/New_York</VALUE>
</PROPERTY>
<PROPERTY>
<NAME>os.name</NAME>
<VALUE>Linux</VALUE>
</PROPERTY>
<PROPERTY>
<NAME>os.version</NAME>
<VALUE>2.6.32-504.3.3.el6.x86_64</VALUE>
</PROPERTY>
</SYSTEM_PROPERTIES>
</RUNTIME_STATS>


You can get the runtime version, the class path, the time zone, the OS and version, and much much more. Start time and uptime are pretty interesting. Useful for tracking when you last restarted the IDM engine. Now I wonder if this is reporting the eDirectory instance, or the IDM engine uptime. My guess is probably the JVM uptime. In 'ndstrace', you can use the 'modules' command to see what modules are loaded inside eDirectory, and the 'unload dxevent' or 'unload vrdim' to kill the IDM engine. However I am not sure if that unloads the JVM or not. So probably this is the JVM uptime, but it should be almost synonymous with the eDirectory instances uptime.

Beyond figuring out what platform you are running on, which is helpful, I think the class path item is probably the most useful. There are many times where you get a class not found error, or the class you are expecting is not quite loading. Well you can see the class path of the running IDM instance, without restarting a driver to get it in trace.

There are many times when I am sure my Java class should be in the path, I know the file, but it just does not seem to load. This would confirm that it is really loaded or not. If you are worried you have the wrong bit depth of the JVM in use, this can help identify it. I suppose if you were concerned about JVM versions for some security patch you could assess them this way as well.

Option 5, Operating System looks something like this:

<OPERATING_SYSTEM_STATS>
<NAME>Linux</NAME>
<VERSION>2.6.32-504.3.3.el6.x86_64</VERSION>
<ARCH>amd64</ARCH>
<PROCESSORS>2</PROCESSORS>
<AVERAGE_LOAD>0.32</AVERAGE_LOAD>
</OPERATING_SYSTEM_STATS>


Usefulf for inventorying IDM systems. Some of this is in the previous settings, but here they are, all together. Average Load is kind of neat. How busy is the machine. Now Nagios can track that separately so not useful in that case, but if you were using this in a different tool perhaps this would be useful.


Option 6, Classloader looks something like this:

<CLASSLOADER_STATS>
<LOADED_CLASS_COUNT>1011</LOADED_CLASS_COUNT>
<UNLOADED_CLASS_COUNT>0</UNLOADED_CLASS_COUNT>
<TOTAL_LOADED_CLASS_COUNT>1011</TOTAL_LOADED_CLASS_COUNT>
</CLASSLOADER_STATS>


I am not sure how useful this set would be. I suppose if you compared the loaded class count between two systems that could be helpful if you are not sure if your class is properly loading. Interesting from a statistic, but not sure how useful in the real world. I think the size of the loaded classes would be more useful. One of the memory settings in Java is something called permgen. This is the space that the loaded class reside it, regardless of if they are run or not. In general 256 Megs, the default should be plenty fine as permgen space. But it is possible with too many classes loaded to actually exceed that size. Reporting the size here would have been helpful in diagnosing that sort of problem. Though to be fair I have never seen this issue actually come up in production. (Not unless I did something stupid like set permgen down to 64 Megs so I could eke out more heap size on a 32 bit system. That was dumb in hindsight.) I wonder if the Non-Heap memory in the first category is referring to permgen space. If so, then it would be redundant here.

Option 7, Garbage Collection Stats look like this:


<GARBAGE_COLLECTION_STATS>
<COLLECTOR>
<NAME>PS Scavenge</NAME>
<COLLECTION_COUNT>1</COLLECTION_COUNT>
<COLLECTION_TIME>16 ms</COLLECTION_TIME>
</COLLECTOR>
<COLLECTOR>
<NAME>PS MarkSweep</NAME>
<COLLECTION_COUNT>0</COLLECTION_COUNT>
<COLLECTION_TIME>0 ms</COLLECTION_TIME>
</COLLECTOR>
</GARBAGE_COLLECTION_STATS>


I know that Java garbage collection can be complicated. I read about it once, and it was interesting. Key thing is collection time. You want that not to be very long, since the JVM pretty much pauses for the duration of the GC. Also, if the GC time exceeds some Java default value, it throws an error and kills itself. Which is maddening. Try again, or if possible clean up some of it, then on the next pass get the rest, don't just take a poison pill. Seriously, whose idea was that?

Anyway, as you can see 'dxcmd' is a pretty useful little tool, and the new Java stats feature is handy as well. Let me know if you find any interesting settings in there I did not discuss in the comments. The more the merrier.

Here is the entire output properly formatted in XML. A good reference but very wordy.

<nds dtdversion="4.0" ndsversion="8.x">
<source>
<product edition="Advanced" version="4.5.0.2">DirXML</product>
<contact>NetIQ Corporation</contact>
</source>
<output>
<MEMORY_STATS>
<HEAP>
<INITIAL>128.00 MB</INITIAL>
<COMITTED>123.50 MB</COMITTED>
<USED>14.251 MB</USED>
<TOTAL>455.00 MB</TOTAL>
</HEAP>
<NON_HEAP>
<INITIAL>23.438 MB</INITIAL>
<COMITTED>23.438 MB</COMITTED>
<USED>7281.2 KB</USED>
<TOTAL>130.00 MB</TOTAL>
</NON_HEAP>
</MEMORY_STATS>

<THREAD_STATS>
<DAEMON_COUNT>3</DAEMON_COUNT>
<CURRENT_COUNT>8</CURRENT_COUNT>
<PEAK_COUNT>8</PEAK_COUNT>
<TOTAL_STARTED_COUNT>10</TOTAL_STARTED_COUNT>
<THREAD_INFO>
<THREAD ID="13" LOCK="" NAME="Thread-4" STATE="RUNNABLE" WAIT_TIME="-1 ms">
<STACKTRACE>sun.management.ThreadImpl.dumpThreads0(Native Method)
sun.management.ThreadImpl.getThreadInfo(ThreadImpl.java:440)
com.novell.nds.dirxml.engine.verb.GetJVMStatistics.getThreadInfo(GetJVMStatistics.java:280)
com.novell.nds.dirxml.engine.verb.GetJVMStatistics.processSubVerb(GetJVMStatistics.java:133)
com.novell.nds.dirxml.engine.verb.DirXMLVerbs$GetVerbHandler.processVerb(DirXMLVerbs.java:640)
com.novell.nds.dhutil.VerbProcessor$HandlerThread.run(VerbProcessor.java:507)
java.lang.Thread.run(Thread.java:745)
</STACKTRACE>
</THREAD>
<THREAD ID="11" LOCK="" NAME="Thread-2" STATE="RUNNABLE" WAIT_TIME="-1 ms">
<STACKTRACE>com.novell.nds.events.EventNotification.processEvents(Native Method)
com.novell.nds.events.EventNotification.access$500(EventNotification.java:56)
com.novell.nds.events.EventNotification$EventThread.run(EventNotification.java:1149)
java.lang.Thread.run(Thread.java:745)
</STACKTRACE>
</THREAD>
<THREAD ID="10" LOCK="" NAME="Thread-1" STATE="RUNNABLE" WAIT_TIME="-1 ms">
<STACKTRACE>com.novell.nds.events.EventNotification.processEvents(Native Method)
com.novell.nds.events.EventNotification.access$500(EventNotification.java:56)
com.novell.nds.events.EventNotification$EventThread.run(EventNotification.java:1149)
java.lang.Thread.run(Thread.java:745)
</STACKTRACE>
</THREAD>
<THREAD ID="9" LOCK="" NAME="Thread-0" STATE="RUNNABLE" WAIT_TIME="-1 ms">
<STACKTRACE>
com.novell.nds.dhutil.VerbProcessor.waitForVerbs(Native Method)
com.novell.nds.dhutil.VerbProcessor.access$100(VerbProcessor.java:77)
com.novell.nds.dhutil.VerbProcessor$JNIThread.run(VerbProcessor.java:461)
java.lang.Thread.run(Thread.java:745)
</STACKTRACE>
</THREAD>
<THREAD ID="8" LOCK="" NAME="DirXML" STATE="RUNNABLE" WAIT_TIME="-1 ms">
<STACKTRACE>
com.novell.nds.dirxml.engine.DirXML.waitToExit(Native Method)
com.novell.nds.dirxml.engine.DirXML.run(DirXML.java:343)
java.lang.Thread.run(Thread.java:745)
</STACKTRACE>
</THREAD>
<THREAD ID="4" LOCK="" NAME="Signal Dispatcher" STATE="RUNNABLE" WAIT_TIME="-1 ms">
<STACKTRACE>
</STACKTRACE>
</THREAD>
<THREAD ID="3" LOCK="java.lang.ref.ReferenceQueue$Lock@221bcd1b" NAME="Finalizer" STATE="WAITING" WAIT_TIME="-1 ms">
<STACKTRACE>
java.lang.Object.wait(Native Method)
java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:135)
java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:151)
java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:209)
</STACKTRACE>
</THREAD>
<THREAD ID="2" LOCK="java.lang.ref.Reference$Lock@4f36b91b" NAME="Reference Handler" STATE="WAITING" WAIT_TIME="-1 ms">
<STACKTRACE>
java.lang.Object.wait(Native Method)
java.lang.Object.wait(Object.java:503)
java.lang.ref.Reference$ReferenceHandler.run(Reference.java:133)
</STACKTRACE>
</THREAD>
</THREAD_INFO>
</THREAD_STATS>
<RUNTIME_STATS>
<START_TIME>Fri Apr 03 13:55:57 EDT 2015</START_TIME>
<UPTIME>18 seconds 831 milliseconds</UPTIME>
<SYSTEM_PROPERTIES>
<PROPERTY><NAME>java.vm.version</NAME>
<VALUE>24.65-b04</VALUE>
</PROPERTY>
<PROPERTY>
<NAME>sun.jnu.encoding</NAME>
<VALUE>UTF-8</VALUE>
</PROPERTY>
<PROPERTY>
<NAME>java.vendor.url</NAME>
<VALUE>http://java.oracle.com/</VALUE>
</PROPERTY>
<PROPERTY>
<NAME>java.vm.info</NAME>
<VALUE>mixed mode</VALUE>
</PROPERTY>
<PROPERTY>
<NAME>user.dir</NAME>
<VALUE>/var/opt/novell/eDirectory/data/data/dib</VALUE>
</PROPERTY>
<PROPERTY>
<NAME>sun.cpu.isalist</NAME>
<VALUE/>
</PROPERTY>
<PROPERTY>
<NAME>java.awt.graphicsenv</NAME>
<VALUE>sun.awt.X11GraphicsEnvironment</VALUE>
</PROPERTY>
<PROPERTY>
<NAME>sun.os.patch.level</NAME>
<VALUE>unknown</VALUE>
</PROPERTY>
<PROPERTY>
<NAME>java.io.tmpdir</NAME>
<VALUE>/tmp</VALUE>
</PROPERTY>
<PROPERTY>
<NAME>user.home</NAME>
<VALUE>/root</VALUE>
</PROPERTY>
<PROPERTY>
<NAME>java.awt.printerjob</NAME>
<VALUE>sun.print.PSPrinterJob</VALUE>
</PROPERTY>
<PROPERTY>
<NAME>java.version</NAME>
<VALUE>1.7.0_65</VALUE>
</PROPERTY>
<PROPERTY>
<NAME>file.encoding.pkg</NAME>
<VALUE>sun.io</VALUE>
</PROPERTY>
<PROPERTY>
<NAME>java.vendor.url.bug</NAME>
<VALUE>http://bugreport.sun.com/bugreport/</VALUE>
</PROPERTY>
<PROPERTY>
<NAME>file.encoding</NAME>
<VALUE>UTF-8</VALUE>
</PROPERTY>
<PROPERTY>
<NAME>line.separator</NAME>
<VALUE>
</VALUE>
</PROPERTY>
<PROPERTY>
<NAME>java.vm.specification.vendor</NAME>
<VALUE>Oracle Corporation</VALUE>
</PROPERTY>
<PROPERTY>
<NAME>java.vm.vendor</NAME>
<VALUE>Oracle Corporation</VALUE>
</PROPERTY>
<PROPERTY>
<NAME>java.class.path</NAME>
<VALUE>/opt/novell/eDirectory/lib64/nds-modules/jre/lib/javaws.jar:/opt/novell/eDirectory/lib64/nds-modules/jre/lib/management-agent.jar:/opt/novell/eDirectory/lib64/nds-modules/jre/lib/charsets.jar:/opt/novell/eDirectory/lib64/nds-modules/jre/lib/alt-rt.jar:/opt/novell/eDirectory/lib64/nds-modules/jre/lib/plugin.jar:/opt/novell/eDirectory/lib64/nds-modules/jre/lib/jfr.jar:/opt/novell/eDirectory/lib64/nds-modules/jre/lib/jfxrt.jar:/opt/novell/eDirectory/lib64/nds-modules/jre/lib/deploy.jar:/opt/novell/eDirectory/lib64/nds-modules/jre/lib/resources.jar:/opt/novell/eDirectory/lib64/nds-modules/jre/lib/rt.jar:/opt/novell/eDirectory/lib64/nds-modules/jre/lib/jsse.jar:/opt/novell/eDirectory/lib64/nds-modules/jre/lib/jce.jar:/opt/novell/eDirectory/lib64/nds-modules/jre/lib/ext/sunjce_provider.jar:/opt/novell/eDirectory/lib64/nds-modules/jre/lib/ext/sunpkcs11.jar:/opt/novell/eDirectory/lib64/nds-modules/jre/lib/ext/localedata.jar:/opt/novell/eDirectory/lib64/nds-modules/jre/lib/ext/zipfs.jar:/opt/novell/eDirectory/lib64/nds-modules/jre/lib/ext/dnsns.jar:/opt/novell/eDirectory/lib64/nds-modules/jre/lib/ext/sunec.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/collections.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/activation.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/MSGatewayDriverShim.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/gdata-client-meta-1.0.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/idmcp.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/triggerjob.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/JMSShim.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/gdata-appsforyourdomain-1.0.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/js.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/EdirDriverShim.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/saaj-api.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/Smc.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/NPUMDriverShim.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/shimwrapper.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/SAPBLShim.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/gdata-client-1.0.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/NPUM_api.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/nulldriver.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/jackson-core-asl-1.9.13.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/xcd-all.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/j2eevalidate.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/jntls.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/loopback.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/XDS.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/xercesImpl.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/wssdk.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/CommonDriverShim.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/commons-codec-1.3.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/SAPPortalShim.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/WorkOrder.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/xmlsec.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/jsso.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/xpp3.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/opencsv-2.1.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/adutil.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/ManualTaskServiceBase.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/dhutil.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/dirxml_misc.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/wss4j-1.6.6.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/jetty-all-9.0.7.v20131107.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/DelimitedTextUtil.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/dxjetty.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/xp.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/jclient.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/EBSTCAShim.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/npki.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/SAPGRCACShim.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/gdata-appsforyourdomain-meta-1.0.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/guava-11.0.2.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/sungardbannershim.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/bcprov-jdk15on-150.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/JDBCUtil.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/xconfig.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/passgenjob.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/EBSHRShim.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/afadmin.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/dirxmlcomps.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/mapdb.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/psoftshim.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/SOAPShim.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/MSGatewayCommon.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/dirxml_remote.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/commons-logging.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/idprovider.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/gdata-contacts-3.0.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/LDAPUtil.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/jettison-1.2.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/ejb.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/nxsl.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/jackson-jaxrs-1.9.13.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/SOAPUtil.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/telemetry.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/commons-httpclient.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/SAPHRShim.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/nrfdriver.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/ARSDriver75.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/jaxrpc-api.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/javax-xml-soap-1.6.0.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/pwdexpjob.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/DelimitedTextShim.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/NotesDriverShim.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/arshim.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/LDAPShim.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/jnet.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/jsr311-api-1.1.1.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/NdsToNds.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/jco3environment.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/ldap.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/init-idm-resources.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/sentinel-client-base-java.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/EBSUserShim.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/ComposerDriverShim.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/novlact.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/ManualTaskServiceShim.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/Blackboard.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/concurrentlinkedhashmap-lru-1.2.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/JDBCShim.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/gdata-base-1.0.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/gdata-contacts-meta-3.0.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/jackson-mapper-asl-1.9.13.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/JDBCConfig.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/sentinel-client-base.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/EntitlementServiceShim.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/schdrvjob.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/dirxml.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/SalesforceShim.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/srvprvUAD.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/dcsshim.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/sapumshim.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/ksutil.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/servlet-api-3.1.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/gmailshim.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/jsso-prov.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/gdata-core-1.0.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/ckdrvhealthjob.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/log4j.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/sentinel-client-beans.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/jersey-bundle-1.18.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/zOS.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/EBSShim.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/mail.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/SentinelRESTShim.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/jms.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes/NxSettings.jar:/opt/novell/eDirectory/lib64/../lib/dirxml/classes
</VALUE>
</PROPERTY>
<PROPERTY>
<NAME>sun.io.unicode.encoding</NAME>
<VALUE>UnicodeLittle</VALUE>
</PROPERTY>
<PROPERTY>
<NAME>com.novell.xml.dom.check-names</NAME>
<VALUE>false</VALUE>
</PROPERTY>
<PROPERTY>
<NAME>os.arch</NAME>
<VALUE>amd64</VALUE>
</PROPERTY>
<PROPERTY>
<NAME>java.protocol.handler.pkgs</NAME>
<VALUE>com.novell.nds.dirxml.engine.url</VALUE>
</PROPERTY>
<PROPERTY>
<NAME>user.name</NAME>
<VALUE>root</VALUE>
</PROPERTY>
<PROPERTY>
<NAME>user.language</NAME>
<VALUE>en</VALUE>
</PROPERTY>
<PROPERTY>
<NAME>java.runtime.version</NAME>
<VALUE>1.7.0_65-b17</VALUE>
</PROPERTY>
<PROPERTY>
<NAME>sun.boot.class.path</NAME>
<VALUE>/opt/novell/eDirectory/lib64/nds-modules/jre/lib//javaws.jar:/opt/novell/eDirectory/lib64/nds-modules/jre/lib//management-agent.jar:/opt/novell/eDirectory/lib64/nds-modules/jre/lib//charsets.jar:/opt/novell/eDirectory/lib64/nds-modules/jre/lib//alt-rt.jar:/opt/novell/eDirectory/lib64/nds-modules/jre/lib//plugin.jar:/opt/novell/eDirectory/lib64/nds-modules/jre/lib//jfr.jar:/opt/novell/eDirectory/lib64/nds-modules/jre/lib//jfxrt.jar:/opt/novell/eDirectory/lib64/nds-modules/jre/lib//deploy.jar:/opt/novell/eDirectory/lib64/nds-modules/jre/lib//resources.jar:/opt/novell/eDirectory/lib64/nds-modules/jre/lib//rt.jar:/opt/novell/eDirectory/lib64/nds-modules/jre/lib//jsse.jar:/opt/novell/eDirectory/lib64/nds-modules/jre/lib//jce.jar</VALUE>
</PROPERTY>
<PROPERTY>
<NAME>sun.cpu.endian</NAME>
<VALUE>little</VALUE>
</PROPERTY>
<PROPERTY>
<NAME>awt.toolkit</NAME>
<VALUE>sun.awt.X11.XToolkit</VALUE>
</PROPERTY>
<PROPERTY>
<NAME>sun.boot.library.path</NAME>
<VALUE>/opt/novell/eDirectory/lib64/nds-modules/jre1.7.0_65/lib/amd64</VALUE>
</PROPERTY>
<PROPERTY>
<NAME>java.vm.name</NAME>
<VALUE>Java HotSpot(TM) 64-Bit Server VM</VALUE>
</PROPERTY>
<PROPERTY>
<NAME>java.home</NAME>
<VALUE>/opt/novell/eDirectory/lib64/nds-modules/jre</VALUE>
</PROPERTY>
<PROPERTY>
<NAME>java.endorsed.dirs</NAME>
<VALUE>/opt/novell/eDirectory/lib64/nds-modules/jre/lib/endorsed</VALUE>
</PROPERTY>
<PROPERTY>
<NAME>novell.jclient.libraryName</NAME>
<VALUE>jclnt</VALUE>
</PROPERTY>
<PROPERTY>
<NAME>sun.management.compiler</NAME>
<VALUE>HotSpot 64-Bit Tiered Compilers</VALUE>
</PROPERTY>
<PROPERTY>
<NAME>java.runtime.name</NAME>
<VALUE>Java(TM) SE Runtime Environment</VALUE>
</PROPERTY>
<PROPERTY>
<NAME>java.library.path</NAME><VALUE>/opt/novell/eDirectory/lib64/nds-modules/jre/lib/amd64/native_threads:/opt/novell/eDirectory/lib64/nds-modules/jre/lib/amd64:/opt/novell/eDirectory/lib64/apr://opt/novell/eDirectory/lib64/nds-modules/jre/lib/amd64://opt/novell/eDirectory/lib64/nds-modules/jre/lib/amd64/server://opt/novell/eDirectory/lib64/nds-modules/jre/lib/amd64/native_threads::/opt/novell/eDirectory/lib64:/opt/novell/eDirectory/lib64/nds-modules:/opt/novell/eDirectory/lib64/apr://opt/novell/lib64:/opt/novell/lib64::/usr/lib/nds-modules:/opt/novell/xad/lib64/nds-modules:/opt/novell/xad/lib64:/opt/novell/eDirectory/lib/nds-modules/jre/lib/i386:/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib</VALUE>
</PROPERTY>
<PROPERTY>
<NAME>file.separator</NAME>
<VALUE>/</VALUE>
</PROPERTY>
<PROPERTY>
<NAME>java.specification.vendor</NAME>
<VALUE>Oracle Corporation</VALUE>
</PROPERTY>
<PROPERTY>
<NAME>java.vm.specification.version</NAME>
<VALUE>1.7</VALUE>
</PROPERTY>
<PROPERTY>
<NAME>user.timezone</NAME>
<VALUE>America/New_York</VALUE>
</PROPERTY>
<PROPERTY>
<NAME>os.name</NAME>
<VALUE>Linux</VALUE>
</PROPERTY>
<PROPERTY>
<NAME>path.separator</NAME>
<VALUE>:</VALUE>
</PROPERTY>
<PROPERTY>
<NAME>java.ext.dirs</NAME>
<VALUE>/opt/novell/eDirectory/lib64/nds-modules/jre/lib/ext</VALUE>
</PROPERTY>
<PROPERTY>
<NAME>sun.arch.data.model</NAME>
<VALUE>64</VALUE>
</PROPERTY>
<PROPERTY>
<NAME>java.specification.name</NAME>
<VALUE>Java Platform API Specification</VALUE>
</PROPERTY>
<PROPERTY>
<NAME>os.version</NAME>
<VALUE>2.6.32-504.3.3.el6.x86_64</VALUE>
</PROPERTY>
<PROPERTY>
<NAME>user.country</NAME>
<VALUE>US</VALUE>
</PROPERTY>
<PROPERTY>
<NAME>java.class.version</NAME>
<VALUE>51.0</VALUE>
</PROPERTY>
<PROPERTY>
<NAME>java.vendor</NAME>
<VALUE>Oracle Corporation</VALUE>
</PROPERTY>
<PROPERTY>
<NAME>java.vm.specification.name</NAME>
<VALUE>Java Virtual Machine Specification</VALUE></PROPERTY>
<PROPERTY>
<NAME>java.specification.version</NAME>
<VALUE>1.7</VALUE>
</PROPERTY>
</SYSTEM_PROPERTIES>
</RUNTIME_STATS>
<OPERATING_SYSTEM_STATS>
<NAME>Linux</NAME>
<VERSION>2.6.32-504.3.3.el6.x86_64</VERSION>
<ARCH>amd64</ARCH>
<PROCESSORS>2</PROCESSORS>
<AVERAGE_LOAD>0.32</AVERAGE_LOAD>
</OPERATING_SYSTEM_STATS>
<CLASSLOADER_STATS>
<LOADED_CLASS_COUNT>1011</LOADED_CLASS_COUNT>
<UNLOADED_CLASS_COUNT>0</UNLOADED_CLASS_COUNT>
<TOTAL_LOADED_CLASS_COUNT>1011</TOTAL_LOADED_CLASS_COUNT>
</CLASSLOADER_STATS>
<GARBAGE_COLLECTION_STATS>
<COLLECTOR>
<NAME>PS Scavenge</NAME>
<COLLECTION_COUNT>1</COLLECTION_COUNT>
<COLLECTION_TIME>16 ms</COLLECTION_TIME>
</COLLECTOR>
<COLLECTOR>
<NAME>PS MarkSweep</NAME>
<COLLECTION_COUNT>0</COLLECTION_COUNT>
<COLLECTION_TIME>0 ms</COLLECTION_TIME>
</COLLECTOR>
</GARBAGE_COLLECTION_STATS>
</output>
</nds>


Tags:

Comment List
  • Yep, it's been a while but I decided to post anyhow,
    To get a properly formated XML output from the dxcmd you need to pipe to xmllint --format - while using the quiet mode (-q).

    e.g. for the formated JVM statistics:

    dxcmd -host localhost -port 1524 -user admin.sa.services -q -getjvmstats memory - | xmllint --format -

    results in:

    <?xml version="1.0"?>
    <nds dtdversion="4.0" ndsversion="8.x">
      <source>
        <product edition="Advanced" version="4.8.4.0">DirXML</product>
        <contact>NetIQ Corporation</contact>
      </source>
      <output>
        <memory_stats>
          <heap>
            <initial>1024.0 MB</initial>
            <comitted>1017.5 MB</comitted>
            <used>584.65 MB</used>
            <total>1820.5 MB</total>
          </heap>
          <non_heap>
            <initial>2496.0 KB</initial>
            <comitted>187.50 MB</comitted>
            <used>158.69 MB</used>
            <total>-1.0000 Bytes</total>
          </non_heap>
        </memory_stats>
      </output>
    </nds>

  • "A good reference but very wordy." - you are quite self-descriptive here, Geoffrey! Now can I please get "the entire output properly formatted in XML"? ;-)
Related
Recommended