Showing the changes to Source/Libraries/GSF.ServiceProcess/ServiceHelper.cs (1 of 2 files). Show all
Unified · Split
| @@ -89,12 +89,25 @@ · 88 unmodified lines | |||
| 89 | // | 89 | // |
| 90 | //****************************************************************************************************** | 90 | //****************************************************************************************************** |
| 91 | 91 | ||
| 92 | using GSF.Annotations; | ||
| 93 | using GSF.Collections; | ||
| 94 | using GSF.Communication; | ||
| 95 | using GSF.Configuration; | ||
| 96 | using GSF.Diagnostics; | ||
| 97 | using GSF.ErrorManagement; | ||
| 98 | using GSF.IO; | ||
| 99 | using GSF.Reflection; | ||
| 100 | using GSF.Scheduling; | ||
| 101 | using GSF.Security; | ||
| 102 | using GSF.Security.Cryptography; | ||
| 103 | using GSF.Units; | ||
| 92 | using System; | 104 | using System; |
| 93 | using System.Collections.Generic; | 105 | using System.Collections.Generic; |
| 94 | using System.ComponentModel; | 106 | using System.ComponentModel; |
| 95 | using System.Configuration; | 107 | using System.Configuration; |
| 96 | using System.Diagnostics; | 108 | using System.Diagnostics; |
| 97 | using System.Drawing; | 109 | using System.Drawing; |
| 110 | using System.IO; | ||
| 98 | using System.Linq; | 111 | using System.Linq; |
| 99 | using System.Reflection; | 112 | using System.Reflection; |
| 100 | using System.Security; | 113 | using System.Security; |
| @@ -102,18 +115,6 @@ using System.Security.Principal; · 1 unmodified line | |||
| 102 | using System.ServiceProcess; | 115 | using System.ServiceProcess; |
| 103 | using System.Text; | 116 | using System.Text; |
| 104 | using System.Threading; | 117 | using System.Threading; |
| 105 | using GSF.Annotations; | ||
| 106 | using GSF.Collections; | ||
| 107 | using GSF.Communication; | ||
| 108 | using GSF.Configuration; | ||
| 109 | using GSF.Diagnostics; | ||
| 110 | using GSF.ErrorManagement; | ||
| 111 | using GSF.IO; | ||
| 112 | using GSF.Reflection; | ||
| 113 | using GSF.Scheduling; | ||
| 114 | using GSF.Security; | ||
| 115 | using GSF.Security.Cryptography; | ||
| 116 | using GSF.Units; | ||
| 117 | 118 | ||
| 118 | namespace GSF.ServiceProcess | 119 | namespace GSF.ServiceProcess |
| 119 | { | 120 | { |
| @@ -1223,6 +1224,8 @@ namespace GSF.ServiceProcess · 1103 unmodified lines | |||
| 1223 | m_clientRequestHandlers.Add(new ClientRequestHandler("Version", "Displays current service version", ShowVersion, new[] { "ver" })); | 1224 | m_clientRequestHandlers.Add(new ClientRequestHandler("Version", "Displays current service version", ShowVersion, new[] { "ver" })); |
| 1224 | m_clientRequestHandlers.Add(new ClientRequestHandler("Time", "Displays current system time", ShowTime)); | 1225 | m_clientRequestHandlers.Add(new ClientRequestHandler("Time", "Displays current system time", ShowTime)); |
| 1225 | m_clientRequestHandlers.Add(new ClientRequestHandler("User", "Displays current user information", ShowUser, new[] { "whoami" })); | 1226 | m_clientRequestHandlers.Add(new ClientRequestHandler("User", "Displays current user information", ShowUser, new[] { "whoami" })); |
| 1227 | m_clientRequestHandlers.Add(new ClientRequestHandler("Files", "Manages files on the server", ManageFiles)); | ||
| 1228 | m_clientRequestHandlers.Add(new ClientRequestHandler("Transfer", "Transfers files to and from the server", TransferFile)); | ||
| 1226 | 1229 | ||
| 1227 | // Enable telnet support if requested. | 1230 | // Enable telnet support if requested. |
| 1228 | if (m_supportTelnetSessions) | 1231 | if (m_supportTelnetSessions) |
| @@ -3915,6 +3918,176 @@ namespace GSF.ServiceProcess · 2686 unmodified lines | |||
| 3915 | } | 3918 | } |
| 3916 | } | 3919 | } |
| 3917 | 3920 | ||
| 3921 | private void ManageFiles(ClientRequestInfo requestInfo) | ||
| 3922 | { | ||
| 3923 | if (requestInfo.Request.Arguments.ContainsHelpRequest || requestInfo.Request.Arguments.OrderedArgCount < 2) | ||
| 3924 | { | ||
| 3925 | StringBuilder helpMessage = new StringBuilder(); | ||
| 3926 | |||
| 3927 | helpMessage.Append("Manages files on the server."); | ||
| 3928 | helpMessage.AppendLine(); | ||
| 3929 | helpMessage.AppendLine(); | ||
| 3930 | helpMessage.Append(" Usage:"); | ||
| 3931 | helpMessage.AppendLine(); | ||
| 3932 | helpMessage.Append(" Files \"Source Path\" \"Target Path\" -options"); | ||
| 3933 | helpMessage.AppendLine(); | ||
| 3934 | helpMessage.AppendLine(); | ||
| 3935 | helpMessage.Append(" Options:"); | ||
| 3936 | helpMessage.AppendLine(); | ||
| 3937 | helpMessage.Append(" -?".PadRight(20)); | ||
| 3938 | helpMessage.Append("Displays this help message"); | ||
| 3939 | helpMessage.AppendLine(); | ||
| 3940 | helpMessage.Append(" -copy".PadRight(20)); | ||
| 3941 | helpMessage.Append("Copies files from one location to another"); | ||
| 3942 | helpMessage.AppendLine(); | ||
| 3943 | helpMessage.Append(" -move".PadRight(20)); | ||
| 3944 | helpMessage.Append("Moves files from one location to another"); | ||
| 3945 | helpMessage.AppendLine(); | ||
| 3946 | helpMessage.Append(" -overwrite".PadRight(20)); | ||
| 3947 | helpMessage.Append("Overwrites files if they exist in the target location"); | ||
| 3948 | helpMessage.AppendLine(); | ||
| 3949 | helpMessage.AppendLine(); | ||
| 3950 | |||
| 3951 | UpdateStatus(requestInfo.Sender.ClientID, UpdateType.Information, helpMessage.ToString()); | ||
| 3952 | } | ||
| 3953 | else | ||
| 3954 | { | ||
| 3955 | string source = FilePath.GetAbsolutePath(requestInfo.Request.Arguments["orderedarg1"]); | ||
| 3956 | string target = FilePath.GetDirectoryName(FilePath.GetAbsolutePath(requestInfo.Request.Arguments["orderedarg2"])); | ||
| 3957 | string directory = FilePath.GetDirectoryName(source); | ||
| 3958 | string filePattern = FilePath.GetFileName(source); | ||
| 3959 | bool copy = requestInfo.Request.Arguments.Exists("copy"); | ||
| 3960 | bool move = requestInfo.Request.Arguments.Exists("move"); | ||
| 3961 | bool overwrite = requestInfo.Request.Arguments.Exists("overwrite"); | ||
| 3962 | |||
| 3963 | string targetFile; | ||
| 3964 | foreach (string sourceFile in Directory.GetFiles(directory, filePattern)) | ||
| 3965 | { | ||
| 3966 | targetFile = Path.Combine(target, FilePath.GetFileName(sourceFile)); | ||
| 3967 | if (!File.Exists(targetFile) || overwrite) | ||
| 3968 | { | ||
| 3969 | // File can be copied or moved. | ||
| 3970 | if (copy) | ||
| 3971 | { | ||
| 3972 | // Copy the file. | ||
| 3973 | UpdateStatus(requestInfo.Sender.ClientID, UpdateType.Information, "Copying file '{0}'...\r\n\r\n", target); | ||
| 3974 | File.Copy(sourceFile, targetFile, true); | ||
| 3975 | UpdateStatus(requestInfo.Sender.ClientID, UpdateType.Information, "File '{0}' copied successfully.\r\n\r\n", target); | ||
| 3976 | } | ||
| 3977 | else if (move) | ||
| 3978 | { | ||
| 3979 | // Move the file. | ||
| 3980 | UpdateStatus(requestInfo.Sender.ClientID, UpdateType.Information, "Moving file '{0}'...\r\n\r\n", target); | ||
| 3981 | File.Delete(targetFile); | ||
| 3982 | File.Move(sourceFile, targetFile); | ||
| 3983 | UpdateStatus(requestInfo.Sender.ClientID, UpdateType.Information, "File '{0}' moved successfully.\r\n\r\n", target); | ||
| 3984 | } | ||
| 3985 | else | ||
| 3986 | { | ||
| 3987 | // Invalid command option specified. | ||
| 3988 | UpdateStatus(UpdateType.Alarm, "Command option is not valid.\r\n\r\n"); | ||
| 3989 | } | ||
| 3990 | } | ||
| 3991 | else | ||
| 3992 | { | ||
| 3993 | // File already exists. | ||
| 3994 | UpdateStatus(UpdateType.Alarm, "File '{0}' already exists.\r\n\r\n", targetFile); | ||
| 3995 | } | ||
| 3996 | } | ||
| 3997 | } | ||
| 3998 | } | ||
| 3999 | |||
| 4000 | private void TransferFile(ClientRequestInfo requestInfo) | ||
| 4001 | { | ||
| 4002 | if (requestInfo.Request.Arguments.ContainsHelpRequest || requestInfo.Request.Arguments.OrderedArgCount < 2) | ||
| 4003 | { | ||
| 4004 | StringBuilder helpMessage = new StringBuilder(); | ||
| 4005 | |||
| 4006 | helpMessage.Append("Transfers files to and from the server."); | ||
| 4007 | helpMessage.AppendLine(); | ||
| 4008 | helpMessage.AppendLine(); | ||
| 4009 | helpMessage.Append(" Usage:"); | ||
| 4010 | helpMessage.AppendLine(); | ||
| 4011 | helpMessage.Append(" Transfer \"Source File Path\" \"Target File Path\" -options"); | ||
| 4012 | helpMessage.AppendLine(); | ||
| 4013 | helpMessage.AppendLine(); | ||
| 4014 | helpMessage.Append(" Options:"); | ||
| 4015 | helpMessage.AppendLine(); | ||
| 4016 | helpMessage.Append(" -?".PadRight(20)); | ||
| 4017 | helpMessage.Append("Displays this help message"); | ||
| 4018 | helpMessage.AppendLine(); | ||
| 4019 | helpMessage.Append(" -upload".PadRight(20)); | ||
| 4020 | helpMessage.Append("Uploads file from local machine to server"); | ||
| 4021 | helpMessage.AppendLine(); | ||
| 4022 | helpMessage.Append(" -download".PadRight(20)); | ||
| 4023 | helpMessage.Append("Downloads file from server to local machine"); | ||
| 4024 | helpMessage.AppendLine(); | ||
| 4025 | helpMessage.Append(" -overwrite".PadRight(20)); | ||
| 4026 | helpMessage.Append("Overwrites file if one exists in the target location"); | ||
| 4027 | helpMessage.AppendLine(); | ||
| 4028 | helpMessage.AppendLine(); | ||
| 4029 | |||
| 4030 | UpdateStatus(requestInfo.Sender.ClientID, UpdateType.Information, helpMessage.ToString()); | ||
| 4031 | } | ||
| 4032 | else | ||
| 4033 | { | ||
| 4034 | string source = requestInfo.Request.Arguments["orderedarg1"]; | ||
| 4035 | string target = requestInfo.Request.Arguments["orderedarg2"]; | ||
| 4036 | bool upload = requestInfo.Request.Arguments.Exists("upload"); | ||
| 4037 | bool download = requestInfo.Request.Arguments.Exists("download"); | ||
| 4038 | bool overwrite = requestInfo.Request.Arguments.Exists("overwrite"); | ||
| 4039 | |||
| 4040 | if (upload) | ||
| 4041 | { | ||
| 4042 | // Request is for uploading a file. | ||
| 4043 | if (requestInfo.Request.Attachments.Count == 1) | ||
| 4044 | { | ||
| 4045 | // File content is present. | ||
| 4046 | target = FilePath.GetAbsolutePath(target); | ||
| 4047 | if (!File.Exists(target) || overwrite) | ||
| 4048 | { | ||
| 4049 | // Save the received file. | ||
| 4050 | UpdateStatus(requestInfo.Sender.ClientID, UpdateType.Information, "Saving file '{0}'...\r\n\r\n", target); | ||
| 4051 | File.WriteAllBytes(target, (byte[])requestInfo.Request.Attachments[0]); | ||
| 4052 | UpdateStatus(requestInfo.Sender.ClientID, UpdateType.Information, "File '{0}' saved successfully.\r\n\r\n", target); | ||
| 4053 | } | ||
| 4054 | else | ||
| 4055 | { | ||
| 4056 | // File exists and cannot be overwritten. | ||
| 4057 | UpdateStatus(UpdateType.Alarm, "File '{0}' already exists.\r\n\r\n", target); | ||
| 4058 | } | ||
| 4059 | } | ||
| 4060 | else | ||
| 4061 | { | ||
| 4062 | // File content is not present. | ||
| 4063 | UpdateStatus(UpdateType.Alarm, "Content for file '{0}' is missing.\r\n\r\n", target); | ||
| 4064 | } | ||
| 4065 | } | ||
| 4066 | else if (download) | ||
| 4067 | { | ||
| 4068 | // Request is for uploading a file. | ||
| 4069 | source = FilePath.GetAbsolutePath(source); | ||
| 4070 | if (File.Exists(source)) | ||
| 4071 | { | ||
| 4072 | // Send file to client. | ||
| 4073 | UpdateStatus(requestInfo.Sender.ClientID, UpdateType.Information, "Sending file '{0}'...\r\n\r\n", source); | ||
| 4074 | SendActionableResponse(requestInfo, true, File.ReadAllBytes(source)); | ||
| 4075 | UpdateStatus(requestInfo.Sender.ClientID, UpdateType.Information, "File '{0}' sent successfully.\r\n\r\n", source); | ||
| 4076 | } | ||
| 4077 | else | ||
| 4078 | { | ||
| 4079 | // File does not exist. | ||
| 4080 | UpdateStatus(UpdateType.Alarm, "File '{0}' does not exist.\r\n\r\n", source); | ||
| 4081 | } | ||
| 4082 | } | ||
| 4083 | else | ||
| 4084 | { | ||
| 4085 | // Invalid command option specified. | ||
| 4086 | UpdateStatus(UpdateType.Alarm, "Command option is not valid.\r\n\r\n"); | ||
| 4087 | } | ||
| 4088 | } | ||
| 4089 | } | ||
| 4090 | |||
| 3918 | private void RemoteTelnetSession(ClientRequestInfo requestinfo) | 4091 | private void RemoteTelnetSession(ClientRequestInfo requestinfo) |
| 3919 | { | 4092 | { |
| 3920 | if ((object)m_remoteCommandProcess == null && requestinfo.Request.Arguments.ContainsHelpRequest) | 4093 | if ((object)m_remoteCommandProcess == null && requestinfo.Request.Arguments.ContainsHelpRequest) |