lita-cmd 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: caf9a05b2c736236f6360721cdcd988e831116b2
4
- data.tar.gz: 143dfdb31f5d047bfeb8067a83b1596ff5d306cb
3
+ metadata.gz: 7a968328007af50c23e968ebc0725c7ded9a459f
4
+ data.tar.gz: bbe96e910dba404a8cf56dc8408c3dd91f95720b
5
5
  SHA512:
6
- metadata.gz: a231064871a2954b82d4ad7238fa3b81618557260158e1e37054e2b963560c65b92307a3bef63203e89a87429ce8abe827f61e34ac7ffca83c3bab6fdfaabf5e
7
- data.tar.gz: 73c2f14739c6b312b88dc22688754e1d7ae64ac72edfdeaf3f2b74e87fd901935650ebb3a2658953b5a912e107453e392bf277a5ffb967b17856234b3daebac4
6
+ metadata.gz: fc83dc3bc068f71f27fd03ceefc6e539bb8b640e9b320c8c1b27120d277c8394d4abdd6eed65cbe0616654a669844f5711c6043339fb457fd2b29114d249f814
7
+ data.tar.gz: d2b1635a2e104d115a553db8bf994160cec4bbc6879f6a8d95b48683c4649f602c554440e452eaf17b3067c9dcf1a2585fac0d80b427aa1eaab27310ff46a6b8
data/README.md CHANGED
@@ -19,8 +19,6 @@ Lita.configure do |config|
19
19
  end
20
20
  ```
21
21
 
22
- Also, make sure that you are a member of the `devops` Lita Auth group. This requirement will change soon. See Roadmap below.
23
-
24
22
  ## Usage
25
23
 
26
24
  - `cmd-help`
@@ -31,6 +29,7 @@ Also, make sure that you are a member of the `devops` Lita Auth group. This requ
31
29
  >- dfinninger: `lita cmd-help`
32
30
  - lita:
33
31
  ```
32
+ devops/secret
34
33
  hello
35
34
  name
36
35
  ```
@@ -50,13 +49,51 @@ Your name is: ... well, idk, man...
50
49
  Your name is: Devon
51
50
  ```
52
51
 
52
+ ### Group Control
53
+
54
+ You can now control what groups have access to your Lita scripts!
55
+
56
+ In your `scripts` dir make some more that match the name of your groups. Only users that are a part of those groups can see/execute those scripts.
57
+
58
+ #### Example
59
+
60
+ - scripts dir:
61
+ - Basic directory setup
62
+
63
+ ```
64
+ scripts/
65
+ |- devops/
66
+ | `- secret
67
+ |- hello
68
+ `- name
69
+ ```
70
+
71
+ - `lita cmd-help`
72
+ - Help text will show you scripts that you have access to with a prefix
73
+
74
+ ```
75
+ devops/secret
76
+ hello
77
+ name
78
+ ```
79
+
80
+ - `lita cmd devops/secret`
81
+ - Execute the command. Prefix required!
82
+
83
+ ```
84
+ [stdout] I'm a secret!
85
+ ```
86
+
87
+ A non-priviledged user will only see scripts without the prefix.
88
+
53
89
  ## Notes
54
90
 
55
91
  - Make sure that your files are executable
56
92
  - (`chmod +x FILE`)
57
- - Make sure that you've included the correct shebang
93
+ - Make sure that you've included the correct sha-bang
58
94
  - `#!/bin/bash`, `#!/usr/bin/env ruby`, etc...
59
95
 
60
96
  ## Roadmap
61
97
 
62
- - [ ] Include support for directory-based access control
98
+ - [x] Include support for directory-based access control
99
+ - [ ] Help text for individual commands
@@ -6,34 +6,42 @@ module Lita
6
6
 
7
7
  config :scripts_dir
8
8
 
9
+ ### CMD-HELP ##############################################
10
+
9
11
  route(/^\s*cmd-help\s*$/, :cmd_help, command: true, help: {
10
12
  "cmd-help" => "get a list of scripts available for execution"
11
13
  })
12
14
 
13
- def cmd_help(resp)
14
- out = Array.new
15
-
16
- Dir.chdir(config.scripts_dir)
17
- Dir.glob('*').each { |d| out << d }
15
+ route(/^\s*test\s*/) do |resp|
16
+ auth = Lita::Robot.new.auth
17
+ resp.reply "true" if auth.groups_with_users[:devops].include? resp.user
18
+ end
18
19
 
19
- list = out.sort.join("\n")
20
+ def cmd_help(resp)
21
+ list = get_script_list(resp, config)
20
22
 
21
- resp.reply code_blockify(list)
23
+ out = list.sort.join("\n")
24
+ resp.reply_privately code_blockify(out)
22
25
  end
23
26
 
27
+ ### CMD ###################################################
28
+
24
29
  route(/^\s*cmd\s+(\S*)\s*(.*)$/, :cmd, command: true, help: {
25
30
  "cmd SCRIPT" => "run the SCRIPT specified; use `lita cmd help` for a list"
26
31
  })
27
32
 
28
33
  def cmd(resp)
29
- dir = config.scripts_dir
30
34
  script = resp.matches[0][0]
31
35
  opts = resp.matches[0][1].split(" ")
32
- Dir.chdir('/tmp')
36
+
37
+ unless user_is_authorized(script, resp, config)
38
+ resp.reply_privately "Unauthorized to run '#{script}'!"
39
+ return
40
+ end
33
41
 
34
42
  out = String.new
35
43
  err = String.new
36
- Open3.popen3("#{dir}/#{script}", *opts) do |i, o, e, wait_thread|
44
+ Open3.popen3("#{config.scripts_dir}/#{script}", *opts) do |i, o, e, wait_thread|
37
45
  o.each { |line| out << "[stdout] #{line}" }
38
46
  e.each { |line| err << "[stderr] #{line}" }
39
47
  end
@@ -55,10 +63,38 @@ module Lita
55
63
  end
56
64
  end
57
65
 
66
+ ### HELPERS ############################################
67
+
68
+ private
58
69
  def code_blockify(text)
59
- "```\n" + text + "\n```"
70
+ "```\n#{text}\n```"
60
71
  end
61
72
 
73
+ def get_script_list(resp, config)
74
+ bot = Lita::Robot.new
75
+ auth = bot.auth
76
+
77
+ list = Dir.entries(config.scripts_dir).select { |f| File.file? "#{config.scripts_dir}/#{f}" }
78
+
79
+ groups = auth.groups_with_users.select { |group, user_list| user_list.include? resp.user }
80
+ groups.keys.each do |group|
81
+ begin
82
+ sublist = Dir.entries("#{config.scripts_dir}/#{group}").select do |f|
83
+ File.file? "#{config.scripts_dir}/#{group}/#{f}"
84
+ end
85
+ rescue SystemCallError => e
86
+ log.warn "#{group} is not a directory.\n#{e}"
87
+ end
88
+ list.concat sublist.map { |x| "#{group}/#{x}" } if sublist
89
+ end
90
+
91
+ list
92
+ end
93
+
94
+ def user_is_authorized(script, resp, config)
95
+ list = get_script_list(resp, config)
96
+ list.include? script
97
+ end
62
98
  end
63
99
 
64
100
  Lita.register_handler(Cmd)
data/lita-cmd.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |spec|
2
2
  spec.name = "lita-cmd"
3
- spec.version = "0.1.0"
3
+ spec.version = "0.2.0"
4
4
  spec.authors = ["Devon Finninger"]
5
5
  spec.email = ["devon.finninger@peopleadmin.com"]
6
6
  spec.description = "Run commands from Lita"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lita-cmd
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Devon Finninger
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-05-28 00:00:00.000000000 Z
11
+ date: 2015-06-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: lita