--- /dev/null
+#!/usr/bin/env python
+
+import sys, subprocess
+
+def runcmd(cmd):
+ process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
+ output, error = process.communicate();
+
+ return (output.rstrip(), error.rstrip())
+
+class ParserError(Exception):
+ pass
+
+class Parser:
+ """ Parse nic information """
+
+ def __init__(self):
+ self.__dladm1 = "dladm show-phys -p -o link,media | sed 's/:/ /g'"
+ self.__dladm2 = "dladm show-phys -p -m -o link,address,inuse | sed 's/:/ /g' | sed 's/\\\[[:space:]]/:/g' | sed 's/\\\//g'"
+
+ def __parse_nics(self, text):
+ nics = {}
+ for line in text.splitlines():
+ parts = line.split()
+ #if parts[1] in ('Ethernet', 'Infiniband'):
+ if parts[1] in ('Ethernet'):
+ nics[parts[0]] = [parts[0], parts[1]]
+
+ return nics
+
+ def __parse_macs(self, obj, text):
+ list = []
+ if obj:
+ for line in text.splitlines():
+ parts = line.split()
+ try:
+ if parts[2] == 'yes':
+ del obj[parts[0]]
+ else:
+ obj[parts[0]].append(parts[1])
+ except KeyError:
+ pass
+ for k, v in obj.items():
+ list.append(v)
+
+ return list
+
+ def parse(self):
+ (nics, error) = runcmd(self.__dladm1)
+ if error:
+ raise ParserError(error)
+
+ (macs, error) = runcmd(self.__dladm2)
+ if error:
+ raise ParserError(error)
+
+ return self.__parse_macs(self.__parse_nics(nics), macs)
+
+def get_terminal_width():
+ try:
+ if sys.version_info >= (2,7):
+ width = int(subprocess.check_output(['tput', 'cols']))
+ else:
+ (out, err) = runcmd('tput cols')
+ if err:
+ raise OSError(err);
+ width = int(out)
+ except OSError as e:
+ print("Invalid Command 'tput cols': exit status ({1})".format(e.errno))
+ except subprocess.CalledProcessError as e:
+ print("Command 'tput cols' returned non-zero exit status: ({1})".format(e.returncode))
+ else:
+ return width
+
+def make_menu(interfaces):
+ res = None
+ while not res:
+ sys.stderr.write("\x1b[2J\x1b[H")
+ cols = get_terminal_width()
+ intro = 'The following unconfigured interfaces was discovered'
+ fill = (cols / 2) - (len(intro) / 2)
+ print '{0:^{cols}}'.format('Simple network interface configuration tool', cols=cols)
+ print
+ print '{0:<{fill}}{1}'.format('', intro, fill=fill)
+ print '{0:<{fill}}{1:>2} {2:^15} {3:^10} {4:^17}'.format('','#','Interface','Media','MAC',fill=fill)
+ print '{0:<{fill}}{1:-^2} {2:-^15} {3:-^10} {4:-^17}'.format('','','','','',fill=fill)
+
+ n = 0
+ for i in interfaces:
+ print '{0:<{fill}}{1:>2} {2:<15} {3:<10} {4:>17}'.format('',n,i[0],i[1],i[2],fill=fill)
+ n += 1
+ print
+ print '{0:<{fill}}{1:<}'.format('','select interface number to configure:',fill=fill),
+ nic = int(raw_input())
+ if nic >= n or nic < 0:
+ print '{0:<{fill}}{1:<} {2:<}'.format('','Error: Interface: 0 <= # <',n,fill=fill),
+ raw_input(' << Hit any key >>')
+ else:
+ res = interfaces[nic]
+
+ return res
+
+def get_config():
+ ip = mask = gw = None
+ nettype = raw_input('dhcp or static [dhcp]: ').lower()
+ if nettype == 'static':
+ while not ip:
+ ip = raw_input('Enter IP: ')
+ mask = raw_input('Enter netmask [24]: ')
+ if not mask:
+ mask = 24
+ gw = raw_input('Enter default route [0=no]: ')
+ if not gw:
+ gw = 0
+
+ return (ip,mask,gw)
+
+def main():
+ p = Parser()
+ try:
+ interfaces = p.parse()
+ if interfaces:
+ nic = make_menu(interfaces)
+ if nic:
+ (ip,mask,gw) = get_config()
+ cmd = 'ipadm delete-if %s' % nic[0]
+ runcmd(cmd)
+ cmd = 'ipadm create-if %s' % nic[0]
+ (out, err) = runcmd(cmd)
+ if err:
+ raise RuntimeError(err)
+ if not ip:
+ # use DHCP
+ cmd = 'ipadm create-addr -T dhcp %s/v4' % nic[0]
+ (out, err) = runcmd(cmd)
+ if err:
+ raise RuntimeError(err)
+ else:
+ # use STATIC
+ cmd = 'ipadm create-addr -T static -a %s/%s %s/v4' % (ip, mask, nic[0])
+ (out, err) = runcmd(cmd)
+ if err:
+ raise RuntimeError(err)
+ if gw:
+ cmd = 'route -p add default %s' % gw
+ (out, err) = runcmd(cmd)
+ if err:
+ raise RuntimeError(err)
+ cmd = 'netstat -rn -finet'
+ (out, err) = runcmd(cmd)
+ if err:
+ raise RuntimeError(err)
+ print 'New route table'
+ print out
+ dns = raw_input('Configure DNS [n]? ').lower()
+ if not dns or dns == 'n':
+ pass
+ else:
+ dns = None
+ print
+ while not dns:
+ dns = raw_input('Enter nameserver: ')
+ cmd = "echo 'nameserver %s' >> /etc/resolv.conf" % dns
+ cmd += '&& cp /etc/nsswitch.conf{,.bak}'
+ cmd += '&& cp /etc/nsswitch.{dns,conf}'
+ (out, err) = runcmd(cmd)
+ if err:
+ raise RuntimeError(err)
+ else:
+ print "Found no unassigned interfaces"
+ except ParserError as e:
+ print 'Parse Errror: %s' % e
+ except RuntimeError as e:
+ print 'Runtime Error: %s' % e
+
+if __name__ == '__main__':
+ try:
+ main()
+ except KeyboardInterrupt:
+ sys.stderr.write("\x1b[2J\x1b[H")
+