Explorar o código

Find PuTTY lots of ways including specified on the command line.

Douglas Thrift %!s(int64=11) %!d(string=hai) anos
pai
achega
13fbd65ddf
Modificáronse 2 ficheiros con 144 adicións e 16 borrados
  1. 112 16
      ssh-handler/ssh-handler.cs
  2. 32 0
      ssh-handler/ssh-handler.csproj

+ 112 - 16
ssh-handler/ssh-handler.cs

@@ -19,45 +19,141 @@
  *  limitations under the License.
  */
 
+using System;
 using System.Diagnostics;
+using System.IO;
 using System.Text;
+using System.Text.RegularExpressions;
+using System.Windows.Forms;
+using Microsoft.Win32;
 
 public class SshHandler
 {
+    private enum Handler { Unspecified, Putty };
+    private static Handler handler = Handler.Unspecified;
+    private static string puttyPath = null;
+
     public static void Main(string[] args)
     {
-        foreach (string arg in args)
-            Ssh(arg);
+        Application.EnableVisualStyles();
+
+        try
+        {
+            Regex usage = new Regex(@"^[-/](?:help|usage|\?)$", RegexOptions.IgnoreCase);
+            Regex putty = new Regex(@"^[-/]putty(?:[:=](?<putty_path>.*))?$", RegexOptions.IgnoreCase);
+            Uri uri = null;
+
+            foreach (string arg in args)
+            {
+                if (usage.IsMatch(arg))
+                {
+                    Usage();
+                    return;
+                }
+
+                Match match;
+
+                if ((match = putty.Match(arg)).Success)
+                {
+                    handler = Handler.Putty;
+                    Group group = match.Groups["putty_path"];
+                    if (group.Success)
+                        puttyPath = group.Value;
+                }
+                else
+                    uri = new Uri(arg, UriKind.Absolute);
+            }
+
+            if (uri != null)
+                switch (handler)
+                {
+                    case Handler.Unspecified:
+                        if (FindPutty())
+                            Putty(uri);
+                        else
+                            throw new Exception("Could not find a suitable SSH application.");
+                        break;
+                    case Handler.Putty:
+                        Putty(uri);
+                        break;
+                }
+            else
+                Usage();
+        }
+        catch (Exception exception)
+        {
+            MessageBox.Show(exception.Message, "SSH Handler Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
+        }
     }
 
-    private static void Ssh(string arg)
+    private static void Usage()
     {
-        System.Uri uri = new System.Uri(arg);
-        string user = null, password = null;
+        MessageBox.Show("ssh-handler [/putty[:<putty-path>]] <ssh-url>\n\n" +
+            "/putty[:<putty-path>] -- Use PuTTY to connect", "SSH Handler Usage", MessageBoxButtons.OK, MessageBoxIcon.Information);
+    }
 
+    private static void UserPassword(Uri uri, out string user, out string password)
+    {
         if (uri.UserInfo.Length != 0)
         {
             string[] userInfo = uri.UserInfo.Split(new char[] { ':' }, 2);
-
             user = userInfo[0];
+            password = userInfo.Length == 2 ? userInfo[1] : null;
+        }
+        else
+        {
+            user = null;
+            password = null;
+        }
+    }
+
+    private static bool FindPutty()
+    {
+        if (puttyPath != null)
+            return true;
 
-            if (userInfo.Length == 2)
-                password = userInfo[1];
+        foreach (string key in new string[] { "HKEY_CURRENT_USER", "HKEY_LOCAL_MACHINE" })
+        {
+            string path = (string)Registry.GetValue(key + @"\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\PuTTY_is1", "InstallLocation", null);
+            if (path == null)
+                continue;
+            puttyPath = Path.Combine(path, "putty.exe");
+            if (File.Exists(puttyPath))
+                return true;
+            else
+                puttyPath = null;
         }
 
-        StringBuilder args = new StringBuilder();
+        foreach (string path in Environment.GetEnvironmentVariable("PATH").Split(Path.PathSeparator))
+        {
+            puttyPath = Path.Combine(path, "putty.exe");
+            if (File.Exists(puttyPath))
+                return true;
+            else
+                puttyPath = null;
+        }
 
-        if (password != null)
-            args.Append("-pw ").Append(password).Append(' ');
+        return false;
+    }
 
-        if (user != null)
-            args.Append(user).Append('@');
+    private static void Putty(Uri uri)
+    {
+        if (!FindPutty())
+            throw new Exception("Could not find PuTTY executable.");
 
-        args.Append(uri.Host);
+        string user, password;
+        UserPassword(uri, out user, out password);
 
+        StringBuilder args = new StringBuilder();
+        if (password != null)
+            args.AppendFormat("-pw {0} ", password);
         if (uri.Port != -1)
-            args.Append(':').Append(uri.Port);
+            args.AppendFormat("-P {0} ", uri.Port);
+        if (user != null)
+            args.AppendFormat("{0}@", user);
+        args.Append(uri.Host);
 
-        Process.Start(@"C:\Program Files (x86)\PuTTY\putty.exe", args.ToString());
+        Debug.WriteLine("{0} {1}", puttyPath, args);
+        Process.Start(puttyPath, args.ToString());
     }
 }

+ 32 - 0
ssh-handler/ssh-handler.csproj

@@ -11,6 +11,21 @@
     <AssemblyName>ssh-handler</AssemblyName>
     <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
     <FileAlignment>512</FileAlignment>
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
     <PlatformTarget>AnyCPU</PlatformTarget>
@@ -49,6 +64,23 @@
   <ItemGroup>
     <Compile Include="ssh-handler.cs" />
   </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include=".NETFramework,Version=v4.5">
+      <Visible>False</Visible>
+      <ProductName>Microsoft .NET Framework 4.5 %28x86 and x64%29</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
   <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
        Other similar extension points exist, see Microsoft.Common.targets.