«БОЛЬШИЕ» технологии для малого и среднего бизнеса

Program Starter & Updater

Данная весьма компактная программа-стартер позволяет обновлять компоненты и настройки программы из определенной папки (сетевой и локальной), а затем запустить ее. Все необходимые настройки стартера производятся в ini-файлах, один из которых основной, а остальные могут использоваться для описания некоторых индивидуальных параметров. Программа является 32-разрядной и консольной. Протестировано на MS Windows 95OSR2, 98SE, NT4 SP6, 2000 SP2, XP SP3, Vista SP1, 7; Linux Wine 1.x.

СОДЕРЖАНИЕ

Принцип работы

У вас сетевая программа, с которой работают одновременно несколько десятков пользователей. Как лучше установить ее и обновлять? Существует несколько решений:

  1. Установить вашу программу на сетевой диск и сделать его доступным всем. При этом остается проблема обновления ключей реестра, да и саму программу можно обновлять только при условии, когда никто с ней не работает (это зависит от ОС на сервере).
  2. Установить вашу программу на Windows Terminal Server. При этом пользователи для работы с программой должны запустить Terminal Client и выполняют программу непосредственно на сервере, гоняя по сети только экраны. Решение достаточно производительное, но требует усиления сервера (рекомендуется для 1C). Впрочем, в этом варианте присутствуют все проблемы обновления из предыдущего. Еще один минус заключается в приобретении терминальных лицензий на Windows.
  3. Установить вашу программу на локальный диск. При этом запуск программы наиболее быстрый, сервер менее нагружается. Но ее обновление - головная боль администратора. Можно использовать обычные командные файлы (bat), но возможности команд Windows (особенно 9x) удручают. Можно использовать наборы утилит командной строки, портированные из Unix, но с ними еще нужно разбираться, да и к тому же Unix не знает про реестр, BDE и прочее. Поэтому была задумана небольшая программа для обновления и последующего запуска программы.

Windows не позволяет изменять файлы или программы «на лету», то есть когда они используются или выполняются. Как тогда обновить выполняемый модуль или библиотеку в сети с большим количеством пользователей?

Суть нашего решения в следующем: В ярлыке вашей программы необходимо указать не саму программу, а программу-стартер с одним параметром - файлом настройки (ini-файлом). В этом файле указывается, что и откуда обновлять, какую программу запустить после всех действий. На сервере создается каталог, в котором должны находиться файлы последней версии Вашей программы и стартера. При запуске стартера он сначала обновляет сам себя и файлы настройки, а затем производит действия согласно файлу настройки. После этого запускает основную программу. Если каталог обновления не найден или произошли ошибки, то запуск программы не производится.

В итоге не нужно заставлять пользователей выходить из программы (или дожидаться конца рабочего дня), чтобы выложить новую версию какой-либо библиотеки. Достаточно выложить новый файл на сервер. При следующем запуске вашей программы этот файл будет скопирован на рабочую станцию пользователя.

Возможности

Стартер является консольным приложением, написанным на Object Pascal (Turbo Delphi) c использованием API Windows, что позволило сделать его очень компактным (порядка 100К без сжатия). Консоль позволяет легко выделять фрагменты текста, запускать в ней подряд несколько консольных приложений, останавливать процесс нажатием кнопки Pause и т.д.

Стартер позволяет добавлять (вставлять), изменять (обновлять) и удалять

  • папки (только создание и удаление);
  • файлы;
  • разделы и параметры системного реестра;
  • секции и параметры в ini-файлах;
  • псевдонимы (алиасы) баз данных BDE;
  • строки в текстовых файлах (только вставка).

Папки: Можно создавать и удалять папки любого уровня вложенности.

Файлы: Файлы можно обновлять на любом диске и в любом доступном каталоге. Допускается использование масок (символов * и ?) в именах. При указании каталога можно использовать предопределенные константы (%windir%, %winsysdir% и др.). Источник обновления файлов (последние версии файлов) - один каталог, указываемый в файле настройки. Считается, что обновление необходимо, если у файла-источника и существующего локального файла не совпадают или размер, или версия, или время последнего изменения. По умолчанию проверяется размер и время изменения, но с помощью флагов можно отключить эти проверки.

Разделы и параметры реестра: Можно производить действия как с отдельными параметрами, так и с целыми разделами, если не указывать у раздела параметры.

Секции и параметры в ini-файлах: Можно производить действия только с параметрами, но не с целыми секциями.

Псевдонимы (алиасы) баз данных BDE: Требуется установленный BDE. BDE инициализируется только при необходимости.

Строки в текстовых файлах: Эта возможность сделана для вставки в некоторые системные файлы (например, services) необходимых строк. Для этого текстовый файл читается построчно и начальные символы строк проверяются с некоторой подстрокой. Если такая строка найдена, то ничего не делается. Если не найдена, то в конец файла вставляется нужная строка.

Файл настройки стартера может быть разбит на несколько, которые будут обрабатываться последовательно. В каждом можно настраивать порядок выполнения действий (например, добавлять-обновлять-удалять или добавлять-удалять-обновлять). Можно настраивать другой состав действий для отдельных компьютеров.

В случае успешной работы стартера создается пустой файл-флаг с именем основного ini-файла и расширением .ok.

Настройка

Настройка производится описанием списка необходимых действий в ini-файле. В нем должна присутствовать одна обязательная секция (Options) и ряд необязательных, отвечающих за определенное действие (Insert, Update и Delete). Внутри каждой из трех последних секций описываются списки, соответственно, вставляемых, обновляемых и удаляемых файлов, параметров реестра и ini-файлов и т.д.. Если секция называется <действие>.MyComputer, то она будет выполнена только на компьютере с именем MyComputer. Смотри как пример файл psstart.ini. Строки-комментарии должны начинаться с символа «;».

Состав параметров секций Примечание: далее под символами # и ## понимаются порядковые номера параметров. Нумерация должна начинаться с 1 и не должна содержать пропусков номеров.
Например:
File1=...
File2=...
File3=...
Reg1Val1Name=...
Reg1Val2Name=...
Reg2Val1Name=...

Все параметры - необязательные, если специально не указано обратное.

[Constants]
В этой секции можно определить свои константы. В их значениях можно использовать другие константы. Ответственность за зацикливание (взаимное использование констант) лежит на вас.

В качестве источника можно использовать значения из реестра или ini-файлов.
Формат:
реестр: <Reg>ключ;имя_параметра;значение_по_умолчанию</Reg>
ini-файл:
<Ini>имя_файла;имя_секции;имя_параметра;значение_по_умолчанию</Ini>
Примеры:

myvar = My Name
compdir = %pfdir%\company
progdir = %compdir%\program
dbxconf = <Reg>HKCU\Software\Borland\DBExpress;Connection Registry
File;%dbxdir%\dbxconnections.ini</Reg>
ibVendorLib = <Ini>%cfdir%\Borland Shared\DBExpress\dbxdrivers.ini;Interbase;VendorLib;gds32.dll</Ini>

[Options]
WinHeader - заголовок окна (по умолчанию - Program Starter) [только в основном ini-файле]
Pause - пауза перед выполнением каждого действия (для отладки), мс (по умолчанию - без паузы) [только в основном файле]
SelfPause - пауза перед обновлением самого стартера, мс (по умолчанию - 500) [только в основном ini-файле]
Settings - файл, из которого в самом начале загружаются константы для использования в основном файле. Предполагается, что в этом файле должны находиться индивидуальные настройки. [только в основном ini-файле]
SourcePath - источник файлов для обновления (по умолчанию - рабочий каталог) [только в основном ini-файле]
Language - расширение файла локализации стартера (.rus — русский). Файл с именем стартера и данным расширением (например, psstart.rus) будет обновляться автоматически из SourcePath. (по умолчанию - без локализации (English)) [только в основном ini-файле]
Run - имя программы для запуска, допускаются параметры (по умолчанию - никакая программа не запускается) [только в основном ini-файле]
RunFlags - флаги. Можно указывать списком с любым разделителем.
Доступные флаги:
wine — выполнять в wine. Без этого флага в wine не работает, потому что иначе окно стартера после запуска останется открытым.
Примеры:

Run = myprog.exe
Run = cmd.exe /c mybat.cmd

Include# - дополнительные файлы настройки Эти файлы выполняются раньше основного и обновляются автоматически.

SectionOrder - порядок выполнения действий, по первым буквам: Insert, Update, Delete.
Примеры:
DIU - Delete, потом Insert и Update;
UI - только Update и Insert.
Каждый дополнительный файл настройки использует свой SectionOrder. (по умолчанию — IUD).

[Insert] / [Update] / [Delete] Секции, непосредственно описывающие действия.

ItemOrder - порядок выполнения действия, по первым буквам: Directories, Files, Registry keys, Ini files, BDE aliases, Text files, OLE Servers.
Пример:
DFIR - каталоги, файлы, ini-файлы, затем реестр.
Внимание! Необходимо учитывать, что каталоги с файлами не удаляются, а файлы не добавляются в несуществующий каталог. Раздел реестра с подразделами также не удаляется. (по умолчанию - Insert - FDRIBTS, Update - FDRIBS, Delete - FDRIBS).

Dir# - имя каталога, может включать предопределенные константы.
Dir#RenameTo - новое имя, в которое нужно переименовать каталог из Dir#. [только секция Update]

File# - [путь]имя файла, может включать предопределенные константы и символы маски в имени файла. Путь - куда запишется файл (Insert,Update) или откуда удалится (Delete).
File#RenameTo — новое имя, в которое нужно переименовать файл из File#. Если этот параметр указан, то файл из File# не обновляется. Маски не поддерживаются. [только секция Update]
Пример:

[Update]
; обновление всех файлов с расширением .ini в каталоге Windows из каталога, указанного в параметре SourcePath
File1 = %windir%\*.ini
; переименование файла oldfile.ext в newfile.ext
File2 = %windir%\oldfile.ext
File2RenameTo = %windir%\newfile.ext

File#Flags - флаги. Можно указывать списком с любым разделителем.
Доступные флаги:
not_check_size - не сравнивать размер;
not_check_datetime - не сравнивать время изменения;
check_version - сравнивать версию (например, *.exe);
keep_newest - выбрать более новый файл;
until_reboot - если не удается обновить или удалить файл, то сделать это при перезагрузке Windows;
9x_only - выполнять только на платформе Windows 9x;
nt_only - выполнять только на платформе Windows NT;

Пример:

File1Flags = not_check_size keep_newest 9x_only

Reg# - полное имя раздела реестра, должен начинаться с имени корневого раздела HKEY_xxxx или HKxx.
Синонимы корневых разделов:
HKEY_CLASSES_ROOT == HKCR
HKEY_CURRENT_USER == HKCU
HKEY_LOCAL_MACHINE == HKLM
HKEY_USERS == HKUS
HKEY_PERFORMANCE_DATA == HKPD
HKEY_CURRENT_CONFIG == HKCC
HKEY_DYN_DATA == HKDD

Примеры:

Reg2 = HKEY_CURRENT_USER\Software\Polaris\Test
Reg2 = HKCU\Software\Polaris\Test

 

Reg#Val##Name - имя параметра. Если равно %default%, то это соответствует параметру по умолчанию для всего раздела.
Reg#Val##Value - значение параметра, может содержать конструкции вида \NNN, которые преобразуются в символ с кодом NNN (для непечатных символов). [кроме секции Delete]
Например, \9 означает <Tab>, \32 означает <Пробел>, \48 означает 0.
Reg#Val##Type - тип параметра. [кроме секции Delete] (I - целое число, S - строка (по умолчанию), остальные - двоичный).

 

Ini# - [путь]имя ini-файла, может включать предопределенные константы.
Ini#Val##Section- имя секции параметра.
Ini#Val##Name - имя параметра.
Ini#Val##Value - значение параметра, см. Reg#Val##Value. [кроме секции Delete]

BDEAlias# - имя псевдонима (алиаса) базы данных BDE.
BDEAlias#Params - <имя драйвера>;<параметры в формате BDE>. [кроме секции Delete]
Например, BDEAlias2Params = INTRBASE;SERVER NAME:test.fdb;USER NAME: SYSDBA

Text# - [путь]имя файла, может включать предопределенные константы. [только секция Insert]
Text#Str##Prefix - начальные символы строки, по ним происходит поиск строки в файле.
Text#Str##Full - строка, которая вставляется в файл в случае не нахождения строки, начинающейся с Text#Str##Prefix. См. Reg#Val##Value

Прeдопределенные константы:

%bootdir%

загрузочный каталог

%windir%

каталог, где установлен Windows

%winsysdir%

системный подкаталог Windows (System для Win9x, System32 для WinNT,2k,XP,...)

%etcdir%

каталог, где находятся файлы services, hosts и пр.

%tempdir%

каталог для временных файлов

%pfdir%

каталог %bootdir%:\Program Files

%cfdir%

каталог %bootdir%:\Program Files\Common Files

%mediadir%

каталог %windir%\Media

%srcdir%

каталог-источник файлов

В этот список добавляются все константы из секции Constants основного и дополнительных файлов настройки.

Также можно использовать любые переменные окружения. Например, %TEMP%.

Использование

Запуск: [путь]psstart.exe <ini-файл>

Файлы psstart.exe и основной файл настройки <ini-файл> должны находиться в одном каталоге (путь).

В случае ошибки возвращаются следующие коды завершения:

0 - успешное завершение;
1 - неверные параметры запуска;
2 - ошибка при выполнении.

Лицензия

Данная программа поставляется с исходными текстами и распространяется под лицензией GNU General Public License (GPL) версии 3 или выше. Полный ее текст смотрите в файлах gpl.txt и gplrus.txt.

История изменений

Условные обозначения:

+ - добавлено # - изменено - - удалено * - исправлено
[N.M.L] - версия, в которой появилась ошибка
[XXXXMMMM #NNNN] - идентификатор задачи, NNNN - ID, XXXXMMMM - код

08.12.14  1.5.0.4

  1. # Добавлен манифест Windows. [PSST0038 #4339]

05.12.13  1.5.0.3

  1. * После запуска программы из Run курсор теперь переходит на следующую строку. [PSST0027 #140]
  2. * В программу из Run теперь можно передавать параметры. [PSST0029 #141]
  3. * Теперь различие во времени изменения файлов проверяется точно.
  4. + Добавлен флаг для разрешения запуска программы из Run в wine (в RunFlags). [PSST0037 #3926]
  5. + Создание пустого файла-флага успешного завершения процесса обновления с именем <ini-файл без расширения>.ok. [PSST0032 #1326]
  6. * В некоторых случаях показывался абсолютный путь к файлам вместо указанного в ini-файле. [PSST0023 #138]
  7. + Возможность переименовывать файлы и папки (параметры Dir#RenameTo и File#RenameTo). [PSST0007 #131]
  8. + Действие Регистрация OLE-сервера. [PSST0030 #981]

27.08.08  1.4.0.2

  1. # Если не указана Ini#Val##Section, то берется секция предыдущего ini-параметра.

15.08.08  1.3.0.1

  1. # Запуск приложений через WinExec заменен на CreateProcess.
  2. * Не возвращался код завершения 2 в случае ошибки запуска приложения из параметра Run. А также при ошибке перезапуска стартера.

14.08.08  1.2.1.8

  1. * Не прерывалась работа программы в случае ошибки открытия файла из Text#.

08.08.08  1.2.1.7

  1. * Не показывается алиас баз данных BDE в протоколе при его добавлении, если он уже есть, и при удалении, если его уже нет.
  2. * BDE инициализируется и деактивируется один раз.
  3. # Если значение параметра в ini-файле пустое, то оно не обновляется, если Ini#Val##Value тоже пустое.

30.07.08  1.2.1.5

  1. * Конвертирование констант в File#Flags не работало.

20.03.08  1.2.1.4

  1. * Не вычитывались константы из основного файла перед его обновлением.
  2. * Неверно определялась необходимость обновления числовых параметров реестра.

17.03.08  1.2.1.2

  1. * Не обновлялся файл, если на локальном диске его не было.

16.03.08  1.2.1.1

  1. + Параметры Include# обрабатываются теперь не только в основном файле.
  2. + Параметр File#Flags для более гибкой настройки обновления.
  3. # Немного изменен вывод строк.

12.03.08  1.2.0.4

  1. * Заголовок формы менялся не сразу.
  2. # Константы применяются теперь во всех параметрах секции Options.

03.03.08  1.2.0.3

  1. + Конвертирование констант в Include#.
  2. * [OK] светился сразу после "...", когда начинался скроллинг.
  3. # Если Reg# начинается не с имени корневого раздела, то считается, что он HKEY_CURRENT_USER.
  4. * Ключ реестра сразу открывался на запись, даже если изменения не вносились.
  5. # В Linux Wine теперь не работает параметр Run.
  6. + Параметр Settings в секцию Options основного файла настройки.
  7. + В качестве источника значения константы может использоваться значение из реестра или ini-файла.
  8. * Если SourcePath не существует, то основной ini-файл не обновляется.
  9. * Если BDE не установлен, то отображалась неверная ошибка.

13.11.07  1.1.1.4

  1. * Не применялись константы-переменные окружения в параметре SourcePath.

07.03.07  1.1.1.3

  1. * Не находились файлы с именами с национальными буквами.
  2. # После нажатия клавиши на фразе "Нажмите любую клавишу" выполняется переход на следующую строку.

05.09.06  1.1.1.1

  1. * Не конвертировались константы в именах псевдонима (алиаса) базы данных BDE (параметр BDEAlias#).
  2. * Не переопределялись константы.
  3. # В некоторых сообщениях об ошибках добавлены имена файлов и папок.
  4. * При отсутствии текстового файла, в который нужно добавить строку, выдавался неверный код ошибки.
  5. * При отсутствии в реестре параметра mediadir возникала ошибка.

12.11.04  1.1.0.3

  1. * Не обновлялся файл настройки второй раз при изменении SourcePath после его первого обновления (когда меняется местоположение файлов обновления).
  2. # Введены умолчания для SectionOrder (IUD), а также для ItemOrder (для каждого типа действия разные).
  3. + Значительно расширен набор констант. Добавлена секция Constants для описания собственных констант.
  4. # В случае ошибки теперь можно нажимать любую клавишу для продолжения, а не только Enter.
  5. * При вставке строки в текстовый файл иногда добавлялась еще и пустая строка.
  6. # В значениях всех параметров ini-файлов можно использовать константы.
  7. # Файлы, указанные в Include, обновляются только в текущий каталог (если указать путь, то он проигнорируется).

29.01.02  1.0.0.12

  1. * Не на всех компьютерах обновлялся стартер с первого раза.

25.01.02  1.0.0.10

  1. + Корневые разделы реестра можно указывать в кратком виде (HKCR, HKCU, HKLM, HKUS, HKPD, HKCC, HKDD).
  2. * Не обновлялись файлы, указанные в Include#, начиная со второго.
  3. * При ошибке обновления доп. файла настройки дальнейшее обновление не производится.

05.11.01  1.0.0.8

  1. + Первая официальная версия. Реализованы все основные возможности.

Версии

Официальная версияДатаРазмерСсылкиСтатус
1.510.12.14116.68 КБдля Windows