tunnel_vision 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/.gitignore ADDED
@@ -0,0 +1,4 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in tunnel_vision.gemspec
4
+ gemspec
data/README.md ADDED
@@ -0,0 +1,66 @@
1
+ # TunnelVission!
2
+
3
+ ## What is it?
4
+
5
+ Simple tool which lets you create definitions of ssh tunnels your project will need.
6
+
7
+ Then you by issuing one command you can open all of them and carry on with your work.
8
+
9
+ ### Scratching an itch:
10
+
11
+ I find myself working remotely and/or changing machines more often than I could imagine.
12
+
13
+ Because at my day job I'm working only on a part of a big system I need to maintain connectivity of my development environment with other services by using SSH tunnels.
14
+
15
+ At worst I need 4 tunnels for my dev setup to be usable. *sigh*
16
+
17
+ So far I've been maintaining a set of different shell scripts which helped me establish SSH tunnels to different servers and such.
18
+
19
+ TunnelVision solves that problem.
20
+
21
+
22
+ ### Inspired by
23
+
24
+ - [takeup by Maxim Chernyak](https://github.com/maxim/takeup)
25
+ - [foreman by David Dollar](https://github.com/ddollar/foreman)
26
+
27
+
28
+ # Installation
29
+
30
+ `gem install tunnel_vision`
31
+
32
+ # Usage
33
+
34
+ - `tunnelvision` - shows simple help
35
+ - `tunnelvision generate` - generates example `tunnels.yaml` file
36
+ - `tunnelvision start` - opens all tunnels defined in `tunnels.yaml`
37
+ - `tunnelvision status` - shows information about opened tunnels
38
+ - `tunnelvision stop` - closes all opened tunnels defined by `tunnels.yaml`
39
+
40
+ ### Requirements
41
+
42
+ - `ruby 1.8.7` (probably works with 1.9.2)
43
+ - OpenSSL support enabled in Ruby (OSX comes with that, Linux needs ruby-openssl package)
44
+ - `net-ssh` gem (gets installed with TunnelVission)
45
+
46
+ ## Important!
47
+
48
+ You need to set up ssh-key based authentication before using TunnelVision. While it's possible to use passwords straight from `tunnels.yaml` it's horribly insecure!
49
+
50
+ You should always use ssh keys anyway.
51
+
52
+ ### Bugs?
53
+
54
+ Yeah, plenty.
55
+
56
+ This gem was created in few hours, so it has few things which can explode. I will hunt them down.
57
+
58
+ ## Todo
59
+
60
+ - colors
61
+
62
+ # Licence
63
+
64
+ TunnelVision is a product of Łukasz Korecki (lukasz@coffeesounds.com)
65
+
66
+ Licenced under MIT Licence
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
data/bin/tunnelvision ADDED
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'tunnel_vision'
4
+ require 'tunnel_vision/runner'
5
+
6
+ TunnelVision::Runner.new ARGV
@@ -0,0 +1,105 @@
1
+ require 'yaml'
2
+ require 'fileutils'
3
+
4
+ module TunnelVision
5
+ class Runner
6
+ def initialize args
7
+ if args.empty?
8
+ puts "Command me!"
9
+ puts help
10
+ exit 0
11
+ end
12
+
13
+ @tunnel = TunnelVision::Tunnel.new
14
+
15
+ case args.first
16
+ when 'generate'
17
+ generate
18
+ when 'start'
19
+ start
20
+ when 'status'
21
+ status
22
+ when 'stop'
23
+ stop
24
+ else
25
+ puts "Unrecognized command"
26
+ end
27
+ end
28
+
29
+ def start
30
+ begin
31
+ tunnels = YAML::load_file 'tunnels.yaml'
32
+ rescue
33
+ puts "No tunnels file!"
34
+ exit 1
35
+ end
36
+
37
+ current = {}
38
+ tunnels.each do |tunnel_def|
39
+ puts "Starting:\n\t#{tunnel_def['description']}"
40
+ pid = @tunnel.add tunnel_def['tunnel'], tunnel_def['user'], tunnel_def['host']
41
+ current[pid] = tunnel_def['description']
42
+ end
43
+
44
+ File.open('.opened_tunnels','w') do |file|
45
+ YAML::dump(current, file)
46
+ end
47
+ end
48
+
49
+ def status
50
+ begin
51
+ current = YAML::load_file '.opened_tunnels'
52
+ rescue
53
+ puts "No tunnels or .opened_tunnels files is locked/deleted"
54
+ exit 0
55
+ end
56
+
57
+ puts "Current tunnels"
58
+ current.each do |id, description|
59
+ puts "\t#{description} (#{id})"
60
+ end
61
+ end
62
+
63
+ def stop
64
+ @tunnel.pids = YAML::load_file('.opened_tunnels').keys
65
+ @tunnel.close_all!
66
+ FileUtils.rm '.opened_tunnels'
67
+
68
+ end
69
+
70
+ def help
71
+ <<-HELP
72
+ tunnelvision generate - generate example tunnels file
73
+ tunnelvision start - start all ssh tunnels defined in tunnels.yaml
74
+ tunnelvision stop - stop all opened ssh tunnels
75
+ HELP
76
+ end
77
+
78
+ def generate
79
+ puts "Generating tunnels.yaml"
80
+ example = [
81
+ {
82
+ 'description' => 'irc on staging server',
83
+ "user" => 'bob',
84
+ 'host' => 'example.com',
85
+ 'tunnel' => '123:123.0.0.1:80'
86
+ },
87
+ {
88
+ 'description' => 'db from database server',
89
+ 'user' => 'clyde',
90
+ 'host' => 'bar.foo.com',
91
+ 'tunnel' => '7777:bar.foo.com:8080'
92
+ }
93
+ ]
94
+
95
+ begin
96
+ File.open('tunnels.yaml', 'w') do |file|
97
+ YAML::dump(example, file)
98
+ end
99
+
100
+ rescue "Error when creating tunnels.yaml"
101
+ end
102
+ puts "Created!"
103
+ end
104
+ end
105
+ end
@@ -0,0 +1,3 @@
1
+ module TunnelVision
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,38 @@
1
+ require 'rubygems'
2
+ require 'net/ssh'
3
+ module TunnelVision
4
+ class Tunnel
5
+ attr_accessor :pids
6
+
7
+ def initialize
8
+ @pids = []
9
+ end
10
+
11
+ def add tunnel, user, server
12
+ from, host, to = tunnel.split(':')
13
+ pid = fork do
14
+ puts "Connecting #{user}@#{server}"
15
+ begin
16
+ getaway = Net::SSH.start server, user do |ssh|
17
+ puts "setting forwarding (#{from} -> #{to} on #{host})"
18
+ ssh.forward.local from, host, to
19
+ ssh.loop { true }
20
+ end
21
+ rescue
22
+ puts ">>> AUTH ERROR <<"
23
+ exit 1
24
+ end
25
+ end
26
+ @pids << pid
27
+ pid
28
+ end
29
+
30
+ def close_all!
31
+ @pids.each do |pid|
32
+ puts "Closing #{pid}"
33
+ `kill -9 #{pid}`
34
+ end
35
+ end
36
+ end
37
+
38
+ end
@@ -0,0 +1,21 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "tunnel_vision/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "tunnel_vision"
7
+ s.version = TunnelVision::VERSION
8
+ s.platform = Gem::Platform::RUBY
9
+ s.authors = ["Łukasz Korecki"]
10
+ s.email = ["lukasz@coffeesounds.com"]
11
+ s.homepage = ""
12
+ s.summary = %q{SSH tunnel manager}
13
+ s.description = %q{Easily open and close ssh tunnels required by your project}
14
+
15
+
16
+ s.files = `git ls-files`.split("\n")
17
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
+ s.require_paths = ["lib"]
20
+ s.add_dependency "net-ssh", ">= 2.1.4"
21
+ end
metadata ADDED
@@ -0,0 +1,91 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: tunnel_vision
3
+ version: !ruby/object:Gem::Version
4
+ hash: 29
5
+ prerelease:
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 1
10
+ version: 0.0.1
11
+ platform: ruby
12
+ authors:
13
+ - "\xC5\x81ukasz Korecki"
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2011-07-03 00:00:00 +01:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: net-ssh
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ hash: 3
30
+ segments:
31
+ - 2
32
+ - 1
33
+ - 4
34
+ version: 2.1.4
35
+ type: :runtime
36
+ version_requirements: *id001
37
+ description: Easily open and close ssh tunnels required by your project
38
+ email:
39
+ - lukasz@coffeesounds.com
40
+ executables:
41
+ - tunnelvision
42
+ extensions: []
43
+
44
+ extra_rdoc_files: []
45
+
46
+ files:
47
+ - .gitignore
48
+ - Gemfile
49
+ - README.md
50
+ - Rakefile
51
+ - bin/tunnelvision
52
+ - lib/tunnel_vision.rb
53
+ - lib/tunnel_vision/runner.rb
54
+ - lib/tunnel_vision/version.rb
55
+ - tunnel_vision.gemspec
56
+ has_rdoc: true
57
+ homepage: ""
58
+ licenses: []
59
+
60
+ post_install_message:
61
+ rdoc_options: []
62
+
63
+ require_paths:
64
+ - lib
65
+ required_ruby_version: !ruby/object:Gem::Requirement
66
+ none: false
67
+ requirements:
68
+ - - ">="
69
+ - !ruby/object:Gem::Version
70
+ hash: 3
71
+ segments:
72
+ - 0
73
+ version: "0"
74
+ required_rubygems_version: !ruby/object:Gem::Requirement
75
+ none: false
76
+ requirements:
77
+ - - ">="
78
+ - !ruby/object:Gem::Version
79
+ hash: 3
80
+ segments:
81
+ - 0
82
+ version: "0"
83
+ requirements: []
84
+
85
+ rubyforge_project:
86
+ rubygems_version: 1.5.0
87
+ signing_key:
88
+ specification_version: 3
89
+ summary: SSH tunnel manager
90
+ test_files: []
91
+