opensecret 0.0.2 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +4 -0
- data/README.md +2 -2
- data/bin/opensecret +3 -6
- data/lib/opensecret-domain.ini +23 -0
- data/lib/opensecret.rb +30 -2
- data/lib/opensecret/additions/array.rb +117 -0
- data/lib/opensecret/additions/dir.rb +35 -0
- data/lib/opensecret/additions/string.rb +312 -0
- data/lib/opensecret/commons/eco.cmdline.rb +446 -0
- data/lib/opensecret/commons/eco.faculty.rb +364 -0
- data/lib/opensecret/commons/eco.system.rb +437 -0
- data/lib/opensecret/commons/eco.systems.rb +98 -0
- data/lib/opensecret/{safe.rb → delegate.rb} +4 -2
- data/lib/opensecret/eco.do.rb +46 -0
- data/lib/opensecret/executors/crypt.keys/crypt.keys.ini +79 -0
- data/lib/opensecret/executors/crypt.keys/crypt.keys.rb +68 -0
- data/lib/opensecret/executors/decrypt/decrypt.ini +64 -0
- data/lib/opensecret/executors/decrypt/decrypt.rb +49 -0
- data/lib/opensecret/executors/encrypt/encrypt.ini +55 -0
- data/lib/opensecret/executors/encrypt/encrypt.rb +82 -0
- data/lib/opensecret/factbase/hub-runtime.ini +123 -0
- data/lib/opensecret/factbase/known-hosts.ini +75 -0
- data/lib/opensecret/factbase/published.facts/blobbolicious-facts.ini +553 -0
- data/lib/opensecret/factbase/published.facts/credential-facts.ini +40 -0
- data/lib/opensecret/factbase/published.facts/infrastructure-facts.ini +63 -0
- data/lib/opensecret/factbase/readme.md +24 -0
- data/lib/opensecret/factbase/retired.facts/maven.database.ide.facts.ini +127 -0
- data/lib/opensecret/factbase/retired.facts/s3-upload-block-facts.ini +17 -0
- data/lib/opensecret/plugins.io/cipher/crypto.rb +174 -0
- data/lib/opensecret/plugins.io/error/eco.exceptions.rb +24 -0
- data/lib/opensecret/plugins.io/facts/fact.chars.rb +66 -0
- data/lib/opensecret/plugins.io/facts/fact.factor.rb +156 -0
- data/lib/opensecret/plugins.io/facts/fact.locator.rb +105 -0
- data/lib/opensecret/plugins.io/facts/fact.reader.rb +137 -0
- data/lib/opensecret/plugins.io/facts/fact.tree.rb +661 -0
- data/lib/opensecret/plugins.io/file/file.rb +483 -0
- data/lib/opensecret/plugins.io/git/git.flow.rb +388 -0
- data/lib/opensecret/plugins.io/logs/log.object.rb +89 -0
- data/lib/opensecret/plugins.io/logs/logging.rb +203 -0
- data/lib/opensecret/plugins.io/time/time.stamp.rb +425 -0
- data/lib/opensecret/version.rb +2 -2
- data/opensecret.gemspec +8 -13
- metadata +68 -18
@@ -0,0 +1,123 @@
|
|
1
|
+
#--
|
2
|
+
#-- This fact base holds the [keyinstance facts] for the
|
3
|
+
#-- eco-system (hub) being created.
|
4
|
+
#--
|
5
|
+
#-- ---------------------
|
6
|
+
#-- [Fact Assimilation]
|
7
|
+
#-- ---------------------
|
8
|
+
#--
|
9
|
+
#-- This core factfile is always parsed and its constituent
|
10
|
+
#-- facts are assimilated. These facts are also guaranteed
|
11
|
+
#-- to be assimilated [FIRST].
|
12
|
+
#--
|
13
|
+
#-- ----------------
|
14
|
+
#-- [Dependencies]
|
15
|
+
#-- ----------------
|
16
|
+
#--
|
17
|
+
#-- As these facts are assimilated [first], they cannot be
|
18
|
+
#-- beholden to (dependent on) any other fact files.
|
19
|
+
#--
|
20
|
+
|
21
|
+
[this]
|
22
|
+
host = e>> NetDns.instance.host_name
|
23
|
+
user = e>> Home.usr
|
24
|
+
home.dir = e>> Home.dir
|
25
|
+
host.user = e>> @f[:this][:host] + Do.t + @f[:this][:user]
|
26
|
+
|
27
|
+
## ---------------------------
|
28
|
+
## start refactor
|
29
|
+
## @todo => drive belongs to the workstation fact cluster
|
30
|
+
## @todo => archive belongs to the workstation fact cluster
|
31
|
+
drive = e>> File.join Home.dir, "com.laundry4j.drive"
|
32
|
+
archive = e>> File.join @f[:this][:drive], "library.packaged.software"
|
33
|
+
## end refactor
|
34
|
+
## ---------------------------
|
35
|
+
|
36
|
+
[time]
|
37
|
+
stamp = e>> Stamp.yyjjj_hhmm_sst
|
38
|
+
now = @todo
|
39
|
+
|
40
|
+
today = @todo
|
41
|
+
yesterday = @todo
|
42
|
+
tomorrow = @todo
|
43
|
+
|
44
|
+
this.week = @todo
|
45
|
+
last.week = @todo
|
46
|
+
next.week = @todo
|
47
|
+
|
48
|
+
this.month = @todo
|
49
|
+
last.month = @todo
|
50
|
+
next.month = @todo
|
51
|
+
|
52
|
+
this.year = @todo
|
53
|
+
last.year = @todo
|
54
|
+
next.year = @todo
|
55
|
+
|
56
|
+
# @todo -- refactor - change FROM [eco] TO [hub]
|
57
|
+
# @todo -- refactor - change FROM [eco] TO [hub]
|
58
|
+
# @todo -- refactor - change FROM [eco] TO [hub]
|
59
|
+
# @todo -- refactor - change FROM [eco] TO [hub]
|
60
|
+
# @todo -- refactor - change FROM [eco] TO [hub]
|
61
|
+
# @todo -- refactor - change FROM [eco] TO [hub]
|
62
|
+
# @todo -- refactor - change FROM [eco] TO [hub]
|
63
|
+
# @todo -- refactor - change FROM [eco] TO [hub]
|
64
|
+
# @todo -- refactor - change FROM [eco] TO [hub]
|
65
|
+
# @todo -- refactor - change FROM [eco] TO [hub]
|
66
|
+
# @todo -- refactor - change FROM [eco] TO [hub]
|
67
|
+
[eco]
|
68
|
+
id = e>> @i[:plugin]
|
69
|
+
sym = e>> @i[:plugin].to_sym
|
70
|
+
url = eco-platform.co.uk
|
71
|
+
box = eco-platform.archive
|
72
|
+
src = eco-platform.station
|
73
|
+
dst = eco-platform.uploads
|
74
|
+
vms = eco-platform.cluster
|
75
|
+
ip.url = https://www.eco-platform.co.uk/commons/eco-platform.git
|
76
|
+
|
77
|
+
|
78
|
+
## decommission and remove the plugin month spanning facts
|
79
|
+
## decommission and remove the plugin month spanning facts
|
80
|
+
## decommission and remove the plugin month spanning facts
|
81
|
+
## decommission and remove the plugin month spanning facts
|
82
|
+
## decommission and remove the plugin month spanning facts
|
83
|
+
[plugin]
|
84
|
+
month.span = e>> @i[:plugin] + Do.t + Stamp.yymo_mmm
|
85
|
+
month.span.b4 = e>> @i[:plugin] + Do.t + Stamp.yymo_mmm_prev
|
86
|
+
month.stamp = e>> "eco." + @s[:month_span]
|
87
|
+
month.stamp.b4 = e>> "eco." + @s[:month_span_b4]
|
88
|
+
|
89
|
+
|
90
|
+
## @todo - Change to (1) [hub][dir] (2) [hub][name] and (3) [hub][path] - THEN MOVE UP (where eco is now)
|
91
|
+
## @todo - Change to (1) [hub][dir] (2) [hub][name] and (3) [hub][path] - THEN MOVE UP (where eco is now)
|
92
|
+
## @todo - Change to (1) [hub][dir] (2) [hub][name] and (3) [hub][path] - THEN MOVE UP (where eco is now)
|
93
|
+
## @todo - Change to (1) [hub][dir] (2) [hub][name] and (3) [hub][path] - THEN MOVE UP (where eco is now)
|
94
|
+
## @todo - Change to (1) [hub][dir] (2) [hub][name] and (3) [hub][path] - THEN MOVE UP (where eco is now)
|
95
|
+
[runtime]
|
96
|
+
dirname = e>> @i[:plugin] + Do.t + @f[:time][:stamp] + Do.t + @f[:this][:user] + "." + @f[:this][:host]
|
97
|
+
|
98
|
+
|
99
|
+
dstname = e>> @f[:eco][:dst]
|
100
|
+
dstpath = e>> File.join @f[:runtime][:dstname], @f[:runtime][:dirname]
|
101
|
+
|
102
|
+
station.1.dir = e>> File.join Home.dir, @f[:eco][:src]
|
103
|
+
station.2.dir = e>> File.join @f[:runtime][:station_1_dir], @f[:plugin][:month_stamp]
|
104
|
+
station.3.dir = e>> File.join @f[:runtime][:station_2_dir], @f[:runtime][:dirname]
|
105
|
+
|
106
|
+
dir = e>> @f[:runtime][:station_3_dir]
|
107
|
+
archive = e>> File.join Home.dir, @f[:eco][:box]
|
108
|
+
|
109
|
+
|
110
|
+
## DELETE all the below facts
|
111
|
+
## DELETE all the below facts
|
112
|
+
## DELETE all the below facts
|
113
|
+
## DELETE all the below facts
|
114
|
+
## DELETE all the below facts
|
115
|
+
## DELETE all the below facts
|
116
|
+
## DELETE all the below facts
|
117
|
+
[stamp]
|
118
|
+
mini = e>> @i[:plugin] + Do.t + Stamp.yyjjj_hhmm_sst + Do.t + @f[:this][:user]
|
119
|
+
midi = e>> @f[:stamp][:mini] + "." + @f[:this][:host]
|
120
|
+
mini.2 = e>> (@f[:stamp][:mini]).gsub ".", "-"
|
121
|
+
flat = e>> Stamp.yyjjj_hhmm_sst.gsub ".", ""
|
122
|
+
time = e>> Stamp.yyjjj_hhmm_sst
|
123
|
+
|
@@ -0,0 +1,75 @@
|
|
1
|
+
|
2
|
+
# --
|
3
|
+
# -- Fact File => known.hosts.ini
|
4
|
+
# -- Directory => project-root/reusable.facts
|
5
|
+
# -- Purpose => Bonds workstations with the known accessible hosts
|
6
|
+
# -- that the plugins build eco-systems on top of.
|
7
|
+
# --
|
8
|
+
# -- ---------------------
|
9
|
+
# -- The LapTop Use Case
|
10
|
+
# -- ---------------------
|
11
|
+
# --
|
12
|
+
# -- A laptop in the office may carry the IP of 192.168.5.xxx
|
13
|
+
# -- The same laptop at home may connect using 192.168.0.xxx
|
14
|
+
# --
|
15
|
+
# -- Create two fact groups like [laptop.work] and [laptop.home]
|
16
|
+
# --
|
17
|
+
# -- [laptop.work] contains => wiki.dev.host = office.giant
|
18
|
+
# -- (and)
|
19
|
+
# -- [laptop.home] contains => wiki.dev.host = kitchen.pc
|
20
|
+
# --
|
21
|
+
# -- At work the wiki.dev plugins creates the wiki on [office.giant]
|
22
|
+
# -- (whilst)
|
23
|
+
# -- at home the same wiki.dev plugin puts the wiki on [kitchen.pc]
|
24
|
+
# --
|
25
|
+
# --
|
26
|
+
|
27
|
+
|
28
|
+
[inca.desktop]
|
29
|
+
username = apollo13
|
30
|
+
hostnames = e>> [ "balloon" ]
|
31
|
+
secrets.dir = I:/strings-cache
|
32
|
+
aws.creds.dir = I:/aws.iam.credentials
|
33
|
+
ssh.keydir = e>> File.join Home.dir, "com.laundry4j.drive/library.ssh.access.keys"
|
34
|
+
wiki.dev.host = inca.server
|
35
|
+
|
36
|
+
|
37
|
+
[inca.server]
|
38
|
+
username = apollo
|
39
|
+
hostnames = e>> [ "192.168.0.14", "warehouse" ]
|
40
|
+
net.bridge = enp6s0
|
41
|
+
secrets.dir = /media/usb_drive/cryptography.keys
|
42
|
+
aws.creds.dir = e>> File.join Home.dir, "devops-hub.iam.creds"
|
43
|
+
|
44
|
+
|
45
|
+
[little.brain]
|
46
|
+
username = apollo
|
47
|
+
hostnames = e>> [ "192.168.75.240", "brain-pad" ]
|
48
|
+
net.bridge = enp0s31f6
|
49
|
+
secrets.dir = /media/apollo/02E4-1244/cryptography.keys
|
50
|
+
aws.creds.dir = /media/apollo/02E4-1244/aws.iam.credentials
|
51
|
+
ssh.keydir = e>> File.join Home.dir, "eco-platform.credentials"
|
52
|
+
wiki.dev.host = little.brain
|
53
|
+
|
54
|
+
|
55
|
+
[wee.brain]
|
56
|
+
username = apollo
|
57
|
+
hostnames = e>> [ "192.168.82.92", "littlepc" ]
|
58
|
+
net.bridge = enp6s0
|
59
|
+
|
60
|
+
|
61
|
+
[gitlab.server]
|
62
|
+
root.domain = eco-platform.co.uk
|
63
|
+
username = ubuntu
|
64
|
+
hostnames = e>> Array.new
|
65
|
+
net.bridge = notapplicable
|
66
|
+
key.rel.path = eco-platform.station/eco.gitlab.hub.1712.dec/gitlab.hub.17359.0416.335.apollo13.balloon/keypair.gitlab.hub.17359.0416.335.apollo13.balloon.pem
|
67
|
+
ssh.key.path = e>> File.join Home.dir, @f[:gitlab_server][:key_rel_path]
|
68
|
+
host.server = e>> LinuxHost.existing_host( \
|
69
|
+
@f[:gitlab_server][:root_domain], \
|
70
|
+
@f[:gitlab_server][:username], \
|
71
|
+
@f[:gitlab_server][:ssh_key_path], \
|
72
|
+
@f[:gitlab_server][:net_bridge] \
|
73
|
+
)
|
74
|
+
|
75
|
+
|
@@ -0,0 +1,553 @@
|
|
1
|
+
# ###############################################################################
|
2
|
+
# ###############################################################################
|
3
|
+
|
4
|
+
# --
|
5
|
+
# -- The group names are the name of a mirrored resource file tree.
|
6
|
+
# --
|
7
|
+
# -- They contain keys that specify the
|
8
|
+
# --
|
9
|
+
# -- [1] - S3 bucket name at the cloud endpoint of the mirror
|
10
|
+
# -- [2] - offset to root folder within S3 bucket (can be empty)
|
11
|
+
# -- [3] - IAM user with permissions to read/write within S3
|
12
|
+
# -- [4] - path to the local mirrrored folder (created if necessary)
|
13
|
+
# -- [5] - sync options (typically --delete and --size-only)
|
14
|
+
# --
|
15
|
+
# -- Currently it is assumed that the user running the eco script
|
16
|
+
# -- is the local user with the necessary permissions for accessing
|
17
|
+
# -- and interacting with the mirror.
|
18
|
+
# --
|
19
|
+
|
20
|
+
[books]
|
21
|
+
|
22
|
+
s3.bucket = devops.books
|
23
|
+
buket.offset = e>> ""
|
24
|
+
iam.s3.user = devops.librarian
|
25
|
+
path.offset = e>> File.join Home.dir, "mirror.books"
|
26
|
+
sync.options = e>> Array.new.push("--delete").push("--size-only")
|
27
|
+
|
28
|
+
# ###############################################################################
|
29
|
+
# ###############################################################################
|
30
|
+
|
31
|
+
# ---
|
32
|
+
# --- Note that (AND) is the operator employed
|
33
|
+
# --- when more than one fact directive lives in
|
34
|
+
# --- a chunk.
|
35
|
+
# ---
|
36
|
+
# --- To implement and (OR) type operator use
|
37
|
+
# --- two (or more chunks).
|
38
|
+
# ---
|
39
|
+
# --- The Ruby eql? method is used to compare so
|
40
|
+
# --- you can compare strings, ints, objects ...
|
41
|
+
# ---
|
42
|
+
# --- String comparisons are case insensitive.
|
43
|
+
# ---
|
44
|
+
|
45
|
+
|
46
|
+
## @@@ @@@@@@@@@@@@@@@@@ @@ ##
|
47
|
+
## @@@ Project Namespace @@ ##
|
48
|
+
## @@@ @@@@@@@@@@@@@@@@@ @@ ##
|
49
|
+
|
50
|
+
|
51
|
+
[s3]
|
52
|
+
upload.prefix = s3put.
|
53
|
+
uploads.dir = e>> File.join @f[:runtime][:dir], "s3_uploads"
|
54
|
+
|
55
|
+
### ===============================
|
56
|
+
### refactor these fact names to
|
57
|
+
### ===============================
|
58
|
+
### [s3.bucket] = group
|
59
|
+
### this.month = ...
|
60
|
+
### next.month = ...
|
61
|
+
### last.month = ...
|
62
|
+
### ===============================
|
63
|
+
|
64
|
+
month.bucket = e>> @f[:plugin][:month_stamp]
|
65
|
+
month.bucket.b4 = e>> @f[:plugin][:month_stamp_b4]
|
66
|
+
monthwide.url = e>> "s3://" + @f[:plugin][:month_stamp]
|
67
|
+
|
68
|
+
bucket.name = e>> @f[:plugin][:month_stamp] # a [deprecated] fact
|
69
|
+
|
70
|
+
|
71
|
+
[gitlab]
|
72
|
+
backups.dir = /var/opt/gitlab/backups
|
73
|
+
backups.cache = e>> @f[:plugin][:month_stamp]
|
74
|
+
backups.s3.dir = e>> "s3://" + @f[:plugin][:month_stamp]
|
75
|
+
clone.suffix = _gitlab_backup.tar
|
76
|
+
|
77
|
+
|
78
|
+
[docker]
|
79
|
+
cmd.pre = e>> "sudo docker exec --user=" + Ch.dq + "mongodb" + Ch.dq + " -i container.mongodb bash -c " + Ch.dq
|
80
|
+
no.cache = e>> if CmdLine.has? "--no-cache" then return "--no-cache" else return "" end
|
81
|
+
rm.image.cmd = e>> if CmdLine.has? "--no-cache" then return "sudo docker rmi img." + @f[:eco][:id] else return "" end
|
82
|
+
|
83
|
+
|
84
|
+
[certbot]
|
85
|
+
cert.name = hub-certificates
|
86
|
+
email.address = apolloakora@gmail.com
|
87
|
+
|
88
|
+
|
89
|
+
[gollum]
|
90
|
+
template.dir = templates
|
91
|
+
git.mirror = e>> "wiki." + Stamp.yyjjj_hhmm_sst
|
92
|
+
|
93
|
+
|
94
|
+
[vagrant]
|
95
|
+
ip.addr.file = vm-ip-addresses.txt
|
96
|
+
hostname = e>> Stamp.yyjjj_hhmm_sst.gsub(".", "-")
|
97
|
+
|
98
|
+
#--
|
99
|
+
#-- -------------------------------------------------------------
|
100
|
+
#-- @todo fact override missionary (trail-blazer)
|
101
|
+
#-- -------------------------------------------------------------
|
102
|
+
#-- [1] - change to ubuntu/xenial64 when overriding tech arrives
|
103
|
+
#-- [2] - Then in plugin facts add the override statement (see vm.cluster)
|
104
|
+
#-- [3] - Then in templates like below add the @ -- [vagrant|boxname] placeholder
|
105
|
+
#-- => vagrant/Vagrantfile.kube.master
|
106
|
+
#-- => vagrant/Vagrantfile.kube.worker
|
107
|
+
#--
|
108
|
+
boxname = geerlingguy/centos7
|
109
|
+
vm.name = e>> "vm." + @f[:stamp][:time]
|
110
|
+
|
111
|
+
|
112
|
+
[port]
|
113
|
+
jenkins = 42001:8081
|
114
|
+
gollum = 42006:4567
|
115
|
+
|
116
|
+
|
117
|
+
# --
|
118
|
+
# -- ---------- = ---------------------------------------- #
|
119
|
+
# -- The fact l = ayout format is [16 spaces] before the
|
120
|
+
# -- equals sig = n then [2 spaces] after.
|
121
|
+
# -- =
|
122
|
+
# -- 6789012345 = string value
|
123
|
+
# -- 6789012345 = e>> 3 + 4
|
124
|
+
# -- ---------- = ---------------------------------------- #
|
125
|
+
# --
|
126
|
+
|
127
|
+
[overwrite]
|
128
|
+
spec.filename = e>> @i[:plugin] + ".overwrite.spec.json"
|
129
|
+
spec.filepath = e>> File.join @f[:runtime][:dir], @f[:overwrite][:spec_filename]
|
130
|
+
|
131
|
+
|
132
|
+
# --
|
133
|
+
# -- The fact layout format is [16 spaces] before the
|
134
|
+
# -- equals sign and [2 spaces] after.
|
135
|
+
# --
|
136
|
+
# -- 6789012345 = string value
|
137
|
+
# -- 6789012345 = e>> 3 + 4
|
138
|
+
# --
|
139
|
+
|
140
|
+
|
141
|
+
|
142
|
+
# -- ---------- = ----------------------------------------- #
|
143
|
+
# -- The fact l = ayout format is [16 spaces] before the
|
144
|
+
# -- equals sig = n then [2 spaces] after.
|
145
|
+
# -- =
|
146
|
+
# -- 6789012345 = string value
|
147
|
+
# -- 6789012345 = e>> 3 + 4
|
148
|
+
# -- ---------- = ----------------------------------------- #
|
149
|
+
|
150
|
+
#-- -----------------------------
|
151
|
+
#-- Using "String" Umbrella Maps
|
152
|
+
#-- -----------------------------
|
153
|
+
#--
|
154
|
+
#-- String umbrella maps are for creating a string key and string value map.
|
155
|
+
#-- These maps are accessible using the [UMBRELLA] key @u
|
156
|
+
#--
|
157
|
+
#-- For example to import an inventory of
|
158
|
+
#-- key = source filename and
|
159
|
+
#-- value = destination filename
|
160
|
+
#--
|
161
|
+
#-- Group [u.inventory]
|
162
|
+
#-- Access key-value map with @u[:inventory]
|
163
|
+
#-- And you can say if exists( @u[:inventory] )
|
164
|
+
#--
|
165
|
+
#-- NOTE - umbrella sections can be continued in other files.
|
166
|
+
#-- - if when they are - key/values are appended to map.
|
167
|
+
|
168
|
+
#--
|
169
|
+
#-- -------------------------------------------------------
|
170
|
+
#-- Disallowed Group Names
|
171
|
+
#-- -------------------------------------------------------
|
172
|
+
#--
|
173
|
+
#-- Some group names are not allowed because they have been
|
174
|
+
#-- allocated for shorthand purposes.
|
175
|
+
#--
|
176
|
+
#-- For example [plugin]. This name is a shorthand for the
|
177
|
+
#-- plugin id.
|
178
|
+
#--
|
179
|
+
#-- So "@t[plugin|root.domain]" is replaced with "devops-hub.com"
|
180
|
+
#--
|
181
|
+
#-- Thus we cannot create a group called [plugin].
|
182
|
+
#--
|
183
|
+
#-- Curently disallowed group names are everything in the
|
184
|
+
#-- @i (identity) map ===== THINK aBOUT THIS SOME MORE.
|
185
|
+
#--
|
186
|
+
#--
|
187
|
+
#--
|
188
|
+
#-- -------------------------------------------------------
|
189
|
+
#-- Sibling Facs ( @s )
|
190
|
+
#-- -------------------------------------------------------
|
191
|
+
#--
|
192
|
+
#-- The @s[:length] is a "sibling" fact. @s is a one dimensional
|
193
|
+
#-- array containing all (sibling) key-pairs under the umbrella
|
194
|
+
#-- of a (parent) group - in this case [rectangle].
|
195
|
+
#--
|
196
|
+
#--
|
197
|
+
#-- [rectangle]
|
198
|
+
#--
|
199
|
+
#-- length,width = <<absract>>
|
200
|
+
#-- perimeter = e>> (@s[:length] * 2) + (@s[:width] * 2)
|
201
|
+
#-- area = e>> @s[:length] * @s[:width]
|
202
|
+
#--
|
203
|
+
#--
|
204
|
+
#-- -------------------------------------------------------
|
205
|
+
#-- The Advantage of Sibling Facts ( @s )
|
206
|
+
#-- -------------------------------------------------------
|
207
|
+
#--
|
208
|
+
#-- Sibling facts are a [shorthand] way to declare facts
|
209
|
+
#-- within an INI fact file. These 2 declarations produce
|
210
|
+
#-- the same value.
|
211
|
+
#--
|
212
|
+
#-- @f[:rectangle][:length]
|
213
|
+
#-- @s[:length]
|
214
|
+
#--
|
215
|
+
#-- The sibling fact must be declared in an INI fact file
|
216
|
+
#-- within the [auspices] of or under an [umbrella] that is
|
217
|
+
#-- the parent group.
|
218
|
+
|
219
|
+
|
220
|
+
#--
|
221
|
+
#-- Fact consumption can happen in five (5) different ways
|
222
|
+
#--
|
223
|
+
#-- -
|
224
|
+
#-- - @p (plugin related facts)
|
225
|
+
#-- - @l
|
226
|
+
#-- - @u (umbrella string maps)
|
227
|
+
#-- - @g
|
228
|
+
#-- - @i (identity core facts) - used and reused time and again
|
229
|
+
#-- - @n
|
230
|
+
#-- -
|
231
|
+
#-- - @f (file facts as 2D array) - using known facts to create new ones
|
232
|
+
#-- - @a (ancestral, anchored, family facts) == RELATIVE (Only in fact file)
|
233
|
+
#-- - @c (code facts) - with plugin (eco) claasss also p_fact(...) plugin fact
|
234
|
+
#-- - @t (template facts) - template facts which can also accomodate nesting == ONLY IN TEMPLATE
|
235
|
+
#-- - @s (sibling fact) - described above == RELATIVE (Only in fact file)
|
236
|
+
#-- -
|
237
|
+
#--
|
238
|
+
|
239
|
+
#--
|
240
|
+
#-- --------------------------------------------
|
241
|
+
#-- Harvesting Facts | A Fact Finding Mission
|
242
|
+
#-- --------------------------------------------
|
243
|
+
#--
|
244
|
+
#-- Many simple, useful, productive and powerful facts exist out there and
|
245
|
+
#-- this <<fact-hub>> ( register fact-hub.com )) can go on a fact finding
|
246
|
+
#-- (mining) mission when you give the word.
|
247
|
+
#--
|
248
|
+
#-- Facts can be harvested from
|
249
|
+
#--
|
250
|
+
#-- a) - environment variables
|
251
|
+
#-- b) - files (INI, json, csv, yml, properties, html)
|
252
|
+
#-- c) - REST API calls
|
253
|
+
#-- d) - shell commands
|
254
|
+
#-- e) - key-value stores (DynamoDB, etcd, Redis, memcached)
|
255
|
+
#-- f) - databases (MongoDb, MySQL, PostgreSQL, Oracle)
|
256
|
+
#-- g) - secret engines (Amazon KMS, Ansible Vault, CredStash)
|
257
|
+
#--
|
258
|
+
#-- The fact data can be hosted
|
259
|
+
#--
|
260
|
+
#-- 1) - on local, removal and networked storage
|
261
|
+
#-- 2) - in memory
|
262
|
+
#-- 3) - in Amazon S3, Google Drive and other clouds
|
263
|
+
#-- 4) - dropbox
|
264
|
+
#-- 5) - git and subversion repositories
|
265
|
+
#-- 6) -
|
266
|
+
#--
|
267
|
+
|
268
|
+
|
269
|
+
|
270
|
+
|
271
|
+
|
272
|
+
#--
|
273
|
+
#-- -------------------
|
274
|
+
#-- Fact Inheritance
|
275
|
+
#-- -------------------
|
276
|
+
#--
|
277
|
+
#-- Fact inheritance allows us to share most of the properties of
|
278
|
+
#-- a fact group that are either conceptually similar or derive from
|
279
|
+
#-- the same base class.
|
280
|
+
#--
|
281
|
+
#-- Separating Interface from Implementation
|
282
|
+
#-- --------------------------------------------
|
283
|
+
#-- Fact inheritance allows fact consumers to reference a parent and
|
284
|
+
#-- use say the polygon [interface] without knowing or caring about the
|
285
|
+
#-- specific [implementation].
|
286
|
+
#--
|
287
|
+
#--
|
288
|
+
#--
|
289
|
+
#-- -------------------------------------------------------
|
290
|
+
#-- Example Inheritance of Fact Implementation Behaviour
|
291
|
+
#-- -------------------------------------------------------
|
292
|
+
#--
|
293
|
+
#--
|
294
|
+
#-- [rectangle]
|
295
|
+
#--
|
296
|
+
#-- length,width = <<absract>>
|
297
|
+
#-- perimeter = e>> (@s[:length] * 2) + (@s[:width] * 2)
|
298
|
+
#-- area = e>> @s[:length] * @s[:width]
|
299
|
+
#--
|
300
|
+
#--
|
301
|
+
#-- [square < rectangle]
|
302
|
+
#--
|
303
|
+
#-- width = e>> @s[:length]
|
304
|
+
#--
|
305
|
+
#--
|
306
|
+
#-- [room < square]
|
307
|
+
#--
|
308
|
+
#-- length = 10
|
309
|
+
#--
|
310
|
+
#--
|
311
|
+
#--
|
312
|
+
#-- And now in a template somewhere there can be a statement
|
313
|
+
#-- saying a square of length @[room|length] will surely have
|
314
|
+
#-- an area of @[room|area] square metres.
|
315
|
+
#--
|
316
|
+
#--
|
317
|
+
#--
|
318
|
+
#-- -------------------------------------------------------
|
319
|
+
#-- Notes on square inheriting rectangle fact behaviour
|
320
|
+
#-- -------------------------------------------------------
|
321
|
+
#--
|
322
|
+
#-- Due to square declaring that it inherits from the rectangle
|
323
|
+
#-- group - other fact declarations can now use this.
|
324
|
+
#--
|
325
|
+
#-- Both the [room] and [square] fact groupings use the
|
326
|
+
#-- inheritance inherent in the [rectangle] declaration.
|
327
|
+
#--
|
328
|
+
#--
|
329
|
+
|
330
|
+
|
331
|
+
|
332
|
+
#--
|
333
|
+
#-- -------------------
|
334
|
+
#-- Overriding Facts
|
335
|
+
#-- -------------------
|
336
|
+
#--
|
337
|
+
#-- This futuristic fact override statement overrides and imposes
|
338
|
+
#-- a new value for the specified fact coordinate.
|
339
|
+
#--
|
340
|
+
#-- Notes
|
341
|
+
#--
|
342
|
+
#-- [1] - the first definition is just a string
|
343
|
+
#-- [2] - the second statement string is eval'd
|
344
|
+
#-- [3] - Every fact DEPENDENT on overriden fact will change
|
345
|
+
#--
|
346
|
+
#-- ---------------------------
|
347
|
+
#-- Overriding Facts | WARNING
|
348
|
+
#-- ---------------------------
|
349
|
+
#--
|
350
|
+
#-- When you override a fact's value - EVERY DEPENDENT FACT is then
|
351
|
+
#-- [RE-DERIVED] with the new value.
|
352
|
+
#--
|
353
|
+
#--
|
354
|
+
#-- It is important when the fact is used as a method or constructor
|
355
|
+
#-- parameter. If the class ignores the second call (for example
|
356
|
+
#-- singletons) - the new fact value does not fully propagae through
|
357
|
+
#-- the software's pipes and wires.
|
358
|
+
#--
|
359
|
+
#-- vagrant|boxname = {override} geerlingguy/centos7
|
360
|
+
#-- runtime|dirname = {override} e>> @f[:runtime][:dirname] + "-appended-xxx"
|
361
|
+
|
362
|
+
#--
|
363
|
+
#-- -------------------
|
364
|
+
#-- Documenting Facts
|
365
|
+
#-- -------------------
|
366
|
+
#--
|
367
|
+
#-- Fact doclet statements ARE themselves [facts].
|
368
|
+
#-- This means that all behaviour and constraints that apply to
|
369
|
+
#-- facts also apply to fact doclet definitions.
|
370
|
+
#--
|
371
|
+
#-- Fact documentation statements can appear anywhere but [always]
|
372
|
+
#-- under the [doclet] - (little documentation) - coordinate.
|
373
|
+
#--
|
374
|
+
#-- It is okay for the [doclet] tag to appear multiple times in a file.
|
375
|
+
#--
|
376
|
+
#-- Note that the @s[] sibling construct can be used when relating to
|
377
|
+
#-- facts under the same parent group. This is fine even when the facts
|
378
|
+
#-- appear in different areas and different files under the same url
|
379
|
+
#-- or email namespace eg (devops-hub.com) or (joe@devops-hub.com).
|
380
|
+
#--
|
381
|
+
#-- [doclet]
|
382
|
+
#-- vagrant|boxname = Used in Vagrantfile to specify base operating system of virtual machine.
|
383
|
+
|
384
|
+
|
385
|
+
#--
|
386
|
+
#-- ---------------------------
|
387
|
+
#-- Facts from REST API Calls
|
388
|
+
#-- ---------------------------
|
389
|
+
#--
|
390
|
+
#-- (use) rest>>
|
391
|
+
#-- (instead of) e>>
|
392
|
+
#--
|
393
|
+
#-- You can read facts directly from a REST API call without having
|
394
|
+
#-- to go through an intermediary Class/Method call.
|
395
|
+
#--
|
396
|
+
#-- ---------
|
397
|
+
#-- Examples
|
398
|
+
#-- ---------
|
399
|
+
#--
|
400
|
+
#-- england.time.now = rest>> https://api.devops-hub.com/world_time?country=gb
|
401
|
+
#-- america.time.now = rest>> https://api.devops-hub.com/world_time?country=us
|
402
|
+
#--
|
403
|
+
#--
|
404
|
+
#-- vagrant|boxname = {override} geerlingguy/centos7
|
405
|
+
#-- runtime|dirname = {override} e>> @f[:runtime][:dirname] + "-appended-xxx"
|
406
|
+
|
407
|
+
#--
|
408
|
+
#-- ------------------------------------------
|
409
|
+
#-- Fact Ordering (Files or Database Housing)
|
410
|
+
#-- ------------------------------------------
|
411
|
+
#--
|
412
|
+
#-- Facts can be declared in ANY order.
|
413
|
+
#--
|
414
|
+
#-- ------------------------------
|
415
|
+
#-- Fact Nesting (Templates)
|
416
|
+
#-- ------------------------------
|
417
|
+
#--
|
418
|
+
#-- Facts can be nested when placed in templates with placeholders.
|
419
|
+
#-- Nesting facts promotes re-use.
|
420
|
+
#--
|
421
|
+
#--
|
422
|
+
#-- ------------------
|
423
|
+
#-- Fact Value Types
|
424
|
+
#-- ------------------
|
425
|
+
#--
|
426
|
+
#-- Yes most fact values are POST (plain old strings), but there are a few more
|
427
|
+
#-- value types that add an expressive edge to devops facts. Fact values can be
|
428
|
+
#--
|
429
|
+
#-- e>> evaluated by Ruby's dynamic processing features
|
430
|
+
#-- e>> arrays, hashes, ints, booleans - indeed any class
|
431
|
+
#-- r>> regular expressions for use in finding matches
|
432
|
+
#-- d>> fact documentation that can appear almost anywhere
|
433
|
+
#--
|
434
|
+
#--
|
435
|
+
|
436
|
+
#--
|
437
|
+
#-- ------------------------------
|
438
|
+
#-- Iteration (Loop) Index Facts
|
439
|
+
#-- ------------------------------
|
440
|
+
#--
|
441
|
+
|
442
|
+
|
443
|
+
#--
|
444
|
+
#-- ------------------------------
|
445
|
+
#-- I.N.F.A.C.T.S (See Notepad)
|
446
|
+
#-- ------------------------------
|
447
|
+
#--
|
448
|
+
#-- Who is referencing the fact?
|
449
|
+
#-- Where (in what) is the fact referenced?
|
450
|
+
#--
|
451
|
+
#-- I - Insert, Inherit, Interface and Include snippets (or whole) from Code, Files etc
|
452
|
+
#-- N -
|
453
|
+
#-- F - File => appears in a file eg .ini, .json, .csv, .yml, .yaml etc
|
454
|
+
#-- A - API => rest call => https://api.devops-hub.com/fact/@a?class=vagrant+property=hostname
|
455
|
+
#-- C - Code => fact apppears either in commons or plugin code
|
456
|
+
#-- T - Template => fact appears in a config file or in Vagrantfile, Dockerfile etc
|
457
|
+
#-- S - Sibling => fact definition references a sibling in the same class
|
458
|
+
#--
|
459
|
+
#-- Note that the API referencing call accepts a shorthand version.
|
460
|
+
#-- https://api.devops-hub.com/fact/@a?c=vagrant+p=hostname
|
461
|
+
#-- (c) is for (c)lass
|
462
|
+
#-- (p) is for (p)roperty
|
463
|
+
#--
|
464
|
+
#-- Note that (A) types hide the underlying fact definition statement.
|
465
|
+
#-- This simple fact honours the "Uniform Access Principle" as stated
|
466
|
+
#-- by Bertrand Meyer ( Object Oriented Software Engineering ).
|
467
|
+
#--
|
468
|
+
|
469
|
+
|
470
|
+
|
471
|
+
#--
|
472
|
+
#-- ----------------------------------------------
|
473
|
+
#-- No Nil Fact Coordinates - No Nil Fact Values
|
474
|
+
#-- ----------------------------------------------
|
475
|
+
#--
|
476
|
+
#-- Neither fact coordinates nor value can be nil.
|
477
|
+
#--
|
478
|
+
#-- Failure occurs if any one of
|
479
|
+
#--
|
480
|
+
#-- the fact group coordinate OR
|
481
|
+
#-- the fact key coordinate OR
|
482
|
+
#-- the fact value
|
483
|
+
#--
|
484
|
+
#-- shows up as nil.
|
485
|
+
#--
|
486
|
+
#--
|
487
|
+
|
488
|
+
|
489
|
+
|
490
|
+
|
491
|
+
#-- ------------------------------------------
|
492
|
+
#-- Fact Constraints | What is not allowed?
|
493
|
+
#-- ------------------------------------------
|
494
|
+
#--
|
495
|
+
#-- @s (sibling facts) CAN be used in the FIRST LINE of a group declaration
|
496
|
+
#-- if that group has been defined in ANOTHER fact file.
|
497
|
+
#-- (currently will fail but won't once fact order parsing is implemented).
|
498
|
+
#--
|
499
|
+
#-- @s (sibling facts) CAN be used in the FIRST LINE of a group declaration
|
500
|
+
#-- if the reference appears lower down in the fact group or another fact file
|
501
|
+
#-- (currently will fail but won't once fact order parsing is implemented).
|
502
|
+
#--
|
503
|
+
#-- The fact compiler informs us if @s (sibling fact) is consumed and the
|
504
|
+
#-- fact declaration is not found within the set of included files/objects.
|
505
|
+
#--
|
506
|
+
#--
|
507
|
+
#--
|
508
|
+
#-- ==> duplicate keys is illegal = throw an error to state this
|
509
|
+
#-- ==> duplicate keys UNLESS one declared as <<abstract>> or inheritance or {override}
|
510
|
+
#--
|
511
|
+
## @todo ==> throw duplicate key EXCEPTION unless
|
512
|
+
##
|
513
|
+
## (a) one declared as <<abstract>> OR
|
514
|
+
## (b) one block inherits from (extends) the other
|
515
|
+
## (c) fact annotated with {override} modifier
|
516
|
+
## (d) one key denoted (if) and the other (unless)
|
517
|
+
##
|
518
|
+
#--
|
519
|
+
|
520
|
+
## ++++++++++++++++++++++++++++++++++++++++ ##
|
521
|
+
## INVENTORY ==> Accessories After the Fact ##
|
522
|
+
## ++++++++++++++++++++++++++++++++++++++++ ##
|
523
|
+
##
|
524
|
+
## Plugin [inventory] is made up of
|
525
|
+
## ++ Facts (INI Files) == (middleware, platform, user, application)
|
526
|
+
##
|
527
|
+
## ++ (reusable) registry of facts
|
528
|
+
## ++ (specific) plugin fact registry
|
529
|
+
## ++ (reusable) collateral files
|
530
|
+
## ++ (reusable) )runnable scripts
|
531
|
+
## ++ (specific) mission critical content
|
532
|
+
## ++ (reusable) commons behaviour
|
533
|
+
## ++ (reusable) cross cutting concerns
|
534
|
+
## ++++++++++++++++++++++++++++++++++++++++ ##
|
535
|
+
|
536
|
+
|
537
|
+
|
538
|
+
# ############################################################################################
|
539
|
+
# ####### End of the eco-platform.co.uk Fact Database ####################################
|
540
|
+
# ############################################################################################
|
541
|
+
|
542
|
+
|
543
|
+
# --
|
544
|
+
# -- -------------------------
|
545
|
+
# -- [[Stop Here]] Debug Tool
|
546
|
+
# -- -------------------------
|
547
|
+
# --
|
548
|
+
# -- Stop processing here to examine and evaluate the
|
549
|
+
# -- production values of the above facts.
|
550
|
+
# --
|
551
|
+
# -- stop.here = e>> exit
|
552
|
+
# --
|
553
|
+
|