Ubuntu Pastebin

Paste from smoser at Wed, 23 Mar 2016 15:26:41 +0000

Download as text
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
=== modified file 'cloudinit/net/__init__.py'
--- cloudinit/net/__init__.py	2016-03-22 09:40:05 +0000
+++ cloudinit/net/__init__.py	2016-03-23 15:00:08 +0000
@@ -283,6 +283,96 @@
     return ns
 
 
+def load_klibc_net_cfg(data_mapping):
+    """Process key value pairs from files written because of the ip parameter
+       on the kernel cmdline, note that mode: manual is used because the
+       interface should already have been brought up by the kernel and
+       cloud-initramfs-tools"""
+    entry_ns = {
+        'mtu': None, 'name': data_mapping['DEVICE'], 'type': 'physical',
+        'mode': 'manual', 'inet': 'inet', 'gateway': None, 'address': None,
+        'subnets': []
+    }
+
+    # ipconfig on precise does not write PROTO
+    # (lp:cloud-initramfs-tools/dyn-netconf/scripts/init-bottom/
+    #  cloud-initramfs-dyn-netconf)
+    if not data_mapping.get('PROTO'):
+        if data_mapping.get('filename'):
+            data_mapping['PROTO'] = 'dhcp'
+        else:
+            data_mapping['PROTO'] = 'static'
+
+    if data_mapping.get('PROTO') == 'dhcp':
+        if data_mapping.get('IPV4ADDR'):
+            entry_ns['subnets'].append({'type': 'dhcp4'})
+        if data_mapping.get('IPV6ADDR'):
+            entry_ns['subnets'].append({'type': 'dhcp6'})
+    elif data_mapping.get('PROTO') in ['static', 'none']:
+        # It appears that specifying ipv6 static addrs does not work, so only
+        # check for ipv4 addr
+        entry_ns['subnets'].append(
+                {'type': 'static', 'address': data_mapping.get('IPV4ADDR')})
+
+    if data_mapping.get('IPV4ADDR'):
+        entry_ns['address'] = data_mapping['IPV4ADDR']
+    if data_mapping.get('IPV6ADDR'):
+        entry_ns['address'] = data_mapping['IPV6ADDR']
+    if data_mapping.get('IPV4BROADCAST'):
+        entry_ns['broadcast'] = data_mapping['IPV4BROADCAST']
+    if data_mapping.get('IPV6BROADCAST'):
+        entry_ns['broadcast'] = data_mapping['IPV6BROADCAST']
+    if data_mapping.get('IPV4NETMASK'):
+        entry_ns['netmask'] = data_mapping['IPV4NETMASK']
+    if data_mapping.get('IPV6NETMASK'):
+        entry_ns['netmask'] = data_mapping['IPV6NETMASK']
+    if data_mapping.get('IPV4GATEWAY'):
+        entry_ns['gateway'] = data_mapping['IPV4GATEWAY']
+    if data_mapping.get('IPV6GATEWAY'):
+        entry_ns['gateway'] = data_mapping['IPV6GATEWAY']
+    if data_mapping.get('HOSTNAME'):
+        entry_ns['hostname'] = data_mapping['HOSTNAME']
+
+    return entry_ns
+
+
+def merge_from_cmdline_config(ns):
+    """If ip parameter passed on kernel cmdline then some initial network
+       configuration may have been done in initramfs. Files from the result of
+       this may have been written into /run. If any are present they should be
+       merged into network state"""
+
+    if 'interfaces' not in ns:
+        ns['interfaces'] = {}
+
+    for cfg_file in glob.glob('/run/net*.conf'):
+        with open(cfg_file, 'r') as fp:
+            data = [l.replace("'", "") for l in fp.readlines()]
+        try:
+            parsed = dict([l.strip().split('=') for l in data])
+        except:
+            # if split did not work then this is likely not a netcfg file
+            continue
+
+        dev_name = parsed.get('DEVICE')
+        if not dev_name:
+            # Not a net cfg file
+            continue
+
+        loaded_ns = load_klibc_net_cfg(parsed)
+
+        if dev_name in ns['interfaces']:
+            if 'subnets' not in ns['interfaces'][dev_name]:
+                ns['interfaces'][dev_name]['subnets'] = []
+            for newsubnet in loaded_ns['subnets']:
+                if newsubnet not in ns['interfaces'][dev_name]['subnets']:
+                    ns['interfaces'][dev_name]['subnets'].append(newsubnet)
+        else:
+            ns['interfaces'][dev_name] = loaded_ns
+
+    return ns
+
+
 def render_persistent_net(network_state):
     ''' Given state, emit udev rules to map
         mac to ifname
Download as text