puppet_webhook 0.1.0 → 1.0.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ede16a1d630dd4e207c8249f16be15a60c8e03c5765c9149430b3c25e2b4ac48
4
- data.tar.gz: db4e418f871c2b1cf183c8c8c70dba59beee16d91be479504c3c93b289757d42
3
+ metadata.gz: 4a2bedbab06ccd3b043abda7e4e3c4711f90bae1fcc6cc102c283c63c517f783
4
+ data.tar.gz: b609d99c486ef605836756939f1ff33ae40056b38641d13c2665b33ecbd56093
5
5
  SHA512:
6
- metadata.gz: 407f56e4b09e33150731e45d5ae4a3a3124d5579dd0ed75ca324ba6398cfc2a9b468661d74e5530474536d5723c78b7e5908ab4ae2751bcb60dbc51f0aae470e
7
- data.tar.gz: 9e8d88704b8150b81470c4be40551a1021aea567230b19715f7df8c89c6164d312b4ce3c6308d4cbd331c12cdd2030ebaa4e179f7beb5432ad644df01a43d29d
6
+ metadata.gz: 4cd5c13d66c1fef5b8eda9c5768e5ecc216cb24617cdd04ec07e0655213b543561074aec522790b394879e3906cd8835896d8bdf7abaffb265ade893cb2496ff
7
+ data.tar.gz: d3870a2daffca879005cac928fa0fbe46a4c65c7d3594fb12a8333d9394afc2fb5e181027e45a57dfea6505ceb92e1369587aefe4dc4abe49a3025a4fd9d988f
data/CHANGELOG.md CHANGED
@@ -1,7 +1,33 @@
1
- # Change Log
1
+ # Changelog
2
2
 
3
- ## [Unreleased](https://github.com/voxpupuli/puppet_webhook/tree/HEAD)
3
+ All notable changes to this project will be documented in this file.
4
+ Each new release typically also includes the latest modulesync defaults.
5
+ These should not affect the functionality of the module.
4
6
 
7
+ ## [v1.0.0](https://github.com/voxpupuli/puppet_webhook/tree/v1.0.0) (2017-12-21)
8
+ [Full Changelog](https://github.com/voxpupuli/puppet_webhook/compare/v0.1.0...v1.0.0)
9
+
10
+ **Implemented enhancements:**
11
+
12
+ - \(\#puppethack\) Add cli binary [\#40](https://github.com/voxpupuli/puppet_webhook/pull/40) ([dhollinger](https://github.com/dhollinger))
13
+
14
+ **Closed issues:**
15
+
16
+ - Move all routes into a routes/ directory [\#26](https://github.com/voxpupuli/puppet_webhook/issues/26)
17
+
18
+ **Merged pull requests:**
19
+
20
+ - Update config options and docs [\#41](https://github.com/voxpupuli/puppet_webhook/pull/41) ([dhollinger](https://github.com/dhollinger))
21
+ - Fix payload gentypes [\#39](https://github.com/voxpupuli/puppet_webhook/pull/39) ([dhollinger](https://github.com/dhollinger))
22
+ - Add simple config.ru file [\#38](https://github.com/voxpupuli/puppet_webhook/pull/38) ([dhollinger](https://github.com/dhollinger))
23
+ - Switch to using rack-bodyparser [\#36](https://github.com/voxpupuli/puppet_webhook/pull/36) ([alexjfisher](https://github.com/alexjfisher))
24
+ - Move routes into a routes directory [\#35](https://github.com/voxpupuli/puppet_webhook/pull/35) ([dhollinger](https://github.com/dhollinger))
25
+ - Fix generate\_types typo [\#34](https://github.com/voxpupuli/puppet_webhook/pull/34) ([alexjfisher](https://github.com/alexjfisher))
26
+ - Fix Code Climate badges [\#33](https://github.com/voxpupuli/puppet_webhook/pull/33) ([alexjfisher](https://github.com/alexjfisher))
27
+ - Add reporting to CodeClimate and associated badges [\#32](https://github.com/voxpupuli/puppet_webhook/pull/32) ([alexjfisher](https://github.com/alexjfisher))
28
+ - Report coverage to Codacy and add badge [\#31](https://github.com/voxpupuli/puppet_webhook/pull/31) ([alexjfisher](https://github.com/alexjfisher))
29
+
30
+ ## [v0.1.0](https://github.com/voxpupuli/puppet_webhook/tree/v0.1.0) (2017-11-17)
5
31
  **Implemented enhancements:**
6
32
 
7
33
  - Cleanup config loader [\#2](https://github.com/voxpupuli/puppet_webhook/issues/2)
@@ -13,6 +39,7 @@
13
39
 
14
40
  **Merged pull requests:**
15
41
 
42
+ - Development release 0.1.0 [\#24](https://github.com/voxpupuli/puppet_webhook/pull/24) ([dhollinger](https://github.com/dhollinger))
16
43
  - Add rubygems deploy to travis [\#23](https://github.com/voxpupuli/puppet_webhook/pull/23) ([dhollinger](https://github.com/dhollinger))
17
44
  - Fix TFS checks and add more fixtures/tests [\#22](https://github.com/voxpupuli/puppet_webhook/pull/22) ([dhollinger](https://github.com/dhollinger))
18
45
  - Fix README badges after project rename [\#21](https://github.com/voxpupuli/puppet_webhook/pull/21) ([dhollinger](https://github.com/dhollinger))
data/README.md CHANGED
@@ -4,6 +4,9 @@
4
4
  [![Build Status](https://img.shields.io/travis/voxpupuli/puppet_webhook.svg)](https://travis-ci.org/voxpupuli/puppet_webhook)
5
5
  [![Gem Version](https://img.shields.io/gem/v/puppet_webhook.svg)](https://rubygems.org/gems/puppet_webhook)
6
6
  [![Gem Downloads](https://img.shields.io/gem/dt/puppet_webhook.svg)](https://rubygems.org/gems/puppet_webhook)
7
+ [![Maintainability](https://api.codeclimate.com/v1/badges/f4f083a54a85f4cc97f0/maintainability)](https://codeclimate.com/github/voxpupuli/puppet_webhook/maintainability)
8
+ [![Test Coverage](https://api.codeclimate.com/v1/badges/f4f083a54a85f4cc97f0/test_coverage)](https://codeclimate.com/github/voxpupuli/puppet_webhook/test_coverage)
9
+ [![Codacy Badge](https://api.codacy.com/project/badge/Grade/f73823762ec947889866c63c4ea47540)](https://www.codacy.com/app/VoxPupuli/puppet_webhook?utm_source=github.com&utm_medium=referral&utm_content=voxpupuli/puppet_webhook&utm_campaign=Badge_Grade)
7
10
  [![Coverage Status](https://coveralls.io/repos/github/voxpupuli/puppet_webhook/badge.svg?branch=master)](https://coveralls.io/github/voxpupuli/puppet_webhook?branch=master)
8
11
  [![Dependency Status](https://gemnasium.com/badges/github.com/voxpupuli/puppet_webhook.svg)](https://gemnasium.com/github.com/voxpupuli/puppet_webhook)
9
12
 
@@ -12,11 +15,6 @@
12
15
  puppet_webhook is a Sinatra-based application receiving REST-based calls to trigger Puppet and r10k-related tasks such as:
13
16
 
14
17
  * Webhooks from Source Code systems to trigger r10k environment and module deploys
15
- * REST calls from systems to trigger Puppet Decommissions such as:
16
- * `puppet node clean`
17
- * `puppet cert clean`
18
- * `puppet cert revoke`
19
- * etc.
20
18
  * Send notifications via Slack
21
19
 
22
20
  ## Prerequisites
@@ -39,12 +37,24 @@ NOTE: RPM, DEB, and Arch packages are planned for future releases.
39
37
 
40
38
  ### Running puppet_webhook
41
39
 
42
- Once installed, you can run the application by simply executing the `puppet_webhook` binary.
40
+ #### Quick Start
43
41
 
44
- This binary will default to using the bundled configuration files and run in a non-daemon mode. This mode is useful for debugging purposes, but it probably not ideal for production use.
45
- You can also set the `server_type` option in `/etc/puppet_webhook/server.yml` to `daemon` to run the application in the background. By default the application will log to `/var/log/puppet_webhook/access.log`.
42
+ Simply run `# puppet_webhook` after installation to start puppet_webhook in non-daemon mode on your system. This is great for testing the server out.
46
43
 
47
- NOTE: During the Prerelease stage, the `/etc/puppet_webhook` and `/var/log/puppet_webhook` directories need to be manually created. This will be fixed in for General Availability.
44
+ #### CLI Tool
45
+
46
+ The `puppet_webhook` CLI command has several options you can pass it as well.
47
+
48
+ To see these options run `# puppet_webook -h` in your terminal to see all the options.
49
+
50
+ #### Start using Rack-based server software
51
+
52
+ A `config.ru` file is also packaged with the application to provide users with the ability to start the app using their own rack-based server such as
53
+ unicorn or puma. It will use the defaults passed to it by said server.
54
+
55
+ #### Service Start
56
+
57
+ Once the native packages are built, they will include default systemd and/or sysvinit service files that you can use to start puppet_webhook as well.
48
58
 
49
59
  ### Configuring puppet_webhook
50
60
 
@@ -56,154 +66,194 @@ Any configuration option is placed in `/etc/puppet_webhook/server.yml` or `/etc/
56
66
 
57
67
  #### Configuration options
58
68
 
59
- #### server.yml
69
+ #### Command-Line Options
70
+
71
+ * `-h, --help`: Display the default help output.
72
+ * `-d, --debug`: Set logging to debug mode.
73
+ * `-l [LOGFILE], --logfile [LOGFILE]`: Define a logfile to log to.
74
+ * `-p PORT, --port PORT`: Define port to listen on. Default: `8088`
75
+ * `-D, --daemon`: Run WEBrick in Daemon mode.
76
+ * `--pidfile FILE`: Define the PID File for the application's process. Default: `/var/run/puppet_webhook/webhook.pid`
77
+ * `--ssl`: Enable SSL Support.
78
+ * `--ssl-cert FILE`: Specify the SSL cert to use. Pair with `--ssl-key`. Requires `--ssl` option or `ssl_enable: true` in config file.
79
+ * `--ssl-key FILE`: Specify the SSL Private key to use. Pair with `--ssl-cert`. Requires `--ssl` or `ssl_enable: true` in config file.
80
+ * `-c FILE, --configfile FILE`: Specifies a config file to use. Must be a `.yml` file in YAML format.
81
+
82
+
83
+ #### Server Configuration File
84
+
85
+ The Server configuration file is a YAML formatted file with file extension `.yml` and defined with the `-c` or `--configfile`
86
+ command line option. These settings are exclusively for setting server configs and currently will override any command line settings
87
+ passed.
88
+
89
+ When using the default SystemD unit file or SysVInit service file, the server configuration file will default to `/etc/puppet_webhook/server.yml` (Not implemented yet).
90
+
91
+ ##### Options
60
92
 
61
93
  #####`server_type`
94
+
62
95
  Determines if the Webrick server should run in Simple or Daemon mode.
63
96
  * Valid options: [ `simple`, `daemon` ].
64
97
  * Default: `simple`
65
98
 
66
99
  ##### `logfile`
100
+
67
101
  Location to write the log file to.
68
- * Default: `/var/log/puppet_webhook/access.log`
102
+ * Default: `/var/log/puppet_webhook`
69
103
 
70
- ##### `pidfile`
71
- Location of the application's PID file
72
- * Default: `/var/run/puppet_webhook/webhook.pid`
104
+ ##### `loglevel`
73
105
 
74
- ##### `lockfile`
75
- Location of the application's Lockfile
76
- * Default: `/var/run/puppet_webhook/webhook.lock`
106
+ Define the logging level.
107
+ * Default: `WARN`
77
108
 
78
- ##### `approot`
79
- Location of the Root of the application's directory
80
- * Default: `./`
81
- NOTE: Currently unused
109
+ ##### `pidfile`
82
110
 
83
- ##### `bind_address`
84
- IPv4 Address to bind to.
85
- * MUST BE VALID IPv4 ADDRESS.
86
- * Default: `0.0.0.0`
111
+ Location of the application's PID file
112
+ * Default: `/var/run/puppet_webhook/webhook.pid`
87
113
 
88
114
  ##### `port`
115
+
89
116
  Port number to bind to.
90
117
  * Valid options: Integer between `1024` and `65535`
91
118
  * Default: `8088`
92
119
 
93
120
  ##### `enable_ssl`
121
+
94
122
  Whether or not to enable SSL communication.
95
123
  * Valid options: [ `true`, `false` ]
96
124
  * Default: `false`
97
125
 
98
- ##### `verify_ssl`
126
+ ##### `ssl_verify`
127
+
99
128
  Whether or not to verify the SSL CA/Peer on the certifcate. Set to false if using a self-signed certificate and the CA is not installed locally.
100
129
  * Valid options: [ `true`, `false` ]
101
130
  * Default: `false`
102
131
 
103
- ##### `public_key_path`
132
+ ##### `ssl_cert`
133
+
104
134
  Path to the public SSL certificate for puppet_webhook. REQUIRED IF `ssl_enable` IS SET TO `true`
105
- * Default: ''
106
135
 
107
- ##### `private_key_path`
136
+ ##### `ssl_key`
137
+
108
138
  Path to the SSL Private Key for puppet_webhook. REQUIRED IF `ssl_enable` IS SET TO `true`
109
- * Default: ''
110
139
 
111
- ##### `command_prefix`
112
- Command to prefix the r10k and puppet commands with when executed.
113
- * Default: 'umask 0022;'
140
+ #### Application Configuration File
114
141
 
115
- #### app.yml
142
+ This file stores the configuration for the Application itself. A default configuration file is included in the `APP_ROOT/config/app.yml`.
116
143
 
117
- ##### `enable_mutex_lock`
118
- Force all requests to syncronize on a mutex lock, ensuring that only a single request is processed at a time.
144
+ The SystemD unit and SysVInit service files will use `/etc/puppet_webhook/app.yml` by default (Not implemented yet).
145
+
146
+ Currently, the above two locations are the only valid locations for the app.yml file. Like the Server Config, it must be a .yml file in YAML format.
147
+
148
+ ##### Options
149
+
150
+ ##### `protected`
151
+
152
+ Whether or not to require authentication when sending to puppet_webhook.
119
153
  * Valid options: [ `true`, `false` ]
120
154
  * Default: `false`
121
155
 
122
156
  ##### `user`
123
- User for which the sending application must authenticate with.
124
- * Default: `puppet`
157
+
158
+ User for which the sending application must authenticate with. Required if `protected` is true.
125
159
 
126
160
  ##### `pass`
127
- Password for which the sending application must authenticate with.
128
- * Default: `puppet`
129
161
 
130
- ##### `protected`
131
- Whether or not to require authentication when sending to puppet_webhook.
132
- * Valid options: [ `true`, `false` ]
133
- * Default: `true`
162
+ Password for which the sending application must authenticate with. Require if `protected` is true.
134
163
 
135
164
  ##### client_cfg
165
+
136
166
  Mcollective client configuration file.
137
167
  * Default: `/var/lib/peadmin/.mcollective`
138
168
 
139
169
  ##### client_timeout
170
+
140
171
  Mcollective client timeout in seconds.
141
172
  * MUST BE A STRING
142
173
  * Default: `"120"`
143
174
 
144
175
  ##### use_mco_ruby
176
+
145
177
  Whether or not to execute MCollective via Ruby Client Library or not. REQUIRES MCOLLECTIVE AND MCOLLECTIVE R10K!
146
178
  * Valid options: [ `true`, `false` ]
147
179
  * Default: `false`
148
180
 
149
- ##### discovery_timeout
150
- MCollective Ruby discovery timeout. REQUIRES `use_mco_ruby` TO BE `true`.
151
- * Default: `'10'`
152
-
153
181
  ##### use_mcollective
182
+
154
183
  Whether or not to use MCollective CLI command. REQUIRES MCOLLECTIVE AND MCOLLECTIVE R10K.
155
184
  * Valid options: [ `true`, `false` ]
156
185
  * Default: `false`
157
186
 
187
+ ##### discovery_timeout
188
+
189
+ MCollective Ruby discovery timeout. REQUIRES `use_mco_ruby` TO BE `true`.
190
+ * Default: `'10'`
191
+
158
192
  ##### slack_webhook
193
+
159
194
  Whether or not to use Slack Notifications.
160
195
  * Valid options: [ `true`, `false` ]
161
196
  * Default: `false`
162
197
 
163
- ##### slack_channel
164
- Slack channel to notify.
165
- * Default: `'#default'`
166
-
167
- ##### slack_user
168
- Slack user to notify as.
169
- * Default: `'r10k'`
170
-
171
198
  ##### slack_proxy_url
199
+
172
200
  The proxy URL for Slack if used.
173
201
  * MUST BE A VALID URL.
174
202
  * Default: `nil`
175
203
 
176
204
  ##### default_branch
205
+
177
206
  The default git branch to use with the r10k Control Repo.
178
207
  * Default: `production`
179
208
 
180
209
  ##### ignore_environment
210
+
181
211
  An Array of environments for r10k to ignore during deployment.
182
212
  * Default: []
183
213
 
184
214
  ##### prefix
215
+
185
216
  r10k Environment Prefix to use. When set to `repo`, `user`, or `command`, the prefix will be generated from the repo_name, repo_user, or `prefix_command`. Otherwise it will set the prefix to the passed string. `false` disables prefix.
186
217
  * Valid Options: [ `repo`, `user`, `command`, `<String_value>`, `false` ]
187
- * Default: `false`
218
+ * Default: `nil`
188
219
 
189
220
  ##### prefix_command
221
+
190
222
  Command to execute that will generate an r10k environment prefix.
191
223
  * Default: ''
192
224
 
193
225
  ##### r10k_deploy_arguments
226
+
194
227
  r10k command arguments to pass to the `r10k deploy environment` command.
195
228
  * Default: `"-pv"`
196
229
 
197
230
  ##### allow_uppercase
231
+
198
232
  Whether or not to allow uppercase letters in environment names. If false, then puppet_webhook assumes environment names are downcase. If `true`, then puppet_webhook will normalize the environment name.
199
233
  * Valid options: [ `true`, `false` ]
200
234
  * Default: `true`
201
235
 
202
236
  ##### github_secret
237
+
203
238
  Used to verify the signature on a repo. Currently only supported for Github repos.
204
239
  * MUST BE A VALID OPENSSL `sha1` HASH.
205
240
  * Default: `nil`
206
241
 
207
242
  ##### repository_events
243
+
208
244
  Array of webhook events to ignore.
209
245
  * Default: `nil`
246
+
247
+ ## Getting Help
248
+
249
+ * IRC: Vox Pupuli has a dedicated channel, `#voxpupuli`, on Freenode where `puppet_webhook` questions can be directed.
250
+ * Mailing Lists: [voxpupuli](https://groups.io/g/voxpupuli)
251
+ * Slack: Vox Pupuli has a dedicated Slack Channel, `#voxpupuli`, on the [Puppet Community](https://slack.puppet.com/) Slack.
252
+
253
+ ## Contributors
254
+
255
+ A big thank you to all our [Contributor](https://github.com/voxpupuli/puppet_webhook/graphs/contributors)
256
+
257
+ ## License
258
+
259
+ See LICENSE
data/bin/puppet_webhook CHANGED
@@ -1,43 +1,111 @@
1
1
  #!/usr/bin/env ruby
2
2
  require 'openssl'
3
- require 'sinatra'
4
- require 'sinatra/config_file'
3
+ require 'optparse'
5
4
  require 'webrick'
6
5
  require 'webrick/https'
7
6
  require 'puppet_webhook'
8
7
 
9
- config_file(File.join(__dir__, '..', 'config', 'server.yml'), '/etc/puppet_webhook/server.yml')
8
+ approot = File.expand_path(File.join(File.dirname(__FILE__), '..'))
9
+ options = {
10
+ host: '0.0.0.0',
11
+ port: '8088',
12
+ logfile: $stderr,
13
+ loglevel: WEBrick::Log::WARN,
14
+ server_type: WEBrick::SimpleServer
15
+ }
16
+
17
+ ssl_opts = { ssl_verify: false }
18
+
19
+ optparse = OptionParser.new do |opts| # rubocop:disable Metrics/BlockLength
20
+ opts.banner = 'Usage: puppet_webhook [-p <port>] [-l <logfile>] [-d]
21
+ -- Starts the Puppet Webhook API service.
22
+
23
+ '
24
+
25
+ opts.on('-d', '--debug', 'Display or log messages.') do
26
+ options[:loglevel] = WEBrick::Log::DEBUG
27
+ end
28
+
29
+ opts.on('-l [LOGFILE]', '--logfile [LOGFILE]',
30
+ 'Path to logfile. Defaults to no logging, or /var/log/puppet_webhook if no filename is passed.') do |arg|
31
+ options[:logfile] = arg || '/var/log/puppet_webhook'
32
+ end
33
+
34
+ opts.on('-p PORT', '--port PORT', 'Port to listen on. Defaults to 8088.') do |arg|
35
+ options[:port] = arg
36
+ end
37
+
38
+ opts.on('-D', '--daemon', 'Run the server in daemon mode. Defaults to simple if not passed') do
39
+ options[:server_type] = WEBrick::Daemon
40
+ end
41
+
42
+ opts.on('--pidfile FILE', 'Specify the PID file to use.') do |arg|
43
+ options[:pidfile] = arg || '/var/run/puppet_webhook/webhook.pid'
44
+ end
10
45
 
11
- PIDFILE = settings.pidfile
12
- LOCKFILE = settings.lockfile
13
- APP_ROOT = settings.approot
14
- COMMAND_PREFIX = settings.command_prefix
15
- LOGGER = WEBrick::Log.new(settings.logfile, WEBrick::Log::DEBUG)
46
+ opts.on('--ssl', 'Enable SSL Support.') do
47
+ ssl_opts[:enable_ssl] = true
48
+ end
16
49
 
17
- case settings.server_type
18
- when 'simple'
19
- server_type = WEBrick::SimpleServer
20
- when 'daemon'
21
- server_type = WEBrick::Daemon
50
+ opts.on('--ssl-cert FILE', 'Specify the SSL cert to use. Pair with --ssl-key.') do |arg|
51
+ ssl_opts[:ssl_cert] = OpenSSL::X509::Certificate.new(File.open(arg).read)
52
+ end
53
+
54
+ opts.on('--ssl-key FILE', 'Specify the SSL key to use. Pair with --ssl-cert.') do |arg|
55
+ ssl_opts[:ssl_key] = OpenSSL::PKey::RSA.new(File.open(arg))
56
+ end
57
+
58
+ opts.on('-c FILE', '--configfile FILE', 'Specifies a configuration file to use.') do |arg|
59
+ @server_config = arg
60
+ end
61
+
62
+ opts.separator('')
63
+
64
+ opts.on('-h', '--help') do
65
+ puts
66
+ puts opts
67
+ puts
68
+ exit
69
+ end
22
70
  end
23
71
 
24
- opts = {
25
- Host: settings.bind_address,
26
- Port: settings.port,
27
- Logger: LOGGER,
28
- ServerType: server_type,
29
- ServerSoftware: settings.server_software,
30
- SSLEnable: settings.enable_ssl,
31
- StartCallBack: proc { File.open(PIDFILE, 'w') { |f| f.write Process.pid } }
72
+ optparse.parse!
73
+
74
+ if @server_config
75
+ config_file(@server_config)
76
+ if settings.respond_to? :server_type=
77
+ options[:server_type] = WEBrick::Daemon if settings.server_type == 'daemon'
78
+ end
79
+ options[:host] = settings.host if settings.respond_to? :host=
80
+ options[:port] = settings.port if settings.respond_to? :port=
81
+ options[:pidfile] = settings.pidfile if settings.respond_to? :pidfile=
82
+ options[:logfile] = settings.logfile if settings.respond_to? :logfile=
83
+ options[:loglevel] = settings.loglevel if settings.respond_to? :loglevel=
84
+ ssl_opts[:enable_ssl] = settings.enable_ssl if settings.respond_to? :enable_ssl=
85
+ ssl_opts[:ssl_verify] = settings.ssl_verify if settings.respond_to? :ssl_verify=
86
+ ssl_opts[:ssl_cert] = settings.ssl_cert if settings.respond_to? :ssl_cert=
87
+ ssl_opts[:ssl_key] = settings.enable_ssl if settings.respond_to? :ssl_key=
88
+ end
89
+
90
+ LOGGER = WEBrick::Log.new(options[:logfile], options[:loglevel])
91
+
92
+ webrick_opts = {
93
+ Host: options[:host],
94
+ Port: options[:port],
95
+ DocumentRoot: approot,
96
+ ServerType: options[:server_type],
97
+ ServerSoftware: PuppetWebhook,
98
+ StartCallBack: proc { File.open(options[:pidfile], 'w') { |f| f.write Process.pid } }
32
99
  }
33
100
 
34
- if settings.enable_ssl
35
- opts[:SSLVerifyClient] = settings.verify_ssl
36
- opts[:SSLCertificate] = OpenSSL::X509::Certificate.new(File.open(settings.public_key_path).read)
37
- opts[:SSLPrivateKey] = OpenSSL::PKey::RSA.new(File.open(settings.private_key_path).read)
38
- opts[:SSLCertName] = [['CN', WEBrick::Utils.getservername]]
101
+ if ssl_opts[:enable_ssl]
102
+ webrick_opts[:SSLEnable] = ssl_opts[:enable_ssl]
103
+ webrick_opts[:SSLVerifyClient] = ssl_opts[:ssl_verify]
104
+ webrick_opts[:SSLCertificate] = ssl_opts[:ssl_cert]
105
+ webrick_opts[:SSLPrivateKey] = ssl_opts[:ssl_key]
106
+ webrick_opts[:SSLCertName] = [['CN', WEBrick::Utils.getservername]]
39
107
  end
40
108
 
41
- Rack::Handler::WEBrick.run(PuppetWebhook, opts) do |server|
109
+ Rack::Handler::WEBrick.run(PuppetWebhook, webrick_opts) do |server|
42
110
  %i[INT TERM].each { |sig| trap(sig) { server.stop } }
43
111
  end
data/config/app.yml CHANGED
@@ -1,21 +1,22 @@
1
- enable_mutex_lock: false
1
+ # Authentication
2
+ protected: true
2
3
  user: puppet
3
4
  pass: puppet
4
- protected: true
5
+
6
+ # Mcollective
5
7
  client_cfg: "/var/lib/peadmin/.mcollective"
6
8
  client_timeout: "120"
7
9
  use_mco_ruby: false
8
10
  use_mcollective: false
11
+ discovery_timeout: '10'
12
+
13
+ # Slack Notifications
9
14
  slack_webhook: false
10
- slack_channel: '#default'
11
- slack_username: 'r10k'
12
- slack_proxy_url: ~
15
+
16
+ # R10k
13
17
  default_branch: production
14
- discovery_timeout: '10'
15
18
  ignore_environments: []
16
- prefix: ~
17
19
  prefix_command: ''
18
20
  r10k_deploy_arguments: "-pv"
19
21
  allow_uppercase: true
20
- github_secret: ~
21
- repository_events: ~
22
+ command_prefix: 'umask 0022;'
@@ -15,4 +15,8 @@ module DataParsers # rubocop:disable Style/Documentation
15
15
  signature = 'sha1=' + OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new('sha1'), settings.github_secret, payload_body)
16
16
  throw(:halt, [500, "Signatures didn't match!\n"]) unless Rack::Utils.secure_compare(signature, request.env['HTTP_X_HUB_SIGNATURE'])
17
17
  end
18
+
19
+ def payload
20
+ env['parsed_body']
21
+ end
18
22
  end
@@ -7,10 +7,10 @@ module Deployments # rubocop:disable Style/Documentation
7
7
  message = result.results[:statusmsg]
8
8
  else
9
9
  command = if settings.use_mcollective
10
- "#{COMMAND_PREFIX} mco r10k deploy #{branch} #{settings.mco_arguments}"
10
+ "#{settings.command_prefix} mco r10k deploy #{branch} #{settings.mco_arguments}"
11
11
  else
12
12
  # If you don't use mcollective then this hook needs to be running as r10k's user i.e. root
13
- "#{COMMAND_PREFIX} r10k deploy environment #{branch} #{settings.r10k_deploy_arguments}"
13
+ "#{settings.command_prefix} r10k deploy environment #{branch} #{settings.r10k_deploy_arguments}"
14
14
  end
15
15
  message = run_command(command)
16
16
  end
@@ -31,9 +31,9 @@ module Deployments # rubocop:disable Style/Documentation
31
31
 
32
32
  def deploy_module(module_name)
33
33
  command = if settings.use_mcollective
34
- "#{COMMAND_PREFIX} mco r10k deploy_module #{module_name} #{settings.mco_arguments}"
34
+ "#{settings.command_prefix} mco r10k deploy_module #{module_name} #{settings.mco_arguments}"
35
35
  else
36
- "#{COMMAND_PREFIX} r10k deploy module #{module_name}"
36
+ "#{settings.command_prefix} r10k deploy module #{module_name}"
37
37
  end
38
38
  message = run_command(command)
39
39
  LOGGER.info("message: #{message} module_name: #{module_name}")
data/lib/helpers/tasks.rb CHANGED
@@ -1,9 +1,10 @@
1
1
  require 'open3'
2
2
  require 'slack-notifier'
3
3
  require 'mcollective'
4
- include MCollective::RPC
5
4
 
6
5
  module Tasks # rubocop:disable Style/Documentation
6
+ include MCollective::RPC
7
+
7
8
  def ignore_env?(env)
8
9
  list = settings.ignore_environments
9
10
  return false if list.nil? || list.empty?
@@ -46,28 +47,20 @@ module Tasks # rubocop:disable Style/Documentation
46
47
  end
47
48
 
48
49
  def run_command(command)
49
- message = ''
50
- File.open(LOCKFILE, 'w+') do |file|
51
- # r10k has a small race condition which can cause failed deploys if two happen
52
- # more or less simultaneously. To mitigate, we just lock on a file and wait for
53
- # the other one to complete.
54
- file.flock(File::LOCK_EX)
55
-
56
- if Open3.respond_to?('capture3')
57
- stdout, stderr, exit_status = Open3.capture3(command)
58
- message = "triggered: #{command}\n#{stdout}\n#{stderr}"
59
- else
60
- message = "forked: #{command}"
61
- Process.detach(fork { exec "#{command} &" })
62
- exit_status = 0
63
- end
64
- raise "#{stdout}\n#{stderr}" if exit_status != 0
50
+ if Open3.respond_to?('capture3')
51
+ stdout, stderr, exit_status = Open3.capture3(command)
52
+ message = "triggered: #{command}\n#{stdout}\n#{stderr}"
53
+ else
54
+ message = "forked: #{command}"
55
+ Process.detach(fork { exec "#{command} &" })
56
+ exit_status = 0
65
57
  end
58
+ raise "#{stdout}\n#{stderr}" if exit_status != 0
66
59
  message
67
60
  end
68
61
 
69
62
  def generate_types(environment)
70
- command = "#{COMMAND_PREFIX} /opt/puppetlabs/puppet/bin generate types --environment #{environment}"
63
+ command = "#{settings.command_prefix} /opt/puppetlabs/puppet/bin generate types --environment #{environment}"
71
64
 
72
65
  message = run_command(command)
73
66
  LOGGER.info("message: #{message} environment: #{environment}")
@@ -82,9 +75,6 @@ module Tasks # rubocop:disable Style/Documentation
82
75
  def notify_slack(status_message)
83
76
  return unless settings.slack_webhook
84
77
 
85
- slack_channel = settings.slack_channel || '#default'
86
- slack_user = settings.slack_username || 'r10k'
87
-
88
78
  if settings.slack_proxy_url
89
79
  uri = URI(settings.slack_proxy_url)
90
80
  http_options = {
@@ -97,8 +87,8 @@ module Tasks # rubocop:disable Style/Documentation
97
87
  end
98
88
 
99
89
  notifier = Slack::Notifier.new settings.slack_webhook do
100
- defaults channel: slack_channel,
101
- username: slack_user,
90
+ defaults channel: '#general',
91
+ username: 'puppet_webhook',
102
92
  icon_emoji: ':ocean:',
103
93
  http_options: http_options
104
94
  end
@@ -138,8 +128,9 @@ module Tasks # rubocop:disable Style/Documentation
138
128
  end
139
129
 
140
130
  def types?
141
- return false if settings.generate_tasks.nil?
142
- settings.generate_tasks
131
+ return false unless settings.respond_to?(:generate_types=)
132
+ return false if settings.generate_types.nil?
133
+ settings.generate_types
143
134
  end
144
135
 
145
136
  def authorized?
@@ -1,9 +1,11 @@
1
- require 'rack/parser'
1
+ require 'rack/bodyparser'
2
2
  require 'json'
3
3
 
4
4
  module Sinatra
5
5
  module Parsers
6
6
  class WebhookJsonParser # rubocop:disable Style/Documentation
7
+ attr_accessor :env, :data
8
+
7
9
  def call(body)
8
10
  @data = JSON.parse(body, quirks_mode: true)
9
11
  @vcs = detect_vcs
@@ -27,35 +29,23 @@ module Sinatra
27
29
 
28
30
  def github_webhook?
29
31
  # https://developer.github.com/v3/activity/events/types/#pushevent
30
- # X-GitHub-Event header is set, but not accessible here.
31
- return false unless @data.key? 'repository'
32
- return false unless @data['repository'].key? 'id'
33
- return false unless @data['repository'].key? 'html_url'
34
- return false unless @data['repository']['html_url'] =~ %r{github\.com}
35
- true
32
+ env.key?('HTTP_X_GITHUB_EVENT')
36
33
  end
37
34
 
38
35
  def gitlab_webhook?
39
36
  # https://docs.gitlab.com/ce/user/project/integrations/webhooks.html
40
- # X-Gitlab-Event is set, but not accessible here.
41
- return false unless @data.key? 'object_kind'
42
- return false unless @data.key? 'ref'
43
- true
37
+ env.key?('HTTP_X_GITLAB_EVENT')
44
38
  end
45
39
 
46
40
  # stash/bitbucket server
47
41
  def stash_webhook?
48
42
  # https://confluence.atlassian.com/bitbucketserver/post-service-webhook-for-bitbucket-server-776640367.html
49
- return false unless @data.key? 'refChanges'
50
- true
43
+ env.key?('HTTP_X_ATLASSIAN_TOKEN')
51
44
  end
52
45
 
53
46
  def bitbucket_webhook?
54
47
  # https://confluence.atlassian.com/bitbucket/event-payloads-740262817.html
55
- return false unless @data.key? 'actor'
56
- return false unless @data.key? 'repository'
57
- return false unless @data.key? 'push'
58
- true
48
+ env.key?('HTTP_X_EVENT_KEY')
59
49
  end
60
50
 
61
51
  def tfs_webhook?
@@ -97,8 +87,6 @@ module Sinatra
97
87
  @data['push']['changes'][0]['closed']
98
88
  when 'tfs'
99
89
  @data['resource']['refUpdates'][0]['newObjectId'] == '0000000000000000000000000000000000000000'
100
- else
101
- false
102
90
  end
103
91
  end
104
92
 
@@ -4,148 +4,48 @@ require 'json'
4
4
  require 'cgi'
5
5
  require 'parsers/webhook_json_parser'
6
6
 
7
+ # Routes
8
+ require_relative 'routes/default'
9
+ require_relative 'routes/module'
10
+ require_relative 'routes/payload'
11
+
7
12
  class PuppetWebhook < Sinatra::Base # rubocop:disable Style/Documentation
8
13
  set :root, File.dirname(__FILE__)
9
- use Rack::Parser,
14
+ use Rack::BodyParser,
10
15
  parsers: { 'application/json' => Sinatra::Parsers::WebhookJsonParser.new },
11
16
  handlers: { 'application/json' => proc { |e, type| [400, { 'Content-Type' => type }, [{ error: e.to_s }.to_json]] } }
12
17
  register Sinatra::ConfigFile
13
18
 
14
19
  config_file(File.join(__dir__, '..', 'config', 'app.yml'), '/etc/puppet_webhook/app.yml')
15
20
 
21
+ # Sinatra settings
16
22
  set :static, false
17
- set :lock, true if settings.enable_mutex_lock
23
+ set :lock, true
24
+
25
+ # Custom Settings
26
+ set :protected, false unless settings.respond_to? :protected=
27
+ set :client_cfg, '/var/lib/peadmin/.mcollective' unless settings.respond_to? :client_cfg=
28
+ set :client_timeout, '120' unless settings.respond_to? :client_timeout=
29
+ set :use_mco_ruby, false unless settings.respond_to? :use_mco_ruby=
30
+ set :use_mcollective, false unless settings.respond_to? :use_mcollective=
31
+ set :discovery_timeout, false unless settings.respond_to? :discovery_timeout=
32
+ set :slack_webhook, false unless settings.respond_to? :slack_webhook=
33
+ set :slack_proxy_url, nil unless settings.respond_to? :slack_proxy_url=
34
+ set :default_branch, 'production' unless settings.respond_to? :default_branch=
35
+ set :ignore_environments, [] unless settings.respond_to? :ignore_environments=
36
+ set :prefix, nil unless settings.respond_to? :prefix=
37
+ set :prefix_command, '' unless settings.respond_to? :prefix_command=
38
+ set :r10k_deploy_arguments, '-pv' unless settings.respond_to? :r10k_deploy_arguments=
39
+ set :allow_uppercase, true unless settings.respond_to? :allow_uppercase=
40
+ set :command_prefix, 'umask 0022;' unless settings.respond_to? :command_prefix=
41
+ set :github_secret, nil unless settings.respond_to? :github_secret=
42
+ set :repository_events, nil unless settings.respond_to? :respository_events=
18
43
 
19
44
  require 'helpers/init'
20
45
 
21
- get '/' do
22
- raise Sinatra::NotFound
23
- end
24
-
25
- get '/heartbeat' do
26
- return 200, { status: :success, message: 'running' }.to_json
27
- end
28
-
29
- # TODO: Move examples into the README.md
30
- # Simulate a github post:
31
- # curl -X POST \
32
- # -H "Content-Type: application/json" \
33
- # -d '{ \
34
- # "repository": { \
35
- # "id": 12345, \
36
- # "name": "puppetlabs-stdlib", \
37
- # "html_url": "http://github.com", \
38
- # "owner": {\
39
- # "login": "foo"
40
- # } \
41
- # } \
42
- # }' \
43
- # 'https://puppet:puppet@localhost:8088/module' -k -q
44
- #
45
- # Simulate a BitBucket post:
46
- # curl -X POST \
47
- # -H "Content-Type: application/json" \
48
- # -d '{ \
49
- # "repository": { \
50
- # "full_name": "puppetlabs/puppetlabs-stdlib", \
51
- # "name": "PuppetLabs : StdLib"
52
- # } }' \
53
- # 'https://puppet:puppet@localhost:8088/module' -k -q
54
- #
55
- # This example shows that, unlike github, BitBucket allows special characters
56
- # in repository names but translates it to generate a full_name which
57
- # is used in the repository URL and is most useful for this webhook handler.
58
- post '/module' do
59
- protected! if settings.protected
60
- request.body.rewind # in case someone has already read it
61
-
62
- # Short circuit if we're ignoring this event
63
- return 200 if ignore_event?
64
-
65
- # TODO: Move these two lines of code into the parser
66
- decoded = request.body.read
67
- verify_signature(decoded) if verify_signature?
68
-
69
- module_name = params['module_name']
70
-
71
- module_name = sanitize_input(module_name)
72
- LOGGER.info("Deploying module #{module_name}")
73
- deploy_module(module_name)
74
- end
75
-
76
- # Simulate a github post:
77
- # curl -d '{ "ref": "refs/heads/production" }' -H "Accept: application/json" 'https://puppet:puppet@localhost:8088/payload' -k -q
78
- #
79
- # If using stash look at the stash_mco.rb script included here.
80
- # It will filter the stash post and make it look like a github post.
81
- #
82
- # Simulate a Gitorious post:
83
- # curl -X POST -d '%7b%22ref%22%3a%22master%22%7d' 'http://puppet:puppet@localhost:8088/payload' -q
84
- # Yes, Gitorious does not support https...
85
- #
86
- # Simulate a BitBucket post:
87
- # curl -X POST -d '{ "push": { "changes": [ { "new": { "name": "production" } } ] } }' \
88
- # 'https://puppet:puppet@localhost:8088/payload' -k -q
89
-
90
- post '/payload' do # rubocop:disable Metrics/BlockLength
91
- LOGGER.info "params = #{params}"
92
- protected! if settings.protected
93
- request.body.rewind # in case someone already read it
94
-
95
- # Short circuit if we're ignoring this event
96
- return 200 if ignore_event?
97
-
98
- # Check if content type is x-www-form-urlencoded
99
- decoded = if request.content_type.to_s.casecmp('application/x-www-form-urlencoded').zero?
100
- CGI.unescape(request.body.read).gsub(%r{^payload\=}, '')
101
- else
102
- request.body.read
103
- end
104
- verify_signature(decoded) if verify_signature?
105
- data = JSON.parse(decoded, quirks_mode: true)
106
-
107
- # Iterate the data structure to determine what's should be deployed
108
- branch = params['branch']
109
-
110
- # If prefix is enabled in our config file, determine what the prefix should be
111
- prefix = case settings.prefix
112
- when :repo
113
- params['repo_name']
114
- when :user
115
- params['repo_user']
116
- when :command, TrueClass
117
- run_prefix_command(data.to_json)
118
- when String
119
- settings.prefix
120
- end
121
-
122
- # When a branch is being deleted, a deploy against it will result in a failure, as it no longer exists.
123
- # Instead, deploy the default branch, which will purge deleted branches per the user's configuration
124
- deleted = params['deleted']
125
-
126
- branch = if deleted
127
- settings.default_branch
128
- else
129
- sanitize_input(branch)
130
- end
131
-
132
- # r10k doesn't yet know how to deploy all branches from a single source.
133
- # The best we can do is just deploy all environments by passing nil to
134
- # deploy() if we don't know the correct branch.
135
- env = if prefix.nil? || prefix.empty? || branch.nil? || branch.empty?
136
- normalize(branch)
137
- else
138
- normalize("#{prefix}_#{branch}")
139
- end
140
-
141
- if ignore_env?(env)
142
- LOGGER.info("Skipping deployment of environment #{env} according to ignore_environments configuration parameter")
143
- return 200
144
- else
145
- LOGGER.info("Deploying environment #{env}")
146
- deploy(env, deleted)
147
- end
148
- end
46
+ register Sinatra::PuppetWebhookRoutes::Default
47
+ register Sinatra::PuppetWebhookRoutes::Module
48
+ register Sinatra::PuppetWebhookRoutes::Payload
149
49
 
150
50
  not_found do
151
51
  halt 404, "You shall not pass! (page not found)\n"
@@ -0,0 +1,18 @@
1
+ require 'sinatra'
2
+
3
+ module Sinatra
4
+ module PuppetWebhookRoutes
5
+ # Registers the default GET routes for PuppetWebhook
6
+ module Default
7
+ def self.registered(puppet_webhook)
8
+ puppet_webhook.get '/' do
9
+ raise Sinatra::NotFound
10
+ end
11
+
12
+ puppet_webhook.get '/heartbeat' do
13
+ return 200, { status: :success, message: 'running' }.to_json
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,28 @@
1
+ require 'sinatra'
2
+
3
+ module Sinatra
4
+ module PuppetWebhookRoutes
5
+ # Registers a POST endpoint for the PuppetWebhook App
6
+ module Module
7
+ def self.registered(puppet_webhook)
8
+ puppet_webhook.post '/module' do
9
+ protected! if settings.protected
10
+ request.body.rewind # in case someone has already read it
11
+
12
+ # Short circuit if we're ignoring this event
13
+ return 200 if ignore_event?
14
+
15
+ # TODO: Move these two lines of code into the parser
16
+ decoded = request.body.read
17
+ verify_signature(decoded) if verify_signature?
18
+
19
+ module_name = payload[:module_name]
20
+
21
+ module_name = sanitize_input(module_name)
22
+ LOGGER.info("Deploying module #{module_name}")
23
+ deploy_module(module_name)
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,70 @@
1
+ require 'sinatra'
2
+
3
+ module Sinatra
4
+ module PuppetWebhookRoutes
5
+ # Registers a POST route for the Payload endpoint on PuppetWebhook
6
+ module Payload
7
+ def self.registered(puppet_webhook)
8
+ puppet_webhook.post '/payload' do # rubocop:disable Metrics/BlockLength
9
+ LOGGER.info "parsed payload contained: #{payload}"
10
+ protected! if settings.protected
11
+ request.body.rewind # in case someone already read it
12
+
13
+ # Short circuit if we're ignoring this event
14
+ return 200 if ignore_event?
15
+
16
+ # Check if content type is x-www-form-urlencoded
17
+ decoded = if request.content_type.to_s.casecmp('application/x-www-form-urlencoded').zero?
18
+ CGI.unescape(request.body.read).gsub(%r{^payload\=}, '')
19
+ else
20
+ request.body.read
21
+ end
22
+ verify_signature(decoded) if verify_signature?
23
+ data = JSON.parse(decoded, quirks_mode: true)
24
+
25
+ # Iterate the data structure to determine what's should be deployed
26
+ branch = payload[:branch]
27
+
28
+ # If prefix is enabled in our config file, determine what the prefix should be
29
+ prefix = case settings.prefix
30
+ when :repo
31
+ payload[:repo_name]
32
+ when :user
33
+ payload[:repo_user]
34
+ when :command, TrueClass
35
+ run_prefix_command(data.to_json)
36
+ when String
37
+ settings.prefix
38
+ end
39
+
40
+ # When a branch is being deleted, a deploy against it will result in a failure, as it no longer exists.
41
+ # Instead, deploy the default branch, which will purge deleted branches per the user's configuration
42
+ deleted = payload[:deleted]
43
+
44
+ branch = if deleted
45
+ settings.default_branch
46
+ else
47
+ sanitize_input(branch)
48
+ end
49
+
50
+ # r10k doesn't yet know how to deploy all branches from a single source.
51
+ # The best we can do is just deploy all environments by passing nil to
52
+ # deploy() if we don't know the correct branch.
53
+ env = if prefix.nil? || prefix.empty? || branch.nil? || branch.empty?
54
+ normalize(branch)
55
+ else
56
+ normalize("#{prefix}_#{branch}")
57
+ end
58
+
59
+ if ignore_env?(env)
60
+ LOGGER.info("Skipping deployment of environment #{env} according to ignore_environments configuration parameter")
61
+ return 200
62
+ else
63
+ LOGGER.info("Deploying environment #{env}")
64
+ deploy(env, deleted)
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: puppet_webhook
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Vox Pupuli
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-11-17 00:00:00.000000000 Z
11
+ date: 2017-12-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: json
@@ -39,7 +39,7 @@ dependencies:
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
- name: rack-parser
42
+ name: rack-bodyparser
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - ">="
@@ -108,6 +108,20 @@ dependencies:
108
108
  - - ">="
109
109
  - !ruby/object:Gem::Version
110
110
  version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: codacy-coverage
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
111
125
  - !ruby/object:Gem::Dependency
112
126
  name: coveralls
113
127
  requirement: !ruby/object:Gem::Requirement
@@ -218,13 +232,15 @@ files:
218
232
  - README.md
219
233
  - bin/puppet_webhook
220
234
  - config/app.yml
221
- - config/server.yml
222
235
  - lib/helpers/data_parsers.rb
223
236
  - lib/helpers/deployments.rb
224
237
  - lib/helpers/init.rb
225
238
  - lib/helpers/tasks.rb
226
239
  - lib/parsers/webhook_json_parser.rb
227
240
  - lib/puppet_webhook.rb
241
+ - lib/routes/default.rb
242
+ - lib/routes/module.rb
243
+ - lib/routes/payload.rb
228
244
  homepage: https://github.com/voxpupuli/puppet_webhook
229
245
  licenses:
230
246
  - apache
@@ -246,7 +262,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
246
262
  version: '0'
247
263
  requirements: []
248
264
  rubyforge_project:
249
- rubygems_version: 2.7.2
265
+ rubygems_version: 2.7.3
250
266
  signing_key:
251
267
  specification_version: 4
252
268
  summary: Sinatra Webhook Server for Puppet/R10K
data/config/server.yml DELETED
@@ -1,13 +0,0 @@
1
- server_type: simple
2
- logfile: /var/log/puppet_webhook/access.log
3
- pidfile: /var/run/puppet_webhook/webhook.pid
4
- lockfile: /var/run/puppet_webhook/webhook.lock
5
- approot: './'
6
- server_software: PuppetWebhook
7
- bind_address: 0.0.0.0
8
- port: 8088
9
- enable_ssl: false
10
- verify_ssl: false
11
- public_key_path: ''
12
- private_key_path: ''
13
- command_prefix: 'umask 0022;'