Sun Ray Server でのトークン情報に基づくターミナルサーバ切替え時の障害
サン・マイクロシステムズ(あ、今は Oracle か。。)の SunRay2 というシンクライアントを使ってます。

概要として一般ユーザのトークンはキオクスモードで Sun Ray Connector for Windows(uttsc) を使って Window ターミナルサーバに接続するというものです。
(エンドユーザは慣れたWindows上で作業出来るし、情報漏えいの心配はないし、膨大な数のPC管理も不必要となるので、IT管理者にとってはうれしい仕組みです。ただ、ターミナルサーバ側で膨大なスペックとTS CALが要求されますが。。。)

で、今回 Sun Ray Server へのセッションが確立された段階で、トークン情報に基づいて接続する Windows Server を切りかえるという必要が発生しました。

これは uttsc への引数によりどのサーバにつなぐか切り替えれるようです。


ということで、ブラウザからSunRay管理コンソール(SunRayAdministrator)を表示し、「詳細」タブの「キオスクモード」で、セッションを「Sun Ray Connector for Windows OS」となっていることを確認後、引数を追加します。
引数にはシェルスクリプトを指定し、トークンのその他の情報に基づいてサーバのIPを返答するにしました。
uttsc への引数はこんな感じです。

-m -l ja:IME -u `/opt/userget.sh` `/opt/chgserver.sh`


すで引数には別のスクリプトが指定してます。
それは、Windows ログイン名を自動指定する引数です。
Windowsのアカウントも SunRay スマートカードのユーザ名と同じにしてるので、トークン情報よりユーザ名を抜き出します。

その部分のスクリプトはこんな感じです。(/opt/userget.sh)
/opt/SUNWut/sbin/utuser -p "$SUN_SUNRAY_TOKEN"|/usr/bin/grep 'User Name'|/usr/bin/awk '{print $4}'

SunRayコマンド管理ツールの utuser -p でトークン情報を取得し、 UserName のある列の4つ目の要素をとっていますね。

で、本題のトークン「その他の情報」に基づいてサーバを切り替えるスクリプトです。(/opt/chgserver.sh)(このスクリプトはメンテナンス会社がよこしたものです)

#!/bin/csh

if(`/opt/SUNWut/sbin/utuser -p $SUN_SUNRAY_TOKEN | /usr/bin/nawk '/Other Info/ {print $4}'` == server1 ) then
echo 10.0.0.10
else
echo 10.0.0.11
ndif

トークンの「その他の情報」が server1 という文字列なら 10.0.0.10 のターミナルサーバにつなぐというものです。

で、この状態で運用を始めると Windows ターミナルサーバにつなげないユーザが出てきました。

サーバの message ログをみるとこんな感じでした。

kiosk:uttsc[000]: [ID 000000 user.notice] Usage:
kiosk:uttsc[000]: [ID 000000 user.notice]
kiosk:uttsc[000]: [ID 000000 user.notice] uttsc [-a [-c ]] [-C]
kiosk:uttsc[000]: [ID 000000 user.notice] [-k ] [-l ] [-E ]
kiosk:uttsc[000]: [ID 000000 user.notice] [-m [-b] | -K | -g [+|-+|-]
kiosk:uttsc[000]: [ID 000000 user.notice] [-K]] [-x ] [-P port] [-O] [-n client name ]
kiosk:uttsc[000]: [ID 000000 user.notice] [-u [-d ] [-p | -i]] [-z] [-A ]
kiosk:uttsc[000]: [ID 000000 user.notice] [-r comport:=,=...]
kiosk:uttsc[000]: [ID 000000 user.notice] [-r printer:[=]...]
kiosk:uttsc[000]: [ID 000000 user.notice] [-r disk:=,=...]
kiosk:uttsc[000]: [ID 000000 user.notice] [-r sound:low|high|off]
kiosk:uttsc[000]: [ID 000000 user.notice] [-r scard:on] [-s] [-t Connection Timeout in Sec] [-B]
kiosk:uttsc[000]: [ID 000000 user.notice] [-T window title ]
kiosk:uttsc[000]: [ID 000000 user.notice] uttsc -v
kiosk:uttsc[000]: [ID 000000 user.notice] uttsc -h
kiosk:uttsc[000]: [ID 000000 user.notice] kill: 18052: アクセス権がありません
kiosk:uttsc[205]: [ID 000000 user.error] /opt/SUNWuttsc/bin/uttsc exited with error code 1 - exiting

どうやら uttsc への引数が正しくないようです。

いろいろ調査した結果「その他の情報」に空白があるトークンの場合に失敗してるっぽいです。
(「その他の情報」には文字通り、補足情報を入れて運用してました。)

nawk 使ってる所で、空白等特殊文字があると csh は指定があいまいとかって怒るようです。

さて、これをどうすればいいかというと、下記のようなシェル書いてみました。

#!/bin/sh

PRAM=`/opt/SUNWut/sbin/utuser -p $SUN_SUNRAY_TOKEN | grep 'Other Info' | sed 's/Other Info//g' | sed 's/[ , ,=]//g'`
 
if [ "$PRAM" = server1 ] ;
then
echo 10.0.0.10
else
echo 10.0.0.11
fi

grepで検索してsedでおきかえるっていう単純なものです。
cshは使ったことないんで、普通に sh にしてます。

補足ですが、utuser -p で返る情報はこんな形式です。

bash-3.00# /opt/SUNWut/sbin/utuser -p トークン情報
Current Properties:
User Name = username
Other Info = その他の情報 ←今回ここに空白がある場合に、シェルで怒られた
Server Name = localhost
Server Port = xxxx
Logical Token = xxxx
User Created = 01/01/2010 01:00:00
Session Type = kiosk

Token Enabled?
---------------------------------------- --------
トークン情報 Yes

Currently Logged In:
Current Desktop = xxxxx
Desktop Location =
Logged In Since = 01/01/2010 01:00:00

[PR]
by jehoshaphat | 2010-02-04 23:15 | サーバがらみ | Trackback | Comments(0)
トラックバックURL : http://jehupc.exblog.jp/tb/12092110
トラックバックする(会員専用) [ヘルプ]
※このブログはトラックバック承認制を適用しています。 ブログの持ち主が承認するまでトラックバックは表示されません。


<< (.Net)文字列を Base... (.Net)三項演算子 >>