netman and userman throws exceptions and other bugfixes.
diff --git a/netman.py b/netman.py
index 38ee9d3..377833d 100755
--- a/netman.py
+++ b/netman.py
@@ -1,10 +1,12 @@
#!/usr/bin/env python
-from subprocess import call
+from subprocess import call, Popen, PIPE
import sys
import subprocess
import dbus
import string
+import socket
+import re
import os
import fcntl
import glib
@@ -56,38 +58,81 @@
def setNetworkProvider(self, provider):
self.provider = provider
- def _setAddr (self, op, device, ipaddr, netmask, family, flags, scope, gateway):
- netprov = network_providers [self.provider]
- bus_name = netprov ['bus_name']
- obj_path = netprov ['ip_object_name']
- intf_name = netprov ['ip_if_name']
+ def _isvaliddev(self, device):
+ devices = os.listdir ("/sys/class/net")
+ if not device in devices : return False
+ else: return True
- obj = self.bus.get_object(bus_name, obj_path)
- intf = dbus.Interface(obj, intf_name)
- if (op == "add"):
- return intf.AddAddress (device, ipaddr, netmask, family, flags, scope, gateway)
+ def _ishwdev (self, device):
+ f = open ("/sys/class/net/"+device+"/type")
+ type = f.read()
+ return False if (int(type) == 772) else True
- if (op == "del"):
- return intf.DelAddress (device, ipaddr, netmask, family, flags, scope, gateway)
+ def _isvalidmask (self, mask):
+ for x in mask.split('.'):
+ try:
+ y = int(x)
+ except:
+ return False
+ if y > 255: return False
+ return mask.count('.') == 3
+
+ def _isvalidmac(self, mac):
+ macre = '([a-fA-F0-9]{2}[:|\-]?){6}'
+ if re.compile(macre).search(mac) : return True
+ else: return False
+
+ def _isvalidip(self, family, ipaddr):
+ if family == socket.AF_INET:
+ try:
+ socket.inet_pton(socket.AF_INET, ipaddr)
+ except AttributeError: # no inet_pton here, sorry
+ try:
+ socket.inet_aton(ipaddr)
+ except socket.error:
+ return False
+ return ipaddr.count('.') == 3
+ except socket.error: # not a valid address
+ return False
+
+ return True
+
+ elif family == socket.AF_INET6:
+ try:
+ socket.inet_pton(socket.AF_INET6, ipaddr)
+ except socket.error: # not a valid address
+ return False
+ return True
+
+ else: return False
def _getAddr (self, target, device):
netprov = network_providers [self.provider]
bus_name = netprov ['bus_name']
if (target == "ip"):
- intf_name = netprov ['ip_if_name'] #'org.freedesktop.network1.Network'
- obj_path = netprov ['ip_object_name']
- obj = self.bus.get_object(bus_name, obj_path)
- intf = dbus.Interface(obj, intf_name)
- return intf.GetAddress (device)
+ ipaddr = ""
+ defgw = ""
+ prefixlen = "0"
+
+ proc = subprocess.Popen(["ip", "addr", "show", "dev", device], stdout=PIPE)
+ procout = proc.communicate()
+ if procout:
+ ipout = procout[0].splitlines()[2].strip()
+ ipaddr,prefixlen = ipout.split ()[1].split("/")
+
+ proc = subprocess.Popen(["ip", "route", "show", "dev", device, "default", "0.0.0.0/0"], stdout=PIPE)
+ procout = proc.communicate()
+ if procout[0]:
+ ipout = procout[0].splitlines()[0].strip()
+ defgw = ipout.split ()[2]
+
+ return 2, int(prefixlen), ipaddr, defgw
if (target == "mac"):
- intf_name = netprov ['hw_if_name'] #'org.freedesktop.network1.Link'
- obj_path = netprov ['hw_object_name']
- obj = self.bus.get_object(bus_name, obj_path)
- intf = dbus.Interface(obj, intf_name)
- mac = intf.GetAddress (device)
- print mac
+ proc = subprocess.Popen(["ip", "link", "show", "dev", device], stdout=PIPE)
+ ipout = proc.communicate()[0].splitlines()[1].strip()
+ mac = ipout.split ()[1]
return mac
@dbus.service.method(DBUS_NAME, "", "")
@@ -96,12 +141,16 @@
@dbus.service.method(DBUS_NAME, "s", "x")
def EnableDHCP (self, device):
- confFile = "/etc/systemd/network/10-bmc-" + device + ".network"
- if os.path.exists(confFile):
- return 0
+ if not self._isvaliddev (device) : raise ValueError, "Invalid Device"
+
+ confFile = "/etc/systemd/network/00-bmc-" + device + ".network"
print("Making .network file...")
- networkconf = open (confFile, "w+")
+ try:
+ networkconf = open (confFile, "w+")
+ except IOError:
+ raise IOError, "Failed to open " + confFile
+
networkconf.write ('[Match]'+ '\n')
networkconf.write ('Name=' + (device) + '\n')
networkconf.write ('[Network]' + '\n')
@@ -109,18 +158,28 @@
networkconf.close ()
print("Restarting networkd service...")
- call(["ip", "addr", "flush", device])
- call(["systemctl", "restart", "systemd-networkd.service"])
- return 0
- #return self._setAddr ("add", device, ipaddr, netmask, 2, 0, 253, gateway)
+ rc = call(["ip", "addr", "flush", device])
+ rc = call(["systemctl", "restart", "systemd-networkd.service"])
+ return rc
@dbus.service.method(DBUS_NAME, "ssss", "x")
- def AddAddress4 (self, device, ipaddr, netmask, gateway):
+ def SetAddress4 (self, device, ipaddr, netmask, gateway):
+ if not self._isvaliddev (device) : raise ValueError, "Invalid Device"
+ if not self._isvalidip (socket.AF_INET, ipaddr) : raise ValueError, "Malformed IP Address"
+ if not self._isvalidip (socket.AF_INET, gateway) : raise ValueError, "Malformed GW Address"
+ if not self._isvalidmask (netmask) : raise ValueError, "Invalid Mask"
+
prefixLen = getPrefixLen (netmask)
- confFile = "/etc/systemd/network/10-bmc-" + device + ".network"
+ if prefixLen == 0: raise ValueError, "Invalid Mask"
+
+ confFile = "/etc/systemd/network/00-bmc-" + device + ".network"
print("Making .network file...")
- networkconf = open (confFile, "w+")
+ try:
+ networkconf = open (confFile, "w+")
+ except IOError:
+ raise IOError, "Failed to open " + confFile
+
networkconf.write ('[Match]'+ '\n')
networkconf.write ('Name=' + (device) + '\n')
networkconf.write ('[Network]' + '\n')
@@ -129,32 +188,35 @@
networkconf.close()
print("Restarting networkd service...")
- call(["ip", "addr", "flush", device])
- return 0
- #return self._setAddr ("add", device, ipaddr, netmask, 2, 0, 253, gateway
+ rc = call(["ip", "addr", "flush", device])
+ rc = call(["systemctl", "restart", "systemd-networkd.service"])
+ return rc
- @dbus.service.method(DBUS_NAME, "ssss", "x")
- def DelAddress4 (self, device, ipaddr, netmask, gateway):
- prefixLen = getPrefixLen (netmask)
- confFile = "/etc/systemd/network/10-bmc-" + device + ".network"
- if not (os.path.exists(confFile)):
- return 1
-
- self._setAddr ("del", device, ipaddr, netmask, 2, 0, 253, gateway)
- os.remove (confFile)
- return 0;
-
- @dbus.service.method(DBUS_NAME, "s", "a(iyyus)s")
+ #family, prefixlen, ip, defgw
+ @dbus.service.method(DBUS_NAME, "s", "iyss")
def GetAddress4 (self, device):
+ if not self._isvaliddev (device) : raise ValueError, "Invalid Device"
return self._getAddr ("ip", device)
@dbus.service.method(DBUS_NAME, "s", "s")
def GetHwAddress (self, device):
+ if not self._isvaliddev (device) : raise ValueError, "Invalid Device"
return self._getAddr ("mac", device)
- @dbus.service.method(DBUS_NAME, "s", "i")
- def SetHwAddress (self, mac):
+ @dbus.service.method(DBUS_NAME, "ss", "i")
+ def SetHwAddress (self, device, mac):
+ if not self._isvaliddev (device) : raise ValueError, "Invalid Device"
+ if not self._ishwdev (device) : raise ValueError, "Not a Hardware Device"
+ if not self._isvalidmac (mac) : raise ValueError, "Malformed MAC address"
+
rc = subprocess.call(["fw_setenv", "ethaddr", mac])
+
+ print("Restarting networkd service...")
+ rc = call(["ip", "link", "set", "dev", device, "down"])
+ rc = call(["ip", "link", "set", "dev", device, "address", mac])
+ rc = call(["ip", "link", "set", "dev", device, "up"])
+
+ rc = call(["systemctl", "restart", "systemd-networkd.service"])
return rc
def main():
diff --git a/userman.py b/userman.py
old mode 100755
new mode 100644
index 0488d10..f0042bd
--- a/userman.py
+++ b/userman.py
@@ -61,23 +61,23 @@
@dbus.service.method(INTF_NAME, "s", "x")
def GroupAddUsr (self, groupname):
- if not groupname : return 1
+ if not groupname : raise ValueError("Invalid Groupname")
groups = self.GroupListAll ()
- if groupname in groups: return 1
+ if groupname in groups: raise ValueError("Group ", groupname, " Exists")
r = call (["addgroup", groupname])
return r
- @dbus.service.method(INTF_NAME, "s", "x")
+ #@dbus.service.method(INTF_NAME, "s", "x")
def GroupAddSys (self, groupname):
- if not groupname : return 1
+ if not groupname : raise ValueError("Invalid Groupname")
groups = self.GroupListAll ()
- if groupname in groups: return 1
+ if groupname in groups: raise ValueError("Group ", groupname, " Exists")
r = call (["addgroup", "-S", groupname])
- return 0
+ return r
@dbus.service.method(INTF_NAME, "", "as")
def GroupListUsr (self):
@@ -121,10 +121,10 @@
@dbus.service.method(INTF_NAME, "", "x")
def GroupDel (self, groupname):
- if not groupname : return 1
+ if not groupname : raise ValueError("Invalid Groupname")
groups = Groupsobj.GroupListAll ()
- if groupname not in groups: return 1
+ if groupname not in groups: raise ValueError("No such Group: ", groupname)
r = call (["delgroup", groupname])
return r
@@ -144,14 +144,14 @@
@dbus.service.method(INTF_NAME, "ssss", "x")
def UserAdd (self, gecos, username, groupname, passwd):
- if not username: return 1
+ if not username : raise ValueError("Invalid Username")
- users = self.UserList ()
- if username in users : return 1
+ users = self.UserListAll ()
+ if username in users : raise ValueError("User ", username, " Exists")
if groupname:
groups = Groupsobj.GroupListAll ()
- if groupname not in groups: return 1
+ if groupname not in groups: raise ValueError("No such Group: ", groupname)
opts = ""
if gecos: opts = " -g " + '"' + gecos + '"'
@@ -167,8 +167,8 @@
proc.expect (['New password: ', 'Retype password: '])
proc.sendline (passwd)
- proc.wait()
- return 0
+ r = proc.wait()
+ return r
@dbus.service.method(INTF_NAME, "", "as")
def UserList (self):
@@ -180,6 +180,14 @@
userList.append(userParams[0])
return userList
+ def UserListAll (self):
+ userList = []
+ with open("/etc/passwd", "r") as f:
+ for usent in f:
+ userParams = usent.split (":")
+ userList.append(userParams[0])
+ return userList
+
class UserManUser (dbus.service.Object):
def __init__(self, bus, name):
self.bus = bus
@@ -195,20 +203,20 @@
@dbus.service.method(INTF_NAME, "s", "x")
def UserDel (self, username):
- if not username : return 1
+ if not username : raise ValueError("Invalid Username")
users = Usersobj.UserList ()
- if username not in users : return 1
+ if username not in users : raise ValueError("No such User: ", username)
r = call (["deluser", username])
return r
@dbus.service.method(INTF_NAME, "ss", "x")
def Passwd (self, username, passwd):
- if not username : return 1
+ if not username : raise ValueError("Invalid Username")
users = Usersobj.UserList ()
- if username not in users : return 1
+ if username not in users : raise ValueError("No such User: ", username)
cmd = "passwd" + " " + username
proc = pexpect.spawn (cmd)