How to Monitor NetWare Servers Using a Wireless Device “How To” Article

How to Monitor NetWare Servers
Using a Wireless Device
“How To” Article
NOVELL APPNOTES
J. Jeffrey Hanson
Senior eBusiness Architect
Financial Fusion
[email protected]
This article discusses how network administrators can use Java components
shipped by Novell to design and implement network server administration utilities
that can be used from a Web browser or from a wireless device.
Contents:
4
•
Introduction
•
Configuring the Server for Wireless Access
•
Connecting to the Server
•
Monitoring Connections
•
Monitoring Memory
•
Monitoring CPU Usage
•
Monitoring Volume Information
•
Monitoring General Server Health
•
Other Types of Information
Topics
wireless devices, Java Beans, HTML, HDML, WML, Java
Server Pages (JSP)
Products
NetWare, NDS eDirectory
Audience
network designers, administrators, integrators
Level
intermediate
Prerequisite Skills
famiarity with servlet and JSP technologies
Operating System
NetWare
Tools
MVC Beans for eBusiness
Sample Code
yes
www.novell.com/appnotes
Introduction
A network administrator’s job can be a difficult and stressful one. The very life of
a company often times depends on the ability of the IS&T staff to keep the
network running efficiently. As more and more devices and services become
connected, the responsibilities facing network administrators are increasing
exponentially. This is forcing companies to face the need to either increase their
IS&T staff size significantly or to make their existing staff much more efficient.
In this AppNote, we focus on making an IS&T staff more efficient by allowing
them to be virtually more than one place at a time using Novell’s tools and
wireless technologies.
This AppNote will demonstrate how network administrators can use Java
components shipped by Novell to design and implement network server
administration utilities that can be used from a Web browser or from a wireless
device. We will work within a three-tier architecture, using Java server-side
technologies such as servlets and Java Beans to perform command dispatching
and business logic on the middle tier, and Java Beans to access data on the back
end. We will be using Java Beans, HTML, HDML and WML within Java Server
Pages (JSPs) to construct the user interface. We will use the
model-view-controller (MVC) design pattern to avoid inter-code dependencies,
isolate bug fixing, and enable new features and enhancements to be easily
implemented using “plug-in” style techniques. We assume that the reader is
familiar with servlet
and JSP technologies.
Abstracting Design to Avoid Device Dependency
Novell ships a suite of Java components called “MVC Beans for eBusiness” that
provide access to detailed server data. They are also optimized for Web
application development using the MVC design pattern. These components will
be used to implement our business logic, data access, and user interface.
Our applications will begin with an HTTP command/request passed from a client,
such as a Web browser or wireless device, to a Web server or Web application
server. The server is where our business logic components will be used for
command/request handling and our data access components will be used for
accessing server data. Our user interface components will then be used to form the
response as HTML, HDML, or WML and passed back to the Web browser or
wireless device. We can abstract this interaction between the client and server
using the model-view-controller (MVC) pattern.
M a r c h
2 0 0 1
5
The command/request will be handled by a servlet residing within the Web
application environment. This servlet acts as the controller of our Web
application. The controller-servlet reacts to the command/ request by dispatching
it to Java Beans known as “command” beans. The command beans expose the
model of our application and shoulder the responsibility of performing the
business logic for the command/request and retrieving data for the client. The
controller- servlet then uses JSP and Java Beans to format the response, which is
passed to the client in the form of HTML, HDML ,or WML. The combination of
JSP and Java Beans compose the view portion of our application.
Novell’s MVC Beans for eBusiness provide command beans as well as controller
servlets to form the base framework for many types of domains. In the examples
that follow, we will be using Novell’s OS Server command beans to perform
several kinds of network server administration duties.
Configuring the Server for Wireless Access
Our application will use Java servlets to handle requests coming in from clients.
In order to respond to requests made from wireless devices, we must configure
our application server environment to handle mime types defined for HDML and
WML. Before we look at the steps to take to configure for these mime types, let’s
familiarize ourselves with WML and HDML.
WML
WML is based on XML. XML provides the ability to define any arbitrary set of
tags desired. The set of tags is grouped into a Document Type Definition, or DTD.
The DTD used to define WML is located at http://www.wapforum.org/DTD/
wml_1.1.xml. A WML-enabled phone or other wireless device understands how to
handle all tags in the WML DTD.
A WML-page is actually called a Deck. Every Deck contains one or more Cards.
Cards contain a set of elements that display text, display images, respond to
events, gather user input, and so on. (We will not discuss the details of these
elements here.) WML files have an extension of .WML.
The following examples demonstrate a couple of typical WML cards.
6
www.novell.com/appnotes
Simple Example
<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN"
"http://www.wapforum.org/DTD/wml_1.1.xml">
<wml>
<card id="FirstCard" title="Simple Example">
<p>
<!-This is a comment -->
This will be displayed on the phone.
</p>
</card>
</wml>
More Complex Example
<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN"
"http://www.wapforum.org/DTD/wml_1.1.xml">
<wml>
<card id="Logon" title="Logon">
<do type="accept" label="Logon">
<go href="http://www.myserver.com/authenticate"/>
</do>
<p>
UserName:
<select name="username" title="User Name:">
<option value="John Doe">John Doe</option>
<option value="Jane Doe">Jane Doe</option>
<option value="Joe Smith">Joe Smith</option>
<option value="Jane Smith">Jane Smith</option>
</select>
</p>
<p>
Password: <input type="text" name="password"/>
</p>
</card>
</wml>
You must register the proper MIME types with your Web server so that WML
content can be properly processed. The MIME types that need to be registered are
listed in the following table.
Content
MIME type
File Extension
WML document
text/vnd.wap.wml
.wml
Wireless Bitmap Image
image/vnd.wap.wbmp
.wbmp
WMLScript
text/vnd.wap.wmlscript
.wmls
Compiled WML document
application/vnd.wap.wmlc
.wmlc
Compiled WML Script
application/vnd.wap.wmlscriptc
.wmlsc
M a r c h
2 0 0 1
7
The way you configure MIME types is different for disparate Web servers. For
example, here’s how to configure them in Apache or IBM’s HTTP Server.
First, locate the srm.conf file (typically found in /etc/httpd/conf), or .htaccess files
in the directory or directories that you require. Then type in the following:
# WAP MIME Types
AddType text/vnd.wap.wml .wml
AddType image/vnd.wap.wbmp .wbmp
AddType text/vnd.wap.wmlscript .wmls
AddType application/vnd.wap.wmlc .wmlc
AddType application/vnd.wap.wmlscriptc .wmlsc
Save the file and restart Apache.
HDML
As with WML, HDML is defined by Decks and Cards. HDML currently supports
the following types of cards:
•
Display Cards, which are used to display information
•
Non-Display Cards, which are used to execute actions but do not appear on
the display of the device
•
Entry Cards,which are used to display messages and allow a user to enter text
•
Choice Cards, which are used to display a list of options from which the user
can choose
A Deck is the smallest unit of HDML a service can send to a phone. A Deck can
contain one Card or multiple Cards. When an HDML- enabled phone receives a
Deck, it processes the first Card it finds in the Deck. The phone then displays the
information in the Card and allows the user provide a response.
The following example demonstrates a simple HDML deck with one Display
Card.
<HDML VERSION="3.0">
<DISPLAY>
Hello World!
</DISPLAY>
</HDML>
8
www.novell.com/appnotes
To provide an HDML service on your Web server, you must configure your Web
server to serve HDML. Specifically, you must configure it to support the
following MIME types and extensions:
Content
MIME type
File Extension
HDML Document
text/x-hdml
hdml
Bitmap Image
image/bmp
bmp
Connecting to the Server
Novell’s MVC Beans for eBusiness provide a set of OS Command Beans that
work on any NetWare 5.1 server. Connecting to the server becomes a function of
the client-to-server communication and the authentication and authorization
mechanisms available on the server. NDS is a highly optimized and secure service
for authenticating users and obtaining access-control information, allowing
administrators to easily authorize a user for each intended task. Novell’s MVC
Beans for eBusiness provide a comprehensive set of Beans that provide access to
NDS and user authentication information. Securing an over-the-air wireless
transaction is accomplished with the Wireless Transport Layer Security (WTLS),
wireless versions of PKI, Dynamic Proxy Navigation (DPN), and other
technologies. We won’t discuss these technologies in this document.
The following examples demonstrate how an administrator can authenticate a user
and access authorization information for the user to control access to secured
resources on the server:
import javax.servlet.*;
import javax.servlet.http.*;
public class MyEDirServlet extends HttpServlet
{
private com.novell.web.command.beans.edir.AuthenticateEDir authBean = null;
private String treeName = "";
private String context = "";
private String userID = "";
private String password = "";
public void doPost(HttpServletRequest req,
HttpServletResponse res)
throws ServletException, IOException
{
doGet(req, res);
}
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException
{
// if session is new, we need to respond to the client and request the
M a r c h
2 0 0 1
9
// authentication credentials
if ((authBean == null) && (getCredentials() == false)) {
writeAuthenticationResponse(response);
return;
}
if ((authBean = doAuthentication(treeName,
context,
userID,
password)) == null)
{
throw new ServletException("Invalid userID and/or password");
}
storeSessionValues(request);
callJSPPage(request, response);
}
}
boolean getCredentials(HttpServletRequest request)
{
// test credentials retrieved from query parameters and return boolean
// flag accordingly
if ((treeName = request.getParameter("TREE_NAME")) == null) {
return(false);
}
if ((context = request.getParameter("CONTEXT")) == null) {
return(false);
}
if ((userID = request.getParameter("USER_ID")) == null) {
return(false);
}
if ((password = request.getParameter("PASSWORD")) == null) {
return(false);
}
return(true);
}
void
{
//
//
//
//
//
}
writeAuthenticationResponse(HttpServletResponse response)
This method is where the programmer can decide what kind of
authentication mechanism is required and what kind of response
to pass to the client.
The different mechanisms can be basic authentication, certificate
authentication, custom HTML forms, custom WML Cards, etc.
void callJSPPage(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException
{
ServletContext ctx = getServletContext();
ctx.getRequestDispatcher("/mymainpage.jsp").forward(request,
response);
}
10
www.novell.com/appnotes
When we establish the fact that we are working with a new client and that the
authentication credentials have been passed to our servlet, we attempt to
authenticate the client as follows:
public com.novell.web.command.beans.edir.AuthenticateEDir doAuthentication
(String treeName,
String context,
String userName,
String password)
{
com.novell.web.command.beans.edir.AuthenticateEDir authBean =
new com.novell.web.command.beans.edir.AuthenticateEDir();
authBean.setTreeName(treeName);
authBean.setUserContext(context);
authBean.setUserID(userName);
authBean.setUserPassword(password);
try {
authBean.perform();
return authBean;
// user authentication succeeded
} catch(com.novell.web.command.CommandException e) {
}
return null;
// user authentication failed
}
When we are ready to end our session with a user, we use the UnauthenticateEDir
command bean to un-authenticate the user. We do this by passing the saved
AuthenticateEDir bean in as the only input property of the AuthenticateEDir
command bean, then we call the perform method on the bean as follows:
public void doUnauthentication(AuthenticateEDir authBean)
throws ServletException
{
com.novell.web.command.beans.edir.UnauthenticateEDir
cmdBean =
new com.novell.web.command.beans.edir.UnauthenticateEDir();
cmdBean.setAuthenticatedObject(authBean);
try {
cmdBean.perform();
} catch(com.novell.web.command.CommandException e) {
throw new ServletException(e.toString());
}
}
M a r c h
2 0 0 1
11
Maintaining State for Each User
Since the HTTP protocol is stateless (that is, it does not maintain state across
multiple requests from the same user), we need a way to preserve the state of the
user’s session. We do this by exploiting the state-saving mechanism presented to
us by the HttpSession object. The HttpSession object is retrieved from the request
object. Once we retrieve the session object, we can use it to store objects
containing any arbitrary data that we need to keep track of during our session with
each client.
The following example demonstrates how to retrieve the session object and use it
to store an instance of the AuthenticateEDir bean:
void storeSessionValues(HttpServletRequest request)
{
HttpSession session = getSession(request);
// Objects are stored as name/value pairs
session.putValue("authBean", authBean);
}
HttpSession getSession(HttpServletRequest request)
{
HttpSession
session = null;
if (request.isRequestedSessionIdValid()) {
session = request.getSession(false);
} else {
session = request.getSession(true);
}
}
Monitoring Connections
A network administrator must manage the connection usage for each server in
order to better distribute the workload for a particular network or Web site. The
following examples demonstrate how an administrator can collect information
concerning connection usage in order to make smart decisions concerning traffic
distribution and workload management.
12
www.novell.com/appnotes
List Current Connections
<%
com.novell.web.command.beans.os.ListConnections
cmdBean =
new com.novell.web.command.beans.os.ListConnections();
try {
cmdBean.perform();
%>
<p>Connections:</p>
<%
String[]
names = cmdBean.getNames();
if (names != null) {
for (int i = 0; i < names.length; i++) {
%>
<p><%=names[i]%></p>
<%
}
}
} catch(com.novell.web.command.CommandException e) {
%>
<p>CommandException: <%=e.toString()%></p>
<%
}
%>
Count Current Connections
<%
com.novell.web.command.beans.os.CountCurrentConnections
cmdBean =
new com.novell.web.command.beans.os.CountCurrentConnections();
try {
cmdBean.perform();
%>
<p>Connection count: <%=cmdBean.getCount()%></p>
<%
} catch(com.novell.web.command.CommandException e) {
%>
<p>CommandException: <%=e.toString()%></p>
<%
}
%>
Clear Connections That Are Not Currently Logged in
<%
com.novell.web.command.beans.os.ClearAllNotLoggedInConnections
cmdBean =
new com.novell.web.command.beans.os.ClearAllNotLoggedInConnections();
try {
cmdBean.perform();
} catch(com.novell.web.command.CommandException e) {
%>
<p>CommandException: <%=e.toString()%></p>
<%
}
%>
M a r c h
2 0 0 1
13
Broadcast a Message to a Connection
<%
com.novell.web.command.beans.os.BroadcastMessageToConnection
cmdBean =
new com.novell.web.command.beans.os.BroadcastMessageToConnection();
cmdBean.setConnectionName("Admin");
cmdBean.setMessage("How much wood can a woodchuck chuck?");
try {
cmdBean.perform();
} catch(com.novell.web.command.CommandException e) {
%>
<p>CommandException: <%=e.toString()%></p>
<%
}
%>
Broadcast a Message to All Current Connections
<%
com.novell.web.command.beans.os.BroadcastMessageToAll
cmdBean =
new com.novell.web.command.beans.os.BroadcastMessageToAll();
cmdBean.setMessage("Now is the time for all good men...");
try {
cmdBean.perform();
} catch(com.novell.web.command.CommandException e) {
%>
<p>CommandException: <%=e.toString()%></p>
<%
}
%>
Clear One Connection
<%
com.novell.web.command.beans.os.ClearConnection
cmdBean =
new com.novell.web.command.beans.os.ClearConnection();
cmdBean.setConnectionName("NOT_LOGGED_IN");
try {
cmdBean.perform();
} catch(com.novell.web.command.CommandException e) {
%>
<p>CommandException: <%=e.toString()%></p>
<%
}
%>
14
www.novell.com/appnotes
Get the ID for a Connection
<%
com.novell.web.command.beans.os.GetConnectionID
cmdBean =
new com.novell.web.command.beans.os.GetConnectionID();
cmdBean.setConnectionName("Admin");
try {
cmdBean.perform();
%>
<p>Connection ID: <%=Integer.toHexString(cmdBean.getID())%></p>
<%
} catch(com.novell.web.command.CommandException e) {
%>
<p>CommandException: <%=e.toString()%></p>
<%
}
%>
Get the Number of a Connection
<%
com.novell.web.command.beans.os.GetConnectionNumber
cmdBean =
new com.novell.web.command.beans.os.GetConnectionNumber();
cmdBean.setConnectionName("Admin");
try {
cmdBean.perform();
%>
<p>Connection Number: <%=Integer.toHexString(cmdBean.getNumber())%></p>
<%
} catch(com.novell.web.command.CommandException e) {
%>
<p>CommandException: <%=e.toString()%></p>
<%
}
%>
Get the State of a Connection
<%
com.novell.web.command.beans.os.GetConnectionState
cmdBean =
new com.novell.web.command.beans.os.GetConnectionState();
cmdBean.setConnectionName("Admin");
try {
cmdBean.perform();
%>
<p>Connection State: <%=cmdBean.getState()%></p>
<%
} catch(com.novell.web.command.CommandException e) {
%>
<p>CommandException: <%=e.toString()%></p>
<%
}
%>
M a r c h
2 0 0 1
15
Get the Type of a Connection
<%
com.novell.web.command.beans.os.GetConnectionType
cmdBean =
new com.novell.web.command.beans.os.GetConnectionType();
cmdBean.setConnectionName("Admin");
try {
cmdBean.perform();
%>
<p>Connection Type: <%=cmdBean.getType()%></p>
<%
} catch(com.novell.web.command.CommandException e) {
%>
<p>CommandException: <%=e.toString()%></p>
<%
}
%>
Get the Number of Connections Allowed
<%
com.novell.web.command.beans.os.GetMaxConnectionsCount
cmdBean =
new com.novell.web.command.beans.os.GetMaxConnectionsCount();
try {
cmdBean.perform();
%>
<p>Max Connections Count: <%=""+cmdBean.getCount()%></p>
<%
} catch(com.novell.web.command.CommandException e) {
%>
<p>CommandException: <%=e.toString()%></p>
<%
}
%>
Test to See If a Connection Is Currently Logged in
<%
com.novell.web.command.beans.os.IsConnectionLoggedIn
cmdBean =
new com.novell.web.command.beans.os.IsConnectionLoggedIn();
cmdBean.setConnectionName("Admin");
try {
cmdBean.perform();
%>
<p>Is Connection Logged In? <%=""+cmdBean.getResult()%></p>
<%
} catch(com.novell.web.command.CommandException e) {
%>
<p>CommandException: <%=e.toString()%></p>
<%
}
%>
16
www.novell.com/appnotes
Get the Address of a Connection
<%
com.novell.web.command.beans.os.GetConnectionAddress
cmdBean =
new com.novell.web.command.beans.os.GetConnectionAddress();
cmdBean.setConnectionName("Admin");
try {
cmdBean.perform();
}%>
<p>Connection Address: <%=cmdBean.getAddress()%></p>
<%
} catch(com.novell.web.command.CommandException e) {
%>
<p>CommandException: <%=e.toString()%></p>
<%
}
%>
Monitoring Memory
Server memory is a primary concern of a network administrator. Application
performance is greatly affected by the available free memory. The following
examples demonstrate how to track various aspects of server memory usage
which will, in turn, allow better decisions to be made as to application
distribution.
Retrieve the VM Page Count for an Address Space
<%
com.novell.web.command.beans.os.GetAddressSpaceLoadedVMPageCount
cmdBean =
new com.novell.web.command.beans.os.GetAddressSpaceLoadedVMPageCount();
cmdBean.setAddressSpaceName("Java_Kernel_Space");
try {
cmdBean.perform();
%>
<p>Loaded VM Page Count: <%=""+cmdBean.getLoadedVMPageCount()%></p>
<%
} catch(com.novell.web.command.CommandException e) {
%>
<p>CommandException: <%=e.toString()%></p>
<%
}
%>
Retrieve the Locked Page Count for an Address Space
<%
com.novell.web.command.beans.os.GetAddressSpaceLockedPageCount
cmdBean =
new com.novell.web.command.beans.os.GetAddressSpaceLockedPageCount();
cmdBean.setAddressSpaceName("OS");
try {
M a r c h
2 0 0 1
17
cmdBean.perform();
%>
<p>Locked Page Count: <%=""+cmdBean.getLockedPageCount()%></p>
<%
} catch(com.novell.web.command.CommandException e) {
%>
<p>CommandException: <%=e.toString()%></p>
<%
}
%>
Retrieve the Mapped Page Count for an Address Space
<%
com.novell.web.command.beans.os.GetAddressSpaceMappedPageCount
cmdBean =
new com.novell.web.command.beans.os.GetAddressSpaceMappedPageCount();
cmdBean.setAddressSpaceName("OS");
try {
cmdBean.perform();
%>
<p>Mapped Page Count: <%=""+cmdBean.getMappedPageCount()%></p>
<%
} catch(com.novell.web.command.CommandException e) {
%>
<p>CommandException: <%=e.toString()%></p>
<%
}
%>
List the Swap Files for a Volume
<%
com.novell.web.command.beans.os.GetVolumeSwapFiles
cmdBean =
new com.novell.web.command.beans.os.GetVolumeSwapFiles();
cmdBean.setVolumeName("SYS");
try {
cmdBean.perform();
%>
<p>Volume Swap Files:</p>
<%
int[]
indexes = cmdBean.getIndexes();
if (indexes != null) {
for (int i = 0; i < indexes.length; i++) {
%>
<p><%=""+indexes[i]%></p>
<%
}
}
} catch(com.novell.web.command.CommandException e) {
%>
<p>CommandException: <%=e.toString()%></p>
<%
}
%>
18
www.novell.com/appnotes
Retrieve the Swap File Data for a Volume
<%
com.novell.web.command.beans.os.GetVolumeSwapFileInfo
cmdBean =
new com.novell.web.command.beans.os.GetVolumeSwapFileInfo();
cmdBean.setVolumeName("SYS");
cmdBean.setIndex(0);
try {
cmdBean.perform();
%>
<p>VolumeSize: <%=""+cmdBean.getVolumeSize()%></p>
<p>VolumeFreeSpace: <%=""+cmdBean.getVolumeFreeSpace()%></p>
<p>SwapFileSize: <%=""+cmdBean.getSwapFileSize()%></p>
<p>SwapUsed: <%=""+cmdBean.getSwapUsed()%></p>
<p>SwapMin: <%=""+cmdBean.getSwapMin()%></p>
<p>SwapMax: <%=""+cmdBean.getSwapMax()%></p>
<p>SwapMinFree: <%=""+cmdBean.getSwapMinFree()%></p>
<%
} catch(com.novell.web.command.CommandException e) {
%>
<p>CommandException: <%=e.toString()%></p>
<%
}
%>
Monitoring CPU Usage
A network administrator needs to be able to monitor the workload being applied
against a given CPU for a given server and distribute traffic as needed to keep the
CPU of the server working as efficiently as possible. The following examples
provides information to the administrator about the CPU to help the administrator
decide when traffic redistribution is needed.
Retrieve Free Receive Buffer Count for a CPU
<%
com.novell.web.command.beans.os.GetHealthStatValue
cmdBean =
new com.novell.web.command.beans.os.GetHealthStatValue();
cmdBean.setHealthStatName("perCpuFreeRcvBufferCnt");
try {
cmdBean.perform();
%>
<p>CPU Free Receive Buffer Count: <%=""+cmdBean.getValue()%></p>
<%
} catch(com.novell.web.command.CommandException e) {
%>
<p>CommandException: <%=e.toString()%></p>
<%
}
%>
M a r c h
2 0 0 1
19
Monitoring Volume Information
Another vital responsibility of a network administrator is monitoring the volume
information pertaining to each server and using the capabilities of each volume as
efficiently as possible. Distributed/ Web development depends more and more on
being able to distribute workload across servers and volumes. The following
examples demonstrate beans and services that enable network administrators to
obtain information about the volumes of a given server in order to make decisions
concerning workload, volume-size modifications, and so on.
List Volumes
<%
com.novell.web.command.beans.os.ListVolumes
cmdBean =
new com.novell.web.command.beans.os.ListVolumes();
try {
cmdBean.perform();
%>
<p>Volumes:</p>
<%
String[]
names = cmdBean.getNames();
if (names != null) {
for (int i = 0; i < names.length; i++) {
%>
<p><%=names[i]%></p>
<%
}
}
} catch(com.novell.web.command.CommandException e) {
%>
<p>CommandException: <%=e.toString()%></p>
<%
}
%>
List Partition Segments for a Volume
<%
com.novell.web.command.beans.os.GetVolumePartitionSegments
cmdBean =
new com.novell.web.command.beans.os.GetVolumePartitionSegments();
cmdBean.setVolumeName("SYS");
try {
cmdBean.perform();
%>
<p>Volume Partition Segments:</p>
<%
String[]
names = cmdBean.getNames();
if (names != null) {
for (int i = 0; i < names.length; i++) {
%>
<p><%=names[i]%></p>
<%
}
}
} catch(com.novell.web.command.CommandException e) {
20
www.novell.com/appnotes
%>
<p>CommandException: <%=e.toString()%></p>
<%
}
%>
Retrieve Volume Partition Segment Data
<%
com.novell.web.command.beans.os.GetVolumePartitionSegmentInfo
cmdBean =
new com.novell.web.command.beans.os.GetVolumePartitionSegmentInfo();
cmdBean.setVolumeName("SYS");
cmdBean.setPartitionSegmentName("DOS Partitioned Media");
try {
cmdBean.perform();
%>
<p>Number: <%=""+cmdBean.getNumber()%>;</p>
<p>Type: <%=cmdBean.getType()%></p>
<p>Owner: <%=""+cmdBean.getOwner()%></p>
<p>Capacity: <%=""+cmdBean.getCapacity()%></p>
<p>SlotNumber: <%=""+cmdBean.getSlotNumber()%></p>
<p>PartitionType: <%=""+cmdBean.getPartitionType()%></p>
<p>PartitionID: <%=""+cmdBean.getPartitionID()%></p>
<p>PartitionSizeMB: <%=""+cmdBean.getPartitionSizeMB()%></p>
<%
} catch(com.novell.web.command.CommandException e) {
%>
<p>CommandException: <%=e.toString()%></p>
<%
}
%>
Monitoring General Server Health
Network administrators must be able to respond to server problems without delay.
Using wireless communications enables network administrators to respond to
server problems as they happen no matter where the server is located. The
following examples demonstrate how to monitor the health of various aspects of
individual servers.
Get the Health of the Allocated Server Processes
<%
com.novell.web.command.beans.os.GetAllocatedServerProcessesHealth
cmdBean =
new com.novell.web.command.beans.os.GetAllocatedServerProcessesHealth();
try {
cmdBean.perform();
%>
<p>Allocated Server Processes Health: <%=cmdBean.getHealth()%></p>
<%
} catch(com.novell.web.command.CommandException e) {
%>
M a r c h
2 0 0 1
21
<p>CommandException: <%=e.toString()%></p>
<%
}
%>
Get the Health of the Cache Buffer
<%
com.novell.web.command.beans.os.GetCacheBufferHealth
cmdBean =
new com.novell.web.command.beans.os.GetCacheBufferHealth();
try {
cmdBean.perform();
%>
<p>Cache Buffer Health: <%=cmdBean.getHealth()%></p>
<%
} catch(com.novell.web.command.CommandException e) {
%>
<p>CommandException: <%=e.toString()%></p>
<%
}
%>
Get the Health of the Cache
<%
com.novell.web.command.beans.os.GetCacheHealth
cmdBean =
new com.novell.web.command.beans.os.GetCacheHealth();
try {
cmdBean.perform();
%>
<p>Cache Health: <%=cmdBean.getHealth()%></p>
<%
} catch(com.novell.web.command.CommandException e) {
%>
<p>CommandException: <%=e.toString()%></p>
<%
}
%>
Get the Health of the Directory Cache
<%
com.novell.web.command.beans.os.GetDirectoryCacheHealth
cmdBean =
new com.novell.web.command.beans.os.GetDirectoryCacheHealth();
try {
cmdBean.perform();
%>
<p>Directory Cache Health: <%=cmdBean.getHealth()%></p>
<%
} catch(com.novell.web.command.CommandException e) {
%>
22
www.novell.com/appnotes
<p>CommandException: <%=e.toString()%></p>
<%
}
%>
Get the Health of the Directory Entries
<%
com.novell.web.command.beans.os.GetDirectoryEntriesHealth
cmdBean =
new com.novell.web.command.beans.os.GetDirectoryEntriesHealth();
try {
cmdBean.perform();
%>
<p>Directory Entries Health: <%=cmdBean.getHealth()%></p>
<%
} catch(com.novell.web.command.CommandException e) {
%>
<p>CommandException: <%=e.toString()%></p>
<%
}
%>
Get the Health of the Disk Space
<%
com.novell.web.command.beans.os.GetDiskSpaceHealth
cmdBean =
new com.novell.web.command.beans.os.GetDiskSpaceHealth();
try {
cmdBean.perform();
%>
<p>Disk Space Health: <%=cmdBean.getHealth()%></p>
<%
} catch(com.novell.web.command.CommandException e) {
%>
<p>CommandException: <%=e.toString()%></p>
<%
}
%>
Get the Health of the Disk Throughput
<%
com.novell.web.command.beans.os.GetDiskThroughputHealth
cmdBean =
new com.novell.web.command.beans.os.GetDiskThroughputHealth();
try {
long
startTime = System.currentTimeMillis();
long
currTime = startTime;
long
lastTime = startTime;
int
peak = 0;
int
current = 0;
while (currTime < (startTime + 30000)) {
cmdBean.reset();
cmdBean.perform();
com.novell.beans.NWSrvOS.NWSrvOS
srvOSBean =
M a r c h
2 0 0 1
23
new com.novell.beans.NWSrvOS.NWSrvOS();
com.novell.beans.NWSrvOS.HealthStats
healthStats =
srvOSBean.getHealthStats();
com.novell.beans.NWSrvOS.HealthStat
currentThroughput =
healthStats.getElement("currentDiskThroughput");
com.novell.beans.NWSrvOS.HealthStat
peakThroughput =
healthStats.getElement("peakDiskThroughput");
int
currentTmp = currentThroughput.getValue();
int
peakTmp = peakThroughput.getValue();
if ((currentTmp != current) ||
(peakTmp > peak)) {
%>
<p>Disk Throughput Health: <%=cmdBean.getHealth()%></p>
<%
}
if (currentTmp != current) {
current = currentTmp;
%>
<p>Current Throughput: <%=""+current%></p>
<%
}
if (peakTmp > peak) {
peak = peakTmp;
%>
<p>Peak Throughput: <%=""+peak%></p>
<%
}
currTime = System.currentTimeMillis();
}
} catch(com.novell.web.command.CommandException e) {
%>
<p>CommandException: <%=e.toString()%></p>
<%
}
%>
Get the Health of the DS Threads
<%
com.novell.web.command.beans.os.GetDSThreadsHealth
cmdBean =
new com.novell.web.command.beans.os.GetDSThreadsHealth();
try {
cmdBean.perform();
%>
<p>DS Threads Health: <%=cmdBean.getHealth%></p>
<%
} catch(com.novell.web.command.CommandException e) {
%>
<p>CommandException: <%=e.toString()%></p>
<%
}
%>
24
www.novell.com/appnotes
Get the Health of the Event Control Blocks
<%
com.novell.web.command.beans.os.GetECBHealth
cmdBean =
new com.novell.web.command.beans.os.GetECBHealth();
try {
cmdBean.perform();
%>
<p>ECB Health: <%=cmdBean.getHealth%></p>
<%
} catch(com.novell.web.command.CommandException e) {
%>
<p>CommandException: <%=e.toString()%></p>
<%
}
%>
Get the Health of the LAN Traffic
<%
com.novell.web.command.beans.os.GetLANTrafficHealth
cmdBean =
new com.novell.web.command.beans.os.GetLANTrafficHealth();
try {
cmdBean.perform();
%>
<p>LAN Traffic Health: <%=cmdBean.getHealth%></p>
<%
} catch(com.novell.web.command.CommandException e) {
%>
<p>CommandException: <%=e.toString()%></p>
<%
}
%>
Get the Health of the Processor Utilization
<%
com.novell.web.command.beans.os.GetProcessorUtilizationHealth
cmdBean =
new com.novell.web.command.beans.os.GetProcessorUtilizationHealth();
try {
cmdBean.perform();
%>
<p>Processor Utilization Health: <%=cmdBean.getHealth%></p>
<%
} catch(com.novell.web.command.CommandException e) {
%>
<p>CommandException: <%=e.toString()%></p>
<%
}
%>
M a r c h
2 0 0 1
25
Get the Health of the Receive Buffers
<%
com.novell.web.command.beans.os.GetReceiveBuffersHealth
cmdBean =
new com.novell.web.command.beans.os.GetReceiveBuffersHealth();
try {
cmdBean.perform();
%>
<p>Receive Buffers Health: <%=cmdBean.getHealth%></p>
<%
} catch(com.novell.web.command.CommandException e) {
%>
<p>CommandException: <%=e.toString()%></p>
<%
}
%>
Get the Health of the Server Processes
<%
com.novell.web.command.beans.os.GetServerProcessesHealth
cmdBean =
new com.novell.web.command.beans.os.GetServerProcessesHealth();
try {
cmdBean.perform();
%>
<p>Server Processes Health: <%=cmdBean.getHealth%></p>
<%
} catch(com.novell.web.command.CommandException e) {
%>
<p>CommandException: <%=e.toString()%></p>
<%
}
%>
Get the Health of the Threads
<%
com.novell.web.command.beans.os.GetThreadsHealth
cmdBean =
new com.novell.web.command.beans.os.GetThreadsHealth();
try {
cmdBean.perform();
%>
<p>Threads Health: <%=cmdBean.getHealth%></p>
<%
} catch(com.novell.web.command.CommandException e) {
%>
<p>CommandException: <%=e.toString()%></p>
<%
}
%>
26
www.novell.com/appnotes
Other Types of Information
The OS Command Beans included in Novell’s MVC Beans for eBusiness provide
many other Java Beans that allow access to other types of useful information,
including:
•
General Server Information
•
Address Spaces Information
•
DMA Hardware Resource Information
•
DOS Drive Information
•
Hardware Interrupt Information
•
LAN Adapter Information
•
OS Module (NLM) Information
•
OS Resource Information
•
Processor Information
•
Server Screens Information
•
Slot Information
•
Port Information
•
Storage Adapters Information
•
Threads Information
•
Server Parameters Information
•
Namespace Provider Information
Customizing the View for Different Devices
Since we have used the new-paragraph tag to separate elements in our examples,
we have made our examples transportable across HTML and WMl. Now, the only
items we need to worry about are HDML element separators and the header and
footer elements for each of these languages.
The following code snippets can be used to detect client device types, and to
format element separators and header and footer information for these devices.
M a r c h
2 0 0 1
27
// DETECT CLIENT DEVICE
//
String deviceLang = "";
// Check whether the browser/gateway accepts WML
String acceptHeader = request.getHeader("Accept");
if (acceptHeader.toUpperCase().indexOf("VND.WAP.WML") >= 0) {
deviceLang = "WML";
} else if (acceptHeader.toUpperCase().indexOf("APPLICATION/X-HDMLC") >= 0)
deviceLang = "HDML";
} else if (acceptHeader.toUpperCase().indexOf("TEXT/X-HDML") >= 0) {
deviceLang = "HDML";
} else {
// Now check for specific browsers
String acceptHeader = request.getHeader("User-Agent");
String browser = acceptHeader.substring(0, 4);
if (browser.equals("Noki") || // Nokia phones and emulators
browser.equals("Eric") || // Ericsson WAP phones and emulators
browser.equals("WapI") || // Ericsson WapIDE 2.0
browser.equals("MC21") || // Ericsson MC218
browser.equals("AUR ") || // Ericsson R320
browser.equals("R380") || // Ericsson R380
browser.equals("UP.B") || // UP.Browser
browser.equals("WinW") || // WinWAP browser
browser.equals("UPG1") || // UP.SDK 4.0
browser.equals("upsi") || // another kind of UP.Browser
browser.equals("QWAP") || // unknown QWAPPER browser
browser.equals("Jigs") || // unknown JigSaw browser
browser.equals("Java") || // unknown Java based browser
browser.equals("Alca") || // unknown Alcatel-BE3 browser
browser.equals("MITS") || // unknown Mitsubishi browser
browser.equals("MOT-") || // unknown browser
browser.equals("My S") || // unknown Ericsson devkit browser
browser.equals("WAPJ") || // Virtual WAPJAG www.wapjag.de
browser.equals("fetc") || // www.wapcab.de Perl script
browser.equals("ALAV") || // another unknown UP based browser
browser.equals("Wapa")) { // another unknown browser
deviceLang = "WML";
} else {
deviceLang = "HTML";
}
}
// restrict page caching
//
response.setHeader("Cache-Control", "no-store");
response.setHeader("Pragma", "no-cache");
response.setDateHeader ("Expires", 0);
String separatorStart = "<p>";
String separatorEnd = "</p>";
28
www.novell.com/appnotes
{
// Write header information for specific language
//
if (deviceLang.equalsIgnoreCase("WML")) {
response.setContentType("text/vnd.wap.wml");
out.println("<?xml version=\"1.0\"?>");
out.println("<!DOCTYPE wml PUBLIC \"-//WAPFORUM//DTD WML 1.1//EN\"");
out.println("\"http://www.wapforum.org/DTD/wml_1.1.xml">");
out.println("<wml>");
out.println("<card id=\"FirstCard\" title=\"My Example Card\">");
} else if (deviceLang.equalsIgnoreCase("HDML")) {
response.setContentType("text/x-hdml");
out.println("<HDML VERSION=\"3.0\">");
out.println("<DISPLAY>");
separatorStart = "";
separatorEnd = "";
} else {
response.setContentType("text/html");
}
// Now, try an example with dynamic element separators
//
<%
com.novell.web.command.beans.os.GetCacheHealth
cmdBean =
new com.novell.web.command.beans.os.GetCacheHealth();
try {
cmdBean.perform();
%>
<%=separatorStart%>Cache Health: <%=cmdBean.getHealth()%><%=separatorEnd%>
<%
} catch(com.novell.web.command.CommandException e) {
%>
<%=separatorStart%>CommandException: <%=e.toString()%><%=separatorEnd%>
<%
}
%>
// Now, write footer information for specific language
//
if (deviceLang.equalsIgnoreCase("WML")) {
out.println("</card>");
out.println("</wml>");
} else if (deviceLang.equalsIgnoreCase("HDML")) {
out.println("</DISPLAY>");
out.println("</HDML>");
}
M a r c h
2 0 0 1
29
Summary
Server administration is becoming an overwhelming task for IS&T staffs. Using
the model/view/controller pattern and the command beans provided by Novell’s
MVC Beans for eBusiness, we can provide network administators with powerful
tools that are easy to use and customize for their company’s needs. This enables
network administrators to become more efficient at their jobs, save their company
money, and develop an architecture that is easily adapted for future enhancements
and requirements.
Additional References
The following links provide more information on the subject:
•
http://developer.novell.com/research/appnotes/2000/december/02/a001202.htm
•
http://developer.novell.com/research/appnotes/2000/august/05/a000805.htm
•
http://developer.novell.com/research/devnotes/1999/december/03/02.htm
•
http://www.nwconnection.com/2000_09/web/index.html
•
http://developer.novell.com/ndk/ibmws.htm
•
http://www.novell.com/products/websphere/
•
http://www.alphaworks.ibm.com/alphaBeans
•
http://www.javasoft.com/products/jsp/
Copyright © 2001 by Novell, Inc. All rights reserved.
No part of this document may be reproduced or transmitted
in any form or by any means, electronic or mechanical,
including photocopying and recording, for any purpose
without the express written permission of Novell.
All product names mentioned are trademarks of
their respective companies or distributors.
30
www.novell.com/appnotes