Solaris Bandwidth Manager の Java インタフェースは、Java Dynamic Management Kit フレームワークにもとづく管理 bean (m-bean) セットとして実装されます。
Solaris Bandwidth Manager 1.6 には、Solaris Bandwidth Manager アプリケーションのみを開発するための、Java Dynamic Management Kit のランタイムバージョンの使用権が含まれています。
Solaris Bandwidth Manager には、以下の要素に対してプログラミングインタフェースを提供する Java 管理 bean (m-bean) が含まれます。
設定情報
ディレクトリ情報
統計情報とアカウンティング
各 Java API に対するアクセスは、次のどちらかの方法で行えます。
Solaris Bandwidth Manager のプラグインを使用する。エージェントは、これらのプラグインを使用してローカルファイルから m-bean を取得できます。
クライアントモードを使用する
この章では、Java API をアクセスするこれらの方法の例と、各 API の内容の概要を示します。個々のメソッドのリファレンス情報については、各 API に付属の Javadoc を参照してください。
ポリシーエージェントは、Solaris Bandwidth Manager プラグインによってリモートの .jar ファイルから m-bean を取得できます。Java API をこのように使用することは、アプリケーションがポリシーエージェントに完全に統合され、アプリケーションがポリシーエージェントの動作方法を変更することを意味します。この節では、m-bean の起動時および停止時におけるポリシーエージェントの動作方法の概要と、新しい m-bean がポリシーエージェントと正しく連動するか確認する上で必要な作業の要約を示します。
この節に示されているコード例は、/opt/SUNWconn/ba/html/examples ディレクトリに入っています。
Solaris Bandwidth Manager のポリシーエージェントは、多数のタスクを自動的に実行します。この節では、これらのタスクについて説明します。
m-bean の初期化と起動を行う場合に、ポリシーエージェントは次のタスクを実行します。
/opt/SUNWconn/ba/html/beans/*.html ディレクトリに入っている m-let テキストファイルを読み込む
m-bean を初期化する。
ポリシーエージェントは、BeanName.zip と BeanName.class ファイルを読み込み、initCmf() メソッドを呼び出すことによってこのタスクを実行します。実行内容は次のとおりです。
Solaris Bandwidth Manager の設定の読み込みと起動を行う
m-bean を起動する
このタスクは、performStart() メソッド (com.sun.jaw.reference.agent.services.ActivatableIf インタフェースに定義されている、Java Dynamic Management Kit の一部) を使用して実行されます。
m-bean を停止する場合、ポリシーエージェントは次のタスクを実行します。
performStop() メソッド (com.sun.jaw.reference.agent.services.ActivatableIf インタフェースに定義されている、Java Dynamic Management Kit の一部) を呼び出す
Solaris Bandwidth Manager を停止する
deleteCmf() メソッドを呼び出して m-bean インスタンスを削除する
m-bean を記述する場合、以下の作業を行う必要があります。
m-let テキストファイルを作成する。
各 m-bean の情報は、MLET タグと呼ばれる単一のタグインスタンス内で指定します。m-let テキストファイルが読み込まれる時点で、このファイル内に指定された各 m-bean のインスタンスが作成されます。たとえば、QDatabaseAccounting m-bean の m-let テキストファイルを次のように作成し、QDatabaseAccounting.html に入れることができます。
<MLET
CODE=com.sun.ba.beans.QDatabaseAccounting
ARCHIVE="qdatabaseaccounting.jar, dbaccess.jar
>
<PARAM NAME=jdbcDriverName VALUE=com.sun.jdbc.SimpleText.SimpleTextDriver>
<PARAM NAME=jdbcURLName VALUE=jdbc:SimpleText:/var/opt/SUNWconn/ba>
</MLET>
|
initCmf() メソッドを実装する。initCmf() メソッドのプロトタイプは、次のような形式をとる必要があります。
. . . public void initCmf(Framework cmf, ObjectName name, boolean db, ModificationList list) . . . |
また、m-bean の bean 名とクラス名を指定して初期化も行えます。
.
.
.
ObjectName statsName = new ObjectName(cmf.getDomain(), beanName);
stats = (className) cmf.retrieveObject(statsName);
.
.
.
|
次に、QDatabaseAccounting.java ファイル内の initCmf() メソッドの例を示します。
.
.
.
public void initCmf(Framework cmf, ObjectName name, boolean db, ModificationList list)
throws InstanceNotFoundException, InstanceAlreadyExistException, ServiceNotFoundException
{
this.cmf = cmf;
if (name == null) {
name = new ObjectName(cmf.getDomain(), getClass().getName());
}
if (db) {
cmf.addDBObject(this, name);
} else {
cmf.addObject(this, name);
}
this.name = name;
ObjectName statsName = new ObjectName(cmf.getDomain(), statsMOName);
stats = (QStatsInterface) cmf.retrieveObject(statsName);
String jdbcDriverName = null;
Enumeration enum = list.elements();
while (enum.hasMoreElements()) {
Modification modif = (Modification) enum.nextElement();
String property = modif.getProperty();
String value = (String) modif.getValue();
if (property.equalsIgnoreCase("jdbcDriverName")) {
jdbcDriverName = value;
} else if (property.equalsIgnoreCase("jdbcUrlName")) {
jdbcUrlName = value;
} else if (property.equalsIgnoreCase("jdbcUserName")) {
jdbcUserName = value;
} else if (property.equalsIgnoreCase("jdbcPassword")) {
jdbcPassword = value;
} else if (property.equalsIgnoreCase("jdbcTableName")) {
jdbcTableName = value;
}
}
try {
Class.forName(jdbcDriverName);
} catch (ClassNotFoundException e) {
throw new ServiceNotFoundException("cannot load JDBC driver " + jdbcDriverName);
}
}
.
.
.
|
m-bean の宣言が ActivatableIf インタフェースを実装していることを確認する。
.
.
.
public class QDatabaseAccounting implements QConstants, QFlowAccountingListener,
ActivatableIf
{
.
.
.
|
performStart() メソッドを実装する。QDatabaseAccounting m-bean の場合、performStart() メソッドはフローアカウンティングのイベントリスナーを起動するメソッドを呼び出しています。
.
.
.
public void performStart()
{
if (!isActive()) {
try {
jdbcConnection = DriverManager.getConnection(jdbcUrlName, jdbcUserName, jdbcPassword);
flowTable = new QFlowTable(jdbcConnection, jdbcTableName);
stats.addQFlowAccountingListener(this);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
.
.
.
|
performStop() メソッドを実装する。次に、QDatabaseAccounting m-bean の場合の performStop() メソッドの例を示します。
.
.
.
public void performStop()
{
if (isActive()) {
stats.removeQFlowAccountingListener(this);
try {
jdbcConnection.commit();
jdbcConnection.close();
jdbcConnection = null;
flowTable = null;
} catch (SQLException e) {
e.printStackTrace();
}
}
}
.
.
.
|
.
.
.
public boolean isActive()
{
return (jdbcConnection != null && flowTable != null);
}
.
.
.
|
クライアントは、ポリシーエージェントに作用する個別のプロセスとして存在します。たとえば、構成ツール batool はクライアントとして実装されています。
ポリシーエージェントに接続されたアプリケーションは、クライアントモードで動作する場合、書き込み権を得るために接続時にパスワードを指定する必要があります。
まず、必要なクラスをインポートします。
import com.sun.jaw.impl.adaptor.security.AuthInfo; |
次に、ポリシーエージェントに接続する時にパスワードを指定します。
.
.
.
AdaptorMO adaptor = new AdaptorClient();
AuthInfo auth = new AuthInfo ("login", "password");
adaptor.connect (auth, host, portnumber, servicename.APT)
.
.
.
|
ログインとパスワードは、Solaris Bandwidth Manager パッケージがインストールされた時に設定されたものを使用します。これらは、/etc/opt/SUNWconn/ba/agent.properties ファイルに定義されています。
また、検出する c-bean 名とクラス名も指定する必要があります。
.
.
.
ObjectName on = new ObjectName(domain, BeanName);
Vector v =adaptor.getObject (on, null);
if (v == null || v.size() ==0)
{
System.err.println("Unable to retrieve the Bandwidth Manager m-bean.");
System.err.println("Try stopping and restarting the policy agent";
System,exit(1);
}
className userDefinedVariable = (className) v.elementAt(0);
.
.
.
|
Configuration m-bean は、Solaris Bandwidth Manager を構成するためのクラスとメソッドを提供します。提供されている主なメソッドを表 2-1 に示します。
表 2-1 Configuration m-bean のクラスとメソッド|
クラス |
メソッド |
説明 |
|---|---|---|
|
QDynamicConf |
addQClassListener() |
クラスイベントを受け取るためのリスナーを登録する |
|
addQFilterListener() |
フィルタイベントを受け取るためのリスナーを登録する |
|
|
performAddClass() |
実行中の構成に指定されたクラスを追加する |
|
|
performAddFilterToClass() |
指定されたクラスにフィルタを追加する |
|
|
performGetService() |
指定されたサービスを返す |
|
|
performModifyClass() |
指定されたクラスの属性を変更する。これが不可能な場合、クラスを削除して作成し直す |
|
|
performModifyFilter() |
指定されたフィルタの属性を変更する |
|
|
performRemoveClass() |
実行中の構成から指定されたクラスとその子を削除する |
|
|
performRemoveFilterFromClass() |
指定されたフィルタを削除する |
|
|
removeQClassListener() |
クラスイベントのリスナーを削除する |
|
|
removeQFilterListener() |
フィルタイベントのリスナーを削除する |
|
|
setTimeout() |
タイムアウトプロパティを設定し、ガベージコレクションスレッドを起動または再起動する |
Configuration m-bean を呼び出すには、次のパラメータが必要です。
|
m-bean の名前 |
QConstants.confMOName |
|
m-bean のクラス名 |
com.sun.ba.config.QDynamicConf |
|
c-bean のクラス名 |
com.sun.ba.mo.QDynamicConfMO |
Directory policy m-bean は、ディレクトリ情報に対する変更を監視するクラスとメソッドを提供します。主なクラスとメソッドを表 2-2 に示します。
表 2-2 Directory m-bean のクラスとメソッド|
クラス |
メソッド |
説明 |
|---|---|---|
|
QDirMod |
toString() |
オペレーションと値を対にした文字列表現を返す |
|
getOpe() |
オペレーション (ADD、MODIFY、または DELETE) を返す |
|
|
getAttr() |
オペレーションが適用される属性名を返す |
|
|
QDirRep |
toString() |
ディレクトリサーバーから送信された複製データの文字列表現を返す |
|
getDirOpe() |
オペレーション (ADD、MODIFY、MODIFYDN、または DELETE) を返す |
|
|
getDN() |
エントリの識別名 (DN) を返す |
|
|
getQDirMods() |
オペレーションが MODIFY の場合、送信された変更についてのベクトルを返す |
|
|
getNewDN() |
オペレーションが MODIFYDN の場合、送信された新しい識別名 (DN) を返す |
|
|
getAttrs() |
オペレーションが ADD の場合、送信された属性と値を対にしたリストを返す |
|
|
QDirEvent |
getTarget() |
イベント内で参照される複製された変更を返す |
|
QDir |
addQDirListener() |
ディレクトリ関連のイベントを受け取るリスナーを登録する |
|
removeQDirListener() |
ディレクトリ関連のイベントを受け取るリスナーを中止する |
|
|
QDirListener |
handleQDirEvent() |
イベントを返す |
Directory m-bean を呼び出すには、次のパラメータが必要です。
|
m-bean の名前 |
QConstants.dirMOName |
|
m-bean のクラス名 |
com.sun.ba.ldap.QDir |
|
c-bean のクラス名 |
com.sun.ba.mo.QDirMO |
Statistics m-bean には、統計情報を収集するためのメソッドが含まれています。これらのメソッドの一部は、C Statistics API を呼び出すネイティブメソッドを使用して実装されています。主なクラスとメソッドを表 2-3 に示します。
表 2-3 Statistics m-bean のクラスとメソッド|
クラス |
メソッド |
説明 |
|---|---|---|
|
QStatsInterface |
addQFlowAccountingListener() |
フローアカウンティングイベントのリスナーを登録する |
|
addQFlowAddedListener() |
フロー追加イベントのリスナーを登録する |
|
|
addQStatsResetListener() |
統計リセットイベントのリスナーを登録する |
|
|
performGetClassStats() |
指定されたクラスの統計情報を返す |
|
|
performGetFlowStats() |
指定されたクラスのフロー統計を返す |
|
|
removeQFlowAccountingListener() |
フローアカウンティングのイベントリスナーを削除する |
|
|
removeQFlowAddedListener() |
新しいフローイベントのリスナーを削除する |
|
|
removeQStatsResetListener() |
統計リセットイベントのリスナーを削除する |
|
|
QClassStats |
getBdrops() |
このクラスによってドロップされたバイト数を返す |
|
getBorrows() |
親クラスから借用した帯域幅を使用して送信されたパケット数を返す |
|
|
getClassName() |
クラスの識別名を返す |
|
|
getDrops() |
このクラスによってドロップされたパケット数を返す |
|
|
getLastSeen() |
最後のパケットが送信された時間を返す |
|
|
getNumBytes() |
このクラスを通して送信されたバイト数を返す |
|
|
getNumPackets() |
このクラスを通して送信されたパケット数を返す |
|
|
QFlow |
getClassName() |
このフローが属しているクラスの識別名を返す |
|
getFirstSeen() |
このフローを通して最初のパケットが送信された時間を返す |
|
|
getLastSeen() |
このフローを通して最後のパケットが送信された時間を返す |
|
|
getLocalIP() |
ローカル IP アドレスを返す |
|
|
getLocalPort() |
ローカルポート番号を返す |
|
|
getNumBytes() |
このフローを通して送信されたバイト数を返す |
|
|
getNumPackets() |
このフローを通して送信されたパケット数を返す |
|
|
getProtocol() |
IP プロトコルの値を返す |
|
|
getRemoteIP() |
リモート IP アドレスを返す |
|
|
getRemotePort() |
リモートポート番号を返す |
|
|
getTosSent() |
このフローのサービスタイプ (TOS) を返す。マーク付け (存在する場合) の後の値 |
|
|
getURL() |
このフローに関連付けられた URL を返す (該当しない場合は NULL) |
Statistics m-bean を呼び出すには、次のパラメータが必要です。
|
m-bean の名前 |
QConstants.statsMOName |
|
m-bean のクラス名 |
com.sun.ba.stats.QStatsInterface |
|
c-bean のクラス名 |
com.sun.ba.mo.QStatsInterfaceMO |