Skip to content

Instantly share code, notes, and snippets.

@CLCL
Last active December 16, 2015 04:59
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save CLCL/5381562 to your computer and use it in GitHub Desktop.
Save CLCL/5381562 to your computer and use it in GitHub Desktop.
Citrix XenServer 6.02のCLIであるxeのsnapshot-listの出力をPerlのデータ構造体にぶっこむ。
#!/usr/bin/perl
# Citrix XenServer 5.6/6.02用の xe xx-list 系の出力の簡易パーサ
#
# XenServerじゃないXenのばあい、xeコマンドではなくxmコマンド
# なのでテストしていないけれども、__DATA__以降の書式が
# 同じなら使えると思います。
use 5.8.8; # XenServer 5.6/6.2のDom-0に入るSystem Perlは 5.8.8
use strict;
use warnings;
use Data::Dumper;
#use YAML::Tiny; # YAML出力したいときはこっち
my $res = [];
my $tmp = {};
my $mkey = '';
while (<DATA>) { # _DATA_ 行以降をファイルとして読み込み
# Whileによって、$_ に1行ごと読み込まれる。
# Perl読めない人向けに明示的に$_を書く
$_ =~ tr/\x0D\x0A//d; # 改行コードを念のために除去(chompよりも確実に)
$_ = trim( $_ );
if ( $_ =~ m/^$/ ) { # 改行が区切り
if ( $mkey ne '' ) {
push @$res, $tmp;
$tmp = {};
$mkey = '';
}
}
else { # 区切りじゃない場合
my ($key, $value) = split ':', $_, 2;
my $type;
($key, $type) = split '\(', $key, 2;
$type =~ s/\)//;
$type = trim( $type );
$key = trim( $key );
$value = trim( $value );
if ( $mkey eq '' ) {
$mkey = $value;
}
# ( R*):通常のパラメータ (SR*):setパラメータ (MR*):mapパラメータ で分岐
if ( $type =~ m/S/i ) { # typeがS(setパラメータ)の場合
my $tmp = [];
foreach my $item ( split ';', $value ) {
push @$tmp, trim( $item );
}
$value = $tmp;
}
elsif ($type =~ m/M/i ){ # typeかM(mapパラメータ)の場合
my $tmp = {};
foreach my $item ( split ';', $value ) {
my ( $key, $value ) = split ':', $item, 2;
$tmp->{ trim( $key ) } = trim( $value );
}
$value = $tmp;
}
$tmp->{$key} = $value;
}
}
# ファイル読み込みループ終わり
if ( $mkey ne '' ) { # まだ格納していないアイテムがある場合
push @$res, $tmp;
} # つまり最後の行の改行があるかないか、ていう問題
print Dumper $res;
#print Dumper $res; YAMLで出力したい場合は冒頭のuse YAML:***を生かした後こっちも生かす
exit;
# use String::Util qw(trim); が使えない環境での代替trim()
sub trim {
my $val = shift;
$val =~ s/^\s*(.*?)\s*$/$1/;
return $val;
}
__DATA__
uuid ( RO) : abcdef01-2345-6789-abcd-ef0123456789
name-label ( RW): snapshot-001-20130414
name-description ( RW):
is-snapshot-from-vmpp ( RO): false
uuid ( RO) : bcdef012-3456-789a-bcde-f0123456789a
name-label ( RW): snapshot-20130414
name-description ( RW):
is-snapshot-from-vmpp ( RO): false
uuid ( RO) : cdef0123-4567-89ab-cdef-0123456789ab
name-label ( RW): snapshot-001
name-description ( RW):
is-snapshot-from-vmpp ( RO): false
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment