3流プログラマのメモ書き

元開発職→社内SE→派遣で営業支援→開発戻り浦島太郎状態の三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。

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