Create  Edit  Diff  Mac OS X Serverで作る 小さな計算機室  Index  Search  Changes  RSS  Login

小さな計算機室 - macosxserveruseradmin Diff

  • Added parts are displayed like this.
  • Deleted parts are displayed like this.

Mac OS X ServerにはWorkgroup Manager(以下WgM)というソフトが付属していて,
ユーザー登録やユーザー環境設定をGUIベースで簡単に行なうことができる。
実際に操作してみると,至れり尽せり,といった感じだ。

でも,毎学期ごとに1000人程度のユーザーについて,追加登録と削除を行なう
必要があるので,それをいちいち手作業でやるのは,ちょっと考えたくない。

幸い,WgMには,テキストファイルに記述されたユーザー情報を一括登録する機能が
備わっているので,WgMが認識してくれるようなファイルを吐き出すようなスクリプト
を書いてやれば,割合と簡単に一括ユーザー登録ができる。

そのやり方と,テキストファイルの書式はWgMのマニュアル(http://www.apple.com/jp/server/documentation/ のユーザーの管理)に
書かれているので,それを参考にすればよい。
が,実際には試行錯誤の連続で、かなりの時間を費やすことになった。

!!ユーザーの一括登録

この端末室の場合、作業の流れはざっと以下のような感じになる:
*学期の始まりになると、教務担当者はデータベースを操作して、その学期に在学している学生のリストをファイルに保存する。
*それを元にして、各フィールドが
学籍番号, 氏名, 所属, 在籍状況, 初期パスワード
のエクセルファイルを作成する。
*それをCSVファイルで保存する。
*CSVデータを自作のプログラム{{attach_anchor(gen-user-record.rb)}}で処理して得られたデータをWgMで「読み込む」(WgMの「サーバー」メニューから「読み込み」)


▼CSVファイルからWgMが認識するデータを生成するスクリプト:{{attach_anchor(gen-user-record.rb)}}
{{attach_view(gen-user-record.rb)}}

Macのエクセルは改行コードがCR(だけ)なので、RubyのCSVクラスでフツーに読み込むと
ちゃんと動作しない。そこでReaderを定義して、改行コードと区切り文字を明示的に与えている。

!!!ユーザー登録で''はまる''

このスクリプトの動作は,大体こんな感じである:
#この大学の学籍番号は a5sb1234 のような形式になっている。この学籍番号をそのままユーザーID(レコード名)として使う。また、学籍番号から将来も含め重複が生じないようにUniqueIDを生成する。
#パスワードはクリアテキストであらかじめ用意しておく。
#Mac用のエクセルは,CVSファイルの出力がShiftJISコードで改行コードが?r。WMが認識するのはUTF-8と?nなので,ちゃんと変換する。
#その他,AFP用のホームディレクトリやdiskquota, shellなども記述したファイルを,WgMのマニュアルにある書式で出力する。

いくつかの試行錯誤の後,マニュアルに書いてある通り(のはず)の出力が得られるようになったので,WgMにえいやっと「読み込み」をさせてみるも,どうも様子がおかしい。

読み込みが終了しても,登録したはずのユーザーの中にログインできないものが多数ある。うまくいかなかったユーザーのディレクトリをいじろうとしてもエラーが出る。そのエラーは(主に)
eDSAuthFailed エラーコード:-14090
だった。これが出はじめると,どうにもこうにもおかしな状態になって,全くお手上げだ。

困ってしまい,いろいろと調べると,Appleの英語のサイトのdiscussion boardに同じ症状を訴えている記事が見つかった。どうもバグっぽい。そこに書いてあった対処法は以下のとおり:

*シングルユーザーモードで立ち上げる(Appleキー+Sを押して立ち上げる)
* mount -uw / (ファイルシステムをマウントする)
* cd /var/db/authserver
* rm authserverfree (パスワードサーバーが新しいスロットを割り当てるようにする)
* rm *overflow (オーバーフローファイルを全て削除)
* exit でマルチユーザーモードに
* それでもうまく認証されないユーザーは削除してもう一度作成する

実はこの記事が投稿されたのは,問題に悩ませられはじめてから随分と経ってからで、
問題の発生時には知るよしもなかった。
そのときは、しかたなくディレクトリーサービスを一旦止め、再設定からはじめて、
何とか期限に間に合わせたのだった。
かなりの時間を費やした割には、何かが得られた気分のしない、
とても後味の悪い一件であった。

!!!Mac用エクセルの使いにくさ
当初はユーザー登録用のデータの作成(WgMに読み込ませるまで)は、すべて
エクセルのマクロで行うつもりだった。
そして、その開発を某社にお願いしたのだった。

ところが、Mac版のエクセルは
*セルのデータをファイルに保存する際に、ShiftJISに変換される。 WMが認識するのはUTF-8なのでUTF-8に変換しようと試みたが、その機能が見当たらない。Windows版にはUTF-8への変換用の関数が用意されているのに、Mac版にはそれがない。
*上記と関係して、エクセルの中では正しく表示される漢字の中に、保存したとたんに化けてしまうものがあった(ShiftJISに変換できない漢字)。
*行末コードがCRのみなので、後からLFに変換する必要があった

など、この目的にはなんだかとても使いにくい代物であることが、後から判ったのだ。そこで、Mac OSには標準でインストールされているRubyを使って、自分でスクリプトを書くことにしたのだった。

!!ユーザー(学生)の更新

学期が変わると、新入学や卒業などに応じて、アカウントを追加したり削除する必要
が生じる。
そこで、古いユーザー一覧と新しいユーザー一覧を比較して、削除すべきユーザー(つまり、古いデータにはあるが新しいデータには存在しないレコード)だけを抽出するスクリプトも書いてみた。

Rubyには配列の「差」を取る機能が内蔵されているので、プログラムの心臓部はたった1行で済んでしまった。

▼二つのCSVを較べて、消去すべきユーザーを捜すスクリプト:{{attach_anchor(diff-users.rb)}}

ついでに、削除すべきユーザーリストをファイルから読み込んで、ディレクトリから削除し、ついでにホームディレクトリも移動するスクリプトも作っておいた。変数passwordにはrootのパスワードを入れておく。なお、この例は実際は必要なコマンドを画面に出力するだけ。

▼ユーザーを消去する(コマンドをはき出す)スクリプト:{{attach_anchor(delete-users.rb)}}

これら2つのスクリプトは、書いてみただけで、まだ本番で使用していないので、何か深刻な問題を含んでいる可能性があります。使用する場合はそれぞれの責任でお願いします。

▼二つのCSVファイルを比較して新規登録ユーザー分だけCSVではき出すスクリプト:{{attach_anchor(list-new-user.rb)}}

!!ユーザー更新の作業の流れ
*新規ユーザーの登録
**事務から登録すべきデータのエクセルファイルが送られてくる
**Mac用のエクセルでCSV形式で保存する
**list-new-user.rb 新年度のCSV 前年度のCSV > 新規登録用CSV
**gen-user-record.rb 新規登録用CSV > 新規登録データ
** WgMのサーバー/読み込みで新規登録データを選択。重複の処理方法は「重複を確認しない」。確認するとうまく行かないケースあり。ユーザーのプリセットも設定
*旧ユーザーの削除
**diff-users.rb 新年度のCSV 前年度のCSV > 削除IDリスト
** delete-users.rbのパスワード欄を設定しておく
** delete-users.rb 削除IDリスト > 削除シェルスクリプト
** sh 削除シェルスクリプト (1回もログインしていないユーザーにはホームディレクトリが存在しないので、移動の際にエラーが出るが、無視)

!!その他の注意

ピリオドやドル記号はユーザー名(ショート名)には使えない。

{{attach_form}}