opensecret 0.0.951 → 0.0.957

Sign up to get free protection for your applications and to get access to all the features.
Files changed (34) hide show
  1. checksums.yaml +4 -4
  2. data/lib/extension/array.rb +29 -0
  3. data/lib/extension/string.rb +31 -0
  4. data/lib/factbase/facts.opensecret.io.ini +17 -9
  5. data/lib/notepad/blow.rb +108 -5
  6. data/lib/opensecret.rb +32 -6
  7. data/lib/plugins/cipher.rb +7 -7
  8. data/lib/plugins/ciphers/blowfish.rb +63 -157
  9. data/lib/plugins/usecase.rb +1 -1
  10. data/lib/plugins/usecases/init.rb +57 -116
  11. data/lib/plugins/usecases/lock.rb +178 -0
  12. data/lib/plugins/usecases/open.rb +17 -86
  13. data/lib/plugins/usecases/put.rb +137 -0
  14. data/lib/plugins/usecases/safe.rb +8 -10
  15. data/lib/session/attributes.rb +16 -11
  16. data/lib/session/dictionary.rb +191 -0
  17. data/lib/session/session.rb +80 -0
  18. data/lib/session/time.stamp.rb +89 -106
  19. data/lib/using.txt +100 -0
  20. data/lib/version.rb +1 -1
  21. metadata +6 -15
  22. data/lib/opensecret/commons/eco.faculty.rb +0 -364
  23. data/lib/opensecret/commons/eco.system.rb +0 -437
  24. data/lib/opensecret/commons/eco.systems.rb +0 -98
  25. data/lib/opensecret/factbase/hub-runtime.ini +0 -123
  26. data/lib/opensecret/factbase/known-hosts.ini +0 -75
  27. data/lib/opensecret/factbase/published.facts/blobbolicious-facts.ini +0 -553
  28. data/lib/opensecret/factbase/published.facts/credential-facts.ini +0 -40
  29. data/lib/opensecret/factbase/published.facts/infrastructure-facts.ini +0 -63
  30. data/lib/opensecret/factbase/readme.md +0 -24
  31. data/lib/opensecret/factbase/retired.facts/maven.database.ide.facts.ini +0 -127
  32. data/lib/opensecret/factbase/retired.facts/s3-upload-block-facts.ini +0 -17
  33. data/lib/opensecret/plugins.io/file/file.rb +0 -483
  34. data/lib/plugins/usecases/on.rb +0 -33
@@ -1,98 +0,0 @@
1
- #!/usr/bin/ruby
2
-
3
- # ---
4
- # --- Build the complete services eco-system directed by the parameter service descriptors.
5
- # --- Everything that is done -> is done for (because of, to, in spite of) the application.
6
- # ---
7
- class EcoSystems
8
-
9
- # -
10
- # -- Create one or more eco-systems if that is
11
- # -- the wish of the commmander (interpreter).
12
- # -
13
- def self.create
14
-
15
- return unless CmdLine.instance.create || CmdLine.instance.task
16
- eco_descriptors = CmdLine.instance.key_values[:service_descriptors]
17
- EcoSystems.new.provision_services eco_descriptors
18
-
19
- end
20
-
21
- # --- -------------------------------------------------------------------------- --- #
22
- # --- This input array of [service descriptors] are mapped to the below classes. --- #
23
- # --- -------------------------------------------------------------------------- --- #
24
- # --- the service descriptors => ["mongo.db", "properties", "rest.docs"] --- #
25
- # --- -------------------------------------------------------------------------- --- #
26
- # --- [eco boot] service => [mongo.db] implemented by => [MongoDb]
27
- # --- [eco boot] service => [ properties] implemented by => [Properties]
28
- # --- [eco boot] service => [ rest.docs] implemented by => [RestDocs]
29
- # --- ------------------------------------------------------------------------- --- #
30
- def provision_services service_descriptors
31
-
32
-
33
- log.info(ere) { "------------------------------------------------------------------- --- #" }
34
- log.info(ere) { "[service descriptor to class conversion loop] --- #" }
35
- log.info(ere) { "------------------------------------------------------------------- --- #" }
36
-
37
- eco_services = eco_system_classes service_descriptors
38
- eco_services.each do |eco_service|
39
-
40
- top_and_tail "Provision the => [#{eco_service.class.name}] eco-system."
41
- eco_service.provision
42
- top_and_tail "The [#{eco_service.eco_id_str}] => eco system is now [ready]."
43
-
44
- end
45
-
46
- end
47
-
48
-
49
- # --- -------------------------------------------------------------------- --- #
50
- # --- Create the provisioner classes from the parameter descriptors array. --- #
51
- # --- -------------------------------------------------------------------- --- #
52
- def eco_system_classes service_descriptors
53
-
54
- log.info(ere) { "[eco boot] service descriptors => #{service_descriptors.to_s}" }
55
- eco_services = Array.new
56
-
57
- service_descriptors.each do |class_desc|
58
-
59
- class_name = SnapFlat.undo class_desc
60
- log.info(ere) { "[eco boot] service => [#{class_desc}] implemented by => [#{class_name}]" }
61
-
62
- begin
63
-
64
- class_object = Object::const_get("#{class_name}").new
65
-
66
- rescue Exception => e
67
-
68
- log.fatal(ere) { "Exception instantiating eco-system [#{class_name}]." }
69
- log.fatal(ere) { "Exception Message => #{e.message}" }
70
- log.fatal(ere) { "Exception Backtrace => #{e.backtrace.inspect}" }
71
- exit
72
-
73
- end
74
-
75
- eco_services.push class_object
76
-
77
- end
78
-
79
- return eco_services
80
-
81
- end
82
-
83
-
84
- # --
85
- # -- Write the header string as the meat in a highlighted
86
- # -- lines sandwich.
87
- # --
88
- def top_and_tail header_str
89
-
90
- log.info(ere) { "# ### ############################################################## ### #" }
91
- log.info(ere) { "# ~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~ #" }
92
- log.info(ere) { "#{header_str}" }
93
- log.info(ere) { "# ~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~ #" }
94
- log.info(ere) { "# ### ############################################################## ### #" }
95
-
96
- end
97
-
98
- end
@@ -1,123 +0,0 @@
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
-
@@ -1,75 +0,0 @@
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
-
@@ -1,553 +0,0 @@
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
-