Mac OS X Server v10.4.11:ソフトウェア・アップデート・サーバでクライアントへのアップデート提供が停止する
現象
Mac OS X Server v10.4.11 がインストールされているソフトウェア・アップデート・サーバでは、一部のアップデートパッケージ (Security Update 2009-002 を含む) が適切に表示されない場合やダウンロードできない場合があります。この場合、このサーバにアクセスしたクライアントでは、アップデートを表示またはインストールできないことがあります。
この影響を受けたパッケージは、「サーバ管理」に一般名 (通常は数字のみの名前) で表示されたり、リストになにも表示されなかったりします。
対象製品
Mac OS X Server 10.4
解決方法
この問題を回避するには 2 つの方法があります。1 つめはクライアント側の設定を変更し、2つめはサーバ側の設定を変更します。以下の解決法は、いずれか一方のみを行ってください。
解決法 1:Mac OS X クライアントを再設定する
Mac OS X Server によって設定を管理 (MCX) されていない Mac OS X クライアントは、アップルの一般用ソフトウェア・アップデート・サーバからアップデートを利用できるように設定します。この設定を変更するには、「ターミナル」で以下のコマンドを入力します。
sudo defaults delete /Library/Preferences/com.apple.SoftwareUpdate CatalogURL
ソフトウェア・アップデートの環境設定が管理 (MCX) されているワークステーションでは、管理者がその設定を無効にして、アップルの一般用ソフトウェア・アップデート・サーバからアップデートを利用できるようにします。管理者は、ローカルネットワークにソフトウェア・アップデート・サービスを提供する Mac OS X Server 10.4.11 システムに対して、次の解決法を実行することもできます。
解決法 2:Mac OS X Server v10.4.11 にスクリプトをインストールする
この解決法では、スクリプトが実行されて「swu-update」という名前の launchd 項目がインストールされます。これにより、ダウンロードされた予期しない形式のアップデートが自動的に検出されて変更されます。また、予期しない形式のパッケージがすでにある場合は、そのパッケージも変更されます。このスクリプトは、2 回以上実行する必要はありません。このスクリプトは、組織内でソフトウェア・アップデート・サービスを実行している各 Mac OS X v10.4.11 Server 上で実行する必要があります。このスクリプトは、ソフトウェア・アップデート・サービスによってアップルから新しいアップデートがダウンロードされるたびに自動的に実行され、必要に応じてその新しいアップデートが変更されます。
- こちらのガイドライン を参考にして、「swu-modify.sh」という名前のファイルをデスクトップに新規作成し、「テキストエディット」を使って以下のスクリプトをコピーしてペーストします。「---START SCRIPT---」から「---END SCRIPT---」までのテキストがすべてスクリプトです。
- これを、「swu_modify.sh」という名前の標準テキストファイルとして保存します。
- 保存後に「ターミナル」を開き、このスクリプトを保存したフォルダに移動します。
- 以下のターミナルコマンドを実行します。
sudo bash swu_modify.sh
注意:存在するダウンロードの数、サーバに対する負荷、利用可能なシステムリソースによっては、初めてスクリプトを実行した際に完了まで 15 分以上かかる場合もありますが、これを異常終了させないでください。その際、ファイルの作成完了までに launchd からメッセージが出力されますが、これは正常な動作です。処理が完了した後は、サーバ上の system.log ファイル内に以下のようなエントリが作成されます。
Jun 22 16:17:46 saffron swu-update: job 26384 loaded
Jun 22 16:17:58 saffron swu-update: job execution started
Jun 22 16:17:58 saffron swu-update: finding distribution files
Jun 22 16:18:43 saffron swu-update: found 237 files to modify
Jun 22 16:18:43 saffron swu-update: software update service paused.
Jun 22 16:18:43 saffron swu-update: modifying distribution files
Jun 22 16:20:29 saffron swu-update: modified 237 distribution files
Jun 22 16:20:29 saffron swu-update: regenerating update list
Jun 22 16:22:16 saffron swu-update: unpausing software update service.
Jun 22 16:23:05 saffron swu-update: software update service is RUNNING
Jun 22 16:24:55 saffron launchd: com.apple.applecareengineering.tigerswupdate: open("/etc/swupd/.sync_done", O_EVTONLY): No such file or directory
Jun 22 16:24:55 saffron launchd: launchd.c:810:9: kevent_mod(j->vnodes[i], EVFILT_VNODE, EV_ADD|EV_CLEAR, NOTE_WRITE|NOTE_EXTEND|NOTE_DELETE|NOTE_RENAME|NOTE_REVOKE|NOTE_ATTRIB|NOTE_LINK, 0, &j->kqjob_callback) != -1
Jun 22 16:24:24 saffron launchd: launchd.c:757:9: kevent_mod(j->vnodes[i], EVFILT_VNODE, EV_DELETE, 0, 0, NULL) != -1
注意:スクリプトの処理が完了する前に中断された場合は、「-unlock」パラメータを使ってスクリプトを実行しない限り、再度実行することができなくなります。スクリプトのロックを解除するには、「ターミナル」で以下のコマンドを実行します。
sudo /usr/local/bin/swu-update-finished -unlock
---START SCRIPT---#!/usr/bin/env bash ---END SCRIPT---
# swu-update-finished
# Copyright 2009 Apple, Inc. All rights reserved.
function writelaunchditem() {
/bin/cat - > /Library/LaunchDaemons/com.apple.applecareengineering.tigerswupdate.plist << 'END_OF_LAUNCHD_ITEM'
END_OF_LAUNCHD_ITEM
}
function writedistfiles() {
/bin/cat - > /tmp/swu-unzip-distfiles << 'END_OF_DISTFILES'
#!/usr/bin/env bash
# swu-unzip-distfiles
# Copyright 2009 Apple, Inc. All rights reserved.
DISTFILE="$1"
/usr/bin/file "$DISTFILE" | grep gzip 2>&1 >> /dev/null
COMPRESSED=$?
if [ $COMPRESSED -eq 0 ]; then
/bin/mv "$DISTFILE" "$DISTFILE.gz"
/usr/bin/gzip -dc "$DISTFILE.gz" > "$DISTFILE"
/bin/rm -f "$DISTFILE.gz"
echo "$DISTFILE was decompressed"
fi
END_OF_DISTFILES
}
function runfirst() {
if [ ! -f /tmp/swu-unzip-distfiles ]; then
/usr/bin/touch /tmp/swu-unzip-distfiles
/bin/chmod 0700 /tmp/swu-unzip-distfiles
writedistfiles
/bin/chmod 0500 /tmp/swu-unzip-distfiles
fi
if [ ! -f /usr/local/bin/swu-update-finished ]; then
if [ ! -d /usr/local/bin ]; then
mkdir -m 0775 -p /usr/local/bin
fi
/bin/cp "$0" /usr/local/bin/swu-update-finished
/bin/chmod 0550 /usr/local/bin/swu-update-finished
fi
if [ ! -f /Library/LaunchDaemons/com.apple.applecareengineering.tigerswupdate.plist ]; then
/usr/bin/touch /Library/LaunchDaemons/com.apple.applecareengineering.tigerswupdate.plist
/bin/chmod 644 /Library/LaunchDaemons/com.apple.applecareengineering.tigerswupdate.plist
writelaunchditem
/bin/launchctl load /Library/LaunchDaemons/com.apple.applecareengineering.tigerswupdate.plist
fi
}
function logmsg() { /usr/bin/logger -t swu-update "$*"; }
function lockme() { echo "LOCK_PID=$*" > /private/tmp/.swu-update-locked; }
function unlock() { /bin/rm -f /private/tmp/.swu-update-locked; }
function verifylock() {
unset LOCK_PID
if [ -f /private/tmp/.swu-update-locked ]; then
source /private/tmp/.swu-update-locked
if [ $LOCK_PID -eq $1 ]; then
return 1
else
return 0
fi
fi
return 0
}
SWUPD_LOCK="/private/tmp/.swu-update-locked"
SWUPD_BASE="/private/etc/swupd/"
SWUPD_SYNC_PROG=".sync_in_progress"
SWUPD_SYNC_DONE=".sync_done"
SWUPD_PID=$$
if [ "$1" == "-unlock" ]; then
unlock
exit 0
fi
logmsg "job $SWUPD_PID loaded"
#sleep for launchd
/bin/sleep 12
_sw_vers=`/usr/bin/sw_vers -productVersion`
if [ "$_sw_vers" != "10.4.11" ]; then
logmsg "You must be at 10.4.11 to use $0"
fi
if [ "$USER" != "root" -a $UID -ne 0 ]; then
logmsg "not run as root. Exiting."
exit 0
fi
runfirst
if [ -e "$SWUPD_LOCK" ]; then
logmsg "lock file already exists, exiting."
logmsg "you may need to run $0 -unlock."
exit 0
fi
lockme $SWUPD_PID
verifylock $SWUPD_PID
_verify=$?
if [ $_verify -eq 0 ]; then
logmsg "we do not own the lock file, exiting."
exit 0
fi
unset _verify
logmsg "job execution started"
if [ $PPID -ne 1 ]
then
echo "Use the Console to review the system.log for status messages."
fi
while [ -f "$SWUPD_BASE$SWUPD_SYNC_PROG" ]
do
sleep 15 #seconds
done
logmsg "finding distribution files"
COMPDIST_COUNT=`(/usr/bin/find /usr/share/swupd/html -name \*.dist -exec file {} \;) | /usr/bin/grep gzip | /usr/bin/wc -l | sed -e 's/ //g'`
if [ $COMPDIST_COUNT -eq 0 ]; then
logmsg "no files to change, exiting."
unlock
exit 0
fi
logmsg "found $COMPDIST_COUNT files to modify"
/usr/sbin/swupdctl stop
/usr/bin/killall swupd_syncd
logmsg "software update service paused."
logmsg "modifying distribution files"
DECOMP_COUNT=`(/usr/bin/find /usr/share/swupd/html -name \*.dist -exec /tmp/swu-unzip-distfiles {} \;) | wc -l`
logmsg "changed $DECOMP_COUNT distribution files"
logmsg "regenerating update list"
/usr/bin/find /usr/share/swupd/html -exec /usr/bin/touch {} \;
/bin/sleep 15
/usr/sbin/swupd_syncd -gen
/bin/sleep 15
/usr/sbin/swupd_syncd -check
logmsg "unpausing software update service."
/usr/sbin/swupdctl start
STATUS=`/usr/sbin/serveradmin status swupdate | /usr/bin/awk '{print $3}' | /usr/bin/sed -e s/\"//g `
logmsg "software update service is $STATUS"
/bin/sleep 300 #sleep 5 minutes before unlocking
unlock
This document will be updated as more information becomes available.