ovfparse 0.0.93 → 0.0.95

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.
@@ -0,0 +1,53 @@
1
+ require 'nokogiri'
2
+ require 'open-uri'
3
+
4
+ class MarketplaceRepository < VmRepository
5
+
6
+ def parse (raw_html)
7
+ file_list = Array.new
8
+
9
+ xml = Nokogiri::XML(raw_html) do |config|
10
+ config.noblanks.strict.noent
11
+ end
12
+
13
+ entries = xml.root.children.select { |element| element.name == 'entry' }
14
+
15
+ entries.each { |entry|
16
+ repository = entry.children.detect { |element| element.name == 'repository' }
17
+ basepath = repository.children.detect { |element| element.name == 'basepath' }
18
+ filename = repository.children.detect { |element| element.name == 'filename' }
19
+
20
+ file_list.push( {'basepath' => basepath.content, 'filename' => filename.content} )
21
+ }
22
+
23
+ return file_list
24
+ end
25
+
26
+ def fetch
27
+ #retrieve data from http server
28
+ raw_html = open(uri)
29
+ if (raw_html)
30
+
31
+ #parse out package list from index html
32
+ package_list = parse(raw_html)
33
+
34
+ #construct package objects based on results
35
+ return listPackages(package_list)
36
+ end
37
+ end
38
+
39
+ def listPackages(package_list)
40
+ packages = Array.new
41
+ package_list.each { |pkg|
42
+ fullpath = (pkg['basepath'] + pkg['filename']).to_s
43
+ package = VmPackage.create(fullpath)
44
+ package.base_path = pkg['basepath']
45
+ package.name = pkg['filename']
46
+
47
+ packages.push(package)
48
+ }
49
+
50
+ return packages
51
+ end
52
+
53
+ end
@@ -0,0 +1,261 @@
1
+ #############################################################################################
2
+ # Reverse lookup table for the OVF spec/CIM spec listing of operating system IDs
3
+ # For reference:
4
+ #
5
+ # Go here
6
+ # http://dmtf.org/standards/cim
7
+ #
8
+ # Then pick the latest schema, in this case 2.28, here
9
+ # http://dmtf.org/standards/cim/cim_schema_v2280
10
+ #
11
+ # Then pick the .Zip archive of all Final MOF files., here
12
+ # http://dmtf.org/sites/default/files/cim/cim_schema_v2280/cim_schema_2.28.0Final-MOFs.zip
13
+ #
14
+ # The OS list is in System\CIM_OperatingSystem.mof, line 29.
15
+ #
16
+ # sample usage:
17
+ # require "os_id_table.rb"
18
+ #
19
+ # puts OS_ID_TABLE.value? "HPUX"
20
+ # => true
21
+ # puts OS_ID_TABLE.value? "arduino embedded"
22
+ # => false
23
+ # puts OS_ID_TABLE[55]
24
+ # => NextStep
25
+ #
26
+ # puts OS_ID_TABLE_REV.value? 1
27
+ # => true
28
+ # puts OS_ID_TABLE_REV.value? 250
29
+ # => false
30
+ # puts OS_ID_TABLE_REV["LINUX"]
31
+ # => 36
32
+ #
33
+
34
+ OS_ID_TABLE_REV = Hash[
35
+ "Unknown" => 0,
36
+ "Other" => 1,
37
+ "MACOS" => 2,
38
+ "ATTUNIX" => 3,
39
+ "DGUX" => 4,
40
+ "DECNT" => 5,
41
+ "Tru64 UNIX" => 6,
42
+ "OpenVMS" => 7,
43
+ "HPUX" => 8,
44
+ "AIX" => 9,
45
+ "MVS" => 10,
46
+ "OS400" => 11,
47
+ "OS/2" => 12,
48
+ "JavaVM" => 13,
49
+ "MSDOS" => 14,
50
+ "WIN3x" => 15,
51
+ "WIN95" => 16,
52
+ "WIN98" => 17,
53
+ "WINNT" => 18,
54
+ "WINCE" => 19,
55
+ "NCR3000" => 20,
56
+ "NetWare" => 21,
57
+ "OSF" => 22,
58
+ "DC/OS" => 23,
59
+ "Reliant UNIX" => 24,
60
+ "SCO UnixWare" => 25,
61
+ "SCO OpenServer" => 26,
62
+ "Sequent" => 27,
63
+ "IRIX" => 28,
64
+ "Solaris" => 29,
65
+ "SunOS" => 30,
66
+ "U6000" => 31,
67
+ "ASERIES" => 32,
68
+ "HP NonStop OS" => 33,
69
+ "HP NonStop OSS" => 34,
70
+ "BS2000" => 35,
71
+ "LINUX" => 36,
72
+ "Lynx" => 37,
73
+ "XENIX" => 38,
74
+ "VM" => 39,
75
+ "Interactive UNIX" => 40,
76
+ "BSDUNIX" => 41,
77
+ "FreeBSD" => 42,
78
+ "NetBSD" => 43,
79
+ "GNU Hurd" => 44,
80
+ "OS9" => 45,
81
+ "MACH Kernel" => 46,
82
+ "Inferno" => 47,
83
+ "QNX" => 48,
84
+ "EPOC" => 49,
85
+ "IxWorks" => 50,
86
+ "VxWorks" => 51,
87
+ "MiNT" => 52,
88
+ "BeOS" => 53,
89
+ "HP MPE" => 54,
90
+ "NextStep" => 55,
91
+ "PalmPilot" => 56,
92
+ "Rhapsody" => 57,
93
+ "Windows 2000" => 58,
94
+ "Dedicated" => 59,
95
+ "OS/390" => 60,
96
+ "VSE" => 61,
97
+ "TPF" => 62,
98
+ "Windows (R) Me" => 63,
99
+ "Caldera Open UNIX" => 64,
100
+ "OpenBSD" => 65,
101
+ "Not Applicable" => 66,
102
+ "Windows XP" => 67,
103
+ "z/OS" => 68,
104
+ "Microsoft Windows Server 2003" => 69,
105
+ "Microsoft Windows Server 2003 64-Bit" => 70,
106
+ "Windows XP 64-Bit" => 71,
107
+ "Windows XP Embedded" => 72,
108
+ "Windows Vista" => 73,
109
+ "Windows Vista 64-Bit" => 74,
110
+ "Windows Embedded for Point of Service" => 75,
111
+ "Microsoft Windows Server 2008" => 76,
112
+ "Microsoft Windows Server 2008 64-Bit" => 77,
113
+ "FreeBSD 64-Bit" => 78,
114
+ "RedHat Enterprise Linux" => 79,
115
+ "RedHat Enterprise Linux 64-Bit" => 80,
116
+ "Solaris 64-Bit" => 81,
117
+ "SUSE" => 82,
118
+ "SUSE 64-Bit" => 83,
119
+ "SLES" => 84,
120
+ "SLES 64-Bit" => 85,
121
+ "Novell OES" => 86,
122
+ "Novell Linux Desktop" => 87,
123
+ "Sun Java Desktop System" => 88,
124
+ "Mandriva" => 89,
125
+ "Mandriva 64-Bit" => 90,
126
+ "TurboLinux" => 91,
127
+ "TurboLinux 64-Bit" => 92,
128
+ "Ubuntu" => 93,
129
+ "Ubuntu 64-Bit" => 94,
130
+ "Debian" => 95,
131
+ "Debian 64-Bit" => 96,
132
+ "Linux 2.4.x" => 97,
133
+ "Linux 2.4.x 64-Bit" => 98,
134
+ "Linux 2.6.x" => 99,
135
+ "Linux 2.6.x 64-Bit" => 100,
136
+ "Linux 64-Bit" => 101,
137
+ "Other 64-Bit" => 102,
138
+ "Microsoft Windows Server 2008 R2" => 103,
139
+ "VMware ESXi" => 104,
140
+ "Microsoft Windows 7" => 105,
141
+ "CentOS 32-bit" => 106,
142
+ "CentOS 64-bit" => 107,
143
+ "Oracle Enterprise Linux 32-bit" => 108,
144
+ "Oracle Enterprise Linux 64-bit" => 109,
145
+ "eComStation 32-bitx" => 110
146
+ ]
147
+
148
+ OS_ID_TABLE = Hash[
149
+ 0 => "Unknown" ,
150
+ 1 => "Other" ,
151
+ 2 => "MACOS" ,
152
+ 3 => "ATTUNIX" ,
153
+ 4 => "DGUX" ,
154
+ 5 => "DECNT" ,
155
+ 6 => "Tru64 UNIX" ,
156
+ 7 => "OpenVMS" ,
157
+ 8 => "HPUX" ,
158
+ 9 => "AIX" ,
159
+ 10 => "MVS" ,
160
+ 11 => "OS400" ,
161
+ 12 => "OS/2" ,
162
+ 13 => "JavaVM" ,
163
+ 14 => "MSDOS" ,
164
+ 15 => "WIN3x" ,
165
+ 16 => "WIN95" ,
166
+ 17 => "WIN98" ,
167
+ 18 => "WINNT" ,
168
+ 19 => "WINCE" ,
169
+ 20 => "NCR3000" ,
170
+ 21 => "NetWare" ,
171
+ 22 => "OSF" ,
172
+ 23 => "DC/OS" ,
173
+ 24 => "Reliant UNIX" ,
174
+ 25 => "SCO UnixWare" ,
175
+ 26 => "SCO OpenServer" ,
176
+ 27 => "Sequent" ,
177
+ 28 => "IRIX" ,
178
+ 29 => "Solaris" ,
179
+ 30 => "SunOS" ,
180
+ 31 => "U6000" ,
181
+ 32 => "ASERIES" ,
182
+ 33 => "HP NonStop OS" ,
183
+ 34 => "HP NonStop OSS" ,
184
+ 35 => "BS2000" ,
185
+ 36 => "LINUX" ,
186
+ 37 => "Lynx" ,
187
+ 38 => "XENIX" ,
188
+ 39 => "VM" ,
189
+ 40 => "Interactive UNIX" ,
190
+ 41 => "BSDUNIX" ,
191
+ 42 => "FreeBSD" ,
192
+ 43 => "NetBSD" ,
193
+ 44 => "GNU Hurd" ,
194
+ 45 => "OS9" ,
195
+ 46 => "MACH Kernel" ,
196
+ 47 => "Inferno" ,
197
+ 48 => "QNX" ,
198
+ 49 => "EPOC" ,
199
+ 50 => "IxWorks" ,
200
+ 51 => "VxWorks" ,
201
+ 52 => "MiNT" ,
202
+ 53 => "BeOS" ,
203
+ 54 => "HP MPE" ,
204
+ 55 => "NextStep" ,
205
+ 56 => "PalmPilot" ,
206
+ 57 => "Rhapsody" ,
207
+ 58 => "Windows 2000" ,
208
+ 59 => "Dedicated" ,
209
+ 60 => "OS/390" ,
210
+ 61 => "VSE" ,
211
+ 62 => "TPF" ,
212
+ 63 => "Windows (R) Me" ,
213
+ 64 => "Caldera Open UNIX" ,
214
+ 65 => "OpenBSD" ,
215
+ 66 => "Not Applicable" ,
216
+ 67 => "Windows XP" ,
217
+ 68 => "z/OS" ,
218
+ 69 => "Microsoft Windows Server 2003" ,
219
+ 70 => "Microsoft Windows Server 2003 64-Bit" ,
220
+ 71 => "Windows XP 64-Bit" ,
221
+ 72 => "Windows XP Embedded" ,
222
+ 73 => "Windows Vista" ,
223
+ 74 => "Windows Vista 64-Bit" ,
224
+ 75 => "Windows Embedded for Point of Service" ,
225
+ 76 => "Microsoft Windows Server 2008" ,
226
+ 77 => "Microsoft Windows Server 2008 64-Bit" ,
227
+ 78 => "FreeBSD 64-Bit" ,
228
+ 79 => "RedHat Enterprise Linux" ,
229
+ 80 => "RedHat Enterprise Linux 64-Bit" ,
230
+ 81 => "Solaris 64-Bit" ,
231
+ 82 => "SUSE" ,
232
+ 83 => "SUSE 64-Bit" ,
233
+ 84 => "SLES" ,
234
+ 85 => "SLES 64-Bit" ,
235
+ 86 => "Novell OES" ,
236
+ 87 => "Novell Linux Desktop" ,
237
+ 88 => "Sun Java Desktop System" ,
238
+ 89 => "Mandriva" ,
239
+ 90 => "Mandriva 64-Bit" ,
240
+ 91 => "TurboLinux" ,
241
+ 92 => "TurboLinux 64-Bit" ,
242
+ 93 => "Ubuntu" ,
243
+ 94 => "Ubuntu 64-Bit" ,
244
+ 95 => "Debian" ,
245
+ 96 => "Debian 64-Bit" ,
246
+ 97 => "Linux 2.4.x" ,
247
+ 98 => "Linux 2.4.x 64-Bit" ,
248
+ 99 => "Linux 2.6.x" ,
249
+ 100 => "Linux 2.6.x 64-Bit" ,
250
+ 101 => "Linux 64-Bit" ,
251
+ 102 => "Other 64-Bit" ,
252
+ 103 => "Microsoft Windows Server 2008 R2" ,
253
+ 104 => "VMware ESXi" ,
254
+ 105 => "Microsoft Windows 7" ,
255
+ 106 => "CentOS 32-bit" ,
256
+ 107 => "CentOS 64-bit" ,
257
+ 108 => "Oracle Enterprise Linux 32-bit" ,
258
+ 109 => "Oracle Enterprise Linux 64-bit" ,
259
+ 110 => "eComStation 32-bitx"
260
+ ]
261
+
@@ -1,5 +1,8 @@
1
+ require 'open-uri'
2
+
1
3
  class VmPackage
2
4
  @url
5
+ @base_path
3
6
  @name
4
7
  @version
5
8
  @protocol
@@ -10,19 +13,25 @@ class VmPackage
10
13
  OVA = 0
11
14
  OVF = 1
12
15
  ISO = 2
16
+
17
+ @references
18
+ @diskSection
19
+ @networkSection
20
+ @virtualSystem
13
21
 
14
22
  @type = nil
15
-
23
+
24
+ DEBUG_MODE = false
16
25
 
17
26
  # List of attributes in an OVF product that we will extract / set
18
27
  PRODUCT_ATTRIBUTES = [ {'full_name' => 'ovf:instance', 'node_ref' => 'instance', 'attribute_ref' => 'instance'},
19
28
  {'full_name' => 'ovf:class', 'node_ref' => 'class', 'attribute_ref' => 'product_class'} ]
20
29
 
21
30
  # List of elements in an OVF product that we will extract / set
22
- PRODUCT_ELEMENTS = [ {'full_name' => 'ovf:Info', 'node_ref' => 'Info', 'element_ref' => 'description', 'required' => false},
23
- {'full_name' => 'ovf:Product', 'node_ref' => 'Product', 'element_ref' => 'name', 'required' => false},
24
- {'full_name' => 'ovf:Vendor', 'node_ref' => 'Vendor', 'element_ref' => 'vendor', 'required' => false},
25
- {'full_name' => 'ovf:Version', 'node_ref' => 'Version', 'element_ref' => 'version', 'required' => false} ]
31
+ PRODUCT_ELEMENTS = [ {'full_name' => 'Info', 'node_ref' => 'Info', 'element_ref' => 'description', 'required' => false},
32
+ {'full_name' => 'Product', 'node_ref' => 'Product', 'element_ref' => 'name', 'required' => false},
33
+ {'full_name' => 'Vendor', 'node_ref' => 'Vendor', 'element_ref' => 'vendor', 'required' => false},
34
+ {'full_name' => 'Version', 'node_ref' => 'Version', 'element_ref' => 'version', 'required' => false} ]
26
35
 
27
36
  # List of attributes in an OVF property that we will extract / set
28
37
  PROPERTY_ATTRIBUTES = [ {'full_name' => 'ovf:value', 'node_ref' => 'value', 'attribute_ref' => 'value'},
@@ -35,15 +44,15 @@ class VmPackage
35
44
  {'full_name' => 'cops:uuid', 'node_ref' => 'uuid', 'attribute_ref' => 'uuid'} ] # @todo refactor to cops extension module
36
45
 
37
46
  # List of elements in an OVF property that we will extract / set
38
- PROPERTY_ELEMENTS = [ {'full_name' => 'ovf:Label', 'node_ref' => 'Label', 'element_ref' => 'name', 'required' => false},
39
- {'full_name' => 'ovf:Description', 'node_ref' => 'Description', 'element_ref' => 'description', 'required' => false},
40
- {'full_name' => 'cops:Example', 'node_ref' => 'cops:Example', 'element_ref' => 'example', 'required' => true}, # @todo refactor to cops extension module
41
- {'full_name' => 'cops:NoneType', 'node_ref' => 'cops:NoneType', 'element_ref' => 'nonetype', 'required' => true} ] # @todo refactor to cops extension module
47
+ PROPERTY_ELEMENTS = [ {'full_name' => 'Label', 'node_ref' => 'Label', 'element_ref' => 'name', 'required' => false},
48
+ {'full_name' => 'Description', 'node_ref' => 'Description', 'element_ref' => 'description', 'required' => false},
49
+ {'full_name' => 'Example', 'node_ref' => 'cops:Example', 'element_ref' => 'example', 'required' => true}, # @todo refactor to cops extension module
50
+ {'full_name' => 'NoneType', 'node_ref' => 'cops:NoneType', 'element_ref' => 'nonetype', 'required' => true} ] # @todo refactor to cops extension module
42
51
 
43
52
  OVF_NAMESPACE = {'ovf' => 'http://schemas.dmtf.org/ovf/envelope/1'}
44
53
 
45
54
 
46
- attr_accessor :url, :name, :version, :state, :protocol, :size, :xml
55
+ attr_accessor :url, :base_path, :name, :version, :state, :protocol, :size, :xml, :references, :diskSection, :networkSection, :virtualSystem
47
56
 
48
57
 
49
58
  def initialize
@@ -63,6 +72,10 @@ class VmPackage
63
72
  end
64
73
 
65
74
  def initialize(uri)
75
+ if (URI::HTTP==uri.class) then
76
+ uri = uri.to_s
77
+ end
78
+
66
79
  (@protocol, @url) = uri.split(":", 2) unless !uri
67
80
  @url.sub!(/^\/{0,2}/, '')
68
81
  @protocol.downcase
@@ -75,7 +88,6 @@ class VmPackage
75
88
  @url.sub!(/^\/{0,2}/, '')
76
89
  @protocol.downcase
77
90
  @url.downcase
78
-
79
91
  if @protocol=='ftp'
80
92
  FtpVmPackage.new(uri)
81
93
  elsif @protocol=='http'
@@ -105,13 +117,52 @@ class VmPackage
105
117
 
106
118
  def fetch
107
119
  end
120
+
121
+
122
+ # Caches all of the base elements inside Envelope for fast access
123
+ def loadElementRefs
124
+ children = @xml.root.children
125
+
126
+ @references = children[0]
127
+ if(@references.name != 'References')
128
+ @references = getChildByName(xml.root, 'References')
129
+ end
130
+
131
+ @diskSection = children[1]
132
+ if(@diskSection.name != 'DiskSection')
133
+ @diskSection = getChildByName(xml.root, 'DiskSection')
134
+ end
135
+
136
+ @networkSection = children[2]
137
+ if(@networkSection.name != 'NetworkSection')
138
+ @networkSection = getChildByName(xml.root, 'NetworkSection')
139
+ end
140
+
141
+ @virtualSystem = children[3]
142
+ if(@virtualSystem.name != 'VirtualSystem')
143
+ @virtualSystem = getChildByName(xml.root, 'VirtualSystem')
144
+ end
145
+
146
+ end
108
147
 
148
+ # Returns the first child node of the passed node whose name matches the passed name.
149
+ def getChildByName(node, childName)
150
+ return node.children.detect{ |element| element.name == childName}
151
+ end
152
+
153
+ # Returns every child node of the passed node whose name matches the passed name.
154
+ def getChildrenByName(node, childName)
155
+ return node.children.select{ |element| element.name == childName}
156
+ end
157
+
109
158
  def referenced_file(element)
110
159
  @xml.xpath("//ovf:References/ovf:File[@ovf:id='#{element['fileRef']}']", OVF_NAMESPACE).first
111
160
  end
112
161
 
113
162
  def method_missing(method)
114
- puts "WARNING: NoSuchMethod Error: " + method.to_s + " ...trying XPath query \n"
163
+ if DEBUG_MODE
164
+ puts "WARNING: NoSuchMethod Error: " + method.to_s + " ...trying XPath query \n"
165
+ end
115
166
 
116
167
  # try with namespace
117
168
  data = @xml.xpath("//ovf:" + method.to_s)
@@ -139,7 +190,7 @@ class VmPackage
139
190
  end
140
191
 
141
192
  def checkschema(schema)
142
- xsd = Nokogiri::XML::Schema(File.read(schema))
193
+ xsd = Nokogiri::XML::Schema(schema)
143
194
  response = ""
144
195
 
145
196
  isValid = true
@@ -152,18 +203,23 @@ class VmPackage
152
203
  end
153
204
 
154
205
  def getVmName
155
- return xml.xpath('ovf:Envelope/ovf:VirtualSystem')[0]['id']
206
+ return virtualSystem['id']
156
207
  end
157
208
 
158
209
  def getVmDescription
159
- descNode = xml.xpath('ovf:Envelope/ovf:VirtualSystem/ovf:Info')[0]
210
+ descNode = getChildByName(virtualSystem, 'Info')
160
211
  return descNode.nil? ? '' : descNode.content
161
212
  end
162
213
 
163
214
  def getVmOS_ID
164
- return xml.xpath('ovf:Envelope/ovf:VirtualSystem/ovf:OperatingSystemSection')[0]['id']
215
+ return getChildByName(virtualSystem, 'OperatingSystemSection')['id']
165
216
  end
166
217
 
218
+ def getVmOS
219
+ return OS_ID_TABLE[getVmOS_ID.to_i]
220
+ end
221
+
222
+
167
223
  # note this is not part of the OVF spec. Specific users could overwrite this method to
168
224
  # store/retrieve patch level in the description field, for example.
169
225
  def getVmPatchLevel
@@ -186,11 +242,11 @@ class VmPackage
186
242
  def getVmDisks
187
243
  disks = Array.new
188
244
  filenames = Hash.new
189
- xml.xpath('ovf:Envelope/ovf:References/ovf:File').each { |node|
245
+ getChildrenByName(references, 'File').each { |node|
190
246
  filenames[node['id']] = node['href']
191
247
  }
192
248
 
193
- xml.xpath('ovf:Envelope/ovf:DiskSection/ovf:Disk').each { |node|
249
+ getChildrenByName(diskSection, 'Disk').each { |node|
194
250
  disks.push({ 'name' => node['diskId'], 'location' => filenames[node['fileRef']], 'size' => node['capacity'] })
195
251
  }
196
252
 
@@ -199,8 +255,8 @@ class VmPackage
199
255
 
200
256
  def getVmNetworks
201
257
  networks = Array.new
202
- xml.xpath('ovf:Envelope/ovf:NetworkSection/ovf:Network').each { |node|
203
- descriptionNode = node.xpath('ovf:Description')[0]
258
+ getChildrenByName(networkSection, 'Network').each { |node|
259
+ descriptionNode = getChildByName(node, 'Description')
204
260
  text = descriptionNode.nil? ? '' : descriptionNode.text
205
261
  networks.push({'location' => node['name'], 'notes' => text })
206
262
  }
@@ -217,25 +273,25 @@ class VmPackage
217
273
  end
218
274
 
219
275
  def getVirtualQuantity(resource)
220
- xml.xpath('ovf:Envelope/ovf:VirtualSystem/ovf:VirtualHardwareSection/ovf:Item').each { |node|
276
+ getChildrenByName(getChildByName(virtualSystem, 'VirtualHardwareSection'), 'Item').each{ |node|
221
277
  resourceType = node.xpath('rasd:ResourceType')[0].text
222
278
  resourceType == resource.to_s ? (return node.xpath('rasd:VirtualQuantity')[0].text) : next
223
279
  }
224
280
  end
225
281
 
226
282
  def setVmName(newValue)
227
- xml.xpath('ovf:Envelope/ovf:VirtualSystem')[0]['ovf:id'] = newValue
228
- nameNode = xml.xpath('ovf:Envelope/ovf:VirtualSystem/ovf:Name')[0] ||
229
- xml.xpath('ovf:Envelope/ovf:VirtualSystem/ovf:Info')[0].add_next_sibling(xml.create_element('Name', {}))
283
+ virtualSystem['ovf:id'] = newValue
284
+ nameNode = getChildByName(virtualSystem, 'Name') ||
285
+ getChildByName(virtualSystem, 'Info').add_next_sibling(xml.create_element('Name', {}))
230
286
  nameNode.content = newValue
231
287
  end
232
288
 
233
289
  def setVmDescription(newValue)
234
- xml.xpath('ovf:Envelope/ovf:VirtualSystem/ovf:Info')[0].content = newValue
290
+ getChildByName(virtualSystem, 'Info').content = newValue
235
291
  end
236
292
 
237
293
  def setVmOS_ID(newValue)
238
- xml.xpath('ovf:Envelope/ovf:VirtualSystem/ovf:OperatingSystemSection')[0]['ovf:id'] = newValue.to_s
294
+ getChildByName(virtualSystem, 'OperatingSystemSection')['ovf:id'] = newValue.to_s
239
295
  end
240
296
 
241
297
 
@@ -248,22 +304,21 @@ class VmPackage
248
304
  end
249
305
 
250
306
  def setVirtualQuantity(resource, newValue)
251
- xml.xpath('ovf:Envelope/ovf:VirtualSystem/ovf:VirtualHardwareSection/ovf:Item').each { |node|
307
+ getChildrenByName(getChildByName(virtualSystem, 'VirtualHardwareSection'), 'Item').each { |node|
252
308
  resourceType = node.xpath('rasd:ResourceType')[0].text
253
309
  resourceType == resource.to_s ? (node.xpath('rasd:VirtualQuantity')[0].content = newValue) : next
254
310
  }
255
311
  end
256
312
 
257
313
  def setVmNetworks(networks)
258
- networkSection = xml.xpath('ovf:Envelope/ovf:NetworkSection')[0]
259
- networkNodes = networkSection.xpath('ovf:Network')
260
-
314
+ networkNodes = getChildrenByName(networkSection, 'Network')
315
+
261
316
  networkNodes.each { |node|
262
317
  updated_network = networks.detect { |network| network.location == node['name'] }
263
318
  if(updated_network.nil?)
264
319
  node.unlink
265
320
  else
266
- descriptionNode = node.xpath('ovf:Description')[0]
321
+ descriptionNode = getChildByName(node, 'Description')
267
322
  if((updated_network.notes == '' || updated_network.notes.nil?) && !descriptionNode.nil?)
268
323
  descriptionNode.unlink
269
324
  elsif(updated_network.notes != '' && !updated_network.notes.nil?)
@@ -284,14 +339,11 @@ class VmPackage
284
339
  end
285
340
 
286
341
  def setVmDisks(disks)
287
- fileSection = xml.xpath('ovf:Envelope/ovf:References')[0]
288
- fileNodes = fileSection.xpath('ovf:File')
289
-
290
- diskSection = xml.xpath('ovf:Envelope/ovf:DiskSection')[0]
291
- diskNodes = diskSection.xpath('ovf:Disk')
342
+ fileNodes = getChildrenByName(references, 'File')
343
+ diskNodes = getChildrenByName(diskSection, 'Disk')
292
344
 
293
345
  icons = Array.new
294
- xml.xpath('ovf:Envelope/ovf:VirtualSystem/ovf:ProductSection/ovf:Icon').each { |node|
346
+ getChildrenByName(getChildByName(virtualSystem, 'ProductSection'), 'Icon').each { |node|
295
347
  icons.push(node['fileRef'])
296
348
  }
297
349
 
@@ -317,7 +369,7 @@ class VmPackage
317
369
  disks.each { |disk|
318
370
  if( (fileNodes.detect { |node| disk.location == node['href'] }).nil?)
319
371
  diskSection.add_child(xml.create_element('Disk', {'ovf:capacity' => disk.size.to_s, 'ovf:capacityAllocationUnits' => "byte * 2^30", 'ovf:diskId' => disk.name, 'ovf:fileRef' => disk.name + '_disk', 'ovf:format' => "http://www.vmware.com/interfaces/specifications/vmdk.html#streamOptimized" }))
320
- fileSection.add_child(xml.create_element('File', {'ovf:href' => disk.location, 'ovf:id' => disk.name + '_disk'}))
372
+ references.add_child(xml.create_element('File', {'ovf:href' => disk.location, 'ovf:id' => disk.name + '_disk'}))
321
373
  end
322
374
  }
323
375
  end
@@ -344,17 +396,17 @@ class VmPackage
344
396
  end
345
397
 
346
398
  def setProductIcon(new_icon, productNode)
347
- iconNode = productNode.xpath('ovf:Icon')[0]
399
+ iconNode = getChildByName(productNode, 'Icon')
348
400
  if((new_icon == '' || new_icon.nil?) && !iconNode.nil?)
349
- (xml.xpath('ovf:Envelope/ovf:References/ovf:File').detect { |fileNode| fileNode['id'] == iconNode['fileRef']}).unlink
401
+ getChildrenByName(references, 'File').detect { |fileNode| fileNode['id'] == iconNode['fileRef']}.unlink
350
402
  iconNode.unlink
351
403
  elsif(new_icon != '' && !new_icon.nil?)
352
404
  if(iconNode.nil?)
353
405
  productNode.add_child(xml.create_element('Icon', {'ovf:fileRef' => productNode['class'] + '_icon'}))
354
- xml.xpath('ovf:Envelope/ovf:References')[0].add_child(xml.create_element('File', {'ovf:id' => productNode['class'] + '_icon', 'ovf:href' => new_icon}))
406
+ references.add_child(xml.create_element('File', {'ovf:id' => productNode['class'] + '_icon', 'ovf:href' => new_icon}))
355
407
  else
356
408
  productNode.add_child(iconNode)
357
- (xml.xpath('ovf:Envelope/ovf:References/ovf:File').detect { |fileNode| fileNode['id'] == iconNode['fileRef']})['ovf:href'] = new_icon
409
+ getChildrenByName(references, 'File').detect { |fileNode| fileNode['id'] == iconNode['fileRef']}['ovf:href'] = new_icon
358
410
  end
359
411
  end
360
412
  end
@@ -430,7 +482,11 @@ class VmPackage
430
482
  node = Nokogiri::XML::Comment.new(xml.doc, ' skeleton framework constructed by OVFparse ')
431
483
  xml.doc.children[0].add_previous_sibling(node)
432
484
  end
433
- return builder.to_xml
485
+
486
+ newPackage = NewVmPackage.new
487
+ newPackage.xml = builder.doc
488
+ newPackage.loadElementRefs
489
+ return newPackage
434
490
  end
435
491
 
436
492
  def write_xml(file)
@@ -452,19 +508,12 @@ end
452
508
  class HttpVmPackage < VmPackage
453
509
  def fetch
454
510
  url = URI.parse(URI.escape(self.uri))
455
- Net::HTTP.start(url.host) { |http|
456
- resp = http.get(url.path)
457
- open(@name, "wb") { |file|
458
- file.write(resp.body)
459
- }
460
- }
461
-
462
- @xml = Nokogiri::XML(File.open(@name)) do |config|
463
- config.strict.noent
464
- config.strict
511
+
512
+ @xml = Nokogiri::XML(open(url)) do |config|
513
+ config.noblanks.strict.noent
465
514
  end
466
515
 
467
- File.unlink(@name)
516
+ loadElementRefs
468
517
  end
469
518
  end
470
519
 
@@ -486,6 +535,7 @@ class HttpsVmPackage < VmPackage
486
535
  end
487
536
 
488
537
  File.unlink(@name)
538
+ loadElementRefs
489
539
  end
490
540
 
491
541
 
@@ -505,6 +555,7 @@ class FtpVmPackage < VmPackage
505
555
  end
506
556
 
507
557
  File.unlink(@name)
558
+ loadElementRefs
508
559
  end
509
560
  end
510
561
 
@@ -513,6 +564,12 @@ class FileVmPackage < VmPackage
513
564
  @xml = Nokogiri::XML(File.open(self.url)) do |config|
514
565
  config.noblanks.strict.noent
515
566
  end
567
+ loadElementRefs
568
+ end
569
+ end
570
+
571
+ class NewVmPackage < VmPackage
572
+ def initialize
516
573
  end
517
574
  end
518
575
 
@@ -19,13 +19,15 @@ def initialize(uri)
19
19
  @url.downcase
20
20
  end
21
21
 
22
- def self.create uri
22
+ def self.create(uri, managed)
23
23
  (@protocol, @url) = uri.split(":", 2) unless !uri
24
24
  @url.sub!(/^\/{0,2}/, '')
25
25
  @protocol.downcase
26
26
  @url.downcase
27
27
 
28
- if @protocol=='ftp'
28
+ if(managed)
29
+ MarketplaceRepository.new(uri)
30
+ elsif @protocol=='ftp'
29
31
  FtpVmRepository.new(uri)
30
32
  elsif @protocol=='http'
31
33
  HttpVmRepository.new(uri)
@@ -69,8 +71,10 @@ end
69
71
  packages = Array.new
70
72
  package_list.each { |p|
71
73
  package = VmPackage.create(self.uri + "/" + p)
74
+ package.base_path = self.uri + "/"
72
75
  package.name = p
73
- package.state = VmPackage::UNKNOWN
76
+ # @todo remove this, or fix it. Supposed to be handled with a COPS mix-in
77
+ # package.state = VmPackage::UNKNOWN
74
78
  packages.push(package)
75
79
  }
76
80
 
data/lib/ovfparse.rb CHANGED
@@ -8,9 +8,11 @@ path = File.expand_path(File.dirname(__FILE__))
8
8
 
9
9
  require path + '/ovfparse/vmrepository'
10
10
  require path + '/ovfparse/vmpackage'
11
+ require path + '/ovfparse/os_id_table'
11
12
  require path + '/ovfparse/esx4_vmrepository'
12
13
  require path + '/ovfparse/file_vmrepository'
13
14
  require path + '/ovfparse/ftp_vmrepository'
14
15
  require path + '/ovfparse/http_vmrepository'
15
16
  require path + '/ovfparse/https_vmrepository'
16
17
  require path + '/ovfparse/vc4_vmrepository'
18
+ require path + '/ovfparse/marketplace_repository'
data/lib/test.rb CHANGED
@@ -40,7 +40,7 @@ puts "\n\n****************************\n"
40
40
  #
41
41
  # package = VmPackage.create("file://ambrosia/public/vmlib/someOVF.ovf")
42
42
  # package = VmPackage.create("http://cops-af-lib.mitre.org//Base OS Package (jeos)-Ubuntu-20090917.ovf")
43
- # package.get
43
+ # package.fetch
44
44
  # puts package.xml
45
45
  # puts package.ProductSection
46
46
  #
@@ -52,7 +52,7 @@ puts "\n\n****************************\n"
52
52
  # puts "uri: " + vmRepo.uri + "\n"
53
53
  # packages = vmRepo.fetch
54
54
  # ovfTest = packages[1]
55
- # ovfTest.get
55
+ # ovfTest.fetch
56
56
  # puts ovfTest.xml
57
57
  #
58
58
  # uri = "ftp://localhost/repo"
@@ -63,7 +63,7 @@ puts "\n\n****************************\n"
63
63
  # puts "uri: " + vmRepo.uri + "\n"
64
64
  # packages = vmRepo.fetch
65
65
  # ovfTest = packages[1]
66
- # ovfTest.get
66
+ # ovfTest.fetch
67
67
 
68
68
 
69
69
  #
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ovfparse
3
3
  version: !ruby/object:Gem::Version
4
- hash: 165
4
+ hash: 161
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 93
10
- version: 0.0.93
9
+ - 95
10
+ version: 0.0.95
11
11
  platform: ruby
12
12
  authors:
13
13
  - Jim Barkley
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-04-13 00:00:00 -04:00
18
+ date: 2011-04-18 00:00:00 -04:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -49,6 +49,8 @@ files:
49
49
  - lib/ovfparse/ftp_vmrepository.rb
50
50
  - lib/ovfparse/http_vmrepository.rb
51
51
  - lib/ovfparse/https_vmrepository.rb
52
+ - lib/ovfparse/marketplace_repository.rb
53
+ - lib/ovfparse/os_id_table.rb
52
54
  - lib/ovfparse/vc4_vmrepository.rb
53
55
  - lib/ovfparse/vc_repository.rb
54
56
  - lib/ovfparse/vmpackage.rb