*CeOdZddlZddlZddlZddlZddlmZ ddlZdZddl m Z ddl Z ddl m Z Gd d e jZy#e$rdZY/wxYw) znetplan migrate command lineN)globFT) OrderedDict)utilscJeZdZfdZdZdZdZdZdZdZ d dZ xZ S) NetplanMigratec,t|ddddy)Nmigratez/Migration of /etc/network/interfaces to netplanT) command_id descriptionleaftesting)super__init__)self __class__s 6/usr/share/netplan/netplan_cli/cli/commands/migrate.pyrzNetplanMigrate.__init__%s  I%V"!%  'c6d|vrHd|vri|d<d|dvrg|dd<|djdD]}|s|ddxx|gz cc<|d=d|vrId|vri|d<d|dvrg|dd<|djdD]}|s|ddxx|gz cc<|d=yy)zParse dns options (dns-nameservers and dns-search) from if_options (an interface options dict) into the interface configuration if_config Mutates the arguments in place. zdns-nameservers nameservers addresses z dns-searchsearchN)split)r if_options if_confignsdomains rparse_dns_optionsz NetplanMigrate.parse_dns_options+s  *I-+- -()M"::8: -(5 !2399#> >-(5"=5  > ,- : %I-+- -(y7757 -(2$\288= ?-(2vh>2  ? <( &rc0d|vrT t|d}d|vr8|dk(s0tjd|||dt j d|d<|d=yy#t$r2tjd||dt j dYwxYw)zParse out the MTU. Operates the same way as parse_dns_options iface is the name of the interface, used only to print error messages mtuz%s: cannot parse "%s" as an MTUrz0%s: tried to set MTU=%d, but already have MTU=%dN)int ValueErrorloggingerrorsysexit)rifacerrr!s r parse_mtuzNetplanMigrate.parse_mtuHs J  *U+,  !)E*:c*A PRWY\^ghm^no "Ie 5!   ? SXHYZ  sA8BBcd|vrNd|vr>|d|dk(s3tjd||d|dtjd|d|d<|d=yy)zParse out the manually configured MAC. Operates the same way as parse_dns_options iface is the name of the interface, used only to print error messages hwaddress macaddressz0%s: tried to set MAC %s, but already have MAC %srN)r$r%r&r')rr(rrs rparse_hwaddresszNetplanMigrate.parse_hwaddress[so * $y(<1HJWbLc1c PRW(5y7NP &0&=Il #;' %rc<|jjdd|jjddd|j|_|j t r*t jdtjd |jy) Nz --root-dirzOSearch for and generate configuration files in this root directory instead of /)helpz --dry-run store_truezQPrint converted netplan configuration to stdout instead of writing/changing files)actionr/zThe `yaml` Python package couldn't be imported, and is needed for the migrate command. To install it on Debian or Ubuntu-based system, run `apt install python3-yaml`) parser add_argumentcommand_migratefunc parse_argsNO_YAMLr$r%r&r' run_command)rs rrunzNetplanMigrate.runjs   &w ! y   \&y ! {((    MMR S HHQK rc i} |j|jxsd\}}jD]\\}}|jD]B\}}tjd||||vr+tjd|t jd|ddk(rtjd|m|ddk(r|jd ijd ij|i} |j|d | |j||d | |d rLtjd |d j|d jt jd|dk(rd| d</|dk(sJd| d<=|ddk(r|jd ijd ij|i} d| vrg| d<|j|d | |j||d | |j||d | |dk(rt!gd} t!gd} t!|d j} | | z } | rz| j#| D]/}tjd|||t jd1| | z D]/}tjd|||t jd1d|d vr+tjd|t jdd|d dvr#|d dj%dd}|d d}nNd|d vr+tjd|t jd|d d}|d ddz|d dz} t'j(|} t'j,|d !}| dxxt dzt j0zgz cc<d#|d vs|d d#| d$<|dk(sJt!gd%} t!gd&} t!|d j} | | z } | rz| j#| D]/}tjd|||t jd1| | z D]/}tjd|||t jd1d|d vr+tjd|t jdd|d dvr#|d dj%dd}|d d}nNd|d vr+tjd|t jd|d d}|d ddz|d dz} t'j2|} t'j4|d !}| dxxt dzt j0zgz cc<d#|d vr |d d#| d)<d*|d vs|d d*d+k(rd | d*<|d d*d,k(rd| d*<|d d*d-k(r-tjd.|t jdtjd/||d d*t jdtjd0||dt jdE_t6j8j|jxsdd1}|rd|d d2<t;j<|}|j>r tA|nt6j8j|jxsdd3} t7jBt6j8jE| tI|d45}|jK|dddtjLd7|ntjLd8|j>s1tjLd9||t7jN||d:zyy#t$r>}tjt |t jdYd}~ d}~wwxYw#t&j*$r8}tjd|||t jdYd}~d}~wwxYw#t&j.$r8}tjd"|||t jdYd}~$d}~wwxYw#t&j*$r8}tjd'|||t jdYd}~d}~wwxYw#t&j.$r8}tjd(|||t jdYd}~d}~wwxYw#tF$rYwxYw#1swYxYw#tF$r/tjd5|t jd6Y@wxYw);NrzConverting %s family %s %sz.%s: non-automatic interfaces are not supportedmethodloopbackzIgnoring loopback interface %sdhcpnetwork ethernetsoptionsz2%s: option(s) %s are not supported for dhcp methodz, inetTdhcp4inet6dhcp6staticr)addressnetmaskgateway) broadcastmetric pointopointscopez%s: unsupported %s option "%s"z%s: unknown %s option "%s"rHz(%s: no address supplied in static method/rrIzE%s: address does not specify prefix length, and netmask not specifiedz-%s: error parsing "%s" as an IPv4 address: %sF)strictz-%s: error parsing "%s" as an IPv4 network: %srJgateway4)rHrIrJ accept_ra)rLmediaautoconfprivextrNzpreferred-lifetimez dad-attemptsz dad-intervalz-%s: error parsing "%s" as an IPv6 address: %sz-%s: error parsing "%s" as an IPv6 network: %sgateway6rR012z(%s: netplan does not support accept_ra=2z#%s: unexpected accept_ra value "%s"z%s: method %s is not supportedzetc/network/interfacesversionzetc/netplan/10-ifupdown.yamlxzC%s already exists; remove it if you want to run the migration againzmigration complete, wrote %sz>ifupdown does not configure any interfaces, nothing to migratez#renaming %s to %s.netplan-convertedz.netplan-converted)(parse_ifupdownroot_dirr#r$r%strr&r'itemsdebug setdefaultrr-joinkeysr)set intersectionr ipaddress IPv4AddressAddressValueError IPv4NetworkNetmaskValueError prefixlen IPv6Address IPv6Networkospathyamldumpdry_runprintmakedirsdirnameFileExistsErroropenwriteinforename)rnetplan_configifaces auto_ifaceser( family_configfamilyconfigcsupported_optsunsupported_optsoptsbad_opts unsupportedunknown addr_specnet_specipaddraipnetr netplan_yamldestfs rr5zNetplanMigrate.command_migratexs:  "&"5"5dmm6Ir"J FK%+LLNf E="/"5"5"7e  :E66R +MM"RTYZHHQK(#z1MM"BEJH%/&11)R@KKKY[\gghmoqrA**6)+>(.y(9)(D(J(J3(OPQ(RI'-i'8'CH(y0AA ' .u.3!5 # (.y(9)(DI'-i'8'Cc'IFS\L]^gLh'hH(%.%:%:9%EF ($-$9$9(5$QE +3v;+>(.y(9)(D(J(J3(OPQ(RI'-i'8'CH(y0AA ' .u.3!5 # (.y(9)(DI'-i'8'Cc'IFS\L]^gLh'hH(%.%:%:9%EF ($-$9$9(5$QE +3v;+ 9 U IIi-A!A BE  MM#a& ! HHQKK Z )::(#MM*Y[`bkmnoHHQKK( )::(#MM*Y[`bjlmnHHQKK(l )::(#MM*Y[`bkmnoHHQKK( )::(#MM*Y[`bjlmnHHQKK(N'..& MM"gimnHHQK s"_-:`7bc/d!*2e/ f )e?;f - `463`//`47b -a==bc-c  cd&-dd!e,4-e''e,/ e<;e<?f f 4ggc d}g}t|dz} t|dz|z5}tjd|j|D]\}|j }|r|j dr(|j drtjd}||tjj|j|} tj| D]J}|j|s||j|tjj| |d|z }L|j d rYt!||tjj|j|D]}||j|||dz }L|j#|_ ddd|S#1swY|SxYw#t$$rtjd ||Y|SwxYw) zvReturn normalized lines from ifupdown config This resolves "source" and "source-directory" includes. cd|jd}|jdr||zS|dz|zS)Nr2rO)r startswith)rootdircurdirlineargs rexpand_source_argzCNetplanMigrate._ifupdown_lines_from_file..expand_source_argGs6**,q/C~~c"}$|c))rr2rOz reading %s#zsource-directory z^[a-zA-Z0-9_-]+$Nzsource z%s/%s does not exist, ignoring)lenrxr$ranamestriprrecompilerorprvlistdirmatch_ifupdown_lines_from_filercrappendFileNotFoundError) rrrprlines rootdir_lenrrvalid_reds rrz(NetplanMigrate._ifupdown_lines_from_fileBs  *'lQ&  Kgmd*+ +q lAFF3+D::9G>G G%$G%c ddddddd}|j|d}t}t}d}d}|D]}|j} || d} t j d| | d}d}t| | dzk7r td | | dt| dz fz| dd vr|j| d| ddk(r td| ddk(r| ddk(rb| ddvrtd| dz| ddvrtd| dz| d}| d}| did|j| dt|< td| dzt j d||||fS#t $rR|r>t j d|||jd d|||d | d<Ytd | dzwxYw)uWParse ifupdown configuration. Return (iface_name → family → {method, options}, auto_ifaces: set) tuple on successful parsing, or a ValueError when encountering an invalid file or ifupdown features which are not supported (such as "mapping"). options is itself a dictionary option_name → value. r2r\)auto allow-auto allow-hotplugmapping no-scriptsr(z/etc/network/interfacesNrz$line fields %s (expected length: %i)z$in_options %s, parsing as option: %s)maxsplitrBzUnknown stanza type %sz0Expected %i fields for stanza type %s but got %i)rrrrzmapping stanza is not supportedrr(r)rCrEzUnknown address family %s)r>rGr?zUnsupported method %s)r=rBz!stanza type %s is not implementedz,final parsed interfaces: %s; auto ifaces: %s) rrrerr$raKeyErrorr#raddrbNotImplementedError) rrfieldlenrr}r in_options in_familyrfieldsexp_lens rr]zNetplanMigrate.parse_ifupdownhsJQq`almn..w8QRu  ' [DZZ\F K"6!9- DfgV!  6{gk) !S")6!9c&kAo!F"GHHayCC#i' !BCCl*g%!9$55$%@6!9%LMM!9$BB$%rs[$# G$CU))CGsAAA