Skip to content

Instantly share code, notes, and snippets.

@beccasaurus
Created October 24, 2009 20:00
Show Gist options
  • Save beccasaurus/217717 to your computer and use it in GitHub Desktop.
Save beccasaurus/217717 to your computer and use it in GitHub Desktop.

PuTTY Session Manager

Installation

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' }
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment