saltr 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/.gitignore ADDED
@@ -0,0 +1,13 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ .history
11
+ *#
12
+ *~
13
+ /s
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in saltr.gemspec
4
+ gemspec
data/README.md ADDED
@@ -0,0 +1,36 @@
1
+ # Saltr
2
+
3
+ Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/saltr`. To experiment with that code, run `bin/console` for an interactive prompt.
4
+
5
+ TODO: Delete this and the text above, and describe your gem
6
+
7
+ ## Installation
8
+
9
+ Add this line to your application's Gemfile:
10
+
11
+ ```ruby
12
+ gem 'saltr'
13
+ ```
14
+
15
+ And then execute:
16
+
17
+ $ bundle
18
+
19
+ Or install it yourself as:
20
+
21
+ $ gem install saltr
22
+
23
+ ## Usage
24
+
25
+ TODO: Write usage instructions here
26
+
27
+ ## Development
28
+
29
+ After checking out the repo, run `bin/setup` to install dependencies. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
30
+
31
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
32
+
33
+ ## Contributing
34
+
35
+ Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/saltr.
36
+
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "saltr"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start
data/bin/setup ADDED
@@ -0,0 +1,7 @@
1
+ #!/bin/bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+
5
+ bundle install
6
+
7
+ # Do any other automated setup that you need to do here
data/lib/help.rb ADDED
@@ -0,0 +1,66 @@
1
+ module Saltr
2
+ class Help
3
+ def self.topics
4
+ self.instance_methods(false).collect{ |meth| meth.to_s }.join(', ')
5
+ end
6
+
7
+ def top
8
+ """
9
+ help topics: #{self.class.topics}
10
+
11
+ l # sys.list-modules
12
+ l <modulename> # sys.list-functions modulename
13
+ l <functionname> # sys.doc functionname
14
+
15
+ r <cmd.run string>
16
+ m <new-minion-target>
17
+ m * and G@os:Ubu* will make a compound minion query
18
+ G=grains, P=grains regexp, L=list of minions
19
+ o <new out string>
20
+
21
+ salt-cloud
22
+ salt-key
23
+
24
+ grains.item ip4_interfaces
25
+ """
26
+ end
27
+
28
+ def ufw
29
+ """
30
+ ufw status
31
+ ufw allow ssh
32
+ ufw allow salt # on master
33
+ ufw allow from 52.6.10.1 to any port 22 # put master's ip address
34
+ ufw enable
35
+
36
+ ufw delete allow from 52.6.10.1 to any port 22
37
+ ufw deny apache
38
+
39
+ ufw app list # finds from /etc/ufw/applications.d/
40
+
41
+ log file for intrusion attempts: /var/log/kern.log
42
+ """
43
+ end
44
+
45
+ def o
46
+ """
47
+ compact Display compact output data structure
48
+ highstate Outputter for displaying results of state runs
49
+ json_out Display return data in JSON format
50
+ key Display salt-key output
51
+ nested Recursively display nested data
52
+ newline_values_only Display values only, separated by newlines
53
+ no_out Display no output
54
+ no_return Display output for minions that did not return
55
+ overstatestage Display clean output of an overstate stage
56
+ pprint_out Python pretty-print (pprint)
57
+ progress Display return data as a progress bar
58
+ raw Display raw output data structure
59
+ txt Simple text outputter
60
+ virt_query virt.query outputter
61
+ yaml_out Display return data in YAML format
62
+ """
63
+ end
64
+
65
+ end # Help
66
+ end
data/lib/salt.rb ADDED
@@ -0,0 +1,10 @@
1
+ module Saltr
2
+ class Salt
3
+ attr_accessor :options, :target, :function, :args
4
+ end
5
+
6
+ class SaltOptions
7
+ attr_accessor :outter, :verbose, :color
8
+ end
9
+ end
10
+
data/lib/saltr.rb ADDED
@@ -0,0 +1,205 @@
1
+ #!/usr/bin/ruby
2
+ require 'json'
3
+ require 'yaml'
4
+ require 'pp'
5
+ require 'readline'
6
+ require 'pathname'
7
+
8
+ require_relative 'saltr/version'
9
+ require_relative 'help'
10
+
11
+ module Saltr
12
+ class Repl
13
+ attr_accessor :minions, :last_result, :out, :static, :main_minion
14
+
15
+ def initialize
16
+ @minions = '*'
17
+ @last_result = nil
18
+ @out = :json
19
+ @static = true
20
+ @main_minion = 'gru'
21
+ initialize_readline
22
+ end
23
+
24
+ def repl
25
+ stty_save = `stty -g`.chomp
26
+
27
+ while (1) do
28
+ print "\n#{'-'*50}\n"
29
+ prompt = "salt '#{@minions}' --out=#{out}: "
30
+ # cmd = Readline.readline(prompt, true)
31
+ cmd = readline_with_hist_management(prompt)
32
+ break if cmd.nil?
33
+ result = run(cmd)
34
+ print_result(result)
35
+ end
36
+ rescue Interrupt
37
+ $stderr.puts "\n\nCtrl-c pressed."
38
+ ensure
39
+ store_history
40
+ system('stty', stty_save)
41
+ end
42
+
43
+ def run_yaml(cmd, debug=false)
44
+ YAML.load(run(cmd, debug))
45
+ end
46
+
47
+ def run(cmd, debug=false)
48
+ parsed_cmd = parse(cmd)
49
+ puts parsed_cmd
50
+ result = if parsed_cmd.class==Array and parsed_cmd.first==:result
51
+ parsed_cmd[1]
52
+ else
53
+ parsed_cmd = "#{parsed_cmd} --out=#{@out}" unless parsed_cmd.match(/--out/)
54
+ # parsed_cmd += " --static" if static
55
+ `#{parsed_cmd}`
56
+ end
57
+ puts "result:#{result}:" if debug
58
+ result
59
+ end
60
+
61
+ def parse(cmd)
62
+ tokens = cmd.split(/[= ]/, 2)
63
+ case tokens[0]
64
+ when 'help'
65
+ [:result, help(tokens[1])]
66
+ when 'r'
67
+ parse_cmd_run(tokens[1])
68
+ when 'm'
69
+ [:result, set_minion(tokens[1])]
70
+ when 'o'
71
+ [:result, set_out(tokens[1])]
72
+ when 'l'
73
+ parse_list(tokens[1])
74
+ when /^salt-key/,/^salt-cloud/
75
+ cmd
76
+ when 'quit'
77
+ exit(0)
78
+ else
79
+ parse_salt(cmd)
80
+ end
81
+ end
82
+
83
+ def print_result(result)
84
+ puts result unless result.nil?
85
+ #YAML.load(result)
86
+ end
87
+
88
+ def parse_salt(cmd, minions=minion_str, out_type=out)
89
+ "salt #{minions} --out=#{out_type} #{cmd}"
90
+ end
91
+
92
+ def parse_cmd_run(cmd)
93
+ "salt #{minion_str} cmd.run_all --static '#{cmd}'"
94
+ end
95
+
96
+ def parse_list(cmd)
97
+ puts cmd.inspect
98
+ type = 'sys.list_modules'
99
+ rest = ''
100
+ out_type = 'raw'
101
+ unless cmd.nil?
102
+ args = cmd.split(/\s+/, 2)
103
+ case args.first
104
+ when 'functions'
105
+ type = 'sys.list_functions'
106
+ rest = args[1]
107
+ when 'doc'
108
+ type = 'sys.list_functions'
109
+ rest = args[1]
110
+ out_type = 'txt'
111
+ else
112
+ if args[0].match(/\./)
113
+ type = 'sys.doc'
114
+ out_type = 'txt'
115
+ else
116
+ type = 'sys.list_functions'
117
+ end
118
+ rest = args[0]
119
+ end
120
+ end
121
+ cmd = type
122
+ cmd = "#{cmd} #{rest}"
123
+ parse_salt(cmd, main_minion, out_type)
124
+ end
125
+
126
+ def set_minion(cmd)
127
+ @minions = cmd
128
+ cmd
129
+ end
130
+
131
+ def minion_str
132
+ if minions.match(/ and /)
133
+ "-C '#{minions}'"
134
+ else
135
+ "'#{minions}'"
136
+ end
137
+ end
138
+
139
+ def set_out(cmd)
140
+ @out = cmd
141
+ cmd
142
+ end
143
+
144
+ def help(cmd)
145
+ cmd = 'top' if cmd=='' or cmd.nil?
146
+ msg = "Help topic '#{cmd}' doesn't exist."
147
+ begin
148
+ msg = Help.new.send(cmd.to_sym)
149
+ rescue
150
+ end
151
+ "HELP #{cmd}\n\n#{msg}"
152
+ end
153
+
154
+ def readline_with_hist_management(prompt='> ')
155
+ line = Readline.readline(prompt, true)
156
+ return nil if line.nil?
157
+ if line =~ /^\s*$/ or Readline::HISTORY.to_a[-2] == line
158
+ Readline::HISTORY.pop
159
+ end
160
+ # TODO: limit the history size
161
+ line
162
+ end
163
+
164
+ def initialize_readline
165
+ load_history
166
+ Readline.completion_append_character = ' '
167
+ Readline.completion_proc = readline_proc
168
+ end
169
+
170
+ def readline_proc
171
+ cmd_list = [
172
+ 'cmd.run', 'cmd.run_all',
173
+ #'sys.list_modules', 'sys.list_functions', 'sys.doc',
174
+ 'l', 'l modules', 'l functions', 'l doc',
175
+ 'rbenv', 'rbenv.install'
176
+ ]
177
+ proc { |s| cmd_list.grep(/^#{Regexp.escape(s)}/) }
178
+ end
179
+
180
+ def load_history
181
+ history_file.open('r').readlines.each do |line|
182
+ Readline::HISTORY.push line.chomp
183
+ end
184
+ rescue
185
+ end
186
+
187
+ def store_history
188
+ history_file.open('w') do |out|
189
+ Readline::HISTORY.each do |line|
190
+ out.puts line
191
+ end
192
+ end
193
+ rescue
194
+ end
195
+
196
+ def history_file
197
+ Pathname(__FILE__).dirname + '.history'
198
+ end
199
+ end
200
+ end
201
+
202
+
203
+ if __FILE__ == $0
204
+ Saltr::Repl.new.repl
205
+ end
@@ -0,0 +1,3 @@
1
+ module Saltr
2
+ VERSION = "0.1.0"
3
+ end
data/saltr.gemspec ADDED
@@ -0,0 +1,25 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'saltr/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "saltr"
8
+ spec.version = Saltr::VERSION
9
+ spec.authors = ['Brian Murphy-Dye']
10
+ spec.email = ['brian@murphydye.com']
11
+
12
+ spec.summary = %q{REPL wrapper for salt.}
13
+ spec.description = %q{}
14
+ spec.homepage = ""
15
+
16
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
17
+ spec.bindir = "exe"
18
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler", "~> 1.10"
22
+ spec.add_development_dependency "rake", "~> 10.0"
23
+ spec.add_development_dependency 'rspec'
24
+ spec.add_development_dependency 'guard'
25
+ end
metadata ADDED
@@ -0,0 +1,126 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: saltr
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Brian Murphy-Dye
9
+ autorequire:
10
+ bindir: exe
11
+ cert_chain: []
12
+ date: 2015-08-07 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: bundler
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: '1.10'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: '1.10'
30
+ - !ruby/object:Gem::Dependency
31
+ name: rake
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ~>
36
+ - !ruby/object:Gem::Version
37
+ version: '10.0'
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: '10.0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: rspec
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: guard
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ description: ''
79
+ email:
80
+ - brian@murphydye.com
81
+ executables: []
82
+ extensions: []
83
+ extra_rdoc_files: []
84
+ files:
85
+ - .gitignore
86
+ - Gemfile
87
+ - README.md
88
+ - Rakefile
89
+ - bin/console
90
+ - bin/setup
91
+ - lib/help.rb
92
+ - lib/salt.rb
93
+ - lib/saltr.rb
94
+ - lib/saltr/version.rb
95
+ - saltr.gemspec
96
+ homepage: ''
97
+ licenses: []
98
+ post_install_message:
99
+ rdoc_options: []
100
+ require_paths:
101
+ - lib
102
+ required_ruby_version: !ruby/object:Gem::Requirement
103
+ none: false
104
+ requirements:
105
+ - - ! '>='
106
+ - !ruby/object:Gem::Version
107
+ version: '0'
108
+ segments:
109
+ - 0
110
+ hash: -4543377424658850655
111
+ required_rubygems_version: !ruby/object:Gem::Requirement
112
+ none: false
113
+ requirements:
114
+ - - ! '>='
115
+ - !ruby/object:Gem::Version
116
+ version: '0'
117
+ segments:
118
+ - 0
119
+ hash: -4543377424658850655
120
+ requirements: []
121
+ rubyforge_project:
122
+ rubygems_version: 1.8.23
123
+ signing_key:
124
+ specification_version: 3
125
+ summary: REPL wrapper for salt.
126
+ test_files: []