Fri, 22 Oct 2010 13:22:33 +0200
Import package vendor original specs for necessary manipulations.
1 #!@l_prefix@/lib/openpkg/bash
2 ##
3 ## uuid -- OpenPKG UUID Update Utility
4 ## Copyright (c) 2000-2007 OpenPKG Foundation e.V. <http://openpkg.net/>
5 ## Copyright (c) 2000-2007 Ralf S. Engelschall <http://engelschall.com/>
6 ##
7 ## Permission to use, copy, modify, and distribute this software for
8 ## any purpose with or without fee is hereby granted, provided that
9 ## the above copyright notice and this permission notice appear in all
10 ## copies.
11 ##
12 ## THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
13 ## WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
14 ## MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
15 ## IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
16 ## CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
17 ## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
18 ## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
19 ## USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
20 ## ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
21 ## OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
22 ## OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
23 ## SUCH DAMAGE.
24 ##
26 # configuration
27 prefix="@l_prefix@"
28 musr="@l_musr@"
29 mgrp="@l_mgrp@"
30 prog_rpm="$prefix/libexec/openpkg/rpm"
31 prog_shtool="$prefix/lib/openpkg/shtool"
32 prog_miniperl="$prefix/lib/openpkg/miniperl"
33 prog_uuid="$prefix/lib/openpkg/uuid"
34 file_uuid="$prefix/etc/openpkg/uuid"
36 # minimum command line parsing
37 opt_v=no
38 opt_m=no
39 while [ 1 ]; do
40 case "$1" in
41 -v | --verbose ) opt_v=yes; shift ;;
42 -m | --multicast ) opt_m=yes; shift ;;
43 * ) break ;;
44 esac
45 done
47 # special "Nil UUID"
48 UUID_NIL="00000000-0000-0000-0000-000000000000"
50 # Query Dynamic Information
51 do_query () {
52 # query RPM information
53 query=":"
54 for var in \
55 l_openpkg_release \
56 l_prefix \
57 l_susr l_suid l_sgrp l_sgid \
58 l_musr l_muid l_mgrp l_mgid \
59 l_rusr l_ruid l_rgrp l_rgid \
60 l_nusr l_nuid l_ngrp l_ngid; do
61 query="$query; `echo $var | sed -e 's;^l_;Q_;'`=\"%{$var}\""
62 done
63 eval `$prog_rpm --eval "$query" 2>/dev/null`
65 # query OS information
66 Q_platform=`$prog_shtool platform --type=binary 2>/dev/null |\
67 sed -e 's;^\([^-][^-]*-[^.-][^.-]*\)\..*$;\1;'`
68 if [ ".$Q_platform" = . ]; then
69 Q_platform="unknown"
70 fi
71 Q_discriminator=`$prog_uuid -v1 | $prog_uuid -d -- - | awk '/node:.*global unicast/ { printf("mac:%s", $2); }'`
72 if [ ".$Q_discriminator" = . ]; then
73 Q_discriminator=`$prog_miniperl -e 'if (-f "/etc/openpkg") { printf("inode:%s", (stat("/etc/openpkg"))[1]); }' 2>/dev/null`
74 if [ ".$Q_discriminator" = . ]; then
75 Q_discriminator=`$prog_shtool echo -e 'fqdn:%h%d' 2>/dev/null`
76 fi
77 fi
78 }
80 # Load Configuration
81 do_load () {
82 # start with reasonable defaults
83 UUID_REGISTRY="$UUID_NIL"
84 UUID_INSTANCE="$UUID_NIL"
85 UUID_PLATFORM="$UUID_NIL"
87 # load configuration (and override defaults)
88 if [ -r $file_uuid ]; then
89 if [ ".$opt_v" = .yes ]; then
90 echo "uuid: loading UUID configuration file ($file_uuid)"
91 fi
92 . $file_uuid
93 fi
95 # remember whether something was changed
96 changed=no
97 }
99 # Save Configuration
100 do_save () {
101 if [ ".$changed" = .yes ]; then
102 # save configuration
103 if [ ".$opt_v" = .yes ]; then
104 echo "uuid: saving UUID configuration file ($file_uuid)"
105 fi
106 if [ -f $file_uuid ] && [ ! -w $file_uuid ]; then
107 echo "uuid:ERROR: cannot write to $file_uuid" 1>&2
108 exit 1
109 fi
110 ( echo "UUID_REGISTRY=\"$UUID_REGISTRY\""
111 echo "UUID_INSTANCE=\"$UUID_INSTANCE\""
112 echo "UUID_PLATFORM=\"$UUID_PLATFORM\""
113 ) >$file_uuid.new || exit $?
114 n=`egrep 'UUID_(REGISTRY|INSTANCE|PLATFORM)="[0-9a-f-]*"' \
115 $file_uuid.new | wc -l | awk '{ print $1; }'`
116 if [ ".$n" != .3 ]; then
117 echo "uuid:ERROR: failed to update $file_uuid" 1>&2
118 rm -f $file_uuid.new
119 exit 1
120 fi
121 cp $file_uuid.new $file_uuid || exit $?
122 rm -f $file_uuid.new || true
123 chown $musr:$mgrp $file_uuid >/dev/null 2>&1 || true
124 chmod 644 $file_uuid >/dev/null 2>&1 || true
126 # remember that no more changes exist
127 changed=no
128 fi
129 }
131 # Reset UUIDs
132 do_reset () {
133 # reset all UUIDs to the "Nil UUID"
134 if [ ".$UUID_REGISTRY" != ".$UUID_NIL" ]; then
135 UUID_REGISTRY="$UUID_NIL"
136 changed=yes
137 fi
138 if [ ".$UUID_INSTANCE" != ".$UUID_NIL" ]; then
139 UUID_INSTANCE="$UUID_NIL"
140 changed=yes
141 fi
142 if [ ".$UUID_PLATFORM" != ".$UUID_NIL" ]; then
143 UUID_PLATFORM="$UUID_NIL"
144 changed=yes
145 fi
146 }
148 # Update UUIDs
149 do_update () {
150 # update registry UUID
151 if [ ".$UUID_REGISTRY" = ".$UUID_NIL" -o ".$UUID_REGISTRY" = . ]; then
152 opt=""
153 if [ ".$opt_m" = .yes ]; then
154 opt="-m"
155 fi
156 if [ ".$opt_v" = .yes ]; then
157 echo "uuid: calculating OpenPKG Registry UUID (UUID_REGISTRY):"
158 echo "uuid: << $prog_uuid -v1 $opt"
159 fi
160 uuid=`$prog_uuid -v1 $opt`
161 if [ ".$UUID_REGISTRY" != ".$uuid" -a ".$uuid" != . ]; then
162 UUID_REGISTRY="$uuid"
163 if [ ".$opt_v" = .yes ]; then
164 echo "uuid: >> $UUID_REGISTRY (NOT REPEATABLE)"
165 fi
166 changed=yes
167 fi
168 fi
170 # update instance UUID
171 name="${Q_openpkg_release}"
172 name="$name:${Q_prefix}"
173 name="$name:${Q_susr}:${Q_suid}:${Q_sgrp}:${Q_sgid}"
174 name="$name:${Q_musr}:${Q_muid}:${Q_mgrp}:${Q_mgid}"
175 name="$name:${Q_rusr}:${Q_ruid}:${Q_rgrp}:${Q_rgid}"
176 name="$name:${Q_nusr}:${Q_nuid}:${Q_ngrp}:${Q_ngid}"
177 if [ ".$opt_v" = .yes ]; then
178 echo "uuid: querying OpenPKG Instance OID"
179 echo "uuid: << $prog_rpm --eval '%{l_openpkg_oid_instance}'"
180 fi
181 OID_NS_INSTANCE="`$prog_rpm --eval '%{l_openpkg_oid_instance}'`"
182 if [ ".$opt_v" = .yes ]; then
183 echo "uuid: >> $OID_NS_INSTANCE"
184 fi
185 if [ ".$opt_v" = .yes ]; then
186 echo "uuid: calculating OpenPKG Instance Namespace UUID"
187 echo "uuid: << $prog_uuid -v3 ns:OID \"$OID_NS_INSTANCE\""
188 fi
189 UUID_NS_INSTANCE=`$prog_uuid -v3 ns:OID "$OID_NS_INSTANCE"`
190 if [ ".$opt_v" = .yes ]; then
191 echo "uuid: >> $UUID_NS_INSTANCE"
192 fi
193 if [ ".$opt_v" = .yes ]; then
194 echo "uuid: calculating OpenPKG Instance UUID (UUID_INSTANCE):"
195 echo "uuid: << $prog_uuid -v3 \"$UUID_NS_INSTANCE\" \"$name\""
196 fi
197 uuid=`$prog_uuid -v3 "$UUID_NS_INSTANCE" "$name"`
198 if [ ".$opt_v" = .yes ]; then
199 echo "uuid: >> $uuid"
200 fi
201 if [ ".$UUID_INSTANCE" != ".$uuid" -a ".$uuid" != . ]; then
202 UUID_INSTANCE="$uuid"
203 changed=yes
204 fi
206 # update platform UUID
207 name="${Q_platform}"
208 name="$name:${Q_discriminator}"
209 if [ ".$opt_v" = .yes ]; then
210 echo "uuid: querying OpenPKG Platform OID"
211 echo "uuid: << $prog_rpm --eval '%{l_openpkg_oid_platform}'"
212 fi
213 OID_NS_PLATFORM="`$prog_rpm --eval '%{l_openpkg_oid_platform}'`"
214 if [ ".$opt_v" = .yes ]; then
215 echo "uuid: >> $OID_NS_PLATFORM"
216 fi
217 if [ ".$opt_v" = .yes ]; then
218 echo "uuid: calculating OpenPKG Platform Namespace UUID"
219 echo "uuid: << $prog_uuid -v3 ns:OID \"$OID_NS_PLATFORM\""
220 fi
221 UUID_NS_PLATFORM=`$prog_uuid -v3 ns:OID "$OID_NS_PLATFORM"`
222 if [ ".$opt_v" = .yes ]; then
223 echo "uuid: >> $UUID_NS_PLATFORM"
224 fi
225 if [ ".$opt_v" = .yes ]; then
226 echo "uuid: calculating OpenPKG Platform UUID (UUID_PLATFORM):"
227 echo "uuid: << $prog_uuid -v3 \"$UUID_NS_PLATFORM\" \"$name\""
228 fi
229 uuid=`$prog_uuid -v3 "$UUID_NS_PLATFORM" "$name"`
230 if [ ".$opt_v" = .yes ]; then
231 echo "uuid: >> $uuid"
232 fi
233 if [ ".$UUID_PLATFORM" != ".$uuid" -a ".$uuid" != . ]; then
234 UUID_PLATFORM="$uuid"
235 changed=yes
236 fi
237 }
239 # Info about input and resulting UUIDs
240 do_info () {
241 echo "OpenPKG Summary of Identification Information"
242 echo "============================================="
243 echo ""
244 echo "OpenPKG Registry"
245 time=""; clock=""; node=""
246 eval `$prog_uuid -d "$UUID_REGISTRY" 2>/dev/null |\
247 sed -e 's/^/X/' \
248 -e 's/X.*time: *\(.*\)$/time="\1";/' \
249 -e 's/X.*clock: *\(.*\)$/clock="\1";/' \
250 -e 's/X.*node: *\(.*\)$/node="\1";/' \
251 -e 's/^X.*//'`
252 echo " System Time: ${time:-unknown}"
253 echo " System Clock Sequence: ${clock:-unknown}"
254 echo " System Node Address: ${node:-unknown}"
255 echo " UUID_REGISTRY: $UUID_REGISTRY"
256 echo ""
257 echo "OpenPKG Instance"
258 echo " Release: ${Q_openpkg_release}"
259 echo " Prefix: ${Q_prefix}"
260 echo " Super Account: ${Q_susr}(${Q_suid}):${Q_sgrp}(${Q_sgid})"
261 echo " Management Account: ${Q_musr}(${Q_muid}):${Q_mgrp}(${Q_mgid})"
262 echo " Restricted Account: ${Q_rusr}(${Q_ruid}):${Q_rgrp}(${Q_rgid})"
263 echo " Nonprivileged Account: ${Q_nusr}(${Q_nuid}):${Q_ngrp}(${Q_ngid})"
264 echo " UUID_INSTANCE: $UUID_INSTANCE"
265 echo ""
266 echo "OpenPKG Platform"
267 echo " Platform Id: $Q_platform"
268 echo " Discriminator: $Q_discriminator"
269 echo " UUID_PLATFORM: $UUID_PLATFORM"
270 echo ""
271 echo "(run \"$0 --verbose update\" to reproduce the UUID generation)"
272 }
274 # Command Line Dispatching
275 cmd="$1"
276 shift
277 case "$cmd" in
278 reset )
279 do_load; do_reset; do_save
280 ;;
281 update )
282 do_query; do_load; do_update; do_save
283 ;;
284 info )
285 do_query; do_load; do_info
286 ;;
287 * )
288 echo "uuid:ERROR: invalid command \"$cmd\"" 1>&2
289 exit 1
290 ;;
291 esac