oneis 1.2.2-java → 2.0.1-java

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.
data/bin/oneis-plugin CHANGED
@@ -2,7 +2,6 @@
2
2
 
3
3
  require 'java'
4
4
 
5
- require 'yaml'
6
5
  require 'digest/sha1'
7
6
  require 'net/http'
8
7
  require 'net/https'
@@ -25,6 +24,7 @@ require JS_JAR
25
24
 
26
25
  require "#{ONEIS_PLUGIN_ROOT_DIR}/lib/hmac.rb"
27
26
  require "#{ONEIS_PLUGIN_ROOT_DIR}/lib/manifest.rb"
27
+ require "#{ONEIS_PLUGIN_ROOT_DIR}/lib/auth.rb"
28
28
  require "#{ONEIS_PLUGIN_ROOT_DIR}/lib/server.rb"
29
29
  require "#{ONEIS_PLUGIN_ROOT_DIR}/lib/syntax_checking.rb"
30
30
  require "#{ONEIS_PLUGIN_ROOT_DIR}/lib/notifications.rb"
data/lib/auth.rb ADDED
@@ -0,0 +1,168 @@
1
+
2
+ module PluginTool
3
+
4
+ @@keys_pathname = "#{Dir.getwd}/.server.json"
5
+
6
+ # ---------------------------------------------------------------------------------------------------------
7
+
8
+ def self.setup_auth(options)
9
+ keys = load_keys_file()
10
+ server = keys['default']
11
+ if options.server_substring
12
+ server = select_server(keys, options.server_substring)
13
+ end_on_error "No server found for substring '#{options.server_substring}" unless server
14
+ end
15
+ key = keys['keys'][server]
16
+ if key
17
+ hostname, port, url_base = parse_hostname_with_port(server)
18
+ set_server(hostname, port, key)
19
+ puts "Application: #{url_base}"
20
+ else
21
+ end_on_error "No server authorised. Run oneis-plugin auth SERVER_NAME"
22
+ end
23
+ end
24
+
25
+ # ---------------------------------------------------------------------------------------------------------
26
+
27
+ def self.cmd_server(options)
28
+ end_on_error "No server name substring given on command line" if options.args.empty?
29
+ keys = load_keys_file()
30
+ server = select_server(keys, options.args.first)
31
+ end_on_error "No server found for substring '#{options.args.first}" unless server
32
+ keys['default'] = server
33
+ puts "Selected server #{server}"
34
+ save_keys_file(keys)
35
+ end
36
+
37
+ # ---------------------------------------------------------------------------------------------------------
38
+
39
+ def self.cmd_auth(options)
40
+ end_on_error "No hostname given on command line" if options.args.empty?
41
+ hostname, port, url_base, server_name = parse_hostname_with_port(options.args.first)
42
+
43
+ keys = load_keys_file()
44
+ if keys['keys'].has_key?(server_name) && !options.force
45
+ puts
46
+ puts "Already authorised with #{server_name}"
47
+ puts "Use the --force argument to reauthorise with the server."
48
+ return
49
+ end
50
+
51
+ set_server(hostname, port, nil)
52
+ check_for_certificate_file()
53
+ http = get_http()
54
+
55
+ this_hostname = java.net.InetAddress.getLocalHost().getHostName() || "unknown"
56
+
57
+ puts "Requesting token from #{url_base} ..."
58
+ start_auth_path = "/api/plugin-tool-auth/start-auth?name=#{URI.encode(this_hostname)}"
59
+ request = Net::HTTP::Get.new(start_auth_path)
60
+ setup_request(request)
61
+ token = nil
62
+ begin
63
+ response = http.request(request)
64
+ end_on_error "Server returned an error. Check hostname and port." unless response.code == "200"
65
+ parsed_json = JSON.parse(response.body)
66
+ token = parsed_json['token']
67
+ end_on_error "Server doesn't look like a ONEIS server with plugin debugging enabled" unless parsed_json['ONEIS'] == 'plugin-tool-auth' && token
68
+ rescue => e
69
+ end_on_error "Failed to start authorisation process. Check hostname and port."
70
+ end
71
+
72
+ # Check token looks OK so we don't form dodgy URLs
73
+ end_on_error "Bad token" unless token =~ /\A[a-z0-9A-Z_-]+\z/
74
+
75
+ user_url = "#{url_base}/do/plugin-tool-auth/create/#{token}"
76
+ poll_path = "/api/plugin-tool-auth/poll/#{token}"
77
+
78
+ puts
79
+ if java.lang.System.getProperty("os.name") == 'Mac OS X'
80
+ puts "Attempting to open the following URL in your browser."
81
+ puts "If the browser does not open, please visit this URL in your browser."
82
+ system "open #{user_url}"
83
+ else
84
+ puts "Please visit this URL in your browser, and authenticate if necessary."
85
+ end
86
+ puts " #{user_url}"
87
+ puts
88
+
89
+ # Poll for a few minutes, waiting for the user to authenticate
90
+ puts "Waiting for server to authorise..."
91
+ poll_count = 0
92
+ key = nil
93
+ while poll_count < 60 && !key
94
+ delay = if poll_count < 10
95
+ 2
96
+ elsif poll_count < 20
97
+ 4
98
+ else
99
+ 8
100
+ end
101
+ sleep delay
102
+ begin
103
+ request = Net::HTTP::Get.new(poll_path)
104
+ setup_request(request)
105
+ response = http.request(request)
106
+ parsed_json = JSON.parse(response.body)
107
+ case parsed_json['status']
108
+ when 'wait'
109
+ # poll again
110
+ when 'available'
111
+ key = parsed_json['key']
112
+ else
113
+ end_on_error "Authorisation process failed."
114
+ end
115
+ rescue => e
116
+ end_on_error "Error communicating with server"
117
+ end
118
+ end
119
+ finish_with_connection()
120
+
121
+ end_on_error "Didn't managed to authorise with server." unless key
122
+
123
+ puts "Successfully authorised with server."
124
+
125
+ keys['default'] = server_name
126
+ keys['keys'][server_name] = key
127
+ save_keys_file(keys)
128
+
129
+ puts
130
+ puts "Key stored in #{@@keys_pathname}"
131
+ puts "#{server_name} selected as default server."
132
+ end
133
+
134
+ # ---------------------------------------------------------------------------------------------------------
135
+
136
+ def self.parse_hostname_with_port(hostname_with_port)
137
+ hostname_with_port = hostname_with_port.downcase.strip
138
+ unless hostname_with_port =~ /\A([a-z0-9\.-]+)(:(\d+))?\z/
139
+ end_on_error "Bad hostname #{hostname_with_port}"
140
+ end
141
+ hostname = $1
142
+ port = $3 ? $3.to_i : 443
143
+ server_name = "#{hostname}#{$3 ? ":#{$3}" : ''}"
144
+ [hostname, port, "https://#{server_name}", server_name]
145
+ end
146
+
147
+ # ---------------------------------------------------------------------------------------------------------
148
+
149
+ def self.load_keys_file
150
+ if File.exist?(@@keys_pathname)
151
+ File.open(@@keys_pathname) { |f| JSON.parse(f.read) }
152
+ else
153
+ {"_" => "Contains server keys. DO NOT COMMIT TO SOURCE CONTROL.", "default" => nil, "keys" => {}}
154
+ end
155
+ end
156
+
157
+ def self.save_keys_file(keys)
158
+ pn = "#{@@keys_pathname}.n"
159
+ File.open(pn, "w") { |f| f.write(JSON.pretty_generate(keys)) }
160
+ File.rename(pn, @@keys_pathname)
161
+ end
162
+
163
+ def self.select_server(keys, substring)
164
+ s = substring.downcase.strip
165
+ keys['keys'].keys.sort { |a,b| (a.length == b.length) ? (a <=> b) : (a.length <=> b.length) } .find { |a| a.include? s }
166
+ end
167
+
168
+ end
data/lib/manifest.rb CHANGED
@@ -22,7 +22,7 @@ module PluginTool
22
22
  raise "Bad root directory #{$1}" unless ALLOWED_PLUGIN_DIRS.include?($1)
23
23
  end
24
24
  # Get hash of file
25
- digest = File.open(pathname) { |f| Digest::SHA1.hexdigest(f.read) }
25
+ digest = File.open(pathname) { |f| Digest::SHA256.hexdigest(f.read) }
26
26
  # And add to manifest
27
27
  manifest[filename] = digest
28
28
  end
data/lib/notifications.rb CHANGED
@@ -26,7 +26,7 @@ module PluginTool
26
26
  puts "NOTICE: Notification connection established." if @@notification_announce_reconnect
27
27
  while true
28
28
  sleep(0.25) # small throttle of requests
29
- path = '/api/development_plugin_loader/get_notifications'
29
+ path = '/api/development-plugin-loader/get-notifications'
30
30
  path << "?queue=#{@@notification_queue_name}" if @@notification_queue_name
31
31
  request = Net::HTTP::Get.new(path)
32
32
  setup_request(request)
data/lib/packing.rb CHANGED
@@ -40,7 +40,7 @@ module PluginTool
40
40
  unless filename =~ /\Ajs\//
41
41
  data = minimiser.process(data, filename)
42
42
  end
43
- hash = Digest::SHA1.hexdigest(data)
43
+ hash = Digest::SHA256.hexdigest(data)
44
44
  # Make sure output directory exists, write file
45
45
  output_pathname = "#{output_plugin_dir}/#{filename}"
46
46
  output_directory = File.dirname(output_pathname)
@@ -52,7 +52,7 @@ module PluginTool
52
52
  minimiser.finish
53
53
  # Write manifest and version
54
54
  File.open("#{output_plugin_dir}/manifest", "w") { |f| f.write manifest }
55
- version = Digest::SHA1.hexdigest(manifest)
55
+ version = Digest::SHA256.hexdigest(manifest)
56
56
  File.open("#{output_plugin_dir}/version", "w") { |f| f.write "#{version}\n" }
57
57
  # All done
58
58
  puts "Version: #{version}\nPlugin packed."
data/lib/plugin.rb CHANGED
@@ -10,6 +10,11 @@ module PluginTool
10
10
  end
11
11
  attr_accessor :name
12
12
  attr_accessor :plugin_dir
13
+ attr_accessor :loaded_plugin_id
14
+
15
+ # ---------------------------------------------------------------------------------------------------------
16
+
17
+ @@pending_apply = []
13
18
 
14
19
  # ---------------------------------------------------------------------------------------------------------
15
20
 
@@ -34,13 +39,6 @@ module PluginTool
34
39
  end
35
40
 
36
41
  def setup_for_server
37
- # Delete any legacy registration file for this plugin
38
- registration_file = "registration.#{@plugin_dir}.yaml"
39
- if File.exists? registration_file
40
- puts "NOTICE: Deleting legacy registration file for #{@plugin_dir}"
41
- File.delete(registration_file)
42
- end
43
-
44
42
  # Make the first empty manifest (may be replaced from server)
45
43
  @current_manifest = {}
46
44
 
@@ -50,19 +48,19 @@ module PluginTool
50
48
  end
51
49
 
52
50
  # See if the plugin has already been registered with the server
53
- s_found_info = PluginTool.post_yaml("/api/development_plugin_loader/find_registration", {:name => @name})
54
- if s_found_info[:found]
51
+ s_found_info = PluginTool.post_with_json_response("/api/development-plugin-loader/find-registration", {:name => @name})
52
+ if s_found_info["found"]
55
53
  # Store info returned by the server
56
- @loaded_plugin_id = s_found_info[:plugin_id]
57
- @current_manifest = s_found_info[:manifest]
54
+ @loaded_plugin_id = s_found_info["plugin_id"]
55
+ @current_manifest = s_found_info["manifest"]
58
56
  end
59
57
 
60
58
  # If there isn't an existing plugin registered, create a new one
61
59
  if @loaded_plugin_id == nil
62
- s_create_info = PluginTool.post_yaml("/api/development_plugin_loader/create")
63
- end_on_error "Couldn't communicate successfully with server." if s_create_info[:protocol_error]
64
- end_on_error "Failed to create plugin on server" unless s_create_info[:plugin_id] != nil
65
- @loaded_plugin_id = s_create_info[:plugin_id]
60
+ s_create_info = PluginTool.post_with_json_response("/api/development-plugin-loader/create")
61
+ end_on_error "Couldn't communicate successfully with server." if s_create_info["protocol_error"]
62
+ end_on_error "Failed to create plugin on server" unless s_create_info["plugin_id"] != nil
63
+ @loaded_plugin_id = s_create_info["plugin_id"]
66
64
  end
67
65
  end
68
66
 
@@ -82,27 +80,27 @@ module PluginTool
82
80
 
83
81
  when 'reset-db'
84
82
  puts "Resetting database on server for #{@name}..."
85
- reset_result = PluginTool.post_yaml("/api/development_plugin_loader/resetdb/#{@loaded_plugin_id}")
86
- end_on_error "Couldn't remove old database tables" unless reset_result[:result] == 'success'
87
- apply_result = PluginTool.get_yaml("/api/development_plugin_loader/apply/#{@loaded_plugin_id}")
88
- end_on_error "Couldn't apply changes" unless apply_result[:result] == 'success'
83
+ reset_result = PluginTool.post_with_json_response("/api/development-plugin-loader/resetdb/#{@loaded_plugin_id}")
84
+ end_on_error "Couldn't remove old database tables" unless reset_result["result"] == 'success'
85
+ apply_result = PluginTool.post_with_json_response("/api/development-plugin-loader/apply", :plugins => @loaded_plugin_id)
86
+ end_on_error "Couldn't apply changes" unless apply_result["result"] == 'success'
89
87
  puts "Done."
90
88
 
91
89
  when 'uninstall'
92
90
  puts "Uninstalling plugin #{@name} from server..."
93
- reset_result = PluginTool.post_yaml("/api/development_plugin_loader/uninstall/#{@loaded_plugin_id}")
94
- end_on_error "Couldn't uninstall plugin" unless reset_result[:result] == 'success'
91
+ reset_result = PluginTool.post_with_json_response("/api/development-plugin-loader/uninstall/#{@loaded_plugin_id}")
92
+ end_on_error "Couldn't uninstall plugin" unless reset_result["result"] == 'success'
95
93
  puts "Done."
96
94
 
97
95
  when 'test'
98
96
  puts "Running tests..."
99
97
  params = {}
100
- params[:test] = @options.args.first unless @options.args.empty?
101
- test_result = PluginTool.post_yaml("/api/development_plugin_loader/run_tests/#{@loaded_plugin_id}", params)
102
- end_on_error "Couldn't run tests" unless test_result[:result] == 'success'
98
+ params["test"] = @options.args.first unless @options.args.empty?
99
+ test_result = PluginTool.post_with_json_response("/api/development-plugin-loader/run-tests/#{@loaded_plugin_id}", params)
100
+ end_on_error "Couldn't run tests" unless test_result["result"] == 'success'
103
101
  puts
104
- puts test_result[:output] || ''
105
- puts test_result[:summary] || "(unknown results)"
102
+ puts test_result["output"] || ''
103
+ puts test_result["summary"] || "(unknown results)"
106
104
 
107
105
  when 'develop'
108
106
  # do nothing here
@@ -119,7 +117,16 @@ module PluginTool
119
117
  end
120
118
 
121
119
  def develop_scan_and_upload(first_run)
120
+ should_apply = first_run
122
121
  next_manifest = PluginTool.generate_manifest(@plugin_dir)
122
+ if !(next_manifest.has_key?("plugin.json"))
123
+ # If the plugin.json file is deleted, just uninstall the plugin from the server
124
+ command('uninstall')
125
+ @is_uninstalled = true
126
+ return
127
+ elsif @is_uninstalled
128
+ should_apply = true
129
+ end
123
130
  changes = PluginTool.determine_manifest_changes(@current_manifest, next_manifest)
124
131
  upload_failed = false
125
132
  changes.each do |filename, action|
@@ -128,7 +135,7 @@ module PluginTool
128
135
  params[:directory] = $1.gsub(/\/\z/,'') if $1
129
136
  if action == :delete
130
137
  puts " #{@name}: Deleting #{filename}"
131
- PluginTool.post_yaml("/api/development_plugin_loader/delete_file/#{@loaded_plugin_id}", params)
138
+ PluginTool.post_with_json_response("/api/development-plugin-loader/delete-file/#{@loaded_plugin_id}", params)
132
139
  else
133
140
  puts " #{@name}: Uploading #{filename}"
134
141
  data = File.open("#{@plugin_dir}/#{filename}") { |f| f.read }
@@ -138,13 +145,13 @@ module PluginTool
138
145
  size_before = data.length
139
146
  data = @options.minimiser.process(data, filename)
140
147
  size_after = data.length
141
- hash = Digest::SHA1.hexdigest(data)
148
+ hash = Digest::SHA256.hexdigest(data)
142
149
  puts " minimisation: #{size_before} -> #{size_after} (#{(size_after * 100) / size_before}%)"
143
150
  end
144
- r = PluginTool.post_yaml("/api/development_plugin_loader/put_file/#{@loaded_plugin_id}", params, {:file => [filename, data]})
145
- if r[:result] == 'success'
151
+ r = PluginTool.post_with_json_response("/api/development-plugin-loader/put-file/#{@loaded_plugin_id}", params, {:file => [filename, data]})
152
+ if r["result"] == 'success'
146
153
  # If the file was uploaded successfully, but the hash didn't match, abort now
147
- end_on_error "#{@name}: Disagreed with server about uploaded file hash: local=#{hash}, remote=#{r[:hash]}" unless hash == r[:hash]
154
+ end_on_error "#{@name}: Disagreed with server about uploaded file hash: local=#{hash}, remote=#{r["hash"]}" unless hash == r["hash"]
148
155
  else
149
156
  # Otherwise mark as a failed upload to stop an apply operation which will fail
150
157
  upload_failed = true
@@ -155,22 +162,31 @@ module PluginTool
155
162
  if upload_failed
156
163
  puts "\n#{@name}: Not applying changes due to failure\n\n"
157
164
  else
158
- if !(changes.empty?) || first_run
159
- puts " #{@name}: Applying changes on server"
160
- r = PluginTool.get_yaml("/api/development_plugin_loader/apply/#{@loaded_plugin_id}")
161
- unless r[:result] == 'success'
162
- puts "\n\n#{@name}: Didn't apply changes on server\n\n"
163
- PluginTool.beep
164
- end
165
- PluginTool.push_delayed_apply(@name) if r[:requires_delayed_apply]
165
+ if !(changes.empty?) || should_apply
166
+ @@pending_apply.push(self) unless @@pending_apply.include?(self)
166
167
  end
167
168
  end
168
- PluginTool.finish_with_connection
169
169
  @current_manifest = next_manifest
170
170
  end
171
171
 
172
172
  # ---------------------------------------------------------------------------------------------------------
173
173
 
174
+ def self.do_apply
175
+ return if @@pending_apply.empty?
176
+ puts "Applying changes on server: #{@@pending_apply.map { |p| p.name } .join(', ')}"
177
+ r = PluginTool.post_with_json_response("/api/development-plugin-loader/apply", {
178
+ :plugins => @@pending_apply.map { |p| p.loaded_plugin_id }.join(' ')
179
+ })
180
+ if r["result"] == 'success'
181
+ @@pending_apply = []
182
+ else
183
+ puts "\n\nDidn't apply changes on server\n\n"
184
+ PluginTool.beep
185
+ end
186
+ end
187
+
188
+ # ---------------------------------------------------------------------------------------------------------
189
+
174
190
  def generate_license_key(application_id)
175
191
  info = File.open("#{@plugin_dir}/plugin.json") { |f| JSON.parse(f.read) }
176
192
  if info["installSecret"] == nil
data/lib/plugin_tool.rb CHANGED
@@ -15,16 +15,18 @@ LOCAL_ONLY_COMMANDS = {"license-key" => true, "pack" => true, "check" => true}
15
15
  plugin_names = []
16
16
 
17
17
  # Options for passing to plugin objects
18
- options = Struct.new(:output, :minimiser, :no_console, :show_system_audit, :args).new
18
+ options = Struct.new(:output, :minimiser, :no_console, :show_system_audit, :args, :force, :server_substring).new
19
19
 
20
20
  # Parse arguments
21
21
  show_help = false
22
22
  opts = GetoptLong.new(
23
23
  ['--help', '-h', GetoptLong::NO_ARGUMENT],
24
24
  ['--plugin', '-p', GetoptLong::OPTIONAL_ARGUMENT],
25
+ ['--server', '-s', GetoptLong::REQUIRED_ARGUMENT],
26
+ ['--force', GetoptLong::NO_ARGUMENT],
25
27
  ['--output', GetoptLong::REQUIRED_ARGUMENT],
26
28
  ['--no-console', '-n', GetoptLong::NO_ARGUMENT],
27
- ['--show-system-audit', '-s', GetoptLong::NO_ARGUMENT],
29
+ ['--show-system-audit', GetoptLong::NO_ARGUMENT],
28
30
  ['--minimise', '--minimize', '-m', GetoptLong::NO_ARGUMENT]
29
31
  )
30
32
  option_output = nil
@@ -34,6 +36,8 @@ opts.each do |opt, argument|
34
36
  show_help = true
35
37
  when '--plugin'
36
38
  plugin_names = argument.split(',').map {|n| n.gsub(/[\/\\]+\z/,'')} # remove trailing dir separators
39
+ when '--server'
40
+ options.server_substring = argument
37
41
  when '--output'
38
42
  options.output = argument
39
43
  when '--no-console'
@@ -42,6 +46,8 @@ opts.each do |opt, argument|
42
46
  options.show_system_audit = true
43
47
  when '--minimise', '--minimize'
44
48
  options.minimiser = PluginTool::Minimiser.new
49
+ when '--force'
50
+ options.force = true
45
51
  end
46
52
  end
47
53
  # Handle rest of command line -- first arg is the command, the rest are passed on
@@ -69,21 +75,19 @@ if plugin_names.length == 1 && plugin_names[0] == 'ALL'
69
75
  plugin_names = find_all_plugins()
70
76
  end
71
77
 
72
- # Quick handle of the new command
73
- if PLUGIN_TOOL_COMMAND == 'new'
78
+ # Some commands don't require a server or plugin to be specified
79
+ case PLUGIN_TOOL_COMMAND
80
+ when 'new'
74
81
  end_on_error "Plugin name not specified, use --plugin option." if plugin_names.empty?
75
82
  end_on_error "Only one plugin name should be specified for new command" if plugin_names.length > 1
76
83
  PluginTool.make_new_plugin(plugin_names.first)
77
84
  exit 0
78
- end
79
-
80
- case 'develop' # TODO!!!!remove this
81
- when 'develop', 'reset-db', 'uninstall', 'check', 'license-key'
82
- # ... continue afterwards
83
- when 'pack'
84
-
85
- else
86
- end_on_error "Command not known. Use --help option for usage information."
85
+ when 'auth'
86
+ PluginTool.cmd_auth options
87
+ exit 0
88
+ when 'server'
89
+ PluginTool.cmd_server options
90
+ exit 0
87
91
  end
88
92
 
89
93
  # Find a plugin if none was specified
@@ -125,9 +129,8 @@ end
125
129
 
126
130
  # Set up server communications
127
131
  unless LOCAL_ONLY_COMMANDS[PLUGIN_TOOL_COMMAND]
128
- # Load server info
129
- server_info_errors = PluginTool.load_server_info
130
- end_on_error server_info_errors unless server_info_errors == nil
132
+ PluginTool.setup_auth(options)
133
+ PluginTool.check_for_certificate_file
131
134
  # Ask plugins to set themselves up
132
135
  plugins.each { |p| p.setup_for_server }
133
136
  end
@@ -157,7 +160,8 @@ first_run = true
157
160
  while(true)
158
161
  puts "Scanning plugin files..."
159
162
  plugins.each { |p| p.develop_scan_and_upload(first_run) }
160
- PluginTool.do_delayed_apply
163
+ PluginTool::Plugin.do_apply
164
+ PluginTool.finish_with_connection
161
165
  puts "Waiting for changes..."
162
166
  if first_run
163
167
  puts " Any changes you make to your local copy of the plugin will be automatically"
data/lib/server.rb CHANGED
@@ -1,29 +1,33 @@
1
1
 
2
2
  module PluginTool
3
3
 
4
- SERVER_INFO = 'server.yaml'
5
- SERVER_CERTIFICATE = 'server.crt'
6
- REQUIRED_SERVER_INFO_KEYS = [:hostname, :key]
4
+ def self.set_server(hostname, port, key)
5
+ @@server_hostname = hostname
6
+ @@server_port = port
7
+ @@server_key = key
8
+ end
7
9
 
8
- def self.load_server_info
9
- @@server = YAML::load(File.open(SERVER_INFO) { |f| f.read })
10
- REQUIRED_SERVER_INFO_KEYS.each do |key|
11
- return "#{SERVER_INFO} does not contain :#{key}" unless @@server.has_key? key
10
+ def self.check_for_certificate_file
11
+ @@server_ca = nil
12
+ hostname_parts = (@@server_hostname || '').split('.')
13
+ search_list = (0..hostname_parts.length).map do |n|
14
+ filename = "server"
15
+ search_parts = hostname_parts[n..hostname_parts.length]
16
+ filename << '.' unless search_parts.empty?
17
+ filename << search_parts.join('.')
18
+ filename << ".crt"
12
19
  end
13
- if File.file?(SERVER_CERTIFICATE)
14
- # Use provided server.crt if it exists
15
- @@server_ca = SERVER_CERTIFICATE
16
- puts "NOTICE: Using alternative CAs for SSL from #{SERVER_CERTIFICATE}"
20
+ @@server_ca = search_list.find { |f| File.file?(f) }
21
+ if @@server_ca
22
+ puts "NOTICE: Using alternative CAs for SSL from #{@@server_ca}"
17
23
  else
18
24
  # Use build in certificate bundle
19
25
  @@server_ca = "#{File.dirname(__FILE__)}/CertificateBundle.pem"
20
26
  end
21
- puts "Application: https://#{@@server[:hostname]}/"
22
- nil
23
27
  end
24
28
 
25
29
  def self.make_http_connection
26
- http = Net::HTTP.new(@@server[:hostname], 443)
30
+ http = Net::HTTP.new(@@server_hostname, @@server_port)
27
31
  ssl_ca = OpenSSL::X509::Store.new
28
32
  unless ssl_ca.respond_to? :add_file
29
33
  puts
@@ -54,7 +58,7 @@ module PluginTool
54
58
 
55
59
  def self.setup_request(req)
56
60
  req['User-Agent'] = 'plugin-tool'
57
- req['X-ONEIS-Key'] = @@server[:key]
61
+ req['X-ONEIS-Key'] = @@server_key if @@server_key
58
62
  end
59
63
 
60
64
  def self.get(path)
@@ -64,8 +68,8 @@ module PluginTool
64
68
  http.request(request).body
65
69
  end
66
70
 
67
- def self.get_yaml(path)
68
- report_errors_from_server(YAML::load(get(path)))
71
+ def self.get_with_json_response(path)
72
+ report_errors_from_server(JSON.parse(get(path)))
69
73
  end
70
74
 
71
75
  def self.post(path, params = nil, files = nil)
@@ -105,41 +109,27 @@ EOF
105
109
  http.request(request).body
106
110
  end
107
111
 
108
- def self.post_yaml(path, params = nil, files = nil)
109
- report_errors_from_server(YAML::load(post(path, params, files)))
112
+ def self.post_with_json_response(path, params = nil, files = nil)
113
+ report_errors_from_server(JSON.parse(post(path, params, files)))
110
114
  end
111
115
 
112
116
  def self.report_errors_from_server(r)
113
117
  unless r.kind_of? Hash
114
118
  r = {
115
- :result => 'error',
116
- :protocol_error => true,
117
- :message => "Unknown error. Either the server is not enabled for development, or the credentials in #{SERVER_INFO} are not valid."
119
+ "result" => 'error',
120
+ "protocol_error" => true,
121
+ "message" => "Unknown error. Either the server is not enabled for development, or the credentials in #{SERVER_INFO} are not valid."
118
122
  }
119
123
  end
120
- if r[:result] != 'success' && r.has_key?(:message)
124
+ if r["result"] != 'success' && r.has_key?("message")
121
125
  puts "\n\n**************************************************************"
122
126
  puts " ERROR REPORTED BY SERVER"
123
127
  puts "**************************************************************\n\n"
124
- puts r[:message]
128
+ puts r["message"]
125
129
  puts "\n**************************************************************\n\n"
126
130
  beep
127
131
  end
128
132
  r
129
133
  end
130
134
 
131
- # Delayed apply support
132
- @@delayed_apply_queue = []
133
- def self.push_delayed_apply(name)
134
- @@delayed_apply_queue.push(name)
135
- end
136
- def self.do_delayed_apply
137
- return if @@delayed_apply_queue.empty?
138
- puts "Updating server..."
139
- self.post_yaml("/api/development_plugin_loader/delayed_apply", {"plugins" => @@delayed_apply_queue.join(',')})
140
- self.finish_with_connection
141
- puts "Updated."
142
- @@delayed_apply_queue = []
143
- end
144
-
145
135
  end
data/lib/usage.txt CHANGED
@@ -13,6 +13,9 @@ Options:
13
13
  in the current directory. If not specified, and there's a single plugin in the current
14
14
  directory, it will be selected automatically.
15
15
 
16
+ --server, -s [SUBSTRING]
17
+ For this run of the plugin tool, use the server containing the given substring.
18
+
16
19
  --minimise
17
20
  When uploading templates and client side JavaScript to the server, minimise the files
18
21
  to match the pre-deployment pre-processing. Use this for final testing before
@@ -27,6 +30,12 @@ Commands:
27
30
  develop (default command)
28
31
  Developer mode. Push plugin to the specified server.
29
32
 
33
+ auth [SERVER]
34
+ Authorise with server. SERVER can optionally include a non-default port number.
35
+
36
+ server [SUBSTRING]
37
+ Change the default server to the one containing the given substring.
38
+
30
39
  test [NAME]
31
40
  Run the tests on the server, then report on the results.
32
41
  This command does *not* upload changes to the plugin or tests to the server.
@@ -61,10 +70,10 @@ To initialise a new plugin, run a command like
61
70
  and then edit the generated files.
62
71
 
63
72
 
64
- Requirements:
65
-
66
- server.yaml - server configuration (hostname, authentication token)
67
- server.crt - server's SSL certificate root (optional)
73
+ If the server certificate does not use a known public CA, a alternative certificate can be
74
+ provided using a server.crt file in the current working directory. This may optionally contain
75
+ elements of the hostname, eg app.example.com would select the first file from:
76
+ server.app.example.com.crt server.example.com.crt server.com.crt server.crt
68
77
 
69
78
 
70
79
  For more information, see http://docs.oneis.co.uk/dev/tool/plugin
data/lib/version.txt CHANGED
@@ -1 +1 @@
1
- b7aeea18fc
1
+ c7c8ef009b
data/oneis.gemspec CHANGED
@@ -3,8 +3,8 @@ Gem::Specification.new do |s|
3
3
  files = Dir.glob("#{root_dir}/**/*.*").map { |x| x[root_dir.length + 1, x.length]}
4
4
 
5
5
  s.name = 'oneis'
6
- s.version = '1.2.2'
7
- s.date = '2014-12-11'
6
+ s.version = '2.0.1'
7
+ s.date = '2015-01-05'
8
8
  s.summary = "ONEIS Tools"
9
9
  s.description = "ONEIS Developer Tools"
10
10
  s.authors = ["ONEIS"]
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: oneis
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 1.2.2
5
+ version: 2.0.1
6
6
  platform: java
7
7
  authors:
8
8
  - ONEIS
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2014-12-11 00:00:00 Z
13
+ date: 2015-01-05 00:00:00 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: jruby-openssl
@@ -45,6 +45,7 @@ extra_rdoc_files: []
45
45
  files:
46
46
  - oneis.gemspec
47
47
  - README.txt
48
+ - lib/auth.rb
48
49
  - lib/CertificateBundle.pem
49
50
  - lib/check.rb
50
51
  - lib/hmac.rb