micro-hookit 0.12.11
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.
- checksums.yaml +7 -0
- data/.gitignore +22 -0
- data/.travis.yml +8 -0
- data/Gemfile +4 -0
- data/LICENSE +21 -0
- data/README.md +24 -0
- data/Rakefile +18 -0
- data/bin/hookit +51 -0
- data/boxfile.yml +2 -0
- data/hookit.gemspec +30 -0
- data/lib/hookit/converginator.rb +165 -0
- data/lib/hookit/db.rb +37 -0
- data/lib/hookit/error.rb +9 -0
- data/lib/hookit/exit.rb +23 -0
- data/lib/hookit/helper/cron.rb +42 -0
- data/lib/hookit/helper/nfs.rb +113 -0
- data/lib/hookit/helper/shell.rb +35 -0
- data/lib/hookit/helper/xml.rb +25 -0
- data/lib/hookit/helper.rb +9 -0
- data/lib/hookit/hook.rb +96 -0
- data/lib/hookit/logger.rb +60 -0
- data/lib/hookit/platform/base.rb +11 -0
- data/lib/hookit/platform/docker.rb +22 -0
- data/lib/hookit/platform/smartos.rb +19 -0
- data/lib/hookit/platform/ubuntu.rb +19 -0
- data/lib/hookit/platform.rb +10 -0
- data/lib/hookit/platforms.rb +3 -0
- data/lib/hookit/registry.rb +53 -0
- data/lib/hookit/resource/base.rb +138 -0
- data/lib/hookit/resource/cron.rb +29 -0
- data/lib/hookit/resource/directory.rb +69 -0
- data/lib/hookit/resource/execute.rb +205 -0
- data/lib/hookit/resource/file.rb +89 -0
- data/lib/hookit/resource/hook_file.rb +109 -0
- data/lib/hookit/resource/link.rb +50 -0
- data/lib/hookit/resource/logrotate.rb +36 -0
- data/lib/hookit/resource/mount.rb +85 -0
- data/lib/hookit/resource/package.rb +57 -0
- data/lib/hookit/resource/rsync.rb +58 -0
- data/lib/hookit/resource/scp.rb +78 -0
- data/lib/hookit/resource/service.rb +117 -0
- data/lib/hookit/resource/socket.rb +79 -0
- data/lib/hookit/resource/template.rb +114 -0
- data/lib/hookit/resource/warning.rb +87 -0
- data/lib/hookit/resource/zfs.rb +77 -0
- data/lib/hookit/resource.rb +21 -0
- data/lib/hookit/resources.rb +15 -0
- data/lib/hookit/setup.rb +59 -0
- data/lib/hookit/version.rb +3 -0
- data/lib/hookit.rb +26 -0
- metadata +208 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: '096ca77b30d22da4e013840aec4e19ab67b9bcc59d9cee60cbba34d34295fffb'
|
4
|
+
data.tar.gz: e53956fa759ff1f1f26748dd271a917e43e21174ccd5239449db36fab3f2ea08
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: e3e75da419b563dbe31af392d77c7502f3bd6dc755573d7eff0ad64032713736a1b851fc0eb67d8c7ba138769080b5ffeabd7ead95eeaad3d5930376cf6b75e4
|
7
|
+
data.tar.gz: 2ade0269e7d1ed419a71a3d4591eba58c5fed350fe3627073739c20946bde85371628d57103c6697b6e1d7dcc07f244014095e78307b3799d98eebfa8d398d8e
|
data/.gitignore
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
*.gem
|
2
|
+
*.rbc
|
3
|
+
.bundle
|
4
|
+
.config
|
5
|
+
.yardoc
|
6
|
+
Gemfile.lock
|
7
|
+
InstalledFiles
|
8
|
+
_yardoc
|
9
|
+
coverage
|
10
|
+
doc/
|
11
|
+
lib/bundler/man
|
12
|
+
pkg
|
13
|
+
rdoc
|
14
|
+
spec/reports
|
15
|
+
test/tmp
|
16
|
+
test/version_tmp
|
17
|
+
tmp
|
18
|
+
*.bundle
|
19
|
+
*.so
|
20
|
+
*.o
|
21
|
+
*.a
|
22
|
+
mkmf.log
|
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
MIT License
|
2
|
+
|
3
|
+
Copyright (c) 2019 Microbox
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
13
|
+
copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
|
+
SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
[](http://microbox.cloud/open-source#hookit)
|
2
|
+
[](https://travis-ci.org/microbox/hookit)
|
3
|
+
|
4
|
+
# Hookit
|
5
|
+
|
6
|
+
A devops configuration management tool that responds to events, with a chef-like dsl.
|
7
|
+
|
8
|
+
## Status
|
9
|
+
|
10
|
+
Complete/Stable
|
11
|
+
|
12
|
+
## TODO
|
13
|
+
|
14
|
+
- documentation
|
15
|
+
|
16
|
+
### Contributing
|
17
|
+
|
18
|
+
Contributions to the hookit project are welcome and encouraged. hookit is a [Microbox](https://microbox.cloud) project and contributions should follow the [Microbox Contribution Process & Guidelines](https://docs.microbox.cloud/contributing/).
|
19
|
+
|
20
|
+
### Licence
|
21
|
+
|
22
|
+
Mozilla Public License Version 2.0
|
23
|
+
|
24
|
+
[](http://microbox.cloud/open-source)
|
data/Rakefile
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
2
|
+
require 'rake/testtask'
|
3
|
+
|
4
|
+
desc "Create tag v#{Hookit::VERSION}"
|
5
|
+
task :tag do
|
6
|
+
|
7
|
+
puts "tagging version v#{Hookit::VERSION}"
|
8
|
+
`git tag -a v#{Hookit::VERSION} -m "Version #{Hookit::VERSION}"`
|
9
|
+
`git push origin --tags`
|
10
|
+
|
11
|
+
end
|
12
|
+
|
13
|
+
Rake::TestTask.new do |t|
|
14
|
+
t.libs << 'test'
|
15
|
+
end
|
16
|
+
|
17
|
+
desc "Run tests"
|
18
|
+
task :default => :test
|
data/bin/hookit
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
begin
|
3
|
+
MODULE_DIR = ENV['MODULE_DIR'] || "/opt/local/hookit/mod"
|
4
|
+
LOG_LEVEL = ENV['LOG_LEVEL'] || :error
|
5
|
+
LOGFILE = ENV['LOGFILE'] || '/var/log/hookit/hookit.log'
|
6
|
+
|
7
|
+
hook = ARGV.shift
|
8
|
+
|
9
|
+
if not hook
|
10
|
+
$stderr.puts "hook is required"
|
11
|
+
exit 1
|
12
|
+
end
|
13
|
+
|
14
|
+
# uncomment if dev only
|
15
|
+
lib = File.expand_path('../../lib', __FILE__)
|
16
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
17
|
+
|
18
|
+
require 'hookit'
|
19
|
+
require 'json'
|
20
|
+
|
21
|
+
include Hookit::Hook # payload helpers / resource dsl
|
22
|
+
|
23
|
+
set :log_level, LOG_LEVEL
|
24
|
+
set :logfile, LOGFILE
|
25
|
+
set :module_root, MODULE_DIR
|
26
|
+
|
27
|
+
# require hook libs
|
28
|
+
Dir.glob("#{MODULE_DIR}/lib/*.rb").each do |file|
|
29
|
+
require file
|
30
|
+
end
|
31
|
+
|
32
|
+
logger.info ""
|
33
|
+
logger.info "hook: #{hook}"
|
34
|
+
logger.info "payload: #{payload.to_json}"
|
35
|
+
|
36
|
+
begin
|
37
|
+
load "#{MODULE_DIR}/hooks/#{hook}.rb"
|
38
|
+
rescue LoadError
|
39
|
+
logger.error "hook: #{hook} does not exist"
|
40
|
+
$stderr.puts "hook: #{hook} does not exist"
|
41
|
+
end
|
42
|
+
rescue Exception => e
|
43
|
+
$stderr.puts "There has been an error."
|
44
|
+
$stderr.puts "If you choose to submit a ticket,"
|
45
|
+
$stderr.puts "please include the following backtrace."
|
46
|
+
$stderr.puts "======================================="
|
47
|
+
$stderr.puts e.message
|
48
|
+
$stderr.puts e.backtrace
|
49
|
+
$stderr.puts "======================================="
|
50
|
+
exit 1
|
51
|
+
end
|
data/boxfile.yml
ADDED
data/hookit.gemspec
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'hookit/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "micro-hookit"
|
8
|
+
spec.version = Hookit::VERSION
|
9
|
+
spec.authors = ["Hennik Hunsaker", "Tyler Flint", "Greg Linton"]
|
10
|
+
spec.email = ["hennik@microbox.cloud"]
|
11
|
+
spec.summary = %q{Hookit is a framework to provide hookit scripts with re-usable components and resources via an elegant dsl.}
|
12
|
+
spec.description = %q{The core framework to provide hookit scripts with re-usable components.}
|
13
|
+
spec.homepage = "https://microbox.cloud/open-source"
|
14
|
+
spec.license = "MIT"
|
15
|
+
|
16
|
+
spec.files = `git ls-files -z`.split("\x0")
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_dependency 'tilt'
|
22
|
+
spec.add_dependency 'erubis'
|
23
|
+
spec.add_dependency 'oj'
|
24
|
+
spec.add_dependency 'multi_json', '>= 1.3'
|
25
|
+
spec.add_dependency 'excon'
|
26
|
+
spec.add_dependency 'faraday'
|
27
|
+
|
28
|
+
spec.add_development_dependency "bundler"
|
29
|
+
spec.add_development_dependency "rake"
|
30
|
+
end
|
@@ -0,0 +1,165 @@
|
|
1
|
+
module Hookit
|
2
|
+
class Converginator
|
3
|
+
|
4
|
+
def initialize(map, list)
|
5
|
+
@map = map
|
6
|
+
@list = list
|
7
|
+
end
|
8
|
+
|
9
|
+
def converge!
|
10
|
+
output = {}
|
11
|
+
@map.each do |key, template|
|
12
|
+
if @list.key? key
|
13
|
+
output[key] = converge_value template, @list[key]
|
14
|
+
else
|
15
|
+
output[key] = template[:default]
|
16
|
+
end
|
17
|
+
end
|
18
|
+
output
|
19
|
+
end
|
20
|
+
|
21
|
+
def converge_hash(template, value)
|
22
|
+
temp = {}
|
23
|
+
template.each do |k, t|
|
24
|
+
if value.key? k
|
25
|
+
temp[k] = converge_value t, value[k]
|
26
|
+
else
|
27
|
+
temp[k] = t[:default]
|
28
|
+
end
|
29
|
+
end
|
30
|
+
temp
|
31
|
+
end
|
32
|
+
|
33
|
+
def converge_value(template, value)
|
34
|
+
if template[:type] == :array
|
35
|
+
value = sanitize_array(template, value)
|
36
|
+
end
|
37
|
+
|
38
|
+
if template[:type] == :array and template[:of] == :hash and template[:template]
|
39
|
+
value.map! {|v| converge_hash(template[:template], v)}
|
40
|
+
end
|
41
|
+
|
42
|
+
if template[:type] == :hash and template[:template]
|
43
|
+
value = converge_hash(template[:template], value)
|
44
|
+
end
|
45
|
+
|
46
|
+
if valid? template, value
|
47
|
+
value
|
48
|
+
else
|
49
|
+
template[:default]
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def sanitize_array(template, value)
|
54
|
+
|
55
|
+
case template[:of]
|
56
|
+
when :byte
|
57
|
+
value = [value] if ( valid_byte? value )
|
58
|
+
when :file
|
59
|
+
value = [value] if ( valid_file? value )
|
60
|
+
when :folder
|
61
|
+
value = [value] if ( valid_folder? value )
|
62
|
+
when :hash
|
63
|
+
value = [value] if ( valid_hash? value )
|
64
|
+
when :integer
|
65
|
+
value = [value] if ( valid_integer? value )
|
66
|
+
when :on_off
|
67
|
+
value = [value] if ( valid_on_off? value )
|
68
|
+
when :string
|
69
|
+
value = [value] if ( valid_string? value )
|
70
|
+
end
|
71
|
+
((value || []) + (template[:default] || [])).uniq
|
72
|
+
end
|
73
|
+
|
74
|
+
def valid?(template, value)
|
75
|
+
valid_type?(template, value) and valid_value?(template, value)
|
76
|
+
end
|
77
|
+
|
78
|
+
def valid_type?(template, value)
|
79
|
+
case template[:type]
|
80
|
+
when :array
|
81
|
+
valid_array? template, value
|
82
|
+
when :byte
|
83
|
+
valid_byte? value
|
84
|
+
when :file
|
85
|
+
valid_file? value
|
86
|
+
when :folder
|
87
|
+
valid_folder? value
|
88
|
+
when :hash
|
89
|
+
valid_hash? value
|
90
|
+
when :integer
|
91
|
+
valid_integer? value
|
92
|
+
when :on_off
|
93
|
+
valid_on_off? value
|
94
|
+
when :string
|
95
|
+
valid_string? value
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
def valid_value?(template, value)
|
100
|
+
|
101
|
+
return true if not template.key? :from
|
102
|
+
|
103
|
+
if template[:type] == :array
|
104
|
+
!( value.map {|element| template[:from].include? element} ).include? false
|
105
|
+
else
|
106
|
+
template[:from].include? value
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
def valid_string?(element)
|
111
|
+
element.is_a? String
|
112
|
+
end
|
113
|
+
|
114
|
+
def valid_array?(template, value)
|
115
|
+
|
116
|
+
return false if not value.is_a? Array
|
117
|
+
|
118
|
+
return true if not template.key? :of
|
119
|
+
|
120
|
+
case template[:of]
|
121
|
+
when :byte
|
122
|
+
!( value.map {|element| valid_byte? element} ).include? false
|
123
|
+
when :file
|
124
|
+
!( value.map {|element| valid_file? element} ).include? false
|
125
|
+
when :folder
|
126
|
+
!( value.map {|element| valid_folder? element} ).include? false
|
127
|
+
when :integer
|
128
|
+
!( value.map {|element| valid_integer? element} ).include? false
|
129
|
+
when :hash
|
130
|
+
!( value.map {|element| valid_hash? element} ).include? false
|
131
|
+
when :on_off
|
132
|
+
!( value.map {|element| valid_on_off? element} ).include? false
|
133
|
+
when :string
|
134
|
+
!( value.map {|element| valid_string? element} ).include? false
|
135
|
+
else
|
136
|
+
true
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
def valid_hash?(value)
|
141
|
+
value.is_a? Hash
|
142
|
+
end
|
143
|
+
|
144
|
+
def valid_integer?(value)
|
145
|
+
value.is_a? Integer || (value.to_i.to_s == value.to_s)
|
146
|
+
end
|
147
|
+
|
148
|
+
def valid_file?(value)
|
149
|
+
value =~ /^\/?[^\/]+(\/[^\/]+)*$/
|
150
|
+
end
|
151
|
+
|
152
|
+
def valid_folder?(value)
|
153
|
+
value =~ /^\/?[^\/]+(\/[^\/]+)*\/?$/
|
154
|
+
end
|
155
|
+
|
156
|
+
def valid_on_off?(value)
|
157
|
+
['true', 'false', 'On', 'on', 'Off', 'off', '1', '0'].include? value.to_s
|
158
|
+
end
|
159
|
+
|
160
|
+
def valid_byte?(value)
|
161
|
+
value.to_s =~ /^\d+[BbKkMmGgTt]?$/
|
162
|
+
end
|
163
|
+
|
164
|
+
end
|
165
|
+
end
|
data/lib/hookit/db.rb
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'oj'
|
2
|
+
require 'multi_json'
|
3
|
+
require 'fileutils'
|
4
|
+
|
5
|
+
module Hookit
|
6
|
+
class DB
|
7
|
+
|
8
|
+
DEFAULT_PATH = '/var/db/hookit/db.json'
|
9
|
+
|
10
|
+
def initialize(path=nil)
|
11
|
+
@path = path || DEFAULT_PATH
|
12
|
+
end
|
13
|
+
|
14
|
+
def fetch(key)
|
15
|
+
data[key]
|
16
|
+
end
|
17
|
+
|
18
|
+
def put(key, value)
|
19
|
+
data[key] = value
|
20
|
+
save
|
21
|
+
end
|
22
|
+
|
23
|
+
def load
|
24
|
+
::MultiJson.load(::File.read(@path), symbolize_keys: true) rescue {}
|
25
|
+
end
|
26
|
+
|
27
|
+
def save
|
28
|
+
::FileUtils.mkdir_p(File.dirname(@path))
|
29
|
+
::File.write(@path, ::MultiJson.dump(data))
|
30
|
+
end
|
31
|
+
|
32
|
+
def data
|
33
|
+
@data ||= load
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
end
|
data/lib/hookit/error.rb
ADDED
@@ -0,0 +1,9 @@
|
|
1
|
+
module Hookit
|
2
|
+
module Error
|
3
|
+
class MissingConfiguration < StandardError; end
|
4
|
+
class UnexpectedExit < StandardError; end
|
5
|
+
class UnknownAction < StandardError; end
|
6
|
+
class UnsupportedPlatform < StandardError; end
|
7
|
+
class UnsupportedOption < StandardError; end
|
8
|
+
end
|
9
|
+
end
|
data/lib/hookit/exit.rb
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
module Hookit
|
2
|
+
module Exit
|
3
|
+
SUCCESS = 0
|
4
|
+
ERROR = 1
|
5
|
+
ERROR_RETRY = 2
|
6
|
+
ERROR_ENOMEM = 3
|
7
|
+
WAIT_2 = 11
|
8
|
+
WAIT_4 = 12
|
9
|
+
WAIT_8 = 13
|
10
|
+
WAIT_16 = 14
|
11
|
+
WAIT_32 = 15
|
12
|
+
WAIT_64 = 16
|
13
|
+
WAIT_128 = 17
|
14
|
+
WAIT_256 = 18
|
15
|
+
WAIT_512 = 19
|
16
|
+
WAIT_1024 = 20
|
17
|
+
ABORT = 21
|
18
|
+
ABORT_MSG = 22
|
19
|
+
SUCCESS_FLAG = 31
|
20
|
+
SUCCESS_MSG = 32
|
21
|
+
WTF = 255
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module Hookit
|
2
|
+
module Helper
|
3
|
+
module Cron
|
4
|
+
|
5
|
+
MINUTES = 59
|
6
|
+
HOURS = 23
|
7
|
+
DAYS = 31
|
8
|
+
MONTHS = 12
|
9
|
+
WEEKDAY = 7
|
10
|
+
|
11
|
+
def sanitize_cron(cron)
|
12
|
+
|
13
|
+
time = cron.split(' ')
|
14
|
+
|
15
|
+
time[0] = compatible_cron(time[0],MINUTES)
|
16
|
+
time[1] = compatible_cron(time[1],HOURS)
|
17
|
+
time[2] = compatible_cron(time[2],DAYS, 1)
|
18
|
+
time[3] = compatible_cron(time[3],MONTHS, 1)
|
19
|
+
time[4] = compatible_cron(time[4],WEEKDAY)
|
20
|
+
|
21
|
+
time.join(' ')
|
22
|
+
end
|
23
|
+
|
24
|
+
protected
|
25
|
+
|
26
|
+
# converts */x cron format into solaris compatible format
|
27
|
+
def compatible_cron(time, limit, start = 0)
|
28
|
+
if time =~ /\//
|
29
|
+
increment = time.split('/')[1].to_i
|
30
|
+
x, y = start, []
|
31
|
+
for i in 0..limit/increment
|
32
|
+
y[i] = x
|
33
|
+
x +=increment
|
34
|
+
end
|
35
|
+
time = y.join(',')
|
36
|
+
end
|
37
|
+
time
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,113 @@
|
|
1
|
+
module Hookit
|
2
|
+
module Helper
|
3
|
+
module NFS
|
4
|
+
|
5
|
+
def sanitize_network_dirs(payload)
|
6
|
+
net_dirs = net_dirs(payload)
|
7
|
+
|
8
|
+
net_dirs.each do |component, dirs|
|
9
|
+
net_dirs[component] = clean_writables(dirs)
|
10
|
+
end
|
11
|
+
|
12
|
+
net_dirs
|
13
|
+
end
|
14
|
+
|
15
|
+
def net_dirs(payload)
|
16
|
+
key = payload[:storage].keys.first
|
17
|
+
boxfile = payload[:boxfile]
|
18
|
+
|
19
|
+
if boxfile[:shared_writable_dirs]
|
20
|
+
{
|
21
|
+
key => boxfile[:shared_writable_dirs]
|
22
|
+
}
|
23
|
+
elsif boxfile[:network_dirs].is_a? String
|
24
|
+
{
|
25
|
+
key => [boxfile[:network_dirs]]
|
26
|
+
}
|
27
|
+
elsif boxfile[:network_dirs].is_a? Array
|
28
|
+
{
|
29
|
+
key => boxfile[:network_dirs]
|
30
|
+
}
|
31
|
+
else
|
32
|
+
boxfile[:network_dirs] ||= {}
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
|
37
|
+
def clean_writables(dirs)
|
38
|
+
begin
|
39
|
+
dirs = dirs.map{|i| i.to_s}
|
40
|
+
rescue
|
41
|
+
dirs = [dirs].map{|i| i.to_s}
|
42
|
+
end
|
43
|
+
dirs = remove_empty(dirs)
|
44
|
+
dirs = filter_offensive(dirs)
|
45
|
+
dirs = strip_leading_slash(dirs)
|
46
|
+
dirs = strip_trailing_slash(dirs)
|
47
|
+
dirs = remove_nested(dirs)
|
48
|
+
dirs.uniq
|
49
|
+
end
|
50
|
+
|
51
|
+
def remove_empty(dirs)
|
52
|
+
dirs.inject([]) do |res, elem|
|
53
|
+
res << elem if elem && elem != ""
|
54
|
+
res
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def filter_offensive(dirs)
|
59
|
+
dirs.inject([]) do |res, elem|
|
60
|
+
if elem[0] != '.'
|
61
|
+
# ensure not going up a directory
|
62
|
+
# ensure spaces are intended
|
63
|
+
# ensure directory is not . or /
|
64
|
+
unless elem =~ /(\*|\.?\.\/|(?<!\\)\s)|^\.$|^\/$/
|
65
|
+
res << elem
|
66
|
+
end
|
67
|
+
end
|
68
|
+
res
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def strip_leading_slash(dirs)
|
73
|
+
dirs.inject([]) do |res, elem|
|
74
|
+
if elem[0] == '/'
|
75
|
+
elem.slice!(0)
|
76
|
+
end
|
77
|
+
res << elem
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def strip_trailing_slash(dirs)
|
82
|
+
dirs.inject([]) do |res, elem|
|
83
|
+
if elem[-1] == '/'
|
84
|
+
elem.slice!(-1)
|
85
|
+
end
|
86
|
+
res << elem
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
# this removes nested mounts like:
|
91
|
+
# tmp/
|
92
|
+
# tmp/cache/
|
93
|
+
# tmp/assets/
|
94
|
+
#
|
95
|
+
# and keeps tmp/
|
96
|
+
def remove_nested(dirs)
|
97
|
+
dirs.sort!
|
98
|
+
dirs.inject([]) do |res, elem|
|
99
|
+
overlap = false
|
100
|
+
# now make sure parents dont contain children
|
101
|
+
res.each do |parent|
|
102
|
+
if elem =~ /^#{parent}\//
|
103
|
+
overlap = true
|
104
|
+
end
|
105
|
+
end
|
106
|
+
res << elem if not overlap
|
107
|
+
res
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module Hookit
|
2
|
+
module Helper
|
3
|
+
module Shell
|
4
|
+
|
5
|
+
def sanitize_shell_vars(vars)
|
6
|
+
vars.inject({}) do |res, (key,value)|
|
7
|
+
res[escape_shell_string(key.to_s)] = escape_shell_string(value.to_s)
|
8
|
+
res
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
# strategy:
|
13
|
+
# 1- escape the escapes
|
14
|
+
# 2- escape quotes
|
15
|
+
# 3- escape backticks
|
16
|
+
# 4- escape semicolons
|
17
|
+
# 5- escape ampersands
|
18
|
+
# 6- escape pipes
|
19
|
+
# 7- escape dollar signs
|
20
|
+
# 8- escape spaces
|
21
|
+
def escape_shell_string(str)
|
22
|
+
str = str.gsub(/\\/, "\\\\\\")
|
23
|
+
str = str.gsub(/"/, "\\\"")
|
24
|
+
str = str.gsub(/`/, "\\`")
|
25
|
+
str = str.gsub(/;/, "\\;")
|
26
|
+
str = str.gsub(/&/, "\\&")
|
27
|
+
str = str.gsub(/\|/, "\\|")
|
28
|
+
str = str.gsub(/\$/, "\\$")
|
29
|
+
str = str.gsub(/ /, "\\ ")
|
30
|
+
str
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Hookit
|
2
|
+
module Helper
|
3
|
+
module XML
|
4
|
+
|
5
|
+
def sanitize_xml_vars(vars)
|
6
|
+
vars.inject({}) do |res, (key,value)|
|
7
|
+
res[sanitize_xml_string(key.to_s)] = sanitize_xml_string(value.to_s)
|
8
|
+
res
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
protected
|
13
|
+
|
14
|
+
def sanitize_xml_string(str)
|
15
|
+
str = str.gsub(/&/, '&')
|
16
|
+
str = str.gsub(/</, '<')
|
17
|
+
str = str.gsub(/>/, '>')
|
18
|
+
str = str.gsub(/"/, '"')
|
19
|
+
str = str.gsub(/'/, ''')
|
20
|
+
str
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|