# 09.01.2022
# Утилита сообщает версии системной сборки АЦК-Финансы и ее подсистем - отчеты, СОФИТ, ЕИС - в указанной пользователем папке.
# Принцип утилиты строится на том, что в каждой сборке АЦК-Финансы есть определенные jar-файлы (символизирующие системную сборку и ее подсистемы), содержащие определенные properties-файлы, в которых есть переменные "version.major", "version.minor", "version.release", "version.build" с информацией о полном номере версии (патча).
import sys, os, zipfile, webbrowser
# Список проверяемых jar-файлов и properties-файлов:
check_list = [
# АЦК-Финансы:
{"jar": "server/AzkServer.jar", "properties": "com/bssys/version.properties", "encoding": "windows-1251"}
,{"jar": "server/AzkRepKernel.jar", "properties": "com/bssys/azkserver/reports/repversion.properties", "encoding": "windows-1251"}
,{"jar": "server/AzkSofit.jar", "properties": "com/bssys/azkserver/sofit/sofitversion.properties", "encoding": "windows-1251"}
,{"jar": "server/eis.jar", "properties": "azk/eis/version.properties", "encoding": "windows-1251"}
# АЦК-Госзаказ:
,{"jar": "server/ordersrv.jar", "properties": "com/bssys/version.properties", "encoding": "unicode_escape"}
]
# Папка сборки АЦК, которую пользователь указал в командной строке при запуске утилиты:
azkdir = ''
if len(sys.argv) == 2: azkdir = sys.argv[1]
tmp_env_dir = os.environ['TEMP']
tmpdir = os.path.join(tmp_env_dir, 'showme_nums_temp')
outputfile = os.path.join(tmp_env_dir, 'showme_nums_output.txt')
outputfile_write = open(outputfile,'w')
ss_out = sys.stdout
sys.stdout = outputfile_write
if len(azkdir) > 0 and os.path.isdir(azkdir):
print(os.path.abspath(azkdir))
for jarfile in check_list:
product_name = ''
version_major = ''
version_minor = ''
version_release = ''
version_build = ''
# jarpath - полный путь к jar-файлу из check_list:
jarpath = os.path.join(azkdir, jarfile["jar"])
if os.path.isfile(jarpath) and zipfile.is_zipfile(jarpath):
# Извлекаем properties-файлы из jar-файла:
zipfile.ZipFile(jarpath).extract(jarfile["properties"], path=tmpdir)
# print(tmpdir + check_list[jarfile])
tmpjarfile = os.path.join(tmpdir, jarfile["properties"])
tmpjarfile_read = open(tmpjarfile, mode="r", encoding=jarfile["encoding"])
for tmpjarfile_line in tmpjarfile_read:
# Убираем лишний символ переноса в конце строки jar-файла:
tmpjarfile_line = tmpjarfile_line.replace('\n','')
# Делим строку по символу "=":
tmpjarfile_split = tmpjarfile_line.split('=')
if tmpjarfile_split[0] == 'product.name':
product_name = tmpjarfile_split[1]
if tmpjarfile_split[0] == 'version.major':
version_major = tmpjarfile_split[1]
if tmpjarfile_split[0] == 'version.minor':
version_minor = tmpjarfile_split[1]
if tmpjarfile_split[0] == 'version.release':
version_release = tmpjarfile_split[1]
if tmpjarfile_split[0] == 'version.build':
version_build = tmpjarfile_split[1]
if len(product_name) > 0:
print(f'{product_name}: {version_major}.{version_minor}.{version_release}.{version_build}')
elif len(azkdir) > 0 and not os.path.isdir(azkdir):
print(f"Указана несуществующая папка сборки АЦК: {azkdir}")
else:
print(f"Утилиту \"{os.path.basename(__file__)}\" нужно запускать с указанием папки сборки АЦК, в формате:\n{os.path.basename(__file__)} <папка сборки АЦК>\n\nПример:\n{os.path.basename(__file__)} azkfin2.54.0.500_ORA_21001_AMUR")
outputfile_write.close()
sys.stdout = ss_out
#input("\nНажмите клавишу \"Enter\" для закрытия окна...")
#Открыть файл с результатом в ассоциированном приложении:
webbrowser.open(outputfile)