cloudrail_si 0.1.5

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/LICENSE.txt +3 -0
  3. data/examples/README.md +3 -0
  4. data/examples/simple/index.rb +11 -0
  5. data/lib/cloudrail_si.rb +41 -0
  6. data/lib/cloudrail_si/RedirectReceivers.rb +40 -0
  7. data/lib/cloudrail_si/Settings.rb +12 -0
  8. data/lib/cloudrail_si/errors/DetailErrors.rb +13 -0
  9. data/lib/cloudrail_si/errors/InternalError.rb +10 -0
  10. data/lib/cloudrail_si/errors/UserError.rb +11 -0
  11. data/lib/cloudrail_si/helpers/Helper.rb +151 -0
  12. data/lib/cloudrail_si/helpers/LimitedReadableStream.rb +55 -0
  13. data/lib/cloudrail_si/helpers/SequenceReadableStream.rb +59 -0
  14. data/lib/cloudrail_si/servicecode/InitSelfTest.rb +92 -0
  15. data/lib/cloudrail_si/servicecode/Interpreter.rb +213 -0
  16. data/lib/cloudrail_si/servicecode/Sandbox.rb +361 -0
  17. data/lib/cloudrail_si/servicecode/VarAddress.rb +11 -0
  18. data/lib/cloudrail_si/servicecode/commands/AwaitCodeRedirect.rb +48 -0
  19. data/lib/cloudrail_si/servicecode/commands/Break.rb +16 -0
  20. data/lib/cloudrail_si/servicecode/commands/CallFunc.rb +26 -0
  21. data/lib/cloudrail_si/servicecode/commands/Clone.rb +18 -0
  22. data/lib/cloudrail_si/servicecode/commands/Concat.rb +22 -0
  23. data/lib/cloudrail_si/servicecode/commands/Conditional.rb +27 -0
  24. data/lib/cloudrail_si/servicecode/commands/Create.rb +56 -0
  25. data/lib/cloudrail_si/servicecode/commands/Delete.rb +21 -0
  26. data/lib/cloudrail_si/servicecode/commands/Get.rb +25 -0
  27. data/lib/cloudrail_si/servicecode/commands/GetMimeType.rb +1005 -0
  28. data/lib/cloudrail_si/servicecode/commands/JumpRel.rb +18 -0
  29. data/lib/cloudrail_si/servicecode/commands/Pull.rb +34 -0
  30. data/lib/cloudrail_si/servicecode/commands/Push.rb +32 -0
  31. data/lib/cloudrail_si/servicecode/commands/Return.rb +16 -0
  32. data/lib/cloudrail_si/servicecode/commands/Set.rb +23 -0
  33. data/lib/cloudrail_si/servicecode/commands/Size.rb +26 -0
  34. data/lib/cloudrail_si/servicecode/commands/ThrowError.rb +17 -0
  35. data/lib/cloudrail_si/servicecode/commands/array/Uint8ToBase64.rb +25 -0
  36. data/lib/cloudrail_si/servicecode/commands/debug/Out.rb +24 -0
  37. data/lib/cloudrail_si/servicecode/commands/hash/md5.rb +29 -0
  38. data/lib/cloudrail_si/servicecode/commands/hash/sha1.rb +30 -0
  39. data/lib/cloudrail_si/servicecode/commands/http/RequestCall.rb +51 -0
  40. data/lib/cloudrail_si/servicecode/commands/json/Parse.rb +40 -0
  41. data/lib/cloudrail_si/servicecode/commands/json/Stringify.rb +21 -0
  42. data/lib/cloudrail_si/servicecode/commands/math/Floor.rb +27 -0
  43. data/lib/cloudrail_si/servicecode/commands/math/MathCombine.rb +35 -0
  44. data/lib/cloudrail_si/servicecode/commands/object/GetKeyArray.rb +21 -0
  45. data/lib/cloudrail_si/servicecode/commands/object/GetKeyValueArrays.rb +29 -0
  46. data/lib/cloudrail_si/servicecode/commands/stream/MakeJoinedStream.rb +38 -0
  47. data/lib/cloudrail_si/servicecode/commands/stream/MakeLimitedStream.rb +23 -0
  48. data/lib/cloudrail_si/servicecode/commands/stream/StreamToString.rb +25 -0
  49. data/lib/cloudrail_si/servicecode/commands/stream/StringToStream.rb +20 -0
  50. data/lib/cloudrail_si/servicecode/commands/string/Base64Encode.rb +42 -0
  51. data/lib/cloudrail_si/servicecode/commands/string/Format.rb +43 -0
  52. data/lib/cloudrail_si/servicecode/commands/string/IndexOf.rb +29 -0
  53. data/lib/cloudrail_si/servicecode/commands/string/LastIndexOf.rb +29 -0
  54. data/lib/cloudrail_si/servicecode/commands/string/Split.rb +29 -0
  55. data/lib/cloudrail_si/servicecode/commands/string/StringTransform.rb +29 -0
  56. data/lib/cloudrail_si/servicecode/commands/string/Substr.rb +30 -0
  57. data/lib/cloudrail_si/servicecode/commands/string/Substring.rb +30 -0
  58. data/lib/cloudrail_si/services/Facebook.rb +528 -0
  59. data/lib/cloudrail_si/services/FacebookPage.rb +310 -0
  60. data/lib/cloudrail_si/services/Foursquare.rb +314 -0
  61. data/lib/cloudrail_si/services/GitHub.rb +354 -0
  62. data/lib/cloudrail_si/services/GooglePlaces.rb +309 -0
  63. data/lib/cloudrail_si/services/GooglePlus.rb +367 -0
  64. data/lib/cloudrail_si/services/Instagram.rb +342 -0
  65. data/lib/cloudrail_si/services/LinkedIn.rb +363 -0
  66. data/lib/cloudrail_si/services/MicrosoftLive.rb +346 -0
  67. data/lib/cloudrail_si/services/Nexmo.rb +173 -0
  68. data/lib/cloudrail_si/services/Slack.rb +318 -0
  69. data/lib/cloudrail_si/services/Twilio.rb +173 -0
  70. data/lib/cloudrail_si/services/Twitter.rb +795 -0
  71. data/lib/cloudrail_si/services/Yahoo.rb +408 -0
  72. data/lib/cloudrail_si/services/Yelp.rb +389 -0
  73. data/lib/cloudrail_si/statistics/Statistics.rb +125 -0
  74. data/lib/cloudrail_si/types/Address.rb +9 -0
  75. data/lib/cloudrail_si/types/Charge.rb +33 -0
  76. data/lib/cloudrail_si/types/CloudMetaData.rb +19 -0
  77. data/lib/cloudrail_si/types/CreditCard.rb +76 -0
  78. data/lib/cloudrail_si/types/Date.rb +49 -0
  79. data/lib/cloudrail_si/types/DateOfBirth.rb +16 -0
  80. data/lib/cloudrail_si/types/Error.rb +21 -0
  81. data/lib/cloudrail_si/types/Location.rb +8 -0
  82. data/lib/cloudrail_si/types/POI.rb +17 -0
  83. data/lib/cloudrail_si/types/Refund.rb +25 -0
  84. data/lib/cloudrail_si/types/SandboxObject.rb +20 -0
  85. data/lib/cloudrail_si/types/SpaceAllocation.rb +13 -0
  86. data/lib/cloudrail_si/types/Subscription.rb +27 -0
  87. data/lib/cloudrail_si/types/SubscriptionPlan.rb +26 -0
  88. data/lib/cloudrail_si/types/Types.rb +43 -0
  89. data/lib/cloudrail_si/version.rb +3 -0
  90. metadata +205 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 7bc47e8e893f702a961fedea634f5f71126d4e3a
4
+ data.tar.gz: 17ebb9379cedb2c25db68549f55fa0fa7efe32df
5
+ SHA512:
6
+ metadata.gz: 5a4765e3fc399f9334f1a45aa1a48a9cb029d19ebbbb21c0429321bdba1e6f2c17beb0a635ac2b77dafe05ac08fc79e1ccebd3b148c49c6fafc1e20231043150
7
+ data.tar.gz: 2e3489fd1d312cb567a1d7485d50b03d8b69377d9f9df391cc314dcf6220295c7ceb94b2d0c7d9645744bc403bb3a25ce31bbd685936d38d7eb56955fb71e2b3
data/LICENSE.txt ADDED
@@ -0,0 +1,3 @@
1
+ Please visit https://developers.cloudrail.com/ to sign-up and for further licensing information.
2
+
3
+ Learn more on https://cloudrail.com
@@ -0,0 +1,3 @@
1
+ This folder contains examples on how to use the CloudRail SI node.js library
2
+
3
+ * The "simple" folder contains a very basic example of how to use a service where the redirectReceiver parameter to the service constructor can be null (interfaces Payment, Email, SMS, Point of Interest)
@@ -0,0 +1,11 @@
1
+ require 'cloudrail_si'
2
+
3
+ CloudRailSi::Settings.license_key = '[Your CloudRail license key]'
4
+
5
+ service = CloudRailSi::Services::GooglePlaces.new(nil, 'xxx') # replace "xxx" with a valid API key
6
+ #service = cloudrail.Services.Foursquare.new(nil, "[clientId]", "[clientSecret]")
7
+ #service = cloudrail.Services.Yelp.new(nil, "[consumerKey]", "[consumerSecret]", "[token]", "[tokenSecret]")
8
+
9
+ pois = service.get_nearby_pois(49.4557091, 8.5279138, 3000, "sparkasse", ["bank"])
10
+
11
+ print "Amount of locations called 'sparkasse' in a 3km radius around the given coordinates, tagged with category 'bank': #{pois.length}\n"
@@ -0,0 +1,41 @@
1
+ require 'cloudrail_si/Version'
2
+
3
+ #require 'cloudrail_si/services/AmazonS3'
4
+ #require 'cloudrail_si/services/Backblaze'
5
+ #require 'cloudrail_si/services/Box'
6
+ #require 'cloudrail_si/services/Dropbox'
7
+ #require 'cloudrail_si/services/Egnyte'
8
+ require 'cloudrail_si/services/Facebook'
9
+ require 'cloudrail_si/services/FacebookPage'
10
+ require 'cloudrail_si/services/Foursquare'
11
+ require 'cloudrail_si/services/GitHub'
12
+ #require 'cloudrail_si/services/GoogleCloudPlatform'
13
+ #require 'cloudrail_si/services/GoogleDrive'
14
+ require 'cloudrail_si/services/GooglePlaces'
15
+ require 'cloudrail_si/services/GooglePlus'
16
+ #require 'cloudrail_si/services/Heroku'
17
+ require 'cloudrail_si/services/Instagram'
18
+ require 'cloudrail_si/services/LinkedIn'
19
+ #require 'cloudrail_si/services/MailJet'
20
+ #require 'cloudrail_si/services/MicrosoftAzure'
21
+ require 'cloudrail_si/services/MicrosoftLive'
22
+ require 'cloudrail_si/services/Nexmo'
23
+ #require 'cloudrail_si/services/OneDrive'
24
+ #require 'cloudrail_si/services/OneDriveBusiness'
25
+ #require 'cloudrail_si/services/PayPal'
26
+ #require 'cloudrail_si/services/Rackspace'
27
+ #require 'cloudrail_si/services/SendGrid'
28
+ require 'cloudrail_si/services/Slack'
29
+ #require 'cloudrail_si/services/Stripe'
30
+ require 'cloudrail_si/services/Twilio'
31
+ require 'cloudrail_si/services/Twitter'
32
+ require 'cloudrail_si/services/Yahoo'
33
+ require 'cloudrail_si/services/Yelp'
34
+
35
+ require 'cloudrail_si/Settings'
36
+
37
+ require 'cloudrail_si/RedirectReceivers'
38
+
39
+ module CloudRailSi
40
+
41
+ end
@@ -0,0 +1,40 @@
1
+ require 'launchy'
2
+ require 'socket'
3
+
4
+ module CloudRailSi
5
+ class RedirectReceivers
6
+ @@default_html = '<h2>Authentication successful, you can close this window now</h2>'
7
+
8
+ # Adapted from http://practicingruby.com/articles/implementing-an-http-file-server
9
+ def self.get_local_authenticator(port=12345, resp_html=@@default_html)
10
+ return lambda { |url, state|
11
+ Launchy.open(url)
12
+
13
+ server = TCPServer.new('localhost', port)
14
+ loop do
15
+ begin
16
+ socket = server.accept
17
+ request = socket.gets
18
+
19
+ STDERR.puts request
20
+
21
+ socket.print "HTTP/1.1 200 OK\r\n" +
22
+ "Content-Type: text/html\r\n" +
23
+ "Content-Length: #{resp_html.bytesize}\r\n" +
24
+ "Connection: close\r\n"
25
+
26
+ socket.print "\r\n"
27
+
28
+ socket.print resp_html
29
+ socket.close
30
+ return request.split(' ')[1]
31
+ rescue => ex
32
+ socket.close
33
+ raise ex
34
+ break
35
+ end
36
+ end
37
+ }
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,12 @@
1
+ module CloudRailSi
2
+ class Settings
3
+ class << self
4
+ def license_key
5
+ @@license_key ||= nil
6
+ end
7
+ def license_key=(value)
8
+ @@license_key = value
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,13 @@
1
+ module CloudRailSi
2
+ module Errors
3
+ class AuthenticationError < StandardError; end
4
+
5
+ class HttpError < StandardError; end
6
+
7
+ class NotFoundError < StandardError; end
8
+
9
+ class ServiceUnavailableError < StandardError; end
10
+
11
+ class IllegalArgumentError < StandardError; end
12
+ end
13
+ end
@@ -0,0 +1,10 @@
1
+ module CloudRailSi
2
+ module Errors
3
+ class InternalError < StandardError
4
+ def initialize(message)
5
+ updated_message = message.nil? ? nil : message.gsub('null', 'nil')
6
+ super("An internal error has occurred which you probably cannot fix. We'd very much appreciate it if you would report it to the CloudRail team. The error message is:\n #{updated_message}")
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,11 @@
1
+ module CloudRailSi
2
+ module Errors
3
+ class UserError < StandardError
4
+ def initialize(message)
5
+ updated_message = message.nil? ? nil : message.gsub('null', 'nil')
6
+
7
+ super("An error occurred that you should be able to fix. The error message is:\n#{updated_message}")
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,151 @@
1
+ require_relative '../errors/InternalError'
2
+
3
+ #require 'faraday'
4
+ require 'stringio'
5
+ require 'net/http'
6
+
7
+ module CloudRailSi
8
+ module ServiceCode
9
+ class Helper
10
+ class << self
11
+ def add_all(target, source)
12
+ target.concat(source)
13
+ end
14
+ def put_all(target, source)
15
+ source.each do |key|
16
+ target[key] = source[key]
17
+ end
18
+ end
19
+ def clear(target)
20
+ target.each do |key|
21
+ delete target[key]
22
+ end
23
+ end
24
+ def remove(target, element)
25
+ target.delete(element)
26
+ end
27
+ def is_string(object)
28
+ object.is_a? String
29
+ end
30
+ def is_object(object)
31
+ (!is_string(object)) && (!is_sandbox(object)) && object.is_a?(Object) && !object.nil?
32
+ end
33
+ def is_sandbox(object)
34
+ object.instance_variable_get(:@is_sandbox)
35
+ end
36
+ def is_number(object)
37
+ object.is_a? Numeric
38
+ end
39
+ def is_boolean(object)
40
+ (object == true) || (object == false)
41
+ end
42
+ def is_var_address(object)
43
+ !object.instance_variable_get(:@address_string).nil?
44
+ end
45
+ def is_number_string(obj)
46
+ Float obj rescue nil # http://stackoverflow.com/questions/1235863/test-if-a-string-is-basically-an-integer-in-quotes-using-ruby
47
+ end
48
+ def is_stream(obj)
49
+ return obj.class.to_s == 'StringIO'
50
+ end
51
+
52
+ # Only print if allowed by env
53
+ def log(str)
54
+ print str if (ENV['cloudrail_ruby_print']==='true')
55
+ end
56
+
57
+ # Only debug if allowed by env
58
+ def debug
59
+ byebug if (ENV['cloudrail_ruby_debug']==='true')
60
+ end
61
+
62
+ def assert(expression)
63
+ debug if !expression
64
+ raise Errors::InternalError.new("Assertion failed") if (!expression)
65
+ end
66
+ def resolve(environment, value, check_existence=true)
67
+ check_existence = true if (check_existence === 0)
68
+ if is_var_address(value)
69
+ return environment.get_variable(value, -1, !check_existence)
70
+ else
71
+ return value
72
+ end
73
+ end
74
+ def compare(a_obj, b_obj)
75
+ result = (a_obj <=> b_obj)
76
+ raise Errors::InternalError.new("Compare compares incomparable values") if result.nil?
77
+
78
+ return result
79
+ end
80
+ def dump_stream(stream, target_encoding=nil)
81
+ contents = stream.string
82
+ contents = contents.force_encoding(target_encoding) unless target_encoding.nil?
83
+ return contents
84
+ end
85
+ def streamify_string(str, source_encoding)
86
+ res_stream = StringIO.new
87
+ res_stream.set_encoding(source_encoding) unless source_encoding.nil?
88
+ res_stream.write(str)
89
+ res_stream.write(nil)
90
+
91
+ return res_stream
92
+ end
93
+
94
+ # TODO: add stream support
95
+ # TODO: add faraday support
96
+ def make_request(url_string, headers, body, method)
97
+ Helper.log "\nmake_request_headers #{headers}\n" if headers
98
+ Helper.log "\nmake_request_url: #{url_string}\n"
99
+ uri = URI.parse(url_string)
100
+ use_ssl = uri.scheme == 'https'
101
+ Net::HTTP.start(uri.host, uri.port, use_ssl: use_ssl, open_timeout: 30, read_timeout: 30) do |http|
102
+ if (method.downcase == 'get')
103
+ req = Net::HTTP::Get.new uri, headers
104
+ elsif (method.downcase == 'post')
105
+ req = Net::HTTP::Post.new uri, headers
106
+ elsif (method.downcase == 'delete')
107
+ req = Net::HTTP::Delete.new uri, headers
108
+ elsif (method.downcase == 'put')
109
+ req = Net::HTTP::Put.new uri, headers
110
+ elsif (method.downcase == 'patch')
111
+ req = Net::HTTP::Patch.new uri, headers
112
+ else
113
+ raise Errors::InternalError.new("Unexpected method for make_request: #{method}.")
114
+ end
115
+
116
+ req.body = body
117
+
118
+ req.body = dump_stream(req.body) if is_stream(req.body)
119
+ Helper.log "make_request_body: #{req.body}\n"
120
+
121
+ response = http.request(req)
122
+
123
+ return response
124
+ end
125
+
126
+ #TODO: support redirects
127
+ end
128
+
129
+ def lower_case_first_letter(str)
130
+ return str[0].downcase + str[1..-1]
131
+ end
132
+ def upper_case_first_letter(str)
133
+ return str[0].upcase + str[1..-1]
134
+ end
135
+ def is_array(object)
136
+ object.is_a?(Array)
137
+ end
138
+
139
+ # via http://stackoverflow.com/questions/1509915/converting-camel-case-to-underscore-case-in-ruby
140
+ def to_snake_case(str)
141
+ str.gsub(/::/, '/').
142
+ gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
143
+ gsub(/([a-z\d])([A-Z])/,'\1_\2').
144
+ tr("-", "_").
145
+ downcase
146
+ end
147
+
148
+ end
149
+ end
150
+ end
151
+ end
@@ -0,0 +1,55 @@
1
+ module CloudRailSi
2
+ module ServiceCode
3
+ class LimitedReadableStream
4
+ @CHUNK_SIZE = 8 * 1024
5
+
6
+ def initialize(source, limit)
7
+ super()
8
+
9
+ @source = source
10
+ @limit = limit
11
+ @should_push = false
12
+ @sourceReadable = source.readable
13
+
14
+
15
+ #TODO: translate this
16
+ =begin
17
+ source.on("readable", function () {
18
+ _this.sourceReadable = true;
19
+ _this.process();
20
+ })
21
+ source.on("end", function () {
22
+ _this.push(null);
23
+ })
24
+ source.on("error", function (err) {
25
+ _this.emit("error", err);
26
+ })
27
+ =end
28
+ end
29
+
30
+ def _read
31
+ @shouldPush = true
32
+ @process.call
33
+ end
34
+
35
+ def _process
36
+ if (@should_push && this.source_readable)
37
+ chunk = source.read(min(@limit, CHUNK_SIZE))
38
+ while (!chunk.nil?)
39
+ @limit -= chunk.length
40
+ if (@limit === 0)
41
+ @push.call(chunk)
42
+ @push.call(null)
43
+ return
44
+ end
45
+ if (!this.push(chunk))
46
+ this.shouldPush = false
47
+ return
48
+ end
49
+ chunk = source.read(min(@limit, CHUNK_SIZE))
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,59 @@
1
+ module CloudRailSi
2
+ module ServiceCode
3
+ class SequenceReadableStream
4
+ =begin #TODO
5
+ def initialize(stream1, stream2)
6
+ @stream1 = stream1;
7
+ @stream2 = stream2;
8
+ @first = true;
9
+ @shouldPush = false;
10
+ @info1 = {
11
+ readable: stream1.readable
12
+ };
13
+ @info2 = {
14
+ readable: stream2.readable
15
+ };
16
+ stream1.on("readable", function () {
17
+ @info1.readable = true;
18
+ process();
19
+ });
20
+ stream1.on("end", function () {
21
+ @first = false;
22
+ process();
23
+ });
24
+ stream1.on("error", function (err) {
25
+ @emit("error", err);
26
+ });
27
+ stream2.on("readable", function () {
28
+ @info2.readable = true;
29
+ process();
30
+ });
31
+ stream2.on("end", function () {
32
+ @push(null);
33
+ });
34
+ stream2.on("error", function (err) {
35
+ @emit("error", err);
36
+ });
37
+ end
38
+ def _read
39
+ @should_push = true;
40
+ process();
41
+ end
42
+ def process
43
+ info = @first ? @info1 : @info2
44
+ if (@should_push && info.readable)
45
+ source = @first ? @stream1 : @stream2
46
+ chunk = 0
47
+ while ((chunk = source.read()).present?)
48
+ if (!@push(chunk))
49
+ @should_push = false
50
+ return
51
+ end
52
+ end
53
+ info.readable = false
54
+ end
55
+ end
56
+ =end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,92 @@
1
+ require_relative './Interpreter'
2
+ require_relative './Sandbox'
3
+ require_relative '../Version'
4
+
5
+ module CloudRailSi
6
+ module ServiceCode
7
+ class InitSelfTest
8
+ class << self
9
+ def init_test(service_name)
10
+ return true unless @@tested_services.index(service_name).nil?
11
+ test_res = execute(service_name)
12
+ @@tested_services.push(service_name) unless !test_res || @@tested_services.index(service_name).nil?
13
+ test_res
14
+ end
15
+ def execute(servicename)
16
+ test_state = true
17
+ service_code = {
18
+ 'selfTest' => [
19
+ ['create', '$L0', 'Object'],
20
+ ['create', '$L1', 'Object'],
21
+ ['create', '$L1.client', 'Object'],
22
+ ['create', '$L1.app', 'Object'],
23
+ ['set', '$L1.client.mac', '$P1'],
24
+ ['set', '$L1.client.platform', '$P0.platform'],
25
+ ['set', '$L1.client.os', '$P0.os'],
26
+ ['set', '$L1.app.name', '$P2'],
27
+ ['set', '$L1.app.version', '$P3'],
28
+ ['json.stringify', '$L3', '$L1.client'],
29
+ ['callFunc', 'hashString', '$L4', '$L3'],
30
+ ['json.stringify', '$L5', '$L1.app'],
31
+ ['callFunc', 'hashString', '$L6', '$L5'],
32
+ ['delete', '$L1.client.mac'],
33
+ ['create', '$L8', 'Object'],
34
+ ['set', '$L8.method', 'GET'],
35
+ ['string.concat', '$L8.url', 'https://stat-si.cloudrail.com/current_version?service=', '$P0.serviceName', '&client=', '$L4', '&app=', '$L6'],
36
+ ['create', '$L8.requestHeaders', 'Object'],
37
+ ['json.stringify', '$L8.requestHeaders.clientdata', '$L1.client'],
38
+ ['json.stringify', '$L8.requestHeaders.appdata', '$L1.app'],
39
+ ['http.requestCall', '$L9', '$L8']
40
+ ],
41
+ 'hashString' => [
42
+ ['hash.md5', '$L0', '$P1'],
43
+ ['size', '$L1', '$L0'],
44
+ ['set', '$L2', 0],
45
+ ['set', '$P0', ''],
46
+ ['get', '$L3', '$L0', '$L2'],
47
+ ['string.format', '$L4', '%02X', '$L3'],
48
+ ['string.concat', '$P0', '$P0', '$L4'],
49
+ ['math.add', '$L2', '$L2', 1],
50
+ ['if>=than', '$L2', '$L1', -5]
51
+ ]
52
+ };
53
+ interpreter_storage = {
54
+ 'serviceName' => servicename,
55
+ 'platform' => 'Ruby',
56
+ 'os' => get_os
57
+ }
58
+ mac = get_mac
59
+ nv = get_name_version
60
+ interpreter = Interpreter.new(Sandbox.new(service_code, [], {}))
61
+ interpreter.call_function('selfTest', interpreter_storage, mac, nv['name'], nv['version'])
62
+ test_state
63
+ end
64
+
65
+ # from http://stackoverflow.com/questions/8761878/how-to-get-my-mac-address-programmatically-with-ruby
66
+ def get_mac
67
+ platform = RUBY_PLATFORM.downcase
68
+ output = `#{(platform =~ /win32/) ? 'ipconfig /all' : 'ifconfig'}`
69
+ case platform
70
+ when /darwin/
71
+ $1 if output =~ /en1.*?(([A-F0-9]{2}:){5}[A-F0-9]{2})/im
72
+ when /win32/
73
+ $1 if output =~ /Physical Address.*?(([A-F0-9]{2}-){5}[A-F0-9]{2})/im
74
+ # Cases for other platforms...
75
+ else nil
76
+ end
77
+ end
78
+
79
+ def get_name_version
80
+ return {
81
+ 'name' => 'CloudRailSi',
82
+ 'version' => CloudRailSi::VERSION
83
+ }
84
+ end
85
+ def get_os
86
+ "#{RbConfig::CONFIG['arch']}, #{RbConfig::CONFIG['target_os']}, #{RbConfig::CONFIG['host_os']}"
87
+ end
88
+ @@tested_services = []
89
+ end
90
+ end
91
+ end
92
+ end