mantra 0.1.0 → 0.2.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 +4 -4
- data/.gitignore +2 -0
- data/.rspec +1 -0
- data/.travis.yml +8 -2
- data/README.md +126 -16
- data/bin/mantra +17 -0
- data/ci/README.md +6 -0
- data/ci/docker/Dockerfile +20 -0
- data/ci/docker/build-docker-image +10 -0
- data/ci/pipeline.yml +42 -0
- data/ci/scripts/run-tests +3 -0
- data/ci/stub.example.yml +6 -0
- data/ci/stub.yml +33 -0
- data/ci/tasks/run-tests-dev.yml +10 -0
- data/ci/tasks/run-tests-stable.yml +13 -0
- data/lib/mantra/certificate.rb +35 -0
- data/lib/mantra/certificates/cortege.rb +64 -0
- data/lib/mantra/certificates/group.rb +26 -0
- data/lib/mantra/command.rb +51 -0
- data/lib/mantra/commands/find.rb +38 -0
- data/lib/mantra/commands/transform.rb +38 -0
- data/lib/mantra/helpers/object_with_type.rb +60 -0
- data/lib/mantra/helpers/regexp_helper.rb +12 -0
- data/lib/mantra/helpers/template_helper.rb +70 -0
- data/lib/mantra/manifest/array_element.rb +84 -0
- data/lib/mantra/manifest/element.rb +175 -0
- data/lib/mantra/manifest/ext.rb +33 -0
- data/lib/mantra/manifest/hash_element.rb +88 -0
- data/lib/mantra/manifest/leaf_element.rb +38 -0
- data/lib/mantra/manifest/root_element.rb +38 -0
- data/lib/mantra/manifest/scope/array_scope.rb +53 -0
- data/lib/mantra/manifest/scope/empty_scope.rb +24 -0
- data/lib/mantra/manifest/scope/hash_scope.rb +20 -0
- data/lib/mantra/manifest/scope/leaf_scope.rb +0 -0
- data/lib/mantra/manifest/scope.rb +94 -0
- data/lib/mantra/manifest.rb +47 -0
- data/lib/mantra/merge_tool/spiff.rb +23 -0
- data/lib/mantra/merge_tool.rb +13 -0
- data/lib/mantra/transform/extract.rb +10 -0
- data/lib/mantra/transform/extract_certificates.rb +18 -0
- data/lib/mantra/transform/extract_certificates_to_files.rb +12 -0
- data/lib/mantra/transform/extract_section.rb +10 -0
- data/lib/mantra/transform/inputs/any.rb +10 -0
- data/lib/mantra/transform/inputs/array.rb +16 -0
- data/lib/mantra/transform/inputs/file.rb +16 -0
- data/lib/mantra/transform/inputs/folder.rb +9 -0
- data/lib/mantra/transform/inputs/hash.rb +16 -0
- data/lib/mantra/transform/inputs/string.rb +9 -0
- data/lib/mantra/transform/merge.rb +26 -0
- data/lib/mantra/transform/replace.rb +34 -0
- data/lib/mantra/transform/templatize_ip_address.rb +129 -0
- data/lib/mantra/transform/templatize_value.rb +63 -0
- data/lib/mantra/transform.rb +118 -0
- data/lib/mantra/version.rb +1 -1
- data/lib/mantra.rb +9 -1
- data/mantra.gemspec +6 -5
- metadata +69 -8
- data/bin/console +0 -14
- data/bin/setup +0 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f071f30737a66c7b81b0b0100831abfe981a5032
|
4
|
+
data.tar.gz: 1c0015a38b4ecd69be8d38688bb6c8284d5ff6dc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5a85bda3e4389db1b75a9bfde752f5aa8185ad03fec4caadf8239c4bd4a266891167d57388fb1699b11fe2e5c154763642c97dfef51e712e6c66daada7e9af2b
|
7
|
+
data.tar.gz: fec5710aaed34e7961fe4a63ff405390bb416a57370bce2b44f9d5e4303e1fb3b492bbf0ed6bda5d56de342a7e4a4178497bdc6b048c3949240ae48dfd50e2d5
|
data/.gitignore
CHANGED
data/.rspec
CHANGED
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -1,34 +1,144 @@
|
|
1
|
-
# Mantra
|
1
|
+
# Mantra - मंत्र
|
2
2
|
|
3
|
-
|
3
|
+
[](https://travis-ci.org/allomov/mantra)
|
4
4
|
|
5
|
-
|
5
|
+
### Description
|
6
6
|
|
7
|
-
|
7
|
+
Mantra (/ˈmæntrə/, abr. **Man**ifest **Tra**nsformation) is a tool to ease work with manifests.
|
8
|
+
|
9
|
+
It allows to do following:
|
10
|
+
|
11
|
+
* find manifest parts
|
12
|
+
* extract cloud config from you BOSH v1 manifest
|
13
|
+
* convert your manifest into spiff templates with
|
14
|
+
* extracted passwords
|
15
|
+
* extracted certificates to different files
|
16
|
+
* templatized network configuration
|
17
|
+
* extracted or changed properties
|
18
|
+
* and much more
|
19
|
+
|
20
|
+
Mantra is tend to be an easily extendable tool, so you can add new commands and transforms.
|
21
|
+
|
22
|
+
### Concepts
|
23
|
+
|
24
|
+
While some actions performed on manifest can be automated, anther require special configuration and extra knowledges about source manifes. Here is a small glossery that I use:
|
25
|
+
|
26
|
+
`Transformation Manifest` - config file that describes how your manifest should be udpated
|
27
|
+
`Source Manifest` - your source BOSH manifest, if you run templatizers on source manifest they can change it.
|
28
|
+
`Target Manifest` - manifest that will contain extracted template properties, to restore source manifest you'll need to run merge tool with resulting source manifest.
|
29
|
+
`Transform` - a ruby class that declares how specific transformation should be done.
|
30
|
+
|
31
|
+
### Examples
|
32
|
+
|
33
|
+
Find and output in json some manifest parts:
|
34
|
+
|
35
|
+
```
|
36
|
+
mantra find jobs[name=consul].properties -m manifest.yml -f json
|
37
|
+
# alias: mantra f
|
38
|
+
```
|
8
39
|
|
9
|
-
|
40
|
+
Transform BOSH v1 manifest to extract cloud config:
|
10
41
|
|
11
|
-
```
|
12
|
-
|
42
|
+
```
|
43
|
+
mantra transform -c transformation-manifest.yml -m manifest.yml
|
44
|
+
# mantra t
|
13
45
|
```
|
14
46
|
|
15
|
-
|
47
|
+
Here is an example of `transformation-manifest.yml`:
|
48
|
+
|
49
|
+
```yaml
|
50
|
+
global:
|
51
|
+
source: manifest.yml
|
52
|
+
target: cloud-config.yml
|
53
|
+
transforms:
|
54
|
+
- filter:
|
55
|
+
sections: ["networks", "compilation", "update", "resource_pools", "disk_pools"]
|
56
|
+
- rename:
|
57
|
+
section: "resource_pools"
|
58
|
+
to: "vm_types"
|
59
|
+
- rename:
|
60
|
+
section: "disk_pools"
|
61
|
+
to: "disk_types"
|
62
|
+
- type: add
|
63
|
+
section:
|
64
|
+
az: z1
|
65
|
+
to: "networks[].subnets[]"
|
66
|
+
- add:
|
67
|
+
section:
|
68
|
+
az: z1
|
69
|
+
to: "update"
|
70
|
+
- add:
|
71
|
+
section:
|
72
|
+
az: z1
|
73
|
+
to: "compilation"
|
74
|
+
- add:
|
75
|
+
section:
|
76
|
+
azs:
|
77
|
+
- name: z1
|
78
|
+
to: ""
|
79
|
+
```
|
16
80
|
|
17
|
-
$ bundle
|
18
81
|
|
19
|
-
|
82
|
+
```yaml
|
83
|
+
global_vars:
|
84
|
+
source: manifest.yml
|
85
|
+
transforms:
|
86
|
+
- extract:
|
87
|
+
section: jobs
|
88
|
+
to: workspace/jobs.yml
|
89
|
+
- extract-certs:
|
90
|
+
from: workspace/properties.yml
|
91
|
+
to: workspace/secrets.yml
|
92
|
+
- extract-certs-to-files:
|
93
|
+
from: workspace/secrets.yml
|
94
|
+
to: workspace/secrets
|
95
|
+
- extract:
|
96
|
+
section: jobs
|
97
|
+
to:
|
98
|
+
file: manifest.yml
|
99
|
+
with_scope: meta.jobs
|
100
|
+
- extract:
|
101
|
+
source: manifest.yml
|
102
|
+
section: resource_pools
|
103
|
+
- extract:
|
104
|
+
section: resource_pools
|
105
|
+
to: resource_pools.yml
|
106
|
+
- extract:
|
107
|
+
section: networks
|
108
|
+
to: networks.yml
|
109
|
+
- templatize-ip-address:
|
110
|
+
from: networks.yml
|
111
|
+
to: workspace/stub.yml
|
112
|
+
quads:
|
113
|
+
- range: "1-2"
|
114
|
+
scope: meta.networks.cf.prefix
|
115
|
+
with_value: "192.168"
|
116
|
+
- number: 3
|
117
|
+
scope: meta.networks.cf.quad1
|
118
|
+
with_value: 2
|
119
|
+
- number: 3
|
120
|
+
scope: meta.networks.cf.quad2
|
121
|
+
with_value: 3
|
122
|
+
- templatize-value:
|
123
|
+
source: manifest.yml
|
124
|
+
to: workspace/stub.yml
|
125
|
+
value: cfdomain.com
|
126
|
+
in: "*.cfdomain.com"
|
127
|
+
scope: meta.domain
|
128
|
+
```
|
20
129
|
|
21
|
-
$ gem install mantra
|
22
130
|
|
23
|
-
##
|
131
|
+
## Installation
|
24
132
|
|
25
|
-
|
133
|
+
Install it as a gem:
|
26
134
|
|
27
|
-
|
135
|
+
```
|
136
|
+
$ gem install mantra
|
137
|
+
```
|
28
138
|
|
29
|
-
|
139
|
+
## Dependencies
|
30
140
|
|
31
|
-
|
141
|
+
`openssl`!
|
32
142
|
|
33
143
|
## Contributing
|
34
144
|
|
data/bin/mantra
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
$LOAD_PATH.unshift File.expand_path('../lib', __FILE__)
|
4
|
+
require "mantra"
|
5
|
+
|
6
|
+
if ARGV.empty?
|
7
|
+
puts Mantra::Command.usage
|
8
|
+
exit 0
|
9
|
+
end
|
10
|
+
|
11
|
+
command_type = ARGV.shift
|
12
|
+
options = {type: command_type.to_sym, args: ARGV}
|
13
|
+
|
14
|
+
command = Mantra::Command.create(options)
|
15
|
+
|
16
|
+
command.run
|
17
|
+
|
data/ci/README.md
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
FROM ruby:2.3.0
|
2
|
+
MAINTAINER Alex Lomov <lomov.as@gmail.com>
|
3
|
+
# should go to allomov/ruby#manifest-generator
|
4
|
+
|
5
|
+
RUN apt-get -y update --fix-missing
|
6
|
+
RUN apt-get -y install git git-core curl gawk g++ gcc make libc6-dev libreadline6-dev \
|
7
|
+
zlib1g-dev libssl-dev libyaml-dev libsqlite3-dev sqlite3 autoconf \
|
8
|
+
libgdbm-dev libncurses5-dev automake libtool bison pkg-config libffi-dev
|
9
|
+
|
10
|
+
RUN apt-get install -y postgresql postgresql-contrib postgresql-client libpq5 libpq-dev
|
11
|
+
|
12
|
+
RUN apt-get install -y nodejs npm cmake
|
13
|
+
RUN ln -s /usr/bin/nodejs /usr/bin/node
|
14
|
+
|
15
|
+
RUN gem install bundler --no-ri --no-rdoc
|
16
|
+
|
17
|
+
COPY manifest-generator /manifest-generator
|
18
|
+
|
19
|
+
WORKDIR /manifest-generator
|
20
|
+
RUN bundle install
|
data/ci/pipeline.yml
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
---
|
2
|
+
resources:
|
3
|
+
- name: merrill-manifest-generator-dev
|
4
|
+
type: git
|
5
|
+
source:
|
6
|
+
uri: {{github-repo}}
|
7
|
+
branch: manifest-generator-dev
|
8
|
+
private_key: {{git-repo-private-key}}
|
9
|
+
- name: slack-notification
|
10
|
+
type: slack-notification
|
11
|
+
source:
|
12
|
+
url: {{slack-notification-url}}
|
13
|
+
|
14
|
+
jobs:
|
15
|
+
- name: dev-version
|
16
|
+
plan:
|
17
|
+
- get: merrill-manifest-generator-dev
|
18
|
+
trigger: true
|
19
|
+
- task: run-tests
|
20
|
+
file: merrill-manifest-generator-dev/manifest-generator/ci/tasks/run-tests-dev.yml
|
21
|
+
on_failure:
|
22
|
+
do:
|
23
|
+
- put: slack-notification
|
24
|
+
params:
|
25
|
+
channel: {{slack-channel}}
|
26
|
+
username: {{slack-username}}
|
27
|
+
icon_emoji: ":robot_face:"
|
28
|
+
text: "@here dev version of manifest-generator seems to be broken"
|
29
|
+
- name: stable-version
|
30
|
+
plan:
|
31
|
+
- get: merrill-manifest-generator-stable
|
32
|
+
trigger: true
|
33
|
+
- task: run-tests
|
34
|
+
file: merrill-manifest-generator-stable/manifest-generator/ci/tasks/run-tests-stable.yml
|
35
|
+
on_failure:
|
36
|
+
do:
|
37
|
+
- put: slack-notification
|
38
|
+
params:
|
39
|
+
channel: {{slack-channel}}
|
40
|
+
username: {{slack-username}}
|
41
|
+
icon_emoji: ":robot_face:"
|
42
|
+
text: "@here stable version of manifest-generator seems to be broken"
|
data/ci/stub.example.yml
ADDED
@@ -0,0 +1,6 @@
|
|
1
|
+
slack-notification-url: "https://https://hooks.slack.com/services/XXXXXX/XXXXXX/ID"
|
2
|
+
slack-channel: "#general"
|
3
|
+
slack-username: "Merrill-Manifest-Generator-Bot"
|
4
|
+
github-repo: git@github.com:pivotalservices/merrill.git
|
5
|
+
git-repo-private-key: |
|
6
|
+
Your private key here
|
data/ci/stub.yml
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
---
|
2
|
+
slack-notification-url: "https://hooks.slack.com/services/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"
|
3
|
+
slack-channel: "#general"
|
4
|
+
slack-username: "Merrill-Manifest-Generator-Bot"
|
5
|
+
github-repo: git@github.com:pivotalservices/merrill.git
|
6
|
+
git-repo-private-key: |
|
7
|
+
-----BEGIN RSA PRIVATE KEY-----
|
8
|
+
MIIEogIBAAKCAQEAz/SJ469kiOr3CysK7Tqp1ZQPYFviObH6N4ucmAiWb78KxqM+
|
9
|
+
BBMEsmdo/2Pe0CKfiMGW14LA4JlpQIguuNixUiSffBo7zlfxigm8MpgdF3i7kqOv
|
10
|
+
Ffv+zOpLfq1i0rRz+cV9RsowRxbRkWekiy0YqDqVW4pyzfXIMd81dhjQh25w6Zs+
|
11
|
+
PFyAlg9bU7QUl0F9vljqpHii0n7hCL2hcKN7Jq0XF4AHPyQg24UgagU955wvlWvx
|
12
|
+
iJZ4fRcG1bSNTCJvParS7Pl/wnCC73WJ0d8MMOVHbk3G0lYPtbaCwUctZ47MjB4f
|
13
|
+
j6+40sfkfoJZQ6eb43AHnCZVypS652hcKGiLpQIDAQABAoIBAGdKZ1MYQy9exeZe
|
14
|
+
MscyZDkZmama+fr+U/JS/izl1xMaKRgQ7TTI3YRfqN9xk7J+AA/FWE8jOvpUONs8
|
15
|
+
yTg3KZxLZIwX26zaMbcGrtvSgmCuLzze4JBi4mSV23nIVVWjHBfr6BXJR8GHrAA1
|
16
|
+
Ip2egKjOsHEPi4aRliZvX/aQzML3SxcpttyxaRT5ytokMSjNSNRk2fTdcCliLbnD
|
17
|
+
+UOsGwWiZpC1BDZXHeKsnyGLgK5cgG4Pygnr0gDZY73wflnGHWFBQhIaLfdZdBb6
|
18
|
+
zXyYD6XGM3p+SUOL0JxWLFCMLWntpzn0LRx3RBmicXiW82dLrjVo1nQw9+TtMOv3
|
19
|
+
kWrO9OECgYEA6FpU0AngbKDnWAjG0peYrIKFgF/9Gk60JCQsXkHyNJ/mVt4sjFtG
|
20
|
+
y5Ajh6QxKReF1Be+W7di2CH9/Sb0xYdeiFAWtqNeBEOMOZYAV22zoFAb97SIlSrT
|
21
|
+
oZSquzY6jXldZU1lH0Pknklmz8Y4jcRSHvUKDXlr2MHvXMP7RIHKvTcCgYEA5R6O
|
22
|
+
m/LgMVn8ahB8jTSVPO41Ely1oH6dUghaQEqFf0MJmKBKESq+SHId8wHD9Sbuirg/
|
23
|
+
/KtYBe0ouvtIddX4AIoO5NVOudUGzLZEBntHUnpAln/P3COJkd0LdbN/5okguMkb
|
24
|
+
uMHJdqL/OWAUGOVzpM+DxK53c70r1VpIr3IETAMCgYAVP1VsJMsSA/DD2yGbVmOO
|
25
|
+
uuzMXXq+sh3FBE3OXMdySoD8xppaR2qE6Oxm1fvs3wrM51Lv/igazZj1Ul+lxIg/
|
26
|
+
fNtm3i+VwjuLdI0ZcZ2wdkLodujagy0RJJAsSHw4PbXtspMhtcqtMtck/uJjDGXa
|
27
|
+
ENxXeRgEnU9vMzjB/gB1JwKBgDIttAvhcEo+q/JKtAx01K5oeQURetGwiSHbJHDq
|
28
|
+
ITyS4PolOLNzygKxw29iFpmNMjb9TT44BGof24i/2cm817i+g66ILNq0Fe4liNZm
|
29
|
+
j2M31Qdg7JQI0Gs6nvTjIALMS3dMzB51inrKDd1x9lTRg7c3n2Mm1pBpgL0ULdEG
|
30
|
+
xnwjAoGAD+S5jsF2m0amYbR3pUwWFHmThXhB+ud6Sx8WVt4lL4zPA0doh8yTrt0h
|
31
|
+
srNaVWjGC6DHW2u4f1ArkGB3Csi/RtYFGV06V2j9Z5vgEf/1BCW0peiLqsiUQfRo
|
32
|
+
zsZ7pCigQzaSJDYjkvUXibgXHK7cuZ+D6CdQVy1QGuxWsP4lzc0=
|
33
|
+
-----END RSA PRIVATE KEY-----
|
@@ -0,0 +1,10 @@
|
|
1
|
+
---
|
2
|
+
platform: linux
|
3
|
+
image_resource:
|
4
|
+
type: docker-image
|
5
|
+
source: {repository: "allomov/ruby", tag: "manifest-generator"}
|
6
|
+
inputs:
|
7
|
+
- name: merrill-manifest-generator-dev
|
8
|
+
run:
|
9
|
+
path: ci/scripts/run-tests
|
10
|
+
dir: merrill-manifest-generator-dev/manifest-generator
|
@@ -0,0 +1,13 @@
|
|
1
|
+
---
|
2
|
+
platform: linux
|
3
|
+
image_resource:
|
4
|
+
type: docker-image
|
5
|
+
source: {repository: "allomov/ruby", tag: "manifest-generator"}
|
6
|
+
inputs:
|
7
|
+
- name: merrill-manifest-generator-stable
|
8
|
+
run:
|
9
|
+
# path: ci/scripts/run-tests
|
10
|
+
# dir: merrill-manifest-generator-stable/manifest-generator
|
11
|
+
path: bash
|
12
|
+
args:
|
13
|
+
- "ci/scripts/run-tests"
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module Mantra
|
2
|
+
module Certificate
|
3
|
+
class DigitalCertificate
|
4
|
+
TEMPLATE_MESSAGE = "Difital Certificate from file:"
|
5
|
+
attr_accessor :path, :type, :value
|
6
|
+
def initialize(options)
|
7
|
+
self.path = options[:path]
|
8
|
+
self.type = options[:type].strip
|
9
|
+
self.value = options[:value].strip
|
10
|
+
end
|
11
|
+
|
12
|
+
def private_key?
|
13
|
+
self.type.include? "PRIVATE KEY"
|
14
|
+
end
|
15
|
+
|
16
|
+
def public_key?
|
17
|
+
self.type == "PUBLIC KEY"
|
18
|
+
end
|
19
|
+
|
20
|
+
def certificate?
|
21
|
+
self.type == "CERTIFICATE"
|
22
|
+
end
|
23
|
+
|
24
|
+
def scope
|
25
|
+
self.path.to_scope
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
# require "mantra/certificates/string_ext"
|
33
|
+
require "mantra/certificates/cortege"
|
34
|
+
require "mantra/certificates/group"
|
35
|
+
# require "mantra/certificates"
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require "tempfile"
|
2
|
+
|
3
|
+
module Mantra
|
4
|
+
class Certificates
|
5
|
+
class Cortege
|
6
|
+
|
7
|
+
attr_accessor :public_key, :private_key, :certificate
|
8
|
+
def initialize(options)
|
9
|
+
self.public_key = options[:public_key]
|
10
|
+
self.private_key = options[:private_key]
|
11
|
+
self.certificate = options[:certificate]
|
12
|
+
end
|
13
|
+
|
14
|
+
def matches?
|
15
|
+
if self.has_private_key? && self.has_certificate?
|
16
|
+
return private_key_matches_certificate?
|
17
|
+
elsif self.has_private_key? && self.has_public_key?
|
18
|
+
return private_key_matches_public_key?
|
19
|
+
else
|
20
|
+
puts "Warning: don't know what to do with following certificate cortege #{self.inspect}"
|
21
|
+
return false
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def has_certificate?
|
26
|
+
!!self.certificate
|
27
|
+
end
|
28
|
+
|
29
|
+
def has_public_key?
|
30
|
+
!!self.public_key
|
31
|
+
end
|
32
|
+
|
33
|
+
def has_private_key?
|
34
|
+
!!self.private_key
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
# https://www.digitalocean.com/community/tutorials/openssl-essentials-working-with-ssl-certificates-private-keys-and-csrs
|
40
|
+
# https://www.sslshopper.com/article-most-common-openssl-commands.html
|
41
|
+
# TODO: find out if there are ruby wrappers for this calls
|
42
|
+
def private_key_matches_certificate?
|
43
|
+
private_key_file_path = temp_file_wrapper(self.private_key.value, "domain.key")
|
44
|
+
certificate_file_path = temp_file_wrapper(self.certificate.value, "domain.crt")
|
45
|
+
private_key_md5 = `openssl rsa -noout -modulus -in #{private_key_file_path} 2> /dev/null | openssl md5`
|
46
|
+
certificate_md5 = `openssl x509 -noout -modulus -in #{certificate_file_path} 2> /dev/null | openssl md5`
|
47
|
+
private_key_md5 == certificate_md5
|
48
|
+
end
|
49
|
+
|
50
|
+
def private_key_matches_public_key?
|
51
|
+
private_key_file_path = temp_file_wrapper(self.private_key.value, "domain.key")
|
52
|
+
private_key_public_key = `openssl rsa -in #{private_key_file_path} -pubout 2> /dev/null`
|
53
|
+
private_key_public_key.strip == self.public_key.value
|
54
|
+
end
|
55
|
+
|
56
|
+
def temp_file_wrapper(string, filename)
|
57
|
+
file = Tempfile.new(filename)
|
58
|
+
file.write(string)
|
59
|
+
file.close
|
60
|
+
file.path
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require "forwardable"
|
2
|
+
|
3
|
+
# this class acts as it was simple DigitalCertificate
|
4
|
+
module Mantra
|
5
|
+
class Certificates
|
6
|
+
class Group
|
7
|
+
extend Forwardable
|
8
|
+
|
9
|
+
attr_accessor :certificates
|
10
|
+
alias_method :collection, :certificates
|
11
|
+
|
12
|
+
def_delegators :@certificates, :sample
|
13
|
+
def_delegators :sample, :certificate?, :public_key?, :private_key?, :value
|
14
|
+
|
15
|
+
|
16
|
+
def initialize(certificate_list)
|
17
|
+
self.certificates = certificate_list
|
18
|
+
end
|
19
|
+
|
20
|
+
def private_keys
|
21
|
+
self.certificates.select { |c| c.private_key? }
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require "optparse"
|
2
|
+
|
3
|
+
module Mantra
|
4
|
+
class Command
|
5
|
+
include Helpers::ObjectWithType
|
6
|
+
|
7
|
+
def self.option_descriptors
|
8
|
+
@options ||= []
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.usage
|
12
|
+
"\n\tUsage: \tmantra <action> [options]\n" +
|
13
|
+
"\tactions:\t#{self.subclasses.map { |s| s.type }.join(", ")}\n\n"
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.option(name, long_option, short_option, description)
|
17
|
+
self.option_descriptors << [name, long_option, short_option, description]
|
18
|
+
self.send(:define_method, name) do
|
19
|
+
@options[name.to_s]
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def run
|
24
|
+
parse_options
|
25
|
+
perform
|
26
|
+
end
|
27
|
+
|
28
|
+
def initialize(options)
|
29
|
+
@args = options[:args]
|
30
|
+
end
|
31
|
+
|
32
|
+
attr_accessor :options
|
33
|
+
def parse_options
|
34
|
+
@options = {}
|
35
|
+
OptionParser.new do |options_parser|
|
36
|
+
options_parser.banner = "Usage: mantra #{} [options]"
|
37
|
+
self.class.option_descriptors.each do |option|
|
38
|
+
option_name = option.shift.to_s
|
39
|
+
options_parser.on(*option) do |value|
|
40
|
+
@options[option_name] = value
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end.parse!
|
44
|
+
@options
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
require "mantra/commands/find"
|
51
|
+
require "mantra/commands/transform"
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require "yaml"
|
2
|
+
require "json"
|
3
|
+
|
4
|
+
module Mantra
|
5
|
+
class Commands
|
6
|
+
class Find < Command
|
7
|
+
type :find
|
8
|
+
alias_type :f
|
9
|
+
option :scope, "--scope scope-path", "-s scope", "path scope you want to find"
|
10
|
+
option :manifest, "--manifest manifest-file", "-m manifest-file", "manifest"
|
11
|
+
option :format, "--format format", "-f format", "format (yaml or json)"
|
12
|
+
option :with_parent, "--with-parent", "-p", "format (yaml or json)"
|
13
|
+
|
14
|
+
def perform
|
15
|
+
m = Manifest.new(manifest)
|
16
|
+
results = m.select(scope)
|
17
|
+
|
18
|
+
results = results.map do |element|
|
19
|
+
element.parent
|
20
|
+
end if with_parent
|
21
|
+
|
22
|
+
results = results.map do |element|
|
23
|
+
element.to_ruby_object
|
24
|
+
end
|
25
|
+
|
26
|
+
case format
|
27
|
+
when "yaml", "yml", "y", nil
|
28
|
+
puts results.to_yaml
|
29
|
+
when "json", "j"
|
30
|
+
puts JSON.pretty_generate(results)
|
31
|
+
else
|
32
|
+
raise "unknown format"
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require "yaml"
|
2
|
+
|
3
|
+
module Mantra
|
4
|
+
class Commands
|
5
|
+
class Transform < Command
|
6
|
+
type :transform
|
7
|
+
alias_type :t
|
8
|
+
attr_accessor :manifest
|
9
|
+
|
10
|
+
option :transform_config_path, "--config CONFIG", "-c", "Transformation config path"
|
11
|
+
option :manifest_path, "--manifest MANIFEST", "-m", "Manifest path"
|
12
|
+
|
13
|
+
def transform_config
|
14
|
+
@transform_config ||= YAML.load_file(transform_config_path)
|
15
|
+
end
|
16
|
+
|
17
|
+
def transforms
|
18
|
+
previous_transform = self
|
19
|
+
transform_config["transforms"].map do |t|
|
20
|
+
t.merge!(previous_transform: previous_transform)
|
21
|
+
previous_transform = Mantra::Transform.create(t)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def manifest
|
26
|
+
@manifest ||= Manifest.new(self.manifest_path)
|
27
|
+
end
|
28
|
+
|
29
|
+
def perform
|
30
|
+
transforms.each do |t|
|
31
|
+
t.run
|
32
|
+
end
|
33
|
+
puts manifest.to_ruby_object.to_yaml
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|