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

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

savl

Lotus Team
28.10.2011
2 624
314
BIT
515
У нас до регионов доступ есть, а вот с регионов до нашего сервера может и не быть. Заманчиво использовать один центральный сервер для сбора статистики со всех доминошных серверов в Prometheus с графаной... ))
ммм, у тебя кажись получилось же в базу лить, а оттуда в прометей.
Если до регионов доступ есть, особенно у сервера по 1352, то репликой можно забирать оттуда, pull only.
 

rinsk

Lotus Team
12.11.2009
1 155
126
BIT
38
ммм, у тебя кажись получилось же в базу лить, а оттуда в прометей.
Если до регионов доступ есть, особенно у сервера по 1352, то репликой можно забирать оттуда, pull only.
Да исходящие от сервера норм и работает. Но не хочется хранить данные, их реплицировать и т п.
 

rinsk

Lotus Team
12.11.2009
1 155
126
BIT
38
Оказывается код, использующий 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 - точно)! В инете встречаются разные варианты, но они все валят клиента и сервер.
Решил попробовать просто поменять для линукс сервера:
Visual Basic:
Declare Function OSLockObject Lib "libnotes.so" (ByVal objectHandle As Long) As Long
Declare Function OSUnlockObject Lib "libnotes.so" (ByVal objectHandle As Long) As Integer
Declare Function OSMemFree Lib "libnotes.so" (ByVal handle As Long) As Integer
'Недокументировання функция Notes API копирования буфера памяти в строку
Declare Sub CopyBufferToString Lib "libnotes.so" Alias "Cmovmem" (ByVal lpSrc As Long, ByVal lpDest As String, ByVal lSize As Long)
'Если нужно скопировать не строковые данные, используйте параметр lpDest As Any
Declare Sub CopyBuffer Lib "libnotes.so" Alias "Cmovmem" (ByVal lpSrc As Long, lpDest As Any, ByVal lSize As Long)
'Функция статистики с возможностью выбора определённого сервера
Declare Private Function NSFGetServerStats Lib "libnotes.so" 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
Убивает сервер сразу в ф-ции CopyBufferToString
Сам NSFGetServerStats возвращает структуру длиной 20-30 к
Что дальше делать - я не понял (
 

rinsk

Lotus Team
12.11.2009
1 155
126
BIT
38
Заработало -
Изменил указатель на Double
Declare Function OSLockObject Lib "libnotes.so" (ByVal objectHandle As Long) As Double
Declare Sub CopyBufferToString Lib "libnotes.so" Alias "Cmovmem" (ByVal lpSrc As Double, ByVal lpDest As String, ByVal lSize As Long)
+ Notes.ini сервера добавил:
LS64BITCCALLOUTPointerSupport=1
Версии серверов - 12.0.1 и 10FP4
Причем на 12.0.1 оно зывелось и без LS64BITCCALLOUTPointerSupport , но после пары десятков вызовов благополучно сдохло...)
 

VladSh

начинающий
Lotus Team
11.12.2009
1 797
158
BIT
232
@rinsk
У меня также. Причём давно и под виндой, потому и не выкладываю. Максимум работает сутки, потом начинает возвращать какую-то ерунду из базы - куски каких-то текстов или @-формул...

Я сейчас сделал так - агент на сервере, запускаемый при старте сервера, который использует это API и вписывает текущее время в параметр $NotesStartTime серверного notes.ini. И потом если API-функция начинает нести ахинею, то просто беру значение из notes.ini. Криво, но работает, - первый вызов апишной функции отрабатывает верно. Там есть ещё одна проблема - агент с триггером "при старте сервера" может стартовать не первым, а пятым или шестым... От чего это зависит - неизвестно. И управлять этим процессом никак нельзя. Агент лучше пускать по расписанию, чем из Programs, т.к. иначе иногда он запускается ещё позже, чем если по расписанию внутри агента.
 

rinsk

Lotus Team
12.11.2009
1 155
126
BIT
38
@rinsk
У меня также. Причём давно и под виндой, потому и не выкладываю. Максимум работает сутки, потом начинает возвращать какую-то ерунду из базы - куски каких-то текстов или @-формул...

Я сейчас сделал так - агент на сервере, запускаемый при старте сервера, который использует это API и вписывает текущее время в параметр $NotesStartTime серверного notes.ini. И потом если API-функция начинает нести ахинею, то просто беру значение из notes.ini. Криво, но работает, - первый вызов апишной функции отрабатывает верно. Там есть ещё одна проблема - агент с триггером "при старте сервера" может стартовать не первым, а пятым или шестым... От чего это зависит - неизвестно. И управлять этим процессом никак нельзя. Агент лучше пускать по расписанию, чем из Programs, т.к. иначе иногда он запускается ещё позже, чем если по расписанию внутри агента.
Т е при LS64BITCCALLOUTPointerSupport=1 + doble указатели ф-ция NSFGetServerStats умирает на win сервере ? На linux не пробовал?
я эту штуку сделал для откидывания статистики в прометеус. Дергает раз в 15 сек. Посмотрим на него конечно...
 
Мы в соцсетях:

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