SFTPSession entfernt

stattdessen wird ein open command gesendet. Gleichzeitig wird die Ausgabe nicht mehr
zum Ende gelesen sondern per Events abgefragt. Die Hoffnung ist hier, dass der Prozess nicht
mehr auf dem ReadToEnd() blockiert, wobei das nie bestätigt werden konnte.
This commit is contained in:
Daniel Schick 2023-07-08 12:20:40 +02:00
parent 0b2893ecde
commit 04907e2104
9 changed files with 195 additions and 59 deletions

View File

@ -292,9 +292,7 @@ namespace SendNSWMessageService
// external processing for dbh // external processing for dbh
bsmd.dbh.MessageController.SendAndReceive(); bsmd.dbh.MessageController.SendAndReceive();
List<MessageCore> coresMarkedForStatusQuery = DBManager.Instance.GetMessageCoresWithNSWStatusFlag(); foreach (MessageCore core in DBManager.Instance.GetMessageCoresWithNSWStatusFlag())
foreach (MessageCore core in coresMarkedForStatusQuery)
{ {
core.QueryNSWStatus = false; // reset flag core.QueryNSWStatus = false; // reset flag
Status aStatus = new Status(core); Status aStatus = new Status(core);

View File

@ -97,7 +97,7 @@ namespace bsmd.dakosy
} }
public static void TransmitAll(string remoteDir, string localDir, Direction direction, string sessionName) private static Process StartWinSCPProcess()
{ {
Process winscp = new Process(); Process winscp = new Process();
winscp.StartInfo.FileName = Properties.Settings.Default.WINSCPFullPath; winscp.StartInfo.FileName = Properties.Settings.Default.WINSCPFullPath;
@ -107,12 +107,24 @@ namespace bsmd.dakosy
winscp.StartInfo.RedirectStandardOutput = true; winscp.StartInfo.RedirectStandardOutput = true;
winscp.StartInfo.RedirectStandardError = true; winscp.StartInfo.RedirectStandardError = true;
winscp.StartInfo.CreateNoWindow = true; winscp.StartInfo.CreateNoWindow = true;
winscp.Start(); winscp.EnableRaisingEvents = true;
winscp.OutputDataReceived += (s, e) => _log.Debug(e.Data);
winscp.ErrorDataReceived += (s, e) => _log.Warn(e.Data);
winscp.Start();
winscp.BeginErrorReadLine();
winscp.BeginOutputReadLine();
return winscp;
}
public static void TransmitAll(string remoteDir, string localDir, Direction direction, string openCommand)
{
Process winscp = StartWinSCPProcess();
// Feed in the scripting commands // Feed in the scripting commands
winscp.StandardInput.WriteLine("option batch abort"); winscp.StandardInput.WriteLine("option batch abort");
winscp.StandardInput.WriteLine("option confirm off"); winscp.StandardInput.WriteLine("option confirm off");
winscp.StandardInput.WriteLine("open " + sessionName); winscp.StandardInput.WriteLine(openCommand);
winscp.StandardInput.WriteLine("lcd " + localDir); winscp.StandardInput.WriteLine("lcd " + localDir);
// winscp.StandardInput.WriteLine("ls"); // winscp.StandardInput.WriteLine("ls");
if (remoteDir != null) if (remoteDir != null)
@ -120,63 +132,30 @@ namespace bsmd.dakosy
if(direction == Direction.INCOMING) if(direction == Direction.INCOMING)
winscp.StandardInput.WriteLine("get *.xml"); winscp.StandardInput.WriteLine("get *.xml");
if(direction == Direction.OUTGOING) if(direction == Direction.OUTGOING)
winscp.StandardInput.WriteLine("put *.xml"); winscp.StandardInput.WriteLine("put *.xml");
// move back up since winscp session remembers the last folder winscp.StandardInput.Close();
winscp.StandardInput.WriteLine("cd ..");
winscp.StandardInput.WriteLine("cd ..");
winscp.StandardInput.Close();
// Collect all output
string output = winscp.StandardOutput.ReadToEnd();
_log.Debug(output);
output = winscp.StandardError.ReadToEnd();
if(!output.Trim().IsNullOrEmpty())
_log.Warn(output);
// Wait until WinSCP finishes // Wait until WinSCP finishes
winscp.WaitForExit(); winscp.WaitForExit();
} }
public static void RemoveProcessedFile(string remoteDir, string filename, string sessionName) public static void RemoveProcessedFile(string remoteDir, string filename, string openCommand)
{ {
Process winscp = new Process(); Process winscp = StartWinSCPProcess();
winscp.StartInfo.FileName = Properties.Settings.Default.WINSCPFullPath;
winscp.StartInfo.Arguments = "/xmllog=\"" + Properties.Settings.Default.SFTPLog + "\"";
winscp.StartInfo.UseShellExecute = false;
winscp.StartInfo.RedirectStandardInput = true;
winscp.StartInfo.RedirectStandardOutput = true;
winscp.StartInfo.RedirectStandardError = true;
winscp.StartInfo.CreateNoWindow = true;
winscp.Start();
// Feed in the scripting commands // Feed in the scripting commands
winscp.StandardInput.WriteLine("option batch abort"); winscp.StandardInput.WriteLine("option batch abort");
winscp.StandardInput.WriteLine("option confirm off"); winscp.StandardInput.WriteLine("option confirm off");
winscp.StandardInput.WriteLine("open " + sessionName); winscp.StandardInput.WriteLine(openCommand);
// winscp.StandardInput.WriteLine("ls"); // winscp.StandardInput.WriteLine("ls");
if (remoteDir != null) if (remoteDir != null)
winscp.StandardInput.WriteLine("cd " + remoteDir); winscp.StandardInput.WriteLine("cd " + remoteDir);
winscp.StandardInput.WriteLine("rm " + filename); winscp.StandardInput.WriteLine("rm " + filename);
if (remoteDir != null) winscp.StandardInput.Close();
{
// move back up since winscp session remembers the last folder
winscp.StandardInput.WriteLine("cd ..");
winscp.StandardInput.WriteLine("cd ..");
}
winscp.StandardInput.Close();
// Collect all output
string output = winscp.StandardOutput.ReadToEnd();
_log.Debug(output);
output = winscp.StandardError.ReadToEnd();
if (!output.Trim().IsNullOrEmpty())
_log.Warn(output);
// Wait until WinSCP finishes // Wait until WinSCP finishes
winscp.WaitForExit(); winscp.WaitForExit();
} }
} }
} }

View File

@ -6,7 +6,7 @@ using System;
using System.IO; using System.IO;
using bsmd.database; using bsmd.database;
using System.Linq;
namespace bsmd.dbh namespace bsmd.dbh
{ {
@ -117,7 +117,7 @@ namespace bsmd.dbh
public static void SendAndReceive() public static void SendAndReceive()
{ {
// sent unsent messages in output folder // sent unsent messages in output folder
bsmd.dakosy.SFtp.TransmitAll(Properties.Settings.Default.RemoteIncomingFolder, Properties.Settings.Default.OutgoingFolder, dakosy.SFtp.Direction.OUTGOING, Properties.Settings.Default.SFTPSessionName); bsmd.dakosy.SFtp.TransmitAll(Properties.Settings.Default.RemoteIncomingFolder, Properties.Settings.Default.OutgoingFolder, dakosy.SFtp.Direction.OUTGOING, Properties.Settings.Default.SFTPOpenCommand);
// move files from output folder to archive folder // move files from output folder to archive folder
foreach(string sentFile in Directory.GetFiles(Properties.Settings.Default.OutgoingFolder)) foreach(string sentFile in Directory.GetFiles(Properties.Settings.Default.OutgoingFolder))
{ {
@ -130,7 +130,7 @@ namespace bsmd.dbh
// receive files from remote host // receive files from remote host
// SFTP verbindung öffnen und alle Dateien herunterladen // SFTP verbindung öffnen und alle Dateien herunterladen
bsmd.dakosy.SFtp.TransmitAll(Properties.Settings.Default.RemoteOutgoingFolder, Properties.Settings.Default.IncomingFolder, dakosy.SFtp.Direction.INCOMING, Properties.Settings.Default.SFTPSessionName); bsmd.dakosy.SFtp.TransmitAll(Properties.Settings.Default.RemoteOutgoingFolder, Properties.Settings.Default.IncomingFolder, dakosy.SFtp.Direction.INCOMING, Properties.Settings.Default.SFTPOpenCommand);
foreach (string inputFile in Directory.GetFiles(Properties.Settings.Default.IncomingFolder)) foreach (string inputFile in Directory.GetFiles(Properties.Settings.Default.IncomingFolder))
{ {
@ -151,7 +151,7 @@ namespace bsmd.dbh
File.Delete(inputFile); File.Delete(inputFile);
} }
// remote Dateien löschen // remote Dateien löschen
bsmd.dakosy.SFtp.RemoveProcessedFile(Properties.Settings.Default.RemoteOutgoingFolder, Path.GetFileName(inputFile), Properties.Settings.Default.SFTPSessionName); bsmd.dakosy.SFtp.RemoveProcessedFile(Properties.Settings.Default.RemoteOutgoingFolder, Path.GetFileName(inputFile), Properties.Settings.Default.SFTPOpenCommand);
} }
} }

View File

@ -89,15 +89,17 @@ namespace bsmd.dbh.Properties {
[global::System.Configuration.ApplicationScopedSettingAttribute()] [global::System.Configuration.ApplicationScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("dbh")] [global::System.Configuration.DefaultSettingValueAttribute("dbh")]
public string SFTPSessionName { public string SFTPOpenCommand {
get { get {
return ((string)(this["SFTPSessionName"])); return ((string)(this["SFTPOpenCommand"]));
} }
} }
[global::System.Configuration.ApplicationScopedSettingAttribute()] [global::System.Configuration.ApplicationScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("")] [global::System.Configuration.DefaultSettingValueAttribute("sftp://f-000333@fx.dbh.de/ -hostkey=\"ecdsa-sha2-nistp256 256 453JBU8hAOOQ7wEvmTw5" +
"fXsUyZsVCSufyATbGKLh+ak\" -privatekey=\"C:\\work\\Services\\SendNSWMessageService\\dbh" +
"\\sshkeynp.ppk\"")]
public string IncomingErrorFolder { public string IncomingErrorFolder {
get { get {
return ((string)(this["IncomingErrorFolder"])); return ((string)(this["IncomingErrorFolder"]));

View File

@ -23,11 +23,11 @@
<Setting Name="RemoteOutgoingFolder" Type="System.String" Scope="Application"> <Setting Name="RemoteOutgoingFolder" Type="System.String" Scope="Application">
<Value Profile="(Default)">test/dbh_2_bsmd</Value> <Value Profile="(Default)">test/dbh_2_bsmd</Value>
</Setting> </Setting>
<Setting Name="SFTPSessionName" Type="System.String" Scope="Application"> <Setting Name="SFTPOpenCommand" Type="System.String" Scope="Application">
<Value Profile="(Default)">dbh</Value> <Value Profile="(Default)">dbh</Value>
</Setting> </Setting>
<Setting Name="IncomingErrorFolder" Type="System.String" Scope="Application"> <Setting Name="IncomingErrorFolder" Type="System.String" Scope="Application">
<Value Profile="(Default)" /> <Value Profile="(Default)">sftp://f-000333@fx.dbh.de/ -hostkey="ecdsa-sha2-nistp256 256 453JBU8hAOOQ7wEvmTw5fXsUyZsVCSufyATbGKLh+ak" -privatekey="C:\work\Services\SendNSWMessageService\dbh\sshkeynp.ppk"</Value>
</Setting> </Setting>
<Setting Name="SenderMaersk" Type="System.String" Scope="Application"> <Setting Name="SenderMaersk" Type="System.String" Scope="Application">
<Value Profile="(Default)">00006017</Value> <Value Profile="(Default)">00006017</Value>

View File

@ -778,7 +778,7 @@ namespace bsmd.dbh
rootPre.TankerDetails.ConditionCargoBallastTanks = (TankCondition)pre72h.ConditionCargoBallastTanks.Value; rootPre.TankerDetails.ConditionCargoBallastTanks = (TankCondition)pre72h.ConditionCargoBallastTanks.Value;
if (pre72h.NatureOfCargo != string.Empty) if (pre72h.NatureOfCargo != string.Empty)
rootPre.TankerDetails.TypeOfCargo = pre72h.NatureOfCargo; rootPre.TankerDetails.TypeOfCargo = pre72h.NatureOfCargo;
bool sendVolume = pre72h.VolumeOfCargo.HasValue && (pre72h.VolumeOfCargo.Value > 0); bool sendVolume = pre72h.VolumeOfCargo > 0;
rootPre.TankerDetails.VolumeOfCargo_TNESpecified = sendVolume; rootPre.TankerDetails.VolumeOfCargo_TNESpecified = sendVolume;
if (sendVolume) if (sendVolume)
rootPre.TankerDetails.VolumeOfCargo_TNE = Decimal.Round((decimal)(pre72h.VolumeOfCargo.Value), 3); rootPre.TankerDetails.VolumeOfCargo_TNE = Decimal.Round((decimal)(pre72h.VolumeOfCargo.Value), 3);

View File

@ -129,7 +129,7 @@ namespace bsmd.dbh
case Response.RootType.RESET: case Response.RootType.RESET:
if(root.ReportingClassesResetted?.ReportingClass.Length > 0) if(root.ReportingClassesResetted?.ReportingClass.Length > 0)
{ {
_log.InfoFormat("Message {0} RESET confirmed, {1} messages", sentMessage.MessageNotificationClassDisplay, root.Messages.Length); ; _log.InfoFormat("Message {0} RESET confirmed, {1} messages", sentMessage.MessageNotificationClassDisplay, root.Messages.Length);
sentMessage.SendSuccess = false; // bestätigter Reset setzt grünen Buppel zurück sentMessage.SendSuccess = false; // bestätigter Reset setzt grünen Buppel zurück
sentMessage.Status = Message.MessageStatus.ACCEPTED; sentMessage.Status = Message.MessageStatus.ACCEPTED;
sentMessage.InternalStatus = Message.BSMDStatus.CONFIRMED; sentMessage.InternalStatus = Message.BSMDStatus.CONFIRMED;

View File

@ -28,11 +28,11 @@
<setting name="RemoteOutgoingFolder" serializeAs="String"> <setting name="RemoteOutgoingFolder" serializeAs="String">
<value>test/dbh_2_bsmd</value> <value>test/dbh_2_bsmd</value>
</setting> </setting>
<setting name="SFTPSessionName" serializeAs="String"> <setting name="SFTPOpenCommand" serializeAs="String">
<value>dbh</value> <value>dbh</value>
</setting> </setting>
<setting name="IncomingErrorFolder" serializeAs="String"> <setting name="IncomingErrorFolder" serializeAs="String">
<value /> <value>sftp://f-000333@fx.dbh.de/ -hostkey="ecdsa-sha2-nistp256 256 453JBU8hAOOQ7wEvmTw5fXsUyZsVCSufyATbGKLh+ak" -privatekey="C:\work\Services\SendNSWMessageService\dbh\sshkeynp.ppk"</value>
</setting> </setting>
<setting name="SenderMaersk" serializeAs="String"> <setting name="SenderMaersk" serializeAs="String">
<value>00006017</value> <value>00006017</value>

View File

@ -0,0 +1,157 @@
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,Log4net"/>
<sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<section name="SendNSWMessageService.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
<section name="bsmd.dakosy.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
<section name="bsmd.dbh.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
<section name="bsmd.hisnord.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
<section name="bsmd.status.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
</sectionGroup>
</configSections>
<log4net>
<root>
<level value="INFO" />
<appender-ref ref="LogFileAppender" />
</root>
<appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender" >
<param name="File" value="C:\\work\\Logs\\log-NSWMessageServiceTest.txt" />
<param name="AppendToFile" value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="10" />
<maximumFileSize value="2MB" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%date [%thread] %-5level [%logger] - %message%newline" />
</layout>
</appender>
</log4net>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
<applicationSettings>
<bsmd.status.Properties.Settings>
<setting name="login" serializeAs="String">
<value>BSMD-PROD</value>
</setting>
<setting name="password" serializeAs="String">
<value>t7g7fDP18#7GQw#D</value>
</setting>
<setting name="url" serializeAs="String">
<value>https://www.his-nord.de/HIS-Service/StatusInfoNSW.jsp</value>
</setting>
</bsmd.status.Properties.Settings>
<SendNSWMessageService.Properties.Settings>
<setting name="ConnectionString" serializeAs="String">
<value>Initial Catalog=nswtest;Data Source=192.168.2.24\SQLEXPRESS;Uid=dfuser;pwd=dfpasswd;Persist Security Info=False;Connection Reset=false</value>
</setting>
<setting name="SleepSeconds" serializeAs="String">
<value>30</value>
</setting>
</SendNSWMessageService.Properties.Settings>
<bsmd.dakosy.Properties.Settings>
<setting name="SFTPSessionName" serializeAs="String">
<value>dakosy</value>
</setting>
<setting name="SFTPLog" serializeAs="String">
<value>c:\temp\sftp_log.xml</value>
</setting>
<setting name="SFTPOutDir" serializeAs="String">
<value>c:\work\dakosy\out</value>
</setting>
<setting name="SFTPInDir" serializeAs="String">
<value>c:\work\dakosy\in</value>
</setting>
<setting name="TestMode" serializeAs="String">
<value>True</value>
</setting>
<setting name="WINSCPFullPath" serializeAs="String">
<value>c:\work\Tools\WinSCP\WinSCP.com</value>
</setting>
<setting name="RemoteProdIncomingDir" serializeAs="String">
<value>in/prod/ed02</value>
</setting>
<setting name="RemoteTestIncomingDir" serializeAs="String">
<value>in/test/ed02</value>
</setting>
<setting name="RemoteProdOutgoingDir" serializeAs="String">
<value>out/prod</value>
</setting>
<setting name="RemoteTestOutgoingDir" serializeAs="String">
<value>out/test</value>
</setting>
</bsmd.dakosy.Properties.Settings>
<bsmd.dbh.Properties.Settings>
<setting name="bsmd_dbh_DBHWebReference_Dbh_Osis_Answ_Ws" serializeAs="String">
<value>https://edi-gate.dbh.de/bsmd-soap</value>
</setting>
<setting name="Sender" serializeAs="String">
<value>00003050</value>
<!-- Maersk produktiv value>00000768</value-->
<!-- BSMD-PROD value>00003050</value-->
</setting>
<setting name="SenderMaersk" serializeAs="String">
<value>00006017</value>
</setting>
<setting name="OutgoingFolder" serializeAs="String">
<value>C:\temp\dbh\out</value>
</setting>
<setting name="OutgoingArchiveFolder" serializeAs="String">
<value>C:\temp\dbh\out_archive</value>
</setting>
<setting name="IncomingFolder" serializeAs="String">
<value>C:\temp\dbh\in</value>
</setting>
<setting name="IncomingArchiveFolder" serializeAs="String">
<value>C:\temp\dbh\in_archive</value>
</setting>
<setting name="IncomingErrorFolder" serializeAs="String">
<value>C:\temp\dbh\in_error</value>
</setting>
<setting name="RemoteIncomingFolder" serializeAs="String">
<value>test/bsmd_2_dbh</value>
</setting>
<setting name="RemoteOutgoingFolder" serializeAs="String">
<value>test/dbh_2_bsmd</value>
</setting>
<setting name="SFTPOpenCommand" serializeAs="String">
<value>open sftp://f-000333@fx.dbh.de/ -hostkey="ecdsa-sha2-nistp256 256 453JBU8hAOOQ7wEvmTw5fXsUyZsVCSufyATbGKLh+ak" -privatekey="C:\git_lager\git_bsmd\bsmd.dbh\misc\sshkeynp.ppk"</value>
</setting>
</bsmd.dbh.Properties.Settings>
<bsmd.hisnord.Properties.Settings>
<setting name="TransmitterRoot" serializeAs="String">
<value>C:\work\HIS-NORD\Test</value>
</setting>
<setting name="OutputDir" serializeAs="String">
<value>IMP</value>
</setting>
<setting name="Transmitter" serializeAs="String">
<value>client.bat</value>
</setting>
<setting name="BatchTimeoutMins" serializeAs="String">
<value>1</value>
</setting>
<setting name="ResultDir" serializeAs="String">
<value>RESULTS</value>
</setting>
<setting name="AnswerDir" serializeAs="String">
<value>ANSWERS</value>
</setting>
<setting name="AnswerArchiveDir" serializeAs="String">
<value>ANSWERS_DONE</value>
</setting>
<setting name="AnswerCorruptDir" serializeAs="String">
<value>ANSWERS_CORRUPT</value>
</setting>
</bsmd.hisnord.Properties.Settings>
</applicationSettings>
<system.web>
<webServices>
<!-- zum debuggen -->
<soapExtensionTypes>
<add type="bsmd.database.SoapLoggerExtension, bsmd.database" priority="1" group="0" />
</soapExtensionTypes>
</webServices>
</system.web>
</configuration>