safedb 0.01.0001

Sign up to get free protection for your applications and to get access to all the features.
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