1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/openpkg/uuid.sh Tue Jan 06 23:40:39 2009 +0100 1.3 @@ -0,0 +1,292 @@ 1.4 +#!@l_prefix@/lib/openpkg/bash 1.5 +## 1.6 +## uuid -- OpenPKG UUID Update Utility 1.7 +## Copyright (c) 2000-2007 OpenPKG Foundation e.V. <http://openpkg.net/> 1.8 +## Copyright (c) 2000-2007 Ralf S. Engelschall <http://engelschall.com/> 1.9 +## 1.10 +## Permission to use, copy, modify, and distribute this software for 1.11 +## any purpose with or without fee is hereby granted, provided that 1.12 +## the above copyright notice and this permission notice appear in all 1.13 +## copies. 1.14 +## 1.15 +## THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED 1.16 +## WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 1.17 +## MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 1.18 +## IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR 1.19 +## CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 1.20 +## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 1.21 +## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF 1.22 +## USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 1.23 +## ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 1.24 +## OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 1.25 +## OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 1.26 +## SUCH DAMAGE. 1.27 +## 1.28 + 1.29 +# configuration 1.30 +prefix="@l_prefix@" 1.31 +musr="@l_musr@" 1.32 +mgrp="@l_mgrp@" 1.33 +prog_rpm="$prefix/libexec/openpkg/rpm" 1.34 +prog_shtool="$prefix/lib/openpkg/shtool" 1.35 +prog_miniperl="$prefix/lib/openpkg/miniperl" 1.36 +prog_uuid="$prefix/lib/openpkg/uuid" 1.37 +file_uuid="$prefix/etc/openpkg/uuid" 1.38 + 1.39 +# minimum command line parsing 1.40 +opt_v=no 1.41 +opt_m=no 1.42 +while [ 1 ]; do 1.43 + case "$1" in 1.44 + -v | --verbose ) opt_v=yes; shift ;; 1.45 + -m | --multicast ) opt_m=yes; shift ;; 1.46 + * ) break ;; 1.47 + esac 1.48 +done 1.49 + 1.50 +# special "Nil UUID" 1.51 +UUID_NIL="00000000-0000-0000-0000-000000000000" 1.52 + 1.53 +# Query Dynamic Information 1.54 +do_query () { 1.55 + # query RPM information 1.56 + query=":" 1.57 + for var in \ 1.58 + l_openpkg_release \ 1.59 + l_prefix \ 1.60 + l_susr l_suid l_sgrp l_sgid \ 1.61 + l_musr l_muid l_mgrp l_mgid \ 1.62 + l_rusr l_ruid l_rgrp l_rgid \ 1.63 + l_nusr l_nuid l_ngrp l_ngid; do 1.64 + query="$query; `echo $var | sed -e 's;^l_;Q_;'`=\"%{$var}\"" 1.65 + done 1.66 + eval `$prog_rpm --eval "$query" 2>/dev/null` 1.67 + 1.68 + # query OS information 1.69 + Q_platform=`$prog_shtool platform --type=binary 2>/dev/null |\ 1.70 + sed -e 's;^\([^-][^-]*-[^.-][^.-]*\)\..*$;\1;'` 1.71 + if [ ".$Q_platform" = . ]; then 1.72 + Q_platform="unknown" 1.73 + fi 1.74 + Q_discriminator=`$prog_uuid -v1 | $prog_uuid -d -- - | awk '/node:.*global unicast/ { printf("mac:%s", $2); }'` 1.75 + if [ ".$Q_discriminator" = . ]; then 1.76 + Q_discriminator=`$prog_miniperl -e 'if (-f "/etc/openpkg") { printf("inode:%s", (stat("/etc/openpkg"))[1]); }' 2>/dev/null` 1.77 + if [ ".$Q_discriminator" = . ]; then 1.78 + Q_discriminator=`$prog_shtool echo -e 'fqdn:%h%d' 2>/dev/null` 1.79 + fi 1.80 + fi 1.81 +} 1.82 + 1.83 +# Load Configuration 1.84 +do_load () { 1.85 + # start with reasonable defaults 1.86 + UUID_REGISTRY="$UUID_NIL" 1.87 + UUID_INSTANCE="$UUID_NIL" 1.88 + UUID_PLATFORM="$UUID_NIL" 1.89 + 1.90 + # load configuration (and override defaults) 1.91 + if [ -r $file_uuid ]; then 1.92 + if [ ".$opt_v" = .yes ]; then 1.93 + echo "uuid: loading UUID configuration file ($file_uuid)" 1.94 + fi 1.95 + . $file_uuid 1.96 + fi 1.97 + 1.98 + # remember whether something was changed 1.99 + changed=no 1.100 +} 1.101 + 1.102 +# Save Configuration 1.103 +do_save () { 1.104 + if [ ".$changed" = .yes ]; then 1.105 + # save configuration 1.106 + if [ ".$opt_v" = .yes ]; then 1.107 + echo "uuid: saving UUID configuration file ($file_uuid)" 1.108 + fi 1.109 + if [ -f $file_uuid ] && [ ! -w $file_uuid ]; then 1.110 + echo "uuid:ERROR: cannot write to $file_uuid" 1>&2 1.111 + exit 1 1.112 + fi 1.113 + ( echo "UUID_REGISTRY=\"$UUID_REGISTRY\"" 1.114 + echo "UUID_INSTANCE=\"$UUID_INSTANCE\"" 1.115 + echo "UUID_PLATFORM=\"$UUID_PLATFORM\"" 1.116 + ) >$file_uuid.new || exit $? 1.117 + n=`egrep 'UUID_(REGISTRY|INSTANCE|PLATFORM)="[0-9a-f-]*"' \ 1.118 + $file_uuid.new | wc -l | awk '{ print $1; }'` 1.119 + if [ ".$n" != .3 ]; then 1.120 + echo "uuid:ERROR: failed to update $file_uuid" 1>&2 1.121 + rm -f $file_uuid.new 1.122 + exit 1 1.123 + fi 1.124 + cp $file_uuid.new $file_uuid || exit $? 1.125 + rm -f $file_uuid.new || true 1.126 + chown $musr:$mgrp $file_uuid >/dev/null 2>&1 || true 1.127 + chmod 644 $file_uuid >/dev/null 2>&1 || true 1.128 + 1.129 + # remember that no more changes exist 1.130 + changed=no 1.131 + fi 1.132 +} 1.133 + 1.134 +# Reset UUIDs 1.135 +do_reset () { 1.136 + # reset all UUIDs to the "Nil UUID" 1.137 + if [ ".$UUID_REGISTRY" != ".$UUID_NIL" ]; then 1.138 + UUID_REGISTRY="$UUID_NIL" 1.139 + changed=yes 1.140 + fi 1.141 + if [ ".$UUID_INSTANCE" != ".$UUID_NIL" ]; then 1.142 + UUID_INSTANCE="$UUID_NIL" 1.143 + changed=yes 1.144 + fi 1.145 + if [ ".$UUID_PLATFORM" != ".$UUID_NIL" ]; then 1.146 + UUID_PLATFORM="$UUID_NIL" 1.147 + changed=yes 1.148 + fi 1.149 +} 1.150 + 1.151 +# Update UUIDs 1.152 +do_update () { 1.153 + # update registry UUID 1.154 + if [ ".$UUID_REGISTRY" = ".$UUID_NIL" -o ".$UUID_REGISTRY" = . ]; then 1.155 + opt="" 1.156 + if [ ".$opt_m" = .yes ]; then 1.157 + opt="-m" 1.158 + fi 1.159 + if [ ".$opt_v" = .yes ]; then 1.160 + echo "uuid: calculating OpenPKG Registry UUID (UUID_REGISTRY):" 1.161 + echo "uuid: << $prog_uuid -v1 $opt" 1.162 + fi 1.163 + uuid=`$prog_uuid -v1 $opt` 1.164 + if [ ".$UUID_REGISTRY" != ".$uuid" -a ".$uuid" != . ]; then 1.165 + UUID_REGISTRY="$uuid" 1.166 + if [ ".$opt_v" = .yes ]; then 1.167 + echo "uuid: >> $UUID_REGISTRY (NOT REPEATABLE)" 1.168 + fi 1.169 + changed=yes 1.170 + fi 1.171 + fi 1.172 + 1.173 + # update instance UUID 1.174 + name="${Q_openpkg_release}" 1.175 + name="$name:${Q_prefix}" 1.176 + name="$name:${Q_susr}:${Q_suid}:${Q_sgrp}:${Q_sgid}" 1.177 + name="$name:${Q_musr}:${Q_muid}:${Q_mgrp}:${Q_mgid}" 1.178 + name="$name:${Q_rusr}:${Q_ruid}:${Q_rgrp}:${Q_rgid}" 1.179 + name="$name:${Q_nusr}:${Q_nuid}:${Q_ngrp}:${Q_ngid}" 1.180 + if [ ".$opt_v" = .yes ]; then 1.181 + echo "uuid: querying OpenPKG Instance OID" 1.182 + echo "uuid: << $prog_rpm --eval '%{l_openpkg_oid_instance}'" 1.183 + fi 1.184 + OID_NS_INSTANCE="`$prog_rpm --eval '%{l_openpkg_oid_instance}'`" 1.185 + if [ ".$opt_v" = .yes ]; then 1.186 + echo "uuid: >> $OID_NS_INSTANCE" 1.187 + fi 1.188 + if [ ".$opt_v" = .yes ]; then 1.189 + echo "uuid: calculating OpenPKG Instance Namespace UUID" 1.190 + echo "uuid: << $prog_uuid -v3 ns:OID \"$OID_NS_INSTANCE\"" 1.191 + fi 1.192 + UUID_NS_INSTANCE=`$prog_uuid -v3 ns:OID "$OID_NS_INSTANCE"` 1.193 + if [ ".$opt_v" = .yes ]; then 1.194 + echo "uuid: >> $UUID_NS_INSTANCE" 1.195 + fi 1.196 + if [ ".$opt_v" = .yes ]; then 1.197 + echo "uuid: calculating OpenPKG Instance UUID (UUID_INSTANCE):" 1.198 + echo "uuid: << $prog_uuid -v3 \"$UUID_NS_INSTANCE\" \"$name\"" 1.199 + fi 1.200 + uuid=`$prog_uuid -v3 "$UUID_NS_INSTANCE" "$name"` 1.201 + if [ ".$opt_v" = .yes ]; then 1.202 + echo "uuid: >> $uuid" 1.203 + fi 1.204 + if [ ".$UUID_INSTANCE" != ".$uuid" -a ".$uuid" != . ]; then 1.205 + UUID_INSTANCE="$uuid" 1.206 + changed=yes 1.207 + fi 1.208 + 1.209 + # update platform UUID 1.210 + name="${Q_platform}" 1.211 + name="$name:${Q_discriminator}" 1.212 + if [ ".$opt_v" = .yes ]; then 1.213 + echo "uuid: querying OpenPKG Platform OID" 1.214 + echo "uuid: << $prog_rpm --eval '%{l_openpkg_oid_platform}'" 1.215 + fi 1.216 + OID_NS_PLATFORM="`$prog_rpm --eval '%{l_openpkg_oid_platform}'`" 1.217 + if [ ".$opt_v" = .yes ]; then 1.218 + echo "uuid: >> $OID_NS_PLATFORM" 1.219 + fi 1.220 + if [ ".$opt_v" = .yes ]; then 1.221 + echo "uuid: calculating OpenPKG Platform Namespace UUID" 1.222 + echo "uuid: << $prog_uuid -v3 ns:OID \"$OID_NS_PLATFORM\"" 1.223 + fi 1.224 + UUID_NS_PLATFORM=`$prog_uuid -v3 ns:OID "$OID_NS_PLATFORM"` 1.225 + if [ ".$opt_v" = .yes ]; then 1.226 + echo "uuid: >> $UUID_NS_PLATFORM" 1.227 + fi 1.228 + if [ ".$opt_v" = .yes ]; then 1.229 + echo "uuid: calculating OpenPKG Platform UUID (UUID_PLATFORM):" 1.230 + echo "uuid: << $prog_uuid -v3 \"$UUID_NS_PLATFORM\" \"$name\"" 1.231 + fi 1.232 + uuid=`$prog_uuid -v3 "$UUID_NS_PLATFORM" "$name"` 1.233 + if [ ".$opt_v" = .yes ]; then 1.234 + echo "uuid: >> $uuid" 1.235 + fi 1.236 + if [ ".$UUID_PLATFORM" != ".$uuid" -a ".$uuid" != . ]; then 1.237 + UUID_PLATFORM="$uuid" 1.238 + changed=yes 1.239 + fi 1.240 +} 1.241 + 1.242 +# Info about input and resulting UUIDs 1.243 +do_info () { 1.244 + echo "OpenPKG Summary of Identification Information" 1.245 + echo "=============================================" 1.246 + echo "" 1.247 + echo "OpenPKG Registry" 1.248 + time=""; clock=""; node="" 1.249 + eval `$prog_uuid -d "$UUID_REGISTRY" 2>/dev/null |\ 1.250 + sed -e 's/^/X/' \ 1.251 + -e 's/X.*time: *\(.*\)$/time="\1";/' \ 1.252 + -e 's/X.*clock: *\(.*\)$/clock="\1";/' \ 1.253 + -e 's/X.*node: *\(.*\)$/node="\1";/' \ 1.254 + -e 's/^X.*//'` 1.255 + echo " System Time: ${time:-unknown}" 1.256 + echo " System Clock Sequence: ${clock:-unknown}" 1.257 + echo " System Node Address: ${node:-unknown}" 1.258 + echo " UUID_REGISTRY: $UUID_REGISTRY" 1.259 + echo "" 1.260 + echo "OpenPKG Instance" 1.261 + echo " Release: ${Q_openpkg_release}" 1.262 + echo " Prefix: ${Q_prefix}" 1.263 + echo " Super Account: ${Q_susr}(${Q_suid}):${Q_sgrp}(${Q_sgid})" 1.264 + echo " Management Account: ${Q_musr}(${Q_muid}):${Q_mgrp}(${Q_mgid})" 1.265 + echo " Restricted Account: ${Q_rusr}(${Q_ruid}):${Q_rgrp}(${Q_rgid})" 1.266 + echo " Nonprivileged Account: ${Q_nusr}(${Q_nuid}):${Q_ngrp}(${Q_ngid})" 1.267 + echo " UUID_INSTANCE: $UUID_INSTANCE" 1.268 + echo "" 1.269 + echo "OpenPKG Platform" 1.270 + echo " Platform Id: $Q_platform" 1.271 + echo " Discriminator: $Q_discriminator" 1.272 + echo " UUID_PLATFORM: $UUID_PLATFORM" 1.273 + echo "" 1.274 + echo "(run \"$0 --verbose update\" to reproduce the UUID generation)" 1.275 +} 1.276 + 1.277 +# Command Line Dispatching 1.278 +cmd="$1" 1.279 +shift 1.280 +case "$cmd" in 1.281 + reset ) 1.282 + do_load; do_reset; do_save 1.283 + ;; 1.284 + update ) 1.285 + do_query; do_load; do_update; do_save 1.286 + ;; 1.287 + info ) 1.288 + do_query; do_load; do_info 1.289 + ;; 1.290 + * ) 1.291 + echo "uuid:ERROR: invalid command \"$cmd\"" 1>&2 1.292 + exit 1 1.293 + ;; 1.294 +esac 1.295 +