ivapi 0.0.6 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +1 -0
  3. data/.rspec +2 -1
  4. data/.travis.yml +7 -0
  5. data/CONTRIBUTING.md +38 -0
  6. data/Gemfile +11 -1
  7. data/Guardfile +13 -0
  8. data/{LICENSE.txt → LICENSE.md} +0 -0
  9. data/README.md +28 -26
  10. data/Rakefile +8 -1
  11. data/ivapi.gemspec +20 -13
  12. data/lib/faraday/response/raise_ivapi_error.rb +24 -0
  13. data/lib/ivapi.rb +6 -30
  14. data/lib/ivapi/authentication.rb +15 -0
  15. data/lib/ivapi/client.rb +27 -0
  16. data/lib/ivapi/client/account.rb +30 -0
  17. data/lib/ivapi/client/server.rb +92 -0
  18. data/lib/ivapi/configuration.rb +43 -0
  19. data/lib/ivapi/connection.rb +29 -0
  20. data/lib/ivapi/error.rb +35 -0
  21. data/lib/ivapi/request.rb +22 -0
  22. data/lib/ivapi/version.rb +1 -1
  23. data/spec/fixtures/account_bonuses.json +20 -0
  24. data/spec/fixtures/account_info.json +42 -0
  25. data/spec/fixtures/account_orders.json +29 -0
  26. data/spec/fixtures/account_services.json +35 -0
  27. data/spec/fixtures/server_change.json +3 -0
  28. data/spec/fixtures/server_domain.json +3 -0
  29. data/spec/fixtures/server_graphs.json +26 -0
  30. data/spec/fixtures/server_info.json +30 -0
  31. data/spec/fixtures/server_os.json +132 -0
  32. data/spec/fixtures/server_reboot.json +3 -0
  33. data/spec/fixtures/server_recreate.json +3 -0
  34. data/spec/fixtures/server_reset_password.json +3 -0
  35. data/spec/fixtures/server_tasks.json +14 -0
  36. data/spec/fixtures/version.json +3 -0
  37. data/spec/ivapi/client/account_spec.rb +34 -0
  38. data/spec/ivapi/client/server_spec.rb +58 -0
  39. data/spec/ivapi/client_spec.rb +13 -0
  40. data/spec/spec_helper.rb +64 -15
  41. metadata +130 -21
  42. data/lib/ivapi/account.rb +0 -32
  43. data/lib/ivapi/base.rb +0 -23
  44. data/lib/ivapi/railtie.rb +0 -26
  45. data/lib/ivapi/server.rb +0 -59
@@ -0,0 +1,43 @@
1
+ require 'faraday'
2
+ require 'ivapi/version'
3
+
4
+ module Ivapi
5
+ module Configuration
6
+ VALID_OPTIONS_KEYS = [
7
+ :adapter,
8
+ :faraday_config_block,
9
+ :username,
10
+ :password,
11
+ :user_agent,
12
+ :server_id
13
+ ].freeze
14
+
15
+ DEFAULT_ADAPTER = Faraday.default_adapter
16
+ DEFAULT_USER_AGENT = "Ivapi Ruby Gem #{Ivapi::VERSION}".freeze
17
+
18
+ attr_accessor(*VALID_OPTIONS_KEYS)
19
+
20
+ def self.extended(base)
21
+ base.reset
22
+ end
23
+
24
+ def configure
25
+ yield self
26
+ end
27
+
28
+ def options
29
+ VALID_OPTIONS_KEYS.inject({}){|o,k| o.merge!(k => send(k)) }
30
+ end
31
+
32
+ def faraday_config(&block)
33
+ @faraday_config_block = block
34
+ end
35
+
36
+ def reset
37
+ self.adapter = DEFAULT_ADAPTER
38
+ self.username = nil
39
+ self.password = nil
40
+ self.user_agent = DEFAULT_USER_AGENT
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,29 @@
1
+ require 'faraday_middleware'
2
+ require 'faraday/response/raise_ivapi_error'
3
+
4
+ module Ivapi
5
+ module Connection
6
+ private
7
+
8
+ def connection(options={})
9
+ connection = Faraday.new(options) do |builder|
10
+
11
+ builder.request :json
12
+
13
+ builder.use Faraday::Response::RaiseIvapiError
14
+ builder.use FaradayMiddleware::FollowRedirects
15
+ builder.use FaradayMiddleware::Mashify
16
+
17
+ builder.use FaradayMiddleware::ParseJson, :content_type => /\bjson$/
18
+
19
+ faraday_config_block.call(builder) if faraday_config_block
20
+
21
+ builder.adapter *adapter
22
+ end
23
+
24
+ connection.headers[:user_agent] = user_agent
25
+
26
+ connection
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,35 @@
1
+ module Ivapi
2
+
3
+ class Error < StandardError
4
+ end
5
+
6
+ # Raised when iv.lt returns a 400 HTTP status code
7
+ class BadRequest < Error; end
8
+
9
+ # Raised when iv.lt returns a 401 HTTP status code
10
+ class Unauthorized < Error; end
11
+
12
+ # Raised when iv.lt returns a 403 HTTP status code
13
+ class Forbidden < Error; end
14
+
15
+ # Raised when iv.lt returns a 404 HTTP status code
16
+ class NotFound < Error; end
17
+
18
+ # Raised when iv.lt returns a 406 HTTP status code
19
+ class NotAcceptable < Error; end
20
+
21
+ # Raised when iv.lt returns a 422 HTTP status code
22
+ class UnprocessableEntity < Error; end
23
+
24
+ # Raised when iv.lt returns a 500 HTTP status code
25
+ class InternalServerError < Error; end
26
+
27
+ # Raised when iv.lt returns a 501 HTTP status code
28
+ class NotImplemented < Error; end
29
+
30
+ # Raised when iv.lt returns a 502 HTTP status code
31
+ class BadGateway < Error; end
32
+
33
+ # Raised when iv.lt returns a 503 HTTP status code
34
+ class ServiceUnavailable < Error; end
35
+ end
@@ -0,0 +1,22 @@
1
+ module Ivapi
2
+ module Request
3
+ def get(path, options={})
4
+ request(:get, path, options).body
5
+ end
6
+
7
+ def request(method, path, options={})
8
+
9
+ conn_options = {
10
+ :url => "https://api.iv.lt"
11
+ }
12
+
13
+ options.merge!(authentication)
14
+
15
+ response = connection(conn_options).send(method) do |request|
16
+ request.url(path, options)
17
+ end
18
+
19
+ response
20
+ end
21
+ end
22
+ end
@@ -1,3 +1,3 @@
1
1
  module Ivapi
2
- VERSION = '0.0.6'
2
+ VERSION = '1.0.0'
3
3
  end
@@ -0,0 +1,20 @@
1
+ [
2
+ {
3
+ "bo_id": "1",
4
+ "bo_created": "2013-03-01 12:12:12",
5
+ "bo_amount": "1.00",
6
+ "bo_description": "SMS +370.61234567 (example)"
7
+ },
8
+ {
9
+ "bo_id": "2",
10
+ "bo_created": "2013-03-02 12:12:12",
11
+ "bo_amount": "2.00",
12
+ "bo_description": "SMS +370.61234568 (example)"
13
+ },
14
+ {
15
+ "bo_id": "3",
16
+ "bo_created": "2013-03-03 12:12:12",
17
+ "bo_amount": "3.00",
18
+ "bo_description": "SMS +370.61234569 (example)"
19
+ }
20
+ ]
@@ -0,0 +1,42 @@
1
+ {
2
+ "ac_id":"1",
3
+ "ac_created":"2012-12-12 12:12:12",
4
+ "ac_company":null,
5
+ "ac_name":"Name Surname",
6
+ "ac_occupation":null,
7
+ "ac_code":"",
8
+ "ac_vat":null,
9
+ "ac_address":"Address",
10
+ "ac_city":"",
11
+ "ac_state":null,
12
+ "ac_zip":null,
13
+ "ac_country":"",
14
+ "ac_phone":"",
15
+ "ac_mobile":null,
16
+ "ac_fax":null,
17
+ "ac_email":"name@test.com",
18
+ "ac_bank_account":null,
19
+ "ac_bank":null,
20
+ "ac_bank_code":null,
21
+ "ac_credit":"0",
22
+ "ac_bonus":"0",
23
+ "ac_contacts":[],
24
+ "ac_users":[
25
+ {
26
+ "us_id":"1",
27
+ "us_created":"2009-10-07 21:50:17",
28
+ "us_inactive":"no",
29
+ "us_subuser":"no",
30
+ "us_nick":"foobar",
31
+ "us_description":null
32
+ },
33
+ {
34
+ "us_id":"2",
35
+ "us_created":"2012-11-06 21:06:53",
36
+ "us_inactive":"no",
37
+ "us_subuser":"yes",
38
+ "us_nick":"foobarapi",
39
+ "us_description":"API"
40
+ }
41
+ ]
42
+ }
@@ -0,0 +1,29 @@
1
+ [
2
+ {
3
+ "or_id": "1",
4
+ "or_created": "2011-11-11 11:11:11",
5
+ "or_paid": null,
6
+ "or_series": null,
7
+ "or_number": null,
8
+ "or_cost": "11.11",
9
+ "or_url": "https://saskaitos.iv.lt/"
10
+ },
11
+ {
12
+ "or_id": "2",
13
+ "or_created": "2012-12-12 12:12:12",
14
+ "or_paid": "2012-12-12 13:12:12",
15
+ "or_series": "IV",
16
+ "or_number": "121212",
17
+ "or_cost": "12.12",
18
+ "or_url": "https://saskaitos.iv.lt/"
19
+ },
20
+ {
21
+ "or_id": "3",
22
+ "or_created": "2013-12-13 13:13:13",
23
+ "or_paid": "2013-12-13 14:13:13",
24
+ "or_series": "IV",
25
+ "or_number": "131313",
26
+ "or_cost": "13.13",
27
+ "or_url": "https://saskaitos.iv.lt/"
28
+ }
29
+ ]
@@ -0,0 +1,35 @@
1
+ [
2
+ {
3
+ "se_id": "1",
4
+ "se_created": "2012-12-12 12:12:12",
5
+ "se_since": "2012-12-12",
6
+ "se_until": "2013-12-12",
7
+ "se_quantity": "1",
8
+ "se_price": "29.00",
9
+ "se_discount": "0",
10
+ "se_unit": "m.",
11
+ "se_description": "Adreso metinis mokestis (example.com)"
12
+ },
13
+ {
14
+ "se_id": "2",
15
+ "se_created": "2013-01-01 12:12:12",
16
+ "se_since": "2013-01-01",
17
+ "se_until": "2014-01-01",
18
+ "se_quantity": "1",
19
+ "se_price": "29.00",
20
+ "se_discount": "0",
21
+ "se_unit": "m.",
22
+ "se_description": "Adreso metinis mokestis (example2.com)"
23
+ },
24
+ {
25
+ "se_id": "3",
26
+ "se_created": "2013-02-02 12:12:12",
27
+ "se_since": "2013-02-02",
28
+ "se_until": "2013-03-02",
29
+ "se_quantity": "1",
30
+ "se_price": "10.00",
31
+ "se_discount": "10",
32
+ "se_unit": "mėn.",
33
+ "se_description": "Serverio nuoma (planas 1GHz:1024MB:10GB:10Mbps, server.example.com)"
34
+ }
35
+ ]
@@ -0,0 +1,3 @@
1
+ {
2
+ "task_id": "14"
3
+ }
@@ -0,0 +1,3 @@
1
+ {
2
+ "task_id": "15"
3
+ }
@@ -0,0 +1,26 @@
1
+ {
2
+ "traffic_daily": "//stats.serveriai.lt/graph.php?Ds252x+6Lek1o0SV2+u99fnC3szdUWyJy6/f2+3Wg72Lg8EjVPuhB+seWKwCtm9ylMBvZbDEgBJ1ozv8DiXg/gw==",
3
+ "traffic_weekly": "//stats.serveriai.lt/graph.php?Ds252x+6Lek1o0SV2+u99fnC3szdUWyJy6/f2+3Wg72KMBurzWeKRYCSdVLNTmWlS77CL7eTdjTkLzJAciTTvVw==",
4
+ "traffic_monthly": "//stats.serveriai.lt/graph.php?Ds252x+6Lek1o0SV2+u99fnC3szdUWyJy6/f2+3Wg72IJIJ2nxhWjMrwzuGGORAgwUKwQu38nWYlplg5wRxTFxA==",
5
+ "traffic_yearly": "//stats.serveriai.lt/graph.php?Ds252x+6Lek1o0SV2+u99fnC3szdUWyJy6/f2+3Wg72JuXq2GVfc4U3IN5b1ttsu/77CL7eTdjTkLzJAciTTvVw==",
6
+ "memory_daily": "//stats.serveriai.lt/graph.php?Ds252x+6Lek1o0SV2+u99fvgG8Tmrj9pWTH4kJUZ5p8dhvV6BorRY7r4eIEWPKbhC6aUajHks7tk9UzFXwFTWWw==",
7
+ "memory_weekly": "//stats.serveriai.lt/graph.php?Ds252x+6Lek1o0SV2+u99fvgG8Tmrj9pWTH4kJUZ5p8coPSkAY/O804FmAbo5Fqw5MBvZbDEgBJ1ozv8DiXg/gw==",
8
+ "memory_monthly": "//stats.serveriai.lt/graph.php?Ds252x+6Lek1o0SV2+u99fvgG8Tmrj9pWTH4kJUZ5p8dsx6X0ZOEADT7QYB6XBaIv77CL7eTdjTkLzJAciTTvVw==",
9
+ "memory_yearly": "//stats.serveriai.lt/graph.php?Ds252x+6Lek1o0SV2+u99fvgG8Tmrj9pWTH4kJUZ5p8dB+gRFK17D/NMNpGQ0jL1PMBvZbDEgBJ1ozv8DiXg/gw==",
10
+ "storage_daily": "//stats.serveriai.lt/graph.php?Ds252x+6Lek1o0SV2+u99foS0JRE/SsbS3LPwnfbWpDHg8EjVPuhB+seWKwCtm9ylMBvZbDEgBJ1ozv8DiXg/gw==",
11
+ "storage_weekly": "//stats.serveriai.lt/graph.php?Ds252x+6Lek1o0SV2+u99foS0JRE/SsbS3LPwnfbWpDGMBurzWeKRYCSdVLNTmWlS77CL7eTdjTkLzJAciTTvVw==",
12
+ "storage_monthly": "//stats.serveriai.lt/graph.php?Ds252x+6Lek1o0SV2+u99foS0JRE/SsbS3LPwnfbWpDEJIJ2nxhWjMrwzuGGORAgwUKwQu38nWYlplg5wRxTFxA==",
13
+ "storage_yearly": "//stats.serveriai.lt/graph.php?Ds252x+6Lek1o0SV2+u99foS0JRE/SsbS3LPwnfbWpDFuXq2GVfc4U3IN5b1ttsu/77CL7eTdjTkLzJAciTTvVw==",
14
+ "load_daily": "//stats.serveriai.lt/graph.php?Ds252x+6Lek1o0SV2+u99fnVCAeEd38I5tKGzFA/vKFWpce72OLQsGNBKIlyaI3VPRJcniVrpCjj+A47DMwkyfQ==",
15
+ "load_weekly": "//stats.serveriai.lt/graph.php?Ds252x+6Lek1o0SV2+u99fnVCAeEd38I5tKGzFA/vKFUneWoB3RXynYY1Os3r4nqJ1/FtFwPGQkKJH2lwumDXzw==",
16
+ "load_monthly": "//stats.serveriai.lt/graph.php?Ds252x+6Lek1o0SV2+u99fnVCAeEd38I5tKGzFA/vKFWZS471Ezj3JICAK6b/LIQF6aUajHks7tk9UzFXwFTWWw==",
17
+ "load_yearly": "//stats.serveriai.lt/graph.php?Ds252x+6Lek1o0SV2+u99fnVCAeEd38I5tKGzFA/vKFXMoKXdsdQEoYOkY4Ri3oJi1/FtFwPGQkKJH2lwumDXzw==",
18
+ "io_daily": "//stats.serveriai.lt/graph.php?Ds252x+6Lek1o0SV2+u99fg/wdjDpwrAo65UaYdgO5Q4AISmB1PxslqPs64YrzSM9IPEGYc9YIvamuCNPzknHrg==",
19
+ "io_weekly": "//stats.serveriai.lt/graph.php?Ds252x+6Lek1o0SV2+u99fnj1ZiSpBuBW3ioC9pzr2JFu+xwrNLSPGuEdd3BcqCJrO+CCnnFdRpsyRaXqzzOvbA==",
20
+ "io_monthly": "//stats.serveriai.lt/graph.php?Ds252x+6Lek1o0SV2+u99fiNJIR4KyNN6HP6Q+4c6IP7/PLCBg5OEa7Yy6ZAUUmTERJcniVrpCjj+A47DMwkyfQ==",
21
+ "io_yearly": "//stats.serveriai.lt/graph.php?Ds252x+6Lek1o0SV2+u99fhz6dgmYsgCwoseMpVHU2LliI5dwBut6KqqQFsscRqGcO+CCnnFdRpsyRaXqzzOvbA==",
22
+ "cpu_daily": "//stats.serveriai.lt/graph.php?Ds252x+6Lek1o0SV2+u99fqhNaiflbCcb6QuGzlRJ9yzb+vWgad6b+QP6lyFG5rCcO+CCnnFdRpsyRaXqzzOvbA==",
23
+ "cpu_weekly": "//stats.serveriai.lt/graph.php?Ds252x+6Lek1o0SV2+u99fqhNaiflbCcb6QuGzlRJ9yy2R1VycHOc6baz3zRB6Am1RJcniVrpCjj+A47DMwkyfQ==",
24
+ "cpu_monthly": "//stats.serveriai.lt/graph.php?Ds252x+6Lek1o0SV2+u99fqhNaiflbCcb6QuGzlRJ9yxK/MZyMfdX4eflJC8xIf8j1/FtFwPGQkKJH2lwumDXzw==",
25
+ "cpu_yearly": "//stats.serveriai.lt/graph.php?Ds252x+6Lek1o0SV2+u99fqhNaiflbCcb6QuGzlRJ9yxZA7jroJOYQwMT3OKsz00xRJcniVrpCjj+A47DMwkyfQ=="
26
+ }
@@ -0,0 +1,30 @@
1
+ {
2
+ "se_id": "3",
3
+ "se_created": "2013-02-02 12:12:12",
4
+ "se_since": "2013-02-02",
5
+ "se_until": "2013-03-02",
6
+ "se_quantity": "1",
7
+ "se_price": "10.00",
8
+ "se_discount": "0",
9
+ "se_unit": "mėn.",
10
+ "se_description": "Serverio nuoma (planas 1GHz:1024MB:10GB:10Mbps, server.example.com)",
11
+ "se_plan": "1GHz:1048MB:10GB:10Mbps",
12
+ "se_domain": "server.example.com",
13
+ "se_cpu": "1",
14
+ "se_ram": "1024",
15
+ "se_quota": "10",
16
+ "se_bandwidth": "10",
17
+ "se_info": {
18
+ "in_node": "Robinija",
19
+ "in_host": "server.example.com",
20
+ "in_bw_in": "37590",
21
+ "in_bw_out": "90048",
22
+ "in_qt_limit": "100352",
23
+ "in_qt_usage": "17432",
24
+ "in_inodes_limit": "1960000",
25
+ "in_inodes_usage": "116232",
26
+ "in_mm_limit": "2048",
27
+ "in_mm_usage": "1297",
28
+ "in_ips": "12.23.34.45"
29
+ }
30
+ }
@@ -0,0 +1,132 @@
1
+ {
2
+ "centos-5-x86": {
3
+ "title": "CentOS 5",
4
+ "arch": "32-bit",
5
+ "url": "http://www.centos.org/"
6
+ },
7
+ "centos-5-x86_64": {
8
+ "title": "CentOS 5",
9
+ "url": "http://www.centos.org/",
10
+ "arch": "64-bit"
11
+ },
12
+ "centos-6-x86": {
13
+ "title": "CentOS 6",
14
+ "arch": "32-bit",
15
+ "url": "http://www.centos.org/"
16
+ },
17
+ "centos-6-x86_64": {
18
+ "url": "http://www.centos.org/",
19
+ "arch": "64-bit",
20
+ "title": "CentOS 6"
21
+ },
22
+ "centos-6-x86_64-webmin": {
23
+ "min_ram": "2048",
24
+ "panel": "yes",
25
+ "title": "Webmin 1.5 (CentOS 6, PHP 5.3)",
26
+ "url": "http://forumas.dedikuoti.lt/showthread.php?p=139",
27
+ "arch": "64-bit"
28
+ },
29
+ "debian-6.0-x86_64-ispconfig": {
30
+ "min_ram": "2048",
31
+ "url": "http://forumas.dedikuoti.lt/showthread.php?p=158",
32
+ "title": "ISPConfig 3 (Debian 6, PHP 5.3)",
33
+ "panel": "yes",
34
+ "arch": "64-bit"
35
+ },
36
+ "centos-6-x86_64-directadmin": {
37
+ "arch": "64-bit",
38
+ "verify": "http://tools.iv.lt/da/licence.php?ip=%s",
39
+ "url": "http://forumas.dedikuoti.lt/showthread.php?p=520",
40
+ "price": "99",
41
+ "min_ram": "2048",
42
+ "title": "DirectAdmin 1.4",
43
+ "panel": "yes"
44
+ },
45
+ "centos-6-x86_64-cs-1.6": {
46
+ "title": "Counter-Strike 1.6",
47
+ "arch": "64-bit",
48
+ "panel": "yes",
49
+ "url": "http://forumas.dedikuoti.lt/showthread.php?p=580",
50
+ "min_ram": "2048"
51
+ },
52
+ "debian-5.0-x86": {
53
+ "title": "Debian 5",
54
+ "arch": "32-bit",
55
+ "url": "http://www.debian.org/"
56
+ },
57
+ "debian-5.0-x86_64": {
58
+ "title": "Debian 5",
59
+ "arch": "64-bit",
60
+ "url": "http://www.debian.org/"
61
+ },
62
+ "debian-6.0-x86": {
63
+ "arch": "32-bit",
64
+ "title": "Debian 6",
65
+ "url": "http://www.debian.org/"
66
+ },
67
+ "debian-6.0-x86_64": {
68
+ "title": "Debian 6",
69
+ "url": "http://www.debian.org/",
70
+ "arch": "64-bit"
71
+ },
72
+ "fedora-15-x86": {
73
+ "arch": "32-bit",
74
+ "title": "Fedora 15",
75
+ "url": "http://fedoraproject.org/"
76
+ },
77
+ "fedora-15-x86_64": {
78
+ "arch": "64-bit",
79
+ "url": "http://fedoraproject.org/",
80
+ "title": "Fedora 15"
81
+ },
82
+ "suse-11.3-x86": {
83
+ "url": "http://www.opensuse.org/",
84
+ "arch": "32-bit",
85
+ "title": "openSUSE 11.3"
86
+ },
87
+ "suse-11.3-x86_64": {
88
+ "title": "openSUSE 11.3",
89
+ "arch": "64-bit",
90
+ "url": "http://www.opensuse.org/"
91
+ },
92
+ "suse-11.4-x86": {
93
+ "url": "http://www.opensuse.org/",
94
+ "arch": "32-bit",
95
+ "title": "openSUSE 11.4"
96
+ },
97
+ "suse-11.4-x86_64": {
98
+ "arch": "64-bit",
99
+ "title": "openSUSE 11.4",
100
+ "url": "http://www.opensuse.org/"
101
+ },
102
+ "ubuntu-10.04-x86": {
103
+ "title": "Ubuntu 10.04",
104
+ "arch": "32-bit",
105
+ "url": "http://www.ubuntu.com/"
106
+ },
107
+ "ubuntu-10.04-x86_64": {
108
+ "url": "http://www.ubuntu.com/",
109
+ "title": "Ubuntu 10.04",
110
+ "arch": "64-bit"
111
+ },
112
+ "ubuntu-11.10-x86": {
113
+ "title": "Ubuntu 11.10",
114
+ "url": "http://www.ubuntu.com/",
115
+ "arch": "32-bit"
116
+ },
117
+ "ubuntu-11.10-x86_64": {
118
+ "title": "Ubuntu 11.10",
119
+ "url": "http://www.ubuntu.com/",
120
+ "arch": "64-bit"
121
+ },
122
+ "ubuntu-12.04-x86": {
123
+ "arch": "32-bit",
124
+ "title": "Ubuntu 12.04",
125
+ "url": "http://www.ubuntu.com/"
126
+ },
127
+ "ubuntu-12.04-x86_64": {
128
+ "url": "http://www.ubuntu.com/",
129
+ "title": "Ubuntu 12.04",
130
+ "arch": "64-bit"
131
+ }
132
+ }