Как определить время запуска текущего сервера?

  • Автор темы fedotxxl
  • Дата начала
F

fedotxxl

Привет,
мне необходимо узнать, как давно запустился сервер. Как это лучше сделать?
 
K

Klido

а админе свойства чего-либо и там выбрать (там где док, бд и т.д) Сервер...
 
A

Akupaka

в логах есть запись )) например: "database server started"
 

ToxaRat

Чёрный маг
Green Team
06.11.2007
3 332
42
BIT
0
пишешь в консоль sh server -xml
распарсиваешь и забираешь значение из Elapsed Time
 
F

fedotxxl

Klido
Необходимо, чтобы сначала прошла репликация с кластерными серверами, а потом запустились агенты по-расписанию.

Что-то я не пойму как программно парсить результат консоли? Желательно вообще ничего не выводить на консоль
 
K

Klido

fedotxxl
а при чем тут время последнего старта сервера? может надо поймать факт его старта?
ну если программно - как ToxaRat сказал...
 
F

fedotxxl

Агент запускается на том сервере, который стартует. Мне нужно, чтобы этот агент не отрабатывал до того момента, как с ним среплицируется кластерный сервер...
Неплохой вариант "задержать" agentManager, например
 

VladSh

начинающий
Lotus Team
11.12.2009
1 797
158
BIT
232
Мы используем время старта JVM, получая его через LS2J (см. getUptimeSeconds внизу во "Вспомогательные константы и функции").

Коллеги, а с тех пор случайно не появилось идей получше, чем использовать Java или парсить вывод консоли? Может Domino отмечает это в каком-нибудь документике, к примеру, в АК сервера или где-то ещё, и это можно найти просто на LS?

Или может кто-то знает, как получить значение Elapsed time с 1-й вкладки свойств сервера?
 

savl

Lotus Team
28.10.2011
2 624
314
BIT
540
Мы используем время старта JVM, получая его через LS2J (см. getUptimeSeconds внизу во "Вспомогательные константы и функции").

Коллеги, а с тех пор случайно не появилось идей получше, чем использовать Java или парсить вывод консоли? Может Domino отмечает это в каком-нибудь документике, к примеру, в АК сервера или где-то ещё, и это можно найти просто на LS?

Или может кто-то знает, как получить значение Elapsed time с 1-й вкладки свойств сервера?
Статистика сервера, show stat Server.Elapsedtime и так же парсить.
Либо CAPI и агент на сервере:
Вот из этого агента, можно вырезать кусок для нужной статистики и писать или отправлять ее.
Возможно, но это не точно, можно написать web service provider и он будет делать тоже самое.
 
  • Нравится
Реакции: VladSh

VladSh

начинающий
Lotus Team
11.12.2009
1 797
158
BIT
232
Код:
Visual Basic:
Dim ns As New NotesSession
Dim s As String
s = ns.SendConsoleCommand(ns.CurrentDatabase.Server, "sh stat Stats.Time.Start")
выводит:
02.02.2022 12:59:29: [serverName] Stats.Time.Start = 01/18/2022 17:21:45 ZE2
1 statistics found
Именно параметру Stats.Time.Start соответствует значение Elapsed time с 1-й вкладки свойств сервера.

Сейчас с API буду пробовать, а то не хочется засирать консоль сервера.
 

VladSh

начинающий
Lotus Team
11.12.2009
1 797
158
BIT
232
CAPI и агент на сервере:
Оказывается код, использующий StatQueryTime, уже был у нас опубликован на форуме.

Почистил всё ненужное + добавил вариант, использующий , но адаптировал для работы с памятью ту же CopyBufferToString.
Visual Basic:
%REM
    Получение параметра статистики сервера используя вызовы Notes API.
    Некоторые параметры из Notes-клиента недоступны,
    для их получения нужно вызывать агент на сервере.
   
    Недокументированная API функция Cmovmem используется в этом примере
    под псевдонимом CopyBufferToString - она копирует содержимое буфера
    и возвращает данные в виде строки в LotusScript.
 
    Julian Robichaux -- http://www.nsftools.com
%END REM
Option Public
Option Declare

Declare Function OSLockObject Lib "nnotes.dll" (ByVal objectHandle As Long) As Long
Declare Function OSUnlockObject Lib "nnotes.dll" (ByVal objectHandle As Long) As Integer
Declare Function OSMemFree Lib "nnotes" (ByVal handle As Long) As Integer

'Недокументировання функция Notes API копирования буфера памяти в строку
Declare Sub CopyBufferToString Lib "nnotes.dll" Alias "Cmovmem" (ByVal lpSrc As Long, ByVal lpDest As String, ByVal lSize As Long)

'Если нужно скопировать не строковые данные, используйте параметр lpDest As Any
Declare Sub CopyBuffer Lib "nnotes.dll" Alias "Cmovmem" (ByVal lpSrc As Long, lpDest As Any, ByVal lSize As Long)

'Функция статистики с возможностью выбора определённого сервера
Declare Private Function NSFGetServerStats Lib "nnotes" Alias "NSFGetServerStats" (ByVal ServerName As LMBCS String, ByVal Facility As LMBCS String, ByVal StatName As LMBCS String, hRetTable As Long, nRetSize As Long) As Integer

'Функция статистики с форматированием вывода
Declare Function StatQueryTime Lib "nnotes" (ByVal facility As String, ByVal statName As Any, _
ByVal headerString As String, ByVal namePrefix As String, ByVal valuePrefix As String, ByVal lineSuffix As String, _
hRetTable As Long, nRetSize As Long) As Integer

%REM
    Function GetStatParam
    Возвращает параметр статистики с указанного сервера с помощью NSFGetServerStats
    На клиенте работает со всеми параметрами статистики, в отличие от GetStatParamFull, возвращая даты в EN-формате
%END REM
Function GetStatParam(sServerName As String, sFacility As String, sStat As String) As String
    Dim nError As Integer
    Dim hRetTable As Long
    Dim nRetSize As Long
   
    nError = NSFGetServerStats(sServerName, sFacility, sStat, hRetTable, nRetSize)
    If nError = 0 Then
        GetStatParam = GetBufferAsString(hRetTable, nRetSize, 0, True)
        If Len(GetStatParam) <> 0 Then
            GetStatParam = StrRight(GetStatParam, Chr(9))
            GetStatParam = Replace(Replace(GetStatParam, Chr(10), ""), Chr(13), "")
        Else
            'NOTES_ERR_INVALID_NAME
            Error 4375, "Параметр статистики '" + sFacility + "." + sStat + "' отсутствует либо недоступен"
        End If
    Else
        Error nError, "Ошибка вызова API-функции NSFGetServerStats"
    End If
End Function

%REM
    Function GetStatParamFull
    Возвращает параметр статистики с текущего сервера с помощью StatQueryTime;
        даты возвращаются в расширенном формате: EN-формат [формат локали]
    На клиенте не работает с некоторыми параметрами; для получения нужно использовать GetStatParamFull либо запускать агент на сервере.
%END REM
Function GetStatParamFull(sFacility As String, sStat As String) As String
    Dim nError As Integer
    Dim hRetTable As Long
    Dim nRetSize As Long
   
    nError = StatQueryTime(sFacility, sStat, "", "", Chr(9), "", hRetTable, nRetSize)
    If nError = 0 Then
        GetStatParamFull = GetBufferAsString(hRetTable, nRetSize, 0, True)
        If Len(GetStatParamFull) <> 0 Then
            GetStatParamFull = StrRight(GetStatParamFull, Chr(9))
        Else
            'NOTES_ERR_INVALID_NAME
            Error 4375, "Параметр статистики '" + sFacility + "." + sStat + "' отсутствует либо недоступен"
        End If
    Else
        Error nError, "Ошибка вызова API-функции StatQueryTime"
    End If
End Function

%REM
    Function GetStatDate
    Description: возвращает дату-время из параметра статистики в формате текущей локали сервера
%END REM
Public Function GetStatDate(sFacility As String, sStat As String) As Variant
    Dim s As String
    s = GetStatParamFull(sFacility, sStat)
    s = StrLeft(StrRight(s, "["), "]")
    If IsDate(s) Then
        GetStatDate = CDat(s)
    Else
        'NOTES_ERR_INVALID_DATE
        Error 4045, "Параметр статистики '" + sFacility + "." + sStat + "' содержит значение '" + s + "', не являющееся датой"
    End If
End Function

%REM
    Копирование информации из буфера в строку
       используя недокументированную функцию Cmovmem API (вместо CopyMemory+ из kernel32).
 
    Параметры:
    * buffer    - адрес буфера
    * bufferLen - количество байт для копирования
    * offset    - точка отсчета начала копирования
    * bFreeMem  - индикатор? - очищать очищать буфер
        или оставить для дальнейшего использования
 
    Julian Robichaux -- http://www.nsftools.com
%END REM
Function GetBufferAsString(buffer As Long, bufferLen As Long, offset As Long, bFreeMem As Boolean) As String
    Dim pointer As Long
    Dim bufferText As String
 
    bufferText = Space(bufferLen)
    pointer = OSLockObject(buffer)
    Call CopyBufferToString(pointer + offset, bufferText, bufferLen)
    Call OSUnlockObject(buffer)
 
    'Предупреждение: если после вызова OSMemFree вы попробуете заблокировать или
    'получить доступ к буферу, это приведет к сбою Notes/Domino
    If bFreeMem Then
        Call OSMemFree(buffer)
    End If
 
    GetBufferAsString = bufferText
End Function
Visual Basic:
On Error 4375 Resume Next
Dim ns As New NotesSession
Dim s As String

s = GetStatParam(ns.CurrentDatabase.Server, "Server", "Time.Start")
Print 1, s
If Not ns.isOnServer Then MsgBox s

s = GetStatParamFull("Server", "Time.Start")
Print 2, s
If Not ns.isOnServer Then MsgBox s

s = GetStatDate("Server", "Time.Start")
Print 3, s
If Not ns.isOnServer Then MsgBox s
Оба варианта функциональности протестированы на Windows Server 2003 с Domino 32-bit 8.5.3 и на Windows Server 2012 с Domino 64-bit 9.0.1. Получение некоторых параметров работает даже с клиента.
В качестве handle нужно для обоих битностей использовать тип Long (в случае Windows - точно)! В инете встречаются разные варианты, но они все валят клиента и сервер.
 
  • Нравится
Реакции: rinsk и savl

garrick

Lotus Team
26.10.2009
1 367
152
BIT
363
По-моему, если я не ошибаюсь, но если не указывать в декларации ".dll", то оно будет мультиплатформенным, а так только для Windows

Visual Basic:
Declare Function OSLockObject Lib "nnotes" (ByVal objectHandle As Long) As Long
Declare Function OSUnlockObject Lib "nnotes" (ByVal objectHandle As Long) As Integer
 

savl

Lotus Team
28.10.2011
2 624
314
BIT
540
По-моему, если я не ошибаюсь, но если не указывать в декларации ".dll", то оно будет мультиплатформенным, а так только для Windows

Visual Basic:
Declare Function OSLockObject Lib "nnotes" (ByVal objectHandle As Long) As Long
Declare Function OSUnlockObject Lib "nnotes" (ByVal objectHandle As Long) As Integer
Ошибаетесь, имена другие, но может алиасы задают в ОС:
Visual Basic:
Const LIB_W32 = "nnotes.dll"
Const LIB_AIX = "libnotes_r.a"
Const LIB_LIN = "libnotes.so"
Const LIB_L64 = "libnotes.so" ' ???
Const LIB_SOL = "libnotes.so"
Const LIB_HPX = "libnotes.sl"
Const LIB_OS2 = "Inotes.dll"
Const LIB_OS3 = "libnotes"
Const LIB_OS4 = "libnotes.svrpgm"
Const LIB_MAC = "NotesLib"
Const LIB_ALP = "anotes.dll"
 

VladSh

начинающий
Lotus Team
11.12.2009
1 797
158
BIT
232
Как оказалось:
- параметр Stat.Time.Start работает даже с клиенте, но он непонятно как обновляется, иногда это точно время старта сервера, а иногда оно может отличаться на несколько дней.
- параметр Server.ElapsedTime содержит время, прошедшее с момента старта сервера, но плох тем, что период обновления информации в нём = 1 минута, что не подходит для моей задачи.
- параметр Server.Time.Start содержит нужную дату, но его недостаток в том, что с клиента он не работает.

Обновил код:
- добавил генерацию ошибок;
- добавил функцию GetStatDate;
- откорректировал комментарии.

По-моему, если я не ошибаюсь, но если не указывать в декларации ".dll", то оно будет мультиплатформенным, а так только для Windows
Да, в зависимости от ОС нужно подсунуть другой псевдоним библиотеки, как минимум.
Но в случае функций, работающих с памятью, handle везде Long, кроме Win64. Писал выше, что для данных функций и данной ОС нужно использовать также handle типа Long, как будто это 32-битный Domino.
Что касается декларации функций, то NSFGetServerStats лишь один раз, а StatQueryTime дополнительно для MAC и AIX. Для Linux ничего нет. С одной стороны вроде как декларации д.б. одинаковыми, а с другой - нет. Надо просто брать и пробовать.
Код выше выложил просто как пример того, что можно легко получать нужные параметры с сервера используя статистику. Если кто хочет помочь в тестировании для Linux, то мне надо сначала впилить этот код в свой имеющийся (мультиплатформенный), а потом выложить сюда.
 
  • Нравится
Реакции: rinsk

rinsk

Lotus Team
12.11.2009
1 156
126
BIT
44
У нас до регионов доступ есть, а вот с регионов до нашего сервера может и не быть. Заманчиво использовать один центральный сервер для сбора статистики со всех доминошных серверов в Prometheus с графаной... ))
 
  • Нравится
Реакции: VladSh
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!