9
pumbaEO
13.11.12
✎
20:00
|
Завалялось
' Настройка
Const Str_Version="1.3.22.1" 'Часть пути где лежит файл обновления без "\" в начале и конце Пример 1.3.22.1 или 1.3.22.1\3.74
'(Посути версия очень удобно при частом обновлении меняется только эта строка)
'Организуется структура папок с версиями
'Например:
'\\Server\UpdateCfg\1.3.19.1
'\\Server\UpdateCfg\1.3.20.1
'\\Server\UpdateCfg\1.3.21.1
'\\Server\UpdateCfg\1.3.22.1
'......
Const b_OnlyUpdate=False 'Если включен то только обновление конфигурации БД. Нужно если конфигурация уже загружена в основную
Const Str_FileToUpdate="1Cv8.cf" ' Имя файла обновления
Const Str_PathUpdate="\\Server\UpdateCfg\" ' Путь к папке где лежать файлы обновлений с "\" в конце Пример:\\Server\UpdateCfg\
Const Str_PathLog="\\Server\LogUpdateCfg\" ' Путь к папке где будут создаваться лог-файлы с "\" в конце Пример:\\Server\LogUpdateCfg\
'Пути к 1С
'Const Str_Path1C="%ProgramFiles(x86)%\1cv82\8.2.14.537\bin\1cv8.exe" ' 64
Const Str_Path1C="%ProgramFiles%\1cv82\8.2.14.537\bin\1cv8.exe" ' 32
'
Const Str_UserAdmin="Gmix" ' Имя пользователя в БД (Должен быть во всех базах)
Const Str_PassAdmin="Pass" ' Пароль пользователя в БД (Должен быть во всех базах)
Const Str_UserAdminCluster="" ' Имя администратора кластера (если есть)
Const Str_PassAdminCluster="" ' Пароль администратора кластера (если есть)
Const Str_CodeEnabelBase="Admin" ' Код разрешения запуска
Const I_DeniedKolMin=6 ' Кол минут до отключения пользователей
Const Str_DeniedMess=" для обновления конфигурации. Закройте программу и следите за сообщениями." 'Сообщение отключения пользователей
Const b_NetSend=True ' Отправлять сообщения о включении БД в домен
Const b_SendMessResult=True ' Выдавать сообщения о результе обновления.
Const Str_DomenNetSend="*" ' домен "*" - текущий
Const Str_OnLineMessage="В базе данных %Str_BaseSTR% можно работать!" 'Сообщение в домен
Public BDArray()
' Список баз для обновления
Const countBase=5 ' Количество Баз Обязательно
ReDim BDArray(countBase-1,4) ' Колонка0-Имя сервера (ОБЯЗАТЕЛЬНО ЗАДАТЬ) Пример: SERVER1C:2041 или SERVER1C
' Колонка1-Имя базы на сервере 1С (ОБЯЗАТЕЛЬНО ЗАДАТЬ) Пример: BD_MyBase1S
' Колонка2-Признак тек действия: (Не заполнять)
' 0 - загрузка основной и отключение пользователей
' 1 - конфигурация загружена
' 2 - пользователи отключены
' 3 - Обновление БД
' 4 - Конфигурация БД обновлена
' 5 - Блокировка сеансов отключена
' 9 - ошибка
' Колонка3-Имя лог файла (Не заполнять)
' Колонка4-Представление базы для вывода в сообщений (ОБЯЗАТЕЛЬНО ЗАДАТЬ) Пример: УПП Оперативный учет
id=0
BDArray(id,0)="SERVER1C" ' Имя Сервера 1С
BDArray(id,1)="BD_MyBase1S_1" ' Имя Базы на сервере 1С
BDArray(id,4)="Оперативный учет" ' Представление базы данных
id=id+1
BDArray(id,0)="SERVER1C:2041"
BDArray(id,1)="BD_MyBase1S_2"
BDArray(id,4)="Бухгалтерский учет"
id=id+1
BDArray(id,0)="SERVER1C"
BDArray(id,1)="BD_MyBase1S_3"
BDArray(id,4)="Бухгалтерский учет 2"
id=id+1
BDArray(id,0)="SERVER1C"
BDArray(id,1)="BD_MyBase1S_4"
BDArray(id,4)="Бухгалтерский учет 3"
id=id+1
BDArray(id,0)="SERVER1C"
BDArray(id,1)="BD_MyBase1S_5"
BDArray(id,4)="Бухгалтерский учет 4"
id=id+1
' ТЕЛО
Public StatusArray(9)
StatusArray(0)="Загрузка основной конфигурации"
StatusArray(1)="Отключение пользователей"
StatusArray(2)="Пользователи отключены"
StatusArray(3)="Обновление конфигурации БД"
StatusArray(4)="Конфигурация БД обновлена"
StatusArray(5)="Блокировка сеансов снята"
StatusArray(6)=""
StatusArray(7)=""
StatusArray(8)=""
StatusArray(9)="Ошибка обновления"
Dim WshShell
set WshShell = CreateObject("wscript.Shell")
Dim fso
Set fso = CreateObject("scripting.filesystemobject")
Dim d_Denied
Dim id
Dim b_Add_Log
b_Add_Log=True
Set obj_FileLogAll= fso.OpenTextFile(Str_PathLog&"_ResultatUpdate.txt",2,True)
If Not b_OnlyUpdate Then
obj_FileLogAll.WriteLine CStr(Now())&" "&"Начало обновления на версию:"&Str_Version&" Количество баз:"&Cstr(countBase)
obj_FileLogAll.WriteLine CStr(Now())&" "&"Загрузка конфигураций из файлов"
' Обновляем основную конфигурацию
For id=0 To countBase-1
UpdateConf(id)
obj_FileLogAll.WriteLine CStr(Now())&" "&BDArray(id,4)&" Статус-"&StatusArray(BDArray(id,2))&"("&BDArray(id,2)&")"
Next
obj_FileLogAll.WriteLine CStr(Now())&" "&"Ожидание загрузки конфигураций из файлов"
' ждем пока во все базы загрузится конфигурация
b_st=False
Do While Not b_st
WScript.Sleep 30000 ' пауза в 30 сек чтобы не гонять лишний раз
b_st=True
id=0
For id=0 To countBase-1
b_prStatus=BDArray(id,2)
StatusUdateConf id, 0
If BDArray(id,2)=0 Then
b_st=False
End If
If BDArray(id,2)<>b_prStatus Then
obj_FileLogAll.WriteLine CStr(Now())&" "&BDArray(id,4)&" Статус-"&StatusArray(BDArray(id,2))&"("&BDArray(id,2)&")"
End If
Next
Loop
Else
For id=0 To countBase-1
Str_Base=BDArray(id,1)
Str_LogFile=Str_PathLog&"Log_"&Str_Base&".txt"
BDArray(id,3)=Str_LogFile
BDArray(id,2)=2
Next
End If
' Отключаем пользователей
d_Denied=DateAdd("n",I_DeniedKolMin,Now())
obj_FileLogAll.WriteLine CStr(Now())&" "&"Отключение пользователей в: "&Cstr(d_Denied)
For id=0 To countBase-1
User_Off_On id, 0
obj_FileLogAll.WriteLine CStr(Now())&" "&BDArray(id,4)&" Статус-"&StatusArray(BDArray(id,2))&"("&BDArray(id,2)&")"
Next
' Ожидание отключения
Do While Now()<d_Denied
WScript.Sleep 60000
Loop
' дадим еще половину минут отключения перед выкидыванием пользователей отключения пользователей
WScript.Sleep ((I_DeniedKolMin/2)+1)*60000
obj_FileLogAll.WriteLine CStr(Now())&" "&"Отключение регламентных заданий и не отключенных пользователей"
' выкидываем пользователей
For id=0 To countBase-1
User_Off_On id,1
If Not BDArray(id,2)=9 Then
obj_FileLogAll.WriteLine CStr(Now())&" "&BDArray(id,4)&" Статус-"&StatusArray(BDArray(id,2))&"("&BDArray(id,2)&")"
End If
Next
obj_FileLogAll.WriteLine CStr(Now())&" "&"Обновление конфигураций БД"
' Обновляем БД
For id=0 To countBase-1
UpdateDB id
If Not BDArray(id,2)=9 Then
obj_FileLogAll.WriteLine CStr(Now())&" "&BDArray(id,4)&" Статус-"&StatusArray(BDArray(id,2))&"("&BDArray(id,2)&")"
End If
Next
' ждем пока все базы обновяться и включим базы
b_st=False
b_err=False
Do While Not b_st
WScript.Sleep 30000 ' пауза в 30 сек чтобы не гонять лишний раз
b_st=True
b_err=False
id=0
For id=0 To countBase-1
b_prStatus=BDArray(id,2)
StatusUdateConf id, 3
If BDArray(id,2)=3 Then
b_st=False
End If
If BDArray(id,2)=9 Then
b_err=True
End If
If BDArray(id,2)<>b_prStatus Then
obj_FileLogAll.WriteLine CStr(Now())&" "&BDArray(id,4)&" Статус-"&StatusArray(BDArray(id,2))&"("&BDArray(id,2)&")"
End If
Next
Loop
If b_err Then
Str_mes="Обновление конфигураций завершено с ошибками смотри логи:"&Str_PathLog
Else
Str_mes="Обновление конфигураций успешно завершено"
End If
obj_FileLogAll.WriteLine CStr(Now())&" "&Str_mes
obj_FileLogAll.Close
If b_SendMessResult Then msgbox Str_mes
' ФУНКЦИИ
' Добавляет сообщение в лог файл
Sub AddLog(id,Str_Message)
If Not b_Add_Log Then Exit Sub
Set obj_FileLog= fso.OpenTextFile(BDArray(id,3),8,True)
obj_FileLog.WriteLine CStr(Now())&" "&Str_Message
obj_FileLog.Close
End Sub
' Обновляет конфигурацию
Sub UpdateConf(id)
Dim Str_Base
Str_Base=BDArray(id,1)
Str_LogFile=Str_PathLog&"Log_"&Str_Base&".txt"
If fso.FileExists(Str_LogFile) Then
fso.DeleteFile Str_LogFile, True
End If
BDArray(id,3)=Str_LogFile
AddLog id,"Обновление основной конфигурации из файла"
' Скопируем файл обновления чтобы не блокировать его разными базами
Str_File_Update=Str_PathUpdate & Str_Version&"\"&Str_FileToUpdate
Str_File_ToUpdate=Str_PathUpdate & Str_Version&"\"&Str_Base&"_"&Str_FileToUpdate
AddLog id,"Копирование файла конфигурации "&Str_File_Update&" -> "&Str_File_ToUpdate
fso.CopyFile Str_File_Update, Str_File_ToUpdate, True
AddLog id,"ОК"
Str_LogFile=Str_PathLog&Str_Base&".log"
If fso.FileExists(Str_LogFile) Then
AddLog id,"Найден файл:"&Str_LogFile&" Удаление"
fso.DeleteFile Str_LogFile, True
AddLog id,"ОК"
End If
Str_LogFile=Str_PathLog&Str_Base&".txt"
If fso.FileExists(Str_LogFile) Then
AddLog id,"Найден файл:"&Str_LogFile&" Удаление"
fso.DeleteFile Str_LogFile, True
AddLog id,"ОК"
End If
Str_ConectionBase="/S"""&BDArray(id,0)&"\"&Str_Base&""""
Srt_infoBaseAuthorization=" /N"""&Str_UserAdmin&""" /P"""&Str_PassAdmin&""" /WA-"
str_command=""""&Str_Path1C&""""&" DESIGNER "& Str_ConectionBase & Srt_infoBaseAuthorization &" /UpdateCfg """&Str_File_ToUpdate&""" /UC"&Str_CodeEnabelBase&" /DisableStartupMessages"&" /DumpResult """&Str_PathLog&Str_Base&".log"""&" /Out """&Str_LogFile&""""
AddLog id,"Запуск конфигуратора для загрузки основной конфигурации из файла:"
AddLog id,"Команда запуска: "&Replace(str_command,"/P"""&Str_PassAdmin&"""","/P""********""")
WshShell.Run str_command
BDArray(id,2)=0
AddLog id,"Состояние БД:"&CStr(BDArray(id,2))
End Sub
' Проверяет обновлена ли конфигурация
Sub StatusUdateConf(id,iType)
Str_Base=BDArray(id,1)
If BDArray(id,2)>iType Then
Exit Sub
End If
Str_File_ToUpdate=Str_PathUpdate & Str_Version&"\"&Str_Base&"_"&Str_FileToUpdate
Str_LogFile=Str_PathLog&Str_Base&".log"
If fso.FileExists(Str_LogFile) Then
On Error Resume Next
Set obj_FileLog= fso.OpenTextFile(Str_LogFile,1,False,0)
Str_txt=Mid(obj_FileLog.ReadLine,4)
If Err.Number=0 Then
AddLog id,"Файл результата открыт "&Str_LogFile
On Error goto 0
If Trim(Str_txt)="0" Then
If iType=0 Then
AddLog id,"Основная конфигурация обновлена:"
Else
AddLog id,"Конфигурация базы данных успешна обновлена:"
End If
If iType=0 Then
AddLog id,"Удаление файла:"&Str_File_ToUpdate
fso.DeleteFile Str_File_ToUpdate, True
AddLog id,"ОК"
BDArray(id,2)=1
AddLog id,"Готовность к обновлению"
Else
BDArray(id,2)=4
AddLog id,"Готовность к включению БД"
WScript.Sleep 30000 ' 30 сек дабы точно все файлы разблокировались
Str_ConectionBase="/S"""&BDArray(id,0)&"\"&Str_Base&""""
Srt_infoBaseAuthorization=" /N"""&Str_UserAdmin&""" /P"""&Str_PassAdmin&""" /WA-"
str_command=""""&Str_Path1C&""""&" ENTERPRISE "& Str_ConectionBase & Srt_infoBaseAuthorization &" /UC"&Str_CodeEnabelBase&" /CРазрешитьРаботуПользователей"
AddLog id,"Запуск 1С Предприятия для запуска обработок обновления:"
AddLog id,"Команда запуска: "&Replace(str_command,"/P"""&Str_PassAdmin&"""","/P""********""")
WshShell.Run str_command
WScript.Sleep 2*60000 ' 2 минуты перед включением регл заданий
User_Off_On id,2
End If
Else
AddLog id,"Результат:["&Trim(Str_txt)&"]"
If iType=0 Then
AddLog id,"ERR->> В процессе обновления основной конфигурации были ошибки подробнее см. файл:"&Str_Base&".txt"
Else
AddLog id,"ERR->> В процессе обновления конфигурации базы данных были ошибки подробнее см. файл:"&Str_Base&".txt"
End If
BDArray(id,2)=9
End If
Else
AddLog id,"Файл результата блокирован "&Str_LogFile
On Error goto 0
End If
Err.Clear()
End If
End Sub
' Обновляет базу данных
Sub UpdateDB(id)
Str_Base=BDArray(id,1)
AddLog id,"Обновление конфигурации БД:"
AddLog id,"Состояние БД:"&CStr(BDArray(id,2))
If BDArray(id,2)<>2 Then
Exit Sub
End If
Str_LogFile=Str_PathLog&Str_Base&".log"
If fso.FileExists(Str_LogFile) Then
AddLog id,"Найден файл:"&Str_LogFile&" Удаление"
fso.DeleteFile Str_LogFile, True
AddLog id,"ОК"
End If
Str_LogFile=Str_PathLog&Str_Base&".txt"
If fso.FileExists(Str_LogFile) Then
AddLog id,"Найден файл:"&Str_LogFile&" Удаление"
fso.DeleteFile Str_LogFile, True
AddLog id,"ОК"
End If
Str_ConectionBase="/S"""&BDArray(id,0)&"\"&Str_Base&""""
Srt_infoBaseAuthorization=" /N"""&Str_UserAdmin&""" /P"""&Str_PassAdmin&""" /WA-"
str_command=""""&Str_Path1C&""""&" DESIGNER "& Str_ConectionBase & Srt_infoBaseAuthorization &" /UpdateDBCfg -Server /UC"&Str_CodeEnabelBase&" /DisableStartupMessages"&" /DumpResult """&Str_PathLog&Str_Base&".log"""&" /Out """&Str_PathLog&Str_Base&".txt"""
AddLog id,"Запуск конфигуратора для обновления конфигурации БД:"
AddLog id,"Команда запуска: "&Replace(str_command,"/P"""&Str_PassAdmin&"""","/P""********""")
WshShell.Run str_command
BDArray(id,2)=3
AddLog id,"Состояние БД:"&CStr(BDArray(id,2))
End Sub
' Отключает включает пользователей
Sub User_Off_On(id,iType)
Dim obj_ThisCluster
Str_Base=BDArray(id,1)
Str_ServerAndPort=BDArray(id,0)
Select Case iType
Case 0
AddLog id,"Запуск установки блокировки базы данных"
Case 1
AddLog id,"Запуск прерывание соединений пользователей"
Case Else
AddLog id,"Запуск отключения блокировки базы данных "
End Select
AddLog id,"Состояние БД:"&CStr(BDArray(id,2))
Select Case iType
Case 0
Case 1
If BDArray(id,2)>1 Then
Exit Sub
End If
Case Else
If BDArray(id,2)>4 Then
Exit Sub
End If
End Select
Str_LogFile=Str_PathLog&Str_Base&".txt"
' Определяем параметры кластера сервера
AddLog id,"Определяем параметры кластера серверов"
Str_Server=""
Str_Port=""
I_PozPort=InStr(Str_ServerAndPort,":")
If I_PozPort>0 Then
Str_Server=Left(Str_ServerAndPort,I_PozPort-1)
Str_Port=Mid(Str_ServerAndPort,I_PozPort+1)
' если есть порт
'то как правило рабочий порт на 1 меньше
I_Port=CInt(Str_Port)
If I_Port>0 Then
Str_Port=":"&CStr(I_Port-1)
End If
Else
Str_Server=Str_ServerAndPort
End If
Set Obj_connection = CreateObject("V82.COMConnector")
'Получим порт рабочего процесса
Srt_portWorkProcess=""
Set Obj_Agent=Obj_connection.ConnectAgent(Str_Server+Str_Port)
For Each obj_Cluster In Obj_Agent.GetClusters()
On Error Resume Next
Set Obj_Arr_workProcess=Obj_Agent.GetWorkingProcesses(obj_Cluster)
If Err.Number<>0 Then
On Error Goto 0
Obj_Agent.Authenticate obj_Cluster,Str_UserAdminCluster,Str_PassAdminCluster
Else
On Error Goto 0
End If
Err.Clear()
For Each obj_workProcess In Obj_Agent.GetWorkingProcesses(obj_Cluster)
If obj_workProcess.Running=1 AND obj_workProcess.Use>0 Then
Srt_portWorkProcess=CStr(obj_workProcess.MainPort)
Set obj_ThisCluster=obj_Cluster
Exit For
End If
Next
Next
If Srt_portWorkProcess="" Then
BDArray(id,2)=9
AddLog id,"ERR--> Не удалось определить порт рабочего процесса"
Exit Sub
Else
AddLog id,"Рабочий процесс:"&Str_Server&":"&Srt_portWorkProcess
End If
AddLog id,"Авторизация в БД :"
Set obj_ConnectionWorkProcess=Obj_connection.ConnectWorkingProcess(Str_Server&":"&Srt_portWorkProcess)
obj_Arr_obj_ConnectionWorkProcess=obj_ConnectionWorkProcess.GetInfoBases()
For Each obj_IB In obj_Arr_obj_ConnectionWorkProcess
If UCase(obj_IB.Name)=UCase(Str_Base) Then
If obj_IB.DBName="" Then
' Авторизация
obj_ConnectionWorkProcess.AddAuthentication Str_UserAdmin,Str_PassAdmin
End If
If obj_IB.DBName="" Then
BDArray(id,2)=9
AddLog id,"ERR--> Не удалось авторизоваться в базе данных"
Exit Sub
Else
AddLog id,"OK"
End If
Exit For
End If
Next
Select Case iType
Case 0
AddLog id,"Установка блокировки базы данных в "&CStr(d_Denied)
' устанавливаем блокировку базы
obj_IB.PermissionCode= Str_CodeEnabelBase
obj_IB.SessionsDenied =True
obj_IB.DeniedFrom =d_Denied
obj_IB.DeniedTo = #1/1/100#
obj_IB.DeniedMessage=Str_DeniedMess
obj_IB.ScheduledJobsDenied=True
obj_ConnectionWorkProcess.UpdateInfoBase obj_IB
AddLog id,"ОК"
Case 1
AddLog id,"Прерывание соединений пользователей"
obj_Arr_obj_IB_Info=Obj_Agent.GetInfoBases(obj_ThisCluster)
For Each obj_IB_Info In obj_Arr_obj_IB_Info
If UCase(obj_IB_Info.Name)=UCase(Str_Base) Then
Exit For
End If
Next
' Отключаем соединения базы данных
obj_connectionsV8=Obj_Agent.GetInfoBaseSessions(obj_ThisCluster,obj_IB_Info)
For Each obj_connectV8 In obj_connectionsV8
If Not obj_connectV8.AppID="COMConsole" Then
AddLog id," "&CStr(obj_connectV8.SessionID)&" "&obj_connectV8.AppID&" "&obj_connectV8.userName&" "&obj_connectV8.Host
Obj_Agent.TerminateSession obj_ThisCluster, obj_connectV8
AddLog id," ОК"
End If
Next
b_notConnection=True
obj_connectionsV8=Obj_Agent.GetInfoBaseSessions(obj_ThisCluster,obj_IB_Info)
For Each obj_connectV8 In obj_connectionsV8
If Not obj_connectV8.AppID="COMConsole" Then
b_notConnection=False
Exit for
End If
Next
' Проверяем нет ли соединений
If b_notConnection Then
AddLog id,"Все соединения отключены"
BDArray(id,2)=2
Else
BDArray(id,2)=9
AddLog id,"ERR - > Не все соединения отключены"
End If
Case Else
AddLog id,"Отключение блокировки базы данных "
' Снимаем блокировку базы
obj_IB.SessionsDenied =False
obj_IB.ScheduledJobsDenied=False
obj_ConnectionWorkProcess.UpdateInfoBase obj_IB
AddLog id,"ОК"
BDArray(id,2)=5
If b_NetSend Then
str_command="net send "&Str_DomenNetSend&" "&Replace(Str_OnLineMessage,"%Str_BaseSTR%",BDArray(id,4))
AddLog id,"Отправка сообщения в домен:"
AddLog id,""&str_command
WshShell.Run str_command
End If
End Select
AddLog id,"Состояние БД:"&CStr(BDArray(id,2))
End Sub
|
|