From 9010ad413964f46aa94dfd0cf7e59f454ef9bc95 Mon Sep 17 00:00:00 2001 From: Jonathan Jenne Date: Thu, 4 Apr 2019 16:29:18 +0200 Subject: [PATCH] Much stuff --- ADSyncTest/ADSyncTest.vbproj | 8 + ADSyncTest/Form1.Designer.vb | 37 ++- ADSyncTest/Form1.vb | 70 ++++- DDMonorepo.sln | 7 + DDZUGFeRDService/ZUGFeRDService.vb | 3 +- EDMI_ClientSuite/ClassService.vb | 2 +- EDMI_ClientSuite/ClassTimer.vb | 2 +- .../Common/ClassCommonCommands.vb | 2 +- .../FormDesigner/frmFormDesigner.vb | 2 +- EDMI_ClientSuite/MyApplication.vb | 2 +- EDMI_ClientSuite/_TEST/frmFileTest.vb | 2 +- EDMI_ClientSuite/frmSplash.vb | 2 +- ...erviceReference.DocumentResult.datasource} | 2 +- ...MIServiceReference.IndexResult.datasource} | 2 +- ...erviceReference.NonQueryResult.datasource} | 2 +- ...IServiceReference.ScalarResult.datasource} | 2 +- ...MIServiceReference.TableResult.datasource} | 2 +- EDMI_FILE_OPs/Document.vb | 2 +- EDMI_FILE_OPs/EDMIAPI.vbproj | 18 +- .../My Project/Resources.Designer.vb | 2 +- EDMI_FILE_OPs/My Project/Settings.Designer.vb | 4 +- JobRunner/App.config | 42 +++ JobRunner/JobRunner.vb | 74 ++++++ JobRunner/JobRunner.vbproj | 156 +++++++++++ JobRunner/My Project/Application.Designer.vb | 13 + JobRunner/My Project/Application.myapp | 10 + JobRunner/My Project/AssemblyInfo.vb | 35 +++ JobRunner/My Project/Resources.Designer.vb | 63 +++++ JobRunner/My Project/Resources.resx | 117 +++++++++ JobRunner/My Project/Settings.Designer.vb | 154 +++++++++++ JobRunner/My Project/Settings.settings | 33 +++ JobRunner/ProjectInstaller.vb | 24 ++ JobRunner/WindowsService.Designer.vb | 50 ++++ JobRunner/WindowsService.resx | 123 +++++++++ JobRunner/WindowsService.vb | 38 +++ JobRunner/packages.config | 4 + Jobs/EDMI/ADSync/ADSyncArgs.vb | 3 + Jobs/EDMI/ADSync/ADSyncJob.vb | 9 + Jobs/EDMI/ZUGFeRD/EmailData.vb | 5 + Jobs/EDMI/ZUGFeRD/ImportZUGFeRDFiles.vb | 31 +-- Jobs/EDMI/ZUGFeRD/WorkerArgs.vb | 19 ++ Jobs/EDMI/ZUGFeRD/XmlItemProperty.vb | 5 + Jobs/IJob.vb | 4 + Jobs/Jobs.vbproj | 14 + Jobs/My Project/Settings.Designer.vb | 71 +++++ Jobs/My Project/Settings.settings | 0 .../ActiveDirectoryInterface.vb | 246 ++++++++++++++++-- .../ActiveDirectoryUser.vb | 18 ++ .../UserEqualityComparer.vb | 19 ++ Modules.Interfaces/Interfaces.vbproj | 7 + SERVICES/DDEDM_NetworkService/EDMService.vb | 2 +- ZUGFeRDTest/Form1.vb | 1 + 52 files changed, 1482 insertions(+), 83 deletions(-) rename EDMI_FILE_OPs/Connected Services/EDMIServiceReference/{DigitalData.Modules.EDMIFileOps.EDMIServiceReference.DocumentResult.datasource => DigitalData.Modules.EDMIAPI.EDMIServiceReference.DocumentResult.datasource} (65%) rename EDMI_FILE_OPs/Connected Services/EDMIServiceReference/{DigitalData.Modules.EDMIFileOps.EDMIServiceReference.IndexResult.datasource => DigitalData.Modules.EDMIAPI.EDMIServiceReference.IndexResult.datasource} (66%) rename EDMI_FILE_OPs/Connected Services/EDMIServiceReference/{DigitalData.Modules.EDMIFileOps.EDMIServiceReference.NonQueryResult.datasource => DigitalData.Modules.EDMIAPI.EDMIServiceReference.NonQueryResult.datasource} (65%) rename EDMI_FILE_OPs/Connected Services/EDMIServiceReference/{DigitalData.Modules.EDMIFileOps.EDMIServiceReference.ScalarResult.datasource => DigitalData.Modules.EDMIAPI.EDMIServiceReference.ScalarResult.datasource} (66%) rename EDMI_FILE_OPs/Connected Services/EDMIServiceReference/{DigitalData.Modules.EDMIFileOps.EDMIServiceReference.TableResult.datasource => DigitalData.Modules.EDMIAPI.EDMIServiceReference.TableResult.datasource} (66%) create mode 100644 JobRunner/App.config create mode 100644 JobRunner/JobRunner.vb create mode 100644 JobRunner/JobRunner.vbproj create mode 100644 JobRunner/My Project/Application.Designer.vb create mode 100644 JobRunner/My Project/Application.myapp create mode 100644 JobRunner/My Project/AssemblyInfo.vb create mode 100644 JobRunner/My Project/Resources.Designer.vb create mode 100644 JobRunner/My Project/Resources.resx create mode 100644 JobRunner/My Project/Settings.Designer.vb create mode 100644 JobRunner/My Project/Settings.settings create mode 100644 JobRunner/ProjectInstaller.vb create mode 100644 JobRunner/WindowsService.Designer.vb create mode 100644 JobRunner/WindowsService.resx create mode 100644 JobRunner/WindowsService.vb create mode 100644 JobRunner/packages.config create mode 100644 Jobs/EDMI/ADSync/ADSyncArgs.vb create mode 100644 Jobs/EDMI/ADSync/ADSyncJob.vb create mode 100644 Jobs/EDMI/ZUGFeRD/EmailData.vb create mode 100644 Jobs/EDMI/ZUGFeRD/WorkerArgs.vb create mode 100644 Jobs/EDMI/ZUGFeRD/XmlItemProperty.vb create mode 100644 Jobs/My Project/Settings.Designer.vb create mode 100644 Jobs/My Project/Settings.settings create mode 100644 Modules.Interfaces/ActiveDirectoryInterface/ActiveDirectoryUser.vb create mode 100644 Modules.Interfaces/ActiveDirectoryInterface/UserEqualityComparer.vb diff --git a/ADSyncTest/ADSyncTest.vbproj b/ADSyncTest/ADSyncTest.vbproj index 9698bbf5..8d9c8289 100644 --- a/ADSyncTest/ADSyncTest.vbproj +++ b/ADSyncTest/ADSyncTest.vbproj @@ -129,6 +129,14 @@ + + {39ec839a-3c30-4922-a41e-6b09d1dde5c3} + Jobs + + + {EAF0EA75-5FA7-485D-89C7-B2D843B03A96} + Database + {AB6F09BF-E794-4F6A-94BB-C97C0BA84D64} Interfaces diff --git a/ADSyncTest/Form1.Designer.vb b/ADSyncTest/Form1.Designer.vb index 25f72448..309bfed9 100644 --- a/ADSyncTest/Form1.Designer.vb +++ b/ADSyncTest/Form1.Designer.vb @@ -24,6 +24,9 @@ Partial Class Form1 Private Sub InitializeComponent() Me.Button1 = New System.Windows.Forms.Button() Me.ListBox1 = New System.Windows.Forms.ListBox() + Me.ListBox2 = New System.Windows.Forms.ListBox() + Me.Button2 = New System.Windows.Forms.Button() + Me.Button3 = New System.Windows.Forms.Button() Me.SuspendLayout() ' 'Button1 @@ -40,14 +43,43 @@ Partial Class Form1 Me.ListBox1.FormattingEnabled = True Me.ListBox1.Location = New System.Drawing.Point(245, 12) Me.ListBox1.Name = "ListBox1" - Me.ListBox1.Size = New System.Drawing.Size(543, 420) + Me.ListBox1.Size = New System.Drawing.Size(244, 420) Me.ListBox1.TabIndex = 1 ' + 'ListBox2 + ' + Me.ListBox2.FormattingEnabled = True + Me.ListBox2.Location = New System.Drawing.Point(495, 12) + Me.ListBox2.Name = "ListBox2" + Me.ListBox2.Size = New System.Drawing.Size(266, 420) + Me.ListBox2.TabIndex = 2 + ' + 'Button2 + ' + Me.Button2.Location = New System.Drawing.Point(12, 70) + Me.Button2.Name = "Button2" + Me.Button2.Size = New System.Drawing.Size(227, 38) + Me.Button2.TabIndex = 3 + Me.Button2.Text = "List Groups" + Me.Button2.UseVisualStyleBackColor = True + ' + 'Button3 + ' + Me.Button3.Location = New System.Drawing.Point(12, 114) + Me.Button3.Name = "Button3" + Me.Button3.Size = New System.Drawing.Size(227, 35) + Me.Button3.TabIndex = 4 + Me.Button3.Text = "List Users for selected Group" + Me.Button3.UseVisualStyleBackColor = True + ' 'Form1 ' Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font Me.ClientSize = New System.Drawing.Size(800, 450) + Me.Controls.Add(Me.Button3) + Me.Controls.Add(Me.Button2) + Me.Controls.Add(Me.ListBox2) Me.Controls.Add(Me.ListBox1) Me.Controls.Add(Me.Button1) Me.Name = "Form1" @@ -58,4 +90,7 @@ Partial Class Form1 Friend WithEvents Button1 As Button Friend WithEvents ListBox1 As ListBox + Friend WithEvents ListBox2 As ListBox + Friend WithEvents Button2 As Button + Friend WithEvents Button3 As Button End Class diff --git a/ADSyncTest/Form1.vb b/ADSyncTest/Form1.vb index 2514f9b0..b3dc7359 100644 --- a/ADSyncTest/Form1.vb +++ b/ADSyncTest/Form1.vb @@ -1,21 +1,85 @@ Imports DigitalData.Modules.Interfaces Imports DigitalData.Modules.Logging +Imports DigitalData.Modules.Interfaces.ActiveDirectoryInterface +Imports DigitalData.Modules.Database Public Class Form1 Private _sync As ActiveDirectoryInterface Private _logConfig As LogConfig Private _logger As Logger + Private _firebird As Firebird - Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click + Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load _logConfig = New LogConfig(LogConfig.PathType.CurrentDirectory) + _logConfig.Debug = True _logger = _logConfig.GetLogger() - _sync = New ActiveDirectoryInterface(_logConfig) + _firebird = New Firebird(_logConfig, "172.24.12.41", "172.24.12.41:E:\DB\Firebird\Databases\DD_ICM.fdb", "sysdba", "dd") + + _sync = New ActiveDirectoryInterface(_logConfig, _firebird) _sync.Authenticate() + Dim oType As Type = Type.GetType("DigitalData.Modules.Jobs.ADSyncJob") + Activator.CreateInstance(oType) + End Sub + + Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click + Dim oGroup As String = ListBox1.SelectedItem + _sync.SyncUsersForGroup(oGroup) + + '' STEP 1: Get all Groups that have AD_SYNC enabled + 'Dim oSQL As String = $"SELECT RECORD_ID, GROUP_NAME FROM VWICM_GROUP WHERE AD_SYNC = 1" + 'Dim oResult As DataTable = _firebird.GetDatatable(oSQL) + + + 'For Each oRow As DataRow In oResult.Rows + ' Dim oGroupName As String = oRow.Item("GROUP_NAME") + ' Dim oGroupId As Int64 = oRow.Item("RECORD_ID") + + ' ' STEP 2: List all Users for that Group + ' Dim oUsers As List(Of ADUser) = _sync.ListUsers(oGroupName) + + ' For Each oUser In oUsers + ' ' STEP 3: Check if user exists in DB + ' oSQL = $"SELECT FNICM_GET_RECORD4SYSKEY('{oUser.samAccountName}','001-USRNAME') from RDB$DATABASE" + ' Dim oResult2 = _firebird.GetScalarValue(oSQL) + ' Dim oUserId + + ' ' STEP 3.A: If user does not exists, create and add to group + ' If IsDBNull(oResult2) Then + ' 'Create user + ' oSQL = $"SELECT FNICM_RADM_NEW_USER('{oUser.GivenName}', '{oUser.Surname}', '{oUser.samAccountName}', 'AD-Sync') from RDB$DATABASE" + ' Dim oResult3 = _firebird.GetScalarValue(oSQL) + ' oUserId = oResult3 + ' Else + ' oUserId = oResult2 + ' End If + + ' ' STEP 4: Add user to group + ' oSQL = $"SELECT FNICM_RADM_NEW_USER2GROUP({oUserId}, {oGroupId}, 'AD-Sync') from RDB$DATABASE" + ' Dim oResult4 = _firebird.GetScalarValue(oSQL) + ' Next + 'Next + End Sub + + Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click Dim oGroups = _sync.ListGroups() For Each oGroup In oGroups - ListBox1.Items.Add(oGroup.SAMAccountName) + ListBox1.Items.Add(oGroup.Name) Next End Sub + + Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click + Dim oGroup As String = ListBox1.SelectedItem + Dim oUsers = _sync.ListUsers(oGroup) + + ListBox2.Items.Clear() + For Each oUser In oUsers + ListBox2.Items.Add(oUser.samAccountName) + Next + + If oUsers.Count = 0 Then + ListBox2.Items.Add("No users found ¯\_(ツ)_/¯") + End If + End Sub End Class diff --git a/DDMonorepo.sln b/DDMonorepo.sln index f75b5acb..6c269470 100644 --- a/DDMonorepo.sln +++ b/DDMonorepo.sln @@ -69,6 +69,8 @@ Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "License", "Modules.License\ EndProject Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "ADSyncTest", "ADSyncTest\ADSyncTest.vbproj", "{7386AB04-DF8D-4DFB-809D-1FAC8212CB7E}" EndProject +Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "JobRunner", "JobRunner\JobRunner.vbproj", "{59461E98-A5AF-438C-A651-5021ACAE82AD}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -171,6 +173,10 @@ Global {7386AB04-DF8D-4DFB-809D-1FAC8212CB7E}.Debug|Any CPU.Build.0 = Debug|Any CPU {7386AB04-DF8D-4DFB-809D-1FAC8212CB7E}.Release|Any CPU.ActiveCfg = Release|Any CPU {7386AB04-DF8D-4DFB-809D-1FAC8212CB7E}.Release|Any CPU.Build.0 = Release|Any CPU + {59461E98-A5AF-438C-A651-5021ACAE82AD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {59461E98-A5AF-438C-A651-5021ACAE82AD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {59461E98-A5AF-438C-A651-5021ACAE82AD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {59461E98-A5AF-438C-A651-5021ACAE82AD}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -200,6 +206,7 @@ Global {CBE9322E-67A1-4CC5-B25F-4A1B4C9FC55C} = {7AF3F9C2-C939-4A08-95C1-0453207E298A} {5EBACBFA-F11A-4BBF-8D02-91461F2293ED} = {3E2008C8-27B1-41DD-9B1A-0C4029F6AECC} {7386AB04-DF8D-4DFB-809D-1FAC8212CB7E} = {8FFE925E-8B84-45F1-93CB-32B1C96F41EB} + {59461E98-A5AF-438C-A651-5021ACAE82AD} = {7AF3F9C2-C939-4A08-95C1-0453207E298A} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {C1BE4090-A0FD-48AF-86CB-39099D14B286} diff --git a/DDZUGFeRDService/ZUGFeRDService.vb b/DDZUGFeRDService/ZUGFeRDService.vb index c93dc77f..ab68a822 100644 --- a/DDZUGFeRDService/ZUGFeRDService.vb +++ b/DDZUGFeRDService/ZUGFeRDService.vb @@ -1,6 +1,7 @@ Imports System.IO Imports DigitalData.Modules.Database Imports DigitalData.Modules.Logging +Imports DigitalData.Modules.Logging.LogConfig Public Class ZUGFeRDService Private _logConfig As LogConfig @@ -10,7 +11,7 @@ Public Class ZUGFeRDService Private _threadRunner As ThreadRunner Protected Overrides Sub OnStart(ByVal args() As String) - _logConfig = New LogConfig(LogConfig.PathType.CustomPath, Path.Combine(My.Application.Info.DirectoryPath, "Log")) + _logConfig = New LogConfig(PathType.CustomPath, Path.Combine(My.Application.Info.DirectoryPath, "Log")) _logConfig.Debug = True _logger = _logConfig.GetLogger() _logger.Info($"{My.Settings.SERVICE_NAME} is starting.") diff --git a/EDMI_ClientSuite/ClassService.vb b/EDMI_ClientSuite/ClassService.vb index 97432ea7..2d353f5d 100644 --- a/EDMI_ClientSuite/ClassService.vb +++ b/EDMI_ClientSuite/ClassService.vb @@ -1,7 +1,7 @@ Imports System.ServiceModel Imports System.ServiceModel.Channels Imports DigitalData.Modules.Logging -Imports DigitalData.Modules.EDMIFileOps.EDMIServiceReference +Imports DigitalData.Modules.EDMIAPI.EDMIServiceReference Imports DigitalData.GUIs.ClientSuite.Base Public Class ClassService diff --git a/EDMI_ClientSuite/ClassTimer.vb b/EDMI_ClientSuite/ClassTimer.vb index c415b64e..18da52d0 100644 --- a/EDMI_ClientSuite/ClassTimer.vb +++ b/EDMI_ClientSuite/ClassTimer.vb @@ -2,7 +2,7 @@ Imports System.Threading Imports System.Timers Imports DigitalData.GUIs.ClientSuite.Base -Imports DigitalData.Modules.EDMIFileOps.EDMIServiceReference +Imports DigitalData.Modules.EDMIAPI.EDMIServiceReference Imports DigitalData.Modules.Logging Public Class ClassTimer diff --git a/EDMI_ClientSuite/Common/ClassCommonCommands.vb b/EDMI_ClientSuite/Common/ClassCommonCommands.vb index 8c95268d..cfdc100f 100644 --- a/EDMI_ClientSuite/Common/ClassCommonCommands.vb +++ b/EDMI_ClientSuite/Common/ClassCommonCommands.vb @@ -1,5 +1,5 @@ Imports DigitalData.Modules.Logging -Imports DigitalData.Modules.EDMIFileOps.EDMIServiceReference +Imports DigitalData.Modules.EDMIAPI.EDMIServiceReference Public Class ClassCommonCommands Private _LogConfig As LogConfig diff --git a/EDMI_ClientSuite/FormDesigner/frmFormDesigner.vb b/EDMI_ClientSuite/FormDesigner/frmFormDesigner.vb index 41522de0..26b70dad 100644 --- a/EDMI_ClientSuite/FormDesigner/frmFormDesigner.vb +++ b/EDMI_ClientSuite/FormDesigner/frmFormDesigner.vb @@ -126,7 +126,7 @@ Public Class frmFormDesigner Dim oLayoutItem As LayoutControlItem = DirectCast(sender, LayoutControlItem) Dim oSelectedControl As BaseEdit = oLayoutItem.Control - Dim oMetadata As Metadata + Dim oMetadata As New Metadata ' Don't load properties for layout items like splitters, separators, etc. If oLayoutItem.Control Is Nothing Then diff --git a/EDMI_ClientSuite/MyApplication.vb b/EDMI_ClientSuite/MyApplication.vb index 15d6aa57..bb071cae 100644 --- a/EDMI_ClientSuite/MyApplication.vb +++ b/EDMI_ClientSuite/MyApplication.vb @@ -2,7 +2,7 @@ Imports System.Threading Imports DigitalData.Modules.Config Imports DigitalData.Modules.Logging -Imports DigitalData.Modules.EDMIFileOps.EDMIServiceReference +Imports DigitalData.Modules.EDMIAPI.EDMIServiceReference Namespace My ''' diff --git a/EDMI_ClientSuite/_TEST/frmFileTest.vb b/EDMI_ClientSuite/_TEST/frmFileTest.vb index ed8ab66b..13aaf27c 100644 --- a/EDMI_ClientSuite/_TEST/frmFileTest.vb +++ b/EDMI_ClientSuite/_TEST/frmFileTest.vb @@ -1,5 +1,5 @@ Imports System.IO -Imports DigitalData.Modules.EDMIFileOps +Imports DigitalData.Modules.EDMIAPI Imports DigitalData.Modules.Filesystem Imports DigitalData.Modules.Logging diff --git a/EDMI_ClientSuite/frmSplash.vb b/EDMI_ClientSuite/frmSplash.vb index ffe23b80..4b59fbcd 100644 --- a/EDMI_ClientSuite/frmSplash.vb +++ b/EDMI_ClientSuite/frmSplash.vb @@ -2,7 +2,7 @@ Imports System.ServiceModel Imports System.Threading Imports DigitalData.Modules.Logging -Imports DigitalData.Modules.EDMIFileOps.EDMIServiceReference +Imports DigitalData.Modules.EDMIAPI.EDMIServiceReference Public NotInheritable Class frmSplash Private _Worker As New BackgroundWorker() diff --git a/EDMI_FILE_OPs/Connected Services/EDMIServiceReference/DigitalData.Modules.EDMIFileOps.EDMIServiceReference.DocumentResult.datasource b/EDMI_FILE_OPs/Connected Services/EDMIServiceReference/DigitalData.Modules.EDMIAPI.EDMIServiceReference.DocumentResult.datasource similarity index 65% rename from EDMI_FILE_OPs/Connected Services/EDMIServiceReference/DigitalData.Modules.EDMIFileOps.EDMIServiceReference.DocumentResult.datasource rename to EDMI_FILE_OPs/Connected Services/EDMIServiceReference/DigitalData.Modules.EDMIAPI.EDMIServiceReference.DocumentResult.datasource index f6bab7be..7c84b32e 100644 --- a/EDMI_FILE_OPs/Connected Services/EDMIServiceReference/DigitalData.Modules.EDMIFileOps.EDMIServiceReference.DocumentResult.datasource +++ b/EDMI_FILE_OPs/Connected Services/EDMIServiceReference/DigitalData.Modules.EDMIAPI.EDMIServiceReference.DocumentResult.datasource @@ -6,5 +6,5 @@ cause the file to be unrecognizable by the program. --> - DigitalData.Modules.EDMIFileOps.EDMIServiceReference.DocumentResult, Connected Services.EDMIServiceReference.Reference.vb.dll, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + DigitalData.Modules.EDMIAPI.EDMIServiceReference.DocumentResult \ No newline at end of file diff --git a/EDMI_FILE_OPs/Connected Services/EDMIServiceReference/DigitalData.Modules.EDMIFileOps.EDMIServiceReference.IndexResult.datasource b/EDMI_FILE_OPs/Connected Services/EDMIServiceReference/DigitalData.Modules.EDMIAPI.EDMIServiceReference.IndexResult.datasource similarity index 66% rename from EDMI_FILE_OPs/Connected Services/EDMIServiceReference/DigitalData.Modules.EDMIFileOps.EDMIServiceReference.IndexResult.datasource rename to EDMI_FILE_OPs/Connected Services/EDMIServiceReference/DigitalData.Modules.EDMIAPI.EDMIServiceReference.IndexResult.datasource index 2a2da06e..00a7860a 100644 --- a/EDMI_FILE_OPs/Connected Services/EDMIServiceReference/DigitalData.Modules.EDMIFileOps.EDMIServiceReference.IndexResult.datasource +++ b/EDMI_FILE_OPs/Connected Services/EDMIServiceReference/DigitalData.Modules.EDMIAPI.EDMIServiceReference.IndexResult.datasource @@ -6,5 +6,5 @@ cause the file to be unrecognizable by the program. --> - DigitalData.Modules.EDMIFileOps.EDMIServiceReference.IndexResult, Connected Services.EDMIServiceReference.Reference.vb.dll, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + DigitalData.Modules.EDMIAPI.EDMIServiceReference.IndexResult \ No newline at end of file diff --git a/EDMI_FILE_OPs/Connected Services/EDMIServiceReference/DigitalData.Modules.EDMIFileOps.EDMIServiceReference.NonQueryResult.datasource b/EDMI_FILE_OPs/Connected Services/EDMIServiceReference/DigitalData.Modules.EDMIAPI.EDMIServiceReference.NonQueryResult.datasource similarity index 65% rename from EDMI_FILE_OPs/Connected Services/EDMIServiceReference/DigitalData.Modules.EDMIFileOps.EDMIServiceReference.NonQueryResult.datasource rename to EDMI_FILE_OPs/Connected Services/EDMIServiceReference/DigitalData.Modules.EDMIAPI.EDMIServiceReference.NonQueryResult.datasource index f729e1d8..6380297c 100644 --- a/EDMI_FILE_OPs/Connected Services/EDMIServiceReference/DigitalData.Modules.EDMIFileOps.EDMIServiceReference.NonQueryResult.datasource +++ b/EDMI_FILE_OPs/Connected Services/EDMIServiceReference/DigitalData.Modules.EDMIAPI.EDMIServiceReference.NonQueryResult.datasource @@ -6,5 +6,5 @@ cause the file to be unrecognizable by the program. --> - DigitalData.Modules.EDMIFileOps.EDMIServiceReference.NonQueryResult, Connected Services.EDMIServiceReference.Reference.vb.dll, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + DigitalData.Modules.EDMIAPI.EDMIServiceReference.NonQueryResult \ No newline at end of file diff --git a/EDMI_FILE_OPs/Connected Services/EDMIServiceReference/DigitalData.Modules.EDMIFileOps.EDMIServiceReference.ScalarResult.datasource b/EDMI_FILE_OPs/Connected Services/EDMIServiceReference/DigitalData.Modules.EDMIAPI.EDMIServiceReference.ScalarResult.datasource similarity index 66% rename from EDMI_FILE_OPs/Connected Services/EDMIServiceReference/DigitalData.Modules.EDMIFileOps.EDMIServiceReference.ScalarResult.datasource rename to EDMI_FILE_OPs/Connected Services/EDMIServiceReference/DigitalData.Modules.EDMIAPI.EDMIServiceReference.ScalarResult.datasource index 7a412454..d2434d7c 100644 --- a/EDMI_FILE_OPs/Connected Services/EDMIServiceReference/DigitalData.Modules.EDMIFileOps.EDMIServiceReference.ScalarResult.datasource +++ b/EDMI_FILE_OPs/Connected Services/EDMIServiceReference/DigitalData.Modules.EDMIAPI.EDMIServiceReference.ScalarResult.datasource @@ -6,5 +6,5 @@ cause the file to be unrecognizable by the program. --> - DigitalData.Modules.EDMIFileOps.EDMIServiceReference.ScalarResult, Connected Services.EDMIServiceReference.Reference.vb.dll, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + DigitalData.Modules.EDMIAPI.EDMIServiceReference.ScalarResult \ No newline at end of file diff --git a/EDMI_FILE_OPs/Connected Services/EDMIServiceReference/DigitalData.Modules.EDMIFileOps.EDMIServiceReference.TableResult.datasource b/EDMI_FILE_OPs/Connected Services/EDMIServiceReference/DigitalData.Modules.EDMIAPI.EDMIServiceReference.TableResult.datasource similarity index 66% rename from EDMI_FILE_OPs/Connected Services/EDMIServiceReference/DigitalData.Modules.EDMIFileOps.EDMIServiceReference.TableResult.datasource rename to EDMI_FILE_OPs/Connected Services/EDMIServiceReference/DigitalData.Modules.EDMIAPI.EDMIServiceReference.TableResult.datasource index afc8fe42..54940eb0 100644 --- a/EDMI_FILE_OPs/Connected Services/EDMIServiceReference/DigitalData.Modules.EDMIFileOps.EDMIServiceReference.TableResult.datasource +++ b/EDMI_FILE_OPs/Connected Services/EDMIServiceReference/DigitalData.Modules.EDMIAPI.EDMIServiceReference.TableResult.datasource @@ -6,5 +6,5 @@ cause the file to be unrecognizable by the program. --> - DigitalData.Modules.EDMIFileOps.EDMIServiceReference.TableResult, Connected Services.EDMIServiceReference.Reference.vb.dll, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + DigitalData.Modules.EDMIAPI.EDMIServiceReference.TableResult \ No newline at end of file diff --git a/EDMI_FILE_OPs/Document.vb b/EDMI_FILE_OPs/Document.vb index 6224a3c5..bcb4fcab 100644 --- a/EDMI_FILE_OPs/Document.vb +++ b/EDMI_FILE_OPs/Document.vb @@ -1,5 +1,5 @@ Imports DigitalData.Modules.Logging -Imports DigitalData.Modules.EDMIFileOps.EDMIServiceReference +Imports DigitalData.Modules.EDMIAPI.EDMIServiceReference Imports System.ServiceModel Imports System.IO diff --git a/EDMI_FILE_OPs/EDMIAPI.vbproj b/EDMI_FILE_OPs/EDMIAPI.vbproj index 5cbfc34f..262e4784 100644 --- a/EDMI_FILE_OPs/EDMIAPI.vbproj +++ b/EDMI_FILE_OPs/EDMIAPI.vbproj @@ -6,8 +6,8 @@ AnyCPU {5B1171DC-FFFE-4813-A20D-786AAE47B320} Library - DigitalData.Modules.EDMIFileOps - DigitalData.Modules.EDMIFileOps + DigitalData.Modules.EDMIAPI + DigitalData.Modules.EDMIAPI 512 Windows v4.6.1 @@ -18,7 +18,7 @@ true true bin\Debug\ - DigitalData.Modules.EDMIFileOps.xml + DigitalData.Modules.EDMIAPI.xml 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 @@ -27,7 +27,7 @@ true true bin\Release\ - DigitalData.Modules.EDMIFileOps.xml + DigitalData.Modules.EDMIAPI.xml 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 @@ -106,19 +106,19 @@ - + Reference.svcmap - + Reference.svcmap - + Reference.svcmap - + Reference.svcmap - + Reference.svcmap diff --git a/EDMI_FILE_OPs/My Project/Resources.Designer.vb b/EDMI_FILE_OPs/My Project/Resources.Designer.vb index 89eb3db3..d44fe572 100644 --- a/EDMI_FILE_OPs/My Project/Resources.Designer.vb +++ b/EDMI_FILE_OPs/My Project/Resources.Designer.vb @@ -39,7 +39,7 @@ Namespace My.Resources Friend ReadOnly Property ResourceManager() As Global.System.Resources.ResourceManager Get If Object.ReferenceEquals(resourceMan, Nothing) Then - Dim temp As Global.System.Resources.ResourceManager = New Global.System.Resources.ResourceManager("DigitalData.Modules.EDMIFileOps.Resources", GetType(Resources).Assembly) + Dim temp As Global.System.Resources.ResourceManager = New Global.System.Resources.ResourceManager("DigitalData.Modules.EDMIAPI.Resources", GetType(Resources).Assembly) resourceMan = temp End If Return resourceMan diff --git a/EDMI_FILE_OPs/My Project/Settings.Designer.vb b/EDMI_FILE_OPs/My Project/Settings.Designer.vb index b45a0ad8..9950efab 100644 --- a/EDMI_FILE_OPs/My Project/Settings.Designer.vb +++ b/EDMI_FILE_OPs/My Project/Settings.Designer.vb @@ -64,9 +64,9 @@ Namespace My Friend Module MySettingsProperty _ - Friend ReadOnly Property Settings() As Global.DigitalData.Modules.EDMIFileOps.My.MySettings + Friend ReadOnly Property Settings() As Global.DigitalData.Modules.EDMIAPI.My.MySettings Get - Return Global.DigitalData.Modules.EDMIFileOps.My.MySettings.Default + Return Global.DigitalData.Modules.EDMIAPI.My.MySettings.Default End Get End Property End Module diff --git a/JobRunner/App.config b/JobRunner/App.config new file mode 100644 index 00000000..f6c972d9 --- /dev/null +++ b/JobRunner/App.config @@ -0,0 +1,42 @@ + + + + +
+ + + + + + + + + DDJobRunner + + + Digital Data Job Runner + + + False + + + 1,2,3,4,5,6,7,8,9,10 + + + + + + + + + + + + + + + 120 + + + + \ No newline at end of file diff --git a/JobRunner/JobRunner.vb b/JobRunner/JobRunner.vb new file mode 100644 index 00000000..e6c7a376 --- /dev/null +++ b/JobRunner/JobRunner.vb @@ -0,0 +1,74 @@ +Imports System.ComponentModel +Imports System.Timers +Imports DigitalData.Modules.Database +Imports DigitalData.Modules.Jobs +Imports DigitalData.Modules.Logging + +Public Class JobRunner + Private WithEvents _workerThread As BackgroundWorker + Private WithEvents _workerTimer As Timer + + Private _interval As Long + Private _logConfig As LogConfig + Private _logger As Logger + Private _firebird As Firebird + + Public Sub New(LogConfig As LogConfig, Firebird As Firebird, Interval As Long) + _logConfig = LogConfig + _logger = _logConfig.GetLogger() + _firebird = Firebird + _interval = Interval + + _workerTimer = New Timer() + _workerThread = New BackgroundWorker() With { + .WorkerReportsProgress = False, + .WorkerSupportsCancellation = True + } + End Sub + + Public Sub Start() + _workerTimer.Interval = _interval * 1000 + _workerTimer.Start() + _logger.Debug("JobRunner started with {0}s Interval.", _interval) + End Sub + + Public Sub [Stop]() + Try + If _workerThread.IsBusy Then + _workerThread.CancelAsync() + _logger.Debug("Background Worker cancelled.") + End If + _workerTimer.Stop() + _logger.Debug("Background Worker stopped.") + Catch ex As Exception + _logger.Error(ex) + End Try + End Sub + + Private Sub TimerElapsed(sender As Object, e As ElapsedEventArgs) Handles _workerTimer.Elapsed + If Not _workerThread.IsBusy Then + _workerThread.RunWorkerAsync() + Else + _logger.Warn("Background Worker is busy") + End If + End Sub + + Private Sub DoWork(sender As Object, e As DoWorkEventArgs) Handles _workerThread.DoWork + Try + Dim args As WorkerArgs = e.Argument + + _logger.Debug("Background worker running..") + + ' TODO: WORK + 'Dim job As New ImportZUGFeRDFiles(_logConfig, _firebird) + 'job.Start(args) + Catch ex As Exception + _logger.Warn("Background worker failed!") + _logger.Error(ex) + End Try + End Sub + + Private Sub WorkCompleted(sender As Object, e As RunWorkerCompletedEventArgs) Handles _workerThread.RunWorkerCompleted + _logger.Debug("Background worker completed!") + End Sub +End Class diff --git a/JobRunner/JobRunner.vbproj b/JobRunner/JobRunner.vbproj new file mode 100644 index 00000000..6a0e0ea7 --- /dev/null +++ b/JobRunner/JobRunner.vbproj @@ -0,0 +1,156 @@ + + + + + Debug + AnyCPU + {59461E98-A5AF-438C-A651-5021ACAE82AD} + WinExe + DigitalData.Services.JobRunner.WindowsService + DigitalData.Services.JobRunner + DigitalData.Services.JobRunner + 512 + Console + v4.6.1 + true + + + AnyCPU + true + full + true + true + bin\Debug\ + DigitalData.Services.JobRunner.xml + 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 + + + AnyCPU + pdbonly + false + true + true + bin\Release\ + DigitalData.Services.JobRunner.xml + 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 + + + On + + + Binary + + + Off + + + On + + + + + + + + ..\LookupGrid\obj\Debug\DigitalData.Controls.LookupGrid.dll + + + + ..\packages\NLog.4.5.11\lib\net45\NLog.dll + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + True + Application.myapp + + + Component + + + Component + + + WindowsService.vb + + + + True + True + Resources.resx + + + True + Settings.settings + True + + + + + VbMyResourcesResXFileCodeGenerator + Resources.Designer.vb + My.Resources + Designer + + + WindowsService.vb + + + + + MyApplicationCodeGenerator + Application.Designer.vb + + + SettingsSingleFileGenerator + My + Settings.Designer.vb + + + + + + + {39ec839a-3c30-4922-a41e-6b09d1dde5c3} + Jobs + + + {EAF0EA75-5FA7-485D-89C7-B2D843B03A96} + Database + + + {903B2D7D-3B80-4BE9-8713-7447B704E1B0} + Logging + + + + \ No newline at end of file diff --git a/JobRunner/My Project/Application.Designer.vb b/JobRunner/My Project/Application.Designer.vb new file mode 100644 index 00000000..8ab460ba --- /dev/null +++ b/JobRunner/My Project/Application.Designer.vb @@ -0,0 +1,13 @@ +'------------------------------------------------------------------------------ +' +' Dieser Code wurde von einem Tool generiert. +' Laufzeitversion:4.0.30319.42000 +' +' Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn +' der Code erneut generiert wird. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + diff --git a/JobRunner/My Project/Application.myapp b/JobRunner/My Project/Application.myapp new file mode 100644 index 00000000..602de37e --- /dev/null +++ b/JobRunner/My Project/Application.myapp @@ -0,0 +1,10 @@ + + + false + false + 0 + true + 0 + 3 + true + diff --git a/JobRunner/My Project/AssemblyInfo.vb b/JobRunner/My Project/AssemblyInfo.vb new file mode 100644 index 00000000..df2bc85e --- /dev/null +++ b/JobRunner/My Project/AssemblyInfo.vb @@ -0,0 +1,35 @@ +Imports System +Imports System.Reflection +Imports System.Runtime.InteropServices + +' Allgemeine Informationen über eine Assembly werden über die folgenden +' Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern, +' die einer Assembly zugeordnet sind. + +' Werte der Assemblyattribute überprüfen + + + + + + + + + + +'Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird. + + +' Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten: +' +' Hauptversion +' Nebenversion +' Buildnummer +' Revision +' +' Sie können alle Werte angeben oder Standardwerte für die Build- und Revisionsnummern verwenden, +' übernehmen, indem Sie "*" eingeben: +' + + + diff --git a/JobRunner/My Project/Resources.Designer.vb b/JobRunner/My Project/Resources.Designer.vb new file mode 100644 index 00000000..7fb8b450 --- /dev/null +++ b/JobRunner/My Project/Resources.Designer.vb @@ -0,0 +1,63 @@ +'------------------------------------------------------------------------------ +' +' Dieser Code wurde von einem Tool generiert. +' Laufzeitversion:4.0.30319.42000 +' +' Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn +' der Code erneut generiert wird. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + +Imports System + +Namespace My.Resources + + 'Diese Klasse wurde von der StronglyTypedResourceBuilder automatisch generiert + '-Klasse über ein Tool wie ResGen oder Visual Studio automatisch generiert. + 'Um einen Member hinzuzufügen oder zu entfernen, bearbeiten Sie die .ResX-Datei und führen dann ResGen + 'mit der /str-Option erneut aus, oder Sie erstellen Ihr VS-Projekt neu. + ''' + ''' Eine stark typisierte Ressourcenklasse zum Suchen von lokalisierten Zeichenfolgen usw. + ''' + _ + Friend Module Resources + + Private resourceMan As Global.System.Resources.ResourceManager + + Private resourceCulture As Global.System.Globalization.CultureInfo + + ''' + ''' Gibt die zwischengespeicherte ResourceManager-Instanz zurück, die von dieser Klasse verwendet wird. + ''' + _ + Friend ReadOnly Property ResourceManager() As Global.System.Resources.ResourceManager + Get + If Object.ReferenceEquals(resourceMan, Nothing) Then + Dim temp As Global.System.Resources.ResourceManager = New Global.System.Resources.ResourceManager("DigitalData.Services.JobRunner.Resources", GetType(Resources).Assembly) + resourceMan = temp + End If + Return resourceMan + End Get + End Property + + ''' + ''' Überschreibt die CurrentUICulture-Eigenschaft des aktuellen Threads für alle + ''' Ressourcenzuordnungen, die diese stark typisierte Ressourcenklasse verwenden. + ''' + _ + Friend Property Culture() As Global.System.Globalization.CultureInfo + Get + Return resourceCulture + End Get + Set + resourceCulture = value + End Set + End Property + End Module +End Namespace diff --git a/JobRunner/My Project/Resources.resx b/JobRunner/My Project/Resources.resx new file mode 100644 index 00000000..af7dbebb --- /dev/null +++ b/JobRunner/My Project/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/JobRunner/My Project/Settings.Designer.vb b/JobRunner/My Project/Settings.Designer.vb new file mode 100644 index 00000000..501da1af --- /dev/null +++ b/JobRunner/My Project/Settings.Designer.vb @@ -0,0 +1,154 @@ +'------------------------------------------------------------------------------ +' +' Dieser Code wurde von einem Tool generiert. +' Laufzeitversion:4.0.30319.42000 +' +' Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn +' der Code erneut generiert wird. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + + +Namespace My + + _ + Partial Friend NotInheritable Class MySettings + Inherits Global.System.Configuration.ApplicationSettingsBase + + Private Shared defaultInstance As MySettings = CType(Global.System.Configuration.ApplicationSettingsBase.Synchronized(New MySettings()),MySettings) + +#Region "Automatische My.Settings-Speicherfunktion" +#If _MyType = "WindowsForms" Then + Private Shared addedHandler As Boolean + + Private Shared addedHandlerLockObject As New Object + + _ + Private Shared Sub AutoSaveSettings(sender As Global.System.Object, e As Global.System.EventArgs) + If My.Application.SaveMySettingsOnExit Then + My.Settings.Save() + End If + End Sub +#End If +#End Region + + Public Shared ReadOnly Property [Default]() As MySettings + Get + +#If _MyType = "WindowsForms" Then + If Not addedHandler Then + SyncLock addedHandlerLockObject + If Not addedHandler Then + AddHandler My.Application.Shutdown, AddressOf AutoSaveSettings + addedHandler = True + End If + End SyncLock + End If +#End If + Return defaultInstance + End Get + End Property + + _ + Public ReadOnly Property SERVICE_NAME() As String + Get + Return CType(Me("SERVICE_NAME"),String) + End Get + End Property + + _ + Public ReadOnly Property SERVICE_DISPLAY_NAME() As String + Get + Return CType(Me("SERVICE_DISPLAY_NAME"),String) + End Get + End Property + + _ + Public ReadOnly Property JOB_ADSYNC_ENABLED() As Boolean + Get + Return CType(Me("JOB_ADSYNC_ENABLED"),Boolean) + End Get + End Property + + _ + Public ReadOnly Property JOB_ADSYNC_INTERVAL() As String + Get + Return CType(Me("JOB_ADSYNC_INTERVAL"),String) + End Get + End Property + + _ + Public ReadOnly Property DB_DATASOURCE() As String + Get + Return CType(Me("DB_DATASOURCE"),String) + End Get + End Property + + _ + Public ReadOnly Property DB_DATABASE() As String + Get + Return CType(Me("DB_DATABASE"),String) + End Get + End Property + + _ + Public ReadOnly Property DB_USER() As String + Get + Return CType(Me("DB_USER"),String) + End Get + End Property + + _ + Public ReadOnly Property DB_PASSWORD() As String + Get + Return CType(Me("DB_PASSWORD"),String) + End Get + End Property + + _ + Public ReadOnly Property JOB_INTERVAL() As Long + Get + Return CType(Me("JOB_INTERVAL"),Long) + End Get + End Property + End Class +End Namespace + +Namespace My + + _ + Friend Module MySettingsProperty + + _ + Friend ReadOnly Property Settings() As Global.DigitalData.Services.JobRunner.My.MySettings + Get + Return Global.DigitalData.Services.JobRunner.My.MySettings.Default + End Get + End Property + End Module +End Namespace diff --git a/JobRunner/My Project/Settings.settings b/JobRunner/My Project/Settings.settings new file mode 100644 index 00000000..ccd102fc --- /dev/null +++ b/JobRunner/My Project/Settings.settings @@ -0,0 +1,33 @@ + + + + + + DDJobRunner + + + Digital Data Job Runner + + + False + + + 1,2,3,4,5,6,7,8,9,10 + + + + + + + + + + + + + + + 120 + + + \ No newline at end of file diff --git a/JobRunner/ProjectInstaller.vb b/JobRunner/ProjectInstaller.vb new file mode 100644 index 00000000..e066985c --- /dev/null +++ b/JobRunner/ProjectInstaller.vb @@ -0,0 +1,24 @@ +Imports System.ComponentModel +Imports System.Configuration.Install +Imports System.ServiceProcess + + +Public Class ProjectInstaller + Inherits Installer + + Private ReadOnly process As ServiceProcessInstaller + Private ReadOnly components As IContainer + Private ReadOnly service As ServiceInstaller + + Public Sub New() + process = New ServiceProcessInstaller With { + .Account = ServiceAccount.LocalSystem + } + service = New ServiceInstaller With { + .ServiceName = My.Settings.SERVICE_NAME, + .DisplayName = My.Settings.SERVICE_DISPLAY_NAME + } + Installers.Add(process) + Installers.Add(service) + End Sub +End Class diff --git a/JobRunner/WindowsService.Designer.vb b/JobRunner/WindowsService.Designer.vb new file mode 100644 index 00000000..fb0f2814 --- /dev/null +++ b/JobRunner/WindowsService.Designer.vb @@ -0,0 +1,50 @@ +Imports System.ServiceProcess + + +Partial Class WindowsService + Inherits System.ServiceProcess.ServiceBase + + 'UserService überschreibt den Löschvorgang, um die Komponentenliste zu bereinigen. + + Protected Overrides Sub Dispose(ByVal disposing As Boolean) + Try + If disposing AndAlso components IsNot Nothing Then + components.Dispose() + End If + Finally + MyBase.Dispose(disposing) + End Try + End Sub + + ' Der Haupteinstiegspunkt für den Prozess + + + Shared Sub Main() + Dim ServicesToRun() As System.ServiceProcess.ServiceBase + + ' Innerhalb eines Prozesses können mehrere NT-Dienste ausgeführt werden. Um einen + ' weiteren Dienst zu diesem Prozess hinzuzufügen, ändern Sie die folgende Zeile, + ' um ein zweites Dienstobjekt zu erstellen. Zum Beispiel + ' + ' ServicesToRun = New System.ServiceProcess.ServiceBase () {New Service1, New MySecondUserService} + ' + ServicesToRun = New System.ServiceProcess.ServiceBase() {New WindowsService} + + System.ServiceProcess.ServiceBase.Run(ServicesToRun) + End Sub + + 'Wird vom Komponenten-Designer benötigt. + Private components As System.ComponentModel.IContainer + + ' Hinweis: Die folgende Prozedur ist für den Komponenten-Designer erforderlich. + ' Das Bearbeiten ist mit dem Komponenten-Designer möglich. + ' Das Bearbeiten mit dem Code-Editor ist nicht möglich. + + Private Sub InitializeComponent() + ' + 'Service1 + ' + Me.ServiceName = "Service1" + + End Sub +End Class diff --git a/JobRunner/WindowsService.resx b/JobRunner/WindowsService.resx new file mode 100644 index 00000000..e5858cc2 --- /dev/null +++ b/JobRunner/WindowsService.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + False + + \ No newline at end of file diff --git a/JobRunner/WindowsService.vb b/JobRunner/WindowsService.vb new file mode 100644 index 00000000..166892c5 --- /dev/null +++ b/JobRunner/WindowsService.vb @@ -0,0 +1,38 @@ +Imports System.IO +Imports DigitalData.Modules.Database +Imports DigitalData.Modules.Logging +Imports DigitalData.Modules.Logging.LogConfig + +Public Class WindowsService + Private _logConfig As LogConfig + Private _logger As Logger + Private _firebird As Firebird + + Private _jobRunner As JobRunner + + Protected Overrides Sub OnStart(ByVal args() As String) + _logConfig = New LogConfig(PathType.CustomPath, Path.Combine(My.Application.Info.DirectoryPath, "Log")) + _logConfig.Debug = True + _logger = _logConfig.GetLogger() + _logger.Info($"{My.Settings.SERVICE_NAME} is starting.") + + Dim oDataSource As String = My.Settings.DB_DATASOURCE + Dim oDatabase As String = My.Settings.DB_DATABASE + Dim oUser As String = My.Settings.DB_USER + Dim oPassword As String = My.Settings.DB_PASSWORD + Dim oInterval As Long = My.Settings.JOB_INTERVAL + + _firebird = New Firebird(_logConfig, oDataSource, oDatabase, oUser, oPassword) + + Try + _jobRunner = New JobRunner(_logConfig, _firebird, oInterval) + _jobRunner.Start() + Catch ex As Exception + _logger.Error(ex) + End Try + End Sub + + Protected Overrides Sub OnStop() + _logger.Info($"{My.Settings.SERVICE_NAME} is stopping.") + End Sub +End Class diff --git a/JobRunner/packages.config b/JobRunner/packages.config new file mode 100644 index 00000000..f89fa324 --- /dev/null +++ b/JobRunner/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/Jobs/EDMI/ADSync/ADSyncArgs.vb b/Jobs/EDMI/ADSync/ADSyncArgs.vb new file mode 100644 index 00000000..27845e36 --- /dev/null +++ b/Jobs/EDMI/ADSync/ADSyncArgs.vb @@ -0,0 +1,3 @@ +Public Class ADSyncArgs + +End Class diff --git a/Jobs/EDMI/ADSync/ADSyncJob.vb b/Jobs/EDMI/ADSync/ADSyncJob.vb new file mode 100644 index 00000000..fba9ad50 --- /dev/null +++ b/Jobs/EDMI/ADSync/ADSyncJob.vb @@ -0,0 +1,9 @@ +Imports DigitalData.Modules.Jobs + +Public Class ADSyncJob + Implements IJob(Of ADSyncArgs) + + Public Sub Start(Arguments As ADSyncArgs) Implements IJob(Of ADSyncArgs).Start + + End Sub +End Class diff --git a/Jobs/EDMI/ZUGFeRD/EmailData.vb b/Jobs/EDMI/ZUGFeRD/EmailData.vb new file mode 100644 index 00000000..ed37e543 --- /dev/null +++ b/Jobs/EDMI/ZUGFeRD/EmailData.vb @@ -0,0 +1,5 @@ +Public Class EmailData + Public Attachment As String + Public Subject As String + Public From As String +End Class \ No newline at end of file diff --git a/Jobs/EDMI/ZUGFeRD/ImportZUGFeRDFiles.vb b/Jobs/EDMI/ZUGFeRD/ImportZUGFeRDFiles.vb index 0edef0a6..a4e36fbe 100644 --- a/Jobs/EDMI/ZUGFeRD/ImportZUGFeRDFiles.vb +++ b/Jobs/EDMI/ZUGFeRD/ImportZUGFeRDFiles.vb @@ -5,6 +5,7 @@ Imports System.Linq Imports System.Text.RegularExpressions Imports DigitalData.Modules.Database Imports DigitalData.Modules.Interfaces +Imports DigitalData.Modules.Jobs Imports DigitalData.Modules.Jobs.Exceptions Imports DigitalData.Modules.Logging Imports FirebirdSql.Data.FirebirdClient @@ -24,36 +25,6 @@ Public Class ImportZUGFeRDFiles Private _firebird As Firebird Private _filesystem As Filesystem.File - Public Class WorkerArgs - Public WatchDirectories As List(Of String) - Public SuccessDirectory As String - Public ErrorDirectory As String - Public OriginalEmailDirectory As String - Public RejectedEmailDirectory As String - Public PropertyMap As Dictionary(Of String, XmlItemProperty) - - Public Sub New() - WatchDirectories = New List(Of String) - SuccessDirectory = Nothing - ErrorDirectory = Nothing - OriginalEmailDirectory = Nothing - RejectedEmailDirectory = Nothing - PropertyMap = New Dictionary(Of String, XmlItemProperty) - End Sub - End Class - - Public Class EmailData - Public Attachment As String - Public Subject As String - Public From As String - End Class - - Public Class XmlItemProperty - Public TableName As String - Public Description As String - Public IsRequired As Boolean - End Class - Public Sub New(LogConfig As LogConfig, Firebird As Firebird) _logConfig = LogConfig _logger = LogConfig.GetLogger() diff --git a/Jobs/EDMI/ZUGFeRD/WorkerArgs.vb b/Jobs/EDMI/ZUGFeRD/WorkerArgs.vb new file mode 100644 index 00000000..5b9d4393 --- /dev/null +++ b/Jobs/EDMI/ZUGFeRD/WorkerArgs.vb @@ -0,0 +1,19 @@ +Imports System.Collections.Generic + +Public Class WorkerArgs + Public WatchDirectories As List(Of String) + Public SuccessDirectory As String + Public ErrorDirectory As String + Public OriginalEmailDirectory As String + Public RejectedEmailDirectory As String + Public PropertyMap As Dictionary(Of String, XmlItemProperty) + + Public Sub New() + WatchDirectories = New List(Of String) + SuccessDirectory = Nothing + ErrorDirectory = Nothing + OriginalEmailDirectory = Nothing + RejectedEmailDirectory = Nothing + PropertyMap = New Dictionary(Of String, XmlItemProperty) + End Sub +End Class \ No newline at end of file diff --git a/Jobs/EDMI/ZUGFeRD/XmlItemProperty.vb b/Jobs/EDMI/ZUGFeRD/XmlItemProperty.vb new file mode 100644 index 00000000..57e98415 --- /dev/null +++ b/Jobs/EDMI/ZUGFeRD/XmlItemProperty.vb @@ -0,0 +1,5 @@ +Public Class XmlItemProperty + Public TableName As String + Public Description As String + Public IsRequired As Boolean +End Class \ No newline at end of file diff --git a/Jobs/IJob.vb b/Jobs/IJob.vb index cb1aab71..6cd3f6dc 100644 --- a/Jobs/IJob.vb +++ b/Jobs/IJob.vb @@ -1,3 +1,7 @@ Public Interface IJob Sub Start(Arguments As Object) End Interface + +Public Interface IJob(Of T) + Sub Start(Arguments As T) +End Interface diff --git a/Jobs/Jobs.vbproj b/Jobs/Jobs.vbproj index 52d3116f..fc678fc3 100644 --- a/Jobs/Jobs.vbproj +++ b/Jobs/Jobs.vbproj @@ -57,6 +57,10 @@ + + SettingsSingleFileGenerator + Settings.Designer.vb + @@ -78,11 +82,21 @@ + + + + + + + True + True + Settings.settings + diff --git a/Jobs/My Project/Settings.Designer.vb b/Jobs/My Project/Settings.Designer.vb new file mode 100644 index 00000000..b89e781b --- /dev/null +++ b/Jobs/My Project/Settings.Designer.vb @@ -0,0 +1,71 @@ +'------------------------------------------------------------------------------ +' +' Dieser Code wurde von einem Tool generiert. +' Laufzeitversion:4.0.30319.42000 +' +' Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn +' der Code erneut generiert wird. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + + + + _ +Partial Friend NotInheritable Class Settings + Inherits Global.System.Configuration.ApplicationSettingsBase + + Private Shared defaultInstance As Settings = CType(Global.System.Configuration.ApplicationSettingsBase.Synchronized(New Settings()),Settings) + +#Region "Automatische My.Settings-Speicherfunktion" +#If _MyType = "WindowsForms" Then + Private Shared addedHandler As Boolean + + Private Shared addedHandlerLockObject As New Object + + _ + Private Shared Sub AutoSaveSettings(sender As Global.System.Object, e As Global.System.EventArgs) + If My.Application.SaveMySettingsOnExit Then + My.Settings.Save() + End If + End Sub +#End If +#End Region + + Public Shared ReadOnly Property [Default]() As Settings + Get + +#If _MyType = "WindowsForms" Then + If Not addedHandler Then + SyncLock addedHandlerLockObject + If Not addedHandler Then + AddHandler My.Application.Shutdown, AddressOf AutoSaveSettings + addedHandler = True + End If + End SyncLock + End If +#End If + Return defaultInstance + End Get + End Property +End Class + +Namespace My + + _ + Friend Module MySettingsProperty + + _ + Friend ReadOnly Property Settings() As Global.DigitalData.Modules.Jobs.Settings + Get + Return Global.DigitalData.Modules.Jobs.Settings.Default + End Get + End Property + End Module +End Namespace diff --git a/Jobs/My Project/Settings.settings b/Jobs/My Project/Settings.settings new file mode 100644 index 00000000..e69de29b diff --git a/Modules.Interfaces/ActiveDirectoryInterface.vb b/Modules.Interfaces/ActiveDirectoryInterface.vb index 75a724bf..b9549f4a 100644 --- a/Modules.Interfaces/ActiveDirectoryInterface.vb +++ b/Modules.Interfaces/ActiveDirectoryInterface.vb @@ -1,9 +1,12 @@ Imports System.DirectoryServices +Imports System.DirectoryServices.AccountManagement +Imports DigitalData.Modules.Database Imports DigitalData.Modules.Logging Public Class ActiveDirectoryInterface Private _logConfig As LogConfig Private _logger As Logger + Private _firebird As Firebird Private _rootPath As String Private _rootNode As DirectoryEntry @@ -18,9 +21,11 @@ Public Class ActiveDirectoryInterface Private Const NAME = "name" Private Const OBJECTCATEGORY = "objectCategory" - Public Sub New(LogConfig As LogConfig, Optional RootPath As String = Nothing) + Public Sub New(LogConfig As LogConfig, Firebird As Firebird, Optional RootPath As String = Nothing) _logConfig = LogConfig _logger = _logConfig.GetLogger() + _firebird = Firebird + If RootPath Is Nothing Then _rootPath = $"LDAP://{Environment.UserDomainName}" Else @@ -28,25 +33,86 @@ Public Class ActiveDirectoryInterface End If End Sub - Private Function GetRootNode() As DirectoryEntry - Dim oEntry As New DirectoryEntry(_rootPath) With { - .AuthenticationType = AuthenticationTypes.Secure, - .Password = Nothing, - .Username = Nothing - } + Public Function SyncUsersForGroup(GroupName As String) As List(Of ADUser) + Dim oUsers As New List(Of ADUser) + Dim oSyncedUsers As New List(Of ADUser) + Dim oGroupId As Int64 = Nothing - Return oEntry - End Function - Private Function GetRootNode(Username As String, Password As String) As DirectoryEntry - Dim oEntry As New DirectoryEntry(_rootPath) With { - .AuthenticationType = AuthenticationTypes.Secure, - .Password = Username, - .Username = Password - } + Try + _logger.Debug("Fetching users from ActiveDirectory") + oUsers = ListUsers(GroupName) + _logger.Debug("Found {0} users", oUsers.Count) + Catch ex As Exception + _logger.Error(ex) + Return Nothing + End Try - Return oEntry + If oUsers.Count = 0 Then + _logger.Debug("Group {0} does not contain any users.", GroupName) + Return oSyncedUsers + End If + + Try + _logger.Debug("Getting group Id for group {0}", GroupName) + oGroupId = GetGroupId(GroupName) + + + If oGroupId = 0 Then + _logger.Warn("Group {0} does not exist in database. Exiting", GroupName) + Return Nothing + End If + + _logger.Debug("Using group Id {0}", oGroupId) + Catch ex As Exception + _logger.Error(ex) + Return Nothing + End Try + + For Each oUser In oUsers + Dim oUserId As Int64 + Dim oUserExists As Boolean = False + + ' Check if user already exists + Try + _logger.Debug("Checking if user {0} exists", oUser) + oUserId = GetUserId(oUser.samAccountName) + oUserExists = Not IsNothing(oUserId) + _logger.Debug("User {0} exists in database: ", oUser, oUserExists) + Catch ex As Exception + _logger.Error(ex) + _logger.Warn("Could not get UserId for user. Skipping") + Continue For + End Try + + ' I user does not exist, create a new user + Try + If Not oUserExists Then + _logger.Debug("Creating new user for {0}", oUser) + oUserId = CreateUser(oUser) + _logger.Debug("User created with Id {0}", oUserId) + End If + Catch ex As Exception + _logger.Error(ex) + _logger.Warn("Could not create user. Skipping") + Continue For + End Try + + ' Add the user to group + Try + AddUserToGroup(oUserId, oGroupId) + Catch ex As Exception + _logger.Error(ex) + _logger.Warn("Could not add user to group. Skipping") + Continue For + End Try + + oSyncedUsers.Add(oUser) + Next + + Return oSyncedUsers End Function + Public Sub Authenticate() Try Dim oEntry = GetRootNode() @@ -70,19 +136,17 @@ Public Class ActiveDirectoryInterface End Try End Sub - Public Function ListGroups() As List(Of ADGroup) - Return ListGroups(_rootNode) + Public Function ListGroups(Optional Query As String = "(&(objectClass=group) (samAccountName=*))") As List(Of ADGroup) + Return ListGroups(_rootNode, Query) End Function - - Public Function ListGroups(RootNode As DirectoryEntry) As List(Of ADGroup) + Public Function ListGroups(RootNode As DirectoryEntry, Optional Query As String = "(&(objectClass=group) (samAccountName=*))") As List(Of ADGroup) Dim oGroups As New List(Of ADGroup) Try - Dim oFilterQuery As String = "(&(objectClass=group) (samAccountName=*))" Dim oDirectorySearcher As New DirectorySearcher(RootNode) With { .SearchScope = SearchScope.Subtree, .SizeLimit = SEARCH_LIMIT, - .Filter = oFilterQuery + .Filter = Query } Dim oResults As SearchResultCollection = oDirectorySearcher.FindAll() @@ -95,6 +159,144 @@ Public Class ActiveDirectoryInterface End Try End Function + Public Function ListUsers(GroupName As String) As List(Of ADUser) + Dim oUsers As New List(Of ADUser) + + Try + Using oContext As New PrincipalContext(ContextType.Domain) + Using oGroupPrincipal As GroupPrincipal = GroupPrincipal.FindByIdentity(oContext, IdentityType.Name, GroupName) + If oGroupPrincipal Is Nothing Then + _logger.Warn("Group {0} does not exist.", GroupName) + Return oUsers + End If + + Using oMembers = oGroupPrincipal.GetMembers(True) + For Each oMember As Principal In oMembers + If TypeOf oMember Is UserPrincipal Then + Dim oUser As UserPrincipal = DirectCast(oMember, UserPrincipal) + + oUsers.Add(New ADUser() With { + .GUID = oUser.Guid, + .SId = oUser.Sid, + .samAccountName = oUser.SamAccountName, + .Surname = oUser.Surname, + .Middlename = oUser.MiddleName, + .GivenName = oUser.GivenName, + .Email = oUser.EmailAddress + }) + End If + Next + End Using + End Using + End Using + + Return oUsers + Catch ex As Exception + _logger.Error(ex) + Throw ex + End Try + End Function + Public Function ListUsers(GroupNames As List(Of String)) As List(Of ADUser) + Try + Dim oUsers As New List(Of ADUser) + Dim oComparer As New UserEqualityComparer() + + For Each oGroup In GroupNames + Dim oGroupUsers = ListUsers(oGroup) + Dim oNewUsers = oGroupUsers. + Except(oUsers, oComparer). + ToList() + oUsers.AddRange(oNewUsers) + Next + + Return oUsers + Catch ex As Exception + _logger.Error(ex) + Throw ex + End Try + End Function + + Public Function GetGroupId(GroupName As String) As Integer + Try + Dim oSQL As String = $"SELECT FNICM_GET_RECORD4SYSKEY('{GroupName}','002-NAME') from RDB$DATABASE" + Dim oGroupId = _firebird.GetScalarValue(oSQL) + + If IsDBNull(oGroupId) OrElse oGroupId = 0 Then + _logger.Debug("Group {0} not found in database", GroupName) + Return Nothing + End If + + Return oGroupId + Catch ex As Exception + _logger.Error(ex) + Throw ex + End Try + End Function + + Private Function GetUserId(UserName As String) As Integer + Try + Dim oSQL As String = $"SELECT FNICM_GET_RECORD4SYSKEY('{UserName}','001-USRNAME') from RDB$DATABASE" + Dim oResult = _firebird.GetScalarValue(oSQL) + + If IsDBNull(oResult) Then + Return Nothing + End If + + Return oResult + Catch ex As Exception + _logger.Error(ex) + Throw ex + End Try + End Function + + Private Function CreateUser(User As ADUser) As Int64 + Try + Dim oSQL = $"SELECT FNICM_RADM_NEW_USER('{User.GivenName}', '{User.Surname}', '{User.samAccountName}', 'AD-Sync') from RDB$DATABASE" + Dim oUserId As Integer = _firebird.GetScalarValue(oSQL) + + Return oUserId + Catch ex As Exception + _logger.Error(ex) + Throw ex + End Try + End Function + + Private Function AddUserToGroup(UserId As Integer, GroupId As Integer) As Int64 + Try + Dim oSQL = $"SELECT FNICM_RADM_NEW_USER2GROUP({UserId}, {GroupId}, 'AD-Sync') from RDB$DATABASE" + Dim oRecordId = _firebird.GetScalarValue(oSQL) + + If IsDBNull(oRecordId) Then + _logger.Warn("UserId {0} - GroupId {1} relation already exists.", UserId, GroupId) + Return Nothing + End If + + Return oRecordId + Catch ex As Exception + _logger.Error(ex) + Throw ex + End Try + End Function + + Private Function GetRootNode() As DirectoryEntry + Dim oEntry As New DirectoryEntry(_rootPath) With { + .AuthenticationType = AuthenticationTypes.Secure, + .Password = Nothing, + .Username = Nothing + } + + Return oEntry + End Function + Private Function GetRootNode(Username As String, Password As String) As DirectoryEntry + Dim oEntry As New DirectoryEntry(_rootPath) With { + .AuthenticationType = AuthenticationTypes.Secure, + .Password = Username, + .Username = Password + } + + Return oEntry + End Function + Private Function GroupResultsToList(Results As SearchResultCollection) As List(Of ADGroup) Dim oGroups As New List(Of ADGroup) diff --git a/Modules.Interfaces/ActiveDirectoryInterface/ActiveDirectoryUser.vb b/Modules.Interfaces/ActiveDirectoryInterface/ActiveDirectoryUser.vb new file mode 100644 index 00000000..4c4840a7 --- /dev/null +++ b/Modules.Interfaces/ActiveDirectoryInterface/ActiveDirectoryUser.vb @@ -0,0 +1,18 @@ +Imports System.Security.Principal + +Public Class ADUser + Public GUID As Guid + Public SId As SecurityIdentifier + Public samAccountName As String + Public Surname As String + Public GivenName As String + Public Middlename As String + Public Email As String + + Public Overrides Function Equals(obj As Object) As Boolean + Return DirectCast(obj, ADUser).samAccountName + End Function + Public Overrides Function ToString() As String + Return samAccountName + End Function +End Class diff --git a/Modules.Interfaces/ActiveDirectoryInterface/UserEqualityComparer.vb b/Modules.Interfaces/ActiveDirectoryInterface/UserEqualityComparer.vb new file mode 100644 index 00000000..873e05cc --- /dev/null +++ b/Modules.Interfaces/ActiveDirectoryInterface/UserEqualityComparer.vb @@ -0,0 +1,19 @@ +Imports DigitalData.Modules.Interfaces + +Public Class UserEqualityComparer + Implements IEqualityComparer(Of ADUser) + + Public Overloads Function Equals(x As ADUser, y As ADUser) As Boolean Implements IEqualityComparer(Of ADUser).Equals + If ReferenceEquals(x, y) Then Return True + If x Is Nothing Or y Is Nothing Then Return False + + Return x.SId = y.SId + End Function + + Public Overloads Function GetHashCode(obj As ADUser) As Integer Implements IEqualityComparer(Of ADUser).GetHashCode + If obj Is Nothing Then Return 0 + + Dim oHashCode = obj.SId.GetHashCode() + Return oHashCode + End Function +End Class diff --git a/Modules.Interfaces/Interfaces.vbproj b/Modules.Interfaces/Interfaces.vbproj index 5da6ef29..153c34b7 100644 --- a/Modules.Interfaces/Interfaces.vbproj +++ b/Modules.Interfaces/Interfaces.vbproj @@ -51,6 +51,7 @@ + @@ -75,6 +76,8 @@ + + @@ -118,6 +121,10 @@ + + {EAF0EA75-5FA7-485D-89C7-B2D843B03A96} + Database + {903B2D7D-3B80-4BE9-8713-7447B704E1B0} Logging diff --git a/SERVICES/DDEDM_NetworkService/EDMService.vb b/SERVICES/DDEDM_NetworkService/EDMService.vb index 5e5f7157..24350966 100644 --- a/SERVICES/DDEDM_NetworkService/EDMService.vb +++ b/SERVICES/DDEDM_NetworkService/EDMService.vb @@ -146,7 +146,7 @@ Public Class EDMService Dim oExtension As String = Path.GetExtension(FileName).Substring(1) _logger.Debug("File extension of file {0} is {1}", FileName, oExtension) - Dim oSQL = $"SELECT FNICM_NEW_DOC('{FileName}','{oExtension}','{oContainerId}','{GetContainerName(oContainerId)}','{_username}') FROM RDB$DATABASE;" + Dim oSQL = $"SELECT FNICM_NEW_DOC('010', '{oContainerId}', '{GetContainerName(oContainerId)}', '{FileName}', '{oExtension}', '{_username}') FROM RDB$DATABASE;" Dim oDocId As Int64 = Database.GetScalarValue(oSQL) If oDocId = -1 Then diff --git a/ZUGFeRDTest/Form1.vb b/ZUGFeRDTest/Form1.vb index 982ac191..d1135a30 100644 --- a/ZUGFeRDTest/Form1.vb +++ b/ZUGFeRDTest/Form1.vb @@ -5,6 +5,7 @@ Imports System.Xml Imports DigitalData.Modules Imports DigitalData.Modules.Database Imports DigitalData.Modules.Interfaces +Imports DigitalData.Modules.Jobs Imports DigitalData.Modules.Jobs.ImportZUGFeRDFiles Imports DigitalData.Modules.Logging