Houdini 19.5 リファレンス スタンドアローンのユーティリティ

sesinetd

Houdiniライセンスサーバー。このプログラムはバックグラウンドで実行されてHoudiniライセンスを管理します。

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

使用状況レポートファイルの場所を指定します。

--confidential-users

ユーザ情報のログを取る時に、その情報を残せるように内部的に別ファイルのログに取ります。

--upload-usage

sesinetdがピーク使用状況をsidefx.comにアップロードするように指示します。 sesinetdがピーク使用状況をアップロードできるようにするには、さらにclientidとclientsecretも指定する必要があります。

Note

このオプションは、ピーク使用状況に応じた課金を使用しているセットアップでのみ必要です。

サーバー

-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も用意する必要があります。

--enable-ipv6

IPv6サポートを有効にします(ベータ)。

--user value

sesinetdを実行するユーザ。www-dataが既にシステム上でセットアップされているかどうかに応じて、デフォルトはwww-dataまたはsesinetdとなります。

--group value

sesinetdを実行するグループ。www-dataが既にシステム上でセットアップされているかどうかに応じて、デフォルトはwww-dataまたはsesinetdとなります。

--disable-redundant-config

sesinetdがDNSキャッシュを更新しなくなります。つまり、DNS名にインストールされているどのライセンスもユーザがチェックアウトできる有効なライセンスではなくなります。

SSL

-B/--enable-ssl

サーバーのSSL対応を有効にします。

--ssl-cert-file file

SSL認証ファイルの場所。

--ssl-priv-file file

SSLプライベートファイルの場所。

--ssl-ca-dir directory

SSL対応の通信用CAディレクトリ。

--ssl-verify-peer

ピアの検証を有効にします。

オプションファイル

オプションファイルは、プラットフォーム固有のライセンスディレクトリ下に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

デバッグモードを有効にします。 これによってログの詳細度が上がり、一部の状況下でログの機能が追加されます。 これは、ライセンスサーバーの問題をデバッグする時に非常に役立ちます。

user=value

sesinetdを実行するユーザ。www-dataが既にシステム上でセットアップされているかどうかに応じて、デフォルトはwww-dataまたはsesinetdとなります。

group=value

sesinetdを実行するグループ。www-dataが既にシステム上でセットアップされているかどうかに応じて、デフォルトはwww-dataまたはsesinetdとなります。

ピーク使用状況

usageInterval=value

ピーク使用状況の情報のログを取る時に使用される間隔。利用可能なオプション:

  • minute

  • 5-minute

  • 30-minute

  • hour

  • 4-hour

  • 12-hour

  • day

includeUser=0|1

使用状況レポートにユーザ情報を含めます。デフォルトでは、これはオフです。

peakusageFile=file

使用状況レポートファイルの場所を指定します。

confidentialUsers=0|1

ユーザ情報のログを取る時に、その情報を残せるように内部的に別ファイルのログに取ります。

uploadUsage=0|1

sesinetdがピーク使用状況をsidefx.comにアップロードするように指示します。 sesinetdがピーク使用状況をアップロードできるようにするには、さらにclientidとclientsecretも指定する必要があります。

はじめよう

ライセンスファイル

キー文字列そのものがローカル上のライセンスファイルに書き込まれます。 オペレーティングシステム上でこのライセンスファイルに .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-typexlsxを使用するには、エクスポータを実行する前に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スタイルの書式の基本型に対応しています。

書式

Decimal

10.51。Decimalは標準の小数点フォーマットです。実際にどの数値も小数点に変換されます。

Strings

"Hello World!"または'SideFX'。Stringsは標準の文字列フォーマットです。

Arrays

[ type, type, ... ] 例えば、[ "Hello World", "Sidefx", "license" ][ 1.0, 1.2, 1.3 ]です。 配列内の型は同じでなければなりません。 現在対応している配列の型は、文字列、小数点、IPマスクです。

IP Mask

10.1.1.*, 192.168.+.*。 IPマスクはサーバーオプションファイルやライセンス文字列で見受けられる標準のマスクフォーマットです。 IPマスクと配列を組み合わせることで、マスクのリストのマッチングを行なうこともできます。

構文

条件

定義

and &&

標準の論理積(AND)演算子。

or ||

標準の論理和(OR)演算子。

== !=

標準の比較演算子。

in

アイテムが他のオブジェクト内に存在するかどうかをチェックします。 通常では、これはオブジェクトが配列に含まれているかどうかをチェックする際に使用します。

matches

これは、完全一致の必要がない2つのオブジェクトの比較をすることができます。 これは、正規表現の比較でよく使用します。

> < >= <=

標準の比較演算子。

#

標準のPythonスタイルの行コメント。

( )

標準の括弧グループ演算子。

予約済み変数

比較するオブジェクトから情報を取得する際に使用される予約済み変数名がいくつかあります。 ライセンス関係では、version変数からバージョン情報を取得することができます。

変数名

定義

product

これはライセンスプロダクト名(例えば、Houdini-Master)です。 使用されている値は内部プロダクト名であってプロダクト表示名ではありません。 プロダクト表示名は変更される可能性があり、下位互換に対応していません。 このような理由で内部名(例えば、Houdini-Master)を使用しています。

platform

これはライセンスが紐付けられているプラットフォームです。

licenseid

ライセンス文字列からのライセンスID。

version

ライセンスのバージョン。 これは18.5といった小数点形式で表現されています。 通常のどの小数点比較演算(例えば、<=, ==, !=)にも対応しています。

ip_mask

ライセンスのIPマスク。

ip_address

ライセンス要求の送信元のIPアドレス。これはIPv4形式(例えば、127.0.0.1)です。

username

これはライセンス要求の送信元のクライアントのユーザ名です。 クライアントのコンピュータ名がuser@machineならば、ユーザ名はuserとなります。

machine_name

これはライセンス要求の送信元のクライアントのマシン名です。 クライアントのコンピュータ名がuser@machineならば、マシン名はmachineとなります。

ログファイル

ログファイルは、サーバーが健康状態に関する情報、接続情報、他に役立つ情報を出力する場所です。

各ログのエントリーの書式は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を使用してライセンスを再インストールする必要があります。

スタンドアローンのユーティリティ

  • abcconvert

    Alembicフォーマット間を変換します。

  • abcecho

    Alembicファイルに関する情報を出力します。

  • abcinfo

    Alembicファイルに関する情報を出力します。

  • chchan

    チャンネルコレクションをアクションチャンネルフォーマットへ(から)コピーします。

  • chcp

    チャンネルコレクションファイルを他のフォーマットにコピーします。

  • chinfo

    チャンネルコレクションファイルに関する情報を出力します。

  • claudio

    CHOPデータ(clip)をオーディオフォーマットへ(から)コピーします。

  • clchan

    CHOPデータ(clip)をアクションチャンネルフォーマットへ(から)コピーします。

  • clchn

    CHOPデータ(clip)をチャンネルコレクションフォーマットへ(から)コピーします。

  • clcp

    CHOPデータ(clip)を他のフォーマットにコピーします。

  • clinfo

    CHOPデータ(clip)ファイルに関する情報を出力します。

  • dsmconvert

    ディープシャドウ/カメラマップをあるフォーマットから別のフォーマットへ変換します。

  • dsmmerge

    2つ以上のディープシャドウ/カメラマップファイルを結合します。

  • dsparse

    ダイアログスクリプトを解析して表示します。

  • gabc

    AlembicとHoudiniのジオメトリ間を変換します。

  • gconvert

    Houdiniポリゴンフォーマット間を変換します。

  • gdxf

    DXFポリゴンをHoudiniフォーマットへ(から)変換します。

  • geodiff

    ジオメトリの差分を表示します。

  • geps

    EPSファイルをHoudiniポリゴンフォーマットへ変換します。

  • giges

    IGESジオメトリファイルを変換します。トリムNURBSパッチとカーブを扱います。

  • ginfo

    ポリゴンファイルの統計情報を出力します。

  • glightwave

    LightWaveファイルをHoudiniフォーマットへ(から)変換します。

  • gpdb

    .pdbファイルとHoudiniフォーマットを双方向に変換します。

  • gplay

    ジオメトリビューア。

  • gply

    .plyファイルとHoudiniフォーマットを双方向に変換します。

  • gptex

    ジオメトリファイルからPtexture画像ファイルを作成します。

  • greduce

    ファイルのポリゴンを削減します。

  • gwavefront

    .objファイルをHoudiniフォーマットへ(から)変換します。

  • hbrickmap

    i3dファイルまたはボリュームプリミティブgeo/bgeoファイルをPixar Brickmapファイルに変換します。

  • hcollapse

    ディレクトリ構造を折り畳みます。

  • hcpio

    CPIOアーカイブコマンドのサブセットコマンドでhipファイルの抽出/折り畳みができます。

  • hexpand

    hipファイルをディレクトリ構造に展開します。

  • hkey / License Administrator

    ライセンスとライセンスサーバーオプションを表示/管理するためのグラフィカルユーザインターフェースを開きます。

  • hoiiotool

    画像操作用の万能ツール。

  • hotl ユーティリティ

    .hda/.otlファイルを扱うことができるコマンドラインユーティリティです。

  • hrender

  • hsc

    Bloscファイル(.sc)の圧縮または解凍をします。

  • hscript

    コマンドラインのHScriptインタプリタ。

  • hserver

    Houdiniは、このプロキシサーバーを介してsesinetdライセンスデーモンと通信します。

  • htexcache

    ディスクテクスチャキャッシュを照会または修正します。

  • husk

    Karmaまたは一部の他のHydraクライアントを使ってUSDファイルをレンダリングするためのコマンドラインユーティリティ。

  • i3dconvert

    3DテクスチャファイルフォーマットをHoudiniジオメトリへ(から)変換します。

  • iautocrop

    ピクセル値に基づいて画像をクロップします。

  • icineon

    10ビットCineonフォーマット画像を8ビットフォーマットへ変換します。

  • icomposite

    画像をレイヤーでコンポジットします。

  • iconvert

    画像フォーマットを変換します。

  • icp

    画像のある領域を新しい画像に分離します。

  • idenoise

    画像ファイルからノイズを除去します。

  • idiff

    画像の差分を表示します。

  • iflip

    画像の向きを反転します。

  • iinfo

    画像に関する情報を出力します。

  • ilut

    標準チャンネルフォーマットまたは他のLUTからLookup Table(.lut)を生成します。

  • ilutcomp

    2つのLUTから1つのLookup Table(.lut)を生成します。

  • ilutinfo

    Lookup Table(LUT)ファイルの情報をプリントします。

  • imaketx

    画像ファイルから.exrまたは.ratのmipmapテクスチャを生成します。

  • imdisplay

    画像をMPlayウィンドウで開きます。

  • iprint

    画像のRGBA値をテキストとして出力します。

  • iquantize

    画像の色数を減らします。

  • isixpack

    立方体の6面を意味する6枚の画像または十字展開した画像から環境/反射マップを生成します。

  • itilestitch

    クロップウィンドウを含んだ一連の画像ファイルを一枚の画像にまとめます。

  • izg

    Z深度画像を8ビットのグレースケールに変換します。

  • Launcher

    Houdini Launcherは、Houdiniとそのコンポーネントをダウンロード、インストール、アップグレード、アンインストールします。

  • mcacclaim

    AcclaimモーションファイルをHoudiniのスクリプトとチャンネルファイルに変換します。

  • mcbiovision

    BioVisionモーションファイルをHoudiniのスクリプトとチャンネルファイルに変換します。

  • mcmotanal

    Motion Analysis TRCモーションファイルをHoudiniのスクリプトとチャンネルファイルに変換します。

  • mcp

    画像シーケンスを動画ファイルに変換します。

  • minfo

    動画ファイルに関する情報を出力します。

  • mqserver

    PDG/TOPs用メッセージキューサーバー

  • py23convert

    HDAのPython2エクスプレッションをPython2/3に変換します。

  • sesictrl

    コマンドラインからHoudiniライセンスサーバーオプションを設定します。

  • sesinetd

    Houdiniライセンスサーバー。このプログラムはバックグラウンドで実行されてHoudiniライセンスを管理します。

  • siminfo

    シミュレーションキャッシュファイルの統計をプリントします。

  • spiff

    テキストの差分を表示します。

  • spy

    UNIXファイルシステムを操作するシェルユーティリティ。

  • vexcache

    VEXコンパイルキャッシュを照会または編集します。

  • vexexec

    CVEXシェーダを実行します。