./0000755000175000017500000000000012563214467007317 5ustar benben./usr/0000755000175000017500000000000012563214467010130 5ustar benben./usr/sbin/0000755000175000017500000000000012156611503011051 5ustar benben./usr/sbin/xe-update-guest-attrs0000755000175000017500000001562412156611503015163 0ustar benben#!/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 guest to XenStore. # # Information collected (if --memory NOT passed in): # - Distribution name # - Distribution version (major and minor) # - Kernel version (uname) # - IP addresses (IPv4 & IPv6) for each Ethernet interface # # Additional information collected (if --memory IS passed in): # - memtotal # - memfree # # Memory stats are separated out because they change all the time # and so we may not want to update them as frequently LANG="C" export LANG XE_LINUX_DISTRIBUTION_CACHE=/var/cache/xe-linux-distribution XS_CACHE=/var/cache/xenstore IPADDR_RE="\([[:digit:]]\{1,3\}\.\)\{3\}[[:digit:]]\{1,3\}" IPADDR6_RE="[[:xdigit:]:.]*" export PATH=/usr/sbin:/usr/bin:/sbin:/bin XENSTORE=${XENSTORE:-xenstore} XENSTORE_UPDATED=0 # Force to use xenbus communication mode export XS_OPEN_XENBUSONLY=yes # parse command line opts MEMORY_MODE=0 # do not update memory stats while [ $# -ge 1 ] ; do if [ "$1" = "--memory" ] ; then MEMORY_MODE=1 # update only memory stats fi shift done xenstore_write_cached() { key="$1" newval="$2" cache=$XS_CACHE/$key if [ -f $cache ] ; then # cache exists oldval=$(cat "$cache") if [ "$oldval" = "$newval" ] ; then # value unchanged return 0 fi else # cache does not exist if [ -e $cache ] ; then # something (directory?) in its way rm -rf $cache fi fi # try to write and update cache if successful if $XENSTORE write "$key" "$newval" ; then mkdir -p $(dirname "$cache") echo -n "$newval" > "$cache" XENSTORE_UPDATED=1 return 0 fi return 1 } # If we detect a domain change then delete our cache and force a refresh domid=$(xenstore-read "domid") cache=$XS_CACHE/unique-domain-id newval=$(xenstore-read "/local/domain/${domid}/unique-domain-id") if [ -e $cache ]; then oldval=$(cat "$cache") if [ "$oldval" != "$newval" ]; then # domain changed rm -rf $XS_CACHE fi fi mkdir -p $XS_CACHE echo -n "$newval" > "$cache" xenstore_rm_cached() { key="$1" cache=$XS_CACHE/$key if [ ! -e $cache ] ; then return 1 fi # try to write and update cache if successful if $XENSTORE rm "$key" ; then rm -rf "$cache" XENSTORE_UPDATED=1 return 0 fi return 1 } xenstore_list_interfaces_cached() { topdir=$XS_CACHE/attr if [ -d $topdir ] ; then cd $topdir for dir in * ; do [ -f $dir/ip ] && echo $dir done fi } if [ $MEMORY_MODE -eq 1 ] ; then # Update the memory information eval $(cat /proc/meminfo | \ sed -n -e 's/MemTotal\: *\([0-9]*\)[^$]*/memtotal=\1/gp;' \ -e 's/MemFree\: *\([0-9]*\)[^$]*/memfree=\1/gp;') xenstore_write_cached "data/meminfo_total" "${memtotal}" xenstore_write_cached "data/meminfo_free" "${memfree}" fi # e.g. # $ ip addr show # 1: lo: mtu 16436 qdisc noqueue # link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 # inet 127.0.0.1/8 scope host lo # inet6 ::1/128 scope host # valid_lft forever preferred_lft forever # 2: eth0: mtu 1500 qdisc pfifo_fast qlen 1000 # link/ether 00:13:20:95:e8:74 brd ff:ff:ff:ff:ff:ff # inet 172.31.0.57/20 brd 172.31.15.255 scope global eth0 # inet6 fe80::213:20ff:fe95:e874/64 scope link # valid_lft forever preferred_lft forever # 3: sit0: mtu 1480 qdisc noop # link/sit 0.0.0.0 brd 0.0.0.0 #eval $(ip addr show | \ # sed -n -e 's/^[[:digit:]]*: \([a-z0-9]*\): .*/ifs="\$ifs \1"; current="\1"; /gp;' \ # -e 's/^[[:space:]]\{4\}inet \('${IPADDR_RE}'\)\/.*/eval inet_\${current}="\1"; /gp;') # e.g. # eth0 Link encap:Ethernet HWaddr 00:13:20:95:E8:74 # inet addr:172.31.0.57 Bcast:172.31.15.255 Mask:255.255.240.0 # inet6 addr: fe80::213:20ff:fe95:e874/64 Scope:Link # UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 # RX packets:98001128 errors:0 dropped:0 overruns:0 frame:0 # TX packets:87728920 errors:0 dropped:0 overruns:0 carrier:0 # collisions:0 txqueuelen:1000 # RX bytes:35864034092 (33.4 GiB) TX bytes:27544025180 (25.6 GiB) # Interrupt:177 # # lo Link encap:Local Loopback # inet addr:127.0.0.1 Mask:255.0.0.0 # inet6 addr: ::1/128 Scope:Host # UP LOOPBACK RUNNING MTU:16436 Metric:1 # RX packets:32928 errors:0 dropped:0 overruns:0 frame:0 # TX packets:32928 errors:0 dropped:0 overruns:0 carrier:0 # collisions:0 txqueuelen:0 # RX bytes:3604609 (3.4 MiB) TX bytes:3604609 (3.4 MiB) ifs=`/sbin/ifconfig | sed -n -e 's/^\([a-z0-9]\+\).*/name \1/p' \ -e 's/.*inet addr:\('$IPADDR_RE'\) .*/ipv4 \1/p' \ -e 's+.*inet6 addr: \('$IPADDR6_RE'\)/.*+ipv6 \1+p' | \ while read tag value; do case "${tag}" in name) case "${value}" in eth*) if="${value}" xenstore_rm_cached "attr/${if}" echo "${if}" ind=0;; *) unset if;; esac;; ipv4) [ -n "${if}" ] && xenstore_write_cached "attr/${if}/ip" "${value}";; ipv6) if [ -n "${if}" ]; then xenstore_write_cached "attr/${if}/ipv6/${ind}/addr" "${value}" ind=$((ind+1)) fi;; esac done` # remove any interfaces that have been unplugged or downed for at in $(xenstore_list_interfaces_cached) ; do for if in $ifs ; do [ "${if}" = "${at}" ] && continue 2 done xenstore_rm_cached "attr/${at}" done # distro if [ -f ${XE_LINUX_DISTRIBUTION_CACHE} ] ; then . ${XE_LINUX_DISTRIBUTION_CACHE} for key in os_name os_majorver os_minorver os_uname os_distro ; do new=$(eval echo \${${key}}) [ -n "${new}" ] && xenstore_write_cached "data/${key}" "${new}" done fi # whether I support ballooning or not xenstore_write_cached "control/feature-balloon" "1" # build time addons xenstore_write_cached "attr/PVAddons/MajorVersion" "6" xenstore_write_cached "attr/PVAddons/MinorVersion" "2" xenstore_write_cached "attr/PVAddons/MicroVersion" "0" xenstore_write_cached "attr/PVAddons/BuildVersion" "70442" xenstore_write_cached "attr/PVAddons/Installed" "1" # update xenstore if necessary if [ $XENSTORE_UPDATED -eq 1 ] ; then xenstore_write_cached "data/updated" "$(date)" fi ./usr/sbin/xe-linux-distribution0000755000175000017500000001742312156611503015274 0ustar benben#! /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) # 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]*\) (.*)/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;' \ "${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 Server \([0-9]*\) (.*)/_major=\2;/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 return 1 fi 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) if [ -z "${distro}" -o -z "${release}" ] ; then return 1 fi eval $(echo $release | awk -F. -- '{ print "major=" $1 ; print "minor=" $2 }') if [ -z "${major}" -o -z "${distro}" ] ; then return 1 fi write_to_output "${distro}" "${major}" "${minor}" "${description}" } 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/redhat-release && exit 0 identify_sles /etc/SuSE-release && exit 0 identify_lsb lsb_release && exit 0 identify_debian /etc/debian_version && exit 0 if [ $# -eq 1 ] ; then rm -f "$1" fi exit 1 fi ./usr/sbin/xe-daemon0000755000175000017500000000345312156611503012661 0ustar benben#!/bin/bash # 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. LANG="C" export LANG usage() { echo "$0 [ -p ]" >&2 exit 1 } # Parse command line opts while [ $# -ne 0 ] ; do arg="$1" shift case "$arg" in "-p") [ $# -eq 0 ] && usage pidfile="$1" shift mkdir -p "$(dirname "$pidfile")" echo $$ > "$pidfile" ;; *) usage ;; esac done XE_UPDATE_GUEST_ATTRS=${XE_UPDATE_GUEST_ATTRS:-/usr/sbin/xe-update-guest-attrs} XE_DAEMON_RATE=${XE_DAEMON_RATE:-60} # run once a minute by default XE_MEMORY_UPDATE_DIVISOR=${XE_MEMORY_UPDATE_DIVISOR:-2} # update mem stats 1/2 as often by dflt # Delete xenstore cache following each reboot rm -rf /var/cache/xenstore MEMORY_UPDATE_COUNTER=0 while true ; do if [ ${MEMORY_UPDATE_COUNTER} -eq 0 ] ; then MEMORY=--memory MEMORY_UPDATE_COUNTER=${XE_MEMORY_UPDATE_DIVISOR} else MEMORY= fi MEMORY_UPDATE_COUNTER=$((${MEMORY_UPDATE_COUNTER} - 1)) ${XE_UPDATE_GUEST_ATTRS} ${MEMORY} sleep ${XE_DAEMON_RATE} done ./lib/0000755000175000017500000000000012156611503010053 5ustar benben./lib/udev/0000755000175000017500000000000012156611503011016 5ustar benben./lib/udev/rules.d/0000755000175000017500000000000012156611503012372 5ustar benben./lib/udev/rules.d/z10_xen-vcpu-hotplug.rules0000644000175000017500000000016212156611503017364 0ustar benbenACTION=="add", SUBSYSTEM=="cpu", RUN+="/bin/sh -c '[ ! -e /sys$devpath/online ] || echo 1 > /sys$devpath/online'"