t2-server 0.6.1 → 0.9.0
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/.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
|