| |
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 ## |
| |
25 |
| |
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" |
| |
35 |
| |
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 |
| |
46 |
| |
47 # special "Nil UUID" |
| |
48 UUID_NIL="00000000-0000-0000-0000-000000000000" |
| |
49 |
| |
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` |
| |
64 |
| |
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 } |
| |
79 |
| |
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" |
| |
86 |
| |
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 |
| |
94 |
| |
95 # remember whether something was changed |
| |
96 changed=no |
| |
97 } |
| |
98 |
| |
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 |
| |
125 |
| |
126 # remember that no more changes exist |
| |
127 changed=no |
| |
128 fi |
| |
129 } |
| |
130 |
| |
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 } |
| |
147 |
| |
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 |
| |
169 |
| |
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 |
| |
205 |
| |
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 } |
| |
238 |
| |
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 } |
| |
273 |
| |
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 |
| |
292 |