relay 0.0.3 → 0.1.0

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/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2008 Michel Martens and Damian Janowski
1
+ Copyright (c) 2009, 2010 Michel Martens and Damian Janowski
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining a copy
4
4
  of this software and associated documentation files (the "Software"), to deal
@@ -10,13 +10,22 @@ Relay is a simple library that allows you to send commands over SSH.
10
10
  It uses your own SSH, not a Ruby version, so you can profit from your
11
11
  settings and public/private keys.
12
12
 
13
+ The following options are available:
14
+
15
+ -c command
16
+ Executes the command on the passed servers.
17
+
18
+ -f recipe
19
+ Reads commands from a file and executes them in the passed servers.
20
+
13
21
  Usage
14
22
  -----
15
23
 
16
- To send a command to a server called `myserver`:
24
+ To send a command to two servers called `server1` and `server2`:
17
25
 
18
- $ relay execute "ls -al" myserver
19
- $ relay execute "cd foo; ls" myserver
26
+ $ relay -c "ls -al" server1 server2
27
+ $ relay -c "cd foo; ls" server1 server2
28
+ $ relay -c "cd foo" -c "ls" server1 server2
20
29
 
21
30
  If you want to send more commands, you can write a shell script:
22
31
 
@@ -25,33 +34,24 @@ If you want to send more commands, you can write a shell script:
25
34
  ls
26
35
  mkdir -p bar/baz
27
36
 
28
- $ relay recipe.sh myserver
29
-
30
- It will execute those commands on `myserver` and show the output.
31
-
32
- This last form accepts one file as the recipe and one or many servers:
33
-
34
- $ relay recipe.sh server1 server2 server3
37
+ $ relay -f recipe.sh server1 server2
35
38
 
36
- You can also add your public key to a remote server's authorized keys file:
39
+ It will execute those commands on both servers and show the output.
37
40
 
38
- $ relay identify myserver
39
41
 
40
- Relay exposes the `execute` method, which returns the output of the command:
42
+ You can use each flag many times, so this is possible:
41
43
 
42
- >> require "relay"
43
- >> Relay.execute "echo foo", "myserver"
44
- => ["foo\n"]
44
+ $ relay -f recipe1.sh -f recipe2.sh server1 server2 server3
45
45
 
46
46
  Installation
47
47
  ------------
48
48
 
49
- $ sudo gem install relay
49
+ $ gem install relay
50
50
 
51
51
  License
52
52
  -------
53
53
 
54
- Copyright (c) 2009 Michel Martens and Damian Janowski
54
+ Copyright (c) 2009, 2010 Michel Martens and Damian Janowski
55
55
 
56
56
  Permission is hereby granted, free of charge, to any person
57
57
  obtaining a copy of this software and associated documentation
data/Rakefile CHANGED
@@ -1,5 +1,7 @@
1
1
  task :test do
2
- system "cd test && ruby relay_test.rb"
2
+ require "cutest"
3
+
4
+ Cutest.run(Dir["test/relay_test.rb"])
3
5
  end
4
6
 
5
7
  task :default => :test
data/bin/relay CHANGED
@@ -1,21 +1,64 @@
1
- #! /usr/bin/env ruby -rubygems
1
+ #! /usr/bin/env ruby
2
2
 
3
- require File.join(File.dirname(__FILE__), "..", "lib", "relay")
3
+ help = <<-EOS
4
+ RELAY(1)
4
5
 
5
- # A way to extend Relay is to write tasks in a Thorfile in the project's root directory.
6
- # Relay loads the Thorfile if there is one, and all the tasks that are declared in the
7
- # class Relay become available.
8
- if File.exists?("Thorfile")
9
- load("Thorfile")
10
- end
6
+ NAME
7
+ relay -- Relay commands over SSH.
8
+
9
+ SYNOPSIS
10
+ relay [-c command] [-f recipe] server1 [server2 ...]
11
+
12
+ DESCRIPTION
13
+ Relay is a simple library that allows you to send commands over SSH. It uses
14
+ your own SSH, not a Ruby version, so you can profit from your settings and
15
+ public/private keys.
16
+
17
+ The following options are available:
18
+
19
+ -c command
20
+ Executes the command on the passed servers.
21
+
22
+ -f recipe
23
+ Reads commands from a file and executes them in the passed servers.
24
+
25
+ USAGE
26
+ To send a command to two servers called `server1` and `server2`:
27
+
28
+ $ relay -c "ls -al" server1 server2
29
+ $ relay -c "cd foo; ls" server1 server2
30
+ $ relay -c "cd foo" -c "ls" server1 server2
31
+
32
+ If you want to send more commands, you can write a shell script:
33
+
34
+ $ cat recipe.sh
35
+ cd foo
36
+ ls
37
+ mkdir -p bar/baz
11
38
 
12
- # Start the relay tasks.
13
- if ARGV[0] && File.exists?(ARGV[0])
14
- file = ARGV.shift
39
+ $ relay -f recipe.sh server1 server2
15
40
 
16
- ARGV.each do |server|
17
- Relay.new.recipe(file, server)
18
- end
19
- else
20
- Relay.start
41
+ It will execute those commands on both servers and show the output.
42
+
43
+
44
+ You can use each flag many times, so this is possible:
45
+
46
+ $ relay -f recipe1.sh -f recipe2.sh server1 server2 server3
47
+ EOS
48
+
49
+ if ARGV.empty?
50
+ puts help
51
+ exit
21
52
  end
53
+
54
+ require "clap"
55
+
56
+ require File.expand_path("../lib/relay", File.dirname(__FILE__))
57
+
58
+ relay = Relay.new
59
+
60
+ servers = Clap.run ARGV,
61
+ "-f" => relay.method(:recipe),
62
+ "-c" => relay.method(:command)
63
+
64
+ relay.run(servers)
@@ -1,6 +1,5 @@
1
1
  #! /usr/bin/env ruby
2
2
 
3
- require "thor"
4
3
  require "open3"
5
4
 
6
5
  class Ssh
@@ -42,47 +41,35 @@ class Ssh
42
41
  end
43
42
  end
44
43
 
45
- class Relay < Thor
44
+ class Relay
45
+ VERSION = "0.1.0"
46
46
 
47
- # If you require the relay library, you can issue commands
48
- # with the execute method:
49
- #
50
- # @example
51
- #
52
- # >> require "relay"
53
- # >> Relay.execute "echo foo", "myserver"
54
- # => ["foo\n"]
55
- def self.execute(*args)
56
- start args.unshift("execute").push("--quiet")
47
+ def initialize
48
+ @recipes = []
49
+ @commands = []
57
50
  end
58
51
 
59
- desc "identify SERVER", "Copies your public key to a remote server"
60
- method_option :key, :type => :string, :aliases => "-k"
61
- method_option :path, :type => :string, :aliases => "-p"
62
- def identify(server)
63
- path = options[:path] || "~/.ssh/authorized_keys"
64
- keys = [options[:key], "~/.ssh/id_rsa.pub", "~/.ssh/id_dsa.pub"].compact
65
- key = keys.find { |k| File.exists?(File.expand_path(k)) }
66
-
67
- if system %Q{cat #{key} | ssh #{server} "cat >> #{path}"}
68
- say_status :copied, "#{key} to #{server}:#{path}"
69
- end
52
+ def recipe(recipe)
53
+ @recipes << recipe
70
54
  end
71
55
 
72
- desc "recipe RECIPE SERVER", "Execute commands contained in RECIPE in the context of SERVER"
73
- def recipe(recipe, server)
74
- Ssh.new(server).start do |session|
75
- File.readlines(recipe).each do |command|
76
- session.run(command)
77
- end
78
- end
56
+ def command(command)
57
+ @commands << command
79
58
  end
80
59
 
81
- desc "execute COMMAND SERVER", "Execute COMMAND in the context of SERVER"
82
- method_option :quiet, :type => :boolean, :aliases => "-q"
83
- def execute(command, server)
84
- Ssh.new(server, options[:quiet]).start do |session|
85
- session.run(command)
60
+ def run(servers)
61
+ servers.each do |server|
62
+ Ssh.new(server).start do |session|
63
+ @commands.each do |command|
64
+ session.run(command)
65
+ end
66
+
67
+ @recipes.each do |recipe|
68
+ File.readlines(recipe).each do |command|
69
+ session.run(command)
70
+ end
71
+ end
72
+ end
86
73
  end
87
74
  end
88
75
  end
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = "relay"
3
- s.version = "0.0.3"
3
+ s.version = "0.1.0"
4
4
  s.summary = "Relay commands over SSH"
5
5
  s.description = "Relay allows you to execute remote commands via SSH with ease."
6
6
  s.authors = ["Damian Janowski", "Michel Martens"]
@@ -9,9 +9,9 @@ Gem::Specification.new do |s|
9
9
 
10
10
  s.rubyforge_project = "relay"
11
11
 
12
- s.executables << "relay"
12
+ s.executables.push("relay")
13
13
 
14
- s.add_dependency("thor", "~> 0.11")
14
+ s.add_dependency("clap")
15
15
 
16
16
  s.files = ["LICENSE", "README.markdown", "Rakefile", "bin/relay", "lib/relay.rb", "relay.gemspec", "test/commands.rb", "test/relay_test.rb", "test/test_helper.rb"]
17
17
  end
@@ -1,7 +1,7 @@
1
1
  require "open3"
2
2
  require "socket"
3
3
 
4
- module Test::Commands
4
+ module Commands
5
5
  def sh(cmd)
6
6
  out, err = nil
7
7
 
@@ -1,28 +1,18 @@
1
- require File.join(File.dirname(__FILE__), "test_helper")
1
+ require File.expand_path("test_helper", File.dirname(__FILE__))
2
2
 
3
- class TestRelay < Test::Unit::TestCase
4
- context "relay identify SERVER" do
5
- should "copy the public key to SERVER" do
6
- Dir.chdir(root("test", "tmp")) do
7
- out, err = relay("identify localhost --path #{root("test", "tmp", "authorized_keys")}")
8
-
9
- assert_match /copied/, out
10
- assert File.exists?("authorized_keys")
11
- assert File.read("authorized_keys")[/^ssh-/]
12
- end
13
- end
14
-
15
- should "send a command to SERVER" do
3
+ scope do
4
+ scope do
5
+ test "send a command to SERVER" do
16
6
  Dir.chdir(root("test", "tmp")) do
17
7
  FileUtils.touch("foobar")
18
8
 
19
- out, err = relay("execute \"ls #{root("test", "tmp")}\" localhost")
9
+ out, err = relay("-c \"ls #{root("test", "tmp")}\" localhost")
20
10
 
21
- assert_match /foobar/, out
11
+ assert out[/foobar/]
22
12
  end
23
13
  end
24
14
 
25
- should "relay a recipe of commands to SERVER" do
15
+ test "relay a recipe of commands to SERVER" do
26
16
  Dir.chdir(root("test", "tmp")) do
27
17
  File.open("recipe.sh", "w") do |file|
28
18
  file.puts "cd #{root("test", "tmp")}"
@@ -30,7 +20,7 @@ class TestRelay < Test::Unit::TestCase
30
20
  file.puts "cat list"
31
21
  end
32
22
 
33
- out, err = relay("recipe.sh localhost")
23
+ out, err = relay("-f recipe.sh localhost")
34
24
 
35
25
  assert out["$ cd #{root("test", "tmp")}"]
36
26
  assert out["$ ls -al > list"]
@@ -38,10 +28,5 @@ class TestRelay < Test::Unit::TestCase
38
28
  assert out["recipe.sh"]
39
29
  end
40
30
  end
41
-
42
- should "return the output when used programmatically" do
43
- assert_equal ["foo\n"], Relay.execute("echo foo", "localhost")
44
- assert_equal ["foo\n", "bar\n", "baz\n"], Relay.execute("echo foo; echo bar; echo baz", "localhost")
45
- end
46
31
  end
47
32
  end
@@ -1,34 +1,25 @@
1
1
  require "rubygems"
2
- require "contest"
3
2
  require "fileutils"
4
- require File.join(File.dirname(__FILE__), "..", "lib", "relay")
5
3
 
6
- ROOT = File.expand_path(File.join(File.dirname(__FILE__), ".."))
7
-
8
- $:.unshift ROOT
4
+ require File.expand_path("../lib/relay", File.dirname(__FILE__))
5
+ require File.expand_path("commands", File.dirname(__FILE__))
9
6
 
10
- require "test/commands"
7
+ include Commands
11
8
 
12
- class Test::Unit::TestCase
13
- include Test::Commands
9
+ ROOT = File.expand_path(File.join(File.dirname(__FILE__), ".."))
14
10
 
15
- def root(*args)
16
- File.join(ROOT, *args)
17
- end
11
+ $:.unshift ROOT
18
12
 
19
- def setup
20
- Dir[root("test", "tmp", "*")].each do |file|
21
- FileUtils.rm(file)
22
- end
23
- end
13
+ def root(*args)
14
+ File.join(ROOT, *args)
15
+ end
24
16
 
25
- def teardown
26
- Dir[root("test", "tmp", "*")].each do |file|
27
- FileUtils.rm(file)
28
- end
17
+ prepare do
18
+ Dir[root("test", "tmp", "*")].each do |file|
19
+ FileUtils.rm(file)
29
20
  end
21
+ end
30
22
 
31
- def relay(args = nil)
32
- sh("ruby -rubygems #{root "bin/relay"} #{args}")
33
- end
23
+ def relay(args = nil)
24
+ sh("ruby -rubygems #{root "bin/relay"} #{args}")
34
25
  end
metadata CHANGED
@@ -1,7 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: relay
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 1
8
+ - 0
9
+ version: 0.1.0
5
10
  platform: ruby
6
11
  authors:
7
12
  - Damian Janowski
@@ -10,19 +15,22 @@ autorequire:
10
15
  bindir: bin
11
16
  cert_chain: []
12
17
 
13
- date: 2009-11-21 00:00:00 -03:00
18
+ date: 2010-11-06 00:00:00 -03:00
14
19
  default_executable:
15
20
  dependencies:
16
21
  - !ruby/object:Gem::Dependency
17
- name: thor
18
- type: :runtime
19
- version_requirement:
20
- version_requirements: !ruby/object:Gem::Requirement
22
+ name: clap
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
21
26
  requirements:
22
- - - ~>
27
+ - - ">="
23
28
  - !ruby/object:Gem::Version
24
- version: "0.11"
25
- version:
29
+ segments:
30
+ - 0
31
+ version: "0"
32
+ type: :runtime
33
+ version_requirements: *id001
26
34
  description: Relay allows you to execute remote commands via SSH with ease.
27
35
  email:
28
36
  - djanowski@dimaion.com
@@ -53,21 +61,25 @@ rdoc_options: []
53
61
  require_paths:
54
62
  - lib
55
63
  required_ruby_version: !ruby/object:Gem::Requirement
64
+ none: false
56
65
  requirements:
57
66
  - - ">="
58
67
  - !ruby/object:Gem::Version
68
+ segments:
69
+ - 0
59
70
  version: "0"
60
- version:
61
71
  required_rubygems_version: !ruby/object:Gem::Requirement
72
+ none: false
62
73
  requirements:
63
74
  - - ">="
64
75
  - !ruby/object:Gem::Version
76
+ segments:
77
+ - 0
65
78
  version: "0"
66
- version:
67
79
  requirements: []
68
80
 
69
81
  rubyforge_project: relay
70
- rubygems_version: 1.3.5
82
+ rubygems_version: 1.3.7
71
83
  signing_key:
72
84
  specification_version: 3
73
85
  summary: Relay commands over SSH