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 | 104 | using System; |
| 93 | 105 | using System.Collections.Generic; |
| 94 | 106 | using System.ComponentModel; |
| 95 | 107 | using System.Configuration; |
| 96 | 108 | using System.Diagnostics; |
| 97 | 109 | using System.Drawing; |
| 110 | +using System.IO; | |
| 98 | 111 | using System.Linq; |
| 99 | 112 | using System.Reflection; |
| 100 | 113 | using System.Security; |
| @@ -102,18 +115,6 @@ using System.Security.Principal; · 1 unmodified line | ||
| 102 | 115 | using System.ServiceProcess; |
| 103 | 116 | using System.Text; |
| 104 | 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 | 119 | namespace GSF.ServiceProcess |
| 119 | 120 | { |
| @@ -1223,6 +1224,8 @@ namespace GSF.ServiceProcess · 1103 unmodified lines | ||
| 1223 | 1224 | m_clientRequestHandlers.Add(new ClientRequestHandler("Version", "Displays current service version", ShowVersion, new[] { "ver" })); |
| 1224 | 1225 | m_clientRequestHandlers.Add(new ClientRequestHandler("Time", "Displays current system time", ShowTime)); |
| 1225 | 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 | 1230 | // Enable telnet support if requested. |
| 1228 | 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 | 4091 | private void RemoteTelnetSession(ClientRequestInfo requestinfo) |
| 3919 | 4092 | { |
| 3920 | 4093 | if ((object)m_remoteCommandProcess == null && requestinfo.Request.Arguments.ContainsHelpRequest) |