tele 0.1.2 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (5) hide show
  1. data/README +11 -2
  2. data/bin/tele +41 -32
  3. data/tele.gemspec +1 -1
  4. data/test/tele.rb +25 -41
  5. metadata +5 -7
data/README CHANGED
@@ -4,7 +4,10 @@ NAME
4
4
  tele -- Provisioning at a distance.
5
5
 
6
6
  SYNOPSIS
7
- tele [-h] [-d path] (init|deploy)
7
+ tele init
8
+ tele deploy [-d path] [-s server]
9
+ tele tail
10
+ tele -h
8
11
 
9
12
  DESCRIPTION
10
13
  Tele is a small provisioning framework that allows you to run bash
@@ -62,6 +65,9 @@ DESCRIPTION
62
65
  configuration files. You can also use the environment variable
63
66
  TELE_HOME.
64
67
 
68
+ -s server
69
+ Allows you to specify a server you want to deploy.
70
+
65
71
  init
66
72
  Copies a .tele template to the current directory.
67
73
 
@@ -106,5 +112,8 @@ USAGE
106
112
  # Run tele deploy
107
113
  $ tele deploy
108
114
 
115
+ # Run tele deploy only for server1
116
+ $ tele deploy -s server1
117
+
109
118
  INSTALLATION
110
- $ gem install tele
119
+ $ gem install tele
data/bin/tele CHANGED
@@ -38,7 +38,7 @@ def layout
38
38
  end
39
39
 
40
40
  def servers
41
- layout["servers"]
41
+ $servers ||= layout["servers"]
42
42
  end
43
43
 
44
44
  def roles
@@ -49,30 +49,34 @@ def run(server, recipe)
49
49
  script = path("recipes", "#{recipe}.sh")
50
50
 
51
51
  if File.exist?(script)
52
- %x{bash -c "#{ssh(server, SSH_OPTIONS)} < #{script} > >(logger -t 'tele/#{server}/#{recipe}') 2>&1"}
52
+ IO.popen(ssh(server, SSH_OPTIONS), "r+") do |io|
53
+ io.puts(File.read(script))
54
+ io.close_write
55
+
56
+ while line = io.gets
57
+ yield(line)
58
+ end
59
+ end
60
+
53
61
  $?.exitstatus
54
62
  end
55
63
  end
56
64
 
57
65
  out = Module.new do
58
- def self.server(name)
59
- puts name
66
+ def self.recipe(server, recipe)
67
+ print "#{server}/#{recipe}: "
60
68
  end
61
69
 
62
70
  def self.error
63
- puts "\033[01;31mERROR\033[00m"
71
+ print "\033[01;31mERROR\033[00m"
64
72
  end
65
73
 
66
74
  def self.ok
67
- puts "\033[01;32mOK\033[00m"
68
- end
69
-
70
- def self.log(match)
71
- puts "\033[1;30m#{match[:date]} \033[1;33m#{match[:who]}\033[00m #{match[:message]}"
75
+ print "\033[01;32mOK\033[00m"
72
76
  end
73
77
 
74
78
  def self.unknown
75
- puts "?"
79
+ print "\033[1;33m?\033[00m"
76
80
  end
77
81
  end
78
82
 
@@ -86,9 +90,17 @@ commands = Clap.run ARGV,
86
90
  },
87
91
  "-d" => lambda { |path|
88
92
  ENV["TELE_HOME"] = File.join(Dir.pwd, path)
93
+ },
94
+ "-s" => lambda { |server|
95
+ unless servers.has_key?(server)
96
+ $stderr.puts "Unknown server: #{server}"
97
+ exit 1
98
+ end
99
+
100
+ servers.delete_if { |s, _| s != server }
89
101
  }
90
102
 
91
- Clap.run commands,
103
+ commands = Clap.run commands,
92
104
  "init" => lambda {
93
105
  source = File.expand_path("../templates/.tele", File.dirname(__FILE__))
94
106
  target = File.expand_path(Dir.pwd)
@@ -96,19 +108,6 @@ Clap.run commands,
96
108
  %x{cp -r #{source} #{target}}
97
109
 
98
110
  %x{find #{target} -name .empty -print0 | xargs rm}
99
- },
100
-
101
- "tail" => lambda {
102
- $stdout.sync = true
103
-
104
- parser = %r{^(?<date>.* \d\d:\d\d:\d\d) \w+ tele/(?<who>.*)\[\d+\]: (?<message>.*)$}
105
-
106
- IO.popen("tail -0 -f /var/log/system.log /var/log/syslog 2>/dev/null") do |io|
107
- while line = io.gets
108
- next unless match = parser.match(line)
109
- out.log(match)
110
- end
111
- end
112
111
  }
113
112
 
114
113
  unless File.directory?(path)
@@ -122,19 +121,24 @@ SSH_OPTIONS = [
122
121
  "-S", "/tmp/ssh-%r@%h:%p",
123
122
  ]
124
123
 
125
- Clap.run commands,
124
+ commands = Clap.run commands,
126
125
  "deploy" => lambda {
127
126
  servers.each do |server, _|
128
127
  IO.popen(ssh(server, SSH_OPTIONS + %w[-Mq]), "w")
129
128
  end
130
129
 
131
130
  servers.each do |server, assigned_roles|
132
- out.server(server)
133
-
134
131
  recipes_for(assigned_roles).each do |recipe|
135
- print " #{recipe}: "
132
+ out.recipe(server, recipe)
133
+
134
+ # first = true
136
135
 
137
- case run(server, recipe)
136
+ result = run(server, recipe) do |line|
137
+ print line
138
+ out.recipe(server, recipe) # unless first
139
+ end
140
+
141
+ case result
138
142
  when nil
139
143
  out.unknown
140
144
  when 0
@@ -142,8 +146,13 @@ Clap.run commands,
142
146
  else
143
147
  out.error
144
148
  end
145
- end
146
149
 
147
- puts
150
+ print "\n"
151
+ end
148
152
  end
149
153
  }
154
+
155
+ unless commands.empty?
156
+ $stderr.puts "Error: unrecognized parameter: #{commands.join(" ")}"
157
+ exit 1
158
+ end
data/tele.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = "tele"
3
- s.version = "0.1.2"
3
+ s.version = "0.1.3"
4
4
  s.summary = "Provisioning at a distance"
5
5
  s.description = "Tele is a small provisioning framework that allows you to run bash scripts on remote servers over SSH."
6
6
  s.authors = ["Damian Janowski", "Michel Martens"]
data/test/tele.rb CHANGED
@@ -31,7 +31,7 @@ test "`tele deploy` displays missing recipes" do
31
31
  out, err = tele("deploy", "-d", "test/.tele.missing-recipes")
32
32
 
33
33
  assert out =~ /db-1/
34
- assert out =~ /redis: .*\?/
34
+ assert out =~ /redis.*: .*\?/
35
35
  end
36
36
 
37
37
  test "`tele deploy` displays layout" do
@@ -39,30 +39,37 @@ test "`tele deploy` displays layout" do
39
39
 
40
40
  assert err.empty?
41
41
 
42
- parts = out.split("\n\n")
42
+ parts = out.split("\n")
43
43
 
44
- assert parts[0] =~ /app-1/
45
- assert parts[0] =~ /redis/
46
- assert parts[0] =~ /ruby/
47
- assert parts[0] =~ /unicorn/
44
+ assert parts[0] =~ %r[^app-1/redis]
45
+ assert parts[1] =~ %r[^app-1/ruby]
46
+ assert parts[2] =~ %r[^app-1/unicorn]
48
47
 
49
- assert parts[1] =~ /app-2/
50
- assert parts[1] =~ /redis/
48
+ assert parts[3] =~ %r[^app-2/redis]
51
49
 
52
- assert parts[2] =~ /app-3/
53
- assert parts[2] =~ /redis/
54
- assert parts[2] =~ /ruby/
55
- assert parts[2] =~ /unicorn/
50
+ assert parts[4] =~ %r[app-3/redis]
51
+ assert parts[5] =~ %r[app-3/ruby]
52
+ assert parts[6] =~ %r[app-3/unicorn]
56
53
  end
57
54
 
58
55
  test "`tele deploy` runs recipes" do
59
56
  out, err = tele("deploy", "-d", "test/.tele.simple")
60
57
 
61
- assert out =~ /staging/
62
- assert out =~ /cassandra: .*ERROR/
63
- assert out =~ /redis: .*OK/
58
+ assert out =~ %r[^staging/cassandra.* .*ERROR]
59
+ assert out =~ %r[^staging/redis.* Installed]
60
+ assert out =~ %r[^staging/redis.* .*OK]
64
61
  end
65
62
 
63
+ test "`tele deploy -s production` runs only production recipes" do
64
+ out, err = tele("deploy", "-d", "test/.tele.multi", "-s", "production")
65
+
66
+ assert out !~ /staging/
67
+
68
+ assert out =~ %r[production/cassandra.*: .*ERROR]
69
+ assert out =~ %r[production/redis.*: .*OK]
70
+ end
71
+
72
+
66
73
  test "`tele deploy` doesn't run the same recipe twice in a single server" do
67
74
  out, err = tele("deploy", "-d", "test/.tele.simple")
68
75
 
@@ -89,31 +96,8 @@ test "`tele init`" do
89
96
  end
90
97
  end
91
98
 
92
- test "Logging to syslog" do
93
- out, err = tele("status", "-d", "test/.tele.simple")
94
-
95
- assert `tail -n 20 /var/log/syslog /var/log/system.log 2>/dev/null`[%r{tele/staging/cassandra.*Can't find Cassandra}]
96
- end
97
-
98
- test "`tele tail` shows Tele logs" do
99
- log = []
100
- tailing = false
101
-
102
- t = Thread.new do
103
- Open3.popen3("#{root "bin/tele"} tail") do |_, out, _, _|
104
- tailing = true
105
- while line = out.gets
106
- log << line
107
- end
108
- end
109
- end
110
-
111
- until tailing; end
112
-
113
- tele("deploy", "-d", "test/.tele.simple")
114
-
115
- t.kill
99
+ test "`tele foobar` shouts an error" do
100
+ out, err = tele("foobar", "-d", "test/.tele.simple")
116
101
 
117
- assert_equal log.size, 1
118
- assert log[0] =~ %r{staging/cassandra.*Can't find Cassandra}
102
+ assert err.include?("Error: unrecognized parameter: foobar")
119
103
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tele
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,12 +10,11 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2011-09-09 00:00:00.000000000 +02:00
14
- default_executable:
13
+ date: 2012-01-17 00:00:00.000000000 Z
15
14
  dependencies:
16
15
  - !ruby/object:Gem::Dependency
17
16
  name: clap
18
- requirement: &2154016360 !ruby/object:Gem::Requirement
17
+ requirement: &70301175305080 !ruby/object:Gem::Requirement
19
18
  none: false
20
19
  requirements:
21
20
  - - ! '>='
@@ -23,7 +22,7 @@ dependencies:
23
22
  version: '0'
24
23
  type: :runtime
25
24
  prerelease: false
26
- version_requirements: *2154016360
25
+ version_requirements: *70301175305080
27
26
  description: Tele is a small provisioning framework that allows you to run bash scripts
28
27
  on remote servers over SSH.
29
28
  email:
@@ -43,7 +42,6 @@ files:
43
42
  - templates/.tele/recipes/.empty
44
43
  - tele.gemspec
45
44
  - test/tele.rb
46
- has_rdoc: true
47
45
  homepage: http://github.com/djanowski/tele
48
46
  licenses: []
49
47
  post_install_message:
@@ -64,7 +62,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
64
62
  version: '0'
65
63
  requirements: []
66
64
  rubyforge_project:
67
- rubygems_version: 1.6.2
65
+ rubygems_version: 1.8.10
68
66
  signing_key:
69
67
  specification_version: 3
70
68
  summary: Provisioning at a distance