Проблема обновления файлов приложения
В последние годы наметилась тенденция к применению в архитектурах информационных систем WEB-технологий с использованием на рабочих местах пользователей веб-браузеров в качестве тонких клиентов. Однако в некоторых отраслях по различным причинам продолжают использоваться архитектуры с толстыми клиентами. И если в сфере WEB-технологий уже выработаны и укоренились приёмы автоматизации обновления компонентов программных систем, которые большей частью находятся на серверах, то в архитектурах с толстыми клиентами обновление программного обеспечения на рабочих местах пользователей по-прежнему может требовать значительного внимания обслуживающего персонала.
При внешней простоте процедуры обновления, которая зачастую состоит в замене одних файлов другими, её автоматизация не всегда является тривиальной задачей. В отличие от веб-серверов, которые работают в круглосуточном режиме и постоянно доступны техническим специалистам, рабочие места пользователей «оживают» в начале рабочего дня и «исчезают с радаров» по окончании рабочего времени. Рабочее место может неделю пустовать, пока пользователь находится в командировке или на больничном. Не все файлы можно заменить в то время, пока пользователь работает в приложении. Некоторые удалённые рабочие места подключены к центральному узлу нестабильными или медленными каналами связи. Нередко поступают такие обновления, которые требуется обязательно установить после завершения одного рабочего дня и до начала следующего.
Решение для автоматизации
Поставщики программных систем с толстыми клиентами не всегда предлагают собственные решения для поддержания компонентов АРМ в актуальном состоянии. Для демонстрации возможного подхода к автоматизации процесса обновления файлов программного обеспечения, предназначенного для работы в интерактивном режиме, была разработана программа File Update Tool (далее - FUT), которая при запуске с рабочего места пользователя выполняет следующие действия (см. рисунок).
Загрузка необходимого файла с обновлением с сервера на компьютер пользователя.
Распаковка файла с обновлением во временную папку.
Копирование обновлённых файлов в папку программной системы.
В случае успешного выполнения обновления запускается обновлённое приложение.

Таким образом, программа FUT использует pull-технологию для получения обновлений и производит их установку непосредственно перед запуском приложения АРМ. В процессе своей работы программа FUT отображает на экране окно с информацией о ходе обновления, а по завершении записывает в журнальный файл сведения о произведенных операциях и их результатах.
Особенности функционирования
Обновления, подлежащие установке, отбираются программой FUT по наличию в именах их файлов фрагмента ММДД, соответствующего месяцу (ММ) и числу месяца (ДД) того дня, когда она была запущена. Если подходящий фрагмент имеется в нескольких файлах, то их обработка производится в лексикографическом порядке. Если в папке с обновлениями будут обнаружены обновления с датами раньше «сегодняшней», но позже последнего установленного обновления, то они будут обработаны в первую очередь.
Если на сервере имеются обновления, установка которых запланирована в будущем, программа FUT только загрузит их на компьютер пользователя, но не станет устанавливать. Это даёт возможность при наступлении соответствующей даты произвести установку в автономном режиме, даже если сервер будет недоступен. В то же время, если до наступления даты обновления программа FUT обнаружит, что загруженные обновления на сервере удалены, она удалит их и с компьютера пользователя.
Нетрудно заметить, что в фрагменте даты ММДД отсутствует год. Как же программа FUT решает, к какому периоду — прошлому или будущему — принадлежит файл с обновлением? Даты остатка текущего месяца и следующих за ним трёх месяцев считаются «будущим», а даты начала текущего месяца и предшествующих ему восьми месяцев — «прошлым». Например, если сегодня на календаре 10 ноября, то остаток ноября, декабрь, январь и февраль являются для программы FUT «будущим», а начало месяца по 9 ноября включительно и месяцы с марта по сентябрь — «прошлым».
Такой взгляд на календарь приводит к естественным ограничениям. Во-первых, нельзя планировать установку обновлений в будущем дальше, чем на квартал. Во-вторых, необходимо очищать эталонную папку с обновлениями от устаревших файлов, которые в противном случае через восемь месяцев попадут в поле зрения программы FUT как запланированные на установку. Очевидно, что эти ограничения не являются препятствием к эксплуатации программы FUT.
Установка, настройка и запуск
Установка программы FUT на рабочем месте пользователя включает в себя три шага:
Размещение исполняемого файла на носителе, доступном с рабочего места пользователя.
Создание файла инициализации с настройками программы.
Создание файла состояния системы с информацией о «точке начала отсчёта».
Исполняемый файл программы FUT может быть просто записан на диск компьютера пользователя, или он может быть размещён на доступном пользователю сетевом устройстве. При настройке запуска программы FUT с помощью ярлыка или командного файла следует учитывать, что в качестве точки отсчёта относительных путей в файловой системе будет принята текущая папка, действующая в момент запуска, а не папка с исполняемым файлом.
В командной строке программы FUT требуется указать единственный параметр — путь к файлу инициализации (INI-файлу), который содержит следующие настройки.
Общая секция:
Language — язык интерфейса пользователя (английский en или русский ru),
Station — идентификатор рабочего места пользователя, который назначается администратором для того, чтобы понимать, о каком рабочем месте идёт речь в журнале работы программы или при обращении пользователя с сообщением о проблеме,
UpdFileMask — маска файлов с обновлениями, которая обязательно должна содержать фрагмент ####, указывающий местоположение даты в формате ММДД.
Секция Commands:
Unpack — командная строка для распаковки файлов с обновлениями,
-
RunApp — командная строка для запуска приложения после успешной установки обновления.
В командных строках путь к исполняемому файлу отделяется от командной строки символом крышка — ^.
Секция Files:
State — путь к файлу с информацией о состоянии обновляемой программной системы,
Journal — путь к файлу журнала работы программы FUT.
Секция Folders:
Source — путь к папке, которая содержит эталонные файлы с обновлениями. По замыслу, эта папка находится на сервере, и доступ к ней предоставляется по чтению для всех пользовательских рабочих мест. Остальные папки, о которых речь пойдёт ниже, находятся на локальных носителях рабочих станций, и программа FUT должна иметь к ним полный доступ.
Cache — путь к папке, в которую копируются файл с обновлениями из эталонной папки,
Temp — путь к папке для временных файлов, в неё осуществляется распаковка обновлений,
Target — путь к папке с файлами обновляемой программной системы.
Секция Debug:
TodayMMDD — значение даты в формате ММДД, которое имеет приоритет над календарём часов компьютера и используется для отладки и проверки работы программы в различных ситуациях.
Файл c информацией о состоянии обновляемой программной системы (настройка State в секции Files) должен быть создан вручную при установке программы FUT. В нём должна быть записана строка с именем файла последнего установленного обновления, например:
LastUpdateFileName=upd1109b.7z
Все файлы «до» этого имени считаются обработанными, а «после» — подлежащими установке.
Если в настройках программы FUT указать пустое значение в качестве пути к папке Source, то программа FUT будет работать с обновлениями, находящимися в папке CACHE, в автономном режиме. При этом предполагается, что задача доставки обновлений в папку CACHE будет решена другими средствами.
Технические требования и условия поставки
Исполняемый файл программы FUT является самодостаточным и не требует для своей работы дополнительных компонентов. Работа программы FUT проверялась в среде 32-разрядных операционных систем Windows NT 4.0 и Windows 10.
Программа FUT является свободным программным обеспечением и распространяется по лицензии GPLv3. Её исходные тексты и сценарий сборки могут быть получены из репозитория на GitHub.
Тестовая среда
Для быстрого ознакомления с работой программы был подготовлен zip-архив с тестовой средой. В состав тестовой среды, размещённой в папке FUT05B, входят:
runme.bat — команда запуска программы FUT,
state.txt — файл с информацией о состоянии обновляемой программной системы,
Updates - эталонная папка с файлами обновлений (Source),
Cache — папка для локального хранения обновлений,
Temp — папка для временных файлов,
Enterprise Information System - папка обновляемой программной системы (Target),
Enterprise Information System\eis.exe — исполняемый файл для имитации запуска программной системы,
BIN\fut.exe - исполняемый файл программы FUT версии 0.5b,
BIN\fut.ini - файл инициализации программы FUT с установкой ММДД на 10-е ноября,
BIN\7zdec.exe - распаковщик 7Z-архивов из пакета LZMA SDK версии 25.01.
После извлечения папки FUT05B из архива можно изменить в INI-файле язык интерфейса с en на ru, запустить runme.bat и увидеть имитацию процесса обновления программной системы в действии. Выполненные программой FUT операции будут записаны в журнал FUT05B\journal.txt.
Теперь можно отключить (закомментировать или удалить) в секции DEBUG INI-файла настройку TodayMMDD, снова запустить программу FUT и посмотреть, как она отработает с текущей календарной датой.
Для лучшего понимания работы программы FUT желательно контролировать, как изменяется содержимое файла состояния обновляемой системы FUT05B\state.txt. Полезно попробовать установить значение последнего обработанного файла на upd1110a.7z, запустить программу FUT и, после завершения её работы ещё раз изучить содержимое журнала.
Заключение
Как уже было отмечено в начале статьи, программа FUT была разработана для демонстрации возможного подхода к автоматизации обновления файлов, входящих в состав интерактивных программных систем на рабочих местах пользователей. Она не проходила обкатки в условиях промышленной эксплуатации и может содержать ошибки. Однако её разработка велась с расчётом на практическое использование, и текущее состояние можно оценить как «ранняя бета».