| 1 |
|
|---|
| 2 |
|
|---|
| 3 |
|
|---|
| 4 |
|
|---|
| 5 |
|
|---|
| 6 |
|
|---|
| 7 |
|
|---|
| 8 |
|
|---|
| 9 |
|
|---|
| 10 |
|
|---|
| 11 |
|
|---|
| 12 |
|
|---|
| 13 |
|
|---|
| 14 |
|
|---|
| 15 |
|
|---|
| 16 |
|
|---|
| 17 |
|
|---|
| 18 |
_VS_LOGFILE= |
|---|
| 19 |
_VS_ERRFILE= |
|---|
| 20 |
|
|---|
| 21 |
_VS_NEWLINE=' |
|---|
| 22 |
' |
|---|
| 23 |
declare -r _VS_NEWLINE=${_VS_NEWLINE:0-1} |
|---|
| 24 |
declare -r VS_ALLVSERVERS_ARGS=all,marked,unmarked,stopped,running |
|---|
| 25 |
|
|---|
| 26 |
function findObject |
|---|
| 27 |
{ |
|---|
| 28 |
local _fo_mod=$1 |
|---|
| 29 |
local _fo_var=$2 |
|---|
| 30 |
local _fo_file= |
|---|
| 31 |
local _fo_i=X |
|---|
| 32 |
shift 2 |
|---|
| 33 |
|
|---|
| 34 |
for _fo_i; do |
|---|
| 35 |
test -n "$_fo_i" || continue |
|---|
| 36 |
test ! $_fo_mod "$_fo_i" || { _fo_file=$_fo_i; break; } |
|---|
| 37 |
done |
|---|
| 38 |
|
|---|
| 39 |
test -z "$_fo_i" -o -n "$_fo_file" || { |
|---|
| 40 |
echo "Can not find file for '$_fo_var'; aborting" |
|---|
| 41 |
exit 1 |
|---|
| 42 |
} >&2 |
|---|
| 43 |
|
|---|
| 44 |
eval "$_fo_var=\"$_fo_file\"" |
|---|
| 45 |
} |
|---|
| 46 |
|
|---|
| 47 |
function findFile |
|---|
| 48 |
{ |
|---|
| 49 |
findObject -f "$@" |
|---|
| 50 |
} |
|---|
| 51 |
|
|---|
| 52 |
function findDir |
|---|
| 53 |
{ |
|---|
| 54 |
findObject -d "$@" |
|---|
| 55 |
} |
|---|
| 56 |
|
|---|
| 57 |
function findAndCopy |
|---|
| 58 |
{ |
|---|
| 59 |
local dst=$1 |
|---|
| 60 |
test ! -s "$dst" || return 0 |
|---|
| 61 |
|
|---|
| 62 |
local tmp |
|---|
| 63 |
shift |
|---|
| 64 |
findFile tmp "$@" |
|---|
| 65 |
|
|---|
| 66 |
test -n "$tmp" -a -s "$tmp" || return 0 |
|---|
| 67 |
$_CP -af "$tmp" "$dst" |
|---|
| 68 |
} |
|---|
| 69 |
|
|---|
| 70 |
|
|---|
| 71 |
function isRegularFile |
|---|
| 72 |
{ |
|---|
| 73 |
test ${2:--f} "$1" || return 1 |
|---|
| 74 |
|
|---|
| 75 |
case $1 in |
|---|
| 76 |
(*.rpmsave|*.rpmnew|*.rpmorig|*.cfsaved*|*.~*~) return 1;; |
|---|
| 77 |
esac |
|---|
| 78 |
|
|---|
| 79 |
return 0 |
|---|
| 80 |
} |
|---|
| 81 |
|
|---|
| 82 |
function getPhysicalDir |
|---|
| 83 |
{ |
|---|
| 84 |
( set -P && cd "$1" && pwd ) |
|---|
| 85 |
} |
|---|
| 86 |
|
|---|
| 87 |
|
|---|
| 88 |
function isDirectoryEmpty |
|---|
| 89 |
{ |
|---|
| 90 |
( |
|---|
| 91 |
shopt -s dotglob || * |
|---|
| 92 |
shopt -s nullglob || * |
|---|
| 93 |
|
|---|
| 94 |
ignore_lostfound=1 |
|---|
| 95 |
test -z "$2" -o "$2" = 0 || ignore_lostfound= |
|---|
| 96 |
|
|---|
| 97 |
for i in "$1"/*; do |
|---|
| 98 |
case "$i" in |
|---|
| 99 |
($1/lost+found) |
|---|
| 100 |
test "$ignore_lostfound" || exit 1 |
|---|
| 101 |
;; |
|---|
| 102 |
(*) echo "$i"; exit 1 |
|---|
| 103 |
esac |
|---|
| 104 |
done |
|---|
| 105 |
|
|---|
| 106 |
exit 0 |
|---|
| 107 |
) |
|---|
| 108 |
} |
|---|
| 109 |
|
|---|
| 110 |
|
|---|
| 111 |
function logging |
|---|
| 112 |
{ |
|---|
| 113 |
if test -n "$_VS_LOGFILE"; then |
|---|
| 114 |
echo "$@" >>"$_VS_LOGFILE" |
|---|
| 115 |
else |
|---|
| 116 |
echo "$@" |
|---|
| 117 |
fi |
|---|
| 118 |
} |
|---|
| 119 |
|
|---|
| 120 |
|
|---|
| 121 |
function warning |
|---|
| 122 |
{ |
|---|
| 123 |
if test -n "$_VS_ERRFILE"; then |
|---|
| 124 |
echo "$@" >>"$_VS_ERRFILE" |
|---|
| 125 |
else |
|---|
| 126 |
echo "$@" >&2 |
|---|
| 127 |
fi |
|---|
| 128 |
} |
|---|
| 129 |
|
|---|
| 130 |
|
|---|
| 131 |
function panic |
|---|
| 132 |
{ |
|---|
| 133 |
if test -n "$_VS_ERRFILE"; then |
|---|
| 134 |
echo "$@" >>"$_VS_ERRFILE" |
|---|
| 135 |
else |
|---|
| 136 |
echo "$@" >&2 |
|---|
| 137 |
fi |
|---|
| 138 |
|
|---|
| 139 |
exit 1 |
|---|
| 140 |
} |
|---|
| 141 |
|
|---|
| 142 |
|
|---|
| 143 |
function execute |
|---|
| 144 |
{ |
|---|
| 145 |
test -z "${DEBUG_EXEC:-}" || echo "$@" |
|---|
| 146 |
test "${DEBUG_EXEC:-}" = noexec || exec "$@" |
|---|
| 147 |
exit 0 |
|---|
| 148 |
} |
|---|
| 149 |
|
|---|
| 150 |
|
|---|
| 151 |
|
|---|
| 152 |
function spawn |
|---|
| 153 |
{ |
|---|
| 154 |
test -z "${DEBUG_EXEC:-}" || echo "$@" |
|---|
| 155 |
test "${DEBUG_EXEC:-}" = noexec || "$@" |
|---|
| 156 |
} |
|---|
| 157 |
|
|---|
| 158 |
|
|---|
| 159 |
function isNumber |
|---|
| 160 |
{ |
|---|
| 161 |
local tmp |
|---|
| 162 |
let tmp=$1+0 2>/dev/null || test -z "${1//0/}" -a -n "$1" || return 1 |
|---|
| 163 |
return 0 |
|---|
| 164 |
} |
|---|
| 165 |
|
|---|
| 166 |
|
|---|
| 167 |
function hasSubstring |
|---|
| 168 |
{ |
|---|
| 169 |
local pat=$1 |
|---|
| 170 |
local i |
|---|
| 171 |
|
|---|
| 172 |
shift |
|---|
| 173 |
|
|---|
| 174 |
for i; do |
|---|
| 175 |
test x"${pat/*$i*/$i}" = x"$i" || continue |
|---|
| 176 |
return 0 |
|---|
| 177 |
done |
|---|
| 178 |
|
|---|
| 179 |
return 1 |
|---|
| 180 |
} |
|---|
| 181 |
|
|---|
| 182 |
|
|---|
| 183 |
function colorize |
|---|
| 184 |
{ |
|---|
| 185 |
local style=$1 |
|---|
| 186 |
shift |
|---|
| 187 |
|
|---|
| 188 |
if ! $_TTY -s; then |
|---|
| 189 |
"$@" |
|---|
| 190 |
else |
|---|
| 191 |
local cfile |
|---|
| 192 |
findFile cfile "$__CONFDIR"/.defaults/styles/"$style" '' |
|---|
| 193 |
if test -n "$cfile"; then |
|---|
| 194 |
$_CAT "$cfile" |
|---|
| 195 |
else |
|---|
| 196 |
case "$style" in |
|---|
| 197 |
(bold) echo -ne "\e[1m";; |
|---|
| 198 |
(emph) echo -ne "\e[34m";; |
|---|
| 199 |
(info) echo -ne "\e[0;34m";; |
|---|
| 200 |
(warn*) echo -ne "\e[1;31m";; |
|---|
| 201 |
(error) echo -ne "\e[1;33;41m";; |
|---|
| 202 |
(*) ;; |
|---|
| 203 |
esac |
|---|
| 204 |
fi |
|---|
| 205 |
|
|---|
| 206 |
( "$@" ) |
|---|
| 207 |
echo -ne "\e[m" |
|---|
| 208 |
fi |
|---|
| 209 |
} |
|---|
| 210 |
|
|---|
| 211 |
function colpanic |
|---|
| 212 |
{ |
|---|
| 213 |
if test -n "$_VS_ERRFILE"; then |
|---|
| 214 |
echo "$@" >>"$_VS_ERRFILE" |
|---|
| 215 |
else |
|---|
| 216 |
colorize error echo -n "$@" >&2 |
|---|
| 217 |
fi |
|---|
| 218 |
echo |
|---|
| 219 |
|
|---|
| 220 |
exit 1 |
|---|
| 221 |
} |
|---|
| 222 |
|
|---|
| 223 |
function colwarning |
|---|
| 224 |
{ |
|---|
| 225 |
colorize warning warning "$@" |
|---|
| 226 |
} |
|---|
| 227 |
|
|---|
| 228 |
function colinfo |
|---|
| 229 |
{ |
|---|
| 230 |
colorize info echo "$@" |
|---|
| 231 |
} |
|---|
| 232 |
|
|---|
| 233 |
|
|---|
| 234 |
|
|---|
| 235 |
function xtermTitle |
|---|
| 236 |
{ |
|---|
| 237 |
$_TTY -s || return 0 |
|---|
| 238 |
echo -ne "\e]0;$@\007" |
|---|
| 239 |
} |
|---|
| 240 |
|
|---|
| 241 |
_VS_LOCKS='' |
|---|
| 242 |
|
|---|
| 243 |
function lock |
|---|
| 244 |
{ |
|---|
| 245 |
local tmp=$($_MKTEMP vserver-lock.XXXXXX) |
|---|
| 246 |
$_RM -f $tmp |
|---|
| 247 |
$_MKFIFO -m600 $tmp |
|---|
| 248 |
|
|---|
| 249 |
$_LOCKFILE "$1" $tmp $2 & |
|---|
| 250 |
$_GREP -q true $tmp 2>/dev/null || return 1 |
|---|
| 251 |
|
|---|
| 252 |
_VS_LOCKS="$! $_VS_LOCKS" |
|---|
| 253 |
} |
|---|
| 254 |
|
|---|
| 255 |
|
|---|
| 256 |
function unlock |
|---|
| 257 |
{ |
|---|
| 258 |
local num=$1 |
|---|
| 259 |
local i |
|---|
| 260 |
|
|---|
| 261 |
set -- $_VS_LOCKS |
|---|
| 262 |
while test "$#" -gt 0; do |
|---|
| 263 |
kill -HUP "$1" >/dev/null || : |
|---|
| 264 |
shift |
|---|
| 265 |
test "$num" != 1 || break |
|---|
| 266 |
test -z "$num" || let --num |
|---|
| 267 |
done |
|---|
| 268 |
_VS_LOCKS="$@" |
|---|
| 269 |
} |
|---|
| 270 |
|
|---|
| 271 |
function get_init_cwd |
|---|
| 272 |
{ |
|---|
| 273 |
if test -n "$INIT_CWD"; then |
|---|
| 274 |
echo "$INIT_CWD" |
|---|
| 275 |
else |
|---|
| 276 |
pwd |
|---|
| 277 |
fi |
|---|
| 278 |
} |
|---|
| 279 |
function set_init_cwd |
|---|
| 280 |
{ |
|---|
| 281 |
INIT_CWD="`pwd`" |
|---|
| 282 |
export INIT_CWD |
|---|
| 283 |
} |
|---|
| 284 |
|
|---|
| 285 |
function _setVserverDir |
|---|
| 286 |
{ |
|---|
| 287 |
local vserver="$1" |
|---|
| 288 |
case "$vserver" in |
|---|
| 289 |
./*) VSERVER_DIR="`get_init_cwd`/$vserver";; |
|---|
| 290 |
/*) VSERVER_DIR="$vserver" ;; |
|---|
| 291 |
*) VSERVER_DIR="$__CONFDIR/$vserver" ;; |
|---|
| 292 |
esac |
|---|
| 293 |
} |
|---|
| 294 |
|
|---|
| 295 |
function _setVserverName |
|---|
| 296 |
{ |
|---|
| 297 |
if test -e "$VSERVER_DIR"/name; then |
|---|
| 298 |
read VSERVER_NAME <"$VSERVER_DIR"/name |
|---|
| 299 |
else |
|---|
| 300 |
VSERVER_NAME=$(basename "$VSERVER_DIR") |
|---|
| 301 |
fi |
|---|
| 302 |
} |
|---|
| 303 |
|
|---|
| 304 |
function _pkgMountBindDir() |
|---|
| 305 |
{ |
|---|
| 306 |
test "$1" != "$2" || return 0 |
|---|
| 307 |
|
|---|
| 308 |
$_MOUNT -n --bind "$1" "$2" |
|---|
| 309 |
} |
|---|
| 310 |
|
|---|
| 311 |
function _pkgSetVarsBase |
|---|
| 312 |
{ |
|---|
| 313 |
case "$vserver" in |
|---|
| 314 |
./*|/*) |
|---|
| 315 |
if test -d "$vserver/vdir"; then |
|---|
| 316 |
BASEDIR=$vserver |
|---|
| 317 |
VDIR=$(getPhysicalDir "$vserver/vdir") |
|---|
| 318 |
|
|---|
| 319 |
PKGDIR=$BASEDIR/apps/pkgmgmt |
|---|
| 320 |
test -d "$PKGDIR" || { |
|---|
| 321 |
echo "Can not find configuration-directory for package-managment tools" |
|---|
| 322 |
exit 1 |
|---|
| 323 |
} >&2 |
|---|
| 324 |
findDir EXECDIR $PKGDIR/execdir / |
|---|
| 325 |
else |
|---|
| 326 |
VDIR=$(getPhysicalDir "$vserver") |
|---|
| 327 |
PKGDIR= |
|---|
| 328 |
fi |
|---|
| 329 |
;; |
|---|
| 330 |
*) |
|---|
| 331 |
BASEDIR=$__CONFDIR/$vserver |
|---|
| 332 |
test -d "$BASEDIR" || { |
|---|
| 333 |
echo "Can not find configuration-directory" |
|---|
| 334 |
exit 1 |
|---|
| 335 |
} >&2 |
|---|
| 336 |
|
|---|
| 337 |
VDIR=$BASEDIR/vdir |
|---|
| 338 |
test -d "$VDIR" || VDIR=$__DEFAULT_VSERVERDIR/$vserver |
|---|
| 339 |
VDIR=$(getPhysicalDir "$VDIR") |
|---|
| 340 |
|
|---|
| 341 |
PKGDIR=$BASEDIR/apps/pkgmgmt |
|---|
| 342 |
test -d "$PKGDIR" || { |
|---|
| 343 |
echo "Can not find configuration-directory for package-managment tools" |
|---|
| 344 |
exit 1 |
|---|
| 345 |
} >&2 |
|---|
| 346 |
|
|---|
| 347 |
findDir EXECDIR $PKGDIR/execdir / |
|---|
| 348 |
|
|---|
| 349 |
;; |
|---|
| 350 |
esac |
|---|
| 351 |
|
|---|
| 352 |
if test -z "$WORKAROUND_106057"; then |
|---|
| 353 |
_rpmdb_mntpoint=/dev |
|---|
| 354 |
else |
|---|
| 355 |
_rpmdb_mntpoint=/.rpmdb |
|---|
| 356 |
fi |
|---|
| 357 |
} |
|---|
| 358 |
|
|---|
| 359 |
function _pkgSetVarsRPM |
|---|
| 360 |
{ |
|---|
| 361 |
if test -n "$PKGDIR"; then |
|---|
| 362 |
findDir RPMETCDIR $PKGDIR/rpmetc $PKGDIR/base/rpm/etc /etc/rpm |
|---|
| 363 |
findDir RPMSTATEDIR $PKGDIR/rpmstate $PKGDIR/base/rpm/state |
|---|
| 364 |
|
|---|
| 365 |
findDir RPMLIBDIR $PKGDIR/rpmlib / |
|---|
| 366 |
|
|---|
| 367 |
else |
|---|
| 368 |
findDir RPMETCDIR "$VDIR"/etc/rpm /etc/rpm |
|---|
| 369 |
findDir RPMSTATEDIR "$VDIR"/var/lib/rpm |
|---|
| 370 |
RPMLIBDIR=/ |
|---|
| 371 |
fi |
|---|
| 372 |
|
|---|
| 373 |
RPMSTATEDIR=$(getPhysicalDir "$RPMSTATEDIR") |
|---|
| 374 |
RPMETCDIR=$(getPhysicalDir "$RPMETCDIR") |
|---|
| 375 |
} |
|---|
| 376 |
|
|---|
| 377 |
function _pkgSetVarsApt |
|---|
| 378 |
{ |
|---|
| 379 |
if test -n "$PKGDIR"; then |
|---|
| 380 |
findDir APTETCDIR $PKGDIR/aptetc $PKGDIR/base/apt/etc /etc/apt |
|---|
| 381 |
findDir APTSTATEDIR $PKGDIR/aptstate $PKGDIR/base/apt/state |
|---|
| 382 |
findDir APTCACHEDIR $PKGDIR/aptcache $PKGDIR/base/apt/cache |
|---|
| 383 |
findDir APTARCHIVDIR $PKGDIR/aptarchives $PKGDIR/base/apt/archives /var/cache/apt/archives |
|---|
| 384 |
else |
|---|
| 385 |
findDir APTETCDIR "$VDIR"/etc/apt /etc/apt |
|---|
| 386 |
findDir APTSTATEDIR "$VDIR"/var/state/apt |
|---|
| 387 |
findDir APTCACHEDIR "$VDIR"/var/cache/apt |
|---|
| 388 |
findDir APTARCHIVDIR "$VDIR"/var/cache/apt/archives /var/cache/apt/archives |
|---|
| 389 |
fi |
|---|
| 390 |
|
|---|
| 391 |
findFile APT_CONFIG "$APTETCDIR"/apt.conf "" |
|---|
| 392 |
test -z "$APT_CONFIG" || export APT_CONFIG |
|---|
| 393 |
} |
|---|
| 394 |
|
|---|
| 395 |
function _pkgSetVarsYum |
|---|
| 396 |
{ |
|---|
| 397 |
if test -n "$PKGDIR"; then |
|---|
| 398 |
findDir YUMETCDIR $PKGDIR/yumetc $PKGDIR/base/yum/etc /etc |
|---|
| 399 |
findDir YUMCACHEDIR $PKGDIR/yumcache $PKGDIR/base/yum/cache |
|---|
| 400 |
else |
|---|
| 401 |
findDir YUMETCDIR "$VDIR"/etc /etc |
|---|
| 402 |
findDir YUMCACHEDIR "$VDIR"/var/cache/yum |
|---|
| 403 |
fi |
|---|
| 404 |
} |
|---|
| 405 |
|
|---|
| 406 |
|
|---|
| 407 |
function _pkgMountBase |
|---|
| 408 |
{ |
|---|
| 409 |
: |
|---|
| 410 |
} |
|---|
| 411 |
|
|---|
| 412 |
function _pkgMountApt |
|---|
| 413 |
{ |
|---|
| 414 |
: |
|---|
| 415 |
} |
|---|
| 416 |
|
|---|
| 417 |
function _pkgMountYum |
|---|
| 418 |
{ |
|---|
| 419 |
: |
|---|
| 420 |
} |
|---|
| 421 |
|
|---|
| 422 |
function _pkgMountRPM |
|---|
| 423 |
{ |
|---|
| 424 |
_pkgMountBindDir "$RPMETCDIR" /etc/rpm |
|---|
| 425 |
test "$RPMLIBDIR" = "/" || _pkgMountBindDir "$RPMLIBDIR" /usr/lib/rpm |
|---|
| 426 |
|
|---|
| 427 |
pushd "$VDIR" >/dev/null |
|---|
| 428 |
|
|---|
| 429 |
$_SECURE_MOUNT --chroot -n --bind "$RPMSTATEDIR" "$_rpmdb_mntpoint" |
|---|
| 430 |
test -z "$WORKAROUND_106057" || mount -n --bind "$RPMSTATEDIR" "$_rpmdb_mntpoint" |
|---|
| 431 |
|
|---|
| 432 |
test -e "$VDIR"/proc/self/status || \ |
|---|
| 433 |
$_SECURE_MOUNT --chroot -n -t proc none /proc |
|---|
| 434 |
|
|---|
| 435 |
popd >/dev/null |
|---|
| 436 |
} |
|---|
| 437 |
|
|---|
| 438 |
function _pkgSetEnvBase |
|---|
| 439 |
{ |
|---|
| 440 |
test "$EXECDIR" = "/" || { |
|---|
| 441 |
PATH=$EXECDIR:$PATH |
|---|
| 442 |
LD_LIBRARY_PATH=$EXECDIR${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH} |
|---|
| 443 |
} |
|---|
| 444 |
|
|---|
| 445 |
export PATH LD_LIBRARY_PATH |
|---|
| 446 |
} |
|---|
| 447 |
|
|---|
| 448 |
function _pkgSetEnvApt |
|---|
| 449 |
{ |
|---|
| 450 |
: |
|---|
| 451 |
} |
|---|
| 452 |
|
|---|
| 453 |
function _pkgSetEnvYum |
|---|
| 454 |
{ |
|---|
| 455 |
: |
|---|
| 456 |
} |
|---|
| 457 |
|
|---|
| 458 |
function _pkgSetEnvRPM |
|---|
| 459 |
{ |
|---|
| 460 |
CUR_VSERVER=$vserver |
|---|
| 461 |
RPM_FAKE_NAMESPACE_MOUNTS=$_rpmdb_mntpoint |
|---|
| 462 |
RPM_BINARY=$_VRPM_PRELOAD |
|---|
| 463 |
|
|---|
| 464 |
export CUR_VSERVER RPM_FAKE_NAMESPACE_MOUNTS RPM_BINARY |
|---|
| 465 |
} |
|---|
| 466 |
|
|---|
| 467 |
function pkgInit |
|---|
| 468 |
{ |
|---|
| 469 |
local i |
|---|
| 470 |
local vserver=$1 |
|---|
| 471 |
shift |
|---|
| 472 |
|
|---|
| 473 |
_pkgSetVarsBase |
|---|
| 474 |
for i; do |
|---|
| 475 |
case "$i" in |
|---|
| 476 |
rpm) _pkgSetVarsRPM;; |
|---|
| 477 |
apt) _pkgSetVarsApt;; |
|---|
| 478 |
yum) _pkgSetVarsYum;; |
|---|
| 479 |
*) echo "Unknown packaging flavor" >&2; exit 1;; |
|---|
| 480 |
esac |
|---|
| 481 |
done |
|---|
| 482 |
|
|---|
| 483 |
_pkgMountBase |
|---|
| 484 |
for i; do |
|---|
| 485 |
case "$i" in |
|---|
| 486 |
rpm) _pkgMountRPM;; |
|---|
| 487 |
apt) _pkgMountApt;; |
|---|
| 488 |
yum) _pkgMountYum;; |
|---|
| 489 |
esac |
|---|
| 490 |
done |
|---|
| 491 |
|
|---|
| 492 |
_pkgSetEnvBase |
|---|
| 493 |
for i; do |
|---|
| 494 |
case "$i" in |
|---|
| 495 |
rpm) _pkgSetEnvRPM;; |
|---|
| 496 |
apt) _pkgSetEnvApt;; |
|---|
| 497 |
yum) _pkgSetEnvYum;; |
|---|
| 498 |
esac |
|---|
| 499 |
done |
|---|
| 500 |
|
|---|
| 501 |
_PKG_FLAVORS="$@" |
|---|
| 502 |
_PKG_VSERVER=$vserver |
|---|
| 503 |
} |
|---|
| 504 |
|
|---|
| 505 |
function isAvoidNamespace |
|---|
| 506 |
{ |
|---|
| 507 |
local cfgdir |
|---|
| 508 |
|
|---|
| 509 |
$_VSERVER_INFO - FEATURE namespace || return 0 |
|---|
| 510 |
cfgdir=$($_VSERVER_INFO "$1" CFGDIR) || return 0 |
|---|
| 511 |
test ! -e "$cfgdir"/namespace || return 1 |
|---|
| 512 |
test -e "$__CONFDIR"/.defaults/nonamespace -o \ |
|---|
| 513 |
-e "$cfgdir"/nonamespace |
|---|
| 514 |
} |
|---|
| 515 |
|
|---|
| 516 |
function isNamespaceCleanup |
|---|
| 517 |
{ |
|---|
| 518 |
local cfgdir |
|---|
| 519 |
|
|---|
| 520 |
$_VSERVER_INFO - FEATURE namespace || return 1 |
|---|
| 521 |
cfgdir=$($_VSERVER_INFO "$1" CFGDIR) || return 1 |
|---|
| 522 |
isAvoidNamespace "$1" && return 1 |
|---|
| 523 |
test -e "$cfgdir"/namespace-cleanup && return 0 |
|---|
| 524 |
test -e "$cfgdir"/nonamespace-cleanup -o \ |
|---|
| 525 |
-e "$__CONFDIR"/.defaults/nonamespace-cleanup && return 1 |
|---|
| 526 |
return 0 |
|---|
| 527 |
} |
|---|
| 528 |
|
|---|
| 529 |
|
|---|
| 530 |
function getAllVservers |
|---|
| 531 |
{ |
|---|
| 532 |
local _ga_i |
|---|
| 533 |
declare -a _ga_tmp=() |
|---|
| 534 |
|
|---|
| 535 |
for _ga_i in $__CONFDIR/*; do |
|---|
| 536 |
isRegularFile "$_ga_i" -d || continue |
|---|
| 537 |
|
|---|
| 538 |
test ! -e "$_ga_i"/disabled || continue |
|---|
| 539 |
test -d "$_ga_i"/vdir || continue |
|---|
| 540 |
|
|---|
| 541 |
local _ga_doadd=1 |
|---|
| 542 |
local _ga_markfile=$_ga_i/apps/init/mark |
|---|
| 543 |
|
|---|
| 544 |
case ${2:-ALL} in |
|---|
| 545 |
(MARKED) test -s "$_ga_markfile" || _ga_doadd=;; |
|---|
| 546 |
(UNMARKED) test ! -s "$_ga_markfile" || _ga_doadd=;; |
|---|
| 547 |
(STOPPED) ! $_VSERVER "$_ga_i" running &>/dev/null || _ga_doadd=;; |
|---|
| 548 |
(RUNNING) $_VSERVER "$_ga_i" running &>/dev/null || _ga_doadd=;; |
|---|
| 549 |
(ALL) ;; |
|---|
| 550 |
(*) panic $"Unknown vserver tagging '$2'";; |
|---|
| 551 |
esac |
|---|
| 552 |
|
|---|
| 553 |
test -z "$_ga_doadd" || _ga_tmp=( "${_ga_tmp[@]}" "${_ga_i##$__CONFDIR/}") |
|---|
| 554 |
done |
|---|
| 555 |
|
|---|
| 556 |
eval $1='( "${_ga_tmp[@]}" )' |
|---|
| 557 |
} |
|---|
| 558 |
|
|---|
| 559 |
|
|---|
| 560 |
function getAllVserversByArg |
|---|
| 561 |
{ |
|---|
| 562 |
local _gav_mark= |
|---|
| 563 |
|
|---|
| 564 |
case $2 in |
|---|
| 565 |
(--all) _gav_mark=ALL;; |
|---|
| 566 |
(--marked) _gav_mark=MARKED;; |
|---|
| 567 |
(--unmarked) _gav_mark=UNMARKED;; |
|---|
| 568 |
(--stopped) _gav_mark=STOPPED;; |
|---|
| 569 |
(--running) _gav_mark=RUNNING;; |
|---|
| 570 |
(*) return 1;; |
|---|
| 571 |
esac |
|---|
| 572 |
|
|---|
| 573 |
getAllVservers "$1" "$_gav_mark" |
|---|
| 574 |
} |
|---|
| 575 |
|
|---|
| 576 |
|
|---|
| 577 |
function _getProcNumberCount |
|---|
| 578 |
{ |
|---|
| 579 |
local _gp_var=$2 |
|---|
| 580 |
local _gp_procnr_cnt=0 |
|---|
| 581 |
|
|---|
| 582 |
|
|---|
| 583 |
if test -d "/proc/virtual"; then |
|---|
| 584 |
set -- $($_GREP '^Tasks:' "/proc/virtual/$1/status" 2>/dev/null) |
|---|
| 585 |
_gp_procnr_cnt=$2 |
|---|
| 586 |
else |
|---|
| 587 |
_gp_procnr_cnt=$($_VPS ax | $_AWK '{print $2}' | $_GREP -x "$1" | $_WC -l ) |
|---|
| 588 |
fi |
|---|
| 589 |
|
|---|
| 590 |
let _gp_procnr_cnt=_gp_procnr_cnt+0 |
|---|
| 591 |
eval $_gp_var=\$_gp_procnr_cnt |
|---|
| 592 |
} |
|---|
| 593 |
|
|---|
| 594 |
|
|---|
| 595 |
|
|---|
| 596 |
function getVserverStatus |
|---|
| 597 |
{ |
|---|
| 598 |
test -r "$1"/run || return 1 |
|---|
| 599 |
|
|---|
| 600 |
local _gvs_ctx |
|---|
| 601 |
read _gvs_ctx <"$1"/run |
|---|
| 602 |
eval "$2"=\$_gvs_ctx |
|---|
| 603 |
|
|---|
| 604 |
if test "$1" = "$($_VUNAME -g --xid "$_gvs_ctx" context)"; then |
|---|
| 605 |
test -n "$3" || return 0 |
|---|
| 606 |
local _gvs_tmp |
|---|
| 607 |
_getProcNumberCount "$_gvs_ctx" _gvs_tmp |
|---|
| 608 |
eval "$3"=\$_gvs_tmp |
|---|
| 609 |
else |
|---|
| 610 |
test -n "$3" || return 1 |
|---|
| 611 |
eval "$3"=0 |
|---|
| 612 |
_gvs_tmp=0 |
|---|
| 613 |
fi |
|---|
| 614 |
|
|---|
| 615 |
if test "$_gvs_tmp" = 0; then |
|---|
| 616 |
local runfile=$($_READLINK "$1/run") |
|---|
| 617 |
test -z "$4" || $_RM -f "$runfile" |
|---|
| 618 |
return 1 |
|---|
| 619 |
fi |
|---|
| 620 |
|
|---|
| 621 |
return 0 |
|---|
| 622 |
} |
|---|
| 623 |
|
|---|
| 624 |
|
|---|
| 625 |
function isCtxRunning |
|---|
| 626 |
{ |
|---|
| 627 |
local _tmp |
|---|
| 628 |
_getProcNumberCount "$1" _tmp |
|---|
| 629 |
test $_tmp -gt 0 |
|---|
| 630 |
} |
|---|
| 631 |
|
|---|
| 632 |
|
|---|
| 633 |
function isVserverRunning |
|---|
| 634 |
{ |
|---|
| 635 |
local _ivr_ctx _ivr_procnum |
|---|
| 636 |
|
|---|
| 637 |
getVserverStatus "$1" _ivr_ctx _ivr_procnum 1 || return 1 |
|---|
| 638 |
test "$_ivr_procnum" != 0 || return 1 |
|---|
| 639 |
test -z "$2" || eval "$2"=\$_ivr_ctx |
|---|
| 640 |
return 0 |
|---|
| 641 |
} |
|---|
| 642 |
|
|---|
| 643 |
|
|---|
| 644 |
function getFileValue |
|---|
| 645 |
{ |
|---|
| 646 |
local _gfv_var=$1 |
|---|
| 647 |
local _gfv_file |
|---|
| 648 |
shift |
|---|
| 649 |
|
|---|
| 650 |
findFile _gfv_file "$@" '' |
|---|
| 651 |
test -n "$_gfv_file" -a -r "$_gfv_file" || return 0 |
|---|
| 652 |
eval read "$_gfv_var" <"$_gfv_file" |
|---|
| 653 |
} |
|---|
| 654 |
|
|---|
| 655 |
|
|---|
| 656 |
function getFileArray |
|---|
| 657 |
{ |
|---|
| 658 |
local _gfa_var=$1 |
|---|
| 659 |
local _gfa_file |
|---|
| 660 |
shift |
|---|
| 661 |
|
|---|
| 662 |
findFile _gfa_file "$@" '' |
|---|
| 663 |
test -n "$_gfa_file" -a -r "$_gfa_file" || return 0 |
|---|
| 664 |
local IFS=$_VS_NEWLINE |
|---|
| 665 |
eval "$_gfa_var"='( $(< "$_gfa_file") )' |
|---|
| 666 |
} |
|---|
| 667 |
|
|---|
| 668 |
function checkComponents |
|---|
| 669 |
{ |
|---|
| 670 |
local i |
|---|
| 671 |
local msg=$1 |
|---|
| 672 |
local x_failed= |
|---|
| 673 |
|
|---|
| 674 |
shift |
|---|
| 675 |
|
|---|
| 676 |
for i; do |
|---|
| 677 |
local failed= |
|---|
| 678 |
case "$i" in |
|---|
| 679 |
(core) test -x "$_CHBIND" || failed=1;; |
|---|
| 680 |
(build) test -x "$_VSERVER_BUILD" || failed=1;; |
|---|
| 681 |
(sysv) test -x "$__INITRDDIR/vserver" || failed=1;; |
|---|
| 682 |
(devel) test -d "$__INCLUDEDIR/vserver.h" || failed=1;; |
|---|
| 683 |
(*) echo "Unknown component '$i'" >&2 |
|---|
| 684 |
return false |
|---|
| 685 |
;; |
|---|
| 686 |
esac |
|---|
| 687 |
|
|---|
| 688 |
test -z "$failed" || { |
|---|
| 689 |
echo "$msg: $i" |
|---|
| 690 |
x_failed=1 |
|---|
| 691 |
} >&2 |
|---|
| 692 |
done |
|---|
| 693 |
|
|---|
| 694 |
test -z "$x_failed" |
|---|
| 695 |
} |
|---|
| 696 |
|
|---|
| 697 |
|
|---|
| 698 |
function isKernelAPI |
|---|
| 699 |
{ |
|---|
| 700 |
local api |
|---|
| 701 |
api=$($_VSERVER_INFO - APIVER) || api=0 |
|---|
| 702 |
test $[ $api ] -${2:-ge} $[ $1 ] |
|---|
| 703 |
} |
|---|
| 704 |
|
|---|
| 705 |
|
|---|
| 706 |
function callInNamespace |
|---|
| 707 |
{ |
|---|
| 708 |
local ctx= |
|---|
| 709 |
|
|---|
| 710 |
isAvoidNamespace "$1" || \ |
|---|
| 711 |
ctx=$( $_VSERVER_INFO "$1" CONTEXT f ) || ctx= |
|---|
| 712 |
|
|---|
| 713 |
shift |
|---|
| 714 |
if test -n "$ctx"; then |
|---|
| 715 |
$_VNAMESPACE --enter "$ctx" -- "$@" |
|---|
| 716 |
else |
|---|
| 717 |
"$@" |
|---|
| 718 |
fi |
|---|
| 719 |
} |
|---|
| 720 |
|
|---|
| 721 |
|
|---|
| 722 |
function setDefaultTTY |
|---|
| 723 |
{ |
|---|
| 724 |
local cfgdir ttyname |
|---|
| 725 |
|
|---|
| 726 |
cfgdir=$($_VSERVER_INFO "$1" APPDIR init) || cfgdir= |
|---|
| 727 |
findObject -e ttyname \ |
|---|
| 728 |
${cfgdir:+"$cfgdir"/tty} \ |
|---|
| 729 |
"$__CONFDIR/.defaults/apps/init/tty" \ |
|---|
| 730 |
$2 /dev/null |
|---|
| 731 |
|
|---|
| 732 |
if test -f "$ttyname"; then |
|---|
| 733 |
exec </dev/null |
|---|
| 734 |
else |
|---|
| 735 |
exec <$ttyname |
|---|
| 736 |
fi |
|---|
| 737 |
exec >>$ttyname 2>&1 |
|---|
| 738 |
} |
|---|
| 739 |
|
|---|
| 740 |
|
|---|
| 741 |
function killContext |
|---|
| 742 |
{ |
|---|
| 743 |
local sig=${2:-9} |
|---|
| 744 |
|
|---|
| 745 |
|
|---|
| 746 |
$_VKILL -s "$sig" --xid "$1" 1 &>/dev/null || : |
|---|
| 747 |
$_VKILL -s "$sig" --xid "$1" &>/dev/null || : |
|---|
| 748 |
|
|---|
| 749 |
|
|---|
| 750 |
} |
|---|
| 751 |
|
|---|
| 752 |
function useVlogin |
|---|
| 753 |
{ |
|---|
| 754 |
test ! -e "$__CONFDIR/.defaults/apps/vlogin/disable" |
|---|
| 755 |
} |
|---|
| 756 |
|
|---|
| 757 |
|
|---|
| 758 |
function pkgmgmt.guessStyle() |
|---|
| 759 |
{ |
|---|
| 760 |
local _pgs_vdir |
|---|
| 761 |
_pgs_vdir=$($_VSERVER_INFO "$1" VDIR) || { |
|---|
| 762 |
echo $"Can not determine vserver-root" >&2 |
|---|
| 763 |
return 1 |
|---|
| 764 |
} |
|---|
| 765 |
local _pgs_cfgdir=$($_VSERVER_INFO "$1" APPDIR pkgmgmt) || : |
|---|
| 766 |
|
|---|
| 767 |
if test -n "$_pgs_cfgdir" -a -e "$_pgs_cfgdir"/style; then |
|---|
| 768 |
read style <"$_pgs_cfgdir"/style |
|---|
| 769 |
elif test -e "$_pgs_vdir"/etc/redhat-release -o -e "$_pgs_vdir"/etc/fedora-release; then |
|---|
| 770 |
style=redhat |
|---|
| 771 |
elif test -e "$_pgs_vdir"/etc/mandrake-release; then |
|---|
| 772 |
style=mandrake |
|---|
| 773 |
elif test -e "$_pgs_vdir"/etc/debian_version; then |
|---|
| 774 |
style=debian |
|---|
| 775 |
elif test -e "$_pgs_vdir"/etc/SuSE-release; then |
|---|
| 776 |
style=suse |
|---|
| 777 |
else |
|---|
| 778 |
echo $"Can not determine packagemanagement style" >&2 |
|---|
| 779 |
return 1 |
|---|
| 780 |
fi |
|---|
| 781 |
|
|---|
| 782 |
eval $2=\$style |
|---|
| 783 |
return 0 |
|---|
| 784 |
} |
|---|
| 785 |
|
|---|
| 786 |
|
|---|
| 787 |
|
|---|
| 788 |
|
|---|
| 789 |
|
|---|
| 790 |
|
|---|
| 791 |
function pkgmgmt.isInternal |
|---|
| 792 |
{ |
|---|
| 793 |
local cfgdir=$($_VSERVER_INFO "$1" APPDIR pkgmgmt) || : |
|---|
| 794 |
|
|---|
| 795 |
test -z "$cfgdir" -o ! -d "$cfgdir" -o -e "$cfgdir"/internal |
|---|
| 796 |
} |
|---|
| 797 |
|
|---|
| 798 |
|
|---|
| 799 |
function pkgmgmt.isAptAvailable |
|---|
| 800 |
{ |
|---|
| 801 |
local cfgdir="$1" |
|---|
| 802 |
local vdir="$2" |
|---|
| 803 |
local is_internal="$3" |
|---|
| 804 |
|
|---|
| 805 |
local have_apt i |
|---|
| 806 |
if test -n "$is_internal"; then |
|---|
| 807 |
have_apt=1 |
|---|
| 808 |
test -d "$cfgdir"/base/apt -o -d "$cfgdir"/aptetc || have_apt= |
|---|
| 809 |
else |
|---|
| 810 |
have_apt= |
|---|
| 811 |
for i in /bin /usr/bin /usr/local/bin; do |
|---|
| 812 |
test ! -x "$vdir$i"/apt-get || { have_apt=1; break; } |
|---|
| 813 |
done |
|---|
| 814 |
fi |
|---|
| 815 |
|
|---|
| 816 |
test -n "$have_apt" && return 0 || return 1 |
|---|
| 817 |
} |
|---|
| 818 |
|
|---|
| 819 |
|
|---|
| 820 |
function pkgmgmt.isYumAvailable |
|---|
| 821 |
{ |
|---|
| 822 |
local cfgdir="$1" |
|---|
| 823 |
local vdir="$2" |
|---|
| 824 |
local is_internal="$3" |
|---|
| 825 |
|
|---|
| 826 |
local have_yum i |
|---|
| 827 |
if test -n "$is_internal"; then |
|---|
| 828 |
have_yum=1 |
|---|
| 829 |
test -d "$cfgdir"/base/yum -o -d "$cfgdir"/yumetc || have_yum= |
|---|
| 830 |
else |
|---|
| 831 |
have_yum= |
|---|
| 832 |
for i in /bin /usr/bin /usr/local/bin; do |
|---|
| 833 |
test ! -x "$vdir$i"/yum || { have_yum=1; break; } |
|---|
| 834 |
done |
|---|
| 835 |
fi |
|---|
| 836 |
|
|---|
| 837 |
test -n "$have_yum" && return 0 || return 1 |
|---|
| 838 |
} |
|---|
| 839 |
|
|---|
| 840 |
|
|---|
| 841 |
function vshelper.doSanityCheck |
|---|
| 842 |
{ |
|---|
| 843 |
local vshelper this_xid i |
|---|
| 844 |
declare -a warnings=() |
|---|
| 845 |
local solution_disable= |
|---|
| 846 |
local solution_sysctl= |
|---|
| 847 |
|
|---|
| 848 |
vshelper.isEnabled && vshelper.isEnabled warning || return 0 |
|---|
| 849 |
|
|---|
| 850 |
this_xid=$($_VSERVER_INFO - XID) || |
|---|
| 851 |
panic $"Failed to determine current context; aborting..." |
|---|
| 852 |
|
|---|
| 853 |
|
|---|
| 854 |
test "$this_xid" = 0 || return 0 |
|---|
| 855 |
|
|---|
| 856 |
local proc_file=/proc/sys/kernel/vshelper |
|---|
| 857 |
|
|---|
| 858 |
if ! test -r "$proc_file"; then |
|---|
| 859 |
vshelper= |
|---|
| 860 |
warnings=( "${warnings[@]}" |
|---|
| 861 |
$"File '$proc_file' does not exist but is required for vshelper setup" ) |
|---|
| 862 |
solution_disable=1 |
|---|
| 863 |
else |
|---|
| 864 |
vshelper=$(cat "$proc_file") |
|---|
| 865 |
|
|---|
| 866 |
$_CMP -s "$vshelper" "$_VSHELPER" || { |
|---|
| 867 |
local readable="" |
|---|
| 868 |
test -r "$vshelper" && readable=1 |
|---|
| 869 |
warnings=( "${warnings[@]}" |
|---|
| 870 |
$"The configured vshelper '$vshelper' does not match the 'vshelper' |
|---|
| 871 |
script of the util-vserver package.${readable:+ Maybe you have two versions installed?}" |
|---|
| 872 |
) |
|---|
| 873 |
solution_disable=1 |
|---|
| 874 |
solution_sysctl=1 |
|---|
| 875 |
} |
|---|
| 876 |
fi |
|---|
| 877 |
|
|---|
| 878 |
test -d "$__VSHELPERSTATEDIR" || { |
|---|
| 879 |
warnings=( "${warnings[@]}" |
|---|
| 880 |
$"\ |
|---|
| 881 |
The vshelper state-directory '$__VSHELPERSTATEDIR' does not exist; since |
|---|
| 882 |
it is created by 'make install', this indicates a serious problem with |
|---|
| 883 |
your util-vserver installation" ) |
|---|
| 884 |
solution_disable=1 |
|---|
| 885 |
} |
|---|
| 886 |
|
|---|
| 887 |
test "${#warnings[@]}" -eq 0 || { |
|---|
| 888 |
warning $"\ |
|---|
| 889 |
The following problem(s) were encountered while verifying vshelper |
|---|
| 890 |
functionality:" |
|---|
| 891 |
|
|---|
| 892 |
for i in "${warnings[@]}"; do |
|---|
| 893 |
warning "* $i" |
|---|
| 894 |
done |
|---|
| 895 |
|
|---|
| 896 |
warning $"\ |
|---|
| 897 |
|
|---|
| 898 |
To fix this, you can:" |
|---|
| 899 |
|
|---|
| 900 |
test -z "$solution_disable" || warning $"\ |
|---|
| 901 |
* disable vshelper entirely by executing |
|---|
| 902 |
| touch \"$__CONFDIR/.defaults/apps/vshelper/disabled\" |
|---|
| 903 |
* disable only this message by executing |
|---|
| 904 |
| touch \"$__CONFDIR/.defaults/apps/vshelper/warning-disabled\"" |
|---|
| 905 |
|
|---|
| 906 |
test -x "$solution_sysctl" || warning $"\ |
|---|
| 907 |
* configure the util-vserver vshelper script, e.g. by adding |
|---|
| 908 |
| kernel.vshelper = $_VSHELPER |
|---|
| 909 |
to /etc/sysctl.conf and rebooting the machine, or by executing |
|---|
| 910 |
| echo \"$_VSHELPER\" >$proc_file" |
|---|
| 911 |
|
|---|
| 912 |
warning "" |
|---|
| 913 |
|
|---|
| 914 |
return 1 |
|---|
| 915 |
} |
|---|
| 916 |
|
|---|
| 917 |
return 0 |
|---|
| 918 |
} |
|---|
| 919 |
|
|---|
| 920 |
|
|---|
| 921 |
function vshelper.isEnabled |
|---|
| 922 |
{ |
|---|
| 923 |
local f=${1:+$1-}disabled |
|---|
| 924 |
test ! -e "$__CONFDIR"/.defaults/apps/vshelper/"$f" || return 1 |
|---|
| 925 |
$_VSERVER_INFO - FEATURE vshelper || return 1 |
|---|
| 926 |
if test -n "$2"; then |
|---|
| 927 |
local appdir |
|---|
| 928 |
appdir=$($_VSERVER_INFO "$2" APPDIR vshelper) || return 0 |
|---|
| 929 |
test -z "$2" -o ! -e "$appdir/$f" || return 1 |
|---|
| 930 |
fi |
|---|
| 931 |
|
|---|
| 932 |
return 0 |
|---|
| 933 |
} |
|---|
| 934 |
|
|---|
| 935 |
|
|---|
| 936 |
function vshelper.isDebug |
|---|
| 937 |
{ |
|---|
| 938 |
test ! -e "$__CONFDIR"/.defaults/apps/vshelper/debug || return 0 |
|---|
| 939 |
$_VSERVER_INFO - FEATURE vshelper || return 1 |
|---|
| 940 |
if test -n "$1"; then |
|---|
| 941 |
local appdir |
|---|
| 942 |
appdir=$($_VSERVER_INFO "$1" APPDIR vshelper) || return 1 |
|---|
| 943 |
|---|