t2-server 0.6.1 → 0.9.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.rvmrc +1 -0
- data/CHANGES.rdoc +48 -0
- data/LICENCE.rdoc +2 -2
- data/README.rdoc +245 -10
- data/Rakefile +108 -0
- data/bin/t2-delete-runs +21 -34
- data/bin/t2-get-output +134 -0
- data/bin/t2-run-workflow +121 -109
- data/bin/t2-server-admin +128 -0
- data/bin/t2-server-info +25 -38
- data/lib/t2-server-cli.rb +116 -0
- data/lib/t2-server.rb +16 -27
- data/lib/t2-server/admin.rb +147 -0
- data/lib/t2-server/connection-parameters.rb +144 -0
- data/lib/t2-server/connection.rb +352 -0
- data/lib/t2-server/credentials.rb +84 -0
- data/lib/t2-server/exceptions.rb +42 -21
- data/lib/t2-server/port.rb +472 -0
- data/lib/t2-server/run.rb +822 -227
- data/lib/t2-server/server.rb +313 -317
- data/lib/t2-server/util.rb +71 -0
- data/lib/t2-server/xml/libxml.rb +87 -0
- data/lib/t2-server/xml/nokogiri.rb +85 -0
- data/lib/t2-server/xml/rexml.rb +85 -0
- data/lib/t2-server/xml/xml.rb +111 -0
- data/lib/t2server.rb +4 -1
- data/t2-server.gemspec +112 -0
- data/test/tc_admin.rb +63 -0
- data/test/{tc_paths.rb → tc_params.rb} +11 -25
- data/test/tc_perms.rb +132 -0
- data/test/tc_run.rb +200 -67
- data/test/tc_secure.rb +191 -0
- data/test/tc_server.rb +25 -23
- data/test/tc_util.rb +74 -0
- data/test/ts_t2server.rb +57 -12
- data/test/workflows/always_fail.t2flow +69 -0
- data/test/workflows/list_and_value.t2flow +12 -0
- data/test/workflows/list_with_errors.t2flow +107 -0
- data/test/workflows/secure/basic-http.t2flow +74 -0
- data/test/workflows/secure/basic-https.t2flow +74 -0
- data/test/workflows/secure/client-https.t2flow +162 -0
- data/test/workflows/secure/digest-http.t2flow +129 -0
- data/test/workflows/secure/digest-https.t2flow +107 -0
- data/test/workflows/secure/heater-pk.pem +20 -0
- data/test/workflows/secure/user-cert.p12 +0 -0
- data/test/workflows/secure/ws-http.t2flow +180 -0
- data/test/workflows/secure/ws-https.t2flow +180 -0
- data/test/workflows/strings.txt +10 -0
- data/test/workflows/xml_xpath.t2flow +136 -136
- data/version.yml +4 -0
- metadata +132 -34
- data/lib/t2-server/xml.rb +0 -86
data/bin/t2-server-admin
ADDED
@@ -0,0 +1,128 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# Copyright (c) 2010-2012 The University of Manchester, UK.
|
3
|
+
#
|
4
|
+
# All rights reserved.
|
5
|
+
#
|
6
|
+
# Redistribution and use in source and binary forms, with or without
|
7
|
+
# modification, are permitted provided that the following conditions are met:
|
8
|
+
#
|
9
|
+
# * Redistributions of source code must retain the above copyright notice,
|
10
|
+
# this list of conditions and the following disclaimer.
|
11
|
+
#
|
12
|
+
# * Redistributions in binary form must reproduce the above copyright notice,
|
13
|
+
# this list of conditions and the following disclaimer in the documentation
|
14
|
+
# and/or other materials provided with the distribution.
|
15
|
+
#
|
16
|
+
# * Neither the names of The University of Manchester nor the names of its
|
17
|
+
# contributors may be used to endorse or promote products derived from this
|
18
|
+
# software without specific prior written permission.
|
19
|
+
#
|
20
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
21
|
+
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
22
|
+
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
23
|
+
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
24
|
+
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
25
|
+
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
26
|
+
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
27
|
+
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
28
|
+
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
29
|
+
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
30
|
+
# POSSIBILITY OF SUCH DAMAGE.
|
31
|
+
#
|
32
|
+
# Author: Robert Haines
|
33
|
+
|
34
|
+
require 'rubygems'
|
35
|
+
require 't2-server-cli'
|
36
|
+
require 'hirb'
|
37
|
+
|
38
|
+
include T2Server::CLI
|
39
|
+
|
40
|
+
set = {}
|
41
|
+
options = {}
|
42
|
+
conn_params, creds = register_options("Usage: t2-server-admin [options] " +
|
43
|
+
"server-address [resource(s)]") do |opt|
|
44
|
+
opt.separator " Where server-address is the full URI of the server to"
|
45
|
+
opt.separator " connect to, e.g.: http://example.com:8080/taverna"
|
46
|
+
opt.separator " and [options] can be:"
|
47
|
+
opt.on("-l", "--list", "List all administrative resources.") do
|
48
|
+
options[:list] = true
|
49
|
+
end
|
50
|
+
opt.on("-a", "--all",
|
51
|
+
"List all administrative resources and their current values.") do
|
52
|
+
options[:all] = true
|
53
|
+
end
|
54
|
+
opt.on("-s RESOURCE:VALUE", "--set=RESOURCE:VALUE",
|
55
|
+
"Set admin resource RESOURCE to VALUE.") do |val|
|
56
|
+
resource, value = val.chomp.split(':', 2)
|
57
|
+
set[resource.downcase] = value
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
# get runs and server address from the arguments
|
62
|
+
resources = []
|
63
|
+
address = ""
|
64
|
+
for arg in ARGV
|
65
|
+
argc = arg.chomp
|
66
|
+
if argc.match(/https?:\/\//).nil?
|
67
|
+
resources << argc
|
68
|
+
else
|
69
|
+
address = argc
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
# read and check server address and credentials
|
74
|
+
uri, creds = parse_address(address, creds)
|
75
|
+
|
76
|
+
# pretty printer for resource access mode
|
77
|
+
def access(write)
|
78
|
+
write ? "read/write" : "read only"
|
79
|
+
end
|
80
|
+
|
81
|
+
begin
|
82
|
+
server = T2Server::Server.new(uri, conn_params)
|
83
|
+
|
84
|
+
server.administrator(creds) do |admin|
|
85
|
+
# list and exit?
|
86
|
+
if options[:list]
|
87
|
+
puts (Hirb::Helpers::ObjectTable.render admin.resources.values,
|
88
|
+
:fields=>[:name, :writable?],
|
89
|
+
:headers=>{:name => 'Resource name', :writable? => 'Access'},
|
90
|
+
:filters=>{:writable? => :access},
|
91
|
+
:description=>false)
|
92
|
+
exit 0
|
93
|
+
end
|
94
|
+
|
95
|
+
# enumerate all resources?
|
96
|
+
resources = admin.resources.keys if options[:all]
|
97
|
+
|
98
|
+
# list given resources and their values
|
99
|
+
resources.each do |resource|
|
100
|
+
begin
|
101
|
+
res = admin[resource]
|
102
|
+
result = res.value
|
103
|
+
puts "#{res.name}\t#{result}"
|
104
|
+
rescue => e
|
105
|
+
puts "#{res.name}\tERROR! - #{e}"
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
# set resources as requested
|
110
|
+
admin.resources.each do |name, resource|
|
111
|
+
if set.include? name and resource.writable?
|
112
|
+
begin
|
113
|
+
resource.value = set[name]
|
114
|
+
puts "Resource #{resource.name} set to '#{set[name]}'"
|
115
|
+
rescue => e
|
116
|
+
puts "Failed to set resource #{resource.name} - #{e}"
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
121
|
+
rescue T2Server::AccessForbiddenError => e
|
122
|
+
puts "You are not authorized to access the administrator interface of " +
|
123
|
+
"this server\n(#{uri})."
|
124
|
+
exit 1
|
125
|
+
rescue RuntimeError => e
|
126
|
+
puts e
|
127
|
+
exit 1
|
128
|
+
end
|
data/bin/t2-server-info
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
# Copyright (c) 2010
|
2
|
+
# Copyright (c) 2010-2012 The University of Manchester, UK.
|
3
3
|
#
|
4
4
|
# All rights reserved.
|
5
5
|
#
|
@@ -15,7 +15,7 @@
|
|
15
15
|
#
|
16
16
|
# * Neither the names of The University of Manchester nor the names of its
|
17
17
|
# contributors may be used to endorse or promote products derived from this
|
18
|
-
# software without specific prior written permission.
|
18
|
+
# software without specific prior written permission.
|
19
19
|
#
|
20
20
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
21
21
|
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
@@ -32,53 +32,40 @@
|
|
32
32
|
# Author: Robert Haines
|
33
33
|
|
34
34
|
require 'rubygems'
|
35
|
-
require 't2-server'
|
36
|
-
require 'optparse'
|
35
|
+
require 't2-server-cli'
|
37
36
|
require 'hirb'
|
38
37
|
|
39
|
-
|
40
|
-
|
41
|
-
|
38
|
+
include T2Server::CLI
|
39
|
+
|
40
|
+
conn_params, creds = register_options("Usage: t2-server-info [options] " +
|
41
|
+
"server-address") do |opt|
|
42
42
|
opt.separator " Where server-address is the full URI of the server to"
|
43
43
|
opt.separator " connect to, e.g.: http://example.com:8080/taverna"
|
44
44
|
opt.separator " and [options] can be:"
|
45
|
-
opt.on_tail("-h", "-?", "--help", "Show this message") do
|
46
|
-
puts opt
|
47
|
-
exit
|
48
|
-
end
|
49
|
-
opt.on_tail("-v", "--version", "Show the version") do
|
50
|
-
puts "Taverna 2 Server Ruby Gem version: #{T2Server::GEM_VERSION}"
|
51
|
-
puts "Taverna 2 Server REST API version: #{T2Server::API_VERSION}"
|
52
|
-
exit
|
53
|
-
end
|
54
45
|
end
|
55
46
|
|
56
|
-
#
|
57
|
-
|
58
|
-
|
59
|
-
# read and check server address
|
60
|
-
uri = ARGV.shift
|
61
|
-
if uri == nil
|
62
|
-
puts opts
|
63
|
-
exit 1
|
64
|
-
end
|
47
|
+
# read and check server address and credentials
|
48
|
+
uri, creds = parse_address(ARGV.shift, creds)
|
65
49
|
|
66
50
|
# connect to server and output information
|
67
51
|
begin
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
52
|
+
T2Server::Server.new(uri, conn_params) do |server|
|
53
|
+
print " Server: #{server.uri}\n"
|
54
|
+
print " Version: #{server.version}\n"
|
55
|
+
print " Run limit: #{server.run_limit(creds)}\n"
|
56
|
+
runs = server.runs(creds)
|
57
|
+
print "No. of runs: #{runs.length}\n"
|
58
|
+
if runs.length > 0
|
59
|
+
puts (Hirb::Helpers::ObjectTable.render runs,
|
60
|
+
:fields=>[:identifier, :status, :expiry],
|
61
|
+
:headers=>{:identifier=>'Run ID', :status=>'Status',
|
62
|
+
:expiry=>'Expiry time (local)'},
|
63
|
+
:filters=>{:expiry=>[:strftime, "%H:%M:%S %d/%m/%Y"]},
|
64
|
+
:max_fields=>{:expiry=>19},
|
65
|
+
:description=>false)
|
66
|
+
end
|
80
67
|
end
|
81
|
-
rescue
|
68
|
+
rescue RuntimeError => e
|
82
69
|
puts e
|
83
70
|
exit 1
|
84
71
|
end
|
@@ -0,0 +1,116 @@
|
|
1
|
+
# Copyright (c) 2010-2012 The University of Manchester, UK.
|
2
|
+
#
|
3
|
+
# All rights reserved.
|
4
|
+
#
|
5
|
+
# Redistribution and use in source and binary forms, with or without
|
6
|
+
# modification, are permitted provided that the following conditions are met:
|
7
|
+
#
|
8
|
+
# * Redistributions of source code must retain the above copyright notice,
|
9
|
+
# this list of conditions and the following disclaimer.
|
10
|
+
#
|
11
|
+
# * Redistributions in binary form must reproduce the above copyright notice,
|
12
|
+
# this list of conditions and the following disclaimer in the documentation
|
13
|
+
# and/or other materials provided with the distribution.
|
14
|
+
#
|
15
|
+
# * Neither the names of The University of Manchester nor the names of its
|
16
|
+
# contributors may be used to endorse or promote products derived from this
|
17
|
+
# software without specific prior written permission.
|
18
|
+
#
|
19
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
20
|
+
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
21
|
+
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
22
|
+
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
23
|
+
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
24
|
+
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
25
|
+
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
26
|
+
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
27
|
+
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
28
|
+
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
29
|
+
# POSSIBILITY OF SUCH DAMAGE.
|
30
|
+
#
|
31
|
+
# Author: Robert Haines
|
32
|
+
|
33
|
+
require 'optparse'
|
34
|
+
require 't2-server'
|
35
|
+
|
36
|
+
module T2Server
|
37
|
+
module CLI
|
38
|
+
@opts = nil
|
39
|
+
|
40
|
+
# set up common options and return creds if provided
|
41
|
+
def register_options(banner)
|
42
|
+
user = nil
|
43
|
+
pass = ""
|
44
|
+
conn_params = DefaultConnectionParameters.new
|
45
|
+
|
46
|
+
@opts = OptionParser.new do |opt|
|
47
|
+
opt.banner = banner
|
48
|
+
if block_given?
|
49
|
+
yield opt
|
50
|
+
end
|
51
|
+
|
52
|
+
# SSL options
|
53
|
+
opt.on("-E CERT_FILE:PASSWORD", "--cert=CERT_FILE:PASSWORD", "Use " +
|
54
|
+
"the specified certificate file for client authentication. If the " +
|
55
|
+
"optional password is not provided it will be asked for on the " +
|
56
|
+
"command line. Must be in PEM format.") do |val|
|
57
|
+
cert, cpass = val.chomp.split(":", 2)
|
58
|
+
conn_params[:client_certificate] = cert
|
59
|
+
conn_params[:client_password] = cpass if cpass
|
60
|
+
end
|
61
|
+
opt.on("--cacert=CERT_FILE", "Use the specified certificate file to " +
|
62
|
+
"verify the peer. Must be in PEM format.") do |val|
|
63
|
+
conn_params[:ca_file] = val.chomp
|
64
|
+
end
|
65
|
+
opt.on("--capath=CERTS_PATH", "Use the specified certificate " +
|
66
|
+
"directory to verify the peer. Certificates must be in PEM " +
|
67
|
+
"format") do |val|
|
68
|
+
conn_params[:ca_path] = val.chomp
|
69
|
+
end
|
70
|
+
opt.on("-k", "--insecure", "Allow insecure connections: no peer " +
|
71
|
+
"verification.") do
|
72
|
+
conn_params[:verify_peer] = false
|
73
|
+
end
|
74
|
+
|
75
|
+
# common options
|
76
|
+
opt.on_tail("-u", "--username=USERNAME", "The username to use for " +
|
77
|
+
"server operations.") do |val|
|
78
|
+
user = val.chomp
|
79
|
+
end
|
80
|
+
opt.on_tail("-p", "--password=PASSWORD", "The password to use for " +
|
81
|
+
"the supplied username.") do |val|
|
82
|
+
pass = val.chomp
|
83
|
+
end
|
84
|
+
opt.on_tail("-h", "-?", "--help", "Show this help message.") do
|
85
|
+
puts opt
|
86
|
+
exit
|
87
|
+
end
|
88
|
+
opt.on_tail("-v", "--version", "Show the version.") do
|
89
|
+
puts "Taverna 2 Server Ruby Gem version: #{T2Server::Version::STRING}"
|
90
|
+
exit
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
# parse options
|
95
|
+
@opts.parse!
|
96
|
+
|
97
|
+
creds = user.nil? ? nil : HttpBasic.new(user, pass)
|
98
|
+
[conn_params, creds]
|
99
|
+
end
|
100
|
+
|
101
|
+
# separate the creds if they are supplied in the uri
|
102
|
+
def parse_address(address, creds)
|
103
|
+
if address == nil or address == ""
|
104
|
+
puts @opts
|
105
|
+
exit 1
|
106
|
+
end
|
107
|
+
|
108
|
+
p_uri, p_creds = Util.strip_uri_credentials(address)
|
109
|
+
creds != nil ? [p_uri, creds] : [p_uri, p_creds]
|
110
|
+
end
|
111
|
+
|
112
|
+
def opts
|
113
|
+
@opts
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
data/lib/t2-server.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (c) 2010
|
1
|
+
# Copyright (c) 2010-2012 The University of Manchester, UK.
|
2
2
|
#
|
3
3
|
# All rights reserved.
|
4
4
|
#
|
@@ -14,7 +14,7 @@
|
|
14
14
|
#
|
15
15
|
# * Neither the names of The University of Manchester nor the names of its
|
16
16
|
# contributors may be used to endorse or promote products derived from this
|
17
|
-
# software without specific prior written permission.
|
17
|
+
# software without specific prior written permission.
|
18
18
|
#
|
19
19
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
20
20
|
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
@@ -30,10 +30,17 @@
|
|
30
30
|
#
|
31
31
|
# Author: Robert Haines
|
32
32
|
|
33
|
-
require '
|
33
|
+
require 'yaml'
|
34
|
+
require 't2-server/util'
|
35
|
+
require 't2-server/xml/xml'
|
34
36
|
require 't2-server/exceptions'
|
37
|
+
require 't2-server/credentials'
|
38
|
+
require 't2-server/connection'
|
39
|
+
require 't2-server/connection-parameters'
|
40
|
+
require 't2-server/port'
|
35
41
|
require 't2-server/server'
|
36
42
|
require 't2-server/run'
|
43
|
+
require 't2-server/admin'
|
37
44
|
|
38
45
|
# This is a Ruby library to interface with the Taverna 2 Server REST API.
|
39
46
|
#
|
@@ -42,30 +49,12 @@ require 't2-server/run'
|
|
42
49
|
# * T2Server::Server - Use this if you are providing a web interface to a
|
43
50
|
# Taverna 2 Server instance.
|
44
51
|
module T2Server
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
end
|
50
|
-
|
51
|
-
# Add methods to the String class to operate on file paths.
|
52
|
-
class String
|
53
|
-
# :call-seq:
|
54
|
-
# str.strip_path -> string
|
55
|
-
#
|
56
|
-
# Returns a new String with one leading and one trailing slash
|
57
|
-
# removed from the ends of _str_ (if present).
|
58
|
-
def strip_path
|
59
|
-
self.gsub(/^\//, "").chomp("/")
|
60
|
-
end
|
52
|
+
module Version
|
53
|
+
# Version information in a Hash
|
54
|
+
INFO = YAML.load_file(File.join(File.dirname(__FILE__), "..",
|
55
|
+
"version.yml"))
|
61
56
|
|
62
|
-
|
63
|
-
|
64
|
-
#
|
65
|
-
# Modifies _str_ in place as described for String#strip_path,
|
66
|
-
# returning _str_, or returning +nil+ if no modifications were made.
|
67
|
-
def strip_path!
|
68
|
-
g = self.gsub!(/^\//, "")
|
69
|
-
self.chomp!("/") || g
|
57
|
+
# Version number as a String
|
58
|
+
STRING = [:major, :minor, :patch].map {|d| INFO[d]}.compact.join('.')
|
70
59
|
end
|
71
60
|
end
|
@@ -0,0 +1,147 @@
|
|
1
|
+
# Copyright (c) 2010-2012 The University of Manchester, UK.
|
2
|
+
#
|
3
|
+
# All rights reserved.
|
4
|
+
#
|
5
|
+
# Redistribution and use in source and binary forms, with or without
|
6
|
+
# modification, are permitted provided that the following conditions are met:
|
7
|
+
#
|
8
|
+
# * Redistributions of source code must retain the above copyright notice,
|
9
|
+
# this list of conditions and the following disclaimer.
|
10
|
+
#
|
11
|
+
# * Redistributions in binary form must reproduce the above copyright notice,
|
12
|
+
# this list of conditions and the following disclaimer in the documentation
|
13
|
+
# and/or other materials provided with the distribution.
|
14
|
+
#
|
15
|
+
# * Neither the names of The University of Manchester nor the names of its
|
16
|
+
# contributors may be used to endorse or promote products derived from this
|
17
|
+
# software without specific prior written permission.
|
18
|
+
#
|
19
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
20
|
+
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
21
|
+
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
22
|
+
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
23
|
+
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
24
|
+
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
25
|
+
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
26
|
+
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
27
|
+
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
28
|
+
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
29
|
+
# POSSIBILITY OF SUCH DAMAGE.
|
30
|
+
#
|
31
|
+
# Author: Robert Haines
|
32
|
+
|
33
|
+
module T2Server
|
34
|
+
|
35
|
+
# This call provides access to the administrative interface of a Taverna
|
36
|
+
# Server instance.
|
37
|
+
#
|
38
|
+
# To get an instance of this class use the Server#administrator method.
|
39
|
+
# Special permissions will most likely be required above and beyond those
|
40
|
+
# assigned to most Taverna Server users.
|
41
|
+
class Administrator
|
42
|
+
include XML::Methods
|
43
|
+
|
44
|
+
# The resources held by this administrative interface. This is a Hash
|
45
|
+
# indexed by the name of the resource in lowercase.
|
46
|
+
attr_reader :resources
|
47
|
+
|
48
|
+
# :stopdoc:
|
49
|
+
def initialize(server, credentials = nil)
|
50
|
+
@server = server
|
51
|
+
@credentials = credentials
|
52
|
+
|
53
|
+
admin_description = xml_document(@server.get_admin_attribute("",
|
54
|
+
@credentials))
|
55
|
+
@resources = get_resources(admin_description)
|
56
|
+
#@resources.each {|key, value| puts "#{key}: #{value}"}
|
57
|
+
|
58
|
+
yield(self) if block_given?
|
59
|
+
end
|
60
|
+
# :startdoc:
|
61
|
+
|
62
|
+
# :call-seq:
|
63
|
+
# [name] -> AdminResource
|
64
|
+
#
|
65
|
+
# Return the named AdminResource.
|
66
|
+
def [](name)
|
67
|
+
@resources[name.downcase]
|
68
|
+
end
|
69
|
+
|
70
|
+
# :stopdoc:
|
71
|
+
def get_resource_value(path)
|
72
|
+
@server.get_admin_attribute(path, @credentials)
|
73
|
+
end
|
74
|
+
|
75
|
+
def set_resource_value(path, val)
|
76
|
+
@server.set_admin_attribute(path, val.to_s, @credentials)
|
77
|
+
end
|
78
|
+
# :startdoc:
|
79
|
+
|
80
|
+
private
|
81
|
+
def get_resources(doc)
|
82
|
+
links = {}
|
83
|
+
|
84
|
+
xml_children(doc.root) do |res|
|
85
|
+
path = xml_node_attribute(res, 'href').split('/')[-1]
|
86
|
+
write = @server.admin_resource_writable?(path, @credentials)
|
87
|
+
links[res.name.downcase] = AdminResource.new(res.name, path,
|
88
|
+
write, self)
|
89
|
+
end
|
90
|
+
|
91
|
+
links
|
92
|
+
end
|
93
|
+
|
94
|
+
# This class represents a resource in the Taverna Server administrative
|
95
|
+
# interface. A resource can be read only or read/write.
|
96
|
+
#
|
97
|
+
# Resources are created when the parent Administrator class is created and
|
98
|
+
# are accessed via the [] method within that class.
|
99
|
+
class AdminResource
|
100
|
+
# The name of this resource.
|
101
|
+
attr_reader :name
|
102
|
+
|
103
|
+
# The path to this resource on the server.
|
104
|
+
attr_reader :path
|
105
|
+
|
106
|
+
# :stopdoc:
|
107
|
+
def initialize(name, path, writeable, parent)
|
108
|
+
@name = name
|
109
|
+
@path = path
|
110
|
+
@admin = parent
|
111
|
+
@writeable = writeable
|
112
|
+
|
113
|
+
make_writable if @writeable
|
114
|
+
end
|
115
|
+
# :startdoc:
|
116
|
+
|
117
|
+
# :call-seq:
|
118
|
+
# value -> String
|
119
|
+
# value=
|
120
|
+
#
|
121
|
+
# Get or set the value held by this resource. This call always queries
|
122
|
+
# the server as values can change without user intervention.
|
123
|
+
#
|
124
|
+
# The resource can only be set if it is writable.
|
125
|
+
def value
|
126
|
+
@admin.get_resource_value(@path)
|
127
|
+
end
|
128
|
+
|
129
|
+
# :call-seq:
|
130
|
+
# writable? -> bool
|
131
|
+
#
|
132
|
+
# Is this resource writable?
|
133
|
+
def writable?
|
134
|
+
@writeable
|
135
|
+
end
|
136
|
+
|
137
|
+
private
|
138
|
+
def make_writable
|
139
|
+
(class << self; self; end).instance_eval do
|
140
|
+
define_method "value=" do |value|
|
141
|
+
@admin.set_resource_value(@path, value)
|
142
|
+
end
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
147
|
+
end
|