summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--LICENSE6
-rw-r--r--Makefile68
-rw-r--r--mk/Citrix.repo7
-rw-r--r--mk/Makefile11
-rw-r--r--mk/Makefile.deb172
-rw-r--r--mk/Makefile.rpm128
-rw-r--r--mk/Makefile.tgz143
-rw-r--r--mk/citrix.list2
-rw-r--r--mk/debian/changelog5
-rw-r--r--mk/debian/compat1
-rw-r--r--mk/debian/control15
-rw-r--r--mk/debian/copyright1
-rw-r--r--mk/debian/overrides1
-rw-r--r--mk/debian/rules55
-rw-r--r--mk/debian/xe-guest-utilities.dirs3
-rwxr-xr-xmk/debian/xe-guest-utilities.postinst20
-rwxr-xr-xmk/debian/xe-guest-utilities.prerm7
-rw-r--r--mk/testcases/centos41
-rw-r--r--mk/testcases/centos51
-rw-r--r--mk/testcases/ddk-0.5.6-2991c1
-rw-r--r--mk/testcases/debian-sarge1
-rw-r--r--mk/testcases/debian-sid1
-rw-r--r--mk/testcases/fc31
-rwxr-xr-xmk/testcases/lsb41
-rw-r--r--mk/testcases/lsb-coreos-367.1.04
-rw-r--r--mk/testcases/lsb-ubuntu-6.103
-rw-r--r--mk/testcases/lsb-ubuntu-7.043
-rw-r--r--mk/testcases/oracle-51
-rw-r--r--mk/testcases/oracle-5u11
-rw-r--r--mk/testcases/rhel-3u61
-rw-r--r--mk/testcases/rhel-3u81
-rw-r--r--mk/testcases/rhel-41
-rw-r--r--mk/testcases/rhel-4u11
-rw-r--r--mk/testcases/rhel-4u21
-rw-r--r--mk/testcases/rhel-4u31
-rw-r--r--mk/testcases/rhel-4u41
-rw-r--r--mk/testcases/rhel-4u51
-rw-r--r--mk/testcases/rhel-4u61
-rw-r--r--mk/testcases/rhel-51
-rw-r--r--mk/testcases/rhel-5beta1
-rw-r--r--mk/testcases/rhel-5u11
-rw-r--r--mk/testcases/rhel-5u1beta1
-rw-r--r--mk/testcases/sdk-0.5.6-2991c1
-rw-r--r--mk/testcases/sles-10sp23
-rw-r--r--mk/testcases/sles-113
-rw-r--r--mk/testcases/sles-92
-rw-r--r--mk/testcases/sles-9sp33
-rw-r--r--mk/xe-guest-utilities.spec.in124
-rwxr-xr-xmk/xe-linux-distribution307
-rwxr-xr-xmk/xe-linux-distribution-test82
-rw-r--r--mk/xe-linux-distribution.init117
-rw-r--r--mk/xe-linux-distribution.service9
-rw-r--r--mk/xen-vcpu-hotplug.rules1
53 files changed, 1352 insertions, 17 deletions
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..1dfd687
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,6 @@
+Copyright (c) 2015, Citrix Systems
+All rights reserved.
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file
diff --git a/Makefile b/Makefile
index d5eeb5c..fa2563e 100644
--- a/Makefile
+++ b/Makefile
@@ -1,36 +1,70 @@
+PRODUCT_VERSION = 6.6.80
+
GO_BUILD = go build
GO_FLAGS = -a -x
-SRC_DIR = .
-BIN_DIR = bin
+REPO = $(shell pwd)
+SOURCEDIR = $(REPO)/mk
+BUILDDIR = $(REPO)/build
+STAGEDIR = $(BUILDDIR)/stage
+OBJECTDIR = $(BUILDDIR)/obj
+DISTDIR = $(BUILDDIR)/dist
+
+OBJECTS :=
+OBJECTS += $(OBJECTDIR)/xe-daemon
+OBJECTS += $(OBJECTDIR)/xenstore
-BINARIES :=
-BINARIES += $(BIN_DIR)/xe-daemon
-BINARIES += $(BIN_DIR)/xenstore
+PACKAGE = xe-guest-utilities
+VERSION = $(PRODUCT_VERSION)
+RELEASE := $(shell git rev-list HEAD | wc -l)
+ARCH := $(shell go version|awk -F'/' '{print $$2}')
+
+ifeq ($(ARCH), amd64)
+ ARCH = x86_64
+endif
XE_DAEMON_SOURCES :=
-XE_DAEMON_SOURCES += $(SRC_DIR)/xe-daemon/xe-daemon.go
-XE_DAEMON_SOURCES += $(SRC_DIR)/guestmetric/guestmetric.go
-XE_DAEMON_SOURCES += $(SRC_DIR)/guestmetric/guestmetric_linux.go
-XE_DAEMON_SOURCES += $(SRC_DIR)/xenstoreclient/xenstore.go
+XE_DAEMON_SOURCES += $(REPO)/xe-daemon/xe-daemon.go
+XE_DAEMON_SOURCES += $(REPO)/guestmetric/guestmetric.go
+XE_DAEMON_SOURCES += $(REPO)/guestmetric/guestmetric_linux.go
+XE_DAEMON_SOURCES += $(REPO)/xenstoreclient/xenstore.go
XENSTORE_SOURCES :=
-XENSTORE_SOURCES += $(SRC_DIR)/xenstore/xenstore.go
-XENSTORE_SOURCES += $(SRC_DIR)/xenstoreclient/xenstore.go
+XENSTORE_SOURCES += $(REPO)/xenstore/xenstore.go
+XENSTORE_SOURCES += $(REPO)/xenstoreclient/xenstore.go
.PHONY: build
-build: $(BINARIES)
+build: $(DISTDIR)/$(PACKAGE)_$(VERSION)-$(RELEASE)_$(ARCH).tgz
.PHONY: clean
clean:
- -rm -f $(BINARIES)
+ $(RM) -rf $(BUILDDIR)
+
+$(DISTDIR)/$(PACKAGE)_$(VERSION)-$(RELEASE)_$(ARCH).tgz: $(OBJECTS)
+ ( mkdir -p $(DISTDIR) ; \
+ install -d $(STAGEDIR)/etc/init.d/ ; \
+ install -m 755 $(SOURCEDIR)/xe-linux-distribution.init $(STAGEDIR)/etc/init.d/xe-linux-distribution ; \
+ install -d $(STAGEDIR)/usr/sbin/ ; \
+ install -m 755 $(SOURCEDIR)/xe-linux-distribution $(STAGEDIR)/usr/sbin/xe-linux-distribution ; \
+ install -m 755 $(OBJECTDIR)/xe-daemon $(STAGEDIR)/usr/sbin/xe-daemon ; \
+ install -d $(STAGEDIR)/usr/bin/ ; \
+ install -m 755 $(OBJECTDIR)/xenstore $(STAGEDIR)/usr/bin/xenstore ; \
+ ln -s /usr/bin/xenstore $(STAGEDIR)/usr/bin/xenstore-read ; \
+ ln -s /usr/bin/xenstore $(STAGEDIR)/usr/bin/xenstore-write ; \
+ ln -s /usr/bin/xenstore $(STAGEDIR)/usr/bin/xenstore-exists ; \
+ ln -s /usr/bin/xenstore $(STAGEDIR)/usr/bin/xenstore-rm ; \
+ install -d $(STAGEDIR)/etc/udev/rules.d/ ; \
+ install -m 644 $(SOURCEDIR)/xen-vcpu-hotplug.rules $(STAGEDIR)/etc/udev/rules.d/z10_xen-vcpu-hotplug.rules ; \
+ cd $(STAGEDIR) ; \
+ tar cf $@ * \
+ )
-$(BIN_DIR)/xe-daemon: $(XE_DAEMON_SOURCES)
- mkdir -p $(BIN_DIR)
+$(OBJECTDIR)/xe-daemon: $(XE_DAEMON_SOURCES)
+ mkdir -p $(OBJECTDIR)
$(GO_BUILD) $(GO_FLAGS) -o $@ $<
-$(BIN_DIR)/xenstore: $(XENSTORE_SOURCES)
- mkdir -p $(BIN_DIR)
+$(OBJECTDIR)/xenstore: $(XENSTORE_SOURCES)
+ mkdir -p $(OBJECTDIR)
$(GO_BUILD) $(GO_FLAGS) -o $@ $<
diff --git a/mk/Citrix.repo b/mk/Citrix.repo
new file mode 100644
index 0000000..b55385d
--- /dev/null
+++ b/mk/Citrix.repo
@@ -0,0 +1,7 @@
+[citrix]
+name=@PRODUCT_BRAND@ @PRODUCT_VERSION@ updates for @DISTRO@
+mirrorlist=http://updates.vmd.citrix.com/@PRODUCT_BRAND@/@PRODUCT_VERSION@/@DISTRO@/mirrorlist
+#baseurl=http://updates.vmd.citrix.com/@PRODUCT_BRAND@/@PRODUCT_VERSION@/@DISTRO@/
+gpgcheck=1
+gpgkey=http://updates.vmd.citrix.com/@PRODUCT_BRAND@/RPM-GPG-KEY-@PRODUCT_VERSION@
+enabled=1
diff --git a/mk/Makefile b/mk/Makefile
new file mode 100644
index 0000000..2767384
--- /dev/null
+++ b/mk/Makefile
@@ -0,0 +1,11 @@
+ifeq ($(COMPONENT),guest-utilities-rpm)
+include Makefile.rpm
+endif
+
+ifeq ($(COMPONENT),guest-utilities-deb)
+include Makefile.deb
+endif
+
+ifeq ($(COMPONENT),guest-utilities-tgz)
+include Makefile.tgz
+endif
diff --git a/mk/Makefile.deb b/mk/Makefile.deb
new file mode 100644
index 0000000..c9566b4
--- /dev/null
+++ b/mk/Makefile.deb
@@ -0,0 +1,172 @@
+# -*- makefile -*-
+USE_BRANDING := yes
+IMPORT_VERSIONS := yes
+include $(B_BASE)/common.mk
+
+REPO= $(call git_loc,xe-guest-utilities)
+REPOSTAMP= $(call git_req,xe-guest-utilities)
+
+ARCHS = i386 amd64
+DISTROS = lenny
+
+DEB_BUILT_COOKIE = $(MY_OBJ_DIR)/.deb_built_cookie
+DEB_REPO_COOKIE = $(MY_OBJ_DIR)/.deb_%_repo_cookie
+DEB_REPO_COOKIES = $(DISTROS:%=$(DEB_REPO_COOKIE))
+
+STAGING_DIR = $(MY_OBJ_DIR)/staging
+INSTALL_DIR = $(STAGING_DIR)/Linux/
+VERSIONS_FILE = $(MY_OBJ_DIR)/versions
+TOOLS_TARBALL = $(MY_OUTPUT_DIR)/tools-files.tar.bz2
+
+
+PACKAGE = xe-guest-utilities
+VERSION = $(PRODUCT_VERSION)
+RELEASE := $(shell git --git-dir="$(REPO)/.git" rev-list HEAD | wc -l)
+
+SOURCEDIR := $(MY_OBJ_DIR)/$(PACKAGE)-$(VERSION)/
+DEBIANDIR := $(SOURCEDIR)/debian/
+
+DEBPOOLDIR := debian/pool/main/x/xe-guest-utilities
+
+GOTARBALL = /distfiles/golang/go1.4.2.linux-386.tar.gz
+GOROOT = $(MY_OBJ_DIR)/go
+GOBIN = GOROOT=$(GOROOT) $(GOROOT)/bin/go
+GOFLAGS = -a -x
+GOBUILDDIR = $(MY_OBJ_DIR)/gobuild
+GO_SOURCE_REPO = $(call git_loc,xe-guest-utilities)
+
+XE_DAEMON_GO_SOURCES :=
+XE_DAEMON_GO_SOURCES += ./xe-daemon/xe-daemon.go # this should be the first one
+XE_DAEMON_GO_SOURCES += ./guestmetric/guestmetric.go
+XE_DAEMON_GO_SOURCES += ./guestmetric/guestmetric_linux.go
+XE_DAEMON_GO_SOURCES += ./xenstoreclient/xenstore.go
+
+XENSTORE_GO_SOURCES :=
+XENSTORE_GO_SOURCES += ./xenstore/xenstore.go # this should be the first one
+XENSTORE_GO_SOURCES += ./xenstoreclient/xenstore.go
+
+SOURCES :=
+SOURCES += $(SOURCEDIR)/xe-linux-distribution
+SOURCES += $(SOURCEDIR)/xe-daemon
+SOURCES += $(SOURCEDIR)/xenstore
+SOURCES += $(SOURCEDIR)/LICENSE
+SOURCES += $(SOURCEDIR)/citrix.list
+SOURCES += $(SOURCEDIR)/xen-vcpu-hotplug.rules
+SOURCES += $(DEBIANDIR)/xe-linux-distribution.init
+SOURCES += $(DEBIANDIR)/xe-guest-utilities.postinst
+SOURCES += $(DEBIANDIR)/xe-guest-utilities.prerm
+SOURCES += $(DEBIANDIR)/control
+SOURCES += $(DEBIANDIR)/changelog
+SOURCES += $(DEBIANDIR)/rules
+SOURCES += $(DEBIANDIR)/compat
+SOURCES += $(DEBIANDIR)/copyright
+SOURCES += $(DEBIANDIR)/$(PACKAGE).dirs
+
+822_DATE := $(shell date -R)
+
+.PHONY: build
+build: $(TOOLS_TARBALL) $(DEB_BUILT_COOKIE) $(DEB_REPO_COOKIES) $(ARCHS:%=$(MY_OUTPUT_DIR)/xe-guest-utilities.%.inc) $(MY_SOURCES)/MANIFEST
+ @ :
+
+.PHONY: clean
+clean:
+ rm -f $(DEB_BUILT_COOKIE)
+ rm -f $(DEB_REPO_COOKIES)
+ rm -rf $(GOROOT)
+ rm -rf $(SOURCEDIR)
+ rm -rf $(DEBIANDIR)
+ rm -f $(MY_OBJ_DIR)/overrides
+
+local-brand := sed -e 's,@VERSION@,$(VERSION),g' \
+ -e 's,@RELEASE@,$(RELEASE),g' \
+ -e "s!@822DATE@!$(822_DATE)!g"
+
+$(DEBIANDIR)/%: $(REPO)/%
+ mkdir -p $(DEBIANDIR)
+ $(call brand,$<) | $(call local-brand) > $@
+
+$(DEBIANDIR)/xe-linux-distribution.init: $(REPO)/mk/xe-linux-distribution.init
+ mkdir -p $(DEBIANDIR)
+ $(call brand,$<) | $(call local-brand) > $@
+
+$(SOURCEDIR)/%: $(REPO)/mk/%
+ mkdir -p $(SOURCEDIR)
+ $(call brand,$<) | $(call local-brand) > $@
+
+$(SOURCEDIR)/citrix.list: citrix.list
+ $(call brand,$<) > $@
+
+$(SOURCEDIR)/xe-daemon: $(XE_DAEMON_GO_SOURCES:%=$(REPO)/%) $(GOROOT)
+ $(GOBIN) build $(GOFLAGS) -o $@ $<
+
+$(SOURCEDIR)/xenstore: $(XENSTORE_GO_SOURCES:%=$(REPO)/%) $(GOROOT)
+ $(GOBIN) build $(GOFLAGS) -o $@ $<
+
+$(SOURCEDIR)/LICENSE: $(REPO)/LICENSE
+ $(call brand,$<) > $@
+
+$(GOBUILDDIR)/%: $(GO_SOURCE_REPO)/%
+ mkdir -p $$(dirname $@)
+ $(call brand,$<) > $@
+
+$(MY_OUTPUT_DIR)/xe-guest-utilities.%.inc: $(MY_OUTPUT_DIR)/.dirstamp
+ ( echo XE_GUEST_UTILITIES_PKG_NAME := xe-guest-utilities ; \
+ echo XE_GUEST_UTILITIES_PKG_VERSION := $(VERSION)-$(RELEASE) ; \
+ echo XE_GUEST_UTILITIES_PKG_ARCH := $* ; \
+ echo XE_GUEST_UTILITIES_PKG_FILE := $(DEBPOOLDIR)/$(PACKAGE)_$(VERSION)-$(RELEASE)_all.deb ; \
+ )>$@
+
+$(DEB_BUILT_COOKIE): $(SOURCES)
+ mkdir -p $(MY_OUTPUT_DIR)/$(DEBPOOLDIR)
+ chmod +x $(DEBIANDIR)/rules
+ cd $(SOURCEDIR) && dpkg-buildpackage -Zgzip -S -us -uc
+ cp $(MY_OBJ_DIR)/$(PACKAGE)_$(VERSION)-$(RELEASE).dsc $(MY_OUTPUT_DIR)/$(DEBPOOLDIR)
+ cp $(MY_OBJ_DIR)/$(PACKAGE)_$(VERSION)-$(RELEASE).tar.gz $(MY_OUTPUT_DIR)/$(DEBPOOLDIR)
+ set -xe ; for arch in $(ARCHS) ; do \
+ ( cd $(SOURCEDIR) && dpkg-buildpackage -Zgzip -b -a$${arch} -us -uc ) ; \
+ cp $(MY_OBJ_DIR)/$(PACKAGE)_$(VERSION)-$(RELEASE)_all.deb $(MY_OUTPUT_DIR)/$(DEBPOOLDIR) ; \
+ done
+ touch $@
+
+$(MY_SOURCES)/MANIFEST: $(MY_SOURCES_DIRSTAMP)
+ ( echo "$(COMPONENT) GPL file $(MY_OUTPUT_DIR)/$(DEBPOOLDIR)/$(PACKAGE)_$(VERSION)-$(RELEASE).dsc" ; \
+ echo "$(COMPONENT) GPL file $(MY_OUTPUT_DIR)/$(DEBPOOLDIR)/$(PACKAGE)_$(VERSION)-$(RELEASE).tar.gz" ; \
+ ) >$@
+
+.PHONY: sources
+sources: $(MY_SOURCES)/MANIFEST
+ @ :
+
+$(MY_OBJ_DIR)/overrides:
+ echo xe-guest-utilities optional base >$@
+
+$(DEB_REPO_COOKIE): $(DEB_BUILT_COOKIE) $(MY_OBJ_DIR)/overrides
+ mkdir -p $(MY_OUTPUT_DIR)/$(DEBPOOLDIR)
+ cp -La $(MY_OBJ_DIR)/*.deb $(MY_OUTPUT_DIR)/$(DEBPOOLDIR)
+ set -ex ; for arch in $(ARCHS) ; do \
+ bindir=debian/dists/$*/main/binary-$${arch} ; \
+ mkdir -p $(MY_OUTPUT_DIR)/$${bindir} ; \
+ ( cd $(MY_OUTPUT_DIR)/debian/ && \
+ dpkg-scanpackages -a$${arch} pool $(MY_OBJ_DIR)/overrides \
+ ) > $(MY_OUTPUT_DIR)/$${bindir}/Packages ; \
+ done
+ mkdir -p $(MY_OUTPUT_DIR)/debian/dists/$*/main/source
+ ( cd $(MY_OUTPUT_DIR)/debian/ && \
+ dpkg-scansources pool \
+ ) > $(MY_OUTPUT_DIR)/debian/dists/$*/main/source/Sources
+ touch $@
+
+# package up in a tools tarball so it gets on the ISO
+$(TOOLS_TARBALL): $(DEB_BUILT_COOKIE)
+ mkdir -p $(INSTALL_DIR)
+ rm -f $(INSTALL_DIR)/versions.deb
+ $(foreach arch,$(ARCHS),\
+ echo XE_GUEST_UTILITIES_PKG_FILE_$(arch)=\'xe-guest-utilities_$(VERSION)-$(RELEASE)_all.deb\' >> $(INSTALL_DIR)/versions.deb ; cp -v $(MY_OBJ_DIR)/xe-guest-utilities_$(VERSION)-$(RELEASE)_all.deb $(INSTALL_DIR)/ ;)
+ tar -C $(STAGING_DIR) -cjf $@ .
+
+$(GOROOT):
+ mkdir -p $(GOROOT)
+ ( cd $(GOROOT)/.. ; \
+ tar xf $(GOTARBALL) ;\
+ )
+
diff --git a/mk/Makefile.rpm b/mk/Makefile.rpm
new file mode 100644
index 0000000..b4d54a7
--- /dev/null
+++ b/mk/Makefile.rpm
@@ -0,0 +1,128 @@
+# -*- makefile -*-
+USE_BRANDING := yes
+IMPORT_VERSIONS := yes
+include $(B_BASE)/common.mk
+
+RPM_LOCAL_RPMBUILD_OPTIONS := -D '_source_payload w9.gzdio' -D '_binary_payload w9.gzdio' \
+ -D '_source_filedigest_algorithm 0' -D '_binary_filedigest_algorithm 0'
+include $(B_BASE)/rpmbuild.mk
+
+RPM_BUILT_COOKIE = $(MY_OBJ_DIR)/.rpm_built_cookie
+
+REPO= $(call git_loc,xe-guest-utilities)
+REPOSTAMP= $(call git_req,xe-guest-utilities)
+
+STAGING_DIR = $(MY_OBJ_DIR)/staging
+INSTALL_DIR = $(STAGING_DIR)/Linux/
+VERSIONS_FILE = $(MY_OBJ_DIR)/versions
+
+ARCHS = i386 x86_64
+
+VERSION = $(PRODUCT_VERSION)
+RELEASE := $(shell git --git-dir="$(REPO)/.git" rev-list HEAD | wc -l)
+
+SPEC= xe-guest-utilities.spec
+SRPM= xe-guest-utilities-$(VERSION)-$(RELEASE).src.rpm
+
+GOTARBALL = /distfiles/golang/go1.4.2.linux-386.tar.gz
+GOROOT = $(MY_OBJ_DIR)/go
+GOBIN = GOROOT=$(GOROOT) $(GOROOT)/bin/go
+GOFLAGS = -a -x
+GOBUILDDIR = $(MY_OBJ_DIR)/gobuild
+
+GO_SOURCE_REPO = $(call git_loc,xe-guest-utilities)
+
+XE_DAEMON_GO_SOURCES :=
+XE_DAEMON_GO_SOURCES += ./xe-daemon/xe-daemon.go # this should be the first one
+XE_DAEMON_GO_SOURCES += ./guestmetric/guestmetric.go
+XE_DAEMON_GO_SOURCES += ./guestmetric/guestmetric_linux.go
+XE_DAEMON_GO_SOURCES += ./xenstoreclient/xenstore.go
+
+XENSTORE_GO_SOURCES :=
+XENSTORE_GO_SOURCES += ./xenstore/xenstore.go # this should be the first one
+XENSTORE_GO_SOURCES += ./xenstoreclient/xenstore.go
+
+SOURCES :=
+SOURCES += $(RPM_SOURCESDIR)/xe-linux-distribution
+SOURCES += $(RPM_SOURCESDIR)/xe-linux-distribution.init
+SOURCES += $(RPM_SOURCESDIR)/xe-daemon
+SOURCES += $(RPM_SOURCESDIR)/xenstore
+
+SOURCES += $(RPM_SOURCESDIR)/Citrix.repo
+SOURCES += $(RPM_SOURCESDIR)/xen-vcpu-hotplug.rules
+SOURCES += $(RPM_SOURCESDIR)/LICENSE
+
+TOOLS_TARBALL = $(MY_OUTPUT_DIR)/tools-files.tar.bz2
+
+.PHONY: build
+build: $(RPM_BUILT_COOKIE) $(RPM_DIRECTORIES) $(TOOLS_TARBALL) $(ARCHS:%=$(MY_OUTPUT_DIR)/xe-guest-utilities.%.inc) $(MY_SOURCES)/MANIFEST
+ @ :
+
+.PHONY: clean
+clean:
+ rm -f $(RPM_SPECSDIR)/$(SPEC)
+ rm -rf $(RPM_BUILDDIR) $(RPM_SOURCESDIR) $(RPM_SPECSDIR)
+ rm -f $(RPM_BUILT_COOKIE)
+ rm -rf $(GOROOT)
+ rm -rf $(DESTDIR)
+
+$(RPM_SPECSDIR)/$(SPEC): $(SPEC).in
+ $(call brand,$<) | \
+ sed -e 's,@VERSION@,$(VERSION),g' \
+ -e 's,@RELEASE@,$(RELEASE),g' \
+ > $@
+
+$(MY_OUTPUT_DIR)/xe-guest-utilities.%.inc: $(MY_OUTPUT_DIR)/.dirstamp
+ ( echo XE_GUEST_UTILITIES_PKG_NAME := xe-guest-utilities ; \
+ echo XE_GUEST_UTILITIES_PKG_VERSION := $(VERSION)-$(RELEASE) ; \
+ echo XE_GUEST_UTILITIES_PKG_ARCH := $* ; \
+ echo XE_GUEST_UTILITIES_PKG_FILE := RPMS/$*/xe-guest-utilities-$(VERSION)-$(RELEASE).$*.rpm ; \
+ )>$@
+
+$(RPM_BUILT_COOKIE): $(RPM_DIRECTORIES) $(RPM_SPECSDIR)/$(SPEC) $(SOURCES)
+ $(RPMBUILD) -bs $(RPM_SPECSDIR)/$(SPEC)
+ set -ex ; for arch in $(ARCHS) ; do \
+ $(RPMBUILD) --target=$${arch} --rebuild $(RPM_SRPMSDIR)/$(SRPM) ; \
+ done
+
+$(MY_SOURCES)/MANIFEST: $(MY_SOURCES_DIRSTAMP)
+ ( echo "$(COMPONENT) GPL file $(RPM_SRPMSDIR)/$(SRPM)" ; \
+ ) >$@
+
+.PHONY: sources
+sources: $(MY_SOURCES)/MANIFEST
+ @ :
+
+$(RPM_SOURCESDIR)/%: $(REPO)/mk/%
+ mkdir -p $(RPM_SOURCESDIR)
+ $(call brand,$<) > $@
+
+$(RPM_SOURCESDIR)/xe-daemon: $(XE_DAEMON_GO_SOURCES:%=$(REPO)/%) $(GOROOT)
+ $(GOBIN) build $(GOFLAGS) -o $@ $<
+
+$(RPM_SOURCESDIR)/xenstore: $(XENSTORE_GO_SOURCES:%=$(REPO)/%) $(GOROOT)
+ $(GOBIN) build $(GOFLAGS) -o $@ $<
+
+$(RPM_SOURCESDIR)/LICENSE: $(REPO)/LICENSE
+ $(call brand,$<) > $@
+
+$(GOBUILDDIR)/%: $(GO_SOURCE_REPO)/%
+ mkdir -p $$(dirname $@)
+ $(call brand,$<) > $@
+
+$(TOOLS_TARBALL): $(RPM_BUILT_COOKIE)
+ mkdir -p $(INSTALL_DIR)
+ rm -f $(INSTALL_DIR)/versions.rpm
+ $(foreach arch,$(ARCHS),\
+ echo XE_GUEST_UTILITIES_PKG_FILE_$(arch)=\'xe-guest-utilities-$(VERSION)-$(RELEASE).$(arch).rpm xe-guest-utilities-xenstore-$(VERSION)-$(RELEASE).$(arch).rpm\' >> $(INSTALL_DIR)/versions.rpm ;\
+ cp -v $(MY_OUTPUT_DIR)/RPMS/$(arch)/xe-guest-utilities-$(VERSION)-$(RELEASE).$(arch).rpm $(INSTALL_DIR)/ ;\
+ cp -v $(MY_OUTPUT_DIR)/RPMS/$(arch)/xe-guest-utilities-xenstore-$(VERSION)-$(RELEASE).$(arch).rpm $(INSTALL_DIR)/ ;\
+ )
+ tar -C $(STAGING_DIR) -cjf $@ .
+
+$(GOROOT):
+ mkdir -p $(GOROOT)
+ ( cd $(GOROOT)/.. ; \
+ tar xf $(GOTARBALL) ;\
+ )
+
diff --git a/mk/Makefile.tgz b/mk/Makefile.tgz
new file mode 100644
index 0000000..e710224
--- /dev/null
+++ b/mk/Makefile.tgz
@@ -0,0 +1,143 @@
+# -*- makefile -*-
+USE_BRANDING := yes
+IMPORT_VERSIONS := yes
+include $(B_BASE)/common.mk
+
+REPO= $(call git_loc,xe-guest-utilities)
+REPOSTAMP= $(call git_req,xe-guest-utilities)
+
+ARCHS = i386 amd64
+DISTROS = linux
+
+TGZ_BUILT_COOKIE = $(MY_OBJ_DIR)/.tgz_built_cookie
+TGZ_REPO_COOKIE = $(MY_OBJ_DIR)/.tgz_%_repo_cookie
+TGZ_REPO_COOKIES = $(DISTROS:%=$(TGZ_REPO_COOKIE))
+
+STAGING_DIR = $(MY_OBJ_DIR)/staging
+INSTALL_DIR = $(STAGING_DIR)/Linux/
+VERSIONS_FILE = $(MY_OBJ_DIR)/versions
+TOOLS_TARBALL = $(MY_OUTPUT_DIR)/tools-files.tar.bz2
+
+
+PACKAGE = xe-guest-utilities
+VERSION = $(PRODUCT_VERSION)
+RELEASE := $(shell git --git-dir="$(REPO)/.git" rev-list HEAD | wc -l)
+
+SOURCEDIR := $(MY_OBJ_DIR)/$(PACKAGE)-$(VERSION)/
+DESTDIR := $(MY_OBJ_DIR)/$(PACKAGE)/
+
+
+GOTARBALL = /distfiles/golang/go1.4.2.linux-386.tar.gz
+GOROOT = $(MY_OBJ_DIR)/go
+GOBIN = GOROOT=$(GOROOT) $(GOROOT)/bin/go
+GOFLAGS = -a -x
+GOBUILDDIR = $(MY_OBJ_DIR)/gobuild
+
+GO_SOURCE_REPO = $(call git_loc,xe-guest-utilities)
+
+XE_DAEMON_GO_SOURCES :=
+XE_DAEMON_GO_SOURCES += ./xe-daemon/xe-daemon.go # this should be the first one
+XE_DAEMON_GO_SOURCES += ./guestmetric/guestmetric.go
+XE_DAEMON_GO_SOURCES += ./guestmetric/guestmetric_linux.go
+XE_DAEMON_GO_SOURCES += ./xenstoreclient/xenstore.go
+
+XENSTORE_GO_SOURCES :=
+XENSTORE_GO_SOURCES += ./xenstore/xenstore.go # this should be the first one
+XENSTORE_GO_SOURCES += ./xenstoreclient/xenstore.go
+
+SOURCES :=
+SOURCES += $(REPO)/LICENSE
+SOURCES += $(SOURCEDIR)/xe-linux-distribution
+SOURCES += $(SOURCEDIR)/xe-linux-distribution.init
+SOURCES += $(SOURCEDIR)/xe-daemon
+SOURCES += $(SOURCEDIR)/xenstore
+SOURCES += $(SOURCEDIR)/citrix.list
+SOURCES += $(SOURCEDIR)/xen-vcpu-hotplug.rules
+
+822_DATE := $(shell date -R)
+
+.PHONY: build
+build: $(TOOLS_TARBALL) $(TGZ_BUILT_COOKIE) $(TGZ_REPO_COOKIES) $(ARCHS:%=$(MY_OUTPUT_DIR)/xe-guest-utilities.%.inc) $(MY_SOURCES)/MANIFEST
+ @ :
+
+.PHONY: clean
+clean:
+ rm -f $(TGZ_BUILT_COOKIE)
+ rm -f $(TGZ_REPO_COOKIES)
+ rm -rf $(GOROOT)
+ rm -rf $(SOURCEDIR)
+ rm -rf $(DESTDIR)
+
+local-brand := sed -e 's,@VERSION@,$(VERSION),g' \
+ -e 's,@RELEASE@,$(RELEASE),g' \
+ -e "s!@822DATE@!$(822_DATE)!g"
+
+$(SOURCEDIR)/%: $(REPO)/mk/%
+ mkdir -p $(SOURCEDIR)
+ $(call brand,$<) | $(call local-brand) > $@
+
+$(SOURCEDIR)/citrix.list: citrix.list
+ $(call brand,$<) > $@
+
+$(SOURCEDIR)/xe-daemon: $(XE_DAEMON_GO_SOURCES:%=$(REPO)/%) $(GOROOT)
+ $(GOBIN) build $(GOFLAGS) -o $@ $<
+
+$(SOURCEDIR)/xenstore: $(XENSTORE_GO_SOURCES:%=$(REPO)/%) $(GOROOT)
+ $(GOBIN) build $(GOFLAGS) -o $@ $<
+
+$(GOBUILDDIR)/%: $(GO_SOURCE_REPO)/%
+ mkdir -p $$(dirname $@)
+ $(call brand,$<) > $@
+
+$(MY_OUTPUT_DIR)/xe-guest-utilities.%.inc: $(MY_OUTPUT_DIR)/.dirstamp
+ ( echo XE_GUEST_UTILITIES_PKG_NAME := xe-guest-utilities ; \
+ echo XE_GUEST_UTILITIES_PKG_VERSION := $(VERSION)-$(RELEASE) ; \
+ echo XE_GUEST_UTILITIES_PKG_ARCH := $* ; \
+ echo XE_GUEST_UTILITIES_PKG_FILE := $(MY_OBJ_DIR)/$(PACKAGE)_$(VERSION)-$(RELEASE)_all.tgz ; \
+ )>$@
+
+$(TGZ_BUILT_COOKIE): $(SOURCES)
+ ( cd $(SOURCEDIR) ; \
+ install -d $(DESTDIR)/etc/init.d/ ; \
+ install -m 755 xe-linux-distribution.init $(DESTDIR)/etc/init.d/xe-linux-distribution ; \
+ install -d $(DESTDIR)/usr/sbin/ ; \
+ install -m 755 xe-linux-distribution $(DESTDIR)/usr/sbin/xe-linux-distribution ; \
+ install -m 755 xe-daemon $(DESTDIR)/usr/sbin/xe-daemon ; \
+ install -d $(DESTDIR)/usr/bin/ ; \
+ install -m 755 xenstore $(DESTDIR)/usr/bin/xenstore ; \
+ ln -s /usr/bin/xenstore $(DESTDIR)/usr/bin/xenstore-read ; \
+ ln -s /usr/bin/xenstore $(DESTDIR)/usr/bin/xenstore-write ; \
+ ln -s /usr/bin/xenstore $(DESTDIR)/usr/bin/xenstore-exists ; \
+ ln -s /usr/bin/xenstore $(DESTDIR)/usr/bin/xenstore-rm ; \
+ install -d $(DESTDIR)/etc/udev/rules.d/ ; \
+ install -m 644 xen-vcpu-hotplug.rules $(DESTDIR)/etc/udev/rules.d/z10_xen-vcpu-hotplug.rules ; \
+ install -d $(DESTDIR)/usr/share/doc/$(PACKAGE)_$(VERSION)/ ; \
+ install -m 644 $(REPO)/LICENSE $(DESTDIR)/usr/share/doc/$(PACKAGE)_$(VERSION)/LICENSE ; \
+ cd $(DESTDIR) ; \
+ tar cvf $(MY_OBJ_DIR)/$(PACKAGE)_$(VERSION)-$(RELEASE)_all.tgz * \
+ )>$@
+
+$(MY_SOURCES)/MANIFEST: $(MY_SOURCES_DIRSTAMP)
+ echo >$@
+
+.PHONY: sources
+sources: $(MY_SOURCES)/MANIFEST
+ @ :
+
+$(TGZ_REPO_COOKIE): $(TGZ_BUILT_COOKIE)
+ touch $@
+
+# package up in a tools tarball so it gets on the ISO
+$(TOOLS_TARBALL): $(TGZ_BUILT_COOKIE)
+ mkdir -p $(INSTALL_DIR)
+ rm -f $(INSTALL_DIR)/versions.tgz
+ $(foreach arch,$(ARCHS),\
+ echo XE_GUEST_UTILITIES_PKG_FILE_$(arch)=\'xe-guest-utilities_$(VERSION)-$(RELEASE)_all.tgz\' >> $(INSTALL_DIR)/versions.tgz ; cp -v $(MY_OBJ_DIR)/xe-guest-utilities_$(VERSION)-$(RELEASE)_all.tgz $(INSTALL_DIR)/ ;)
+ tar -C $(STAGING_DIR) -cjf $@ .
+
+$(GOROOT):
+ mkdir -p $(GOROOT)
+ ( cd $(GOROOT)/.. ; \
+ tar xf $(GOTARBALL) ;\
+ )
+
diff --git a/mk/citrix.list b/mk/citrix.list
new file mode 100644
index 0000000..3dbc4f5
--- /dev/null
+++ b/mk/citrix.list
@@ -0,0 +1,2 @@
+deb http://updates.vmd.citrix.com/@PRODUCT_BRAND@/@PRODUCT_VERSION@/debian/ @DISTRO@ main
+deb-src http://updates.vmd.citrix.com/@PRODUCT_BRAND@/@PRODUCT_VERSION@/debian/ @DISTRO@ main
diff --git a/mk/debian/changelog b/mk/debian/changelog
new file mode 100644
index 0000000..c348f51
--- /dev/null
+++ b/mk/debian/changelog
@@ -0,0 +1,5 @@
+xe-guest-utilities (@VERSION@-@RELEASE@) etch; urgency=low
+
+ * Build for @PRODUCT_NAME@ @PRODUCT_VERSION@-@BUILD_NUMBER@.
+
+ -- @COMPANY_NAME_LEGAL@ <www.citrix.com> @822DATE@
diff --git a/mk/debian/compat b/mk/debian/compat
new file mode 100644
index 0000000..7ed6ff8
--- /dev/null
+++ b/mk/debian/compat
@@ -0,0 +1 @@
+5
diff --git a/mk/debian/control b/mk/debian/control
new file mode 100644
index 0000000..4ffdb45
--- /dev/null
+++ b/mk/debian/control
@@ -0,0 +1,15 @@
+Source: xe-guest-utilities
+Section: main/admin
+Priority: optional
+Maintainer: Citrix Systems, Inc. <www.citrix.com>
+Standards-Version: 3.7.2
+Build-Depends: debhelper (>= 4.0.0)
+
+Package: xe-guest-utilities
+Architecture: all
+Conflicts: xengmond
+Replaces: xengmond
+Description: @BRAND_GUEST@ Monitoring Scripts
+ Scripts for monitoring @BRAND_GUESTS@.
+ .
+ Writes distribution version information and IP address to XenStore.
diff --git a/mk/debian/copyright b/mk/debian/copyright
new file mode 100644
index 0000000..0e9cb3d
--- /dev/null
+++ b/mk/debian/copyright
@@ -0,0 +1 @@
+See the LICENSE file in the /usr/share/doc/xe-guest-utilities
diff --git a/mk/debian/overrides b/mk/debian/overrides
new file mode 100644
index 0000000..e1ed710
--- /dev/null
+++ b/mk/debian/overrides
@@ -0,0 +1 @@
+xengmond optional non-free/admin
diff --git a/mk/debian/rules b/mk/debian/rules
new file mode 100644
index 0000000..061411d
--- /dev/null
+++ b/mk/debian/rules
@@ -0,0 +1,55 @@
+#!/usr/bin/make -f
+
+build: build-stamp
+build-stamp:
+ touch $@
+
+clean:
+ dh_testdir
+ dh_testroot
+
+ dh_clean
+
+binary: binary-arch binary-indep
+
+binary-arch: DESTDIR=debian/xe-guest-utilities
+binary-arch: build
+ dh_testdir
+ dh_testroot
+
+ dh_clean -k
+
+ dh_installdirs
+
+ cp xe-linux-distribution $(DESTDIR)/usr/sbin/xe-linux-distribution
+ chmod 0755 $(DESTDIR)/usr/sbin/xe-linux-distribution
+
+ install -d $(DESTDIR)/usr/bin/
+ install -m 755 xenstore $(DESTDIR)/usr/bin/xenstore
+ ln -s /usr/bin/xenstore $(DESTDIR)/usr/bin/xenstore-read
+ ln -s /usr/bin/xenstore $(DESTDIR)/usr/bin/xenstore-write
+ ln -s /usr/bin/xenstore $(DESTDIR)/usr/bin/xenstore-exists
+ ln -s /usr/bin/xenstore $(DESTDIR)/usr/bin/xenstore-rm
+
+ cp xe-daemon $(DESTDIR)/usr/sbin/xe-daemon
+ chmod 0755 $(DESTDIR)/usr/sbin/xe-daemon
+
+ cp xen-vcpu-hotplug.rules $(DESTDIR)/lib/udev/rules.d/z10_xen-vcpu-hotplug.rules
+
+ dh_installinit --name xe-linux-distribution
+
+ dh_install citrix.list /usr/share/xe-guest-utilities
+
+ dh_installdocs LICENSE
+
+ dh_strip
+ dh_compress
+ dh_fixperms
+ dh_makeshlibs
+ dh_shlibdeps
+ dh_installdeb
+ dh_gencontrol
+ dh_md5sums
+ dh_builddeb
+
+binary-indep:
diff --git a/mk/debian/xe-guest-utilities.dirs b/mk/debian/xe-guest-utilities.dirs
new file mode 100644
index 0000000..f7cc935
--- /dev/null
+++ b/mk/debian/xe-guest-utilities.dirs
@@ -0,0 +1,3 @@
+etc/init.d
+lib/udev/rules.d
+usr/sbin
diff --git a/mk/debian/xe-guest-utilities.postinst b/mk/debian/xe-guest-utilities.postinst
new file mode 100755
index 0000000..208aaa0
--- /dev/null
+++ b/mk/debian/xe-guest-utilities.postinst
@@ -0,0 +1,20 @@
+#!/bin/sh
+
+#DEBHELPER#
+
+if [ X"$1" = X"configure" ] ; then
+ eval $(/usr/sbin/xe-linux-distribution)
+ if [ -d /etc/apt/sources.list.d ] && [ X"${os_distro}" = X"debian" ] \
+ && [ -n "${os_majorver}" ] && [ -n "${os_minorver}" ] ; then
+ case "${os_majorver}${os_minorver}" in
+ 50) distro="lenny" ;;
+ *) ;;
+ esac
+ if [ -n "${distro}" ] ; then
+ rm -f /etc/apt/sources.list.d/xensource.list # contains deprecated urls
+ sed -e "s/@DISTRO@/${distro}/g" \
+ < /usr/share/xe-guest-utilities/citrix.list \
+ > /etc/apt/sources.list.d/citrix.list
+ fi
+ fi
+fi
diff --git a/mk/debian/xe-guest-utilities.prerm b/mk/debian/xe-guest-utilities.prerm
new file mode 100755
index 0000000..68f2184
--- /dev/null
+++ b/mk/debian/xe-guest-utilities.prerm
@@ -0,0 +1,7 @@
+#!/bin/sh
+
+if [ X"$1" = X"remove" ] && [ -e /etc/apt/sources.list.d/citrix.list ] ; then
+ rm /etc/apt/sources.list.d/citrix.list
+fi
+
+#DEBHELPER#
diff --git a/mk/testcases/centos4 b/mk/testcases/centos4
new file mode 100644
index 0000000..34c6a8a
--- /dev/null
+++ b/mk/testcases/centos4
@@ -0,0 +1 @@
+CentOS release 4.0 (Final)
diff --git a/mk/testcases/centos5 b/mk/testcases/centos5
new file mode 100644
index 0000000..e1d8ca0
--- /dev/null
+++ b/mk/testcases/centos5
@@ -0,0 +1 @@
+CentOS release 5 (Final)
diff --git a/mk/testcases/ddk-0.5.6-2991c b/mk/testcases/ddk-0.5.6-2991c
new file mode 100644
index 0000000..1151864
--- /dev/null
+++ b/mk/testcases/ddk-0.5.6-2991c
@@ -0,0 +1 @@
+Rio DDK release 0.5.6-2991c (xenenterprise)
diff --git a/mk/testcases/debian-sarge b/mk/testcases/debian-sarge
new file mode 100644
index 0000000..8c50098
--- /dev/null
+++ b/mk/testcases/debian-sarge
@@ -0,0 +1 @@
+3.1
diff --git a/mk/testcases/debian-sid b/mk/testcases/debian-sid
new file mode 100644
index 0000000..9ded89b
--- /dev/null
+++ b/mk/testcases/debian-sid
@@ -0,0 +1 @@
+lenny/sid
diff --git a/mk/testcases/fc3 b/mk/testcases/fc3
new file mode 100644
index 0000000..a42cc82
--- /dev/null
+++ b/mk/testcases/fc3
@@ -0,0 +1 @@
+Fedora Core release 3 (Heidelberg)
diff --git a/mk/testcases/lsb b/mk/testcases/lsb
new file mode 100755
index 0000000..c691772
--- /dev/null
+++ b/mk/testcases/lsb
@@ -0,0 +1,41 @@
+#!/bin/sh
+
+set -e
+
+if [ $1 != "--short" ] ; then
+ echo "Invalid parameter: $1" 1>&2
+ exit 1
+fi
+
+if [ ! -f "${TESTCASE}" ] ; then
+ echo "Testcase ${TESTCASE} not found" 1>&2
+ exit 1
+fi
+
+case $(basename ${TESTCASE}) in
+ lsb-*) ;;
+ *) exit 1
+esac
+
+. ${TESTCASE}
+
+if [ -z "$ID" ] ; then
+ ID="$DISTRIB_ID"
+fi
+if [ -z "$DESCRIPTION" ] ; then
+ DESCRIPTION="$DISTRIB_DESCRIPTION"
+fi
+if [ -z "$RELEASE" ] ; then
+ RELEASE="$DISTRIB_RELEASE"
+fi
+
+case $2 in
+ --id) echo ${ID} ;;
+ --description) echo ${DESCRIPTION} ;;
+ --release) echo ${RELEASE} ;;
+ *)
+ echo "Invalid paramter: $2" 1>&2
+ exit 1;;
+esac
+
+exit 0
diff --git a/mk/testcases/lsb-coreos-367.1.0 b/mk/testcases/lsb-coreos-367.1.0
new file mode 100644
index 0000000..b5ebcc7
--- /dev/null
+++ b/mk/testcases/lsb-coreos-367.1.0
@@ -0,0 +1,4 @@
+DISTRIB_ID=CoreOS
+DISTRIB_RELEASE=367.1.0
+DISTRIB_CODENAME="Red Dog"
+DISTRIB_DESCRIPTION="CoreOS 367.1.0" \ No newline at end of file
diff --git a/mk/testcases/lsb-ubuntu-6.10 b/mk/testcases/lsb-ubuntu-6.10
new file mode 100644
index 0000000..5a6f488
--- /dev/null
+++ b/mk/testcases/lsb-ubuntu-6.10
@@ -0,0 +1,3 @@
+ID="Ubuntu"
+DESCRPITON="Ubuntu 6.10"
+RELEASE="6.10"
diff --git a/mk/testcases/lsb-ubuntu-7.04 b/mk/testcases/lsb-ubuntu-7.04
new file mode 100644
index 0000000..c857156
--- /dev/null
+++ b/mk/testcases/lsb-ubuntu-7.04
@@ -0,0 +1,3 @@
+ID="Ubuntu"
+DESCRIPTION="Ubuntu 7.04"
+RELEASE="7.04"
diff --git a/mk/testcases/oracle-5 b/mk/testcases/oracle-5
new file mode 100644
index 0000000..542c826
--- /dev/null
+++ b/mk/testcases/oracle-5
@@ -0,0 +1 @@
+Enterprise Linux Enterprise Linux Server release 5 (Carthage)
diff --git a/mk/testcases/oracle-5u1 b/mk/testcases/oracle-5u1
new file mode 100644
index 0000000..fad6c3c
--- /dev/null
+++ b/mk/testcases/oracle-5u1
@@ -0,0 +1 @@
+Enterprise Linux Enterprise Linux Server release 5.1 (Carthage)
diff --git a/mk/testcases/rhel-3u6 b/mk/testcases/rhel-3u6
new file mode 100644
index 0000000..97004ce
--- /dev/null
+++ b/mk/testcases/rhel-3u6
@@ -0,0 +1 @@
+Red Hat Enterprise Linux AS release 3 (Taroon Update 6)
diff --git a/mk/testcases/rhel-3u8 b/mk/testcases/rhel-3u8
new file mode 100644
index 0000000..0d75450
--- /dev/null
+++ b/mk/testcases/rhel-3u8
@@ -0,0 +1 @@
+Red Hat Enterprise Linux AS release 3 (Taroon Update 8)
diff --git a/mk/testcases/rhel-4 b/mk/testcases/rhel-4
new file mode 100644
index 0000000..62e7d40
--- /dev/null
+++ b/mk/testcases/rhel-4
@@ -0,0 +1 @@
+Red Hat Enterprise Linux AS release 4 (Nahant)
diff --git a/mk/testcases/rhel-4u1 b/mk/testcases/rhel-4u1
new file mode 100644
index 0000000..cf62351
--- /dev/null
+++ b/mk/testcases/rhel-4u1
@@ -0,0 +1 @@
+Red Hat Enterprise Linux AS release 4 (Nahant Update 1)
diff --git a/mk/testcases/rhel-4u2 b/mk/testcases/rhel-4u2
new file mode 100644
index 0000000..76100de
--- /dev/null
+++ b/mk/testcases/rhel-4u2
@@ -0,0 +1 @@
+Red Hat Enterprise Linux AS release 4 (Nahant Update 2)
diff --git a/mk/testcases/rhel-4u3 b/mk/testcases/rhel-4u3
new file mode 100644
index 0000000..a258c65
--- /dev/null
+++ b/mk/testcases/rhel-4u3
@@ -0,0 +1 @@
+Red Hat Enterprise Linux AS release 4 (Nahant Update 3)
diff --git a/mk/testcases/rhel-4u4 b/mk/testcases/rhel-4u4
new file mode 100644
index 0000000..50ace04
--- /dev/null
+++ b/mk/testcases/rhel-4u4
@@ -0,0 +1 @@
+Red Hat Enterprise Linux AS release 4 (Nahant Update 4)
diff --git a/mk/testcases/rhel-4u5 b/mk/testcases/rhel-4u5
new file mode 100644
index 0000000..cf83112
--- /dev/null
+++ b/mk/testcases/rhel-4u5
@@ -0,0 +1 @@
+Red Hat Enterprise Linux ES release 4 (Nahant Update 5)
diff --git a/mk/testcases/rhel-4u6 b/mk/testcases/rhel-4u6
new file mode 100644
index 0000000..51ad006
--- /dev/null
+++ b/mk/testcases/rhel-4u6
@@ -0,0 +1 @@
+Red Hat Enterprise Linux AS release 4 (Nahant Update 6)
diff --git a/mk/testcases/rhel-5 b/mk/testcases/rhel-5
new file mode 100644
index 0000000..515506f
--- /dev/null
+++ b/mk/testcases/rhel-5
@@ -0,0 +1 @@
+Red Hat Enterprise Linux Server release 5 (Tikanga)
diff --git a/mk/testcases/rhel-5beta b/mk/testcases/rhel-5beta
new file mode 100644
index 0000000..1cb8fcf
--- /dev/null
+++ b/mk/testcases/rhel-5beta
@@ -0,0 +1 @@
+Red Hat Enterprise Linux Server release 4.92 (Tikanga)
diff --git a/mk/testcases/rhel-5u1 b/mk/testcases/rhel-5u1
new file mode 100644
index 0000000..5b6c571
--- /dev/null
+++ b/mk/testcases/rhel-5u1
@@ -0,0 +1 @@
+Red Hat Enterprise Linux Server release 5.1 (Tikanga)
diff --git a/mk/testcases/rhel-5u1beta b/mk/testcases/rhel-5u1beta
new file mode 100644
index 0000000..65824b5
--- /dev/null
+++ b/mk/testcases/rhel-5u1beta
@@ -0,0 +1 @@
+Red Hat Enterprise Linux Server release 5.1 Beta (Tikanga)
diff --git a/mk/testcases/sdk-0.5.6-2991c b/mk/testcases/sdk-0.5.6-2991c
new file mode 100644
index 0000000..595adc5
--- /dev/null
+++ b/mk/testcases/sdk-0.5.6-2991c
@@ -0,0 +1 @@
+Rio SDK release 0.5.6-2991c (xenenterprise)
diff --git a/mk/testcases/sles-10sp2 b/mk/testcases/sles-10sp2
new file mode 100644
index 0000000..a01febe
--- /dev/null
+++ b/mk/testcases/sles-10sp2
@@ -0,0 +1,3 @@
+SUSE Linux Enterprise Server 10 (i586)
+VERSION = 10
+PATCHLEVEL = 2
diff --git a/mk/testcases/sles-11 b/mk/testcases/sles-11
new file mode 100644
index 0000000..d2ec72d
--- /dev/null
+++ b/mk/testcases/sles-11
@@ -0,0 +1,3 @@
+SUSE Linux Enterprise Server 11 (i586)
+VERSION = 11
+PATCHLEVEL = 0
diff --git a/mk/testcases/sles-9 b/mk/testcases/sles-9
new file mode 100644
index 0000000..0418afa
--- /dev/null
+++ b/mk/testcases/sles-9
@@ -0,0 +1,2 @@
+SUSE LINUX Enterprise Server 9 (i586)
+VERSION = 9
diff --git a/mk/testcases/sles-9sp3 b/mk/testcases/sles-9sp3
new file mode 100644
index 0000000..8f66b47
--- /dev/null
+++ b/mk/testcases/sles-9sp3
@@ -0,0 +1,3 @@
+SUSE LINUX Enterprise Server 9 (i586)
+VERSION = 9
+PATCHLEVEL = 3
diff --git a/mk/xe-guest-utilities.spec.in b/mk/xe-guest-utilities.spec.in
new file mode 100644
index 0000000..686b7e2
--- /dev/null
+++ b/mk/xe-guest-utilities.spec.in
@@ -0,0 +1,124 @@
+# -*- rpm-spec -*-
+
+Summary: @BRAND_GUEST@ Monitoring Scripts
+Name: xe-guest-utilities
+Version: @VERSION@
+Release: @RELEASE@
+License: GPL/LGPL
+Group: Xen
+URL: http://www.citrix.com
+Vendor: @COMPANY_NAME_LEGAL@
+Source0: xe-linux-distribution
+Source1: xe-linux-distribution.init
+Source3: xe-daemon
+Source5: Citrix.repo
+Source6: xenstore
+Source8: LICENSE
+Source9: xen-vcpu-hotplug.rules
+BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-buildroot
+BuildRequires: golang
+Obsoletes: xengmond
+
+%description
+Scripts for monitoring @BRAND_GUESTS@.
+
+Writes distribution version information and IP address to XenStore.
+
+%package xenstore
+Summary: @BRAND_GUEST@ XenStore utilities
+Group: Xen
+%description xenstore
+Utilities for interacting with XenStore from with a Xen virtual machine
+
+%prep
+# Nothing to do
+%build
+# Nothing to do
+
+%install
+rm -rf %{buildroot}
+
+mkdir -p %{buildroot}/usr/sbin/
+mkdir -p %{buildroot}/usr/share/doc/%{name}-%{version}/examples/
+mkdir -p %{buildroot}/etc/init.d
+mkdir -p %{buildroot}/etc/udev/rules.d
+
+cp %{SOURCE0} %{buildroot}/usr/sbin/xe-linux-distribution
+chmod 755 %{buildroot}/usr/sbin/xe-linux-distribution
+
+cp %{SOURCE1} %{buildroot}/etc/init.d/xe-linux-distribution
+chmod 755 %{buildroot}/etc/init.d/xe-linux-distribution
+
+cp %{SOURCE3} %{buildroot}/usr/sbin/xe-daemon
+chmod 755 %{buildroot}/usr/sbin/xe-daemon
+
+cp %{SOURCE5} %{buildroot}/usr/share/doc/%{name}-%{version}/examples/
+
+install -d %{buildroot}/usr/bin/
+install -m 755 %{SOURCE6} %{buildroot}/usr/bin/xenstore
+ln -s /usr/bin/xenstore %{buildroot}/usr/bin/xenstore-read
+ln -s /usr/bin/xenstore %{buildroot}/usr/bin/xenstore-write
+ln -s /usr/bin/xenstore %{buildroot}/usr/bin/xenstore-exists
+ln -s /usr/bin/xenstore %{buildroot}/usr/bin/xenstore-rm
+
+cp %{SOURCE9} %{buildroot}/etc/udev/rules.d/z10-xen-vcpu-hotplug.rules
+
+cp %{SOURCE8} %{buildroot}/usr/share/doc/%{name}-%{version}/
+
+mkdir -p %{buildroot}/usr/share/doc/%{name}-xenstore-%{version}
+cp %{SOURCE8} %{buildroot}/usr/share/doc/%{name}-xenstore-%{version}/
+
+%clean
+rm -rf %{buildroot}
+
+%post
+/sbin/chkconfig --add xe-linux-distribution >/dev/null
+[ -n "${EXTERNAL_P2V}" ] || service xe-linux-distribution start >/dev/null 2>&1
+
+eval $(/usr/sbin/xe-linux-distribution)
+
+if [ -d /etc/yum.repos.d ] && [ -n "${os_distro}" ] && [ -n "${os_majorver}" ] ; then
+ distro="${os_distro}${os_majorver}x"
+ case "${distro}" in
+ rhel4x|centos4x)
+ if [ -f /etc/yum.repos.d/XenSource.repo ] ; then
+ rm -f /etc/yum.repos.d/XenSource.repo # contains deprecated urls
+ fi
+ sed -e "s/@DISTRO@/${distro}/g" \
+ < /usr/share/doc/%{name}-%{version}/examples/Citrix.repo \
+ > /etc/yum.repos.d/Citrix.repo
+ ;;
+ rhel3x|rhel5x|centos5x|oracle5x) # No vendor kernel any more. Remove Citrix.repo
+ if [ -f /etc/yum.repos.d/Citrix.repo ] ; then
+ rm -f /etc/yum.repos.d/Citrix.repo
+ fi
+ ;;
+ *) ;;
+ esac
+fi
+
+%preun
+if [ $1 -eq 0 ] ; then
+ service xe-linux-distribution stop >/dev/null 2>&1
+ /sbin/chkconfig --del xe-linux-distribution >/dev/null
+ rm -f /etc/yum.repos.d/Citrix.repo || /bin/true
+fi
+
+%files
+%defattr(-,root,root,-)
+/usr/sbin/xe-linux-distribution
+/etc/init.d/xe-linux-distribution
+/usr/sbin/xe-daemon
+/etc/udev/rules.d/z10-xen-vcpu-hotplug.rules
+/usr/share/doc/%{name}-%{version}/examples/Citrix.repo
+/usr/share/doc/%{name}-%{version}/LICENSE
+
+%files xenstore
+%defattr(-,root,root,-)
+/usr/bin/xenstore-*
+/usr/bin/xenstore
+/usr/share/doc/%{name}-xenstore-%{version}/LICENSE
+
+%changelog
+* Tue Jun 5 2007 <citrix.com>
+- Xen monitor scripts
diff --git a/mk/xe-linux-distribution b/mk/xe-linux-distribution
new file mode 100755
index 0000000..054a58a
--- /dev/null
+++ b/mk/xe-linux-distribution
@@ -0,0 +1,307 @@
+#! /bin/sh
+
+# Copyright (C) 2009 Citrix Systems Inc.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+# Script to write information about the current distribution to stdout or a file.
+# Information collected:
+# - Distribution name
+# - Distribution version (major and minor)
+# - Kernel version (uname)
+
+LANG="C"
+export LANG
+
+
+write_to_output()
+{
+ local distro="$1"
+ local major="$2"
+ local minor="$3"
+ local name="$4"
+ local uname=$(uname -r)
+
+ if [ -n "${TEST_RESULT}" ] ; then
+ MAJOR=$major
+ MINOR=$minor
+ DISTRO=$distro
+ UNAME=$uname
+ return 0
+ fi
+
+ echo "os_distro=\"${distro}\""
+ echo "os_majorver=\"${major}\""
+ echo "os_minorver=\"${minor}\""
+ echo "os_uname=\"${uname}\""
+ echo "os_name=\"${name}\""
+
+ return 0
+}
+
+identify_debian()
+{
+ local debian_version="$1"
+ local major
+ local minor
+
+ # 3.1
+ # 4.0
+ # Ignores testing and unstable which contain ".*/sid".
+
+ if [ ! -f "${debian_version}" ] ; then
+ return 1
+ fi
+
+ eval $(awk -F. '/^[0-9]*\.[0-9]*/ \
+ { print "major="$1 ; print "minor="$2 ; exit 0 }' \
+ "${debian_version}")
+
+ if [ -z "${major}" ] && [ -z "${minor}" ] && ! grep -q /sid "${debian_version}" ; then
+ return 1
+ fi
+
+ write_to_output "debian" "${major}" "${minor}" "Debian $(head -n 1 $debian_version)"
+
+ return 0
+}
+
+identify_redhat()
+{
+ redhat_release="$1"
+ local distro
+ local major
+ local minor
+ local beta
+
+ # distro=rhel
+ # Red Hat Enterprise Linux AS release 3 (Taroon Update 6)
+ # Red Hat Enterprise Linux AS release 3 (Taroon Update 8)
+ # Red Hat Enterprise Linux AS release 4 (Nahant)
+ # Red Hat Enterprise Linux AS release 4 (Nahant Update 1)
+ # Red Hat Enterprise Linux AS release 4 (Nahant Update 2)
+ # Red Hat Enterprise Linux AS release 4 (Nahant Update 3)
+ # Red Hat Enterprise Linux AS release 4 (Nahant Update 4)
+ # Red Hat Enterprise Linux Server release 4.92 (Tikanga)
+ # Red Hat Enterprise Linux Server release 5 (Tikanga)
+ # Red Hat Enterprise Linux Server release 5.1 Beta (Tikanga)
+ # Red Hat Enterprise Linux release 6.0 Beta (Santiago)
+
+ # distro=xe-ddk
+ # \@PRODUCT_BRAND\@ DDK release \@PRODUCT_VERSION\@-\@BUILD_NUMBER\@ (\@PRODUCT_NAME\@)
+ # Rio DDK release 0.5.6-2991c (xenenterprise)
+
+ # distro=xe-sdk
+ # \@PRODUCT_BRAND\@ SDK release \@PRODUCT_VERSION\@-\@BUILD_NUMBER\@ (\@PRODUCT_NAME\@)
+ # Rio SDK release 0.5.6-2991c (xenenterprise)
+
+ # distro=fedora
+ # Fedora Core release 3 (Heidelberg)
+
+ # distro=centos
+ # CentOS release 4.0 (Final)
+ # CentOS release 5 (Final)
+ # CentOS Linux release 7.0.1406 (Core)
+
+ # distro=scientific
+ # Scientific Linux release 6.5 (Carbon)
+
+ # distro=oracle
+ # Enterprise Linux Enterprise Linux Server release 5 (Carthage)
+ # Enterprise Linux Enterprise Linux Server release 5.5 (Carthage)
+ # Oracle Linux Server release 5.6
+
+ if [ ! -f "${redhat_release}" ] ; then
+ return 1
+ fi
+
+ eval $(sed -n \
+ -e 's/^\(.*\) DDK release \(.*\)-\(.*\) (.*)$/distro=xe-ddk;major=\2;minor=\3/gp;' \
+ -e 's/^\(.*\) SDK release \(.*\)-\(.*\) (.*)$/distro=xe-sdk;major=\2;minor=\3/gp;' \
+ -e 's/^Red Hat Enterprise Linux.* release \([0-9]*\) (.* Update \(.*\))$/distro=rhel;major=\1;minor=\2/gp;'\
+ -e 's/^Red Hat Enterprise Linux.* release \([0-9]*\) (.*)$/distro=rhel;major=\1/gp;' \
+ -e 's/^Red Hat Enterprise Linux.* release \([0-9]*\)\.\([0-9]*\) \([Bb]eta \)\?(.*)$/distro=rhel;major=\1;minor=\2;beta=\3;/gp;' \
+ -e 's/^Fedora.*release \([0-9]*\) (.*)$/distro=fedora;major=\1/gp;' \
+ -e 's/^CentOS release \([0-9]*\)\.\([0-9]*\) (.*)/distro=centos;major=\1;minor=\2/gp;' \
+ -e 's/^CentOS release \([0-9]*\) (.*)/distro=centos;major=\1/gp;' \
+ -e 's/^CentOS Linux release \([0-9]*\)\.\([0-9]*\)\(\.[0-9]*\)\? (.*)/distro=centos;major=\1;minor=\2/gp;' \
+ -e 's/^Enterprise Linux Enterprise Linux .* release \([0-9]*\)\.\([0-9]*\) (.*)$/distro=oracle;major=\1;minor=\2;/gp;' \
+ -e 's/^Enterprise Linux Enterprise Linux .* release \([0-9]*\) (.*)$/distro=oracle;major=\1/gp;' \
+ -e 's/^Oracle Linux Server release \([0-9]*\)\.\([0-9]*\)$/distro=oracle;major=\1;minor=\2/gp;' \
+ -e 's/^Scientific Linux SL release \([0-9]*\)\.\([0-9]*\) (.*)$/distro=scientific;major=\1;minor=\2;/gp;' \
+ -e 's/^Scientific Linux release \([0-9]*\)\.\([0-9]*\) (.*)$/distro=scientific;major=\1;minor=\2;/gp;' \
+ "${redhat_release}")
+
+ if [ -z "${major}" -o -z "${distro}" ] ; then
+ return 1
+ fi
+
+ if [ -z "${minor}" ] ; then
+ minor=0
+ fi
+
+ # HACK to handle RHEL betas
+ if [ "${distro}" == "rhel" ] && [ ${minor} -gt 90 ] ; then
+ major=$(expr ${major} + 1 )
+ minor=0
+ beta=Beta
+ fi
+
+ if [ -n "${beta}" ] ; then
+ minor="${minor}beta"
+ fi
+
+ write_to_output "${distro}" "${major}" "${minor}" "$(head -n 1 ${redhat_release})"
+
+}
+
+identify_sles()
+{
+ suse_release="$1"
+ local major
+ local minor
+ local _major
+
+ # SUSE LINUX Enterprise Server 9 (i586)
+ # VERSION = 9
+ #
+ # SUSE LINUX Enterprise Server 9 (i586)
+ # VERSION = 9
+ # PATCHLEVEL = 2
+ #
+ # SUSE LINUX Enterprise Server 9 (i586)
+ # VERSION = 9
+ # PATCHLEVEL = 3
+ #
+ # SUSE Linux Enterprise Server 10 (i586)
+ # VERSION = 10
+ #
+ # SUSE Linux Enterprise Server 10 (i586)
+ # VERSION = 10
+ # PATCHLEVEL = 1
+ #
+ # SUSE Linux Enterprise Server 11 (i586)
+ # VERSION = 11
+ # PATCHLEVEL = 0
+
+ if [ ! -f "${suse_release}" ] ; then
+ return 1
+ fi
+
+ eval $(sed -n \
+ -e 's/^SUSE L\(inux\|INUX\) Enterprise \([a-zA-Z0-9_]*\) \([0-9]*\) (.*)/_major=\3;/gp;' \
+ -e 's/^VERSION = \([0-9]*\)$/major=\1;/gp;' \
+ -e 's/^PATCHLEVEL = \([0-9]*\)$/minor=\1;/gp;' \
+ "${suse_release}")
+
+ if [ -z "${major}" -o -z "${_major}" ] ; then
+ return 1
+ fi
+
+ if [ "${major}" != "${_major}" ] ; then
+ return 1
+ fi
+
+ if [ -z "${minor}" ] ; then
+ minor=0
+ fi
+
+ write_to_output "sles" "${major}" "${minor}" "$(head -n 1 ${suse_release})"
+
+}
+
+identify_lsb()
+{
+ lsb_release="$1"
+
+ if [ ! -x "${lsb_release}" ] ; then
+ saved_IFS=$IFS
+ IFS=:
+ for i in $PATH ; do
+ if [ -x "${i}/${lsb_release}" ] ; then
+ lsb_release="${i}/${lsb_release}"
+ break
+ fi
+ done
+ IFS=$saved_IFS
+ fi
+
+ if [ -x "${lsb_release}" ] ; then
+ distro=$(${lsb_release} --short --id | tr 'A-Z' 'a-z')
+ description=$(${lsb_release} --short --description | sed -e 's/^"\(.*\)"$/\1/g')
+ release=$(${lsb_release} --short --release)
+ else
+ if [ -f /etc/lsb-release ] ; then
+ source /etc/lsb-release
+ distro="$DISTRIB_ID"
+ description="$DISTRIB_DESCRIPTION"
+ release="$DISTRIB_RELEASE"
+ else
+ return 1
+ fi
+ fi
+
+ if [ -z "${distro}" -o -z "${release}" ] ; then
+ return 1
+ fi
+
+ eval $(echo $release | awk -F. -- '{ subindex = index($0,"."); \
+ print "major=" $1 ; \
+ print "minor=" substr($0,subindex+1) }')
+
+ if [ -z "${major}" -o -z "${distro}" ] ; then
+ return 1
+ fi
+
+ write_to_output "${distro}" "${major}" "${minor}" "${description}"
+}
+
+identify_boot2docker()
+{
+ boot2docker_release="$1"
+ local major
+ local minor
+
+ if [ ! -f "${boot2docker_release}" ] ; then
+ return 1
+ fi
+
+ major=$(awk -F. '{printf("%s", $1)}' /etc/version)
+ minor=$(awk -F. '{printf("%s.%s", $2, $3)}' /etc/version)
+
+ write_to_output "boot2docker" "${major}" "${minor}" "boot2docker $(head -n 1 /etc/version)"
+
+}
+
+if [ $# -eq 1 ] ; then
+ exec 1>"$1"
+fi
+
+if [ -z "${TEST}" ] ; then
+ identify_redhat /etc/oracle-release && exit 0
+ identify_redhat /etc/enterprise-release && exit 0
+ identify_redhat /etc/centos-release && exit 0
+ identify_redhat /etc/redhat-release && exit 0
+ identify_sles /etc/SuSE-release && exit 0
+ identify_lsb lsb_release && exit 0
+ identify_debian /etc/debian_version && exit 0
+ identify_boot2docker /etc/boot2docker && exit 0
+
+ if [ $# -eq 1 ] ; then
+ rm -f "$1"
+ fi
+
+ exit 1
+fi
diff --git a/mk/xe-linux-distribution-test b/mk/xe-linux-distribution-test
new file mode 100755
index 0000000..1d6dfcf
--- /dev/null
+++ b/mk/xe-linux-distribution-test
@@ -0,0 +1,82 @@
+#!/bin/sh
+
+LANG="C"
+export LANG
+
+
+TEST=yes
+
+. xe-linux-distribution
+
+test_identify()
+{
+ export TESTCASE=$1
+ identify_lsb testcases/lsb || \
+ identify_debian "${1}" || \
+ identify_redhat "${1}" || \
+ identify_sles "${1}" || \
+ return 1
+}
+
+do_test()
+{
+ TC=$1 ; shift
+ TEST_RESULT=$@
+ if test_identify ${TC} ; then
+ if [ X"${TEST_RESULT}" = X"FAIL" ] ; then
+ echo "FAILED: ${TC}: should fail to parse" 1>&2
+ else
+ set ${TEST_RESULT}
+ if [ "$1" != "${DISTRO}" ] ; then
+ echo "FAILED: ${TC}: $1 $2.$3: distro ${DISTRO} != $1" 1>&2
+ exit 1
+ fi
+ if [ "$2" != "${MAJOR}" ] ; then
+ echo "FAILED: ${TC}: $1 $2.$3: major ${MAJOR} != $2" 1>&2
+ exit 1
+ fi
+ if [ "$3" != "${MINOR}" ] ; then
+ echo "FAILED: ${TC} $1 $2.$3: minor ${MINOR} != $3" 1>&2
+ exit 1
+ fi
+ echo "PASSED: ${TC}: ${DISTRO} ${MAJOR} ${MINOR} correctly detected" 1>&2
+ fi
+ else
+ if [ X"${TEST_RESULT}" = X"FAIL" ] ; then
+ echo "PASSED: ${TC}: correctly failed to parse" 1>&2
+ else
+ echo "FAILED: ${TC}: unable to parse" 1>&2
+ fi
+ fi
+}
+
+do_test "testcases/debian-sid" "debian"
+do_test "testcases/rhel-3u6" "rhel 3 6"
+do_test "testcases/rhel-3u8" "rhel 3 8"
+do_test "testcases/rhel-4" "rhel 4 0"
+do_test "testcases/rhel-4u1" "rhel 4 1"
+do_test "testcases/rhel-4u2" "rhel 4 2"
+do_test "testcases/rhel-4u3" "rhel 4 3"
+do_test "testcases/rhel-4u4" "rhel 4 4"
+do_test "testcases/rhel-4u5" "rhel 4 5"
+do_test "testcases/rhel-4u6" "rhel 4 6"
+do_test "testcases/rhel-5beta" "rhel 5 0beta"
+do_test "testcases/rhel-5" "rhel 5 0"
+do_test "testcases/rhel-5u1beta" "rhel 5 1beta"
+do_test "testcases/rhel-5u1" "rhel 5 1"
+do_test "testcases/fc3" "fedora 3 0"
+do_test "testcases/sles-9" "sles 9 0"
+do_test "testcases/sles-9sp3" "sles 9 3"
+do_test "testcases/sles-10sp2" "sles 10 2"
+do_test "testcases/sles-11" "sles 11 0"
+do_test "testcases/ddk-0.5.6-2991c" "xe-ddk 0.5.6 2991c"
+do_test "testcases/sdk-0.5.6-2991c" "xe-sdk 0.5.6 2991c"
+do_test "testcases/centos4" "centos 4 0"
+do_test "testcases/centos5" "centos 5 0"
+do_test "testcases/lsb-ubuntu-6.10" "ubuntu 6 10"
+do_test "testcases/lsb-ubuntu-7.04" "ubuntu 7 04"
+do_test "testcases/oracle-5" "oracle 5 0"
+do_test "testcases/oracle-5u1" "oracle 5 1"
+do_test "testcases/lsb-coreos-367.1.0" "coreos 367 1.0"
+
+exit 0
diff --git a/mk/xe-linux-distribution.init b/mk/xe-linux-distribution.init
new file mode 100644
index 0000000..c2c9c03
--- /dev/null
+++ b/mk/xe-linux-distribution.init
@@ -0,0 +1,117 @@
+#!/bin/sh
+#
+# xe-linux-distribution Write Linux distribution information to XenStore.
+#
+# chkconfig: 2345 14 86
+# description: Writes Linux distribution version information to XenStore.
+#
+### BEGIN INIT INFO
+# Provides: xe-linux-distribution
+# Required-Start: $remote_fs
+# Required-Stop: $remote_fs
+# Default-Start: 2 3 4 5
+# Default-Stop: 0 1 6
+# Short-Description: XenServer Virtual Machine daemon providing host integration services
+# Description: Writes Linux distribution version information to XenStore.
+### END INIT INFO
+
+LANG="C"
+export LANG
+
+if [ -f /etc/init.d/functions ] ; then
+. /etc/init.d/functions
+else
+action()
+{
+ descr=$1 ; shift
+ cmd=$@
+ echo -n "$descr "
+ $cmd
+ ret=$?
+ if [ $ret -eq 0 ] ; then
+ echo "OK"
+ else
+ echo "Failed"
+ fi
+ return $ret
+}
+fi
+
+XE_LINUX_DISTRIBUTION=/usr/sbin/xe-linux-distribution
+XE_LINUX_DISTRIBUTION_CACHE=/var/cache/xe-linux-distribution
+XE_DAEMON=/usr/sbin/xe-daemon
+XE_DAEMON_PIDFILE=/var/run/xe-daemon.pid
+
+if [ ! -x "${XE_LINUX_DISTRIBUTION}" ] ; then
+ exit 0
+fi
+
+start()
+{
+ if [ ! -e /proc/xen/xenbus ] ; then
+ if [ ! -d /proc/xen ] ; then
+ action $"Mounting xenfs on /proc/xen:" /bin/false
+ echo "Could not find /proc/xen directory."
+ echo "You need a post 2.6.29-rc1 kernel with CONFIG_XEN_COMPAT_XENFS=y and CONFIG_XENFS=y|m"
+ exit 1
+ else
+ # This is needed post 2.6.29-rc1 when /proc/xen support was pushed upstream as a xen filesystem
+ action $"Mounting xenfs on /proc/xen:" mount -t xenfs none /proc/xen
+ fi
+ fi
+
+ if [ -e /proc/xen/capabilities ] && grep -q control_d /proc/xen/capabilities ; then
+ # Do not want daemon in domain 0
+ exit 0
+ fi
+
+ action $"Detecting Linux distribution version:" \
+ ${XE_LINUX_DISTRIBUTION} ${XE_LINUX_DISTRIBUTION_CACHE}
+
+ action $"Starting xe daemon: " /bin/true
+ mkdir -p $(dirname ${XE_DAEMON_PIDFILE})
+ if start-stop-daemon --start --background --exec ${XE_DAEMON} -- -p ${XE_DAEMON_PIDFILE} 1>/dev/null 2>/dev/null; then
+ exit 0
+ else
+ # This is equivalent to daemon() in C
+ ( exec &>/dev/null ; ${XE_DAEMON} -p ${XE_DAEMON_PIDFILE} 2>/dev/null & )
+ fi
+}
+
+stop()
+{
+ action $"Stopping xe daemon: " kill -TERM $(cat ${XE_DAEMON_PIDFILE})
+}
+
+status()
+{
+ cat ${XE_LINUX_DISTRIBUTION_CACHE}
+}
+
+# fail silently if not running xen
+if [ ! -d /proc/xen ]; then
+ exit
+fi
+
+case "$1" in
+ start)
+ start
+ ;;
+ stop)
+ stop
+ ;;
+ status)
+ status
+ ;;
+ force-reload|restart)
+ stop
+ start
+ ;;
+ *)
+ # do not advertise unreasonable commands that there is no reason
+ # to use with this device
+ echo $"Usage: $0 start|restart|status"
+ exit 1
+esac
+
+exit $?
diff --git a/mk/xe-linux-distribution.service b/mk/xe-linux-distribution.service
new file mode 100644
index 0000000..0e87583
--- /dev/null
+++ b/mk/xe-linux-distribution.service
@@ -0,0 +1,9 @@
+[Unit]
+Description=XenServer Linux Guest Agent
+
+[Service]
+ExecStartPre=/usr/share/oem/xs/xe-linux-distribution /var/cache/xe-linux-distribution
+ExecStart=/usr/share/oem/xs/xe-daemon
+
+[Install]
+WantedBy=multi-user.target \ No newline at end of file
diff --git a/mk/xen-vcpu-hotplug.rules b/mk/xen-vcpu-hotplug.rules
new file mode 100644
index 0000000..ecb200e
--- /dev/null
+++ b/mk/xen-vcpu-hotplug.rules
@@ -0,0 +1 @@
+ACTION=="add", SUBSYSTEM=="cpu", RUN+="/bin/sh -c '[ ! -e /sys$devpath/online ] || echo 1 > /sys$devpath/online'"