apiotics-test 0.1.49

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 (75) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +260 -0
  4. data/Rakefile +33 -0
  5. data/lib/apiotics.rb +58 -0
  6. data/lib/apiotics/client.rb +20 -0
  7. data/lib/apiotics/configuration.rb +23 -0
  8. data/lib/apiotics/extract.rb +107 -0
  9. data/lib/apiotics/hardware.rb +109 -0
  10. data/lib/apiotics/insert.rb +115 -0
  11. data/lib/apiotics/parse.rb +20 -0
  12. data/lib/apiotics/portal.rb +217 -0
  13. data/lib/apiotics/railtie.rb +14 -0
  14. data/lib/apiotics/server.rb +238 -0
  15. data/lib/apiotics/version.rb +3 -0
  16. data/lib/generators/apiotics/channel/USAGE +10 -0
  17. data/lib/generators/apiotics/channel/channel_generator.rb +35 -0
  18. data/lib/generators/apiotics/channel/templates/apiotics_channel.rb.erb +9 -0
  19. data/lib/generators/apiotics/channel/templates/apiotics_channel_client.coffee.erb +16 -0
  20. data/lib/generators/apiotics/channel/templates/apiotics_channel_initializer.rb.erb +3 -0
  21. data/lib/generators/apiotics/controller/USAGE +8 -0
  22. data/lib/generators/apiotics/controller/controller_generator.rb +25 -0
  23. data/lib/generators/apiotics/controller/templates/apiotics_scaffold.rb.erb +60 -0
  24. data/lib/generators/apiotics/create_model/USAGE +10 -0
  25. data/lib/generators/apiotics/create_model/create_model_generator.rb +76 -0
  26. data/lib/generators/apiotics/create_model/templates/apiotics_logs_model.rb.erb +7 -0
  27. data/lib/generators/apiotics/create_model/templates/apiotics_model.rb.erb +49 -0
  28. data/lib/generators/apiotics/create_model/templates/apiotics_module.rb.erb +14 -0
  29. data/lib/generators/apiotics/create_model/templates/apiotics_module_model.rb.erb +8 -0
  30. data/lib/generators/apiotics/create_model/templates/create_module_model_table.rb.erb +9 -0
  31. data/lib/generators/apiotics/create_table/USAGE +9 -0
  32. data/lib/generators/apiotics/create_table/create_table_generator.rb +62 -0
  33. data/lib/generators/apiotics/create_table/templates/create_logs_table.rb.erb +14 -0
  34. data/lib/generators/apiotics/create_table/templates/create_table.rb.erb +16 -0
  35. data/lib/generators/apiotics/initializer/USAGE +8 -0
  36. data/lib/generators/apiotics/initializer/initializer_generator.rb +29 -0
  37. data/lib/generators/apiotics/initializer/templates/apiotics.rb.erb +10 -0
  38. data/lib/generators/apiotics/initializer/templates/apiotics_module.rb.erb +6 -0
  39. data/lib/generators/apiotics/initializer/templates/apiotics_parents.rb.erb +3 -0
  40. data/lib/generators/apiotics/initializer/templates/apiotics_settings.rb.erb +9 -0
  41. data/lib/generators/apiotics/initializer/templates/apiotics_targets.rb.erb +4 -0
  42. data/lib/generators/apiotics/initializer/templates/setting.rb.erb +3 -0
  43. data/lib/generators/apiotics/install/USAGE +11 -0
  44. data/lib/generators/apiotics/install/install_generator.rb +11 -0
  45. data/lib/generators/apiotics/migration/USAGE +10 -0
  46. data/lib/generators/apiotics/migration/migration_generator.rb +54 -0
  47. data/lib/generators/apiotics/migration/templates/create_logs_table.rb.erb +14 -0
  48. data/lib/generators/apiotics/migration/templates/migrate_table.rb.erb +12 -0
  49. data/lib/generators/apiotics/model/USAGE +11 -0
  50. data/lib/generators/apiotics/model/model_generator.rb +58 -0
  51. data/lib/generators/apiotics/scaffold/scaffold_generator.rb +23 -0
  52. data/lib/generators/apiotics/scaffold/templates/USAGE +0 -0
  53. data/lib/generators/apiotics/script/USAGE +8 -0
  54. data/lib/generators/apiotics/script/script_generator.rb +45 -0
  55. data/lib/generators/apiotics/script/templates/comm_server.rake +19 -0
  56. data/lib/generators/apiotics/script/templates/dev_comm_server.rake +19 -0
  57. data/lib/generators/apiotics/script/templates/dev_server.rb +8 -0
  58. data/lib/generators/apiotics/script/templates/dev_server_control.rb +7 -0
  59. data/lib/generators/apiotics/script/templates/install_firmware.rake +10 -0
  60. data/lib/generators/apiotics/script/templates/publish_script.rake +6 -0
  61. data/lib/generators/apiotics/script/templates/script.rb.erb +12 -0
  62. data/lib/generators/apiotics/script/templates/server.rb +8 -0
  63. data/lib/generators/apiotics/script/templates/server_control.rb +7 -0
  64. data/lib/generators/apiotics/script/templates/test_comm_server.rake +19 -0
  65. data/lib/generators/apiotics/script/templates/test_server.rb +8 -0
  66. data/lib/generators/apiotics/script/templates/test_server_control.rb +7 -0
  67. data/lib/generators/apiotics/view/USAGE +12 -0
  68. data/lib/generators/apiotics/view/templates/default.css.erb +18 -0
  69. data/lib/generators/apiotics/view/templates/edit.html.erb +6 -0
  70. data/lib/generators/apiotics/view/templates/form.html.erb +52 -0
  71. data/lib/generators/apiotics/view/templates/index.html.erb +66 -0
  72. data/lib/generators/apiotics/view/templates/show.html.erb +56 -0
  73. data/lib/generators/apiotics/view/view_generator.rb +26 -0
  74. data/lib/tasks/simbiotes_tasks.rake +4 -0
  75. metadata +256 -0
@@ -0,0 +1,14 @@
1
+ require 'apiotics'
2
+ require 'rails'
3
+
4
+ module Apiotics
5
+ class Railtie < Rails::Railtie
6
+ generators do
7
+ require 'lib/generators/apiotics/model'
8
+ require 'lib/generators/apiotics/create_table'
9
+ require 'lib/generators/apiotics/create_model'
10
+ require 'lib/generators/apiotics/initializer'
11
+ require 'lib/generators/apiotics/migration'
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,238 @@
1
+
2
+ # This class creates a local server listening on port 8001, and connects to a remote server on port 8000. Messages sent to the local server are transmitted
3
+ # to the remote server. Messages received from the remote server are forwarded to the appropriate logic.
4
+
5
+ require "socket"
6
+ require 'openssl'
7
+ require 'json'
8
+
9
+ module Apiotics
10
+ class Server
11
+ def initialize
12
+ @error_msg = nil
13
+ server_details = Server.lookup
14
+ rgs = ApioticsSetting.find_by(key: "server")
15
+ rgs_port = ApioticsSetting.find_by(key: "port")
16
+ if rgs == nil
17
+ if server_details["status"] == "ok"
18
+ rgs = server_details["ip"]
19
+ c = ApioticsSetting.new
20
+ c.key = "server"
21
+ c.value = rgs
22
+ c.save
23
+ rgs_port = server_details["port"]
24
+ c = ApioticsSetting.new
25
+ c.key = "port"
26
+ c.value = rgs_port
27
+ c.save
28
+ else
29
+ @error_msg = server_details["status_msg"]
30
+ end
31
+ else
32
+ if server_details["status"] == "ok"
33
+ rgs.value = server_details["ip"]
34
+ rgs.save
35
+ rgs = rgs.value
36
+ rgs_port.value = server_details["port"]
37
+ rgs_port.save
38
+ rgs_port = rgs_port.value
39
+ else
40
+ @error_msg = server_details["status_msg"]
41
+ end
42
+ end
43
+ if Apiotics.configuration.tls == true
44
+ socket = TCPSocket.new(rgs, rgs_port)
45
+ context = OpenSSL::SSL::SSLContext.new
46
+ context.key = Server.key
47
+ context.cert = Server.cert
48
+ if Apiotics.configuration.verify_peer == true
49
+ ca_tempfile = Tempfile.new
50
+ ca_tempfile.write Server.ca_cert.to_pem
51
+ ca_tempfile.rewind
52
+ context.ca_file = ca_tempfile.path
53
+ context.verify_mode = OpenSSL::SSL::VERIFY_PEER
54
+ end
55
+ server = OpenSSL::SSL::SSLSocket.new socket, context
56
+ server.sync_close = true
57
+ server.connect
58
+ if Apiotics.configuration.verify_peer == true
59
+ ca_tempfile.close(true)
60
+ end
61
+ else
62
+ server = TCPSocket.open(rgs, rgs_port)
63
+ end
64
+ @server = server
65
+ @localport = Apiotics.configuration.local_port
66
+ listen_remote
67
+ listen_local
68
+ end
69
+
70
+ def send(msg)
71
+ puts "Message sent: #{msg}"
72
+ @server.puts( msg )
73
+ end
74
+
75
+ def close
76
+ @server.close
77
+ end
78
+
79
+ def listen_remote
80
+ begin
81
+ Thread.new do
82
+ loop do
83
+ msg = @server.gets
84
+ puts msg
85
+ msg_hash = Apiotics::Parse.message(msg)
86
+ r = Apiotics::Insert.new(msg_hash)
87
+ puts "Message received": msg_hash
88
+ if r.valid == true
89
+ if r.action == "set-request-ack" || r.action == "set-complete" || r.action == "get-ack"
90
+ r.save
91
+ unless Apiotics.configuration.local_logging == false
92
+ r.save_log
93
+ end
94
+ end
95
+ end
96
+ end
97
+ end
98
+ rescue => e
99
+ puts e
100
+ listen_remote
101
+ end
102
+
103
+ end
104
+
105
+ def listen_local
106
+ begin
107
+ server = TCPServer.open(@localport)
108
+ if Apiotics.configuration.handshake == true
109
+ self.send('{"action":"connect"}')
110
+ end
111
+ loop do
112
+ Thread.fork(server.accept) do |client|
113
+ s = client.gets
114
+ if @error_msg != nil
115
+ string = '{"error":"' + error_msg + '"}'
116
+ client.puts(string)
117
+ end
118
+ #puts s
119
+ self.send(s)
120
+ end
121
+ end
122
+ rescue => e
123
+ puts e
124
+ listen_local
125
+ end
126
+ end
127
+
128
+ def self.lookup
129
+ if Apiotics.configuration.tls == true
130
+ socket = TCPSocket.new(Apiotics.configuration.server, Apiotics.configuration.server_port)
131
+ context = OpenSSL::SSL::SSLContext.new
132
+ context.key = Server.key
133
+ context.cert = Server.cert
134
+ if Apiotics.configuration.verify_peer == true
135
+ ca_tempfile = Tempfile.new
136
+ ca_tempfile.write Server.ca_cert.to_pem
137
+ ca_tempfile.rewind
138
+ context.ca_file = ca_tempfile.path
139
+ context.verify_mode = OpenSSL::SSL::VERIFY_PEER
140
+ end
141
+ server = OpenSSL::SSL::SSLSocket.new socket, context
142
+ server.sync_close = true
143
+ server.connect
144
+ else
145
+ server = TCPSocket.open(Apiotics.configuration.server, Apiotics.configuration.server_port)
146
+ end
147
+ server.puts('{"action":"lookup"}')
148
+ msg = server.gets
149
+ hash = JSON.parse(msg)
150
+ server.close
151
+ if Apiotics.configuration.verify_peer == true
152
+ ca_tempfile.close(true)
153
+ end
154
+ return hash
155
+ end
156
+
157
+ def self.key
158
+ key = ApioticsSetting.find_by(key: "key")
159
+ if key == nil
160
+ key = Server.generate_key
161
+ else
162
+ key = key.value
163
+ end
164
+ pass_phrase = ApioticsSetting.find_by(key: "key_pass_phrase").value
165
+ key = OpenSSL::PKey::RSA.new key, pass_phrase
166
+ return key
167
+ end
168
+
169
+ def self.cert
170
+ cert = ApioticsSetting.find_by(key: "cert")
171
+ if cert == nil
172
+ key = Server.key
173
+ public_key = key.public_key
174
+ cert = Server.generate_cert(key, public_key)
175
+ c = ApioticsSetting.new
176
+ c.key = "cert"
177
+ c.value = cert
178
+ c.save
179
+ else
180
+ cert = cert.value
181
+ end
182
+ cert = OpenSSL::X509::Certificate.new cert
183
+ return cert
184
+ end
185
+
186
+ def self.generate_key
187
+ key = OpenSSL::PKey::RSA.new 2048
188
+ pass_phrase = 'simbiotes'
189
+ cipher = OpenSSL::Cipher.new 'AES-128-CBC'
190
+ s = ApioticsSetting.new
191
+ s.key = "key_cipher"
192
+ s.value = "OpenSSL::Cipher.new 'AES-128-CBC'"
193
+ s.save
194
+ s = ApioticsSetting.new
195
+ s.key = "key_pass_phrase"
196
+ s.value = 'simbiotes'
197
+ s.save
198
+ s = ApioticsSetting.new
199
+ s.key = "public_key"
200
+ s.value = key.public_key.to_pem
201
+ s.save
202
+ s = ApioticsSetting.new
203
+ s.key = "key"
204
+ s.value = key.export(cipher, pass_phrase)
205
+ s.save
206
+ return s.value
207
+ end
208
+
209
+ def self.generate_cert(key, public_key)
210
+ csr = OpenSSL::X509::Request.new
211
+ csr.version = 0
212
+ csr.subject = OpenSSL::X509::Name.parse "CN=simbiotes.com/O=#{Apiotics.configuration.public_key}/OU=#{Apiotics.configuration.private_key}"
213
+ csr.public_key = key.public_key
214
+ csr.sign key, OpenSSL::Digest::SHA1.new
215
+ cert = Apiotics::Portal.generate_certificate(csr)
216
+ return cert
217
+ end
218
+
219
+ def self.ca_cert
220
+ ca_cert = ApioticsSetting.find_by(key: "ca_cert")
221
+ if ca_cert == nil
222
+ ca_cert = Apiotics::Portal.ca_certificate
223
+ c = ApioticsSetting.new
224
+ c.key = "ca_cert"
225
+ c.value = ca_cert
226
+ c.save
227
+ else
228
+ ca_cert = ca_cert.value
229
+ end
230
+ ca_cert = OpenSSL::X509::Certificate.new ca_cert
231
+ return ca_cert
232
+ end
233
+
234
+ def do_at_exit
235
+ end
236
+
237
+ end
238
+ end
@@ -0,0 +1,3 @@
1
+ module Apiotics
2
+ VERSION = '0.1.49'
3
+ end
@@ -0,0 +1,10 @@
1
+ Description:
2
+ This generator creates channel files with the right code for Apiotics interactions.
3
+
4
+ Example:
5
+ rails generate apiotics:channel Worker Driver
6
+ rails generate apiotics:channel Worker Script
7
+
8
+ This will create:
9
+ app/channel/worker/driver_channel.rb
10
+ app/assets/javascripts/channels/worker_driver.coffee
@@ -0,0 +1,35 @@
1
+ module Apiotics
2
+ class ChannelGenerator < Rails::Generators::Base
3
+ source_root File.expand_path('../templates', __FILE__)
4
+ argument :parent, :type => :string
5
+
6
+ def copy_channel_files
7
+ template "apiotics_channel.rb.erb", "app/channels/#{module_file_name}_channel.rb"
8
+ template "apiotics_channel_client.coffee.erb", "app/assets/javascripts/channels/#{module_file_name}.coffee"
9
+ template "apiotics_channel_initializer.rb.erb", "config/initializers/apiotics_channel.rb"
10
+ route "mount ActionCable.server => '/cable'"
11
+ end
12
+
13
+ private
14
+
15
+ def file_name
16
+ name.underscore
17
+ end
18
+
19
+ def module_file_name
20
+ parent.underscore
21
+ end
22
+
23
+ def class_name
24
+ name.classify
25
+ end
26
+
27
+ def module_name
28
+ parent.classify
29
+ end
30
+
31
+ def table_prefix
32
+ parent.underscore + "_"
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,9 @@
1
+ class <%= module_name + "Channel" %> < ApplicationCable::Channel
2
+ def subscribed
3
+ stream_from "<%= "#{module_file_name}_channel" %>"
4
+ end
5
+
6
+ def unsubscribed
7
+ # Any cleanup needed when channel is unsubscribed
8
+ end
9
+ end
@@ -0,0 +1,16 @@
1
+ $(document).ready ->
2
+ App.alert = App.cable.subscriptions.create('<%= "#{module_name}" + "Channel" %>',
3
+ connected: ->
4
+ # Called when the subscription is ready for use on the server
5
+ return
6
+ disconnected: ->
7
+ # Called when the subscription has been terminated by the server
8
+ return
9
+ received: (data) ->
10
+ console.log data
11
+ tr = $("#" + data["apiotics_instance"])
12
+ td = tr.children("." + data["worker_name"] + "-" + data["model_name"] + "-" + data["interface"])
13
+ td.text(data["value"])
14
+ # Called when there's incoming data on the websocket for this channel
15
+ return
16
+ )
@@ -0,0 +1,3 @@
1
+ Apiotics.configure do |config|
2
+ config.push = true
3
+ end
@@ -0,0 +1,8 @@
1
+ Description:
2
+ Creates a model and associated database table with the attributes specified. If using data from the portal (recommended) Worker should be the name of a worker defined in your Hive, and Model should be the name of a Driver or Script in that Worker.
3
+
4
+ Example:
5
+ rails generate apiotics:scaffold Worker
6
+
7
+ This will create:
8
+ app/controllers/worker.rb
@@ -0,0 +1,25 @@
1
+ module Apiotics
2
+ class ControllerGenerator < Rails::Generators::Base
3
+ source_root File.expand_path('../templates', __FILE__)
4
+ argument :parent, :type => :string
5
+
6
+ def copy_scaffold_files
7
+ @models = Apiotics.configuration.targets[module_name.to_s]
8
+ template "apiotics_scaffold.rb.erb", "app/controllers/#{module_file_name}/#{module_file_name.pluralize}_controller.rb"
9
+ generate "apiotics:view", "#{parent}"
10
+ route "scope module: :#{module_file_name} do \n\t\tresources :#{module_file_name}s\n\tend"
11
+ generate "simple_form:install"
12
+ end
13
+
14
+ private
15
+
16
+ def module_file_name
17
+ parent.underscore
18
+ end
19
+
20
+ def module_name
21
+ parent.classify
22
+ end
23
+
24
+ end
25
+ end
@@ -0,0 +1,60 @@
1
+ module <%= module_name %>
2
+ class <%= module_name.pluralize + "Controller"%> < ApplicationController
3
+ before_action <%= ":set_" + module_file_name %>, only: [:show, :edit, :update, :destroy]
4
+
5
+ # GET /alert/leds
6
+ def index
7
+ @<%= module_file_name + "s" %> = <%= "::" + module_name + "::" + module_name + ".all" %>
8
+ end
9
+
10
+ # GET /alert/leds/1
11
+ def show
12
+ end
13
+
14
+ # GET /alert/leds/new
15
+ def new
16
+ redirect_to <%= module_file_name %>s_url, notice: 'You are not authorized to do that.'
17
+ end
18
+
19
+ # GET /alert/leds/1/edit
20
+ def edit
21
+ end
22
+
23
+ # POST /alert/leds
24
+ def create
25
+ @<%= module_file_name %> = <%= "::" + module_name + "::" + module_name + ".new(#{module_file_name}_params)" %>
26
+
27
+ if @<%= module_file_name %>.save
28
+ redirect_to <%= module_file_name %>_path(@<%= module_file_name %>), notice: '<%= module_name %> was successfully created.'
29
+ else
30
+ render :new
31
+ end
32
+ end
33
+
34
+ # PATCH/PUT /alert/leds/1
35
+ def update
36
+ if @<%= module_file_name %>.update(<%= module_file_name %>_params)
37
+ redirect_to <%= module_file_name %>_path(@<%= module_file_name %>), notice: '<%= module_name %> was successfully updated.'
38
+ else
39
+ render :edit
40
+ end
41
+ end
42
+
43
+ # DELETE /alert/leds/1
44
+ def destroy
45
+ @<%= module_file_name %>.destroy
46
+ redirect_to <%= module_file_name %>s_url, notice: '<%= module_file_name %> was successfully destroyed.'
47
+ end
48
+
49
+ private
50
+ # Use callbacks to share common setup or constraints between actions.
51
+ def set_<%= module_file_name %>
52
+ @<%= module_file_name %> = <%= "::" + module_name + "::" + module_name + ".find(params[:id])" %>
53
+ end
54
+
55
+ # Only allow a trusted parameter "white list" through.
56
+ def <%= module_file_name %>_params
57
+ params.fetch(:<%= module_file_name %>_<%= module_file_name %>, {}).permit(:id, :apiotics_instance<% Apiotics.configuration.targets[module_name].keys.each do |key| %>, :<%= key.underscore.downcase %>_attributes => <%= Apiotics.configuration.targets[module_name][key] + ["id"] %><% end %>)
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,10 @@
1
+ Description:
2
+ This generator creates model files with the right code for Apiotics interactions.
3
+
4
+ Example:
5
+ rails generate apiotics:model Worker Driver
6
+ rails generate apiotics:model Worker Script
7
+
8
+ This will create:
9
+ app/models/worker.rb
10
+ app/models/worker/driver.rb