]> git.proxmox.com Git - pve-cluster.git/commitdiff
add interface to read/write cluster.conf
authorDietmar Maurer <dietmar@proxmox.com>
Wed, 21 Dec 2011 06:13:55 +0000 (07:13 +0100)
committerDietmar Maurer <dietmar@proxmox.com>
Wed, 21 Dec 2011 06:17:12 +0000 (07:17 +0100)
Makefile
data/PVE/Cluster.pm
data/src/status.c
debian/changelog
debian/control

index 1b7cdd099634a2afdf3a7d5c7f26d353b73218a2..6171282f51213c5b1f6857f605a2180fb3b88c66 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -2,7 +2,7 @@ RELEASE=2.0
 
 PACKAGE=pve-cluster
 PKGVER=1.0
-PKGREL=14
+PKGREL=15
 
 ARCH:=$(shell dpkg-architecture -qDEB_BUILD_ARCH)
 
index c1bf21113e95e0291ef95a768d0c917ece3da37a..9f8ef8ec2e9dd1bbb97ea34462aa46d28fdb7cd2 100644 (file)
@@ -7,6 +7,8 @@ use Socket;
 use Storable qw(dclone);
 use IO::File;
 use MIME::Base64;
+use XML::Parser;
+use Digest::SHA1;
 use Digest::HMAC_SHA1;
 use PVE::Tools;
 use PVE::INotify;
@@ -54,6 +56,7 @@ my $observed = {
     'storage.cfg' => 1,
     'datacenter.cfg' => 1,
     'cluster.conf' => 1,
+    'cluster.conf.new' => 1,
     'user.cfg' => 1,
     'domains.cfg' => 1,
     'priv/shadow.cfg' => 1,
@@ -1224,3 +1227,131 @@ sub write_datacenter_config {
 cfs_register_file('datacenter.cfg', 
                  \&parse_datacenter_config,  
                  \&write_datacenter_config);
+
+sub parse_cluster_conf {
+    my ($filename, $raw) = @_;
+
+    my $conf = {};
+
+    my $digest = Digest::SHA1::sha1_hex(defined($raw) ? $raw : '');
+
+    my $createNode = sub {
+       my ($expat, $tag, %attrib) = @_;
+       $expat->{NodeCount}++;
+       return { text => $tag, id => $expat->{NodeCount}, %attrib };
+    }; 
+
+    my $handlers = {
+       Init => sub {
+           my $expat = shift;
+           $expat->{NodeCount} = 0;
+           $expat->{NodeStack} = [];
+           $expat->{CurNode} = $expat->{Tree} = &$createNode($expat, 'root');
+       },
+       Final => sub {
+           my $expat = shift;
+           delete $expat->{CurNode};
+           delete $expat->{NodeStack};
+           $expat->{Tree};
+       },
+       Start => sub {
+           my $expat = shift;
+           my $tag = shift;
+           my $parent = $expat->{CurNode};
+           push @{ $expat->{NodeStack} }, $parent;
+           my $node = &$createNode($expat, $tag, @_);
+           push @{$expat->{CurNode}->{children}}, $node;
+           $expat->{CurNode} = $node;
+       },
+       End => sub {
+           my $expat = shift;
+           my $tag = shift;
+           my $node = pop @{ $expat->{NodeStack} };
+           $expat->{CurNode} = $node;
+       },
+    };
+    if ($raw) {
+       my $parser = new XML::Parser(Handlers => $handlers);
+       $conf = $parser->parse($raw);
+    }
+
+    $conf->{digest} = $digest;
+
+    return $conf;
+}
+
+sub cluster_conf_version {
+    my ($conf) = @_;
+
+    return undef if !$conf || !$conf->{children} ||
+       !$conf->{children}->[0];
+
+    my $cluster = $conf->{children}->[0];
+    return undef if $cluster->{text} ne 'cluster';
+
+    return int($cluster->{config_version});
+}
+
+sub xml_escape_attrib {
+    my ($data) = @_;
+
+    return '' if !$data;
+
+    $data =~ s/&/&amp;/sg;
+    $data =~ s/</&lt;/sg;
+    $data =~ s/>/&gt;/sg;
+    $data =~ s/"/&quot;/sg;
+
+    return $data;
+}
+
+sub __cluster_conf_dump_node {
+    my ($node, $indend) = @_;
+
+    my $xml = '';
+
+    $indend = '' if !defined($indend);
+
+    my $attribs = '';
+
+    foreach my $key (sort keys %$node) {
+       my $value = $node->{$key};
+       next if $key eq 'id' || $key eq 'text' || $key eq 'children';
+       $attribs .= " $key=\"" .  xml_escape_attrib($value) . "\"";
+    }
+    
+    my $children = $node->{children};
+
+    if ($children && scalar(@$children)) {
+       $xml .= "$indend<$node->{text}$attribs>\n";
+       my $childindend = "$indend  ";
+       foreach my $child (@$children) {
+           $xml .= __cluster_conf_dump_node($child, $childindend);
+       }
+       $xml .= "$indend</$node->{text}>\n";
+    } else { 
+       $xml .= "$indend<$node->{text}$attribs/>\n";
+    }
+
+    return $xml;
+}
+
+sub write_cluster_conf {
+    my ($filename, $cfg) = @_;
+
+    my $version = cluster_conf_version($cfg);
+    die "no cluster version specified\n" if !$version;
+
+    my $res = "<?xml version=\"1.0\"?>\n";
+
+    $res .= __cluster_conf_dump_node($cfg->{children}->[0]);
+
+    return $res;
+}
+
+# read only - use "rename cluster.conf.new cluster.conf" to write
+PVE::Cluster::cfs_register_file('cluster.conf', \&parse_cluster_conf);
+# this is read/write
+PVE::Cluster::cfs_register_file('cluster.conf.new', \&parse_cluster_conf, 
+                               \&write_cluster_conf);
index a6f2c39877e06525d2d803a16ee9edeb106d7141..96accfe94841258f401a05b76611885005a0b166 100644 (file)
@@ -76,6 +76,7 @@ typedef struct {
 
 static memdb_change_t memdb_change_array[] = {
        { .path = "cluster.conf" },
+       { .path = "cluster.conf.new" },
        { .path = "storage.cfg" },
        { .path = "user.cfg" },
        { .path = "domains.cfg" },
index ce354276b95da785f4c454bf224caa75bce8a90f..c2a623f6e18358d9ce72a83d77561b0516ca6abe 100644 (file)
@@ -1,3 +1,9 @@
+pve-cluster (1.0-15) unstable; urgency=low
+
+  * add interface to read/write cluster.conf
+
+ -- Proxmox Support Team <support@proxmox.com>  Wed, 21 Dec 2011 07:16:48 +0100
+
 pve-cluster (1.0-14) unstable; urgency=low
 
   * fix file name: use cluster.conf instead of cluster.cfg
index b69d1521065de1bec57424add9edadc9dd488dea..2ea3cdfc98684bc3ff4e6e43064be54398b77fe0 100644 (file)
@@ -2,12 +2,12 @@ Source: pve-cluster
 Section: admin
 Priority: optional
 Maintainer: Proxmox Support Team <support@proxmox.com>
-Build-Depends: debhelper (>= 7), autotools-dev, libsqlite3-dev, sqlite3, libfuse-dev, libcorosync-pve-dev, libqb-dev, libpve-common-perl, libglib2.0-dev, librrd-dev, librrds-perl, rrdcached, check, libdigest-hmac-perl
+Build-Depends: debhelper (>= 7), autotools-dev, libsqlite3-dev, sqlite3, libfuse-dev, libcorosync-pve-dev, libqb-dev, libpve-common-perl, libglib2.0-dev, librrd-dev, librrds-perl, rrdcached, check, libdigest-hmac-perl, libdigest-sha1-perl
 Standards-Version: 3.7.3
 
 Package: pve-cluster
 Architecture: any
-Depends: ${shlibs:Depends}, ${misc:Depends}, ${perl:Depends}, rsync, libsqlite3-0, sqlite3, libfuse2, fuse-utils, libcorosync4-pve, libqb, libpve-common-perl, libglib2.0-0, rsyslog, openssl, librrd4, librrds-perl, rrdcached, libdigest-hmac-perl
+Depends: ${shlibs:Depends}, ${misc:Depends}, ${perl:Depends}, rsync, libsqlite3-0, sqlite3, libfuse2, fuse-utils, libcorosync4-pve, libqb, libpve-common-perl, libglib2.0-0, rsyslog, openssl, librrd4, librrds-perl, rrdcached, libdigest-hmac-perl, libdigest-sha1-perl
 Description: Cluster Infrastructure for Proxmox Virtual Environment
  This package contains the Cluster Infrastructure for the Proxmox
  Virtual Environment, namely a distributed filesystem to store