Назад | Перейти на главную страницу

Почему slapconfig -backupdb не создает образ диска при запуске из cron на Snow Leopard Server?

Несколько лет назад я собрал следующие expect скрипт для выполнения резервного копирования Open Directory под Tiger Server, и он также хорошо работает под Leopard Server:

#!/usr/bin/expect -f

set date [timestamp -format "%Y-%m-%d"]
set archive_path "path/to/you/backup/dir"
set archive_password "password"
set archive_name "opendirectory_backup"

spawn /usr/sbin/slapconfig -backupdb $archive_path/$archive_name-$date
expect "Enter archive password"
send "$archive_password\r"
expect eof

Это один из немногих скриптов, который до сих пор живет в crontab root, а не имеет launchd лист. Это rwx от root только из очевидных соображений безопасности.

Теперь проблема в том, что я обновил свой Open Directory Master до Mac OS X 10.6.4 Snow Leopard Server пару недель назад, и с тех пор он не работал ... когда запускался cron. Если я вхожу в систему как пользователь root и запускаю его вручную, он работает правильно и создает результирующий зашифрованный образ диска. При запуске cron он выполняет полные движения (включая вывод в /Library/Logs/slapconfig.log что соответствует тому, когда он запускается вручную), но файл образа диска никогда не создается. Однако в `/var/log/system.log/ я вижу следующий вывод:

Jul 23 03:00:08 servername hdiejectd[93114]: running
Jul 23 03:00:11 servername diskimages-helper[93111]: -frameworkCallbackWithDictionary: threw exception calling home.
Jul 23 03:00:11 servername diskimages-helper[93111]: threw exception reporting results back to framework.
Jul 23 03:00:21 servername hdiejectd[93114]: quitCheck: calling exit(0)

При запуске вручную этот вывод будет следующим (нет diskimages-helper исключения):

Jul 23 14:29:27 servername hdiejectd[7776]: running
Jul 23 14:29:40 servername hdiejectd[7776]: quitCheck: calling exit(0)

В обоих случаях пользователь не вошел в систему через графический интерфейс. У меня есть пара друзей, которые запускают один и тот же скрипт на своих OD Masters, и он также больше не запускается через cron после обновления до Snow Leopard Server.

Я вспоминаю некоторые проблемы с инструментами создания образа диска в командной строке Mac OS X, которые требовали доступа к связке ключей, но не помню подробностей. Что-то связанное с этим стало более строгим в Snow Leopard Server?

Есть идеи или предложения?

У меня возникла та же проблема, что и при отладке исходного скрипта, для меня тайм-аут ожидания по умолчанию в 10 секунд приводил к прерыванию встроенной команды hdiutil. Я исправил это, добавив:

установить тайм-аут 120

В сценарии ожидания. Теперь скрипт снова работает нормально. Мой сценарий:

#!/usr/bin/expect -f

set date [timestamp -format "%Y-%m-%d"]
set archive_path "path/to/you/backup/dir"
set archive_password "password"
set archive_name "opendirectory_backup"
set timeout 120

spawn /usr/sbin/slapconfig -backupdb $archive_path/$archive_name-$date
expect "Enter archive password"
send "$archive_password\r"
expect eof

Хорошо, теперь у меня есть рабочее решение. Я начал с написания нового bash скрипт (в отличие от использования expect) который обернул вокруг Apple serveradmin утилита (сама по себе является оболочкой вокруг slapconfig -backupdb Я звонил прямо из в expect сценарий):

#!/bin/bash

dst="/path/to/your/backup/directory"
pass="password"

host=$(hostname)
date=$(date +%Y-%m-%d-%H%M)

serveradmin command <<-EOC
    dirserv:backupArchiveParams:archivePassword = $pass
    dirserv:backupArchiveParams:archivePath = ${dst}/od_backup-${host}-${date}
    dirserv:command = backupArchive

EOC

Это основано на этот сценарий, но использует bash "здесь документ" вместо создания файла на диске, содержащего serveradmin команды (включая пароль в виде открытого текста) для выполнения.

Он отлично работал и при запуске из командной строки, но все равно нет .sparseimage был создан при запуске из cron. Итак, вторым этапом моего исправления было, как я упоминал выше в комментариях к моему исходному вопросу, создать launchd plist для его запуска:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC -//Apple Computer//DTD PLIST 1.0//EN http://www.apple.com/DTDs/PropertyList-1.0.dtd >
<plist version="1.0">
    <dict>
        <key>Label</key>
        <string>tld.domain.od_backup</string>
        <key>ProgramArguments</key>
        <array>
            <string>/var/root/sbin/od_backup</string>
        </array>
        <key>StartCalendarInterval</key>
        <dict>
            <key>Hour</key>
            <integer>2</integer>
            <key>Minute</key>
            <integer>30</integer>
        </dict>
    </dict>
</plist>

Естественно загрузил plist сsudo launchctl load /Library/LaunchDaemons/tld.domain.od_backup.plist (домен и tld изменены для защиты личности). И, похоже, он работает правильно, когда вызывается launchd. Исходный сценарий также мог работать правильно, если был вызван launchd, но я не тестировал.