harry’s memorandum

おれおれメモ

Xen Domain-U の UUIDとMACアドレス

xenのdomain-uを複製したあと、定義ファイルのUUIDとMACアドレスを手でコリコリ書くのはバカっぽいので
ユニークなUUIDとMACアドレスを生成するゴミプロ。

#!/usr/bin/ruby

# vender-id 00:16:3e
mac_address = ["00", "16", "3e"]
3.times {|n| mac_address << format("%02x",rand(255)) }

buff = []
16.times {|n| buff << format("%02x",rand(255)) }
uuid = [buff[0,4].join,buff[4,2].join, buff[6,2].join, buff[8,2].join, buff[10,6].join]

print <<EOF
uuid = "#{uuid.join("-")}"
vif = [ "mac=#{mac_address.join(":")},bridge=xenbr0" ]
EOF

実行するとこんな感じになります。

$ ruby uniqid-gen.rb
uuid = "f9526110-abe6-c228-fda4-b21ce4f2e980"
vif = [ "mac=00:16:3e:9e:f2:2b,bridge=xenbr0" ]

追記1(2009/02/02)

id:kenkitiiに、「ださいので、injectを使って書き直せ」とダメ出しを受けたので。
injectはこんなのでいいのかな?

#!/usr/bin/ruby

# vender-id 00:16:3e
mac_address = "00:16:3e" + (1..3).inject(String.new) {|s,stub| s << ":" + format("%02x",rand(255)).to_s }
str = (1..16).inject(String.new){|s,stub| s << format("%02x",rand(255)).to_s }
uuid = "#{str[0,8]}-#{str[8,4]}-#{str[12,4]}-#{str[16,4]}-#{str[18,12]}"

print <<EOF
uuid = "#{uuid}"
vif = [ "mac=#{mac_address},bridge=xenbr0" ]
EOF

追記(2010/07/21)

Array#inject使うより普通に配列で書いた方がいい気がしてきた。

def rnd(n)
  Array.new(n){ format("%02x",rand(255)).to_s }
end

mac = (%w(00 16 3e) + rnd(3)).join(":")
uuid =  [4, 2, 2, 2, 6].map {|n| rnd(n).join }.join("-")

p mac  #=>"00:16:3e:0f:f9:54"
p uuid #=>"f25a65df-8259-7062-fb4a-dd116c5d59f6"

補足

色々調べたら、uuidを生成するコマンドがLinuxにはあるんですね。

$ uuidgen
4fc40007-a8ab-4ad3-b2f6-02ea1c320389

RedHatのDocumentにMACアドレスを生成するpythonのコードもあったり。
探せば色々あるんだなぁ。

#! /usr/bin/python
# macgen.py script generates a MAC address for Xen guests
#
import random
mac = [ 0x00, 0x16, 0x3e,
random.randint(0x00, 0x7f),
random.randint(0x00, 0xff),
random.randint(0x00, 0xff) ]
print ':'.join(map(lambda x: "%02x" % x, mac))

Generates e.g.:
00:16:3e:66:f5:77
to stdout