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