o ~fk @s(dZddlZddlZddlZddlZddlZddlZddlZddlm Z m Z m Z m Z ddl Z ddlZddlmmZe e edfe deeeee dfZedZdZzddlmZddlmZdd lmZGd d d eZ d ZWne!ye"d YnwGdddZ#Gdddej$Z%dS)znetplan status command lineN)UnionDictListTypeJSONz\[([a-z0-9]+)\].*\[\/\1\]F)Console)RegexHighlighter)Themec@seZdZdZddgZdS)NetplanHighlighterznetplan.z"(^|[\s\/])(?P\d+)([\s:]?\s|$)z(?P(\"|\').+(\"|\'))N)__name__ __module__ __qualname__ base_style highlightsrr1/usr/share/netplan/netplan/cli/commands/status.pyr ,s r Tz4python3-rich not found, falling back to plain outputc @seZdZdedefddZggddfdedededed ef d d Zd edefd dZ dedefddZ defddZ e de fddZe de fddZe defddZe defddZe defddZe defddZe defd d!Ze defd"d#Ze defd$d%Zd&S)' InterfaceipreturncCs$t|dd}dkr|SdS)z Extract the MAC address if it's set inside the JSON data and seems to have the correct format. Return 'None' otherwise. addressN)lengetlower)selfrrrrr __extract_mac8szInterface.__extract_mac)NNnd_datanm_data resolved_data route_datac sb|dd_|dd_d|dgvrdnd_|dd_|_|p-g}tfd d |Dd_ tfd d |Dd_ d_ |d r~g_ |d D]'}t |d t jkr}|d }|d}j t|ddd|DqVd_|d rg_|d D]} t | d t jkrj t| d qg} d_|d r| |d 7} |d r| |d 7} | r#g_| D]]} | djkr"d| di} | d} | r| | d<| d} | r| | d<| d} | r| | d<| d} | r| | d<| d} | r| | d<| d} | r| | d<j | qd_|d}rg_|D]]}g}t|djrE| djrrjD]%}d|vrpt|dt|dkrp|dd krp| d nqL|d}|d!|d"ii} |r|| |d<j | q3d_|d#id$}r|_jpd%_dS)&NifindexifnameunknownUPflagsDOWN operstatec3"|] }|djkr|VqdS)IndexN)idx.0xrrr K z%Interface.__init__..c3r))deviceN)namer,r/rrr0Lr1rcSsg|]}|ddqS)r4big)to_bytes)r-vrrr Vz&Interface.__init__..devtodstgatewayviaprefsrcfrommetrictypescopeprotocol addr_infolocallinkdhcpprefix prefixlenlinkinfo info_kindr)rr+r3 adminstateupperr(_Interface__extract_mac macaddressnextndnm dns_addressesintappendsocket inet_ntopjoin dns_searchstrroutes addresses ipaddress ip_address is_link_localr iproute_typestripquery_networkctl _networkctl)rrrrrr itripfamilydnsr9_routesobjelemvalrGaddrr&routeip_addrrNrr/r__init__As  $                 zInterface.__init__con_namec Csbd}ztddddd|g}|WSty0}ztd|t|WYd}~|Sd}~ww)Nz --get-valuesz802-11-wireless.ssidconshowidz+Cannot query NetworkManager SSID for {}: {})utils nmcli_outrd Exceptionloggingwarningformatr])rrrssiderrr query_nm_ssids zInterface.query_nm_ssidr#c Cs^d}ztjddd|gdd}W|Sty.}ztd|t|WYd}~|Sd}~ww)N networkctlstatusz--Ttextz"Cannot query networkctl for {}: {}) subprocess check_outputrxryrzr{r])rr#outputr}rrrreszInterface.query_networkctlcCs|j|j|jd}|jr|j|d<|jr|j|d<|jr!|j|d<|jr)|j|d<|jr1|j|d<|jr9|j|d<|j rA|j |d<|j rI|j |d <|j rQ|j |d <|j rY|j |d <|j ra|j |d <|jri|j|d <|j|fS)N)indexrOr(rDr| tunnel_modebackendrurRvendorr_rVr\r^activation_mode)r+rOr(rDr|rr netdef_idrRrr_rVr\r^rr3)rjsonrrrrs:             zInterface.jsoncC|jdko |jdkS)Nr%rOr(r/rrrupz Interface.upcCr)Nr'rr/rrrdownrzInterface.downcCs`tddddddddddddddd}|jr|jd nd}||vr&||Std |dS) Nbondbridgeethernettunnelwifimodemvrf)rretheripgreip6greloopbacksitrtunnel6 wireguardwlanwwanrvxlanrzUnknown device type: {})dictrTrryrzr{)rmatchnd_typerrrrDs*zInterface.typecCs|jdkr |jr |jSdS)Nr)rDrcr/rrrrszInterface.tunnel_modecCsN|jrd|jddvrd|jddvrdS|jr%d|jddvr%d SdS) N unmanaged SetupStaterrun/systemd/network/10-netplan- NetworkFilenetworkd.run/NetworkManager/system-connections/netplan-filenameNetworkManager)rTrrUr/rrrrszInterface.backendcCs|jdkr|jddddddS|jdkrK|jd dd dd d}|jd dd krI||jd}|rI|d|d}|SdS)Nrrrrr4z.networkrrrrz .nmconnectionrDz802-11-wirelessr3-)rrTrsplitrUr~)rnetdefr|rrrrs,  zInterface.netdef_idcCs,|jrd|jvr|jdr|jdSdS)NVendor)rTrdr/rrrr szInterface.vendorcCsb|jdkr/|jD]$}|}d}||r.|t|td }|r*|SdSq dS)NrzWiFi access point: z (xB:SS:ID:xx:xx:xx))rDrf splitlinesrd startswithr)rlinekeyr|rrrr|s  zInterface.ssidcCs|jdkr0|jD]#}|}d}||r-|t|d}|dkr)|SdSq dS|jdkr@|jddkr>dSdSdS)NrzActivation Policy: rr autoconnectnomanual)rrfrrdrrrU)rrrmoderrrrs   zInterface.activation_modeN)r r r rr]rQrtuplerqr~rerpropertyboolrrrDrrrrr|rrrrrr7s<  X     rcseZdZfddZddZdefddZdedefd d Z d e de fd d Z de fddZ de fddZde fddZde fddZde fddZdefddZdefddZddZd%de d eddfd!d"Zd#d$ZZS)& NetplanStatuscstjddddd|_dS)Nrz,Query networking state of the running systemT) command_id descriptionleafF)superrqallr/ __class__rrrq1s  zNetplanStatus.__init__cCsZ|jjddtddd|jjddddd |jjd d d d d|j|_||dS)Nr#?zShow only this interface)nargsrDdefaulthelpz-az--all store_truez(Show all interface data (incl. inactive))actionr-fz--formattabularz2Output in machine readable `json` or `yaml` format)rr)parser add_argumentr]commandfunc parse_args run_commandr/rrrrun7s   zNetplanStatus.runrc Csggdd}zZtdK}|}d|vrd|d<nd|vr!d|d<|g|D]$}|dr=|d |d d7<|d rL|d d|d <q(WdW|S1sYwYW|Sty}}ztd t |WYd}~|Sd}~ww) N)r_searchrz/etc/resolv.confz/# This is /run/systemd/resolve/stub-resolv.confstubrz*# This is /run/systemd/resolve/resolv.confcompat nameserverr_r4rz!Cannot parse /etc/resolv.conf: {}) openreadline readlinesrrrxryrzr{r])rresf firstlinerr}rrrresolvconf_jsonCs6     zNetplanStatus.resolvconf_json interfacescCs|D]A}|jrC|jrC|jrC|jrCg}|jD]}t|d\}}d|vs+d|dvr0||qdd|jD}|rC|rC|jrCdSqdS)Nrr&rIcSs g|] }|dddkr|qS)r=Nr)rr,rrrr:d z4NetplanStatus.query_online_state..TF)rr_r^rVlistitemsrX)rritf non_local_ipsrnrextradefault_routesrrrquery_online_stateZs  z NetplanStatus.query_online_state cmd_outputcCs t|SNrloadsrrrrrprocess_genericis zNetplanStatus.process_genericc Csbd}ztjgddd}||}W|Sty0}ztdt|WYd}~|Sd}~ww)N)r-d-jrnTrz(Cannot query iproute2 interface data: {})rrrrxrycriticalr{r]rdatarr}rrrquery_iproute2l  zNetplanStatus.query_iproute2cCst|dS)N Interfacesrrrrrprocess_networkdvszNetplanStatus.process_networkdc Csbd}ztjddgdd}||}W|Sty0}ztdt|WYd}~|Sd}~ww)Nrz --json=shortTrz(Cannot query networkd interface data: {})rrrrxryrr{r]rrrrquery_networkdyrzNetplanStatus.query_networkdc Csdg}|D])}|d}|dr|dnd}|r/|||d|d|d|d|ddq|S) N:rr4r5)r2r3uuidrrDr)rrrX)rrrrrr<rrr process_nms  zNetplanStatus.process_nmc Cs^d}ztgd}||}W|Sty.}ztdt|WYd}~|Sd}~ww)N)z-trz*DEVICE,NAME,UUID,FILENAME,TYPE,AUTOCONNECTrsrtz.Cannot query NetworkManager interface data: {})rvrwrrxrydebugr{r]rrrrquery_nms zNetplanStatus.query_nmc Csd}d}z!tjgddd}||}tjgddd}||}W||fStyD}ztdt|WYd}~||fSd}~ww)N)rrrroTr)rrrz-6roz$Cannot query iproute2 route data: {})rrrrxryrr{r])rdata4data6output4output6r}rrr query_routess"    zNetplanStatus.query_routesc Csd}d}z"t}|dd}t|d}|d}|d}|d}W||fStyE}ztdt |WYd}~||fSd}~ww)Nzorg.freedesktop.resolve1z/org/freedesktop/resolve1zorg.freedesktop.DBus.Propertiesz org.freedesktop.resolve1.ManagerDNSDomainsz"Cannot query resolved DNS data: {}) dbus SystemBus get_objectrGetAllrxryrr{r])rr_ripcresolve1 resolve1_ifrr}rrrquery_resolveds    zNetplanStatus.query_resolvedcOsht|r-t|}t|dD]}|dd|dd|d|d<qt|i|St|i|S)Nrz[{}]rz[/{}])rr MATCH_TAGSfindallreplacer{print)rargskwargslsttagrrr plain_printszNetplanStatus.plain_printNrtotalc&strtdddddddd}tt||d d }|j}n|j}d }d i}fd dD} |d|djd|dd r?dndd|di} | dg} | d} | dg} | rt| D]\}}|d|dj|dkrrdnd|| r{d| nddqa| rt| D]\}}|d|dj|dkrd nd|dq|| D]\}d!d"d#d$d"}d%}|d&krd'}d}n|d(krd)}d*}d+d,}d-}d.}|d/kr|r|d0|d17}n |d2kr|r|d#|7}|d3j|d4d5|||d6d7d8rd9d8ndd:d;r@|d|d<jd=d;dd>r;dd>dndd?dg}|rt|D]U\}}t | d\}}g}|d@ri|d@g}d}d}|rudA|vrydB}dC}|d|dDj|dkrdEnd||dFd|rdGdH |dInd||dJqMdKg}|rt|D]\}}|d|dj|dkrdnd|dqdLg}|rt|D]\}}|d|dj|dkrd nd|dq׈dMg}|rt|D]\}}d}d}|dNdOkrdB}dC}d}dP|vrdQ|dP}d} dR|vr+dS|dR} d}!dT|vr:dUt |dT}!g}dV|vrQ|dVdWkrQ|dV}"| |"dX|vrf|dXdYkrf|dX}#| |#d+|vr{|d+dZkr{|d+}$| |$|d|d[j|dkrd\nd|dN|| |!|rdGdH |dInd||d]qd^}|r|d|djd_|d|q|t| }%|%dkr|d`|%dSdS)aNz bold cyanyellowgrey62z green boldzred boldz yellow boldbold)z netplan.intz netplan.strmutedonlineoffliner$ highlightF) highlighterthemewidthemoji18netplan-global-statecs g|] }|dkr||fqS)r%r)r-rrrrr:rz.NetplanStatus.pretty_print..z{title:>z } {value}z Online state:rz[online]online[/online]z[offline]offline[/offline])titlevalue nameserversr_rrz} {value}[muted]{mode}[/muted]rzDNS Addresses:rz ({}))r'r(rz DNS Search:r(UNKNOWN/rOr$zUP/UPr%z DOWN/DOWNr'rrDotherr|rrz/""ruU[{col}]●[/{col}] {idx:>2}: {name} {type} [{col}]{state}[/{col}] ({backend}{netdef})rrrrruz: [highlight]{}[/highlight])colr+r3rDstaterrrRz} {mac}[muted]{vendor}[/muted]z MAC Address:r)r'macrr&rJz [highlight]z [/highlight]z1} {start}{ip}/{prefix}{end}[muted]{extra}[/muted]z Addresses:rKz (z, ))r'rrKrstartendrVr\r^r=rr@z via rBz from rCz metric rFkernelrEglobalunicastz:} {start}{to}{via}{src}{metric}{end}[muted]{extra}[/muted]zRoutes:)r'r=r@srcrCrr2r3rzActivation Mode:z7{} inactive interfaces hidden. Use "--all" to show all.) RICH_OUTPUTr rr rrrr{ enumeraterrr[r]rXr)&rrr_console_widthr!consolepprintpad global_staternsdns_addrdns_moder\irmr#r/scolor full_typer|rrrkrrr&highlight_start highlight_end default_start default_endr@r7rCprotorErDhiddenrr&r pretty_prints2                                     zNetplanStatus.pretty_printc stds!tdrtdtdtdtddgd } |r-s7tdtd  \ \fdd |D}t|}d d |D}|}jrutfd d |Ddg}d d |D}jr|gkrtdjtdd|di}jr|n|}|D] }|\} } | || <qj} | dkrttj|dddS| dkrttj|dddS||dS)Nzsystemd-networkd.servicez^'netplan status' depends on networkd, but systemd-networkd.service is masked. Please start it.r4z3systemd-networkd.service is not active. Starting...r2Tz,Could not query iproute2 or systemd-networkdc s$g|]}t|ffqSr)rr-r)rVr\rnmcliroute4route6rrr:s$z)NetplanStatus.command..cSsg|] }|jdkr|qS)r')r(rLrrrr:sc3s |] }|jjkr|VqdSr)r3r#rLr/rrr0sz(NetplanStatus.command..cSsg|]}|dur|qSrr)r-rlrrrr:r;zCould not find interface {}r%)rr)r)indentyamlF)default_flow_style)rvsystemctl_is_activesystemctl_is_maskedryerrorsysexitr systemctlrrrrrrrr#rSr{rrrrrdumpsrQdumprK) riproute2rrfiltered online_stateritf_iterrr#rk output_formatr)rVr\rrMrNrOrrrlsN              zNetplanStatus.commandr)r r r rqrrrrrrr]rrrrrrrrrrrrWrKr __classcell__rrrrr0s"      )r)&__doc__r`rryrerYrrVtypingrrrrrrQnetplan.cli.utilsclirvr]rWfloatrrcompilerr8 rich.consolerrich.highlighterr rich.themer r ImportErrorrrNetplanCommandrrrrrs6&     z