#!/usr/bin/env python
+#
+# This file and its contents are supplied under the terms of the
+# Common Development and Distribution License ("CDDL"), version 1.0.
+# You may only use this file in accordance with the terms of version
+# 1.0 of the CDDL.
+#
+# A full copy of the text of the CDDL should have accompanied this
+# source. A copy of the CDDL is also available via the Internet at
+# http://www.illumos.org/license/CDDL.
+#
-import sys, subprocess
+#
+# Copyright 2017 <Michael Rasmussen>
+#
+
+#
+# The porpuse of this script is to help with basic and/or initial
+# network configuration for Illumos based distribution. However,
+# the script is developed specifically for OmniOS so there is no
+# garaunty that it will work on other Illumos based distributions
+# than Omnios.
+#
+
+import sys, subprocess, getopt
def runcmd(cmd):
process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
return (ip,mask,gw)
+def usage():
+ print 'Usage: %s [options]' % sys.argv[0]
+ print
+ print '%s' % """Options:
+ -h, --help This usage.
+ -a, --address IP for interface. 0 means use DHCP
+ -g, --gateway Default gateway. Optional.
+ -i, --interface Interface to configure.
+ -m, --netmask Netmask to use for interface. Default /24.
+ -n, --nameserver Nameserver to use. Optional.
+ -r, --record Output create commands to stdout."""
+
+def parse_input():
+ options = ()
+
+ try:
+ opts, args = getopt.gnu_getopt(sys.argv[1:],
+ 'ha:g:i:m:n:r', ['help', 'address=', 'gateway=',
+ 'interface=', 'netmask=', 'nameserver=', 'record'])
+ except getopt.GetoptError as err:
+ print str(err)
+ usage()
+ sys.exit(2)
+
+ address = gateway = interface = netmask = nameserver = None
+ record = False
+
+ if opts:
+ for o, a in opts:
+ if o in ('-h', '--help'):
+ usage()
+ sys.exit(0)
+ if o in ('-a', '--address'):
+ address = a
+ elif o in ('-g', '--gateway'):
+ gateway = a
+ elif o in ('-i', '--interface'):
+ interface = a
+ elif o in ('-m', '--netmask'):
+ netmask = a
+ elif o in ('-n', '--nameserver'):
+ nameserver = a
+ elif o in ('-r', '--record'):
+ record = True
+ else:
+ assert False, 'Unhandled option'
+
+ if (record):
+ if (bool(address) ^ bool(interface)):
+ print 'Error: missing options'
+ usage()
+ sys.exit(2)
+ else:
+ if not address or not interface or error:
+ print 'Error: missing options'
+ usage()
+ sys.exit(2)
+
+ if address == '0':
+ address = None
+ if not netmask:
+ netmask = '24'
+
+ options = (interface, address, netmask, gateway, nameserver, record)
+
+ return options
+
def main():
+ interactive = True
+ record = False
+ output = ''
+
+ options = parse_input()
+ if options:
+ record = options[5]
+ if (options[0]):
+ interactive = False
+
p = Parser()
try:
interfaces = p.parse()
if interfaces:
- nic = make_menu(interfaces)
+ if interactive:
+ nic = make_menu(interfaces)
+ else:
+ nic = options
+ found = False
+ for i in interfaces:
+ if nic[0] == i[0]:
+ found = True
+ break
+ if not found:
+ err = '%s: No such interface' % nic[0]
+ raise RuntimeError(err)
if nic:
- (ip,mask,gw) = get_config()
+ if interactive:
+ (ip,mask,gw) = get_config()
+ else:
+ ip = options[1]
+ mask = options[2]
+ gw = options[3]
cmd = 'ipadm delete-if %s' % nic[0]
- runcmd(cmd)
+ if record:
+ output += cmd
+ else:
+ runcmd(cmd)
cmd = 'ipadm create-if %s' % nic[0]
- (out, err) = runcmd(cmd)
- if err:
- raise RuntimeError(err)
+ if record:
+ output += "\n" + cmd
+ else:
+ (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)
+ if record:
+ output += "\n" + cmd
+ else:
+ (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 record:
+ output += "\n" + cmd
+ else:
+ (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 record:
+ output += "\n" + cmd
+ else:
+ (out, err) = runcmd(cmd)
+ if err:
+ raise RuntimeError(err)
+ if not record:
+ cmd = 'netstat -rn -finet'
+ (out, err) = runcmd(cmd)
+ if err:
+ raise RuntimeError(err)
+ print 'New route table'
+ print out
+ if interactive:
+ dns = raw_input('Configure DNS [n]? ').lower()
+ else:
+ dns = options[4]
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}'
+ if interactive:
+ 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)
+ if record:
+ output += "\n" + cmd
+ else:
+ (out, err) = runcmd(cmd)
+ if err:
+ raise RuntimeError(err)
+ if record:
+ print output
else:
print "Found no unassigned interfaces"
except ParserError as e: