poet 0.0.1 → 0.2
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 +1 -0
- data/History.txt +11 -0
- data/README.md +9 -0
- data/Rakefile +4 -0
- data/bin/poet +32 -30
- data/features/permissions.feature +10 -0
- data/features/running.feature +30 -0
- data/features/selective_files.feature +45 -0
- data/features/step_definitions/permissions_steps.rb +3 -0
- data/features/support/env.rb +3 -0
- data/lib/poet/version.rb +1 -1
- data/poet.gemspec +3 -2
- metadata +74 -44
- data/README +0 -9
data/.gitignore
CHANGED
data/History.txt
ADDED
data/README.md
ADDED
@@ -0,0 +1,9 @@
|
|
1
|
+
Lost in a long list of host stanzas in your `$HOME/.ssh/config`?
|
2
|
+
|
3
|
+
Fear not -- divide them up into several smaller files under `$HOME/.ssh/config.d/` and run `poet` to concatenate them into a single ssh_config.
|
4
|
+
|
5
|
+
`poet` does not overwrite your existing ssh_config. If you want to play with it, move your existing config out of the way.
|
6
|
+
|
7
|
+
Stanzas under `$HOME/.ssh/config.d/` with an extension of .disabled are ignored by poet. Every now and then, when you do need it, run `poet --with CONFIG` to explicitly include `CONFIG.disabled` in your generated ssh_config. You can even include several by running several '--with' options or using `--with CONFIG1,CONFIG2`.
|
8
|
+
|
9
|
+
If you only want an ssh_config from certain files, use `--only CONFIG` or `--only CONFIG1,CONFIG2`.
|
data/Rakefile
CHANGED
data/bin/poet
CHANGED
@@ -2,61 +2,63 @@
|
|
2
2
|
|
3
3
|
require 'optparse'
|
4
4
|
|
5
|
-
CONF_DIR = File.expand_path('~/.ssh/config.d')
|
6
|
-
SSH_CONFIG = File.expand_path('~/.ssh/config')
|
7
5
|
MAGIC_LINE = "# Generated by #{File.basename(__FILE__)}"
|
8
6
|
|
9
|
-
options = {
|
7
|
+
options = {
|
8
|
+
:ssh_config => File.expand_path('~/.ssh/config'),
|
9
|
+
:verbose => false,
|
10
|
+
:with => [],
|
11
|
+
:dir => File.expand_path('~/.ssh/config.d')
|
12
|
+
}
|
10
13
|
|
11
14
|
optparse = OptionParser.new do|opts|
|
12
15
|
opts.on('-h', '--help', 'Display this screen') do
|
13
16
|
puts opts
|
14
17
|
exit
|
15
18
|
end
|
16
|
-
opts.on('-
|
19
|
+
opts.on('-d', '--dir DIR', '') do |dir|
|
20
|
+
options[:dir] = File.expand_path(dir)
|
21
|
+
end
|
22
|
+
opts.on('-o', '--output FILE', '') do |file|
|
23
|
+
options[:ssh_config] = file
|
24
|
+
end
|
25
|
+
opts.on('-v', '--verbose', 'Be verbose') do
|
17
26
|
options[:verbose] = true
|
18
27
|
end
|
19
28
|
opts.on('-w', '--with CONFIG', 'Include an otherwise disabled config file') do |file|
|
20
29
|
options[:with] += file.split(',')
|
21
30
|
options[:with].each{|file| puts "Including #{file} even if disabled..."}
|
22
31
|
end
|
23
|
-
opts.on('-o', '--only CONFIG', 'Use only given config files') do |file|
|
24
|
-
options[:only] += file.split(',')
|
25
|
-
options[:only].each{|file| puts "Using only #{file}..."}
|
26
|
-
end
|
27
32
|
end
|
28
33
|
optparse.parse!
|
29
34
|
|
30
|
-
if !File.directory?(
|
31
|
-
puts "#{
|
35
|
+
if !File.directory?(options[:dir])
|
36
|
+
$stderr.puts "#{options[:dir]} does not exist or is not a directory"
|
32
37
|
Process.exit!(1)
|
33
38
|
end
|
34
39
|
|
35
|
-
if File.exists?(
|
36
|
-
puts "Found generated ssh_config under #{
|
37
|
-
elsif File.exists?(
|
38
|
-
puts "Found hand-crafted ssh_config under #{
|
40
|
+
if File.exists?(options[:ssh_config]) && File.new(options[:ssh_config]).gets == "#{MAGIC_LINE}\n"
|
41
|
+
puts "Found generated ssh_config under #{options[:ssh_config]}. Overwriting..."
|
42
|
+
elsif File.exists?(options[:ssh_config])
|
43
|
+
$stderr.puts "Found hand-crafted ssh_config under #{options[:ssh_config]}. Please move it out of the way or specify a different output file with the -o option."
|
39
44
|
Process.exit!(2)
|
40
45
|
end
|
41
46
|
|
42
|
-
|
43
|
-
|
44
|
-
ssh_config.puts("# DO NOT EDIT THIS FILE")
|
45
|
-
ssh_config.puts("# Create or modify files under #{CONF_DIR}/ instead")
|
47
|
+
files = Dir["#{options[:dir]}/**"].reject do |file|
|
48
|
+
file =~ /\.disabled$/ && !options[:with].include?("#{File.basename(file, '.disabled')}")
|
46
49
|
end
|
47
50
|
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
end
|
52
|
-
else
|
53
|
-
files = Dir["#{CONF_DIR}/**"].select do |file|
|
54
|
-
options[:only].include?(File.basename(file, '.disabled'))
|
55
|
-
end
|
56
|
-
end
|
51
|
+
files -= [options[:ssh_config]]
|
52
|
+
|
53
|
+
entries = []
|
57
54
|
|
58
55
|
files.sort.each do |file|
|
59
|
-
|
60
|
-
|
61
|
-
|
56
|
+
entries << File.read(file)
|
57
|
+
end
|
58
|
+
|
59
|
+
File.open(options[:ssh_config], 'w', 0600) do |ssh_config|
|
60
|
+
ssh_config.puts(MAGIC_LINE)
|
61
|
+
ssh_config.puts("# DO NOT EDIT THIS FILE")
|
62
|
+
ssh_config.puts("# Create or modify files under #{options[:dir]} instead")
|
63
|
+
ssh_config.puts(entries.join("\n"))
|
62
64
|
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
Feature: Correct permissions
|
2
|
+
Scenario: User wants the generated file to work with SSH out-of-the-box.
|
3
|
+
Given a file named "permissions" with:
|
4
|
+
"""
|
5
|
+
Host permissio.ns
|
6
|
+
User whatever
|
7
|
+
"""
|
8
|
+
When I run `poet --dir . -o ssh_config`
|
9
|
+
And I run `ls -la ssh_config`
|
10
|
+
Then the file "ssh_config" should not be world-accessible
|
@@ -0,0 +1,30 @@
|
|
1
|
+
Feature: Running the program
|
2
|
+
Scenario: User runs the program
|
3
|
+
Given a file named "test" with:
|
4
|
+
"""
|
5
|
+
Host te.st
|
6
|
+
User me
|
7
|
+
"""
|
8
|
+
When I run `poet --dir . -o ssh_config`
|
9
|
+
Then the exit status should be 0
|
10
|
+
And the file "ssh_config" should contain "Host te.st"
|
11
|
+
|
12
|
+
Scenario: User wants her own files not to be overwritten
|
13
|
+
Given a file named "important" with:
|
14
|
+
"""
|
15
|
+
This is absolutely vital information
|
16
|
+
"""
|
17
|
+
When I run `poet --dir . -o important`
|
18
|
+
Then the output from "poet --dir . -o important" should contain "Found hand-crafted ssh_config"
|
19
|
+
And the exit status should not be 0
|
20
|
+
And the file "important" should contain "This is absolutely vital information"
|
21
|
+
|
22
|
+
Scenario: User wants sensible warnings
|
23
|
+
Given a file named "test" with:
|
24
|
+
"""
|
25
|
+
Host te.st
|
26
|
+
User me
|
27
|
+
"""
|
28
|
+
When I run `poet --dir missing -o ssh_config`
|
29
|
+
Then the output from "poet --dir missing -o ssh_config" should contain "missing does not exist"
|
30
|
+
And the exit status should not be 0
|
@@ -0,0 +1,45 @@
|
|
1
|
+
Feature: Selectively whitelist files
|
2
|
+
Scenario: Does not include disabled files by default
|
3
|
+
Given a file named "sometimes.disabled" with:
|
4
|
+
"""
|
5
|
+
Host sometimes
|
6
|
+
User me
|
7
|
+
"""
|
8
|
+
And a file named "always" with:
|
9
|
+
"""
|
10
|
+
Host always
|
11
|
+
User me
|
12
|
+
"""
|
13
|
+
When I run `poet --dir . -o ssh_config`
|
14
|
+
Then the file "ssh_config" should contain "Host always"
|
15
|
+
But the file "ssh_config" should not contain "Host sometimes"
|
16
|
+
|
17
|
+
Scenario: Does include disabled files when asked
|
18
|
+
Given a file named "sometimes.disabled" with:
|
19
|
+
"""
|
20
|
+
Host sometimes
|
21
|
+
User me
|
22
|
+
"""
|
23
|
+
And a file named "always" with:
|
24
|
+
"""
|
25
|
+
Host always
|
26
|
+
User me
|
27
|
+
"""
|
28
|
+
When I run `poet --dir . -o ssh_config -w sometimes`
|
29
|
+
Then the file "ssh_config" should contain "Host always"
|
30
|
+
And the file "ssh_config" should contain "Host sometimes"
|
31
|
+
|
32
|
+
Scenario: Allows to include several disabled files
|
33
|
+
Given a file named "sometimes.disabled" with:
|
34
|
+
"""
|
35
|
+
Host sometimes
|
36
|
+
User me
|
37
|
+
"""
|
38
|
+
Given a file named "almost_never.disabled" with:
|
39
|
+
"""
|
40
|
+
Host almost_never
|
41
|
+
User me
|
42
|
+
"""
|
43
|
+
When I run `poet --dir . -o ssh_config -w sometimes,almost_never`
|
44
|
+
Then the file "ssh_config" should contain "Host almost_never"
|
45
|
+
And the file "ssh_config" should contain "Host sometimes"
|
data/lib/poet/version.rb
CHANGED
data/poet.gemspec
CHANGED
@@ -19,6 +19,7 @@ Gem::Specification.new do |s|
|
|
19
19
|
s.require_paths = ["lib"]
|
20
20
|
|
21
21
|
# specify any dependencies here; for example:
|
22
|
-
|
23
|
-
|
22
|
+
s.add_development_dependency "cucumber"
|
23
|
+
s.add_development_dependency "aruba"
|
24
|
+
s.add_development_dependency "rake"
|
24
25
|
end
|
metadata
CHANGED
@@ -1,76 +1,106 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: poet
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: '0.2'
|
5
5
|
prerelease:
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 0
|
9
|
-
- 1
|
10
|
-
version: 0.0.1
|
11
6
|
platform: ruby
|
12
|
-
authors:
|
13
|
-
-
|
7
|
+
authors:
|
8
|
+
- André Wendt
|
14
9
|
autorequire:
|
15
10
|
bindir: bin
|
16
11
|
cert_chain: []
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
12
|
+
date: 2012-04-04 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: cucumber
|
16
|
+
requirement: &70193940334220 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *70193940334220
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: aruba
|
27
|
+
requirement: &70193940333780 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
33
|
+
type: :development
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *70193940333780
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: rake
|
38
|
+
requirement: &70193940333300 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ! '>='
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '0'
|
44
|
+
type: :development
|
45
|
+
prerelease: false
|
46
|
+
version_requirements: *70193940333300
|
47
|
+
description: Split your longish ~/.ssh/config into files in ~/.ssh/config.d/ and let
|
48
|
+
poet join them for you.
|
49
|
+
email:
|
24
50
|
- awendt@freeshell.org
|
25
|
-
executables:
|
51
|
+
executables:
|
26
52
|
- poet
|
27
53
|
extensions: []
|
28
|
-
|
29
54
|
extra_rdoc_files: []
|
30
|
-
|
31
|
-
files:
|
55
|
+
files:
|
32
56
|
- .gitignore
|
33
57
|
- Gemfile
|
58
|
+
- History.txt
|
34
59
|
- MIT-LICENSE
|
35
|
-
- README
|
60
|
+
- README.md
|
36
61
|
- Rakefile
|
37
62
|
- bin/poet
|
63
|
+
- features/permissions.feature
|
64
|
+
- features/running.feature
|
65
|
+
- features/selective_files.feature
|
66
|
+
- features/step_definitions/permissions_steps.rb
|
67
|
+
- features/support/env.rb
|
38
68
|
- lib/poet.rb
|
39
69
|
- lib/poet/version.rb
|
40
70
|
- poet.gemspec
|
41
|
-
has_rdoc: true
|
42
71
|
homepage: https://github.com/awendt/poet
|
43
72
|
licenses: []
|
44
|
-
|
45
73
|
post_install_message:
|
46
74
|
rdoc_options: []
|
47
|
-
|
48
|
-
require_paths:
|
75
|
+
require_paths:
|
49
76
|
- lib
|
50
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
77
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
51
78
|
none: false
|
52
|
-
requirements:
|
53
|
-
- -
|
54
|
-
- !ruby/object:Gem::Version
|
55
|
-
|
56
|
-
segments:
|
79
|
+
requirements:
|
80
|
+
- - ! '>='
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
segments:
|
57
84
|
- 0
|
58
|
-
|
59
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
85
|
+
hash: 3681220582875752418
|
86
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
60
87
|
none: false
|
61
|
-
requirements:
|
62
|
-
- -
|
63
|
-
- !ruby/object:Gem::Version
|
64
|
-
|
65
|
-
segments:
|
88
|
+
requirements:
|
89
|
+
- - ! '>='
|
90
|
+
- !ruby/object:Gem::Version
|
91
|
+
version: '0'
|
92
|
+
segments:
|
66
93
|
- 0
|
67
|
-
|
94
|
+
hash: 3681220582875752418
|
68
95
|
requirements: []
|
69
|
-
|
70
96
|
rubyforge_project: poet
|
71
|
-
rubygems_version: 1.
|
97
|
+
rubygems_version: 1.8.11
|
72
98
|
signing_key:
|
73
99
|
specification_version: 3
|
74
100
|
summary: Poet concatenates stanzas
|
75
|
-
test_files:
|
76
|
-
|
101
|
+
test_files:
|
102
|
+
- features/permissions.feature
|
103
|
+
- features/running.feature
|
104
|
+
- features/selective_files.feature
|
105
|
+
- features/step_definitions/permissions_steps.rb
|
106
|
+
- features/support/env.rb
|
data/README
DELETED
@@ -1,9 +0,0 @@
|
|
1
|
-
Lost in a long list of host stanzas in your ssh_config?
|
2
|
-
|
3
|
-
Fear not -- divide them up into several smaller files under $HOME/.ssh/config.d/ and run 'ssh-confgen' to concatenate them into a single ssh_config.
|
4
|
-
|
5
|
-
'ssh-confgen' does not overwrite your existing ssh_config. If you want to play with it, move your existing config out of the way.
|
6
|
-
|
7
|
-
Stanzas under $HOME/.ssh/config.d/ with an extension of .disabled are ignored by ssh-confgen. Every now and then, when you do need it, run 'ssh-confgen --with CONFIG' to explicitly include CONFIG.disabled in your generated ssh_config. You can even include several by running several '--with' options or using '--with CONFIG1,CONFIG2'.
|
8
|
-
|
9
|
-
If you only want an ssh_config from certain files, use '--only CONFIG' or '--only CONFIG1,CONFIG2'.
|