spacewalk 0.0.2

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/CHANGELOG ADDED
@@ -0,0 +1,3 @@
1
+ === 0.0.1 2011-12-15
2
+
3
+ * Initial release
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in spacewalk.gemspec
4
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,58 @@
1
+ Ruby is copyrighted free software by Yukihiro Matsumoto <matz@netlab.co.jp>.
2
+ You can redistribute it and/or modify it under either the terms of the GPL
3
+ (see COPYING.txt file), or the conditions below:
4
+
5
+ 1. You may make and give away verbatim copies of the source form of the
6
+ software without restriction, provided that you duplicate all of the
7
+ original copyright notices and associated disclaimers.
8
+
9
+ 2. You may modify your copy of the software in any way, provided that
10
+ you do at least ONE of the following:
11
+
12
+ a) place your modifications in the Public Domain or otherwise
13
+ make them Freely Available, such as by posting said
14
+ modifications to Usenet or an equivalent medium, or by allowing
15
+ the author to include your modifications in the software.
16
+
17
+ b) use the modified software only within your corporation or
18
+ organization.
19
+
20
+ c) rename any non-standard executables so the names do not conflict
21
+ with standard executables, which must also be provided.
22
+
23
+ d) make other distribution arrangements with the author.
24
+
25
+ 3. You may distribute the software in object code or executable
26
+ form, provided that you do at least ONE of the following:
27
+
28
+ a) distribute the executables and library files of the software,
29
+ together with instructions (in the manual page or equivalent)
30
+ on where to get the original distribution.
31
+
32
+ b) accompany the distribution with the machine-readable source of
33
+ the software.
34
+
35
+ c) give non-standard executables non-standard names, with
36
+ instructions on where to get the original software distribution.
37
+
38
+ d) make other distribution arrangements with the author.
39
+
40
+ 4. You may modify and include the part of the software into any other
41
+ software (possibly commercial). But some files in the distribution
42
+ are not written by the author, so that they are not under this terms.
43
+
44
+ They are gc.c(partly), utils.c(partly), regex.[ch], st.[ch] and some
45
+ files under the ./missing directory. See each file for the copying
46
+ condition.
47
+
48
+ 5. The scripts and library files supplied as input to or produced as
49
+ output from the software do not automatically fall under the
50
+ copyright of the software, but belong to whomever generated them,
51
+ and may be sold commercially, and may be aggregated with this
52
+ software.
53
+
54
+ 6. THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR
55
+ IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
56
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
57
+ PURPOSE.
58
+
data/README.rdoc ADDED
@@ -0,0 +1,35 @@
1
+ = About Spacewalk
2
+
3
+ * http://github.com/kkaempf/ruby-spacewalk
4
+ * http://spacewalk.redhat.com/
5
+ * http://www.suse.com/products/suse-manager
6
+
7
+ == DESCRIPTION:
8
+
9
+ Spacewalk is a pure-Ruby implementation of the Spacewalk client
10
+ protocol stack.
11
+
12
+ == SYNOPSIS:
13
+
14
+ require 'spacewalk'
15
+
16
+ # Assuming that /etc/sysconfig/rhn/ exists
17
+ server = Spacewalk::Server.new
18
+ # get pending action for system
19
+ action = server.actions
20
+
21
+ == REQUIREMENTS:
22
+
23
+ * - none -
24
+
25
+ == INSTALL:
26
+
27
+ * sudo gem install spacewalk
28
+
29
+ == LICENSE:
30
+
31
+ (The Ruby License)
32
+
33
+ Copyright (c) 2011 SUSE Linux Products GmbH
34
+
35
+ See http://www.ruby-lang.org/en/LICENSE.txt for the full text
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require 'bundler/gem_tasks'
2
+ require 'rake/testtask'
3
+
4
+ task :default => [:test]
5
+
6
+ Dir['tasks/**/*.rake'].each { |t| load t }
data/bin/actions.rb ADDED
@@ -0,0 +1,6 @@
1
+ require "spacewalk"
2
+
3
+ server = Spacewalk::Server.new
4
+
5
+
6
+ action = server.actions
data/doc/protocol.doc ADDED
@@ -0,0 +1,203 @@
1
+ Client protocol
2
+
3
+ From looking at spacewalk/client/rhel/rhn-client-tools/src/up2date_client/up2dateAuth.py
4
+
5
+ - client configuration
6
+ - /etc/sysconfig/rhn/up2date
7
+ - text
8
+ - augmented <key>[<comment>] = <value>
9
+ 'cfg'
10
+
11
+ - where is my server ?
12
+ - ./rhn-client-tools/src/up2date_client/rpcServer.py
13
+ - access through proxy
14
+ if cfg["enableProxy"]:
15
+ proxyHost = config.getProxySetting()
16
+
17
+ if cfg["enableProxyAuth"]:
18
+ proxyUser = cfg["proxyUser"] or None
19
+ proxyPassword = cfg["proxyPassword"] or None
20
+
21
+ - support for multiple servers
22
+ serverUrls = config.getServerlURL()
23
+ ./rhn-client-tools/src/up2date_client/config.py
24
+ -> cfg["serverURL"] = https://manager.suse.de/XMLRPC
25
+ handler = /RPC2
26
+ -> could be multiple
27
+ serverList = ServerList(serverUrls)
28
+
29
+ - secure communication with server
30
+ ca = cfg["sslCACert"]
31
+ if isinstance(ca, basestring):
32
+ ca = [ca]
33
+
34
+ rhns_ca_certs = ca or ["/usr/share/rhn/RHNS-CA-CERT"]
35
+
36
+ - build up http(s) header
37
+ s.add_header("X-Up2date-Version", up2dateUtils.version())
38
+
39
+ - send up the (client) capabality info
40
+ headerlist = clientCaps.caps.headerFormat()
41
+ for (headerName, value) in headerlist:
42
+ s.add_header(headerName, value)
43
+
44
+ - client needs to authenticate
45
+ - cfg["systemIdPath] -> systemIdPath=/etc/sysconfig/rhn/systemid
46
+ - /etc/sysconfig/rhn/systemid
47
+ - xml formatted
48
+
49
+ - does a version check of rpmdb with systemid
50
+ - spacewalk/client/rhel/rhn-client-tools/src/up2date_client/up2dateUtils.py
51
+ - spacewalk/client/rhel/rhn-client-tools/src/up2date_client/transaction.py
52
+ - checks provider of redhat-release or distribution-release
53
+ - if the system was updated, client will get a new id
54
+ - can be overridden via cfg["versionOverride"]
55
+
56
+ - populates http header
57
+ from /etc/sysconfig/rhn/clientCaps.d
58
+ with "X-RHN-Client-Capability: <name>(<version>)=<value>"
59
+
60
+ - report = { "uname" => [<uname>], "uptime" => <uptime>]
61
+ os.uname(): ('Linux', 'kkaempf', '3.0.4-43-desktop', '#1 SMP PREEMPT Wed Aug 31 09:30:44 UTC 2011 (a432f18)', 'i686')
62
+ (uname -s, uname -n, uname -r, uname -v, uname -m)
63
+ uptime : /proc/uptime as [int, int]
64
+
65
+ = server side xmlrpc
66
+ spacewalk/backend/server/handlers/xmlrpc
67
+ call <file>.<method>
68
+
69
+ - call registration.welcome_message
70
+ => sets 'checked in' in database
71
+
72
+ - call get.actions systemid, ACTION_VERSION, report until empty
73
+ Remove example:
74
+ {"action"=>["packages.remove", [[["alsa-devel", "1.0.24.1", "30.1", "", ""]]]], "id"=>1061, "version"=>2}
75
+ id == action id
76
+ -> https://manager.suse.de/rhn/schedule/ActionDetails.do?aid=1061
77
+ Install/Update example:
78
+ {"action"=>["packages.update", [[["aqbanking", "5.0.10", "5.12", "", ""], ["epdfview", "0.1.8", "5.1", "", ""]]]], "id"=>1063, "version"=>2}
79
+ Reboot action:
80
+ {"action"=>["reboot.reboot", []], "id"=>1066, "version"=>2}
81
+ Hardware refresh:
82
+ {"action"=>["hardware.refresh_list", []], "id"=>1067, "version"=>2}
83
+
84
+ => only gets the next scheduled action, not all scheduled actions
85
+
86
+ queue.submit(up2dateAuth.getSystemId(), action_id, status, message,data)
87
+
88
+
89
+
90
+ - run local actions
91
+ LOCAL_ACTIONS = [("packages.checkNeedUpdate", ("rhnsd=1",))]
92
+ -> method = getMethod.getMethod(method, "/usr/share/rhn/","actions")
93
+ (status,message,data) = method(*params, **kwargs)
94
+
95
+ - packages.checkNeedUpdate
96
+ compate st_mtime of (cfg["dbpath"] || "/var/lib/rpm")/Packages with /var/lib/up2date/dbtimestamp
97
+ -> rhnPackageInfo.updatePackageProfile
98
+ rhel/rhn-client-tools/src/up2date_client/rhnPackageInfo.py
99
+ get package hash (pkgUtils.getInstalledPackageList(getArch=1)
100
+ rhel/rhn-client-tools/src/up2date_client/rpmUtils.py
101
+ "Return list of packages. Package is hash with keys name, epoch,
102
+ version, release and optionaly arch and cookie"
103
+ "name": <string-value>
104
+ "epoch": <string-value>
105
+ "version": <string-value>
106
+ "release": <string-value>
107
+ "installtime": <string-value>
108
+ "arch": <string-value>
109
+ "cookie"
110
+ unless server.has_capability xmlrpc.packages.extended_profile=2
111
+ convert hash to list
112
+ xmlrpc registration.update_packages(systemid, packages)
113
+
114
+ ============
115
+
116
+ First call to Server: registration.welcome_message
117
+ returns
118
+ Header
119
+ - "x-transport-info"=>["Extended Capabilities Transport (C) Red Hat, Inc (version $Revision$)"],
120
+ - "x-rhn-server-capability"=>
121
+ ["registration.finish_message(1)=1",
122
+ "applet.has_base_channel(1)=1",
123
+ "rhncfg.filetype.directory(1)=1",
124
+ "registration.register_osad(1)=1",
125
+ "registration.delta_packages(1)=1",
126
+ "xmlrpc.packages.extended_profile(1-2)=1",
127
+ "registration.remaining_subscriptions(1)=1",
128
+ "registration.update_contact_info(1)=1",
129
+ "staging_content(1)=1",
130
+ "registration.extended_update_support(1)=1",
131
+ "xmlrpc.packages.suse_products(1)=1",
132
+ "rhncfg.content.base64_decode(1)=1",
133
+ "registration.smbios(1)=1",
134
+ "xmlrpc.errata.patch_names(1)=1",
135
+ "xmlrpc.login.extra_data(1)=1"],
136
+ - "x-rhn-client-version"=>["0"],
137
+ - "content-transfer-encoding"=>["base64"],
138
+ - "connection"=>["close"],
139
+ - "content-type"=>["text/base64"],
140
+ - "x-rhn-proxy-version"=>["None"],
141
+ - "date"=>["Wed, 14 Dec 2011 10:54:55 GMT"],
142
+ - "server"=>["Apache"],
143
+ - "content-length"=>["163"],
144
+ - "content-encoding"=>["x-zlib"]
145
+ Body
146
+ eJyzsa/IzVEoSy0qzszPs1U31DNQt7fjsslNLcnITwlKLS7IzytOBQoUJBYl5hbDGEC6LDGnNNXO
147
+ prikKDMv3S4oNUXBI7FEwS+1pDy/KFshPDUnOT83VcE3tbg4MT3VRh+qzkYfoo/LRh9mkD7caH10
148
+ WwGMyDXu
149
+ -> zlib.deflate.decodebase64
150
+ <?xml version='1.0'?>
151
+ <methodResponse>
152
+ <params>
153
+ <param>
154
+ <value><string>Red Hat Network Welcome Message</string></value>
155
+ </param>
156
+ </params>
157
+ </methodResponse>
158
+ ===========
159
+
160
+ rhnreg_ks
161
+
162
+ - needs user/pass or activation code
163
+
164
+ - registered? cfg["systemIdPath] exists
165
+
166
+ - server.capabilities.validate()
167
+
168
+ - packageList = pkgUtils.getInstalledPackageList(getArch=getArch)
169
+ hardwareList = hardware.Hardware()
170
+ profilename = self.options.profilename || RegisterKsCli.__generateProfileName(hardwareList)
171
+ other = {}
172
+ if self.options.systemorgid:
173
+ other['org_id'] = self.options.systemorgid
174
+ (virt_uuid, virt_type) = rhnreg.get_virt_info()
175
+ if not virt_uuid is None:
176
+ other['virt_uuid'] = virt_uuid
177
+ other['virt_type'] = virt_type
178
+ systemId = rhnreg.registerSystem(token = self.options.activationkey,
179
+ profileName = profilename,
180
+ other = other)
181
+ rhnreg.sendHardware(systemId, hardwareList)
182
+ rhnreg.sendPackages(systemId, packageList)
183
+ # write out the new id
184
+ if isinstance(systemId, unicode):
185
+ rhnreg.writeSystemId(unicode.encode(systemId, 'utf-8'))
186
+ else:
187
+ rhnreg.writeSystemId(systemId)
188
+ rhnreg.cfg.save()
189
+ rhnreg.sendVirtInfo(systemId)
190
+ rhnreg.startRhnsd()
191
+
192
+ - profileName
193
+ Convert Internationalized domain name from Pune encoding to Unicode
194
+ for hw in hardwareList:
195
+ if hw['class'] == 'NETINFO':
196
+ hostname = hw.get('hostname')
197
+ ipaddr = hw.get('ipaddr')
198
+ if hostname:
199
+ profileName = idn_pune_to_unicode(hostname)
200
+ else:
201
+ if ipaddr:
202
+ profileName = ipaddr
203
+
data/lib/spacewalk.rb ADDED
@@ -0,0 +1,6 @@
1
+ $: << File.dirname(__FILE__)
2
+ require "spacewalk/config"
3
+ require "spacewalk/system_id"
4
+ require "spacewalk/capabilities"
5
+ require "spacewalk/status_report"
6
+ require "spacewalk/server"
@@ -0,0 +1,18 @@
1
+ module Spacewalk
2
+ class Capabilities
3
+ #
4
+ def initialize client
5
+ # hash of <capability> => <version>
6
+ @caps = {}
7
+ client.http_last_response["x-rhn-server-capability"].split(",").each do |caps|
8
+ caps.split(",").each do |cap|
9
+ # puts "#{cap}"
10
+ raise "Invalid cap '#{cap}'" unless cap =~ /(\s+)?(((\w+)|\.)+)\((\d(-\d)?)\)=(\d)/
11
+ # name = [ version, value ]
12
+ @caps[$2] = [$5, $7]
13
+ # puts "#{$2}(#{$5})=#{$7}"
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,26 @@
1
+ module Spacewalk
2
+ class Config
3
+ def initialize path="/etc/sysconfig/rhn/up2date"
4
+ @path = path
5
+ @config = {}
6
+ File.open path do |f|
7
+ while l = f.gets
8
+ # split <name>=<value>, drop everything else
9
+ next unless l =~ /(\w+)=(.*)/
10
+ key = $1
11
+ val = $2
12
+ # fixme: handle array-type values
13
+ @config[key.downcase] = val.empty? ? nil : val
14
+ end
15
+ end
16
+ end
17
+
18
+ def [] key
19
+ @config[key.downcase]
20
+ end
21
+
22
+ def method_missing name
23
+ @config[name.to_s.downcase]
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,155 @@
1
+ module XMLRPC
2
+ class Client
3
+ def get_parser
4
+ parser
5
+ end
6
+ end
7
+ end
8
+
9
+ module Spacewalk
10
+ class Server
11
+ # from /usr/sbin/rhn_check
12
+ # action version we understand
13
+ ACTION_VERSION = 2
14
+
15
+ require "xmlrpc/client"
16
+ require 'uri'
17
+ require 'zlib'
18
+ require 'base64'
19
+ require 'rexml/document'
20
+
21
+ private
22
+ def call name, *args
23
+ # puts "Call #{name}(#{args.inspect})"
24
+ begin
25
+ # remove trailing nil values, nil is not supported in xmlrpc
26
+ while args.size > 0 && args[-1].nil? do
27
+ args.pop
28
+ end
29
+ result = @client.call(name, *args)
30
+ rescue Exception => e
31
+ raise e unless e.message =~ /Wrong content-type/
32
+ end
33
+ response = @client.http_last_response
34
+ raise "XMLRPC failed with #{response.code}" unless response.code == "200"
35
+ body = response.body
36
+ case response["content-type"]
37
+ when "text/base64"
38
+ body = Base64.decode64(body)
39
+ when "text/xml"
40
+ # fallthru
41
+ else
42
+ STDERR.puts "Unhandled content-type #{response['content-type']}"
43
+ end
44
+ case response["content-encoding"]
45
+ when "x-zlib"
46
+ body = Zlib::Inflate.inflate(body)
47
+ when nil
48
+ # fallthru
49
+ else
50
+ STDERR.puts "Unhandled content-encoding #{response['content-encoding']}"
51
+ end
52
+ ok, result = @client.get_parser.parseMethodResponse(body)
53
+ raise unless ok
54
+ result
55
+ end
56
+ public
57
+
58
+ #
59
+ # Initialize server xmlrpc port
60
+ # options:
61
+ # :noconfig => true - don't load @config
62
+ # :server => string - url of server (for initial registration)
63
+ # :systemid => string
64
+ #
65
+ def initialize options = {}
66
+ @config = Spacewalk::Config.new
67
+ if options[:noconfig]
68
+ uri = URI.parse(options[:server])
69
+ uri.path = "/XMLRPC"
70
+ else
71
+ uri = URI.parse(@config.serverurl)
72
+ end
73
+
74
+ args = {:host=>uri.host, :path => uri.path, :use_ssl => (uri.scheme == "https")}
75
+
76
+ unless options[:noconfig]
77
+ if @config.httpProxy
78
+ args[:proxy_host], clientargs[:proxy_port] = @config.httpProxy.split ":"
79
+ end
80
+ end
81
+
82
+ @client = XMLRPC::Client.new_from_hash args
83
+
84
+ @client.http_header_extra = {}
85
+
86
+ welcome
87
+
88
+ # parse server capabilities
89
+ @capabilities = Spacewalk::Capabilities.new @client
90
+
91
+ @client.http_header_extra["X-Up2date-Version"] = "1.6.42" # from rhn-client-tools.spec
92
+ @client.http_header_extra["X-RHN-Client-Capability"] = "packages.extended_profile(2)=1"
93
+ @systemid = options[:systemid]
94
+ unless @systemid || options[:noconfig]
95
+ @systemid = Spacewalk::SystemId.new(@client, @config).to_xml
96
+ end
97
+ # check for distribution update
98
+ # my_id = @systemid.os_release
99
+ # server_id = osversion
100
+
101
+ end
102
+
103
+ # welcome to/from server
104
+ def welcome
105
+ result = call "registration.welcome_message"
106
+ puts "Welcome => #{result.inspect}"
107
+ end
108
+
109
+ # get system O/S version
110
+ def osversion
111
+ result = @config.versionOverride
112
+ unless result
113
+ # find rpm provider of redhat-release or distribution-release, get its version
114
+ end
115
+ result
116
+ end
117
+
118
+ def actions
119
+ report = Spacewalk::StatusReport.status
120
+
121
+ result = call "queue.get", @systemid, ACTION_VERSION, report
122
+ puts "Actions => #{result.inspect}"
123
+
124
+ if action = result["action"]
125
+ result["action"] = @client.get_parser.parseMethodCall(action)
126
+ end
127
+ puts "Actions => #{result.inspect}"
128
+ end
129
+
130
+ def register activationkey, profile_name, other = {}
131
+ auth_dict = {}
132
+ auth_dict["profile_name"] = profile_name
133
+ #"os_release" : up2dateUtils.getVersion(),
134
+ #"release_name" : up2dateUtils.getOSRelease(),
135
+ #"architecture" : up2dateUtils.getArch() }
136
+ # dict of other bits to send
137
+ auth_dict.update other
138
+ auth_dict["token"] = activationkey
139
+ # auth_dict["username"] = username
140
+ # auth_dict["password"] = password
141
+
142
+ # if cfg['supportsSMBIOS']:
143
+ # auth_dict["smbios"] = _encode_characters(hardware.get_smbios())
144
+ STDERR.puts "registration.new_system #{auth_dict.inspect}"
145
+ @systemid = call "registration.new_system", auth_dict
146
+ end
147
+
148
+ def send_packages packages
149
+ call "registration.add_packages", @systemid, packages
150
+ end
151
+ def refresh_hardware devices
152
+ call "registration.refresh_hw_profile", @systemid, devices
153
+ end
154
+ end
155
+ end
@@ -0,0 +1,20 @@
1
+ module Spacewalk
2
+ class StatusReport
3
+ def self.status
4
+ status = {}
5
+ # Return a 5-tuple containing information identifying the current operating system.
6
+ # The tuple contains 5 strings: (sysname, nodename, release, version, machine).
7
+ # (uname -s, uname -n, uname -r, uname -v, uname -m)
8
+ status["uname"] = [`uname -s`.chomp, `uname -n`.chomp, `uname -r`.chomp, `uname -v`.chomp, `uname -m`.chomp]
9
+ begin
10
+ File.open("/proc/uptime") do |f|
11
+ status["uptime"] = f.read.split(" ").map{|v| v.to_i}
12
+ end
13
+ rescue
14
+ nil
15
+ end
16
+ # puts status.inspect
17
+ status
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,26 @@
1
+ module Spacewalk
2
+ class SystemId
3
+ require 'xmlrpc/client'
4
+ def initialize client, config
5
+ raise "Expecting a Spacewalk::Config parameter to #{self.class}.new" unless config.is_a?(Spacewalk::Config)
6
+ @path = config["systemIdPath"]
7
+ raise "systemIdPath is empty !" unless @path
8
+ # <params>
9
+ # <param>
10
+ # <value>
11
+ # <struct>
12
+ # <member>
13
+ # <name>username</name>
14
+ # <value><string>admin</string></value>
15
+ # </member>
16
+ File.open(@path) do |f|
17
+ @raw = f.read
18
+ @members = client.get_parser.parseMethodResponse(@raw)
19
+ end
20
+ puts "SystemId => #{@members.inspect}"
21
+ end
22
+ def to_xml
23
+ @raw
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,3 @@
1
+ module Spacewalk
2
+ VERSION = "0.0.2"
3
+ end
@@ -0,0 +1,58 @@
1
+ module Spacewalk
2
+ class Xmlrpc
3
+ require 'rexml/document'
4
+ private
5
+ def self.value2ruby element
6
+ puts "value2ruby element #{element}"
7
+ node = element[0]
8
+ puts "value2ruby node #{node}"
9
+ case node.name
10
+ when "string"
11
+ node.text
12
+ when "struct"
13
+ raise "value2ruby: <member> not following <struct>" unless node[0].name == "member"
14
+ value = {}
15
+ puts "Struct #{node}"
16
+ node.each_element("member") do |e|
17
+ name = e.elements["member/name"].text
18
+ v = value2ruby m.elements["member/value"]
19
+ value[name] = v
20
+ end
21
+ value
22
+ when "array"
23
+ raise "value2ruby: <data> not following <array>" unless node[0].name == "data"
24
+ value = []
25
+ # puts "Array #{node}"
26
+ node.each_element("data/value") do |e|
27
+ # puts "recursive #{e}"
28
+ value << value2ruby(e)
29
+ end
30
+ value
31
+ else
32
+ raise "value2ruby: Can't handle element '#{element.name}'"
33
+ end
34
+ end
35
+ public
36
+ # <params>
37
+ # <param>
38
+ # <value>
39
+ # <struct>
40
+ # <member>
41
+ # <name>username</name>
42
+ # <value><string>admin</string></value>
43
+ # </member>
44
+ # <value><string>...
45
+ # <value><array><data>...
46
+ #
47
+ def self.decode what
48
+ @doc.root.elements["params/param"]
49
+
50
+ initialize config
51
+ raise "Expecting a Spacewalk::Config parameter to #{self.class}.new" unless config.is_a?(Spacewalk::Config)
52
+ @path = config["systemIdPath"]
53
+ raise "systemIdPath is empty !" unless @path
54
+ @doc = REXML::Document.new(File.open(@path))
55
+ @members = @doc.root.elements["params/param"]
56
+ end
57
+ end
58
+ end
data/spacewalk.gemspec ADDED
@@ -0,0 +1,28 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "spacewalk/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "spacewalk"
7
+ s.version = Spacewalk::VERSION
8
+
9
+ s.platform = Gem::Platform::RUBY
10
+ s.authors = ["Klaus Kämpf"]
11
+ s.email = ["kkaempf@suse.de"]
12
+ s.homepage = "https://github.com/kkaempf/ruby-spacewalk"
13
+ s.summary = %q{A pure-Ruby implementation of the Spacewalk client side}
14
+ s.description = %q{Can be used for testing or to attach 'foreign'
15
+ systems}
16
+
17
+ s.rubyforge_project = "spacewalk"
18
+
19
+ s.add_development_dependency('rake')
20
+ s.add_development_dependency('bundler')
21
+
22
+ s.files = `git ls-files`.split("\n")
23
+ s.files.reject! { |fn| fn == '.gitignore' }
24
+ s.extra_rdoc_files = Dir['README*', 'TODO*', 'CHANGELOG*', 'LICENSE']
25
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
26
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
27
+ s.require_paths = ["lib"]
28
+ end
data/tasks/clean.rake ADDED
@@ -0,0 +1,8 @@
1
+ task :clean do
2
+ `rm -rf *~`
3
+ `rm -rf */*~`
4
+ `rm -rf */*/*~`
5
+ `rm -f Gemfile.lock`
6
+ `rm -rf .yardoc`
7
+ `rm -rf pkg`
8
+ end
data/tasks/doc.rake ADDED
@@ -0,0 +1,14 @@
1
+ begin
2
+ require 'yard'
3
+ YARD::Rake::YardocTask.new(:doc) do |t|
4
+ t.files = ['lib/**/*.rb']
5
+ t.options = ['--no-private']
6
+ end
7
+ rescue LoadError
8
+ STDERR.puts "Install yard if you want prettier docs"
9
+ require 'rdoc/task'
10
+ Rake::RDocTask.new(:doc) do |rdoc|
11
+ rdoc.rdoc_dir = "doc"
12
+ rdoc.title = "Spacewalk #{Spacewalk::VERSION}"
13
+ end
14
+ end
data/tasks/test.rake ADDED
@@ -0,0 +1,6 @@
1
+ Rake::TestTask.new do |t|
2
+ t.libs << File.expand_path('../test', __FILE__)
3
+ t.libs << File.expand_path('../', __FILE__)
4
+ t.test_files = FileList['test/test*.rb']
5
+ t.verbose = true
6
+ end
metadata ADDED
@@ -0,0 +1,117 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: spacewalk
3
+ version: !ruby/object:Gem::Version
4
+ hash: 27
5
+ prerelease:
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 2
10
+ version: 0.0.2
11
+ platform: ruby
12
+ authors:
13
+ - "Klaus K\xC3\xA4mpf"
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2012-01-17 00:00:00 +01:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: rake
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ hash: 3
30
+ segments:
31
+ - 0
32
+ version: "0"
33
+ type: :development
34
+ version_requirements: *id001
35
+ - !ruby/object:Gem::Dependency
36
+ name: bundler
37
+ prerelease: false
38
+ requirement: &id002 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ hash: 3
44
+ segments:
45
+ - 0
46
+ version: "0"
47
+ type: :development
48
+ version_requirements: *id002
49
+ description: |-
50
+ Can be used for testing or to attach 'foreign'
51
+ systems
52
+ email:
53
+ - kkaempf@suse.de
54
+ executables:
55
+ - actions.rb
56
+ extensions: []
57
+
58
+ extra_rdoc_files:
59
+ - README.rdoc
60
+ - CHANGELOG
61
+ - LICENSE
62
+ files:
63
+ - CHANGELOG
64
+ - Gemfile
65
+ - LICENSE
66
+ - README.rdoc
67
+ - Rakefile
68
+ - bin/actions.rb
69
+ - doc/protocol.doc
70
+ - lib/spacewalk.rb
71
+ - lib/spacewalk/capabilities.rb
72
+ - lib/spacewalk/config.rb
73
+ - lib/spacewalk/server.rb
74
+ - lib/spacewalk/status_report.rb
75
+ - lib/spacewalk/system_id.rb
76
+ - lib/spacewalk/version.rb
77
+ - lib/spacewalk/xmlrpc.rb
78
+ - spacewalk.gemspec
79
+ - tasks/clean.rake
80
+ - tasks/doc.rake
81
+ - tasks/test.rake
82
+ has_rdoc: true
83
+ homepage: https://github.com/kkaempf/ruby-spacewalk
84
+ licenses: []
85
+
86
+ post_install_message:
87
+ rdoc_options: []
88
+
89
+ require_paths:
90
+ - lib
91
+ required_ruby_version: !ruby/object:Gem::Requirement
92
+ none: false
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ hash: 3
97
+ segments:
98
+ - 0
99
+ version: "0"
100
+ required_rubygems_version: !ruby/object:Gem::Requirement
101
+ none: false
102
+ requirements:
103
+ - - ">="
104
+ - !ruby/object:Gem::Version
105
+ hash: 3
106
+ segments:
107
+ - 0
108
+ version: "0"
109
+ requirements: []
110
+
111
+ rubyforge_project: spacewalk
112
+ rubygems_version: 1.5.0
113
+ signing_key:
114
+ specification_version: 3
115
+ summary: A pure-Ruby implementation of the Spacewalk client side
116
+ test_files: []
117
+