LDAPの概念とアーキテクチャ
LDAP (Lightweight Directory Access Protocol)
ディレクトリサービスへ接続する為に使用されるプロトコル。
ディレクトリサービス
- ディレクトリ内の情報をユーザ名などのキーで検索する事を可能にするサービス。
- 検索・参照に特化して最適化され高速化がなされている。
ディレクトリ
- 階層構造を持つグループで情報を管理する。
ディレクトリ情報ツリー(Directory Infomation Tree: DIT)
- LDAPにおける情報を管理する為の階層構造の事。
- 情報は識別名(Distinguished Name: DN)という一意の名前で記述される。
相対識別名(Relative DN: RDN)
- エントリの相対的な位置における名前。
- 同一階層内では一意でなければならない。
- 別階層においては同名のエントリが存在してもかまわない。
別名エントリ
- 別階層に存在する複数のエントリを、同一エントリとして参照させる事が可能になる機能。
X.500
ネットワーク上での分散ディレクトリサービスに関する国際規格。
LDIF(LDAP Data Interchange Format)
テキストファイルでディレクトリ情報を記述する様式。
エントリ
- 管理される個別のデータ。
- 1つのエントリは複数の属性をもち、それぞれの属性値が格納される。
属性
- エントリに登録できる情報。
属性値
- 属性に登録された情報。
オブジェクトクラス(objectClass)
- エントリの型を決定する属性。
- オブジェクトクラスによってエントリに必ず必要となる属性(必要属性)と、入れてもよい属性(許可属性)が決まる。
- 一つのエントリは、必ず1つ以上のobjectClassを持つ必要がある
LDIFのフォーマット
# コメント dn: 属性値 属性記述子: 属性値 #ルートノード dn: dc=example,dc=com objectClass: dcObject dc: example #abc部署 dn: ou=abc,dc=example,dc=com objectClass: organaizationalUnit ou: abc #vzx部署 dn: ou=vzx,dc=example,dc=com objectClass: organaizationalUnit ou: vzx #Taro Yamadaのエントリ dn: cn=Taro Yamada,ou=abc,dc=example,dc=com cn: Taro Yamada sn: Yamada
- エントリとエントリの間には空白を入れる
- 下位のエントリが正常に登録される為には、それ以前に上位のエントリが登録されている必要がある。
- バイナリデータや改行を含む値、':'や'<'、スペースで始まる値、スペースで終わる値、印字できない文字などの特殊なデータを記述したい場合は、base64でエンコードして記述する。
- 属性値に他のファイルを指定したい場合には':<'としてファイルのURIを記述する。
# base64でエンコードした値を記述 cn:: TESMhsdifksd8s7dfe8f7sjd78swy29s # 属性値に他のファイルを指定 cn:< file:///tmp/value
標準的に利用される属性
o | 組織名(OrganizationName) |
---|---|
ou | 組織単位(OrganizationalUnitName) |
c | 国名(countryName) |
cn | 一般名称(CommonName) |
sn | 姓(SurName) |
dc | ドメイン構成要素(Domaincomponent) |
電子メールアドレス(mail) | |
telephoneNumber | 電話番号(telephoneNumber) |
changetype
ディレクトリにエントリを追加/削除したり、エントリの情報を変更する為にLDIFに記述するディレクティブ。
- エントリを追加/削除したり、エントリの情報を変更する場合changetypeをLDIFに記述し、ldapmodifyコマンドを実行する。
エントリを追加
chagetype: addを使用
dn: cn=Taro Yamada,ou=abc,dc=example,dc=com changetype: add cn: Taro Yamada sn: Yamada mail: taro@example.com objectclass: person
エントリを削除
changetype: deleteを使用
dn: cn=Taro Yamada,ou=abc,dc=example,dc=com changetype: delete
エントリの属性を追加・削除・変更
changetype: modifyを使用
- 複数の属性を操作する場合は'-'で区切って複数行指定する。
add: 追加する属性記述子 追加する属性記述子: 属性値 delete: 削除する属性記述子 削除する属性記述子: 属性値 (指定しなくても構わない) replace: 変更する属性記述子 変更する属性記述子: 属性値 dn: cn=Taro Yamada,ou=abc,dc=example,dc=com changetype: modify add: telephoneNumber telephoneNumber: xxx-0987-xxxx - delete: description - replace: mail mail: yamada@example.com
Ruby1.9 - システムコマンドの出力を受け取る
rubyのスクリプトの中でOSのコマンドを実行して、その出力を受け取りたいって時はこんな感じでいいんだろうか?execとかsystemだと受け取れないよね?とても自信がない。
たとえばpingを実行して、出力の中からレスポンスタイムを抜き出して返したいみたいな。一応、失敗したらもう一度試みて、それでも駄目なら0を返す感じにしてみた。
#-*- coding: UTF-8 -*- def ping(host, limit = 2) return 0 if limit == 0 cmd = "ping -c 1 #{host}" begin io = IO.popen(cmd) rescue raise else response_time = '' io.read.gsub(/\n/, '').gsub(/^.*time=(.*?)\s.*/){response_time = $1} if response_time.empty? ping(host, limit - 1) else response_time end ensure io.close if io end end ping('192.168.0.1') #=> "0.271"
はじめてのgitとGitHub for Mac
昨日初めてgitとgithubを使ったのでメモ。環境はMac OS X Snow Leopard。
まずはgitをインストール
macの場合、macportsとかgit-osx-installerとかありますが、せっかくなので最新のソースからインストール。
$ wget http://www.kernel.org/pub/software/scm/git/git-1.6.4.2.tar.gz $ tar zxvf git-1.6.4.2.tar.gz $ cd git-1.6.4.2 $ ./configure $ make prefix=/usr/local all $ sudo make prefix=/usr/local install
インストールが完了したら、名前とメールアドレスの登録をしとかないと、ローカルホスト名とか表示されてちょっと恥ずかしい。
$ git config --global user.name 'username' $ git config --global user.email username@example.com
レポジトリを作成してコミット
まずはプロジェクト名のディレクトリを作成して、レポジトリを初期化。
$ cd ~ $ mkdir testapp $ cd testapp $ git init
適当にファイルを作ってコミットする。
$ touch testfile $ git add testfile $ git commit -m 'first commit'
GitHubのアカウント作成、SSH公開鍵の登録
GitHubにアクセスしてSign upから以下の情報を入力してアカウント登録。
- ユーザ名
- メールアドレス
- パスワード
- SSH公開鍵
SSH公開鍵は空白でもアカウントは作れるので、後から登録してもいい。鍵の作成方法はHelp.GitHub - Generating SSH keysに詳細な手順があるので、手順通りに実行して貼付けるだけ。ファイル名とかはデフォルトで良いのでpassphraseの入力くらい。
$ cd ~/.ssh $ ssh-keygen $ cat id_rsa.pub | pbcopy
最後のコマンドで公開鍵がクリップボードにコピーされるので、あとは登録フォームのSSH Public Key欄に[command + v]で貼付けるだけ。
GitHubへリポジトリ作成、ローカルからGitHubへpush
アカウント登録が完了したらユーザのダッシュボードが表示されるので、[create a new one]とか[Create new Repository]あたりをクリックしてレポジトリを作成する。とりあえずプロジェクト名が入ってればOK。プロジェクト名はローカルのと合わせる。
レポジトリが出来たらあとはローカルからpushするだけ。
$ cd ~/testapp $ git remote add origin git@github.com:username/testapp.git $ git push origin master
誰かのレポジトリをforkする。
forkしたいレポジトリの[fork]ボタンをクリックするだけ。以上。
あとはローカルにcloneして編集してコミットした後にpush。
$ git clone git@github.com:username/fork_reponame.git
remote addとかはしなくていい。
$ git commit -a $ git push origin master
cutagemを修正してみたりした
rubyをちゃんと勉強しようと思って、先週くらいからruby-1.9.1をちょこちょこと弄ってたんだけど、せっかくなのでgemの作り方も覚えようと思ってcutagemってやつを使ってみた。
OS: Mac OS 10.6
ruby: 1.9.1p243
$ gem sources -a http://gems.github.com $ sudo gem install genki-cutagem
インストールは問題なかったんだけど、いざ使ってみたら
$ cutagem testapp /usr/local/lib/ruby/1.9.1/pathname.rb:969:in `glob': can't convert Pathname into String (TypeError) from /usr/local/lib/ruby/1.9.1/pathname.rb:969:in `glob' from /usr/local/lib/ruby/gems/1.9.1/gems/genki-cutagem-0.0.8.3/lib/cutagem.rb:180:in `select_template'
てな感じでエラーになった。
で、修正内容は以下のとおり。
diff --git a/lib/cutagem.rb b/lib/cutagem.rb index 579d470..60f76fe 100644 --- a/lib/cutagem.rb +++ b/lib/cutagem.rb @@ -108,18 +108,18 @@ class CutAGemCommand begin cp_r template, gemdir, :verbose => true - Pathname.glob(gemdir + "**/gemname*") do |f| + Pathname.glob(gemdir.to_s + "/**/gemname*") do |f| new = f.parent + f.basename.to_s.sub(/gemname/, gemname) puts "Rename #{f.relative_path_from(gemdir)} to #{new.relative_path_from(gemdir)}" f.rename(new) end - Pathname.glob(gemdir + "**/gempath*") do |f| + Pathname.glob(gemdir.to_s + "/**/gempath*") do |f| new = f.parent + f.basename.to_s.sub(/gempath/, gempath) puts "Rename #{f.relative_path_from(gemdir)} to #{new.relative_path_from(gemdir)}" new.parent.mkpath f.rename(new) end - Pathname.glob(gemdir + "**/*") do |f| + Pathname.glob(gemdir.to_s + "/**/*") do |f| next unless f.file? f.open("r+") do |f| content = f.read @@ -168,7 +168,7 @@ class CutAGemCommand templates = [] u_templates = [] if @user_templates.exist? - Pathname.glob(@user_templates + "*").each do |t| + Pathname.glob(@user_templates.to_s + "/*").each do |t| t = [".cutagem/templates/#{t.basename}", t] if t[1].basename.to_s == "default" u_templates.unshift(t) @@ -177,7 +177,7 @@ class CutAGemCommand end end end - Pathname.glob(@templates + "*").each do |t| + Pathname.glob(@templates.to_s + "/*").each do |t| t = ["#{t.basename}", t] if t[1].basename.to_s == "default" templates.unshift(t)
Dir.globの問題だと思うけど、1.9ではStringにしてから渡してやらないとエラーになるようです。
一応変更後もruby-1.8.6でも動作した(ような気がする)ので多分大丈夫かと。
なんか流れで初めてgitとかgithubとか使ってみたりした。
forkしてみたり、commitしてみたり。