networkmanager-dbus 0.0.1 → 0.1.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.
Files changed (59) hide show
  1. data/Guardfile +5 -1
  2. data/README.md +20 -2
  3. data/Rakefile +13 -1
  4. data/TODO.md +3 -3
  5. data/examples/change_ip.rb +17 -0
  6. data/examples/connectivity.rb +1 -1
  7. data/lib/dbus_interface.rb +14 -5
  8. data/lib/dbus_interface/class.rb +28 -4
  9. data/lib/dbus_interface/connection.rb +58 -0
  10. data/lib/dbus_interface/object.rb +15 -7
  11. data/lib/network_manager.rb +3 -2
  12. data/lib/network_manager/dbus.rb +2 -0
  13. data/lib/network_manager/dbus/device.rb +9 -7
  14. data/lib/network_manager/dbus/root.rb +8 -4
  15. data/lib/network_manager/dbus/settings.rb +18 -5
  16. data/lib/network_manager/dbus/settings_connection.rb +86 -0
  17. data/lib/network_manager/ip4_config.rb +33 -0
  18. data/lib/network_manager/version.rb +1 -1
  19. data/lib/networkmanager-dbus.rb +1 -1
  20. data/networkmanager-dbus.gemspec +4 -0
  21. data/script/console +7 -0
  22. data/script/spec_server +1 -0
  23. data/spec/fixtures/active_connections.yml +10 -0
  24. data/spec/fixtures/devices.yml +18 -37
  25. data/spec/fixtures/dhcp4_configs.yml +17 -0
  26. data/spec/fixtures/ip4_configs.yml +7 -0
  27. data/spec/fixtures/settings.yml +4 -14
  28. data/spec/fixtures/settings_connections.yml +10 -0
  29. data/spec/lib/dbus_interface/class_spec.rb +31 -0
  30. data/spec/lib/dbus_interface/object_spec.rb +32 -0
  31. data/spec/{network_manager → lib/network_manager}/dbus/active_connection_spec.rb +6 -6
  32. data/spec/lib/network_manager/dbus/device_spec.rb +58 -0
  33. data/spec/lib/network_manager/dbus/dhcp4_config_spec.rb +19 -0
  34. data/spec/lib/network_manager/dbus/ethernet_device_spec.rb +14 -0
  35. data/spec/lib/network_manager/dbus/ip4_config_spec.rb +19 -0
  36. data/spec/lib/network_manager/dbus/root_spec.rb +38 -0
  37. data/spec/lib/network_manager/dbus/settings_connection_spec.rb +69 -0
  38. data/spec/lib/network_manager/dbus/settings_spec.rb +53 -0
  39. data/spec/lib/network_manager/ip4_config_spec.rb +27 -0
  40. data/spec/{network_manager_spec.rb → lib/network_manager_spec.rb} +2 -0
  41. data/spec/mocks/dbus/ethernet_device_mock.rb +5 -0
  42. data/spec/mocks/dbus/root_mock.rb +14 -0
  43. data/spec/mocks/dbus/settings_connection_mock.rb +21 -0
  44. data/spec/mocks/dbus/settings_mock.rb +9 -0
  45. data/spec/mocks/dbus_mock.rb +33 -0
  46. data/spec/mocks/init.rb +18 -0
  47. data/spec/mocks/system_bus_mock.rb +5 -0
  48. data/spec/mocks/system_bus_service_mock.rb +9 -0
  49. data/spec/spec_helper.rb +22 -3
  50. data/spec/support/fixture_helper.rb +21 -4
  51. metadata +96 -28
  52. data/lib/network_manager/ip4_helper.rb +0 -14
  53. data/spec/network_manager/dbus/device_spec.rb +0 -36
  54. data/spec/network_manager/dbus/dhcp4_config_spec.rb +0 -14
  55. data/spec/network_manager/dbus/ethernet_device_spec.rb +0 -21
  56. data/spec/network_manager/dbus/ip4_config_spec.rb +0 -14
  57. data/spec/network_manager/dbus/root_spec.rb +0 -22
  58. data/spec/network_manager/dbus/settings_connection_spec.rb +0 -13
  59. data/spec/network_manager/dbus/settings_spec.rb +0 -30
@@ -1,4 +1,90 @@
1
1
  class NetworkManager::DBus::SettingsConnection
2
+ class SecretsCacheInvalidError < StandardError; end
3
+
4
+ HW_TYPE_ETHERNET = '802-3-ethernet'
5
+ HW_TYPE_WIRELESS = '802-11-wireless'
6
+ HW_TYPE_BLUETOOTH = 'bluetooth'
7
+ SW_TYPE_VPN = 'vpn'
8
+ SW_TYPE_BRIDGE = 'bridge'
9
+
2
10
  include DBusInterface::Object
11
+ no_properties!
3
12
  map_dbus :default_iface => 'org.freedesktop.NetworkManager.Settings.Connection'
13
+
14
+ def settings
15
+ call('GetSettings').first
16
+ end
17
+
18
+ def delete
19
+ call('Delete')
20
+ end
21
+
22
+ def secrets(name = '')
23
+ call('GetSecrets', name)
24
+ rescue DBus::Error => e
25
+ raise SecretsCacheInvalidError.new("Secrets cache invalid (#{e})")
26
+ end
27
+
28
+ def name
29
+ settings['connection']['id']
30
+ end
31
+
32
+ def uuid
33
+ settings['connection']['uuid']
34
+ end
35
+
36
+ def type
37
+ settings['connection']['type']
38
+ end
39
+
40
+ def update(hash)
41
+ new_settings = hash.dup
42
+ unless new_settings.has_key? 'connection'
43
+ new_settings.merge!(settings)
44
+ end
45
+ call('Update', new_settings)
46
+ end
47
+
48
+ def name=(new_id)
49
+ hash = settings
50
+ hash['connection']['id'] = new_id
51
+ hash.delete 'ipv4'
52
+ update(hash)
53
+ end
54
+
55
+ IPV4_METHOD_AUTO = 'auto'
56
+ IPV4_METHOD_MANUAL = 'manual'
57
+
58
+ def ip4=(ip4)
59
+ hash = settings
60
+ hash['ipv4'] = ip4
61
+ update(hash)
62
+ end
63
+
64
+ def ip4_auto!
65
+ self.ip4 = {'method' => IPV4_METHOD_AUTO}
66
+ end
67
+
68
+ def ip4_manual=(addresses)
69
+ # ensure wrapper array
70
+ addresses = [addresses] unless addresses.is_a? Array
71
+
72
+ self.ip4 = {
73
+ 'method' => IPV4_METHOD_MANUAL,
74
+ 'addresses' => ['aau', addresses.map{|a| a.to_nm_au}]
75
+ }
76
+ end
77
+
78
+ def ip4
79
+ if ipv4 = settings['ipv4']
80
+ if ipv4['method'] == IPV4_METHOD_MANUAL
81
+ address = ipv4['addresses'].first
82
+ NetworkManager::Ip4Config.from_nm_au *address
83
+ else
84
+ IPV4_METHOD_AUTO
85
+ end
86
+ else
87
+ nil
88
+ end
89
+ end
4
90
  end
@@ -0,0 +1,33 @@
1
+ class NetworkManager::Ip4Config
2
+ attr_accessor :address, :gateway
3
+
4
+ def self.from_dot_notation(address, subnet = '255.255.255.0', gateway = '0.0.0.0')
5
+ obj = self.new
6
+ obj.address = IPAddress::IPv4.new(address)
7
+ obj.address.netmask = subnet
8
+ obj.gateway = IPAddress::IPv4.new(gateway)
9
+ obj.gateway.netmask = subnet
10
+ obj
11
+ end
12
+
13
+ def self.from_nm_au(address_u32, prefix = 0, gateway_u32 = 0)
14
+ obj = self.new
15
+ obj.address = revert_octects(IPAddress::IPv4.parse_u32(address_u32))
16
+ obj.address.prefix = prefix
17
+ obj.gateway = revert_octects(IPAddress::IPv4.parse_u32(gateway_u32))
18
+ obj.gateway.prefix = prefix
19
+ obj
20
+ end
21
+
22
+ def to_nm_au
23
+ [revert_octects(address).to_i, address.prefix.to_i, revert_octects(gateway).to_i]
24
+ end
25
+
26
+ def self.revert_octects(ipv4)
27
+ IPAddress::IPv4.new(ipv4.octets.reverse.join('.'))
28
+ end
29
+
30
+ def revert_octects(ipv4)
31
+ self.class.revert_octects(ipv4)
32
+ end
33
+ end
@@ -1,3 +1,3 @@
1
1
  module NetworkManager
2
- VERSION = "0.0.1"
2
+ VERSION = "0.1.0"
3
3
  end
@@ -1 +1 @@
1
- require "network_manager"
1
+ require File.join(File.dirname(__FILE__), "network_manager")
@@ -20,11 +20,15 @@ Gem::Specification.new do |s|
20
20
 
21
21
  # dependencies
22
22
  s.add_development_dependency "rake"
23
+ s.add_development_dependency "pry"
23
24
  s.add_development_dependency "rspec"
25
+ s.add_development_dependency "rr"
24
26
  s.add_development_dependency "guard"
25
27
  s.add_development_dependency "guard-shell"
28
+ s.add_development_dependency "growl-rspec"
26
29
  s.add_development_dependency "growl"
27
30
  s.add_development_dependency "json"
28
31
  s.add_development_dependency "marilyn-rpc"
32
+ s.add_runtime_dependency 'ipaddress'
29
33
  s.add_runtime_dependency "ruby-dbus"
30
34
  end
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ project_dir = File.expand_path(File.dirname(__FILE__))
4
+ require File.join(project_dir, '../lib/networkmanager-dbus')
5
+ require 'pry'
6
+
7
+ Pry.start
@@ -8,6 +8,7 @@ class RSpecRunner < MarilynRPC::Service
8
8
  register :rspec
9
9
 
10
10
  def run()
11
+ ENV['RSPEC_FORMAT'] = 'remote'
11
12
  `rspec`
12
13
  end
13
14
  end
@@ -0,0 +1,10 @@
1
+ "/org/freedesktop/NetworkManager/ActiveConnection/0":
2
+ properties:
3
+ "Connection": "/org/freedesktop/NetworkManager/Settings/0"
4
+ "SpecificObject": "/"
5
+ "Uuid": "f6ea104f-48aa-4925-b4c7-4e7ae561099c"
6
+ "Devices": ["/org/freedesktop/NetworkManager/Devices/0"]
7
+ "State": 2
8
+ "Default": no
9
+ "Default6": no
10
+ "Vpn": no
@@ -1,4 +1,4 @@
1
- 0:
1
+ "/org/freedesktop/NetworkManager/Device/0":
2
2
  properties:
3
3
  "Interface": "eth0"
4
4
  "Ip4Address": 1698212032
@@ -22,39 +22,20 @@
22
22
  "PermHwAddress": "08:00:27:FB:3B:10"
23
23
  "Speed": 1000
24
24
  "Carrier": yes
25
- ip4_config:
26
- 0:
27
- properties:
28
- "Addresses": [ [1698212032, 24, 0] ]
29
- "Nameservers": []
30
- "WinsServers": []
31
- "Domains": []
32
- "Routes": []
33
- dhcp4_config:
34
- properties:
35
- "Options":
36
- "4163": "4163"
37
- "1500": "1500"
38
- "subnet_cidr": "24"
39
- "broadcast_address": "192.168.56.255"
40
- "dhcp_message_type": "5"
41
- "eth0": "eth0"
42
- "dhcp_lease_time": "3600"
43
- "ip_address": "192.168.56.101"
44
- "subnet_mask": "255.255.255.0"
45
- "0": "0"
46
- "202": "202"
47
- "lookup-hostname": "lookup-hostname"
48
- "network_number": "192.168.56.0"
49
- "dhcp_server_identifier": "192.168.56.100"
50
- active_connection:
51
- properties:
52
- "Connection": "/org/freedesktop/NetworkManager/Settings/0"
53
- "SpecificObject": "/"
54
- "Uuid": "9bd14d22-6da6-45d0-b68a-596c3c3297c2"
55
- "Devices": ["/org/freedesktop/NetworkManager/Devices/0"]
56
- "State": 2
57
- "Default": no
58
- "Default6": no
59
- "Vpn": no
60
-
25
+ "/org/freedesktop/NetworkManager/Device/1":
26
+ properties:
27
+ "Udi": "/sys/devices/pci0000:00/0000:00:03.0/net/eth1"
28
+ "Interface": "eth1"
29
+ "IpInterface": ""
30
+ "Driver": "e1000"
31
+ "Capabilities": 3
32
+ "Ip4Address": 0
33
+ "State": 30
34
+ "ActiveConnection": "/"
35
+ "Ip4Config": "/"
36
+ "Dhcp4Config": "/"
37
+ "Ip6Config": "/"
38
+ "Dhcp6Config": "/"
39
+ "Managed": yes
40
+ "FirmwareMissing": no
41
+ "DeviceType": 1
@@ -0,0 +1,17 @@
1
+ "/org/freedesktop/NetworkManager/DHCP4Config/0":
2
+ properties:
3
+ "Options":
4
+ "4163": "4163"
5
+ "1500": "1500"
6
+ "subnet_cidr": "24"
7
+ "broadcast_address": "192.168.56.255"
8
+ "dhcp_message_type": "5"
9
+ "eth0": "eth0"
10
+ "dhcp_lease_time": "3600"
11
+ "ip_address": "192.168.56.101"
12
+ "subnet_mask": "255.255.255.0"
13
+ "0": "0"
14
+ "202": "202"
15
+ "lookup-hostname": "lookup-hostname"
16
+ "network_number": "192.168.56.0"
17
+ "dhcp_server_identifier": "192.168.56.100"
@@ -0,0 +1,7 @@
1
+ "/org/freedesktop/NetworkManager/IP4Config/1":
2
+ properties:
3
+ "Addresses": [ [1698212032, 24, 0] ]
4
+ "Nameservers": []
5
+ "WinsServers": []
6
+ "Domains": []
7
+ "Routes": []
@@ -1,14 +1,4 @@
1
- properties:
2
- Hostname: 'dev-vm'
3
- CanModify: yes
4
- connections:
5
- -
6
- settings:
7
- "connection":
8
- "id": "Wired connection 1"
9
- "uuid": "6190ee1e-c5c5-41f5-8de3-500d229970f9"
10
- "timestamp": "1320083832"
11
- "type": "802-3-ethernet"
12
- "802-3-ethernet":
13
- "s390-options": {}
14
- "mac-address": [8, 0, 39, 251, 59, 16]
1
+ "/org/freedesktop/NetworkManager/Settings":
2
+ properties:
3
+ Hostname: 'dev-vm'
4
+ CanModify: yes
@@ -0,0 +1,10 @@
1
+ "/org/freedesktop/NetworkManager/SettingsConnection/0":
2
+ settings:
3
+ "connection":
4
+ "id": "Wired connection 1"
5
+ "uuid": "6190ee1e-c5c5-41f5-8de3-500d229970f9"
6
+ "timestamp": "1320083832"
7
+ "type": "802-3-ethernet"
8
+ "802-3-ethernet":
9
+ "s390-options": {}
10
+ "mac-address": [8, 0, 39, 251, 59, 16]
@@ -0,0 +1,31 @@
1
+ require 'spec_helper'
2
+
3
+ describe "DBusInterface::Class" do
4
+
5
+ it 'should map_dbus :default_iface' do
6
+ module AWorkingDummyInterface
7
+ extend ::DBusInterface::Class
8
+ map_dbus :default_iface => 'foo.bar', :object_path => 'foo/bar'
9
+ end
10
+ AWorkingDummyInterface.default_iface.should == 'foo.bar'
11
+ AWorkingDummyInterface.object_path.should == 'foo/bar'
12
+ end
13
+
14
+ it 'should raise if map_dbus lacks :default_iface' do
15
+ lambda do
16
+ module ABrokenDummyInterface
17
+ extend ::DBusInterface::Class
18
+ map_dbus :foo => 'bar'
19
+ end
20
+ end.should raise_error(ArgumentError, 'map_dbus must specify at least :default_iface')
21
+ end
22
+
23
+ it 'should raise if map_dbus lacks :default_iface' do
24
+ lambda do
25
+ module ABrokenDummyInterface
26
+ extend ::DBusInterface::Class
27
+ map_dbus 123
28
+ end
29
+ end.should raise_error(ArgumentError, 'map_dbus must receive a Hash instead of Fixnum')
30
+ end
31
+ end
@@ -0,0 +1,32 @@
1
+ require 'spec_helper'
2
+
3
+ describe "DBusInterface::Object" do
4
+
5
+ it 'should use default object_path' do
6
+ class ADummyObject
7
+ include ::DBusInterface::Object
8
+ map_dbus :default_iface => 'foo.bar', :object_path => 'foo/bar'
9
+ end
10
+ ADummyObject.new.object_path.should == 'foo/bar'
11
+ end
12
+
13
+ it 'should use overwrite object_path' do
14
+ class ADummyObject
15
+ include ::DBusInterface::Object
16
+ map_dbus :default_iface => 'foo.bar', :object_path => 'foo/bar'
17
+ end
18
+ ADummyObject.new('boo/laa').object_path.should == 'boo/laa'
19
+ end
20
+
21
+ it 'should return nil if call is on empty object path' do
22
+ dbus_interface_mock
23
+ class ADummyObject
24
+ include ::DBusInterface::Object
25
+ map_dbus :default_iface => 'foo.bar', :object_path => 'foo/bar'
26
+ end
27
+
28
+ pending 'needs better mocking here'
29
+ ADummyObject.new('/').properties.should be_nil
30
+ ADummyObject.new(nil).properties.should be_nil
31
+ end
32
+ end
@@ -2,18 +2,18 @@ require 'spec_helper'
2
2
 
3
3
  describe "NetworkManager::DBus::ActiveConnection" do
4
4
  before :each do
5
- @devices = fixture('devices.yml')
6
- @device = @devices[0]
7
- @config = @device['active_connection']
5
+ @data = fixture('active_connections.yml')
6
+ @object_paths = object_paths_from_fixture('active_connections.yml')
8
7
  end
9
-
8
+
10
9
  it 'should map interface "org.freedesktop.NetworkManager.Connection.Active"' do
11
10
  NetworkManager::DBus::ActiveConnection.default_iface.should ==
12
11
  'org.freedesktop.NetworkManager.Connection.Active'
13
12
  end
14
13
 
15
14
  it 'shoud list properties' do
16
- config = NetworkManager::DBus::ActiveConnection.new @device['properties']['ActiveConnection']
17
- config.properties.should == @config['properties']
15
+ network_manager_dbus_mock
16
+ con = NetworkManager::DBus::ActiveConnection.new @object_paths.first
17
+ con.properties.should == @data.first.last['properties']
18
18
  end
19
19
  end
@@ -0,0 +1,58 @@
1
+ require 'spec_helper'
2
+
3
+ describe "NetworkManager::DBus::Device" do
4
+ before :each do
5
+ @devices = fixture('devices.yml')
6
+ @object_paths = object_paths_from_fixture('devices.yml')
7
+ end
8
+
9
+ describe "NM_DEVICE_TYPE" do
10
+ before :each do
11
+ network_manager_dbus_mock
12
+ @nm_device_type = NetworkManager::DBus::Device::NM_DEVICE_TYPE__PROPERTY
13
+ @device = NetworkManager::DBus::Device.new @object_paths.first
14
+ end
15
+
16
+ describe "NM_DEVICE_TYPE_ETHERNET" do
17
+ it "should detect ethernet devices with NM_DEVICE_TYPE_ETHERNET" do
18
+ @device.properties[@nm_device_type] =
19
+ NetworkManager::DBus::Device::NM_DEVICE_TYPE_ETHERNET
20
+ @device.ethernet?.should == true
21
+ end
22
+
23
+ it "should not detect ethernet devices withour NM_DEVICE_TYPE_ETHERNET" do
24
+ @device.properties[@nm_device_type] = 1234567
25
+ @device.ethernet?.should == false
26
+ end
27
+
28
+ it "should instantiate ethernet devices" do
29
+ @device.properties[@nm_device_type] =
30
+ NetworkManager::DBus::Device::NM_DEVICE_TYPE_ETHERNET
31
+ @device.ethernet.class.should == NetworkManager::DBus::EthernetDevice
32
+ end
33
+
34
+ it "should not instantiate unknown device types" do
35
+ @device.properties[@nm_device_type] = 12345123
36
+ @device.ethernet.should == nil
37
+ end
38
+ end
39
+ end
40
+
41
+ it "should provide ip4_address" do
42
+ network_manager_dbus_mock
43
+ device = NetworkManager::DBus::Device.new @object_paths.first
44
+ device.ip4_address.to_s.should == '192.168.56.101'
45
+ end
46
+
47
+ it 'should provide ip4_config' do
48
+ network_manager_dbus_mock
49
+ device = NetworkManager::DBus::Device.new @object_paths.first
50
+ device.ip4_config.class.should == NetworkManager::DBus::Ip4Config
51
+ end
52
+
53
+ it 'should provide active_connection' do
54
+ network_manager_dbus_mock
55
+ device = NetworkManager::DBus::Device.new @object_paths.first
56
+ device.active_connection.class.should == NetworkManager::DBus::ActiveConnection
57
+ end
58
+ end