o x[h$@sddlZddlZddlZddlZddlZddlZddlZddlZddlm Z ddl m Z m Z dZ dZeeZGdddejdZGd d d eZegZdd d Zd dZdddZddZddZddZdddZdS)N)util)get_devicelistread_sys_net_safez#/run/initramfs/open-iscsi.interfacedisabledc@s8eZdZdZejdefddZejdefddZ dS)InitramfsNetworkConfigSourcezBABC for net config sources that read config written by initramfsesreturncCdS)zAIs this initramfs config source applicable to the current system?Nselfr r 7/usr/lib/python3/dist-packages/cloudinit/net/cmdline.py is_applicablez*InitramfsNetworkConfigSource.is_applicablecCr)z;Render a v1 network config from the initramfs configurationNr r r r r render_config"rz*InitramfsNetworkConfigSource.render_configN) __name__ __module__ __qualname____doc__abcabstractmethodboolr dictrr r r r rs r) metaclassc@s6eZdZdZd ddZdefddZdefdd ZdS) KlibcNetworkConfigSourcezInitramfsNetworkConfigSource for klibc initramfs (i.e. Debian/Ubuntu) Has three parameters, but they are intended to make testing simpler, _not_ for use in production code. (This is indicated by the prepended underscores.) NcCst||_||_||_|jdurt|_|jdurt|_|jdur6i|_tD]}t|d}|r5||j|<q'dSdS)Naddress)_files _mac_addrs_cmdline_get_klibc_net_cfg_filesr get_cmdlinerr)r rrrkmac_addrr r r __init__/s        z!KlibcNetworkConfigSource.__init__rcCs<|jrt|jD] }|drdSq tjtrdSdS)aD Return whether this system has klibc initramfs network config or not Will return True if: (a) klibc files exist in /run, AND (b) either: (i) ip= or ip6= are on the kernel cmdline, OR (ii) an open-iscsi interface file is present in the system )zip=zip6=TF) rshlexsplitr startswithospathexists_OPEN_ISCSI_INTERFACE_FILE)r itemr r r r As   z&KlibcNetworkConfigSource.is_applicablecCst|j|jdS)N)files mac_addrs)config_from_klibc_net_cfgrrr r r r rTsz&KlibcNetworkConfigSource.render_config)NNN) rrrrr"rr rrr r r r r's  rc Cs|duri}t|}zd|vr|dn|d}Wnty*}ztd|d}~ww|d|d}|s@|dr>d}nd }|d vrFd }|d vrPtd |d |gd}||vr`|||d<dD]}|d|vrkqb||d|}|d kryd}|dd} |dkr||d| d<dD]} || |vr||| | | <qg} dD]} ||| } | rt| dr| ||| q| r| | d<|d}|rd|vr| d| d<n| | d<|d| qb||fS)aConvert a klibc written shell content file to a 'config' entry When ip= is seen on the kernel command line in debian initramfs and networking is brought up, ipconfig will populate /run/net-.cfg. The files are shell style syntax, and examples are in the tests provided here. There is no good documentation on this unfortunately. DEVICE= is expected/required and PROTO should indicate if this is 'none' (static) or 'dhcp' or 'dhcp6' (LP: #1621507) or 'static' or 'off' (LP: 2065787). Note that IPV6PROTO is also written to address the possibility of both ipv4 and ipv6 getting addresses. Full syntax is documented at: https://git.kernel.org/pub/scm/libs/klibc/klibc.git/plain/usr/kinit/ipconfig/README.ipconfig NDEVICEDEVICE6z&no 'DEVICE' or 'DEVICE6' entry in dataPROTO IPV6PROTOfilenamedhcpnone)staticoff)r4r3dhcp6zUnexpected value for PROTO: %sphysical)typenamesubnets mac_address)IPV4IPV6ADDRr5manual)r9controlr)NETMASK BROADCASTGATEWAY)DNS0DNS1z:.0dns_nameservers DOMAINSEARCH, dns_searchr;) rload_shell_contentKeyError ValueErrorgetlowerlenstripappendr$)contentr,datar:eprotoifacepre cur_protosubnetkeydnsnskeynssearchr r r _klibc_to_config_entry^sh          r`cCstdtdS)Nz/run/net-*.confz/run/net6-*.conf)globr r r r rsrc Cs|durt}g}i}|D]Y}tt||d\}}||vrY||d}|d|dkrFtdj|d||d|d|dd|d|d||d |q |g|d ||<| |q |d d S) N)r,entryr<zedevice '{name}' was defined multiple times ({files}) but had differing mac addresses: {old} -> {new}. r+)r:r+oldnewr;)r+rb)configversion) rr`rload_text_filerNrMformatjoinextendrR)r+r,entriesnamescfg_filer:rbprevr r r r-s2      r-cCs(tD]}|}|s q|SdS)a Return v1 network config for initramfs-configured networking (or None) This will consider each _INITRAMFS_CONFIG_SOURCES entry in turn, and return v1 network configuration for the first one that is applicable. If none are applicable, return None. N)_INITRAMFS_CONFIG_SOURCESr r)src_cls cfg_sourcer r r read_initramfs_configs  rtc Cst|@}d}z4ztjd|d}|WW|r|WdSty<|YW|r4|WdSw|rD|ww1sHwYdS)Nrb)modefileobj)ioBytesIOgzipGzipFilereadcloseIOError)blobiobufgzfpr r r _decomp_gzips$    rc Cs:z t|}Wt|Sttfytd|YdSw)zDecode a string base64 encoding, if gzipped, uncompress as well :return: decompressed unencoded string of the data or empty string on unencoded data. zaExpected base64 encoded kernel command line parameter network-config. Ignoring network-config=%s.)base64 b64decode TypeErrorrMLOGerrorr)rTrr r r _b64dgzs  rcCsj|durt}d|vr3d}|D]}|dr!|ddd}q|r3|tkr,ddiStt|SdS)Nznetwork-config==rfrgr)rrr$r%&KERNEL_CMDLINE_NETWORK_CONFIG_DISABLED load_yamlr)cmdlinedata64tokr r r read_kernel_cmdline_configs  r)N)NN)rrrarzrxloggingr&r# cloudinitr cloudinit.netrrr)r getLoggerrrABCMetarrrqr`rr-rtrrrr r r r s.   4 `