safedb 0.01.0001

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +8 -0
  3. data/.yardopts +3 -0
  4. data/Gemfile +10 -0
  5. data/LICENSE +21 -0
  6. data/README.md +793 -0
  7. data/Rakefile +16 -0
  8. data/bin/safe +5 -0
  9. data/lib/configs/README.md +58 -0
  10. data/lib/extension/array.rb +162 -0
  11. data/lib/extension/dir.rb +35 -0
  12. data/lib/extension/file.rb +123 -0
  13. data/lib/extension/hash.rb +33 -0
  14. data/lib/extension/string.rb +572 -0
  15. data/lib/factbase/facts.safedb.net.ini +38 -0
  16. data/lib/interprete.rb +462 -0
  17. data/lib/keytools/PRODUCE_RAND_SEQ_USING_DEV_URANDOM.txt +0 -0
  18. data/lib/keytools/kdf.api.rb +243 -0
  19. data/lib/keytools/kdf.bcrypt.rb +265 -0
  20. data/lib/keytools/kdf.pbkdf2.rb +262 -0
  21. data/lib/keytools/kdf.scrypt.rb +190 -0
  22. data/lib/keytools/key.64.rb +326 -0
  23. data/lib/keytools/key.algo.rb +109 -0
  24. data/lib/keytools/key.api.rb +1391 -0
  25. data/lib/keytools/key.db.rb +330 -0
  26. data/lib/keytools/key.docs.rb +195 -0
  27. data/lib/keytools/key.error.rb +110 -0
  28. data/lib/keytools/key.id.rb +271 -0
  29. data/lib/keytools/key.ident.rb +243 -0
  30. data/lib/keytools/key.iv.rb +107 -0
  31. data/lib/keytools/key.local.rb +259 -0
  32. data/lib/keytools/key.now.rb +402 -0
  33. data/lib/keytools/key.pair.rb +259 -0
  34. data/lib/keytools/key.pass.rb +120 -0
  35. data/lib/keytools/key.rb +585 -0
  36. data/lib/logging/gem.logging.rb +132 -0
  37. data/lib/modules/README.md +43 -0
  38. data/lib/modules/cryptology/aes-256.rb +154 -0
  39. data/lib/modules/cryptology/amalgam.rb +70 -0
  40. data/lib/modules/cryptology/blowfish.rb +130 -0
  41. data/lib/modules/cryptology/cipher.rb +207 -0
  42. data/lib/modules/cryptology/collect.rb +138 -0
  43. data/lib/modules/cryptology/crypt.io.rb +225 -0
  44. data/lib/modules/cryptology/engineer.rb +99 -0
  45. data/lib/modules/mappers/dictionary.rb +288 -0
  46. data/lib/modules/storage/coldstore.rb +186 -0
  47. data/lib/modules/storage/git.store.rb +399 -0
  48. data/lib/session/fact.finder.rb +334 -0
  49. data/lib/session/require.gem.rb +112 -0
  50. data/lib/session/time.stamp.rb +340 -0
  51. data/lib/session/user.home.rb +49 -0
  52. data/lib/usecase/cmd.rb +487 -0
  53. data/lib/usecase/config/README.md +57 -0
  54. data/lib/usecase/docker/README.md +146 -0
  55. data/lib/usecase/docker/docker.rb +49 -0
  56. data/lib/usecase/edit/README.md +43 -0
  57. data/lib/usecase/edit/delete.rb +46 -0
  58. data/lib/usecase/export.rb +40 -0
  59. data/lib/usecase/files/README.md +37 -0
  60. data/lib/usecase/files/eject.rb +56 -0
  61. data/lib/usecase/files/file_me.rb +78 -0
  62. data/lib/usecase/files/read.rb +169 -0
  63. data/lib/usecase/files/write.rb +89 -0
  64. data/lib/usecase/goto.rb +57 -0
  65. data/lib/usecase/id.rb +36 -0
  66. data/lib/usecase/import.rb +157 -0
  67. data/lib/usecase/init.rb +63 -0
  68. data/lib/usecase/jenkins/README.md +146 -0
  69. data/lib/usecase/jenkins/jenkins.rb +208 -0
  70. data/lib/usecase/login.rb +71 -0
  71. data/lib/usecase/logout.rb +28 -0
  72. data/lib/usecase/open.rb +71 -0
  73. data/lib/usecase/print.rb +40 -0
  74. data/lib/usecase/put.rb +81 -0
  75. data/lib/usecase/set.rb +44 -0
  76. data/lib/usecase/show.rb +138 -0
  77. data/lib/usecase/terraform/README.md +91 -0
  78. data/lib/usecase/terraform/terraform.rb +121 -0
  79. data/lib/usecase/token.rb +35 -0
  80. data/lib/usecase/update/README.md +55 -0
  81. data/lib/usecase/update/rename.rb +180 -0
  82. data/lib/usecase/use.rb +41 -0
  83. data/lib/usecase/verse.rb +20 -0
  84. data/lib/usecase/view.rb +71 -0
  85. data/lib/usecase/vpn/README.md +150 -0
  86. data/lib/usecase/vpn/vpn.ini +31 -0
  87. data/lib/usecase/vpn/vpn.rb +54 -0
  88. data/lib/version.rb +3 -0
  89. data/safedb.gemspec +34 -0
  90. metadata +193 -0
@@ -0,0 +1,334 @@
1
+ #!/usr/bin/ruby
2
+
3
+ module SafeDb
4
+
5
+ # --
6
+ # -- -----------------
7
+ # -- Fact Production
8
+ # -- -----------------
9
+ # --
10
+ # -- The fact tree is tasked with fact production
11
+ # -- (population). Fact production is done by [consuming]
12
+ # --
13
+ # -- [1] - simple string, number of boolean facts
14
+ # -- [2] - facts already produced
15
+ # -- [3] - identity facts from command line and environment
16
+ # -- [4] - software (behaviour) that derives facts
17
+ # -- [5] - inherited (extended) facts from (OO) parents
18
+ # --
19
+ # --
20
+ # --
21
+ # -- -----------------------------------------
22
+ # -- The 4 Universal (DevOps) Creation Facts
23
+ # -- -----------------------------------------
24
+ # --
25
+ # -- No matter the (DevOps) eco-system being fabricated, these four
26
+ # -- facts prevail and stand out.
27
+ # --
28
+ # -- Every time a DevOps [eco-system] is created, cloned, or recovered,
29
+ # -- a small cluster of core facts endure to define the instance and act
30
+ # -- as the identification basis of all new eco-system resources.
31
+ # --
32
+ # -- The 4 facts underpinning eco-system creation are
33
+ # --
34
+ # -- [1] - [what] is being built
35
+ # -- [2] - [when] did the building begin
36
+ # -- [3] - [who] instigated it (and from)
37
+ # -- [4] - [which] workstation.
38
+ # --
39
+ # -- ---------------------------------------
40
+ # -- DevOps 4 Creational [Instance] Facts
41
+ # -- ---------------------------------------
42
+ # --
43
+ # -- The core instance identities used and reused time and again relate to
44
+ # --
45
+ # -- [1] - plugin (eg) wordpress.hub or jenkins.hub
46
+ # -- [2] - time (eg) 18036.0952.065
47
+ # -- [3] - user (eg) peterpan
48
+ # -- [4] - workstation (eg) laptop_susie or hp_desktop
49
+ # --
50
+ # --
51
+ class FactFind
52
+
53
+ @@eval_prefix = "rb>>"
54
+
55
+ # The fact tree values can be referenced using the @f
56
+ # specifier with a 2 dimensional key.
57
+ attr_reader :f
58
+
59
+
60
+ # This method constructs the FactFind object and tree database
61
+ # and initializers the root fact container structures.
62
+ def initialize
63
+
64
+ @f = {}
65
+ @s = {}
66
+
67
+ # ---> @f.store symbol(plugin_id), {}
68
+ # ---> @p = @f[symbol(plugin_id)]
69
+
70
+ end
71
+
72
+
73
+ # Assimilate the gem's main factbase fact file into
74
+ # the structure that is exposed to outside classes
75
+ # as the instance variable @f (a 2D array type).
76
+ #
77
+ # The factfile to assimilate is always expected to
78
+ # exist in folder [ ../factbase ]
79
+ #
80
+ # The factfile name within the above folder is expected
81
+ # to be presented in the parameter.
82
+ #
83
+ # @param factfile_name [String] name of factfile to assimilate
84
+ def assimilate factfile_name
85
+
86
+ factfile_dir = File.join(File.dirname(File.expand_path(__FILE__)), "../factbase")
87
+ factfile_path = File.join factfile_dir, factfile_name
88
+
89
+ log.info(x) { "Assimilating factfile in folder => #{factfile_dir}" }
90
+ log.info(x) { "Assimilating factfile with name => #{factfile_name}" }
91
+
92
+ assimilate_ini_file factfile_path
93
+
94
+ end
95
+
96
+
97
+ # ----> -------------------------------------------------->
98
+ # ----> How to Write a Custom Error
99
+ # ----> -------------------------------------------------->
100
+ # ----> Add a custom data attributes to your exception
101
+ # ----> You can add custom data to your exception just like you'd do it in any other class. Let's add an attribute reader to our class and update the constructor.
102
+ # ----> class MyError < StandardError
103
+ # ----> attr_reader :thing
104
+ # ----> def initialize(msg="My default message", thing="apple")
105
+ # ----> @thing = thing
106
+ # ----> super(msg)
107
+ # ----> end
108
+ # ----> end
109
+ # ----> -------------------------------------------------->
110
+ # ----> Using the Custom Error Class
111
+ # ----> -------------------------------------------------->
112
+ # ----> begin
113
+ # ----> raise MyError.new("my message", "my thing")
114
+ # ----> rescue => e
115
+ # ----> puts e.thing # "my thing"
116
+ # ----> end
117
+ # ----> -------------------------------------------------->
118
+
119
+
120
+ # -- ------------------------------------------- -- #
121
+ # -- -- #
122
+ # -- Template -- #
123
+ # -- -- #
124
+ # -- The longest river in africa is without -- #
125
+ # -- doubt the @[africa|longest.river]. Now -- #
126
+ # -- @[south.america|most.spoken] is the -- #
127
+ # -- most common language in south america. -- #
128
+ # -- -- #
129
+ # -- The population of the americas -- #
130
+ # -- is @[americas|population] according to
131
+ # -- the Harvard 2015 census.
132
+ # -- -- #
133
+ # -- ------------------------------------------- -- #
134
+ # -- -- #
135
+ # -- Ruby Code -- #
136
+ # -- -- #
137
+ # -- double_north_america_pop = @f[:north_america][:population] * 2
138
+ # -- -- #
139
+ # -- ------------------------------------------- -- #
140
+ # -- Parameters -- #
141
+ # -- factory_facts : instantiated 2D hash -- #
142
+ # -- ini_filepath : path to factfile to read -- #
143
+ # -- -- #
144
+ # -- Dependencies and Assumptions -- #
145
+ # -- the [inifile] gem is installed -- #
146
+ # -- file exists at the ini_filepath -- #
147
+ # -- factory_facts are instantiated -- #
148
+ # -- identity facts like @i[:plugin] exist -- #
149
+ # -- ------------------------------------------- -- #
150
+ def assimilate_ini_file ini_filepath
151
+
152
+ fact_filename = File.basename ini_filepath
153
+ log_begin fact_filename
154
+
155
+ no_file = "No (ini) factfile found here => #{ini_filepath}"
156
+ raise ArgumentError.new no_file unless File.exists? ini_filepath
157
+
158
+ # --
159
+ # -- Use the inifile gem to parse and read the fact
160
+ # -- file contents into Ruby's map structures.
161
+ # --
162
+ begin
163
+
164
+ map_facts = IniFile.load ini_filepath
165
+ map_facts.each do | group_str, key_str, input_value |
166
+ assimilate_fact group_str, key_str, input_value
167
+ end
168
+
169
+ rescue Exception => e
170
+
171
+ log.fatal(x) { "## ############################ #################################" }
172
+ log.fatal(x) { "## Fact File Assimilation Error ---------------------------------" }
173
+ log.fatal(x) { "## ############################ #################################" }
174
+ log.fatal(x) { "## File => #{ini_filepath}" }
175
+ log.fatal(x) { "## Error => #{e.message}" }
176
+ log.fatal(x) { "## ############################ #################################" }
177
+ e.backtrace.log_lines
178
+ log.fatal(x) { "## ############################ #################################" }
179
+
180
+ raise e
181
+
182
+ end
183
+
184
+ log_end fact_filename
185
+
186
+ end
187
+
188
+
189
+
190
+ # This method assimilates a two-dimensional fact bringing it into the
191
+ # fact tree fold.
192
+ #
193
+ # Once assimilated, this fact with a 2D index can be reused
194
+ # - for future fact resolution
195
+ # - by classes with access to the fact tree
196
+ # - for dynamic template resolution
197
+ #
198
+ # @param fact_group_str the first dimensional fact key
199
+ # @param fact_key_str the second dimensional fact key
200
+ # @param fact_value_str value of the fact to assimilate
201
+ def assimilate_fact fact_group_str, fact_key_str, fact_value_str
202
+
203
+ grp_symbol = fact_group_str.gsub(".", "_").to_sym
204
+ key_symbol = fact_key_str.gsub(".", "_").to_sym
205
+
206
+ raise ArgumentError, "Assimilating Fact [ #{fact_group_str} ][ #{fact_key_str} ] => Value is NIL" if fact_value_str.nil?
207
+ fact_string = fact_value_str.strip
208
+
209
+ begin
210
+
211
+ raise ArgumentError, "Fact object in section #{fact_group_str} with key #{fact_key_str} is nil." if fact_string.nil?
212
+ eval_value = evaluate( fact_string )
213
+ add_fact grp_symbol, to_symbol(fact_key_str), eval_value
214
+
215
+ rescue Exception => e
216
+
217
+ log.fatal(x) { "## ##################### #################################" }
218
+ log.fatal(x) { "## Fact Evaluation Error ---------------------------------" }
219
+ log.fatal(x) { "## ##################### #################################" }
220
+ log.fatal(x) { "## Fact Family => #{fact_group_str}" }
221
+ log.fatal(x) { "## Fact Key => #{fact_key_str}" }
222
+ log.fatal(x) { "## Fact Stmt => #{fact_string}" }
223
+ log.fatal(x) { "## Fact Error => #{e.message}" }
224
+ log.fatal(x) { "## ##################### #################################" }
225
+ e.backtrace.log_lines
226
+
227
+ raise e
228
+
229
+ end
230
+
231
+ unless @f.has_key? grp_symbol then
232
+
233
+ log.debug(x){ "# @@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #" }
234
+ log.debug(x){ "# @@ the [#{fact_group_str}] silo facts." }
235
+ log.debug(x){ "# @@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #" }
236
+
237
+ end
238
+
239
+ id_keystring = "#{grp_symbol}#{key_symbol}".downcase
240
+ sensitive = id_keystring.includes_any? [ "secret", "password", "credential", "creds" ]
241
+ print_value = "****************"
242
+ print_value = eval_value unless sensitive
243
+
244
+ fw_key = sprintf '%-33s', "@f[:#{grp_symbol}][:#{key_symbol}]"
245
+ log.debug(x){ "#{fw_key} => #{print_value}" }
246
+
247
+ end
248
+
249
+
250
+
251
+ # This static method converts from string to symbol.
252
+ # @param from_string the neither nil nor empty string to convert to a symbol
253
+ # @return a symbol representation of the input string
254
+ def to_symbol from_string
255
+ return from_string.strip.gsub(".", "_").to_sym
256
+ end
257
+
258
+
259
+
260
+ private
261
+
262
+
263
+
264
+ def add_fact group_symbol, key_symbol, key_value
265
+
266
+ fact_component = "[group]=> #{group_symbol} [key]=> #{key_symbol} [value]=> #{key_value}"
267
+ nil_error_text = "Neither fact coordinates nor values can be nil. #{fact_component}"
268
+ raise ArgumentError.new nil_error_text if group_symbol.nil? || key_symbol.nil? || key_value.nil?
269
+
270
+ if @f.has_key? group_symbol then
271
+
272
+ # -- This isn't the first fact within this group
273
+ # -- so store the new fact key/value pair within
274
+ # -- the group's namespace.
275
+ @f[group_symbol][key_symbol] = key_value
276
+
277
+ else
278
+
279
+ # -- Create a new umbrella grouping against which
280
+ # -- the new key-value pairing will be inserted.
281
+ @f.store group_symbol, { key_symbol => key_value }
282
+
283
+ end
284
+
285
+ # -- The @s sibling hash is updated to reflect the
286
+ # -- key-value pairs within the current group. This
287
+ # -- allows @s to be used as shorthand within INI
288
+ # -- file fact definition statements.
289
+ @s = @f[group_symbol]
290
+
291
+ end
292
+
293
+
294
+ def evaluate string
295
+
296
+ # -----> @todo raise a FactError here
297
+
298
+ raise RuntimeError.new "Fact to Evaluate is Nil." if string.nil?
299
+ return string unless string.start_with? @@eval_prefix
300
+ return eval( string.gsub @@eval_prefix, "" )
301
+
302
+ end
303
+
304
+
305
+ def log_begin the_filename
306
+
307
+ log.info(x) { "- -" }
308
+ log.info(x) { "# @@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@ #" }
309
+ log.info(x) { "# -- ------------------------------------------------- -- #" }
310
+ log.info(x) { "# -- [= BEGIN THE ASSIMILATION =] #{the_filename}" }
311
+ log.info(x) { "# -- ------------------------------------------------- -- #" }
312
+ log.info(x) { "# @@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@ #" }
313
+
314
+ end
315
+
316
+
317
+ def log_end the_filename
318
+
319
+ log.info(x) { "# @@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@ #" }
320
+ log.info(x) { "# -- ------------------------------------------------- -- #" }
321
+ log.info(x) { "# -- [= END ASSIMILATION =] #{the_filename}" }
322
+ log.info(x) { "# -- ------------------------------------------------- -- #" }
323
+ log.info(x) { "# @@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@ #" }
324
+ log.info(x) { "- -" }
325
+ log.info(x) { "- -" }
326
+ log.info(x) { "- -" }
327
+
328
+ end
329
+
330
+
331
+ end
332
+
333
+
334
+ end
@@ -0,0 +1,112 @@
1
+ #!/usr/bin/ruby
2
+ # coding: utf-8
3
+
4
+ module OpenSession
5
+
6
+
7
+ # Require every file with a dot rb extension that is
8
+ # +either directly in or recursively below+ the calling gem's
9
+ # directory.
10
+ #
11
+ # Note that this class and its methods depend on an initialized
12
+ # logger so as a pre-condition, ensure the logging has been
13
+ # instantiated before calling.
14
+ #
15
+ # == The Base Require Path
16
+ #
17
+ # Here is an example of the base require path being derived.
18
+ #
19
+ # @example
20
+ # Let's assume that the
21
+ #
22
+ # - ruby gems version is <tt>2.3.0</tt>, and the
23
+ # - safe version is <tt>0.0.944</tt>, and the
24
+ # - calling class is in the <tt>lib</tt> directory
25
+ #
26
+ # +then+ the gem base path would be
27
+ #
28
+ # <tt>/var/lib/gems/2.3.0/gems/safe-0.0.944/lib</tt>
29
+ #
30
+ # This means every ruby (.rb) file both +directly in+ and
31
+ # +recursively below+ the <tt>lib</tt> directory will be
32
+ # required.
33
+ #
34
+ #
35
+ # == Requiring Parental Classes Before Child Classes
36
+ #
37
+ # This is a common problem when bringing classes in to join
38
+ # the fray. We must require the +Planet+ class before
39
+ # we require the +Neptune+ class.
40
+ #
41
+ # <tt>class Neptune < Planet</tt>
42
+ #
43
+ # The solution lies in the directory structure between parent
44
+ # and child classes and this is illustrated by +plugins+.
45
+ #
46
+ # ------------------------
47
+ # Plugins Folder Structure
48
+ # ------------------------
49
+ #
50
+ # In the plugins hierarchy, you'll notice that the child classes
51
+ # are always below the parents. This strategy works if the +inheritors+
52
+ # are in the same gem as the +inherited+.
53
+ class RecursivelyRequire
54
+
55
+ # Require every file with a dot rb extension that is
56
+ # +either in or recursively below+ the file path given
57
+ # in the parameter.
58
+ #
59
+ # This method logs every file that is required using
60
+ # the INFO log level.
61
+ #
62
+ # == Requiring Parental Classes Before Child Classes
63
+ #
64
+ # This is a common problem when bringing classes in to join
65
+ # the fray. We must require the +Planet+ class before
66
+ # we require the +Neptune+ class.
67
+ #
68
+ # <tt>class Neptune < Planet</tt>
69
+ #
70
+ # The solution lies in the directory structure between parent
71
+ # and child classes and this is illustrated by +plugins+.
72
+ #
73
+ # ------------------------
74
+ # Plugins Folder Structure
75
+ # ------------------------
76
+ #
77
+ # In the plugins hierarchy, you'll notice that the child classes
78
+ # are always below the parents. This strategy works if the +inheritors+
79
+ # are in the same gem as the +inherited+.
80
+ #
81
+ # This require loop is <tt>breadth first</tt> not <tt>depth first</tt>
82
+ # so all the parent (base) classes in plugins will be required before
83
+ # their extension classes in the lower subdirectories.
84
+ #
85
+ # @param gem_filepath [String] path to callling gem (use <tt>__FILE</tt>)
86
+ def self.now gem_filepath
87
+
88
+
89
+ ############ require_relative "../cryptools/keygen"
90
+ require_relative "../usecase/cmd"
91
+
92
+
93
+ gem_basepath = File.expand_path "..", gem_filepath
94
+
95
+ log.info(x) { "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" }
96
+ log.info(x) { "@@@@ Require Gems In or Under [#{gem_basepath}]" }
97
+ log.info(x) { "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" }
98
+
99
+ Dir["#{gem_basepath}/**/*.rb"].each do |gem_path|
100
+
101
+ log.info(x) { "@@@@ => #{gem_path}" }
102
+ require gem_path
103
+
104
+ end
105
+
106
+ log.info(x) { "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" }
107
+
108
+ end
109
+
110
+ end
111
+
112
+ end