Инсталлятор обновлений АвтоПарк

Инсталлятор ASU.exe предназначен для исполнения обновлений АвтоПарк как в открытом, так и в запакованном виде.

Обновление в открытом виде - это просто набор файлов; часть из них имеет специальное значение, о чем будет сказано ниже. Обновление в запакованном виде - это самораспаковывающийся архив, подготовленный при помощи WinZip Self-Extractor, снабженный цифровой подписью и имеющий расширение ".ASU". Расширение ".ASU" регистрируется сетевым инсталлятором АвтоПарк и считается "безопасным вложением", при открытии файлов с таким расширением по умолчанию запускается ASU.exe c ключом -RunAs.

Запакованное обновление выполняется следующим образом. По открытию ASU-файла запускается установленный у клиента ASU.exe c ключом -RunAs. Он проверяет цифровую подпись как файла обновления, так и собственного исполняемого файла ASU.exe, а затем позволяет выбрать, от имени какого пользователя выполнить обновление. Далее от имени выбранного пользователя запускается автоэкстрактор самораспаковывающегося архива, который извлекает исходные файлы обновления во временную папку в профиле пользователя и вновь запускает ASU.exe - на сей раз для выполнения распакованного обновления.

Цифровая подпись запакованного обновления играет двойную роль.

  1. Дает гарантию безопасности пользователя. ASU-файл - это исполняемый файл, при передаче через Интернет он может быть испорчен или заражен вирусами. Перед запуском ASU-файла установленный у пользователя инсталлятор обновлений ASU.exe проверит цифровую подпись; если она не соответствует содержимому, инсталлятор не позволит выполнить обновление.
  2. Некоторые почтовые программы (например Outlook Express) при попытке открытия файла из окна сообщения показывают издателя файла, т.е. автора цифровой подписи. Пользователь видит, что издатель обновления - "Polak IT", а не подозрительный "неизвестный издатель".

Начиная с версии 1.18 перед выполнением обновления от имени другого пользователя под Windows Vista и выше инсталлятор обновлений проверяет, не находится ли ASU-файл обновления в профиле текущего пользователя. Если ASU-файл находится в профиле, инсталлятор предложит скопировать его в папку "$(ReceiveRoot)\" (см. ниже) и выполнить обновление на копии, поскольку другой пользователь может не иметь прав чтения в профиле текущего пользователя.

Начиная с версии 1.21 под Windows Vista и выше инсталлятор обновлений проверяет, не находится ли ASU-файл обновления в кэше защищенного режима Internet Explorer (так будет, если обновление открывается из браузера). Запускать автоэкстрактор непосредственно из кэша защищенного режима IE нельзя, иначе процесс будет создан с низким уровнем доступа, т.е. без прав записи. Поэтому когда ASU-файл находится в кэше защищенного режима IE, инсталлятор обновлений копирует его в папку $(ReceiveRoot) и запускает оттуда.

Синтаксис командной строки ASU.exe

ASU.exe {<Ключи>}

Допустимы ключи:

Коды завершения ASU.exe:

Специальные файлы обновления

Некоторые файлы обновления являются специальными, инсталлятор обновлений ASU.exe знает их имена, формат, использует их предопределенным образом при выполнении обновления.

Файл инструкции Readme.txt

Представляет собой обязательный текстовый файл в кодировке OEM 866. В инструкции должно быть указано следующее.

  1. Назначение обновления.
  2. Что нужно сделать перед выполнением обновления (если нужно).
  3. Какой учетной записью следует выполнять обновление.
  4. Что необходимо сделать после выполнения обновления (если нужно).

Поскольку инструкция дублируется в тексте e-mail сообщения, ASU.exe никак не использует этот файл и не проверяет его наличие. Поведение может быть изменено.

Файл предупреждения от автора обновления Warning.txt

Необязательный текстовый файл в кодировке OEM 866. Если среди исходных файлов обновления присутствует файл Warning.txt, перед выполнением скрипта обновления пользователь получит сообщение с текстом из Warning.txt и кнопками "OK" и "Отмена". Обычно таким образом дублируется некий особо важный пункт инструкции, который необходимо выполнить перед запуском обновления.

Файл регистрационной информации обновления Reg_card.ini

Представляет собой INI-файл (в кодировке ANSI 1251, как и все INI-файлы). Для инсталлятора обновлений имеют значение только перечисленные ниже параметры из секции "Autopark Software Upgrade".

  1. _CLI_ - имя проекта (до 256 символов).
  2. _CHN_ - имя канала обновлений (2 символа).
  3. _PRV_ - номер (5 десятичных цифр) предыдущего обновления в канале.
  4. _CUR_ - номер (5 десятичных цифр) данного обновления в канале.
  5. _PRJ_ - числовой параметр, задает режим работы с множественными проектами и номер части проекта для тех же множественных проектов. Если параметр имеет пустое значение или вовсе отсутствует, предполагается, что все части множественного проекта используют общие программные файлы (ASL, FRM, MNU, WDO, XLA, ...). Физически перечисленные файлы располагаются внутри клиентской части основного проекта. Если же параметр _PRJ_ определен и не пуст, предполагается, что каждая часть множественного проекта имеет собственную копию программных файлов. Когда параметр имеет значение "0", обновление предназначено для одинарного проекта; значения "1", "2", ..., "10" предполагают множественный проект и задают часть, для которой будет выполнено обновление.
  6. _ASB_ - флаг обновления ASB. Значение "1" является признаком обновления ASB.
  7. _RBC_ - флаг сравнения DBD и DBP-файлов перед выполнением обновления. Начиная с версии 1.16 параметр игнорируется, сравнение не производится. До версии 1.16 значение "1" включало сравнение.

Файл скрипта обновления AsuScrpt.aus

Скрипт обновления AsuScrpt.aus - текстовый файл в кодировке OEM 866; каждая команда скрипта располагается на отдельной строке. Допускаются пустые строки. Строки, начинающиеся со слова Rem, считаются комментариями и игнорируются.

Команды скрипта имеют фиксированное количество параметров. Параметры отделяются от команды и друг от друга пробелами. Текст параметра можно заключить в кавычки. Если текст параметра содержит пробелы, кавычки обязательны. Имена команд и макросов распознаются регистронезависимо. В тексте параметров допускается применение предопределенных макросов, например:

UpdFile $(ClientProjectRoot)\ASL\TEST.ASL TEST.ASL

В процессе исполнения обновления текущей является папка исходных файлов обновления.

Форматы команд и полный список макросов приведены ниже.

Форматы команд

Команда Параметры команды
Имя Описание Мнемоника Описание
AddFile Добавить новый файл DestinationFilePath Путь к целевому файлу
SourceFilePath Путь к исходному файлу
UpdFile Обновить существующий файл DestinationFilePath Путь к целевому файлу
SourceFilePath Путь к исходному файлу
DelFile Удалить существующий файл DestinationFilePath Путь к целевому файлу
RemFile Удалить файл. Если не существует, вопросов не задавать. Команда появилась в ASU.exe версии 1.21 DestinationFilePath Путь к целевому файлу
SetINI Прописать параметр в INI-файл DestinationFilePath Путь к INI-файлу
Section Имя секции INI-файла. Не должно содержать кириллицы
ParamName Имя параметра INI-файла. Не должно содержать кириллицы
ParamValue Значение параметра INI-файла
ValueCodePage Кодовая страница значений параметров INI-файла: "1251" или "866".
DelINI Удалить параметр в INI-файле DestinationFilePath Путь к INI-файлу
Section Секция INI-файла
ParamName Параметр INI-файла
Rebuild Выполнить перестройку структуры БД по образцу. Команда появилась в ASU.exe версии 1.14. Обязана быть первой командой в скрипте. Требует версии клиента ASB не ниже 14.43.5 SourceFilePath Путь к файлу образца

Имя целевого и исходного файлов в командах AddFile и UpdFile не обязано совпадать и этим фактом можно пользоваться. Известно, например, что автоэкстрактор WinZipSE не позволяет использовать кириллические имена файлов архива, для таких файлов можно выполнить транслитерацию.

Макросы периода выполнения

Имя макроса Описание Источник значения
$(_CHN_) Имя канала (2 символа) Параметр _CHN_ секции "Autopark Software Upgrade" в регистрационном файле обновления reg_card.ini
$(_CLI_) Имя проекта (до 256 символов). Макрос определен в том числе и для обновлений, отправленных по широковещательному каналу, для которых параметр _CLI_ обычно не задается Параметр _CLI_ секции "Autopark Software Upgrade" в регистрационном файле обновления reg_card.ini
$(_PRV_) Номер (5 десятичных цифр) предыдущего автоматического обновления в канале Параметр _PRV_ секции "Autopark Software Upgrade" в регистрационном файле обновления reg_card.ini
$(_CUR_) Номер (5 десятичных цифр) данного автоматического обновления в канале Параметр _CUR_ секции "Autopark Software Upgrade" в регистрационном файле обновления reg_card.ini
$(_PRJ_) Номер проекта для поддержки множественных проектов:
"" - у всех проектов общие программные файлы,
"0" - единственный проект,
"1" - основной проект,
"2" - второй (дополнительный) проект,
"3" - третий (дополнительный) проект и т.д. до 10 проектов
Параметр _PRJ_ секции "Autopark Software Upgrade" в регистрационном файле обновления reg_card.ini
$(_ASB_) Значение "1" определяет данное обновление как обновление ASB Параметр _ASB_ секции "Autopark Software Upgrade" в регистрационном файле обновления reg_card.ini
$(_RBC_) До версии 1.16 значение "1" включало сравнение DBP и DBD перед выполнением обновления. Начиная с версии 1.16 игнорируется, сравнение не выполняется. Параметр _RBC_ секции "Autopark Software Upgrade" в регистрационном файле обновления reg_card.ini
$(ClientProjectRoot) Корневая папка клиентской части проекта. Значение зависит от $(_PRJ_).
Может употребляться с явным префиксом: $(MainProject.ClientProjectRoot),
$(Project2.ClientProjectRoot),
$(Project3.ClientProjectRoot) и т.д.
  • Путь к RED-файлу основного проекта задается параметром ключа командной строки -ClientRedFile, а в отсутствие такового (например, для запакованного обновления) - параметром ClientRedFile из ветви реестра "HKLM\Software\Polak IT\AutoPark" (прописывается сетевым инсталлятором АвтоПарка). В "домашнем" режиме параметр реестра не используется.
  • Папка дополнительного проекта задается параметрами ClientProject2Root, ClientProject3Root и т.д. секции "ASB Special Folders" RED-файла клиентской части основного проекта
$(ServerProjectRoot) Корневая папка серверной части проекта. Значение зависит от $(_PRJ_).
Может употребляться с явным префиксом: $(MainProject.ServerProjectRoot),
$(Project2.ServerProjectRoot),
$(Project3.ServerProjectRoot) и т.д.
Используется только для выполнения Rebuild в "домашнем" режиме
  • Папка основного проекта задается параметром ServerProjectRoot секции "ASB Special Folders" RED-файла клиентской части основного проекта.
  • Папка дополнительного проекта задается параметром ServerProjectRoot секции "ASB Special Folders" RED-файла клиентской части соответствующего дополнительного проекта
$(ClientASBRoot) Корневая папка клиентской части ASB. Используется только в обновлениях ASB Параметр ClientASBRoot секции "ASB Special Folders" RED-файла клиентской части основного проекта
$(ServerASBRoot) Корневая папка серверной части ASB. Используется только в обновлениях ASB Параметр ServerASBRoot секции "ASB Special Folders" RED-файла клиентской части основного проекта
$(ApSrvASBRoot) Корневая папка сервера приложений ASB. Поддерживается, начиная с версии 1.20. Используется только в обновлениях ASB Параметр ApSrvASBRoot секции "ASB Special Folders" RED-файла клиентской части основного проекта
$(ReceiveRoot) Папка для распаковки и хранения файлов обновления Параметр ReceiveRoot секции "ASB Special Folders" RED-файла клиентской части основного проекта
$(APDocsRoot) Папка документации по системе АвтоПарк. После перемещения документации на сайт перестала использоваться Параметр APDocsRoot секции "ASB Special Folders" RED-файла клиентской части основного проекта
$(SaveRoot) Папка для сохранения прежних версий обновляемых файлов Параметр SaveRoot секции "ASB Special Folders" RED-файла клиентской части основного проекта. По умолчанию имеет значение "$(ClientProjectRoot)\SAVE"
$(WindowsDir) Папка Windows (обычно c:\windows) Параметр операционной системы
$(SystemDir) Системная папка Windows (c:\windows\system32 для 2000/XP/2003/Vista/2008/7) Параметр операционной системы
$(TempDir) Папка для временных файлов в профиле пользователя Параметр операционной системы
$(Quote) Двойная кавычка Константа
$(DollarLParent) Доллар и левая круглая скобка: "$(" Константа
$(ThreadID) Уникальный идентификатор текущей нити (8 шестнадцатиричных цифр) Параметр операционной системы
$(ProcessID) Уникальный идентификатор текущего процесса (8 шестнадцатиричных цифр) Параметр операционной системы

Как видно из таблицы, от номера проекта $(_PRJ_) зависят значения только двух папок: $(ClientProjectRoot) и $(ServerProjectRoot). Соответственно, только эти макросы и могут употребляться с префиксом проекта. Все остальные путевые макросы определяются из RED-файла основного проекта.

Порядок выполнения обновления

  1. Считывание регистрационной информации обновления из файла "Reg_card.ini".
  2. Определение папок проекта(ов).
  3. Открытие для записи протокола выполнения обновлений.
    Протокол выполнения обновлений ведется в файле "$(MainProject.ClientProjectRoot)\Def\Upgrade.log". Защита от параллельного выполнения обновлений осуществляется на режиме открытия файла протокола.
  4. Сравнение исполняемого файла ASU.exe с образцовым "$(ClientASBRoot)\ASU.EXE".
    Если ASU.exe запущен не из папки исходных файлов обновления (т.е. собственно ASU.exe не обновляется), размер и время модификации исполняемого файла сравнивается с размером и временем модификации файла, находящегося в папке "$(ClientASBRoot)\ASU.EXE".
  5. Считывание и трансляция скрипта обновления AsuScrpt.aus.
    На данном этапе в частности выполняется замена макросов в параметрах команд скрипта на реальные значения. Если не определен макрос ApSrvASBRoot (папка сервера приложений ASB), содержащие его команды будут проигнорированы (будут считаться комментариями). Если не определен любой другой макрос, пользователь получит соответствующее сообщение, а обновление выполняться не будет. Сервер приложений ASB используется далеко не у всех клиентов, отсюда неоднотипное поведение.
  6. Проверка порядка исполнения обновлений.
    Обновления должны выполняться в том порядке, в каком они были отправлены. Каждое обновление после успешного завершения оставляет файл-маркер "$(MainProject.ClientProjectRoot)\Def\$(_CHN_)_$(_CUR_).upd". Соответственно, каждое обновление перед выполнением проверяет наличие файла-маркера предыдущего обновления "$(MainProject.ClientProjectRoot)\Def\$(_CHN_)_$(_PRV_).upd". Начиная с версии 1.21, если маркер предыдущего обновления отсутствует, разыскивается существующий маркер. Если номер существующего маркера больше номера текущего обновления, предполагается, что текущее обновление уже выполнено.
  7. Генерация файла-маркера текущего обновления "$(_CHN_)_$(_CUR_).upd".
    Файл-маркер не обязан присутствовать среди исходных файлов обновления. Он в любом случае будет создан автоматически в текущей папке (т.е. в папке исходных файлов обновления).
  8. Предупреждение от автора обновления.
    Если среди файлов обновления присутствует файл Warning.txt, пользователь получит сообщение с текстом из Warning.txt и кнопками "OK" и "Отмена". Обычно таким образом дублируется некий особо важный пункт инструкции, который необходимо выполнить перед запуском обновления. Предупреждение отображается в том числе и в "домашнем" режиме.
  9. Встроенные (автоматические) предупреждения.
    В обновлении, содержащем команду Rebuild, пользователь получит предупреждение о преобразовании структуры данных. В обновлении ASB - требование прекращения работы всех пользователей в АвтоПарке и, возможно, требование останова служб "ASB Server" и/или "ASB Application Server". Под Windows 2000/XP/2003/Vista/2008/7 при необходимости службы будут остановлены автоматически.
  10. Проверка доступности файлов, участвующих в данном обновлении.
    На этой стадии все добавляемые, обновляемые и удаляемые файлы последовательно открываются для записи. Если не удается открыть файл, отображается предупреждение с вариантами "Повторить"/"Отменить". Т.о. минимизируется риск неполного выполнения обновления из-за недоступности файлов. Начиная с версии 1.18 для занятых исполняемых файлов (.ael, .dll, .exe, .ocx, .olb) предлагается еще один вариант помимо перечисленных: переименовать и удалить занятый файл. В версии 1.21 были приняты меры для предотвращения выполнения обновления без подачи сигнала сброса кэша программ. Чтобы проверить подключение к серверу, выполняется утилита USR. В случае неудачи обновление выполняться не будет.
  11. Копирование файлов обновления в папку "$(ReceiveRoot)\$(_CHN_)_$(_CUR_)\".
  12. Определение папки для сохранения прежних версий обновляемых файлов.
    По умолчанию принимается папка "$(SaveRoot)\$(_CHN_)_$(_CUR_)". Если эта папка не пуста, принимается подпапка с именем, сформированным из текущего времени: "$(SaveRoot)\$(_CHN_)_$(_CUR_)\YYNNDDHH.MMS".
  13. Выполнение скрипта обновления.
    Особенности выполнения скрипта.
  14. Регистрация успешного выполнения обновления.
    В папку "$(MainProject.ClientProjectRoot)\Def" помещается файл-маркер "$(_CHN_)_$(_CUR_).upd". После выполнения данного действия обновление считается успешно выполненным. Затем удаляется файл-маркер предыдущего обновления "$(_CHN_)_$(_PRV_).upd".
  15. Сигнал сброса кэша программ (NPM).
    Если обновлением были затронуты ASL, MNU или WDO-файлы, подается сигнал NPM, чтобы пользователи перечитали программные файлы. В домашнем режиме операция пропускается. Фактически запускается клиент ASB с ключом -NPM на скрытой консоли с перехваченным стандартным выводом. В режиме общих программных файлов для множественных проектов клиент ASB запускается n раз по числу проектов. Если первой командой обновления была команда Rebuild, на подключение к проекту может быть затрачено значительное время из-за загруженности ASB-сервера переиндексацией. Начиная с версии 1.21, если сигнал сброса кэша программ подать не удалось, администратор получит сообщение, а в протокол upgrade.log будет прописано предупреждение.
  16. Только для обновлений ASB: запуск остановленных ранее служб ASB и разрешение входить в АвтоПарк всем пользователям.
  17. Ожидание нажатия кнопки OK.
    По умолчанию в домашнем режиме ожидание ограничено двумя секундами, после чего ASU.exe завершается. В нормальном режиме ожидание неограничено. Поведение при ожидании может быть изменено ключом командной строки -WaitOkTime.