]> git.datanom.net - netconf.git/blobdiff - netconf
Add test for option record
[netconf.git] / netconf
diff --git a/netconf b/netconf
index 0374493f91cb00adefba8dc70d5748652b00d98d..25d3bff8f2f62af7886f4def1bd701d5b4c960a9 100644 (file)
--- a/netconf
+++ b/netconf
@@ -1,6 +1,28 @@
 #!/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)
@@ -115,57 +137,170 @@ def get_config():
     
     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 not (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)
+    
+    return options
+
 def main():
+    interactive = True
+
+    options = parse_input()
+    if options:
+       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:
+                   print cmd
+               else:
+                   runcmd(cmd)
                 cmd = 'ipadm create-if %s' % nic[0]
-                (out, err) = runcmd(cmd)
-                if err:
-                    raise RuntimeError(err)
+               if record:
+                   print 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:
+                       print 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:
+                       print 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:
+                           print 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: ')
+                   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:
+                       print cmd
+                   else:
+                       (out, err) = runcmd(cmd)
+                       if err:
+                           raise RuntimeError(err)
         else:
             print "Found no unassigned interfaces"
     except ParserError as e:
This page took 0.035827 seconds and 5 git commands to generate.