opensecret 0.0.951 → 0.0.957
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/extension/array.rb +29 -0
- data/lib/extension/string.rb +31 -0
- data/lib/factbase/facts.opensecret.io.ini +17 -9
- data/lib/notepad/blow.rb +108 -5
- data/lib/opensecret.rb +32 -6
- data/lib/plugins/cipher.rb +7 -7
- data/lib/plugins/ciphers/blowfish.rb +63 -157
- data/lib/plugins/usecase.rb +1 -1
- data/lib/plugins/usecases/init.rb +57 -116
- data/lib/plugins/usecases/lock.rb +178 -0
- data/lib/plugins/usecases/open.rb +17 -86
- data/lib/plugins/usecases/put.rb +137 -0
- data/lib/plugins/usecases/safe.rb +8 -10
- data/lib/session/attributes.rb +16 -11
- data/lib/session/dictionary.rb +191 -0
- data/lib/session/session.rb +80 -0
- data/lib/session/time.stamp.rb +89 -106
- data/lib/using.txt +100 -0
- data/lib/version.rb +1 -1
- metadata +6 -15
- data/lib/opensecret/commons/eco.faculty.rb +0 -364
- data/lib/opensecret/commons/eco.system.rb +0 -437
- data/lib/opensecret/commons/eco.systems.rb +0 -98
- data/lib/opensecret/factbase/hub-runtime.ini +0 -123
- data/lib/opensecret/factbase/known-hosts.ini +0 -75
- data/lib/opensecret/factbase/published.facts/blobbolicious-facts.ini +0 -553
- data/lib/opensecret/factbase/published.facts/credential-facts.ini +0 -40
- data/lib/opensecret/factbase/published.facts/infrastructure-facts.ini +0 -63
- data/lib/opensecret/factbase/readme.md +0 -24
- data/lib/opensecret/factbase/retired.facts/maven.database.ide.facts.ini +0 -127
- data/lib/opensecret/factbase/retired.facts/s3-upload-block-facts.ini +0 -17
- data/lib/opensecret/plugins.io/file/file.rb +0 -483
- 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
|
-
|