Make sure putty.exe is in your PATH (or put it in C:Windows)
Install dependencies:
C:\ gem install sinatra haml win32-open3
To run:
C:\ ruby putty-session-manager.rb
The site will be available at localhost:4567
Make sure putty.exe is in your PATH (or put it in C:Windows)
Install dependencies:
C:\ gem install sinatra haml win32-open3
To run:
C:\ ruby putty-session-manager.rb
The site will be available at localhost:4567
| #! /usr/bin/env ruby | |
| %w( rubygems sinatra haml sass ).each {|lib| require lib } | |
| begin | |
| require 'win32/open3' | |
| rescue LoadError | |
| puts "Win32 Open3 could not be loaded. This is needed to execute PuTTy on Windows." | |
| require 'open3' | |
| end | |
| begin | |
| require 'win32/registry' | |
| rescue LoadError | |
| puts "Win32 Registry reader could not be loaded. This requires Ruby on Windows." | |
| end | |
| helpers do | |
| def sessions_file() File.dirname(__FILE__) + '/sessions.yml' end | |
| def saved_sessions() File.file?(sessions_file) ? YAML.load_file(sessions_file) : [] end | |
| def add_session(name) persist_sessions(saved_sessions + [name]) end | |
| def remove_session(name) persist_sessions(saved_sessions - [name]) end | |
| def persist_sessions(names) File.open(sessions_file, 'w'){|f| f << names.to_yaml } end | |
| def putty_saved_sessions | |
| if defined?(Win32::Registry) | |
| Win32::Registry::HKEY_CURRENT_USER.open('Software\SimonTatham\PuTTY').open("Sessions").keys | |
| else | |
| [] | |
| end | |
| end | |
| end | |
| get '/' do | |
| haml :index | |
| end | |
| get '/stylesheets/application.css' do | |
| content_type 'text/css' | |
| sass :stylesheet | |
| end | |
| post '/sessions' do | |
| add_session params[:session] | |
| redirect '/' | |
| end | |
| post '/sessions/:name' do | |
| Open3.popen3 %{cmd.exe /C putty.exe -load "#{ params[:name] }"} | |
| redirect '/' | |
| end | |
| delete '/sessions/:name' do | |
| remove_session params[:name] | |
| redirect '/' | |
| end | |
| __END__ | |
| @@ index | |
| %h1 PuTTY Sessions | |
| %ul.sessions | |
| - for name in putty_saved_sessions | |
| %li | |
| = name | |
| %form{ :action => "/sessions/#{ name }", :method => 'post' } | |
| %input{ :type => 'submit', :value => 'launch' } | |
| - for name in saved_sessions | |
| %li | |
| = name | |
| %form{ :action => "/sessions/#{ name }", :method => 'post' } | |
| %input{ :type => 'submit', :value => 'launch' } | |
| %form{ :action => "/sessions/#{ name }", :method => 'post' } | |
| %input{ :type => 'hidden', :name => '_method', :value => 'delete' } | |
| %input{ :type => 'submit', :value => 'remove' } | |
| %form{ :action => '/sessions', :method => 'post' } | |
| %input#name{ :type => 'text', :name => 'session' } | |
| %input{ :type => 'submit', :value => 'Add Session'} | |
| @@ layout | |
| !!! XML | |
| !!! | |
| %html | |
| %head | |
| %title PuTTY Session Manager | |
| %link{ :rel => 'stylesheet', :type => 'text/css', :href => '/stylesheets/application.css' } | |
| %body | |
| #content= yield | |
| :javascript | |
| document.getElementById('name').focus(); | |
| @@ stylesheet | |
| body | |
| :font 13px/1.5em Helvetica, Arial, Verdana, sans-serif | |
| :background-color #666 | |
| :padding 0.5em | |
| #content | |
| :background-color white | |
| :padding 1em | |
| :-moz-border-radius 1em | |
| :-webkit-border-radius 1em | |
| :-moz-box-shadow 0.3em 0.3em 0.5em black | |
| :-webkit-box-shadow 0.3em 0.3em 0.5em black | |
| ul.sessions | |
| :margin 2em 0 | |
| li | |
| :font-size 1.3em | |
| :font-weight bold | |
| :margin-bottom 0.5em | |
| form | |
| :display inline | |
| :margin-left 0.5em |
| require 'rubygems' | |
| require 'spec' | |
| require 'webrat' | |
| require File.dirname(__FILE__) + '/putty-session-manager' | |
| Webrat.configure { |config| config.mode = :mechanize } | |
| Spec::Runner.configure do |config| | |
| config.include Webrat::Methods | |
| config.include Webrat::Matchers | |
| end | |
| describe 'PuTTY Session Manager' do | |
| before do | |
| FileUtils.rm_f(File.dirname(__FILE__) + '/sessions.yml') | |
| end | |
| it 'should be able to add session names' do | |
| visit 'http://localhost:9393/' | |
| response_body.should_not include('Foo') | |
| fill_in :session, :with => 'Foo' | |
| click_button 'Add Session' | |
| visit 'http://localhost:9393/' | |
| response_body.should include('Foo') | |
| end | |
| it 'should be able to remove session names' do | |
| visit 'http://localhost:9393/' | |
| fill_in :session, :with => 'Foo' | |
| click_button 'Add Session' | |
| visit 'http://localhost:9393/' | |
| response_body.should include('Foo') | |
| click_button 'remove' | |
| visit 'http://localhost:9393/' | |
| response_body.should_not include('Foo') | |
| end | |
| end |
| #! /usr/bin/env ruby | |
| %w( rubygems sinatra haml sass win32/open3 win32/registry ).each {|lib| require lib } | |
| helpers do | |
| def putty_saved_sessions | |
| Win32::Registry::HKEY_CURRENT_USER.open('Software\SimonTatham\PuTTY').open("Sessions").keys | |
| end | |
| end | |
| get '/' do | |
| haml :index | |
| end | |
| post '/sessions/:name' do | |
| Open3.popen3 %{cmd.exe /C putty.exe -load "#{ params[:name] }"} | |
| redirect '/' | |
| end | |
| __END__ | |
| @@ index | |
| %h1 PuTTY Sessions | |
| %ul.sessions | |
| - for name in putty_saved_sessions | |
| %li | |
| = name | |
| %form{ :action => "/sessions/#{ name }", :method => 'post' } | |
| %input{ :type => 'submit', :value => 'launch' } |