ライセンス監視 · 1 min read · Jan 13, 2026

Flexnetライセンス監視とrrdtool

Flexnetライセンス監視とrrdtool

はじめに

商用のFlexnetライセンスアプリケーション(©Macrovision)をご存知の方もいるかもしれません。これは、いわゆるFlexnet対応アプリケーションの使用を管理するためのクライアントサーバーベースのソリューションです。1つのライセンスサーバーで複数の製品のライセンスを保持できます。ライセンスを購入する必要があり、ライセンスは高価であるため、貴重なライセンスの利用状況を確認できる監視ソリューションがあれば良いでしょう。ライセンスが過小利用されている場合(お金が無駄になる)や、常に完全に利用されている場合(人々が仕事をできない、または遅れることがあるため、リソースの無駄になる)を確認できます。

私の知る限り、こうしたレポートを作成するための商用アプリケーションがありますが、再度お金を使う必要があります。なぜ自分でシンプルなシステムを構築して、実際の使用状況と過去の使用状況を「MRTGスタイル」で表示しないのでしょうか?

前提条件 + 免責事項

このチュートリアルでは、シェルスクリプトとPythonスクリプトを使用します。このアプリケーションはすべてのLinuxで動作するはずです。私はCentOSとUbuntuで実行しました。CGIスクリプトを実行できるWebサーバーソフトウェアが必要です。私はよく知られたApacheとTHTTPDを使用しましたが、すべてのWebサーバーソフトウェアがこのアプリケーションを実行できるはずです。これは、私の以前のネットワーク監視アプライアンスの完璧な拡張でもあります。

以下のチュートリアルでは、私が解決策を実現した方法を説明します。料理レシピのスタイルで書かれています。同様のソリューションを実現できる保証はできません。

1. アーキテクチャ

ソリューションのアーキテクチャは非常にシンプルです。以下の図を参照してください:

CGIスクリプト

ライセンスサーバーには手を加えず、ネットワーク経由で必要な情報を取得します。そのために、Flexnetソフトウェアに属するlmutilプログラムを使用します。これはWindows版だけでなく、Linux版も存在します。私の知る限り、古いバージョンのlmutilはHP/UX、Solaris、AIXでも利用可能だったため、これらのOSのいずれかを実行しているシステムでも監視システムを構築できる可能性がありますが、私は試していません。

lmutilの出力は、すべての関連情報を1つまたは複数のrrdデータベースに格納できるようにフィルタリングされます。私は各ライセンスに対して1つのデータベースを使用しました。rrdは、Webサーバーソフトウェアのサブディレクトリ内でグラフを生成するためにも使用され、Webブラウザで快適に表示できます。

2. ライセンスサーバーのポーリング

私はlmutilの最近のバージョンを/usr/local/binにコピーし、実行可能かどうかを確認しました:

# ls -l /usr/local/bin/lmutil
-rwxr-xr-x 1 root root 309168 2008-01-08 00:45 /usr/local/bin/lmutil

lmutilがリンクされているすべての共有ライブラリがシステムに存在するかどうかを確認できます:

# ldd /usr/local/bin/lmutil
        linux-gate.so.1 =>  (0xf7796000)  
        libpthread.so.0 => /lib32/libpthread.so.0 (0xf7760000)  
        libdl.so.2 => /lib32/libdl.so.2 (0xf775c000)  
        libc.so.6 => /lib32/libc.so.6 (0xf7601000)  
        /lib/ld-linux.so.2 (0xf7797000)

コマンドラインユーティリティであるlmutilは、多くの共有ライブラリにリンクされていないため、すでにインストールされている可能性が高いです。

次に、ライセンスサーバー上で動作している複数の製品のライセンスを持つすべてのライセンスデーモンをポーリングするための小さなスクリプトを作成しました。スクリプトは次のようになります:

#!/bin/dash
# Product1
/usr/local/bin/lmutil lmstat -c 27000@licserv -a | /usr/local/sbin/lmrrd.py
# Product2
/usr/local/bin/lmutil lmstat -c 27001@licserv -a | /usr/local/sbin/lmrrd.py

このスクリプトのインタープリターとして/bin/dashを使用しました。なぜなら、dashはbashよりもリソースを消費しないことで知られているからです。ただし、好みに応じてbashを使用しても構いません。さまざまな製品のライセンスデーモンは異なるポートで実行されています。lmstatの出力は直接Pythonスクリプトにパイプされ、必要なすべての情報がフィルタリングされ、適切なrrdデータベースに格納されます。

cronを使用して5分ごとのポーリングサイクルを確立します。そのために、/etc/cron.d/にrrdという名前のエントリを作成します。

*/5 8-16 * * 1-5 root LANG=C LC_ALL=C /usr/local/sbin/licenses.sh

私たちは月曜日から金曜日の午前8時から午後5時までのライセンスの利用状況にのみ興味があります。

しかし、これを確立する前に、まずlmrrd.pyスクリプトを作成する必要があります。

3. lmrrd.pyスクリプト

このタスクにはrrdtoolがデータベースとして使用されます。rrdtoolには、シェル、perl、python、tcl/tkスクリプトなど、さまざまなスクリプトインターフェースがあります。私はそのクリーンな言語設計と多様性のためにPythonを使用しました。

このスクリプトは、lmutilの出力をフィルタリングし、関連情報を直接割り当てられたrrdデータベースに格納します。スクリプトは次のようになります:

#!/usr/bin/python
# lmstatの出力をフィルタリングしてrrdの入力として使用するスクリプト
import sys, string, rrdtool

# 検索語、各行の実際の値の位置と最大値の位置
# dbはrrd dbファイルの名前
search = [ { 'term':"Users of CL:", 'val':10, 'max':5, 'db':'CL' },
           { 'term':"Users of xyzabc:", 'val':10, 'max':5, 'db':'xyzabc' },
           { 'term':"Users of qwerty:", 'val':10, 'max':5, 'db':'qwerty' } ]
rrddir='/var/rrd/'
# stdinからすべての行を読み取る
for line in sys.stdin.readlines():
  # 上記の配列から検索語を各行で検索
  for x in search:
    if x[ 'term' ] in line:
      cols = line.split()
      if not cols[ x[ 'max' ] ].isdigit() or not cols[ x[ 'val' ] ].isdigit():
        print "0\n0\n0\n", x[ 'term' ]
      
      # 割り当てられたrrd dbファイルに値を格納
      rrdtool.update( rrddir + x[ 'db' ] + '.rrd', \
        '--template=value:total', \
        'N:' + cols[ x [ 'val' ] ] + ':' + cols[ x[ 'max' ] ] )

配列内の検索語は、”lmutil”の出力から抽出できます。また、ライセンスの実際の値と最大値の位置も抽出できます。

rrdtoolのPythonバインディングが必要です。これは、OSのパッケージリポジトリに見つかるか、rrdtoolのメンテナのウェブサイトで見つかります。

このスクリプトは、root権限で実行されるように実装されています。元のrrdファイルは世界中から読み取り可能である必要があります。なぜなら、グラフを生成する次のスクリプトは、通常www-dataなどのhttpサーバープロセスの所有者の権限の下でのみ実行されるからです。

Share: X/Twitter LinkedIn

新しい投稿を受信箱で受け取る

スパムはありません。いつでも購読を解除できます。