• Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

Проблемы С Импортом Дизайна Из Dxl

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

ty3uk

ну пока писал, одну проблемы поборол. Остался вопрос, а можно как-то, при импорте дизайне через DXL указать явно, что реплейсить весь дизайн, т.е. если в старом есть форма "form1" а в новом её нет, то, чтоб, после импорта, форма "form1" удалилась?
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 941
609
BIT
217
импорт программный или из дизигнера?
 
T

ty3uk

програмный. перед этим формирую дизайн из базы в xml, потом, в другом месте, пытаюсь натянуть из XML обратно на базу. Вроде идёт нормально, но, вот, как старые документы дизайна убрать?
Код:
	Dim importer As NotesDXLImporter
Set importer = session.CreateDXLImporter(stream, dbCopy)
importer.ReplicaRequiredForReplaceOrUpdate = False
importer.DesignImportOption = DXLIMPORTOPTION_REPLACE_ELSE_CREATE
Call importer.Process
Call dbCopy.Sign(DBSIGN_DOC_ALL , false)
 

savl

Lotus Team
28.10.2011
2 600
311
BIT
204
А чем не устраивает программный replace через C API?
 
T

ty3uk

А чем не устраивает программный replace через C API?
хотел малой кровью... хочется из LS всё сделать. А там начинается, копия базы "отпускает код" (т.е. не отловить конец), для больших баз используйте sleep.
Или, блин, я что-то не так делаю.
Какие есть способы?
мне нужно:
1) взять дизайн, сохранить его
2) на "месте", забэкапить дизайн (с сохранением)
3) накатить новый дизайн (из п.1)
в последнем пункте, ещё, поиграться с ACL, позапускать агентов и т.п.
вот сижу и думаю...
 

savl

Lotus Team
28.10.2011
2 600
311
BIT
204
хотел малой кровью... хочется из LS всё сделать. А там начинается, копия базы "отпускает код" (т.е. не отловить конец), для больших баз используйте sleep.
Или, блин, я что-то не так делаю.
Какие есть способы?
мне нужно:
1) взять дизайн, сохранить его
2) на "месте", забэкапить дизайн (с сохранением)
3) накатить новый дизайн (из п.1)
в последнем пункте, ещё, поиграться с ACL, позапускать агентов и т.п.
вот сижу и думаю...

У нас справочник систем, там документы, в них все пути к базам, ключевые слова, куча настроек.
К каждому документу есть ответные: backup дизайна + шаблоны для обновления.
BackUP делается через копию на локале, потом крепится в ответный, затем с локала удаляется.
С ACL тоже можно поиграться, но это уже проще.
Запуск агентов тоже можно сделать, причем через консоль.
Выложу код, правда обрезки, полностью выкладывать это целую базу надо...
Но если что на вопросы отвечу.

<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Declarations</div></div><div class="sp-body"><div class="sp-content">
Код:
Declare Sub OSGetDataDir Lib "nnotes.dll" Alias "OSGetDataDirectory" (ByVal DataDir As String)
Declare Private Function W32_NSFDbOpen Lib "nnotes" Alias "NSFDbOpen" (ByVal PathName As LMBCS String,hDB As Long) As Integer
Declare Private Function W32_NSFDbClose Lib "nnotes" Alias "NSFDbClose" (ByVal hDB As Long) As Integer

Declare Function W32_DesignReplace Lib "nnotes" Alias "DesignReplace" (ByVal ht As Long, ByVal hDB As Long, ByVal dw1 As Long, ByVal dw2 As Long, ByVal dw3 As Long, ByVal dw4 As Long) As Integer
Declare Public Function OSLoadString Lib "nnotes.dll" Alias "OSLoadString" _ 
(ByVal hModule&, ByVal StringCode%, ByVal retBuffer As LMBCS String, BufferLength%) As Integer
Declare Sub OSPathNetConstruct Lib "nnotes.dll" ( ByVal portName As Integer, ByVal ServerName As String, ByVal FileName As String, ByVal retPathName As String)

<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">ReplaceDesign</div></div><div class="sp-body"><div class="sp-content">
Код:
Function DBT_ReplaceDesign(Dest As NotesDatabase,Source As NotesDatabase) As Boolean
On Error GoTo handler
Const FuncName = {Function "ReplaceDesign"}
Dim ErrStr As String

Dim status As Integer
Dim htemplate As Long
Dim htarget As Long
Dim SourceStr As String
Dim DestStr As String

DBT_ReplaceDesign = False

SourceStr = Space(1024)
Call OSPathNetConstruct(0, Source.Server, Source.FilePath, SourceStr)
If SourceStr = "" GoTo endh

SourceStr = FullTrim(SourceStr)

DestStr = Space(1024)
Call OSPathNetConstruct(0, Dest.Server, Dest.FilePath, DestStr)
If DestStr = "" GoTo endh

DestStr = FullTrim(DestStr)

status = W32_NSFDbOpen(SourceStr, htemplate)
If status <> 0 Then Error Err,"Не удалось открыть шаблон " & SourceStr & " - Error Code " & getLNerror(status)

status = W32_NSFDbOpen(DestStr, htarget)
If status <> 0 Then
Call W32_NSFDbClose(htemplate)
Error Err, "Не удалось открыть БД " & DestStr & " - Error Code " & getLNerror(status)			
End If

Call W32_DesignReplace(htemplate, htarget, 1, 0, 0, 0)	
Call W32_NSFDbClose(htemplate)
Call W32_NSFDbClose(htarget)

DBT_ReplaceDesign = True

GoTo endh
handler:
ErrStr = libName & ", " & FuncName & ": " & Err &", в стр " & Erl & nLine & Error$
If htemplate <> 0 Then Call W32_NSFDbClose(htemplate)
If htarget <> 0 Then Call W32_NSFDbClose(htarget)
Error Err, ErrStr
endh:
End Function

<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Как я делаю backUp</div></div><div class="sp-body"><div class="sp-content">
Код:
fPath = StrLeftBack(db.Filepath,".")
If InStr(fPath, {\}) Then fPath = StrRightBack(fPath,{\})
Set templateDb = db.Createcopy("",fPath & ".ntf")
Call templateDb.Grantaccess(ses.Username, 6)

<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Агент через консоль</div></div><div class="sp-body"><div class="sp-content">
Код:
ConCmd = {Tell AMGR RUN "} & DestDb.Filepath & {" '} & agentName & {'} 
Call ses.Sendconsolecommand(DestDb.Server, ConCmd)

Добавлено:
копия базы "отпускает код"
Убить текущую сессию и база "отпускается"
 
T

ty3uk

Убить текущую сессию и база "отпускается"
данный момент я не пробовал, я имею в виду, от db.Createcopy я отказался, увидев в хелпаре... так... не понял... значит какой-то другой метод был, там явно говорилось о том, что "копия дело затяжное, и переход на следующую строчку кода, не значит что копия сделана, используйте sleep".. блин...

"агент через консоль", отпускает сразу, или после того как агент завершиться? (дополнительно, если я агента пускаю не через консоль, то я понимаю, на следующей строчке, либо в агенте ошибка, либо он выполнился=можно работать дальше)

а вот с реплейсом задница... почти все серваки под линухом (и аккурат те, которые нужны....)

блин, походу придётся изобретать велосипед... перед "вливанием" дизайна, взять старый, составить "карту", посмотреть "новую", разницу удалить, потом влить новый дизайн. Блин, надо ещё прохибиты проверить, как они при вливании отрабатывают... так, проверил, прохибиты не проверяются... значит надо ещё и их отрабатывать... ёпрст... вот реально велосипед делаю...
 

savl

Lotus Team
28.10.2011
2 600
311
BIT
204
CreateFromTemplate - копирует по идее полностью, про этот метод наверное читали. Там да, там долго...
"агент через консоль", отпускает сразу, или после того как агент завершиться?
Нет... тут другая фишка.. Посылаем команду на Amgr, а он уже сам этого агента стартует, как освободится.
Ожидания нет, код сразу идет дальше этой строки, если надо с ожиданием, то либо Run, либо RunOnServer, либо вручную.

а вот с реплейсом задница... почти все серваки под линухом
если не AIX, то есть вариант. Эта C API подходит для Win, Mac и Lin. Объява только другая.
МБ или похожее:
Код:
Declare Function AIX_DesignReplace Lib "libnotes_r.a" Alias "DesignReplace" (ByVal ht As Long, ByVal hDB As Long, ByVal dw1 As Long, ByVal dw2 As Long, ByVal dw3 As Long, ByVal dw4 As Long) As Integer
но через нее точно удаляются элементы, кроме прохабитов
Если есть manager добавляются роли в ACL и удаляются, но если роль на пользователе каком-то, то она не удалится и не снимется.

Вот еще ближе к вашему
 
T

ty3uk

CreateFromTemplate - копирует по идее полностью, про этот метод наверное читали. Там да, там долго...
вот, точно, оттуда... там даже красненьким выделено...

меня интересуют исключительно "затяжные коды", т.е. когда я точно знаю что готово, либо ошибка (именно из-за это пришлось уйти от CreateFromTemplate и закинуться в DXL). Соотвественно и с агентами, интересует именно run (ну runonserver не интересует, т.к. корневой итак на серваке "топчется"...). Но, всёравно, за пинание через консоль пасиба, не знал как из скрипта консоль пнуть.... ;)


Код:
Declare Function AIX_DesignReplace Lib "libnotes_r.a" Alias "DesignReplace"...
опа, не знал что так под юнихами будет работать, надо проверить... только, наверное, вот такое ;-)
Код:
Declare Function Lin_DesignReplace Lib "libnotes.so" Alias "DesignReplace" ...
ну посмотрим, заработает или нет....

если работа с либами запашет в линухах, тот то велосипед не интересен (т.к., по идее, обычный реплейс, я и пытаюсь повторить)...

Код:
notes_document.~$item
опа.. а я мучался....
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 941
609
BIT
217
savl скорее всего это про доступ к "служебным" полям, в расширенном синтаксисе ;)
 
T

ty3uk

Ну как либы подхватились?
Пока нет, я, пока, на локалке тренеруюсь. Но функции зауниверсалил на W32 и Лялих. Придёт время на серваке проверю.
Сейчас в промежутках между задачами, потихоньку делаю ;-) .

savl скорее всего это про доступ к "служебным" полям, в расширенном синтаксисе
оно самое. Не знал как такое делать, всё геты и реплейсы.
 

rinsk

Lotus Team
12.11.2009
1 151
125
BIT
4
Иконка и много чего полезного при APIReplaceDesign не переползает .
делал просто:

' Заменили дизайн, переписываем документ со свойствами базы
Set DBDocPropTempl = TemplDB.GetDocumentByID("FFFF0010")
Set DBDocPropTarget = TargetDB.GetDocumentByID("FFFF0010")
Call DBDocPropTempl.CopyAllItems(DBDocPropTarget)
Call DBDocPropTarget.Save(True, False)

info:
+
 

savl

Lotus Team
28.10.2011
2 600
311
BIT
204
Иконка и много чего полезного при APIReplaceDesign не переползает
Да, доки about, help.
Что касается иконки, с версии 8.5 можно устанавливать png файл для иконки, так вот он меняется только если его не было первоначально.
Если был, то нет, потому что при установке сразу выставляется галка прохабита.
 
T

ty3uk

Вести с полей: работает! (имеется в виду, что протестил "скрипт наката" работая из-под линухового сервака, если он работает, то и под виндой запашет, ну налокалке-то пахало...)
Косячёк с подписыванием базы. Стандартным способом не получается, пришлось админским процессом (есть способ через C API подписать сервером, и ожидать подписи?)

ПО иконкам, абаут и т.п. Сделал по другому. Сделал, всётаки, если базы нет, то создавать из темплейта (подкладываю подготовленный "бланк" под сервак, и с него создаю, создаётся нормально, а там, иконки и т.п. уже подправленны на рефреш. Далее, да, можно тягать по noteID (если делать тупо, создать пустую базу (скриптом), то никаких иконок там нет, и на попытку выдернуть иконку по noteID и поменять её параметры... ну понятно.. самое забавное, что если на базу созданную с нуля, накатить дизайн, и потом попробовать добраться до иконки, опять болт!!! похоже по дефаулту, даже в нулевой базе, на иконке стоит запрет рефреша, и из-за этого, "накатом", она не создаётся....))

теперь мешается только подписывание базы через админский процесс... хотелось-бы, чтоб "план работ" исполнялся в "один заход агентом", а не каждые 5-ть минут, проверял: "подписалась-ли база?" (кстати, есть способ как-то проверить, что база полностью подписалась? аа.. кажется понимаю... яж запрос создал, можно следить по его ID?)

ну, по идее, теперь минимальный интерфейс по обработке ACL додумать, потом сделать нормальные агенты которые обрабатывают "план обновления"(на клиентских серваках), малость безопасность "подпилить". И будет хорошая базейка по обновлению дизайна у клиента (ааа... с бэкапом дизайна... вечные проблемы, а теперь придумал способ, как лотуса не засорять, и иметь все версии...). Потом впендюрить минимальный ворк-флоу, и можно выдавать программерам. Потом, сидеть и аппрувить )))
 

rinsk

Lotus Team
12.11.2009
1 151
125
BIT
4
...
ПО иконкам, абаут и т.п. Сделал по другому. Сделал, всётаки, если базы нет, то создавать из темплейта (подкладываю подготовленный "бланк" под сервак, и с него создаю, создаётся нормально, а там, иконки и т.п. уже подправленны на рефреш. Далее, да, можно тягать по noteID (если делать тупо, создать пустую базу (скриптом), то никаких иконок там нет, и на попытку выдернуть иконку по noteID и поменять её параметры... ну понятно.. самое забавное, что если на базу созданную с нуля, накатить дизайн, и потом попробовать добраться до иконки, опять болт!!! похоже по дефаулту, даже в нулевой базе, на иконке стоит запрет рефреша, и из-за этого, "накатом", она не создаётся....))
...
по иконкам\етс. делалась такая ф-ция:

Код:
Function ReplaceDesign(TemplDB As NotesDatabase, TargetDB As NotesDatabase) As Integer
'''''''''''''''''''''''''''''''''''''
Const NOTE_CLASS_ICON_DEFAULT = &H8010 '*** icon default note 
Const NOTE_CLASS_DESIGN_DEFAULT = &H8020 '*** icon default note _DEFAULT = &H8010 '*** icon default note 
Const NOTE_CLASS= &H0003
Dim hNote As Long
Dim PathName As String * 256
Dim TargetPathName As String * 256
Dim retflag As Integer
''''''''''''''''''''''''''''''''''''''
Dim htemplate As Long
Dim htarget As Long
''''''''''''''''''''''''''''''''''''''
Dim DBDocPropTempl As NotesDocument
Dim DBDocPropTarget As NotesDocument
''''''''''''''''''''''''''''''''''''''

Call W32_OSPathNetConstruct("", TemplDB.Server, TemplDB.FilePath, PathName)
Call W32_OSPathNetConstruct("",TargetDB.Server, TargetDB.FilePath,TargetPathName)

Call W32_NSFDbOpen(PathName, htemplate)
If htemplate=0 Then Exit Function
Call W32_NSFDbOpen(TargetPathName, htarget)
If htarget=0 Then Exit Function
If TargetDB.GetDocumentByID("FFFF0020") Is Nothing Then
RetFlag = W32_NSFNoteCreate(htarget,hNote)
Call W32_NSFNoteSetInfo( hNote, NOTE_CLASS, NOTE_CLASS_DESIGN_DEFAULT)
RetFlag = W32_NSFNoteUpdate( hNote,0)
Call W32_NSFNoteClose( hNote)
End If
If TargetDB.GetDocumentByID("FFFF0010") Is Nothing Then
RetFlag = W32_NSFNoteCreate(htarget,hNote)
Call W32_NSFNoteSetInfo( hNote, NOTE_CLASS, NOTE_CLASS_ICON_DEFAULT)
RetFlag = W32_NSFNoteUpdate( hNote,0)
Call W32_NSFNoteClose( hNote)
End If
Call W32_DesignReplace(htemplate, htarget, 1, 1, 0, 0)
Call W32_NSFDbClose(htemplate)
Call W32_NSFDbClose(htarget)
' Заменили дизайн, переписываем документ со свойствами базы
Set DBDocPropTempl = TemplDB.GetDocumentByID("FFFF0010")
Set DBDocPropTarget = TargetDB.GetDocumentByID("FFFF0010")
Call DBDocPropTempl.CopyAllItems(DBDocPropTarget,True)
Call DBDocPropTarget.Save(True, False)
End Function
 

savl

Lotus Team
28.10.2011
2 600
311
BIT
204
Косячёк с подписыванием базы. Стандартным способом не получается, пришлось админским процессом (есть способ через C API подписать сервером, и ожидать подписи?)
Я тоже через админпроцесс делаю, подпись серваком.
Думаю, если работать под учеткой, то можно просто делать save+sign для каждой design-note

(кстати, есть способ как-то проверить, что база полностью подписалась?
Думаю это не поможет... АП стартует не сразу, у нас подпись занимает до 3х минут на самой большой базе.
В среднем 20 секунд.
При этом в документе АП стоит разница между старт и енд - 4 секунды.
Видимо не отслеживает выполнение.
Кстати, после такой подписи стартуют все SHDL агенты, у них сбрасывается флаг.
 
Мы в соцсетях:

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