blob: 38ee9d3b7f99203d9ebf2e018a1ae649090a8a1f [file] [log] [blame]
Hariharasubramanian Rcd387972016-01-20 07:19:41 -06001#!/usr/bin/env python
2
3from subprocess import call
4import sys
5import subprocess
6import dbus
7import string
8import os
9import fcntl
10import glib
11import gobject
12import dbus.service
13import dbus.mainloop.glib
14
15DBUS_NAME = 'org.openbmc.NetworkManager'
16OBJ_NAME = '/org/openbmc/NetworkManager/Interface'
17
18network_providers = {
Adriana Kobylak88c733b2016-02-03 16:46:58 -060019 'networkd' : {
20 'bus_name' : 'org.freedesktop.network1',
21 'ip_object_name' : '/org/freedesktop/network1/network/default',
22 'hw_object_name' : '/org/freedesktop/network1/link/_31',
Hariharasubramanian R3a224e72016-02-10 12:32:08 -060023 'ip_if_name' : 'org.freedesktop.network1.Network',
24 'hw_if_name' : 'org.freedesktop.network1.Link',
Adriana Kobylak88c733b2016-02-03 16:46:58 -060025 'method' : 'org.freedesktop.network1.Network.SetAddr'
26 },
27 'NetworkManager' : {
28 'bus_name' : 'org.freedesktop.NetworkManager',
29 'ip_object_name' : '/org/freedesktop/NetworkManager',
30 'hw_object_name' : '/org/freedesktop/NetworkManager',
Hariharasubramanian R3a224e72016-02-10 12:32:08 -060031 'ip_if_name' : 'org.freedesktop.NetworkManager',
32 'hw_if_name' : 'org.freedesktop.NetworkManager',
Adriana Kobylak88c733b2016-02-03 16:46:58 -060033 'method' : 'org.freedesktop.NetworkManager' # FIXME:
34 },
Hariharasubramanian Rcd387972016-01-20 07:19:41 -060035}
36
37def getPrefixLen(mask):
Adriana Kobylak88c733b2016-02-03 16:46:58 -060038 prefixLen = sum([bin(int(x)).count('1') for x in mask.split('.')])
39 return prefixLen
Hariharasubramanian Rcd387972016-01-20 07:19:41 -060040
41class IfAddr ():
42 def __init__ (self, family, scope, flags, prefixlen, addr, gw):
43 self.family = family
44 self.scope = scope
45 self.flags = flags
46 self.prefixlen = prefixlen
47 self.addr = addr
48 self.gw = gw
49
50class NetMan (dbus.service.Object):
51 def __init__(self, bus, name):
52 self.bus = bus
53 self.name = name
54 dbus.service.Object.__init__(self,bus,name)
55
56 def setNetworkProvider(self, provider):
57 self.provider = provider
58
Adriana Kobylake150bfd2016-02-01 21:47:34 -060059 def _setAddr (self, op, device, ipaddr, netmask, family, flags, scope, gateway):
Hariharasubramanian Rcd387972016-01-20 07:19:41 -060060 netprov = network_providers [self.provider]
61 bus_name = netprov ['bus_name']
62 obj_path = netprov ['ip_object_name']
Hariharasubramanian R3a224e72016-02-10 12:32:08 -060063 intf_name = netprov ['ip_if_name']
Hariharasubramanian Rcd387972016-01-20 07:19:41 -060064
65 obj = self.bus.get_object(bus_name, obj_path)
66 intf = dbus.Interface(obj, intf_name)
67 if (op == "add"):
Adriana Kobylake150bfd2016-02-01 21:47:34 -060068 return intf.AddAddress (device, ipaddr, netmask, family, flags, scope, gateway)
Hariharasubramanian Rcd387972016-01-20 07:19:41 -060069
70 if (op == "del"):
Adriana Kobylake150bfd2016-02-01 21:47:34 -060071 return intf.DelAddress (device, ipaddr, netmask, family, flags, scope, gateway)
Hariharasubramanian Rcd387972016-01-20 07:19:41 -060072
73 def _getAddr (self, target, device):
74 netprov = network_providers [self.provider]
75 bus_name = netprov ['bus_name']
76
77 if (target == "ip"):
Hariharasubramanian R3a224e72016-02-10 12:32:08 -060078 intf_name = netprov ['ip_if_name'] #'org.freedesktop.network1.Network'
Hariharasubramanian Rcd387972016-01-20 07:19:41 -060079 obj_path = netprov ['ip_object_name']
80 obj = self.bus.get_object(bus_name, obj_path)
81 intf = dbus.Interface(obj, intf_name)
82 return intf.GetAddress (device)
83
84 if (target == "mac"):
Hariharasubramanian R3a224e72016-02-10 12:32:08 -060085 intf_name = netprov ['hw_if_name'] #'org.freedesktop.network1.Link'
Hariharasubramanian Rcd387972016-01-20 07:19:41 -060086 obj_path = netprov ['hw_object_name']
87 obj = self.bus.get_object(bus_name, obj_path)
88 intf = dbus.Interface(obj, intf_name)
89 mac = intf.GetAddress (device)
90 print mac
91 return mac
92
Hariharasubramanian Rcd387972016-01-20 07:19:41 -060093 @dbus.service.method(DBUS_NAME, "", "")
94 def test(self):
95 print("TEST")
96
Hariharasubramanian R3a224e72016-02-10 12:32:08 -060097 @dbus.service.method(DBUS_NAME, "s", "x")
98 def EnableDHCP (self, device):
99 confFile = "/etc/systemd/network/10-bmc-" + device + ".network"
100 if os.path.exists(confFile):
101 return 0
102
103 print("Making .network file...")
104 networkconf = open (confFile, "w+")
105 networkconf.write ('[Match]'+ '\n')
106 networkconf.write ('Name=' + (device) + '\n')
107 networkconf.write ('[Network]' + '\n')
108 networkconf.write ('DHCP=yes')
109 networkconf.close ()
110
111 print("Restarting networkd service...")
112 call(["ip", "addr", "flush", device])
113 call(["systemctl", "restart", "systemd-networkd.service"])
114 return 0
115 #return self._setAddr ("add", device, ipaddr, netmask, 2, 0, 253, gateway)
116
Hariharasubramanian Rcd387972016-01-20 07:19:41 -0600117 @dbus.service.method(DBUS_NAME, "ssss", "x")
118 def AddAddress4 (self, device, ipaddr, netmask, gateway):
119 prefixLen = getPrefixLen (netmask)
Chris Austenb13a3cd2016-02-01 18:18:21 -0600120 confFile = "/etc/systemd/network/10-bmc-" + device + ".network"
Hariharasubramanian Rcd387972016-01-20 07:19:41 -0600121
122 print("Making .network file...")
123 networkconf = open (confFile, "w+")
124 networkconf.write ('[Match]'+ '\n')
125 networkconf.write ('Name=' + (device) + '\n')
126 networkconf.write ('[Network]' + '\n')
127 networkconf.write ('Address=' + ipaddr + '/' + str(prefixLen) + '\n')
128 networkconf.write ('Gateway=' + gateway + '\n')
Chris Austenb13a3cd2016-02-01 18:18:21 -0600129 networkconf.close()
Hariharasubramanian Rcd387972016-01-20 07:19:41 -0600130
131 print("Restarting networkd service...")
Chris Austenb13a3cd2016-02-01 18:18:21 -0600132 call(["ip", "addr", "flush", device])
Hariharasubramanian Rcd387972016-01-20 07:19:41 -0600133 return 0
Chris Austenb13a3cd2016-02-01 18:18:21 -0600134 #return self._setAddr ("add", device, ipaddr, netmask, 2, 0, 253, gateway
Hariharasubramanian Rcd387972016-01-20 07:19:41 -0600135
136 @dbus.service.method(DBUS_NAME, "ssss", "x")
137 def DelAddress4 (self, device, ipaddr, netmask, gateway):
138 prefixLen = getPrefixLen (netmask)
Chris Austenb13a3cd2016-02-01 18:18:21 -0600139 confFile = "/etc/systemd/network/10-bmc-" + device + ".network"
Hariharasubramanian Rcd387972016-01-20 07:19:41 -0600140 if not (os.path.exists(confFile)):
141 return 1
142
143 self._setAddr ("del", device, ipaddr, netmask, 2, 0, 253, gateway)
144 os.remove (confFile)
145 return 0;
146
147 @dbus.service.method(DBUS_NAME, "s", "a(iyyus)s")
148 def GetAddress4 (self, device):
149 return self._getAddr ("ip", device)
150
151 @dbus.service.method(DBUS_NAME, "s", "s")
152 def GetHwAddress (self, device):
153 return self._getAddr ("mac", device)
154
Adriana Kobylak88c733b2016-02-03 16:46:58 -0600155 @dbus.service.method(DBUS_NAME, "s", "i")
156 def SetHwAddress (self, mac):
157 rc = subprocess.call(["fw_setenv", "ethaddr", mac])
158 return rc
159
Hariharasubramanian Rcd387972016-01-20 07:19:41 -0600160def main():
161 dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
162 bus = dbus.SystemBus()
163 name = dbus.service.BusName(DBUS_NAME, bus)
164 obj = NetMan (bus, OBJ_NAME)
165 obj.setNetworkProvider ("networkd")
166 mainloop = gobject.MainLoop()
167 print("Started")
168 mainloop.run()
169
170if __name__ == '__main__':
Adriana Kobylake150bfd2016-02-01 21:47:34 -0600171 sys.exit(main())