knocker 0.2.3 → 0.3.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +3 -1
- data/bin/nkr +28 -7
- data/lib/knocker.rb +16 -1
- data/lib/knocker/parser.rb +8 -6
- data/lib/knocker/pattern.rb +4 -3
- data/lib/knocker/version.rb +1 -1
- data/spec/lib/knocker/parser_spec.rb +22 -0
- data/spec/lib/knocker/pattern_spec.rb +26 -0
- data/spec/spec_helper.rb +24 -0
- metadata +8 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4c96c78688e9f396b6164a1b2df98f3585d3b119
|
4
|
+
data.tar.gz: 80c5747c69c7d14e0a92ca187d17ccc0f8576772
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fc689efb5d4d067b0ffc275916a4ea37d952f705c86601764ad5720cbbc560e576e737525bd0b736914701f7a571b8b178e75be30434968f727a85f3567f4c51
|
7
|
+
data.tar.gz: e214473038ff51930d4adde2790d26a03b0308f8369428bed685a0469be4cbc62a9d81b63f21cd7f7e94659257340e54ec1047ba2b50eb603467955bb72efbe5
|
data/README.md
CHANGED
@@ -49,7 +49,7 @@ pattern pvtchatops
|
|
49
49
|
u 5445
|
50
50
|
t 4456
|
51
51
|
t 63854
|
52
|
-
c xchat --url=irc
|
52
|
+
c xchat --url=irc://$host:36777/chatops
|
53
53
|
```
|
54
54
|
|
55
55
|
So when you run `nkr pvtchatops` it actually runs two commands:
|
@@ -63,10 +63,12 @@ Easy!
|
|
63
63
|
|
64
64
|
As you saw, the config syntax is simple.
|
65
65
|
|
66
|
+
* use pattern and a name to name the pattern
|
66
67
|
* h and then the hostname/ip to connect to
|
67
68
|
* t and the port number for a tcp knock (multiples allowed)
|
68
69
|
* u and the port number for a udp knock (multiples allowed)
|
69
70
|
* c and the command to run after knocking (multiples allowed)
|
71
|
+
* on command lines use $host to use host defined for the pattern
|
70
72
|
|
71
73
|
**Mix this with SSH config files and you will an unstoppable sysadmin!**
|
72
74
|
|
data/bin/nkr
CHANGED
@@ -1,11 +1,23 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
3
|
require 'knocker'
|
4
|
-
require 'fileutils'
|
5
4
|
|
6
5
|
name = ARGV[0]
|
7
6
|
|
7
|
+
def usage
|
8
|
+
<<-EOF
|
9
|
+
Usage: nkr <--edit|pattern-name>
|
10
|
+
EOF
|
11
|
+
end
|
12
|
+
|
13
|
+
if name == "--edit" or name == "-e"
|
14
|
+
system "#{ENV["EDITOR"]} #{Knocker.config}"
|
15
|
+
exit
|
16
|
+
end
|
17
|
+
|
8
18
|
begin
|
19
|
+
raise ArgumentError, "Must provide pattern name" if name.nil? or name.empty?
|
20
|
+
|
9
21
|
pattern = Knocker.pattern(name)
|
10
22
|
system pattern.knock_command
|
11
23
|
|
@@ -14,15 +26,24 @@ begin
|
|
14
26
|
end
|
15
27
|
rescue Knocker::Errors::ConfigNotFound
|
16
28
|
print "No config found, create one at #{Knocker.config}? [y/n]: "
|
17
|
-
|
29
|
+
|
30
|
+
if STDIN.gets.match /y/i
|
31
|
+
Knocker.create_config
|
32
|
+
puts "Created knocker config file (use --edit to edit it)"
|
33
|
+
else
|
34
|
+
abort "No config file... quitting"
|
35
|
+
end
|
36
|
+
rescue ArgumentError => e
|
37
|
+
puts "ERROR: #{e.message}"
|
38
|
+
abort usage
|
18
39
|
rescue Knocker::Errors::PatternNotFound
|
19
|
-
abort "No such pattern #{name}"
|
40
|
+
abort "ERROR: No such pattern #{name}"
|
20
41
|
rescue Knocker::Errors::NoHostSpecified
|
21
|
-
abort "No host specified in pattern #{name}"
|
42
|
+
abort "ERROR: No host specified in pattern #{name}"
|
22
43
|
rescue Knocker::Errors::NoKnockSpecified
|
23
|
-
abort "No port-knocks specified in pattern #{name}"
|
44
|
+
abort "ERROR: No port-knocks specified in pattern #{name}"
|
24
45
|
rescue Knocker::Errors::InvalidProtocol => e
|
25
|
-
abort "Invalid protocol #{e.message} in pattern #{name}"
|
46
|
+
abort "ERROR: Invalid protocol #{e.message} in pattern #{name}"
|
26
47
|
rescue Knocker::Errors::InvalidPort => e
|
27
|
-
abort "Invalid port #{e.message} in pattern #{name}"
|
48
|
+
abort "ERROR: Invalid port #{e.message} in pattern #{name}"
|
28
49
|
end
|
data/lib/knocker.rb
CHANGED
@@ -2,6 +2,7 @@ require "knocker/version"
|
|
2
2
|
require "knocker/errors"
|
3
3
|
require "knocker/parser"
|
4
4
|
require "knocker/pattern"
|
5
|
+
require 'fileutils'
|
5
6
|
|
6
7
|
module Knocker
|
7
8
|
class << self
|
@@ -10,7 +11,21 @@ module Knocker
|
|
10
11
|
end
|
11
12
|
|
12
13
|
def pattern(name)
|
13
|
-
|
14
|
+
config_exists!
|
15
|
+
Knocker::Parser.new(File.read(config)).find(name)
|
16
|
+
end
|
17
|
+
|
18
|
+
def config_exists?
|
19
|
+
File.exist? config
|
20
|
+
end
|
21
|
+
|
22
|
+
def config_exists!
|
23
|
+
raise Knocker::Errors::ConfigNotFound unless config_exists?
|
24
|
+
end
|
25
|
+
|
26
|
+
def create_config
|
27
|
+
FileUtils.mkdir_p File.dirname(Knocker.config)
|
28
|
+
FileUtils.touch Knocker.config
|
14
29
|
end
|
15
30
|
end
|
16
31
|
end
|
data/lib/knocker/parser.rb
CHANGED
@@ -1,8 +1,9 @@
|
|
1
1
|
module Knocker
|
2
2
|
class Parser
|
3
3
|
def initialize(config)
|
4
|
-
|
5
|
-
|
4
|
+
@config = config.lines.reject { |line|
|
5
|
+
line.start_with? "#"
|
6
|
+
}.join("")
|
6
7
|
end
|
7
8
|
|
8
9
|
def find(name)
|
@@ -13,15 +14,16 @@ module Knocker
|
|
13
14
|
private
|
14
15
|
|
15
16
|
def has_pattern!(name)
|
16
|
-
raise Knocker::Errors::
|
17
|
+
raise Knocker::Errors::PatternNotFound unless
|
17
18
|
@config.include? "pattern #{name}"
|
18
19
|
end
|
19
20
|
|
20
21
|
def extract(name)
|
21
|
-
start = @config.
|
22
|
+
start = @config.split("\n").index("pattern #{name}")
|
23
|
+
start+= 1
|
22
24
|
|
23
|
-
@config.
|
24
|
-
break if line.
|
25
|
+
@config.split("\n")[start..-1].collect { |line|
|
26
|
+
break if line.empty?
|
25
27
|
line
|
26
28
|
}.join("\n")
|
27
29
|
end
|
data/lib/knocker/pattern.rb
CHANGED
@@ -17,7 +17,8 @@ module Knocker
|
|
17
17
|
|
18
18
|
def host
|
19
19
|
host = @text.scan(/ h (.*)/).flatten.first
|
20
|
-
raise Knocker::Errors::NoHostSpecified if host.nil? or host.
|
20
|
+
raise Knocker::Errors::NoHostSpecified if host.nil? or host.empty?
|
21
|
+
host
|
21
22
|
end
|
22
23
|
|
23
24
|
def knock_command
|
@@ -34,9 +35,9 @@ module Knocker
|
|
34
35
|
end
|
35
36
|
|
36
37
|
def post_commands
|
37
|
-
cmds = @text.scan(/^ c (.*)$/)
|
38
|
+
cmds = @text.scan(/^ c (.*)$/).flatten
|
38
39
|
cmds.map! do |cmd|
|
39
|
-
cmd.gsub
|
40
|
+
cmd.gsub(/\$host/, host)
|
40
41
|
end
|
41
42
|
end
|
42
43
|
|
data/lib/knocker/version.rb
CHANGED
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Knocker::Parser do
|
4
|
+
let(:parser) { Knocker::Parser.new(config) }
|
5
|
+
|
6
|
+
it "should recognise a pattern" do
|
7
|
+
expect { parser.find("pvtchatops") }.to_not raise_error
|
8
|
+
end
|
9
|
+
|
10
|
+
it "should return a pattern object" do
|
11
|
+
expect(parser.find("pvtchatops")).to be_a Knocker::Pattern
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should return a pattern object with the correct name" do
|
15
|
+
expect(parser.find("pvtchatops").name).to eq "pvtchatops"
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should raise PatternNotFound for non-existent pattern" do
|
19
|
+
expect{parser.find("wut!")}.to raise_error Knocker::Errors::PatternNotFound
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Knocker::Pattern do
|
4
|
+
let(:pattern) { Knocker::Pattern.new("pvtchatops", pattern_text) }
|
5
|
+
|
6
|
+
it "should return the host" do
|
7
|
+
expect(pattern.host).to eq "myvps.example.com"
|
8
|
+
end
|
9
|
+
|
10
|
+
it "should return the knock command" do
|
11
|
+
expect(pattern.knock_command).to eq "knock myvps.example.com 5445:udp 4456:tcp 63854:tcp"
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should return the commands in an array" do
|
15
|
+
expect(pattern.post_commands).to be_an Array
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should substitute $host for the host name in commands" do
|
19
|
+
expect(pattern.post_commands.first).to include(pattern.host)
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should return the correct post commands" do
|
23
|
+
expect(pattern.post_commands).to eq ["xchat --url=irc://myvps.example.com:36777/chatops"]
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'knocker'
|
2
|
+
|
3
|
+
def config
|
4
|
+
<<-EOF
|
5
|
+
# Knocker config file
|
6
|
+
# keep this secret, knock patterns are almost like passwords
|
7
|
+
pattern pvtchatops
|
8
|
+
h myvps.example.com
|
9
|
+
u 5445
|
10
|
+
t 4456
|
11
|
+
t 63854
|
12
|
+
c xchat --url=irc://$host:36777/chatops
|
13
|
+
EOF
|
14
|
+
end
|
15
|
+
|
16
|
+
def pattern_text
|
17
|
+
<<-EOF
|
18
|
+
h myvps.example.com
|
19
|
+
u 5445
|
20
|
+
t 4456
|
21
|
+
t 63854
|
22
|
+
c xchat --url=irc://$host:36777/chatops
|
23
|
+
EOF
|
24
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: knocker
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Robert McLeod
|
@@ -74,6 +74,9 @@ files:
|
|
74
74
|
- lib/knocker/parser.rb
|
75
75
|
- lib/knocker/pattern.rb
|
76
76
|
- lib/knocker/version.rb
|
77
|
+
- spec/lib/knocker/parser_spec.rb
|
78
|
+
- spec/lib/knocker/pattern_spec.rb
|
79
|
+
- spec/spec_helper.rb
|
77
80
|
homepage: https://github.com/penguinpowernz/knocker
|
78
81
|
licenses:
|
79
82
|
- MIT
|
@@ -98,4 +101,7 @@ rubygems_version: 2.2.2
|
|
98
101
|
signing_key:
|
99
102
|
specification_version: 4
|
100
103
|
summary: Uses stored config to knocks on knock daemons
|
101
|
-
test_files:
|
104
|
+
test_files:
|
105
|
+
- spec/lib/knocker/parser_spec.rb
|
106
|
+
- spec/lib/knocker/pattern_spec.rb
|
107
|
+
- spec/spec_helper.rb
|