bridge+epairで仮想HUBをvitochaで作ってみる

先日書いた記事
bridge+epairで仮想HUBを作ってみる=>できた -

を@tss_ontapさんが作成したvitochaを用いて作成します。

              • -

vitochaについての情報はこちら。
公式サイト
VITOCHA

説明スライド
VIMAGE仮想ネットワーク構築クラスライブラリ VITOCHA (通称バーチャル◯もちゃ)

              • -

ネットワーク図は前回とほぼ同じです。
今回はswitchにIPaddrを割り当てていません。
f:id:shutingrz:20140714171640p:plain

スクリプト
#!/usr/local/bin/ruby

require './vitocha/vitocha.rb'

tomocha=Operator.new

#create switch
switchNAME = "switch"
switch=Bridge.new(switchNAME)
switch.on

#hostjail connect switch
epaira, epairb = tomocha.createpair
epairaIP = "192.168.20.1"
epairaMASK = "255.255.255.0"

ifconfig(epaira + " inet " + epairaIP + " netmask " + epairaMASK)
ifconfig(epaira + " up")
switch.connect(epairb)
switch.up(epairb)


#create server01
serverNAME = "server01"
epairaIP = "192.168.20.11"
epairaMASK = "255.255.255.0"

server = Server.new(serverNAME)
epaira, epairb = tomocha.createpair
server.connect(epaira)
server.assignip(epaira,epairaIP,epairaMASK)
tomocha.register(epaira,serverNAME,epairaIP,epairaMASK)
server.up(epaira)
switch.connect(epairb)
switch.up(epairb)

#create server02
serverNAME = "server02"
epairaIP = "192.168.20.12"
epairaMASK = "255.255.255.0"

server = Server.new(serverNAME)
epaira, epairb = tomocha.createpair
server.connect(epaira)
server.assignip(epaira,epairaIP,epairaMASK)
tomocha.register(epaira,serverNAME,epairaIP,epairaMASK)
server.up(epaira)
switch.connect(epairb)
switch.up(epairb)
スクリプトを動かす
 # ./test.rb 
Hi, I'll do your job.
shell(#<Th:0x00000801d901a8>): /usr/sbin/jls host.hostname
shell(#<Th:0x00000801d901a8>): /sbin/ifconfig bridge create
shell(#<Th:0x00000801d901a8>): /sbin/ifconfig bridge0 vnet switch
shell(#<Th:0x00000801d901a8>): /usr/sbin/jexec switch ifconfig bridge0 name vbridge0
shell(#<Th:0x00000801d76f28>): /usr/sbin/jexec switch ifconfig vbridge0 up
shell(#<Th:0x00000801d901a8>): /usr/sbin/jexec switch ifconfig vbridge0 up
shell(#<Th:0x00000801d901a8>): /sbin/ifconfig epair create
shell(#<Th:0x00000801d901a8>): /sbin/ifconfig epair0a link 02:c0:e4:00:0:0a
shell(#<Th:0x00000801d901a8>): /sbin/ifconfig epair0b link 02:c0:e4:00:0:0b
shell(#<Th:0x00000801d901a8>): /sbin/ifconfig epair0a inet 192.168.20.1 netmask 255.255.255.0
shell(#<Th:0x00000801d901a8>): /sbin/ifconfig epair0a up
shell(#<Th:0x00000801d901a8>): /sbin/ifconfig epair0b vnet switch
shell(#<Th:0x00000801d901a8>): /usr/sbin/jexec switch ifconfig vbridge0 addm epair0b
shell(#<Th:0x00000801d901a8>): /usr/sbin/jexec switch ifconfig epair0b up
shell(#<Th:0x00000801d901a8>): /usr/sbin/jls host.hostname
shell(#<Th:0x00000801d901a8>): /sbin/ifconfig epair create
shell(#<Th:0x00000801d901a8>): /sbin/ifconfig epair1a link 02:c0:e4:00:1:0a
shell(#<Th:0x00000801d901a8>): /sbin/ifconfig epair1b link 02:c0:e4:00:1:0b
shell(#<Th:0x00000801d901a8>): /sbin/ifconfig epair1a vnet server01
shell(#<Th:0x00000801d901a8>): /usr/sbin/jexec server01 ifconfig epair1a inet 192.168.20.11 netmask 255.255.255.0
shell(#<Th:0x00000801d901a8>): /usr/sbin/jexec server01 ifconfig epair1a up
shell(#<Th:0x00000801d901a8>): /sbin/ifconfig epair1b vnet switch
shell(#<Th:0x00000801d901a8>): /usr/sbin/jexec switch ifconfig vbridge0 addm epair1b
shell(#<Th:0x00000801d901a8>): /usr/sbin/jexec switch ifconfig epair1b up
shell(#<Th:0x00000801d901a8>): /usr/sbin/jls host.hostname
shell(#<Th:0x00000801d901a8>): /sbin/ifconfig epair create
shell(#<Th:0x00000801d901a8>): /sbin/ifconfig epair2a link 02:c0:e4:00:2:0a
shell(#<Th:0x00000801d901a8>): /sbin/ifconfig epair2b link 02:c0:e4:00:2:0b
shell(#<Th:0x00000801d901a8>): /sbin/ifconfig epair2a vnet server02
shell(#<Th:0x00000801d901a8>): /usr/sbin/jexec server02 ifconfig epair2a inet 192.168.20.12 netmask 255.255.255.0
shell(#<Th:0x00000801d901a8>): /usr/sbin/jexec server02 ifconfig epair2a up
shell(#<Th:0x00000801d901a8>): /sbin/ifconfig epair2b vnet switch
shell(#<Th:0x00000801d901a8>): /usr/sbin/jexec switch ifconfig vbridge0 addm epair2b
shell(#<Th:0x00000801d901a8>): /usr/sbin/jexec switch ifconfig epair2b up
jail hostから192.168.20.11(server01)にpingを打ってみる。
# ping 192.168.20.11
PING 192.168.20.11 (192.168.20.11): 56 data bytes
64 bytes from 192.168.20.11: icmp_seq=0 ttl=64 time=0.293 ms
64 bytes from 192.168.20.11: icmp_seq=1 ttl=64 time=0.253 ms
jail hostから192.168.20.12(server02)にpingを打ってみる
# ping 192.168.20.12
PING 192.168.20.12 (192.168.20.12): 56 data bytes
64 bytes from 192.168.20.12: icmp_seq=0 ttl=64 time=0.328 ms
64 bytes from 192.168.20.12: icmp_seq=1 ttl=64 time=0.080 ms
server01から192.168.20.12(server02)にpingを打ってみる
# jexec server01 ping 192.168.20.12
PING 192.168.20.12 (192.168.20.12): 56 data bytes
64 bytes from 192.168.20.12: icmp_seq=0 ttl=64 time=0.124 ms
64 bytes from 192.168.20.12: icmp_seq=1 ttl=64 time=0.080 ms

全て疎通できてますね。
vitochaを使えばepairのMACaddrの重複を防ぐことができ、また別プログラムとの連携も可能になります。



以上。

bridge+epairで仮想HUBを作ってみる=>できた


もっといい方法が必ずあるはずなので、とりあえずメモとして。

以下の様なネットワークを作ってみます。
f:id:shutingrz:20140714171640p:plain


まずはスイッチ部分を作成し、Jail hostまでつなげるところから。

 # ifconfig bridge create
bridge0
 # ifconfig bridge0 vnet switch
 # ifconfig epair create
epair0a
 # ifconfig epair0a 192.168.20.1/24 up
 # ifconfig epair0b vnet switch
 # jexec switch ifconfig bridge0 192.168.20.254/24 up
 # jexec switch ifconfig epair0b up
 # jexec switch ifconfig bridge0 addm epair0b
 # ping 192.168.20.254
PING 192.168.20.254 (192.168.20.254): 56 data bytes
64 bytes from 192.168.20.254: icmp_seq=0 ttl=64 time=0.269 ms
64 bytes from 192.168.20.254: icmp_seq=1 ttl=64 time=0.120 ms


これでJail hostとSwitch部分のネットワークが作成できました。
次はserver01とswitchをつなげるところ。

 # ifconfig epair create
epair1a
 # ifconfig epair1a vnet server01
 # ifconfig epair1b vnet switch
 # jexec server01 ifconfig epair1a 192.168.20.11/24 up
 # jexec switch ifconfig epair1b up
 # jexec switch ifconfig bridge0 addm epair1b
 # 
 # jexec server01 ping 192.168.20.1
PING 192.168.20.1 (192.168.20.1): 56 data bytes
64 bytes from 192.168.20.1: icmp_seq=0 ttl=64 time=0.181 ms
64 bytes from 192.168.20.1: icmp_seq=1 ttl=64 time=0.135 ms

最後にserver01とswitchをつなげるところ。server01とやっていることはほぼ同じ。

 # ifconfig epair create
epair2a
 # ifconfig epair2a vnet server02
 # ifconfig epair2b vnet switch
 # jexec server02 ifconfig epair2a 192.168.20.12/24 up
 # jexec switch ifconfig epair2b up
 # jexec switch ifconfig bridge0 addm epair2b
 # 
 # jexec server02 ping 192.168.20.1
PING 192.168.20.1 (192.168.20.1): 56 data bytes
64 bytes from 192.168.20.1: icmp_seq=0 ttl=64 time=0.181 ms
64 bytes from 192.168.20.1: icmp_seq=1 ttl=64 time=0.126 ms

これで全てつなぎ終えました。
server01とserver02の疎通も確認してみます。

 # jexec server01 ping 192.168.20.12
PING 192.168.20.12 (192.168.20.12): 56 data bytes
ping: sendto: Host is down
ping: sendto: Host is down

・・・疎通できない・・・・・・。


何か間違っている点、やっていない点があれば@Shutingrz宛に助言お願いします。


追記
server01から192.168.20.12(server02)にpingを飛ばした時のserver02のepair2aのtcpdumpです

server01のping

# jexec server01 ping 192.168.20.12
PING 192.168.20.12 (192.168.20.12): 56 data bytes
ping: sendto: Host is down

server02のtcpdump

# jexec server02 tcpdump -i epair2a
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on epair2a, link-type EN10MB (Ethernet), capture size 65535 bytes
22:28:18.952300 ARP, Request who-has 192.168.20.12 tell 192.168.20.11, length 28
22:28:20.003368 ARP, Request who-has 192.168.20.12 tell 192.168.20.11, length 28
22:28:21.053505 ARP, Request who-has 192.168.20.12 tell 192.168.20.11, length 28


追記
できなかった理由が判明しました。

jailer設定 [DEMON-LORD]

ifconfig epair[n] create
epair[n]aとepair[n]bが作成される。epairを一つ作成してjailerからprisonerに割り当ててから次のepairを作成するとMACアドレスが重複する場合がある。この場合、それぞれのepairを同じbridgeに接続するとMACアドレスが重複して通信が行えなくなる。問題を回避する為、epairの作成は同時期に行う。

まさかと思いjexec switch ifconfig。

epair1b: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> metric 0 mtu 1500
	options=8<VLAN_MTU>
	ether 02:ff:50:00:06:0b
	inet6 fe80::ff:50ff:fe00:60b%epair1b prefixlen 64 scopeid 0x4 
	nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
	media: Ethernet 10Gbase-T (10Gbase-T <full-duplex>)
	status: active
epair2b: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
	options=8<VLAN_MTU>
	ether 02:ff:50:00:06:0b
	inet6 fe80::ff:50ff:fe00:60b%epair2b prefixlen 64 scopeid 0x5 
	nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
	media: Ethernet 10Gbase-T (10Gbase-T <full-duplex>)
	status: active

案の定macaddrが被ってました・・・。
@tss_ontap さんも昔この事言ってたのを今になって思い出しました。

修正として、まずifconfig epair createを3連続で行うようにしました。

結果。

# jexec server01 ping 192.168.20.12
PING 192.168.20.12 (192.168.20.12): 56 data bytes
64 bytes from 192.168.20.12: icmp_seq=0 ttl=64 time=0.219 ms
64 bytes from 192.168.20.12: icmp_seq=1 ttl=64 time=0.076 ms

バッチリです。

原因はわかったものの、今やってる卒論はリアルタイムにepairを作成、jailに割り当てる方式を採用しているので、この問題はどうやって解決すべきか・・・。



以上。

vnetが動かないqjailを無理やり動かしてみる

追記.2014/08/05
記事を修正しました。
qjail configでvnetが動きました。

qjail config -vを使う方法

# qjail config -v test01
 
At this time only ipfw firewall is vimage aware and can
run on the host and in the vnet jail at the same time.
 
Chose by entering ipfw or none and pressing the enter key.
none
 
There are two network configuration methods available for
connecting this vnet/vimage jail to the public internet.
The bridge/epair method and the netgraph method.
Chose which network method you want this vimage jail to use
by entering [ be ] for bridge/epair or [ ng ] for netgraph
and pressing the enter key.
be
Successfully enabled vnet for test01

noneを入力すると、ipfwを使いません。
epairを使うならば、beを入力します。

しかし、この方法だとqjail startした時にepairが1つ自動生成され、プライベートIPアドレスが自動で割り当てられるので、
自分で全てepairを作りたいときには正直邪魔です。
そのようなときには以下の2つの方法を使ったほうがいいです。

ソースコードを書き換える方法

ソースコードを書き換えるのに抵抗がなければ圧倒的にこちらのほうが楽です。
qjail Version 3.6のソースコードです。
/usr/local/bin/qjailを書き換えます。

echo "ip4,addr~ をコメントアウト

  echo "ip4.addr            =  ${ip4};"

    ↓

  #  echo "ip4.addr            =  ${ip4};"

echo vnet;を行う行のifをコメントアウトし、常に行われるようにする

    if [ ${vnet} ]; then 

    ↓

  #  if [ ${vnet} ]; then 
    fi 

    ↓

 #   fi 


この状態でqjail createし、startすれば、vnetが有効化されている状態になります。

qjailはBSDライセンスなので、ソースコードを改変して頒布しても著作権明記をすれば問題無いはずです。
しかしソースコードを書き換えてしまうと常にvnetが有効になってしまうので注意。

/usr/local/etc/qjail.vnet/を使う方法

まず、いつものように、qjail createをします。すると/usr/local/etc/qjail.local/test01が生成されます。

# cat /usr/local/etc/qjail.local/test01
name="test01"
ip4="0.0.0.0"
ip6=""
path="/usr/jails/test01"
interface="em1"
fstab="/usr/local/etc/qjail.fstab/test01"
securelevel=""
cpuset=""
fib=""
vnet=""
vinterface=""
rsockets=""
ruleset=""
sysvipc=""
quotas=""
nullfs=""
zfs=""
poststartssh=""
deffile="/usr/local/etc/qjail.local/test01"
image=""
imagetype=""
imageblockcount=""
imagedevice=""

ここからvnetを書き換えます。

vnet=""

    ↓

vnet="yes"

次に、/etc/jail.confを見ます。

test01 {
host.hostname       =  "test01";
path                =  "/usr/jails/test01";
mount.fstab         =  "/usr/local/etc/qjail.fstab/test01";
exec.start          =  "/bin/sh /etc/rc";
exec.stop           =  "/bin/sh /etc/rc.shutdown";
exec.consolelog     =  "/var/log/qjail.masterRouter.console.log";
mount.devfs;
ip4.addr            =  "0.0.0.0";
interface           =  "em1";
devfs_ruleset       =  "4";
}

もし作成されていなければqjail start test01;qjail stop test01をすれば作成されると思います。
/usr/local/etc/qjail.vnet/test01を作成し、この内容をコピーします。そして、
ip4,addrの行を削除し、vnet;を追加します。↓

test01 {
host.hostname       =  "test01";
path                =  "/usr/jails/test01";
mount.fstab         =  "/usr/local/etc/qjail.fstab/test01";
exec.start          =  "/bin/sh /etc/rc";
exec.stop           =  "/bin/sh /etc/rc.shutdown";
exec.consolelog     =  "/var/log/qjail.masterRouter.console.log";
mount.devfs;
interface           =  "em1";
devfs_ruleset       =  "4";
vnet;
}

そしてqjail startをすると、vnetが有効化されたjailが出来上がります。

qjailについてのTIPS

単発ネタが多いからまとめて投稿
随時更新します。

qjailでもVIMAGE vnetを使う方法


追記(07/10)
そのままではvnetを有効化できませんでした。
こちらの記事の内容で有効化できます。

vnetが動かないqjailを無理やり動かしてみる -


freebsd qjailでもvnetを有効化できます。

# qjail config -w em1 test01
Successfully enabled vnet.interface for test01
  • wのあとにはインターネットに到達できる(もしくは予定)のインターフェイスを指定。


qjailでホストへのシンボリックリンクを貼る方法

ezjailではそのままflavours/defaultに、

ln -s /basejail/pkg /usr/jails/flavours/default/pkg

して、ezjail-admin createしても何のエラーもなく通してくれますが、
qjailのflavors/defaultに

ln -s /sharedfs/pkg /usr/jails/flavours/default/pkg

上記のようにシンボリックリンクを張ったあとqjail createすると、

# qjail create -f default -4 10.0.0.1 example
Only in /usr/jails/flavors/example: pkg
Error invalid directories in flavor default.

とエラーが出て作成ができません。

しかしシンボリックリンクを張らずに先にqjail createし、その後に

ln -s /sharedfs/pkg /usr/jails/example/pkg

と打てば普通にホスト側へのシンボリックリンクが貼れます。

qjailで一気に複数のjailを作成する方法

qjail create -f default -d [jailの数] -4 10.0.0.1 test
  • dのあとに数値を入れればその数のjailを作ってくれます。

以下は例

# qjail create -f default -d 15 -4 10.0.0.1 test
Warning: Existing jail test01 is already assigned IP address 10.0.0.1
Successfully created  test-1
Successfully created  test-2
Successfully created  test-3
Successfully created  test-4
Successfully created  test-5
Successfully created  test-6
Successfully created  test-7
Successfully created  test-8
Successfully created  test-9
Successfully created  test-10
Successfully created  test-11
Successfully created  test-12
Successfully created  test-13
Successfully created  test-14
Successfully created  test-15

qjail delete -Aで全て削除できる

qjail start で全てのjailが動く

qjail stop で全てのjailが止まる

pingなどを有効化する

標準の状態では無効になっているのでpingが飛ばせません。

#jail -m name=test01 allow.raw_sockets=1

または、

#qjail config -k test01

netstatなどを有効化する

標準のdevfsでは/dev/memや/dev/kmemがないとnetstatなどルーティング系ができませんでした。
なのでdevfsに追加をします。
こちらの参考ページをどうぞ。
FreeBSD 9.1-STABLEでVIMAGEなJailを構築する | funi2.jp

jailのルールセットの変更は、

#jail -m name=test01 devfs_ruleset=5

上記でルールセットを5に変更できます。

しかしqjailでjailを作成したあとにjailコマンドで変更しても、実際は/devが変わっていないうえにjailを再起動すると4に戻ってしまいます。
その場合はやはりqjailのソースコードを書き換えるしかありません。

echo "devfs_ruleset       =  \"4\";"

      ↓

echo "devfs_ruleset       =  \"5\";"

qjail のオプションあれこれ

qjail update -pでportsのアップデート。

em-websocketで非同期処理(連続でサーバ側からクライアントにPushする)

EventMachine::WebSocket.start(host: "0.0.0.0", port: 3000) do |ws|
〜〜
sleep(1)
msg = ”test1”
ws.send(msg)
sleep(1)
msg = ”test2”
ws.send(msg)
sleep(1)
msg = ”test3”
ws.send(msg)

〜〜
end

というコードを書き、1秒毎にサーバ側がmsgをブラウザに送ることを期待したのですが、このコードでは、3秒後に3つのメッセージが同時に送信されます。

これを解決するためにEventMachine::deferを使います。
deferはその中で新しいスレッドを立て、非同期処理をしてくれる優れものです。


直したコードはこちら

EventMachine::WebSocket.start(host: "0.0.0.0", port: 3000) do |ws|
〜〜
EventMachine::defer do
  sleep(1)
  msg = ”test1”
  ws.send(msg)
  sleep(1)
  msg = ”test2”
  ws.send(msg)
  sleep(1)
  msg = ”test3”
  ws.send(msg)
end
〜〜
end

参考文献
橋本商会

指定したpkg(pkgng)の全依存関係を表示する

                      • -


追記.(2014/07/08)
スクリプトのバグにより全ての依存関係が取れない可能性がありました。

バグのあるスクリプトは依存関係を調べるスクリプトで、修正箇所は

s,e = Open3.capture3("cd #{pkg};make build-depends-list")

s,e = Open3.capture3("cd #{pkg};make run-depends-list")

if (line.include?(column) == true) then

if (line.gsub("/usr/ports/","") == column) then

となります。

1つ目のバグで生じる問題は、build-depends-listはそのPortsコンパイルするために必要なもので、これはpkgをダウンロードする場合は必要ありません。
そしてrun-depends-listは実行時に必要なもので、pkgでインストールする場合はこっちが必要なためです。

2つ目のバグで生じる問題は、例えば「python」というパッケージと「python2」というパッケージが必要な時、
先にpythonを処理してしまうと、次に「python2」を入れる時にincludeで重複リストを参照してしまうと「python」が引っかかってしまうためです。

記事のソースコードは修正済みです。

追記ここまで

                      • -

pkg search [name]で見つけたパッケージに対し、pkg fetch [name]でパッケージを取得しても、依存関係になるパッケージは取得できないし、
インストールしていない状態ではpkg infoをして依存関係も調べることができません。

しかしpkgngとPorts Collectionは同じDBを使っているのでそこから依存関係を取得できます。

今回は例としてvimの依存関係を調べます。

欲しいpkgの正式名称を調べる

まずvimを検索してみます。

# pkg search vim
ja-jvim-3.0.j2.1b_1
vim-7.4.334
vim-lite-7.4.334
vimpager-1.8.9
xpi-vimperator-3.5
# 

上記のように5つパッケージが表示されます。
vim-7.4.334」を選んだとして、以下のようにfetchしてaddしても、依存するパッケージが無いためエラーになります。(installすればいいじゃん、ってのは禁止。)

# pkg fetch vim-7.4.334
Updating repository catalogue
The following packages will be fetched:

	vim-7.4.334 (100% of 6 MB)

6 MB to be downloaded

Proceed with fetching packages [y/N]: y
vim-7.4.334.txz                                                                                    100% 5975KB 398.3KB/s 134.8KB/s   00:15    
Checking integrity... done
# pkg add /var/cache/pkg/All/vim-7.4.334.txz 
Installing vim-7.4.334...pkg: Missing dependency matching Origin: 'accessibility/atk' Version: '2.8.0'

Failed to install the following 1 package(s): /var/cache/pkg/All/vim-7.4.334.txz

pkgのPortsのパスを調べる

これがスクリプト。nameに先ほど取得した「vim-7.4.334」を代入します。

require 'open3'
ports = "/usr/ports"
name = "vim-7.4.334"

apkg = Array.new
column = Array.new
flag = false
s,e = Open3.capture3("cd #{ports}/;make search name=#{name}")
s = s.split("\n")
s.each do |line|
	if(line.index("Port:") != nil) then
		column << line.gsub("Port:	","")
		flag = true
		next
	end
	if(flag == true) then
		if(line.index("Path:") != nil) then
			column << line.gsub("Path:	","")
			apkg << column
			column = []
			flag = false
		end
	end
	if(line == "\n") then
		flag = false
		column = []
	end
end

apkg.sort!
apkg.each do |pkg|
	puts pkg[1]
end

動かします。

# ./tree.rb
/usr/ports/editors/vim
#

上記のように、「/usr/ports/editors/vim」とパスが取得できました。
通常であれば、このように1行しかでないと思います。nameに「vim」など曖昧な文字列を入れると複数行出ます。
このスクリプトは、以下の結果からPathだけを抜き出すようにしています。

# make search name=vim-7.4.334
Port:	vim-7.4.334
Path:	/usr/ports/editors/vim
Info:	Improved version of the vi editor
Maint:	sunpoet@FreeBSD.org
B-deps:	atk-2.8.0 cairo-1.10.2_10,2 compositeproto-0.4.2 cups-client-1.7.3 damageproto-1.2.1 dejavu-2.34_3 encodings-1.0.4_1,1 expat-2.1.0_1 fixesproto-5.0 font-bh-ttf-1.0.3_1 font-misc-ethiopic-1.0.3_1 font-misc-meltho-1.0.3_1 font-util-1.3.0_1 fontconfig-2.11.0_3,1 freetype2-2.5.3_2 gdk-pixbuf2-2.28.2_1 gettext-0.18.3.1_1 glib-2.36.3_3 gnomehier-3.0 graphite2-1.2.4 gtk-update-icon-cache-2.24.22 gtk2-2.24.22_3 harfbuzz-0.9.28 hicolor-icon-theme-0.12 icu-53.1 indexinfo-0.2 inputproto-2.3 intltool-0.50.2 jasper-1.900.1_14 jbigkit-2.1_1 jpeg-8_5 kbproto-1.0.6 libICE-1.0.8_2,1 libSM-1.2.2_2,1 libX11-1.6.2_2,1 libXau-1.0.8_2 libXcomposite-0.4.4_2,1 libXcursor-1.1.14_2 libXdamage-1.1.4_2 libXdmcp-1.1.1_2 libXext-1.3.2_2,1 libXfixes-5.0.1_2 libXft-2.3.1_2 libXi-1.7.2_2,1 libXinerama-1.1.3_2,1 libXpm-3.5.11_2 libXrandr-1.4.2_2 libXrender-0.9.8_2 libXt-1.1.4_2,1 libexecinfo-1.1_3 libffi-3.0.13_1 libfontenc-1.1.2_2 libiconv-1.14_3 libpthread-stubs-0.3_5 libxcb-1.10_2 libxml2-2.9.1_1 libyaml-0.1.6 lua52-5.2.3_2 mkfontdir-1.0.7 mkfontscale-1.1.1_1 p5-XML-Parser-2.41_1 pango-1.34.1_5 pcre-8.34_1 perl5-5.16.3_11 pixman-0.32.4_2 pkgconf-0.9.6 png-1.5.18 python-2.7_1,2 python2-2_2 python27-2.7.6_4 randrproto-1.4.0 readline-6.3.6_1 renderproto-0.11.1 ruby-1.9.3.484_2,1 shared-mime-info-1.1_1 tcl86-8.6.1 tiff-4.0.3_4 xcb-util-0.3.9_3,1 xcb-util-renderutil-0.3.9 xextproto-7.3.0 xineramaproto-1.2.1 xorg-fonts-truetype-7.7_1 xproto-7.0.25
R-deps:	atk-2.8.0 cairo-1.10.2_10,2 compositeproto-0.4.2 cscope-15.8a ctags-5.8 cups-client-1.7.3 damageproto-1.2.1 dejavu-2.34_3 encodings-1.0.4_1,1 expat-2.1.0_1 fixesproto-5.0 font-bh-ttf-1.0.3_1 font-misc-ethiopic-1.0.3_1 font-misc-meltho-1.0.3_1 font-util-1.3.0_1 fontconfig-2.11.0_3,1 freetype2-2.5.3_2 gdk-pixbuf2-2.28.2_1 gettext-0.18.3.1_1 glib-2.36.3_3 gnomehier-3.0 graphite2-1.2.4 gtk-update-icon-cache-2.24.22 gtk2-2.24.22_3 harfbuzz-0.9.28 hicolor-icon-theme-0.12 icu-53.1 indexinfo-0.2 inputproto-2.3 jasper-1.900.1_14 jbigkit-2.1_1 jpeg-8_5 kbproto-1.0.6 libICE-1.0.8_2,1 libSM-1.2.2_2,1 libX11-1.6.2_2,1 libXau-1.0.8_2 libXcomposite-0.4.4_2,1 libXcursor-1.1.14_2 libXdamage-1.1.4_2 libXdmcp-1.1.1_2 libXext-1.3.2_2,1 libXfixes-5.0.1_2 libXft-2.3.1_2 libXi-1.7.2_2,1 libXinerama-1.1.3_2,1 libXpm-3.5.11_2 libXrandr-1.4.2_2 libXrender-0.9.8_2 libXt-1.1.4_2,1 libexecinfo-1.1_3 libffi-3.0.13_1 libfontenc-1.1.2_2 libiconv-1.14_3 libpthread-stubs-0.3_5 libxcb-1.10_2 libxml2-2.9.1_1 libyaml-0.1.6 lua52-5.2.3_2 mkfontdir-1.0.7 mkfontscale-1.1.1_1 pango-1.34.1_5 pcre-8.34_1 perl5-5.16.3_11 pixman-0.32.4_2 png-1.5.18 python-2.7_1,2 python2-2_2 python27-2.7.6_4 randrproto-1.4.0 readline-6.3.6_1 renderproto-0.11.1 ruby-1.9.3.484_2,1 shared-mime-info-1.1_1 tcl86-8.6.1 tiff-4.0.3_4 xcb-util-0.3.9_3,1 xcb-util-renderutil-0.3.9 xextproto-7.3.0 xineramaproto-1.2.1 xorg-fonts-truetype-7.7_1 xproto-7.0.25
WWW:	http://www.vim.org/

# 

依存関係を調べる

依存関係を調べるためには以下のスクリプトを使います。pathに先ほど調べた「/usr/ports/editors/vim」を代入します。

#!/usr/local/bin/ruby

require 'open3'
ports = "/usr/ports"
path = "/usr/ports/editors/vim"
db = Array.new

def recPkg(db,pkg)
	s,e = Open3.capture3("cd #{pkg};make run-depends-list")
	s.each_line do |line|
		flag = false		#重複してたよフラグ
		line = line.chomp
		db.each do |column|
			if (line.gsub("/usr/ports/","") == column) then
				flag = true		#重複してたよ
				break
			end
		end
		if(flag == false) then	#重複していない場合はdbに依存情報を挿入
			db << line.gsub("/usr/ports/","")	
			recPkg(db,line.chomp)
		end
	end
end

recPkg(db,path)
db.sort!
puts db

動かします。

# ./recursive.rb
accessibility/atk
converters/libiconv
devel/autoconf
devel/bison
devel/cmake
devel/gettext
devel/glib20
devel/gmake
devel/gobject-introspection
devel/icu
devel/libcheck
devel/libexecinfo
devel/libffi
devel/libpthread-stubs
devel/libtool
devel/m4
devel/p5-Locale-gettext
devel/patch
devel/pcre
devel/pkgconf
devel/readline
devel/xorg-macros
graphics/cairo
graphics/gdk-pixbuf2
graphics/graphite2
graphics/gtk-update-icon-cache
graphics/jasper
graphics/jbigkit
graphics/jpeg
graphics/png
graphics/tiff
lang/lua52
lang/perl5.16
lang/python2
lang/python27
lang/ruby19
lang/tcl86
misc/help2man
ports-mgmt/pkg
print/cups-client
print/freetype2
print/harfbuzz
security/libgcrypt
security/libgpg-error
textproc/expat2
textproc/intltool
textproc/libxml2
textproc/libxslt
textproc/libyaml
textproc/p5-XML-Parser
x11-fonts/fontconfig
x11-fonts/libXft
x11-fonts/xf86bigfontproto
x11-toolkits/gtk20
x11-toolkits/libXt
x11-toolkits/pango
x11/bigreqsproto
x11/compositeproto
x11/damageproto
x11/fixesproto
x11/inputproto
x11/kbproto
x11/libICE
x11/libSM
x11/libX11
x11/libXau
x11/libXcomposite
x11/libXcursor
x11/libXdamage
x11/libXdmcp
x11/libXext
x11/libXfixes
x11/libXi
x11/libXpm
x11/libXrandr
x11/libXrender
x11/libxcb
x11/pixman
x11/randrproto
x11/renderproto
x11/xcb-proto
x11/xcb-util
x11/xcb-util-renderutil
x11/xcmiscproto
x11/xextproto
x11/xproto
x11/xtrans
#

依存関係が全て出ます。

このスクリプトは、下記のようにvimPortsの中で「make run-depends-list」で表示したPortsをまた再帰的に依存情報を調べています。

# cd /usr/ports/editors/vim ; make run-depends-list
/usr/ports/accessibility/atk
/usr/ports/devel/gettext
/usr/ports/devel/glib20
/usr/ports/devel/patch
/usr/ports/devel/pcre
/usr/ports/devel/pkgconf
/usr/ports/lang/lua52
/usr/ports/lang/perl5.16
/usr/ports/lang/python27
/usr/ports/lang/ruby19
/usr/ports/lang/tcl86
/usr/ports/ports-mgmt/pkg
/usr/ports/textproc/intltool
/usr/ports/x11-toolkits/gtk20
/usr/ports/x11-toolkits/libXt
/usr/ports/x11-toolkits/pango
/usr/ports/x11/libXpm
#

上記に表示されたpkgも全てfetchすればvimが正常にインストールできます。



もっと簡単に依存関係が分かる方法を知っていたら教えて下さい(`;ω;´)

以上。

嫌がらせに片っ端から名前解決したらDNS名前衝突ブロックリストに載るの?




というわけでスクリプト
辞書はOpenWallからいただきました。
Index of /pub/wordlists/languages/Japanese

#!/usr/bin/ruby

require 'open3'

wordlist = "lower_jp"
domain = "nom"
s,e = Open3.capture3("cat #{wordlist}")
s.each_line do |str|
	lne,e = Open3.capture3("dig #{str.chomp}.#{domain}")
	puts lne
	sleep(1)
end

これで日本語をローマ字にしたドメインがブロックリストに載るのかな?