| On this page |
Houdiniインストーラは、このプログラムが常に実行されるようにオペレーティングシステムに登録します。 Houdiniを実行できるようにするには、このプログラムが実行されている必要があります。
システムファイルを編集して起動時にsesinetdが実行されるように登録する行為は止めてください。
代わりに、使用したいコマンドラインオプションをsesinetd.optionsファイル内に記述することができます。
このファイルの場所はオペレーティングシステムによって異なります。
Mac
MacOSでは、インストーラは、システムが起動した時にライセンスサーバーが立ち上がるようにデーモンとしてそのライセンスサーバーを登録します(/Library/LaunchDaemons/com.sidefx.sesinetd.plist)。
Windows
Windowsでは、インストーラは、システムが起動した時にライセンスサーバーが立ち上がるようにサービスとしてそのライセンスサーバーを登録します。
オプションはC:\Program Files\Side Effects Software\License Server\内のsesinetd.optionsに記述することができます。
Linux
Linuxでは、インストーラは、ライセンスサーバー用のinit.dスクリプトを作成します。
(これは、さらにシステムの下位互換レイヤーによってsystemdディストリビューション上で取得されます。)
コマンドラインオプション
情報
--help
このヘルプを表示します。
--ini-help
コンフィグファイルに関するヘルプ情報を表示します。
-v/--version
sesinetdのバージョン文字列をプリントします。
サーバーログ
-V/--min-logfile-level log level
サーバーログレベル。
-
0 = ログなし
-
1 = 致命的エラー(デフォルト)
-
2 = エラー
-
3 = 警告
-
4 = 情報
-
5 = デバッグ
-F/--min-console-level log level
コンソールログレベル。 上記のレベル値を参照してください。
-l/--logfile log file
サーバーログ情報に使用するログファイル。
-z/--max-logfile-size log size
最大ログファイルサイズ。
-d/--append-date
サーバーログに日付を追加します。
-c/--enable-console
ライセンスサーバーからのコンソール出力を有効にします。
Note
Windowsでは、このオプションに対応しておらず、すべての出力がログファイルに書き出されます。
-Y/--log-to-system
システムログファイルにログを書き出します。
ライセンスログ
-W/--license-log-level 0|1
ライセンスログレベル。
-u/--license-logfile log file
ライセンス情報に使用するログファイル。
-y/--max-license-log-size log size
最大ライセンスログファイルサイズ。
ピーク使用状況
-U/--usage-interval interval
使用状況レポートの間隔を指定します。使用状況レポートを有効にするには、このオプションを指定してください。指定可能な間隔の値:
-
minute
-
5-minute
-
30-minute
-
hour
-
4-hour
-
12-hour
-
day
-G/--include-user
使用状況レポートにユーザー情報を含めます。デフォルトでは、これはオフです。
-i/--peakusage-file file
使用状況レポートファイルの場所を指定します。
-Z/--peakusage-url url
ピーク使用状況の情報を送信する際に使用されるURL。
サーバー
-p/--port port
非標準ポートを通信に使用します。
-n/--threads threads
使用するスレッドの数を指定します。最低でも4つのスレッドを使用してください。
-m/--read-mask ip mask
クライアントのアクセス権を認証する際に使用する読み込みマスク。
-M/--write-mask ip mask
クライアントのアクセス権を認証する際に使用する書き込みマスク。
-D/--run-in-foreground
Windows以外のプラットフォームでは、sesinetdをバックグラウンドで実行しないでください。
-o/--debug-mode
ライセンスサーバーをデバッグモードにします。
-P/--enable-partitioning
ライセンスの分割を有効にします。
--clientid value
APIキーを用意するのに必要となるクライアントID。 ClientSecretも用意する必要があります。
--clientsecret value
APIキーを用意するのに必要となるクライアントシークレット。 ClientIDも用意する必要があります。
SSL
-B/--enable-ssl
サーバーのSSL対応を有効にします。
--ssl-cert-file file
SSL認証ファイルの場所。
--ssl-priv-file file
SSLプライベートファイルの場所。
--ssl-ca-dir directory
SSL対応の通信用CAディレクトリ。
オプションファイル
オプションファイルは、プラットフォーム固有のライセンスディレクトリ下にsesinetd.iniという名前のファイルで配置します。
Mac
/Library/Preferences/sesi/sesinetd.ini内にオプションを記述することができます。
Windows
C:\Program Files\Side Effects Software\License Server\下のsesinetd.iniファイル内にオプションを記述することができます。
Linux
/usr/lib/sesi/sesinetd.ini内にオプションを記述することができます。
サーバーログ
enableConsole=0|1
ログをコンソールにも出力したい場合は有効にします。
minConsoleLogLevel=level
コンソールの最小ログレベル。
これは、コマンドラインで-Fを設定することと同じです。
minServerLogLevel=level
サーバーログレベル。
これは、コマンドラインで-Vを設定することと同じです。
serverLogFile=file
サーバーログファイルの場所。
これは、コマンドラインで-lを設定することと同じです。
appendDateToServerLog=0|1
サーバーログファイルにログを書き込んでいく時に、日付をそのログファイルに追加します。
これは、検索用途で便利です。
これは、コマンドラインで-dを設定することと同じです。
maxServerLogSize=value
サーバーログファイルにログを書き込める最大ログサイズ。
これは、コマンドラインで-zを設定することと同じです。
logToSystem=0|1
有効にすると、ライセンスサーバーは、セットアップされたログだけでなく、システムにもログを書き出します。
ライセンスログ
licenseLogLevel=0|1
ライセンス情報のログレベル(下記の“ピーク使用状況”のレベル値を参照してください)。
licenseLogFile=file
ライセンスログファイルのパス(下記の“ピーク使用状況”のレベル値を参照してください)。
maxLicenseLogSize=size
ライセンスログの最大ログファイルサイズ。
サーバー
ClientID=value
APIキーを用意するのに必要となるクライアントID。 ClientSecretも用意する必要があります。
ClientSecret=value
APIキーを用意するのに必要となるクライアントシークレット。 ClientIDも用意する必要があります。
port=value
サーバーの実行に使用するカスタムポート。デフォルトは1715です。
これは、コマンドラインで-pを設定することと同じです。
threadCount=value
サーバーの実行に使用するスレッドの数。
デフォルトは6スレッドです。
この値は必ず4以上にしてください。
これは、コマンドラインで-nを設定することと同じです。
readIPMask=mask
サーバーへの読み込みマスク。
これは、サーバー上で読み込みオペレーションの実行が許可されているIPアドレスをサーバーに伝えます。
デフォルトは*.*.*.*で、コマンドラインで-mを設定することと同じです。
writeIPMask=mask
サーバーへの書き込みマスク。
これは、サーバー上で変更オペレーション(例えば、ライセンスのインストール)の実行が許可されているIPアドレスをサーバーに伝えます。
デフォルトは+.+.+.+で、コマンドラインで-Mを設定することと同じです。
enablePartitioning=0|1
ライセンスサーバーでライセンスのパーティション化を有効にします。
enableSSL=0|1
サーバーでSSLの対応を有効にします。
Warning
現在のところ、SSL対応は実験レベルです。
sslCertFile=file
認証ファイルの場所。
sslPrivateFile=file
プライベートSSLファイルの場所。
debugMode=0|1
デバッグモードを有効にします。 これによってログの詳細度が上がり、一部の状況下でログの機能が追加されます。 これは、ライセンスサーバーの問題をデバッグする時に非常に役立ちます。
ピーク使用状況
sendUsageLogURL=url
ピーク使用状況ログ情報を送信する際に使用されるURL。 これは、主に使用状況ベースで価格を決めるために使用状況ログ情報をsidefx.comに送信するのに使用します。
sendUsageLogInterval=interval
使用状況ログ情報をURLエンドポイントに送信する間隔。
はじめよう
ライセンスファイル
キー文字列そのものがローカル上のライセンスファイルに書き込まれます。
オペレーティングシステム上でこのライセンスファイルに .doc または .txt の拡張子を付けないようにしてください。
このファイルの名前は必ずlicensesでなければなりません。
SideFXからあなたのマシン用のライセンスファイルのコピーを受け取ったら、その新しいファイルを読み込ませるためにライセンスサーバーを再起動する必要があります。
Mac
ライセンスファイルの場所は、/Library/Preferences/sesi/licensesです。
Windows
ライセンスファイルの場所は、C:\Program Files\Side Effects Software\License Server\です。
Linux
ライセンスファイルの場所は、/usr/lib/sesi/licensesです。
ライセンスタイプ
-
Workstation ライセンスはノードロックライセンスです。つまり、このライセンスはローカルマシン上で使用することができ、ネットワークを介してフローティングライセンスとして使用することはできません。
-
LAL(ローカルアクセスライセンス) は、最大100km離れた場所までサービスを利用することができます。
-
GAL(グローバルアクセスライセンス) は、場所の制限がありません。
Note
ApprenticeおよびIndieユーザーには、ワークステーション(ノードロック)ライセンスのみが発行されます。
ライセンスサーバーの開始/停止
ライセンスサーバーを開始/停止できるようにするには、 管理者権限(root,sudo) がなければなりません。
最初からApprentice Local Licensingを使ってHoudiniをインストールしていた場合、インストーラを再実行して、 Commercial Licensing を選択する必要があります。 これは、必要なライセンスサーバーツールをインストールします。
Windows
コントロールパネル ▸ 管理ツール ▸ サービス のサービス一覧内のHoudiniLicenseServerでライセンスサーバーを開始/停止することができます。
Linux
/etc/init.dに配置されているsesinetd起動スクリプトを実行します。
/etc/init.d/sesinetd {start|stop}とタイプすることでライセンスサーバーを開始/停止することができます。
Mac
ユーティリティからターミナルを起動します。
そのターミナルで、sudo launchctl unload /Library/LaunchDaemons/com.sidefx.sesinetd.plistとタイプすることでライセンスサーバーを停止することができます。
sudo launchctl load /Library/LaunchDaemons/com.sidefx.sesinetd.plistとタイプすることでライセンスサーバーを開始することができます。
中央サーバーマシン上でライセンスサーバーソフトウェアを再起動しても、リモートクライアントは、通信の心拍がなくなった後(またはライセンスチェックの後)で約5分間はセッションを継続することができます。
ピークの使用状況をログに残す
これは、ライセンス購入の計画で役立つプロダクトタイプ別のピークのライセンス使用状況を監視するための優れたツールです。 間隔(minute, hour, day)を指定すると、そのピークの使用状況とオプションでユーザーデータを監視して、需要の拡大に応じてライセンス購入の計画に役立つ色々な表現でログファイルに残すことができます。
使用状況ログのオプション
以下がライセンスサーバー(sesinetd)のオプションです。
-Uは、ログを有効にするための唯一の必須オプションで、このオプションを指定しないと使用状況ログが有効になりません。
利用可能な間隔:
-
minute
-
5-minute
-
30-minute
-
hour
-
4-hour
-
12-hour
-
day
この間隔が短いほどエクスポートに時間がかかるので正しく選択してください。
これは、指定した間隔内で、必要な情報(その間隔内のピークの使用状況、その間隔内でのライセンスを掴んだ人など)が集められ、その間隔の最後に、その間隔内で蓄積されたすべての情報をログファイルに残します。
Note
ライセンスの使用状況のピークが0(その間隔内で誰もそのライセンスを使用していない)の場合、そのライセンスに関して何もログが残りません。
Note
間隔の開始時刻は、前の間隔に丸められます。
例えば、11:00:52amに間隔としてminuteで開始すると、その間隔の開始時刻は11:00:00amとなり、その間隔は11:01:00amに終了してその間の情報がログに残ります。 それ以降は、指定された間隔に基づきます。つまり、最初の間隔の開始時刻が11:00:00amで、次の時刻が11:01:00amとなります。
-iオプションには、ログファイルの場所を指定します。デフォルトの場所は、ライセンスパス内の sesinetd_peak_usage.bin という名前のファイルがある場所です。
Mac
デフォルトのパスは、/Library/Preferences/sesi/sesinetd_peak_usage.binです。
Windows
デフォルトのパスは、C:\Program Files\Side Effects Software\License Server\です。
Linux
デフォルトのパスは、/usr/lib/sesi/sesinetd_peak_usage.binです。
-Gオプションは、指定した間隔内でライセンスを使用した人物のログを取ります。デフォルトでは、ユーザーのログを取らず、各ライセンスのピークの使用状況のみのログがファイルに書き出されます。
ピーク使用状況エクスポータ
エクスポータは、ピーク使用状況ログファイルからピーク使用状況情報を抽出する際に使用します。
エクスポータは、他のオプションと併用して異なるフォーマット(例えば、mysql)にエクスポートすることでその情報を正確な仕様に合わせることができます。
このエクスポータは$HFS/python2.7libs/parsepeakuserlog.pyに配置されています。
エクスポータの現在利用可能なオプションは以下のとおりです:
--no-progress-info
進捗情報を表示しません。
--verbosity
これはエクスポータをデバッグする時に非常に役立ちます。
--group-by
エクスポータが情報をグループ分けする方法。
現在のところ利用可能な値はhour, day, monthです。
--usage-by-license
プロダクト単位ではなくライセンス単位でピーク使用状況情報を表示します。
--export-dir
エクスポートする情報の書き出し先。
--export-type
エクスポートする情報の書式。
利用可能な値はcsv, mysql, xlsxです。
--export-users
エクスポータが情報をエクスポートする時にユーザ情報を含めるかどうかを指定します。
--csv-dialect
使用するCSVの方言のタイプ。
現在のところ、唯一のオプションはexcelです。
--start-date
エクスポータが情報を取り込んだ時に使用する開始日。
--end-date
エクスポータが情報をエクスポートした時に使用する終了日。
Note
--export-typeでxlsxを使用するには、エクスポータを実行する前にxlsxwriterがインストールされている必要があります。
Note
タイムゾーンをもっと上手く制御したいのであれば、pytz Pythonモジュールを使用すると良いでしょう。
最も正確に時間を制御したいのであれば、tzlocal Pythonモジュールも使用すると良いでしょう。
これらのモジュールはエクスポータを実行する前にインストールされている必要があります。
ピーク使用状況の書式をMySQLでエクスポートしたテーブル
sesinetd_userテーブルには、レポート周期中にライセンスを使用していた各ユーザに関する情報が格納されます。
|
項目 |
データタイプ |
説明 |
|---|---|---|
|
id |
int |
テーブル内のユーザのID。 |
|
username |
varchar(100) |
ログを取ったユーザのユーザ名。 |
|
machine |
varchar(100) |
ログを取ったユーザのマシン。 |
プロダクト別の使用状況
sesinetd_product_usageテーブルには、指定した間隔内のプロダクト別のピーク使用状況に関する情報が格納されます。
|
項目 |
データタイプ |
説明 |
|---|---|---|
|
product |
enum |
使用状況エントリーのプロダクト名。 |
|
timestamp |
integer |
プロダクト使用状況のタイムスタンプ。 |
|
peak |
integer |
タイムスタンプにおけるプロダクトのピーク使用状況。 |
sesinetd_product_usage_usersテーブルには、指定した間隔内でプロダクトを使用したユーザに関する情報が格納されます。
|
項目 |
データタイプ |
説明 |
|---|---|---|
|
user_id |
integer |
使用状況ユーザのID。 |
|
product |
enum |
使用状況エントリーのプロダクト名。 |
|
timestamp |
integer |
使用状況ユーザのログが取られたタイムスタンプ。 |
ライセンス別の使用状況
sesinetd_licenseテーブルには、レポート周期中にライセンスされた各ライセンスに関する情報が格納されます。
|
項目 |
データタイプ |
説明 |
|---|---|---|
|
license_id |
varchar(10) |
ログが取られたライセンスのID。 |
|
product |
enum |
ライセンスのプロダクトタイプ。 |
|
version |
decimal |
ライセンスのバージョン。 |
|
quantity |
integer |
ライセンスのトークンの総数。 |
|
expires |
date |
ライセンスの有効期限。 |
|
ip_mask |
varchar(100) |
ライセンスのIPマスク。 |
sesinetd_license_usageテーブルには、指定した間隔内のライセンスのピーク使用状況に関する情報が格納されます。
|
項目 |
データタイプ |
説明 |
|---|---|---|
|
license_id |
varchar(10) |
ログが取られたライセンスのID。 |
|
timestamp |
integer |
使用状況間隔のログが取られた時刻。 |
|
peak |
integer |
指定した間隔内のこのライセンスのピーク使用状況。 |
sesinetd_license_usage_usersテーブルには、間隔内で指定したライセンスを使用していたユーザに関する情報が格納されます。
|
項目 |
データタイプ |
説明 |
|---|---|---|
|
user_id |
integer |
使用状況ユーザのユーザID。 |
|
license_id |
integer |
ユーザが使用していたライセンスのライセンスID。 |
|
timestamp |
integer |
使用状況を取得した間隔のタイムスタンプ。 |
ライセンスのパーティション化
New
この機能はLicense Server 18.5で追加されました。 License Serverが18.5以降である限り、クライアント上のHoudini License Serverはバージョンを上げなくてもこの機能を使用することができます。
ライセンスのパーティション化は、スタジオのライセンスセットを様々な条件に基づいて異なるグループに区分けするのにうってつけの方法です。 これによって、スタジオライセンスを複数のライセンスサーバーに分ける必要性がなくなり、1台のライセンスサーバーを使用してスタジオライセンスを仮想的に分けることができるようになります。
ライセンスのパーティション化は、ライセンスアクセスを制御してスタジオの大切なライセンスをそれを必要とするアーティストに限定し、他のアーティストからの意図しないライセンス取得を防ぐのにうってつけの方法でもあります。
Note
パーティションファイルは、プラットフォーム固有のライセンスディレクトリ内に.partition.jsonという名前で配置します。
このファイルは、結局のところWebブラウザを介して作成/変更してサーバーにプッシュすることになるので意図的に隠しファイルにしています。
Note
ライセンスをパーティション化するには、sesinedコマンドラインから--enable-partitioningで有効化または初期ファイル内にenablePartitioning=trueを追加して有効化する必要があります。
.partition.jsonファイルをセットアップするだけでサーバーがパーティション機能の使用を開始できるようにはなっていないです。
これは、ユーザがライセンスをチェックアウトできなくさせる古いパーティションファイルが存在した場合での安全機構として意図されています。
パーティションファイルの例
{ "user_groups": [ { "name": "Beta Testers", "if": "machine_name matches '^[a-zA-Z0-9_.]*.company.com$'" }, { "name": "Studio", "if": "ip_address matches [10.1.1.*, 192.168.*.*, 127.0.0.*]" }, { "name": "Studio Render Group", "if": "machine_name matches '^[a-zA-Z0-9_.]*.render.com$'" }, { "name": "Experimental Users", "if": "username in ['user1', 'user2', 'user3']" }, { "name": "PDG Team", "if": "username in ['user1', 'user2']" } ], "license_partitions": [ { "if": "(product == 'Houdini Engine' or product == 'Houdini FX') and version >= 17.0", "user_group": "Studio", "quantity": 2 }, { "if": "(product == 'Renderer' || product == 'Karma-Renderer')", "user_group": "Studio Render Group", "quantity": 1 }, { "if": "product == 'Beta'", "user_group": "Beta Testers" }, { "if": "product == 'Houdini-Master-Experimental'", "user_group": "Experimental Users", "borrow": ["PDG Team", "Studio"] }, { "if": "product == 'PilotPDG'", "user_group": "PDG Team", "borrow": "Studio Render Group" } ] }
user_groupsは、ライセンス要求をグループ分けする際に使用します。
license_partitionsは、実際のライセンスを分割して、どのユーザグループがどのライセンスグループを使用するのか指定できるようにする際に使用します。
理解しやすい分け方としては、マシンのグループを分けて(user_groups)からライセンスを分ける(license_partitions)ことです。
ライセンスのパーティション化でborrowオプションを使用すると、他のグループがそのパーティション内のライセンスを借りることができます。
(例えば、ライセンスを借りていない)そのグループに所属するユーザがライセンスを要求して、そのパーティションが現在空っぽの場合、その借りたライセンスが取り戻されます。
これによって、ライセンスを借りているユーザは、元のライセンスとは違っている可能性がある新しいライセンスを要求することになります。
これは、ユーザのグループが常にライセンスのグループにアクセスできるようにしたいものの、利用可能なライセンスがまだいくつかある場合に、他のグループにアクセスを許可する場合に便利な機能です。
例えば、Studio Render Groupは常にレンダーライセンスにアクセスできるようにしつつ、利用可能なライセンスが十分ある場合にのみExperimental Usersがレンダーライセンスにアクセスできるようにすることは合理的です。
レンダーグループユーザがライセンスを必要としているものの、利用可能なライセンスがない場合、Experimental Usersの誰かが追い出されます。
ユーザは、ライセンスを要求する際に特定のユーザグループを考慮するように要求することができます。 唯一の要件は、ユーザグループがパーティションファイルで定義されていることだけです。 詳細はhserverを参照してください。
対応している型
パーティション化は、Pythonスタイルの書式の基本型に対応しています。
型 |
書式 |
|---|---|
|
10.51。Decimalは標準の小数点フォーマットです。実際にどの数値も小数点に変換されます。 |
|
|
|
|
|
|
構文
条件 |
定義 |
|---|---|
|
標準の論理積(AND)演算子。 |
|
標準の論理和(OR)演算子。 |
|
標準の比較演算子。 |
|
アイテムが他のオブジェクト内に存在するかどうかをチェックします。 通常では、これはオブジェクトが配列に含まれているかどうかをチェックする際に使用します。 |
|
これは、完全一致の必要がない2つのオブジェクトの比較をすることができます。 これは、正規表現の比較でよく使用します。 |
|
標準の比較演算子。 |
|
標準のPythonスタイルの行コメント。 |
|
標準の括弧グループ演算子。 |
予約済み変数
比較するオブジェクトから情報を取得する際に使用される予約済み変数名がいくつかあります。
ライセンス関係では、version変数からバージョン情報を取得することができます。
変数名 |
定義 |
|---|---|
|
これはライセンスプロダクト名(例えば、Houdini-Master)です。 使用されている値は内部プロダクト名であってプロダクト表示名ではありません。 プロダクト表示名は変更される可能性があり、下位互換に対応していません。 このような理由で内部名(例えば、Houdini-Master)を使用しています。 |
|
これはライセンスが紐付けられているプラットフォームです。 |
|
ライセンス文字列からのライセンスID。 |
|
ライセンスのバージョン。
これは |
|
ライセンスのIPマスク。 |
|
ライセンス要求の送信元のIPアドレス。これはIPv4形式(例えば、127.0.0.1)です。 |
|
これはライセンス要求の送信元のクライアントのユーザ名です。
クライアントのコンピュータ名が |
|
これはライセンス要求の送信元のクライアントのマシン名です。
クライアントのコンピュータ名が |
ログファイル
ログファイルは、サーバーが健康状態に関する情報、接続情報、他に役立つ情報を出力する場所です。
各ログのエントリーの書式はYYYY-MM-DD HH:MM::SS: SYSTEM - MESSAGEです。
-
HTTP Clientは、curlコマンドからのメッセージ、または、接続/クライアントシステム関連のメッセージです。
Note
curlコマンドのverboseオプションが有効になっていれば、その出力がこのシステム下でログに書き出されるようになります。
これらのログエントリーの詳細は、curlのウェブページを参照してください。
-
Sqliteは、Sqlite自体から送られてくるメッセージです。SqliteはCookieの保存や他の永続的なストレージの需要でよく使用されています。 -
Network Managerは、ログファイル内で最もよく見かけるメッセージです。このメッセージは通常ではサーバー自体から送られてきます。たいていの場合、これは受信した接続に関する情報またはリクエストへの応答をログに書き出す際に使用します。 -
Stats Managerは、統計マネージャから送られてくるメッセージです。これは通常では起動中のサーバーに関する統計情報関連のメッセージです(例えば、リクエストの最大処理時間)。 -
Error with api responseは、API応答のエラーの結果を示したメッセージです。 -
Access Tokenは、APIキーから送られてくるメッセージです。これは通常では無効なAPIトークンに関するメッセージまたはAPIトークンの更新ができない旨のメッセージです。 -
Serviceは、サービス自体から送られてくるメッセージです。 -
Applicationは、アプリケーション関連のメッセージです。このエラーメッセージは非常に珍しいです。
Starting release server v18.5.296 at http://127.0.1.1.:1714というログエントリーは、そのサーバーが開発サーバーかリリースサーバーのどちらなのか、サーバーのバージョン、サーバーが起動しているIPアドレスとポートを示しています。
これは、起動しているサーバーのバージョンを知る必要がある場合に役立ちます。
他にも、複数のサーバーのバージョンが含まれているログファイル内でどのバージョンが何を生成したのかを確認しやすいです。
Using fast fd set configuration...というログエントリーは、ソケットで利用可能なデータを検出するためにサーバーが使用している仕組みを示した単なるエントリーです。
サーバーが高速なFD(File Descriptor)セット構成を使用している場合、サーバーはLinuxだとepoll、OSXだとkqueueを使用します(現在のところ、Windowsはこのような構成に対応していません)。
サーバーがデフォルトのFD(File Descriptor)セット構成を使用している場合、どのプラットフォームでもpoll()が使用されます。
HTTP応答ログエントリー
通常のHTTP応答ログエントリーの書式はMETHOD ROUTE HTTP/VERSION" CODE CODE_MESSAGE COMMAND RESPONSE_TIMEです。
エントリーの例: 2020-06-17 19:48:02: Network Manager - "POST /api HTTP/1.1" 200 Ok cmd_ping 0.0022450001s
-
METHOD: POST, GET, HEADなど
-
ROUTE: /api, /login, /
-
VERSION: 1.1, 1.0, 0.9
-
CODE: 200, 400, 404
-
CODE_MESSAGE: Ok, Bad Request, Not Found
-
COMMAND: cmd_ping
-
RESPONSE_TIME: 0.001s
Statistics Managerログエントリー
Process Timeエントリーは、平均処理時間とサーバーが起動してから現在までのすべてのリクエストのうちの最大処理時間を示します。 これは、リクエストが処理を開始してからその処理が応答するまでの時間で測定されます。
エントリーの例: 2020-06-17 19:46:51: Stats Manager - Process Time: avg 0.010118s, max 0.020763s
Queue Wait Timeログエントリーは、すべてのリクエストがキュー内でワーカースレッドで処理されるのを待機した平均時間と最大時間を示します。 これらの時間は、サーバーが起動してから現在までの期間における値です。
エントリーの例: 2020-06-17 19:46:51: Stats Manager - Queue Wait Time: avg 3.6666667e-05s, max 6.5e-05s
Queue Sizeログエントリーは、現在のキューサイズとこれまでのキューの最大サイズを示します。 これらのサイズは、サーバーが起動してから現在までの期間における値です。
エントリーの例: 2020-06-17 19:46:51: Stats Manager - Queue Size: current 0, max 1
Connection Countログエントリーは、現在サーバーが繋げている接続数を示します。 例えば、サーバーが接続を再使用すると、この数はその再使用した接続数を示すようになります。
エントリーの例: 2020-06-17 19:46:51: Stats Manager - Connection Count: 0
公開API
Note
18.5以降のサーバーが必要です。
ライセンスツール外からAPI関数をコールできるように一部のAPI関数が公開されています。
これによって、Pythonなどの言語を使用してライセンス使用状況を監視するなど幅広く機能を拡張することができます。
このAPI構文はhou.webServer.apiFunction()と同じです。
すべてのAPIリクエストは/apiをルートとしてPOSTを介して実行されます。
成功したレスポンスは常にJSON形式になります。
APIリクエストのフォーマットはjson=[<function name>, [<function parameters>], {<kwargs function parameters>}]です。
キーリストとサーバー情報
キーリストを取得するためのAPI関数名はcmd_lsです。
サーバーに直接リクエストを使用する手法は、変更に対するレジリエンスが高く(不具合が起きてもそれに対処しやすく)、高速で、データを他のフォーマットに変換しやすいことから今後も推奨していきます。
典型的なHTTPリクエストは以下のような感じになります:
POST /api HTTP/1.1
Host: 127.0.0.1:1715
Connection: keep-alive
Accept-Encoding: gzip, deflate
Accept: */*
User-Agent: python-requests/2.22.0
Content-Type: application/x-www-urlencoded
Content-Length: 23
json=["cmd_ls", [], {}]必要に応じてレスポンスを調整したいのであれば、以下のパラメータを使って関数のkwargsを調整します:
short_form (boolean)
ライセンスとサーバー情報の両方のレスポンスの書式を短縮します。
expires (int)
ライセンスの有効期限が切れるまでの日数。
server_data (boolean)
レスポンス内にサーバーデータを含めます。
show_all (boolean)
ライセンスファイルに見つかったすべてのライセンスを表示します。 期限切れライセンスと無効ライセンスも含まれます。
show_version (boolean)
レスポンス内にサーバーのバージョンを含めます。
only_version (boolean)
レスポンス内にサーバーのバージョンのみを含めます。
show_server (boolean)
サーバーで認識されているすべてのサーバーのキーを含めます。
show_users (boolean)
各ライセンスにユーザ情報を含めます。
show_licenses (boolean)
レスポンスにライセンス情報を含めます。
リクエストの例:
json=["cmd_ls", [], {"show_licenses": True, "show_server": False, "expires": 15}]import requests import json response = requests.post("http://127.0.0.1:1715/api", data={"json": json.dumps(["cmd_ls", (), {"show_licenses": True}])}) data = response.json() licenses = data["licenses"] for license in licenses: print("License: {} {}/{} {}".format(license["product"], license["available"], license["total_tokens"], license["version"]))
上記の例の出力:
License: Houdini Apprentice 40/50 18.0 License: Houdini FX 74/100 18.0 License: Houdini Engine 20/200 18.0
サーバーにキーリスト情報を直接リクエストする使用例を挙げると、それは時間軸でライセンス使用状況のログを取りたい時です。
これによって、あなたのスタジオにおいてスタジオライセンスの需要とサーバーの健康状態を時間軸でリアルタイムに監視することができます。
定期的にサーバー情報を要求してgrafanaなどの外部アプリケーションで表示できるように単純なmysqlデータベースにそれをログに残す例を以下に載せています。
""" 定期的に実行中のsesinetdから情報を要求してその情報を閲覧用にmysqlデータベースにダンプします。 """ from __future__ import print_function import sys import requests import argparse import threading import json import mysql.connector from datetime import datetime import time class Runner(object): def __init__(self): self.args = None def add_options(self, parser): parser.add_argument("--server", help="Server to request information from", default="localhost") parser.add_argument("--port", help="Server port number", default=1715) parser.add_argument("--interval", help="Interval to send requests.", default = 30) def server_url(self, route): return "http://{}:{}{}".format(self.args.server, self.args.port, route) def execute(self): # リクエスト全体のタイムスタンプが同じであることを確認します。 timestamp = time.time() response = requests.post(self.server_url("/api"), data={"json": json.dumps(["cmd_ls", (), {}])} ) db = mysql.connector.connect( host=<server>, user=<sql user>, password=<sql password>) cursor = db.cursor() sql_database = "CREATE DATABASE IF NOT EXISTS sesinetd" cursor.execute(sql_database) cursor.execute("USE sesinetd") db.commit() sql_table = "CREATE TABLE IF NOT EXISTS usage ( " \ "id INT NOT NULL AUTO_INCREMENT PRIMARY KEY," \ "timestamp INT," \ "product VARCHAR(25) NOT NULL," \ "available SMALLINT," \ "total_tokens SMALLINT," \ "version VARCHAR(10) NOT NULL," \ "tokens_used SMALLINT);" cursor.execute(sql_table) db.commit() sql_table = "CREATE TABLE IF NOT EXISTS response_times ( " \ "id INT NOT NULL AUTO_INCREMENT PRIMARY KEY," \ "timestamp INT," \ "response_time FLOAT);" cursor.execute(sql_table) db.commit() sql = "INSERT INTO usage (product, available, total_tokens, version, timestamp, tokens_used) VALUES (%s, %s, %s, %s, %s, %s);" data = response.json() licenses = data["licenses"] for license in licenses: product = license["product"] available = license["available"] total_tokens = license["total_tokens"] version = license["version"] cursor.execute(sql, (product, available, total_tokens, version, timestamp, (total_tokens - available))) db.commit() sql = "INSERT INTO response_times (timestamp, response_time) VALUES (%s, %s);" cursor.execute(sql, (timestamp, response.elapsed.total_seconds())) db.commit() cursor.close() db.close() def run(self): parser = argparse.ArgumentParser( description="Periodically request information from a running sesinetd" " which is dumped into mysql.") self.add_options(parser) self.args = parser.parse_args() self.execute() interval = self.args.interval ticker = threading.Event() while not ticker.wait(interval): self.execute() if __name__ == "__main__": runner=Runner() runner.run()
冗長サーバー
Note
これは、以前の冗長システムからまったく新しいシステムであり、その古いシステムと何の関係もありません。
通常のライセンス設定では、すべてのライセンスをサーバーが実行されているマシン名に紐付ける必要があります。 Houdini19.0以降では、ライセンスはDNS名(DNSがセットアップされている場合)またはマシン名(DNSがセットアップされていない場合)のどちらかにインストールします。 定期的にsesinetdはそのDNS名の解決を試みて、その解決した名前がライセンスがインストールされているマシン名と一致するかどうかをチェックします。 名前が一致すれば、sesinetdはそのライセンスを使用可能とマークし、一致しなければそのライセンスを使用不可とマークします。 メインのライセンスサーバーがダウンした場合、そのDNSはバックアップサーバーに切り替えられます。 そのバックアップサーバーへの切り替えは、何かしらの外部プロセス(例えば、IT部門または何かしらの自動プロセス)を介して実行されることに注意してください。 そのバックアップサーバーは、DNSチェックを実施して、以前はメインサーバーでのみ有効だったすべてのライセンスを有効化します。 メインサーバーが再び動作可能になると、そのDNSはメインサーバーに切り替わり、各ライセンスで逆のことが起こります。 sesinetdは延長された間隔でDNSチェックを行なうので、切り替えが起きたら、バックアップサーバー上でDNSチェックを強制更新することを推奨します。 強制更新しなかった場合、バックアップサーバーがライセンスを無効としてマークする期間が発生してしまう可能性があります。
起動しているサーバー上でDNSチェックを強制更新するには、cmd_refresh_redundantコマンドをsesinetdに送信します。
sesinetdにリクエストを送信する方法の詳細は、ここを参照してください。
Warning
DNS名を使用してライセンスをインストールした場合、古いsesinetdはライセンスを使ってDNS名を有効化することができないので、そのライセンスはsesinetdバージョン19以降でのみ使用可能になります。 DNS名を使用するライセンスをバージョン19より前のサーバーで使用する必要がある場合、そのライセンスを返却して、古いhkey/sesictrlを使用してライセンスを再インストールする必要があります。