diff -r 333964c621f1 -r cb59d6afeb61 openpkg/uuid.sh
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/openpkg/uuid.sh Tue Jan 06 23:40:39 2009 +0100
@@ -0,0 +1,292 @@
+#!@l_prefix@/lib/openpkg/bash
+##
+## uuid -- OpenPKG UUID Update Utility
+## Copyright (c) 2000-2007 OpenPKG Foundation e.V.
+## Copyright (c) 2000-2007 Ralf S. Engelschall
+##
+## Permission to use, copy, modify, and distribute this software for
+## any purpose with or without fee is hereby granted, provided that
+## the above copyright notice and this permission notice appear in all
+## copies.
+##
+## THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 AUTHORS AND COPYRIGHT HOLDERS AND THEIR
+## 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.
+##
+
+# configuration
+prefix="@l_prefix@"
+musr="@l_musr@"
+mgrp="@l_mgrp@"
+prog_rpm="$prefix/libexec/openpkg/rpm"
+prog_shtool="$prefix/lib/openpkg/shtool"
+prog_miniperl="$prefix/lib/openpkg/miniperl"
+prog_uuid="$prefix/lib/openpkg/uuid"
+file_uuid="$prefix/etc/openpkg/uuid"
+
+# minimum command line parsing
+opt_v=no
+opt_m=no
+while [ 1 ]; do
+ case "$1" in
+ -v | --verbose ) opt_v=yes; shift ;;
+ -m | --multicast ) opt_m=yes; shift ;;
+ * ) break ;;
+ esac
+done
+
+# special "Nil UUID"
+UUID_NIL="00000000-0000-0000-0000-000000000000"
+
+# Query Dynamic Information
+do_query () {
+ # query RPM information
+ query=":"
+ for var in \
+ l_openpkg_release \
+ l_prefix \
+ l_susr l_suid l_sgrp l_sgid \
+ l_musr l_muid l_mgrp l_mgid \
+ l_rusr l_ruid l_rgrp l_rgid \
+ l_nusr l_nuid l_ngrp l_ngid; do
+ query="$query; `echo $var | sed -e 's;^l_;Q_;'`=\"%{$var}\""
+ done
+ eval `$prog_rpm --eval "$query" 2>/dev/null`
+
+ # query OS information
+ Q_platform=`$prog_shtool platform --type=binary 2>/dev/null |\
+ sed -e 's;^\([^-][^-]*-[^.-][^.-]*\)\..*$;\1;'`
+ if [ ".$Q_platform" = . ]; then
+ Q_platform="unknown"
+ fi
+ Q_discriminator=`$prog_uuid -v1 | $prog_uuid -d -- - | awk '/node:.*global unicast/ { printf("mac:%s", $2); }'`
+ if [ ".$Q_discriminator" = . ]; then
+ Q_discriminator=`$prog_miniperl -e 'if (-f "/etc/openpkg") { printf("inode:%s", (stat("/etc/openpkg"))[1]); }' 2>/dev/null`
+ if [ ".$Q_discriminator" = . ]; then
+ Q_discriminator=`$prog_shtool echo -e 'fqdn:%h%d' 2>/dev/null`
+ fi
+ fi
+}
+
+# Load Configuration
+do_load () {
+ # start with reasonable defaults
+ UUID_REGISTRY="$UUID_NIL"
+ UUID_INSTANCE="$UUID_NIL"
+ UUID_PLATFORM="$UUID_NIL"
+
+ # load configuration (and override defaults)
+ if [ -r $file_uuid ]; then
+ if [ ".$opt_v" = .yes ]; then
+ echo "uuid: loading UUID configuration file ($file_uuid)"
+ fi
+ . $file_uuid
+ fi
+
+ # remember whether something was changed
+ changed=no
+}
+
+# Save Configuration
+do_save () {
+ if [ ".$changed" = .yes ]; then
+ # save configuration
+ if [ ".$opt_v" = .yes ]; then
+ echo "uuid: saving UUID configuration file ($file_uuid)"
+ fi
+ if [ -f $file_uuid ] && [ ! -w $file_uuid ]; then
+ echo "uuid:ERROR: cannot write to $file_uuid" 1>&2
+ exit 1
+ fi
+ ( echo "UUID_REGISTRY=\"$UUID_REGISTRY\""
+ echo "UUID_INSTANCE=\"$UUID_INSTANCE\""
+ echo "UUID_PLATFORM=\"$UUID_PLATFORM\""
+ ) >$file_uuid.new || exit $?
+ n=`egrep 'UUID_(REGISTRY|INSTANCE|PLATFORM)="[0-9a-f-]*"' \
+ $file_uuid.new | wc -l | awk '{ print $1; }'`
+ if [ ".$n" != .3 ]; then
+ echo "uuid:ERROR: failed to update $file_uuid" 1>&2
+ rm -f $file_uuid.new
+ exit 1
+ fi
+ cp $file_uuid.new $file_uuid || exit $?
+ rm -f $file_uuid.new || true
+ chown $musr:$mgrp $file_uuid >/dev/null 2>&1 || true
+ chmod 644 $file_uuid >/dev/null 2>&1 || true
+
+ # remember that no more changes exist
+ changed=no
+ fi
+}
+
+# Reset UUIDs
+do_reset () {
+ # reset all UUIDs to the "Nil UUID"
+ if [ ".$UUID_REGISTRY" != ".$UUID_NIL" ]; then
+ UUID_REGISTRY="$UUID_NIL"
+ changed=yes
+ fi
+ if [ ".$UUID_INSTANCE" != ".$UUID_NIL" ]; then
+ UUID_INSTANCE="$UUID_NIL"
+ changed=yes
+ fi
+ if [ ".$UUID_PLATFORM" != ".$UUID_NIL" ]; then
+ UUID_PLATFORM="$UUID_NIL"
+ changed=yes
+ fi
+}
+
+# Update UUIDs
+do_update () {
+ # update registry UUID
+ if [ ".$UUID_REGISTRY" = ".$UUID_NIL" -o ".$UUID_REGISTRY" = . ]; then
+ opt=""
+ if [ ".$opt_m" = .yes ]; then
+ opt="-m"
+ fi
+ if [ ".$opt_v" = .yes ]; then
+ echo "uuid: calculating OpenPKG Registry UUID (UUID_REGISTRY):"
+ echo "uuid: << $prog_uuid -v1 $opt"
+ fi
+ uuid=`$prog_uuid -v1 $opt`
+ if [ ".$UUID_REGISTRY" != ".$uuid" -a ".$uuid" != . ]; then
+ UUID_REGISTRY="$uuid"
+ if [ ".$opt_v" = .yes ]; then
+ echo "uuid: >> $UUID_REGISTRY (NOT REPEATABLE)"
+ fi
+ changed=yes
+ fi
+ fi
+
+ # update instance UUID
+ name="${Q_openpkg_release}"
+ name="$name:${Q_prefix}"
+ name="$name:${Q_susr}:${Q_suid}:${Q_sgrp}:${Q_sgid}"
+ name="$name:${Q_musr}:${Q_muid}:${Q_mgrp}:${Q_mgid}"
+ name="$name:${Q_rusr}:${Q_ruid}:${Q_rgrp}:${Q_rgid}"
+ name="$name:${Q_nusr}:${Q_nuid}:${Q_ngrp}:${Q_ngid}"
+ if [ ".$opt_v" = .yes ]; then
+ echo "uuid: querying OpenPKG Instance OID"
+ echo "uuid: << $prog_rpm --eval '%{l_openpkg_oid_instance}'"
+ fi
+ OID_NS_INSTANCE="`$prog_rpm --eval '%{l_openpkg_oid_instance}'`"
+ if [ ".$opt_v" = .yes ]; then
+ echo "uuid: >> $OID_NS_INSTANCE"
+ fi
+ if [ ".$opt_v" = .yes ]; then
+ echo "uuid: calculating OpenPKG Instance Namespace UUID"
+ echo "uuid: << $prog_uuid -v3 ns:OID \"$OID_NS_INSTANCE\""
+ fi
+ UUID_NS_INSTANCE=`$prog_uuid -v3 ns:OID "$OID_NS_INSTANCE"`
+ if [ ".$opt_v" = .yes ]; then
+ echo "uuid: >> $UUID_NS_INSTANCE"
+ fi
+ if [ ".$opt_v" = .yes ]; then
+ echo "uuid: calculating OpenPKG Instance UUID (UUID_INSTANCE):"
+ echo "uuid: << $prog_uuid -v3 \"$UUID_NS_INSTANCE\" \"$name\""
+ fi
+ uuid=`$prog_uuid -v3 "$UUID_NS_INSTANCE" "$name"`
+ if [ ".$opt_v" = .yes ]; then
+ echo "uuid: >> $uuid"
+ fi
+ if [ ".$UUID_INSTANCE" != ".$uuid" -a ".$uuid" != . ]; then
+ UUID_INSTANCE="$uuid"
+ changed=yes
+ fi
+
+ # update platform UUID
+ name="${Q_platform}"
+ name="$name:${Q_discriminator}"
+ if [ ".$opt_v" = .yes ]; then
+ echo "uuid: querying OpenPKG Platform OID"
+ echo "uuid: << $prog_rpm --eval '%{l_openpkg_oid_platform}'"
+ fi
+ OID_NS_PLATFORM="`$prog_rpm --eval '%{l_openpkg_oid_platform}'`"
+ if [ ".$opt_v" = .yes ]; then
+ echo "uuid: >> $OID_NS_PLATFORM"
+ fi
+ if [ ".$opt_v" = .yes ]; then
+ echo "uuid: calculating OpenPKG Platform Namespace UUID"
+ echo "uuid: << $prog_uuid -v3 ns:OID \"$OID_NS_PLATFORM\""
+ fi
+ UUID_NS_PLATFORM=`$prog_uuid -v3 ns:OID "$OID_NS_PLATFORM"`
+ if [ ".$opt_v" = .yes ]; then
+ echo "uuid: >> $UUID_NS_PLATFORM"
+ fi
+ if [ ".$opt_v" = .yes ]; then
+ echo "uuid: calculating OpenPKG Platform UUID (UUID_PLATFORM):"
+ echo "uuid: << $prog_uuid -v3 \"$UUID_NS_PLATFORM\" \"$name\""
+ fi
+ uuid=`$prog_uuid -v3 "$UUID_NS_PLATFORM" "$name"`
+ if [ ".$opt_v" = .yes ]; then
+ echo "uuid: >> $uuid"
+ fi
+ if [ ".$UUID_PLATFORM" != ".$uuid" -a ".$uuid" != . ]; then
+ UUID_PLATFORM="$uuid"
+ changed=yes
+ fi
+}
+
+# Info about input and resulting UUIDs
+do_info () {
+ echo "OpenPKG Summary of Identification Information"
+ echo "============================================="
+ echo ""
+ echo "OpenPKG Registry"
+ time=""; clock=""; node=""
+ eval `$prog_uuid -d "$UUID_REGISTRY" 2>/dev/null |\
+ sed -e 's/^/X/' \
+ -e 's/X.*time: *\(.*\)$/time="\1";/' \
+ -e 's/X.*clock: *\(.*\)$/clock="\1";/' \
+ -e 's/X.*node: *\(.*\)$/node="\1";/' \
+ -e 's/^X.*//'`
+ echo " System Time: ${time:-unknown}"
+ echo " System Clock Sequence: ${clock:-unknown}"
+ echo " System Node Address: ${node:-unknown}"
+ echo " UUID_REGISTRY: $UUID_REGISTRY"
+ echo ""
+ echo "OpenPKG Instance"
+ echo " Release: ${Q_openpkg_release}"
+ echo " Prefix: ${Q_prefix}"
+ echo " Super Account: ${Q_susr}(${Q_suid}):${Q_sgrp}(${Q_sgid})"
+ echo " Management Account: ${Q_musr}(${Q_muid}):${Q_mgrp}(${Q_mgid})"
+ echo " Restricted Account: ${Q_rusr}(${Q_ruid}):${Q_rgrp}(${Q_rgid})"
+ echo " Nonprivileged Account: ${Q_nusr}(${Q_nuid}):${Q_ngrp}(${Q_ngid})"
+ echo " UUID_INSTANCE: $UUID_INSTANCE"
+ echo ""
+ echo "OpenPKG Platform"
+ echo " Platform Id: $Q_platform"
+ echo " Discriminator: $Q_discriminator"
+ echo " UUID_PLATFORM: $UUID_PLATFORM"
+ echo ""
+ echo "(run \"$0 --verbose update\" to reproduce the UUID generation)"
+}
+
+# Command Line Dispatching
+cmd="$1"
+shift
+case "$cmd" in
+ reset )
+ do_load; do_reset; do_save
+ ;;
+ update )
+ do_query; do_load; do_update; do_save
+ ;;
+ info )
+ do_query; do_load; do_info
+ ;;
+ * )
+ echo "uuid:ERROR: invalid command \"$cmd\"" 1>&2
+ exit 1
+ ;;
+esac
+