
    g                     0   d Z ddlZddlZddlZddlmZ ddlZddlmZ ddl	m
Z
mZmZ ddlmZmZ  ej                   d      Zd	Z	 dd
lmZ ddlmZ ddlmZ  G d de      ZdZ G d dej8                        Zy# e$ r  ej6                  d       Y /w xY w)znetplan status command line    N)NetplanRoute   )utils)NetplanConfigStateSystemConfigStateJSON)DiffJSONEncoderNetplanDiffStatez\[([a-z0-9]+)\].*\[\/\1\]F)Console)RegexHighlighter)Themec                       e Zd ZdZddgZy)NetplanHighlighterznetplan.z"(^|[\s\/])(?P<int>\d+)([\s:]?\s|$)z(?P<str>(\"|\').+(\"|\'))N)__name__
__module____qualname__
base_style
highlights     5/usr/share/netplan/netplan_cli/cli/commands/status.pyr   r   '   s    
1(
r   r   Tz4python3-rich not found, falling back to plain outputc            	       \    e Zd Z fdZd Zd ZdefdZdefdZ	de
de
d	e
dee
   fd
Zde
de
d	e
de
fdZde
de
d	e
defdZde
de
d	e
defdZdee
   fdZdee
   fdZdee
   fdZdee
   fdZdee
   fdZde
fdZdee   fdZdee   fdZdefdZdefdZde
fdZde
fdZde
fdZde
fdZde
fdZ de
fdZ!dee
   fdZ"dee
   fdZ#defd Z$defd!Z%d" Z&de
fd#Z'de
fd$Z(de
fd%Z)de
fd&Z*d' Z+d( Z,d) Z-d* Z.d+ Z/de
fd,Z0d- Z1d. Z2d/ Z3d5d1e4d2e5dd0fd3Z6d4 Z7 xZ8S )6NetplanStatusc                 T    t         |   ddd       d| _        d | _        i | _        y )Nstatusz,Query networking state of the running systemT)
command_iddescriptionleafF)super__init__all
state_diffroute_lookup_table_names)self	__class__s    r   r    zNetplanStatus.__init__3   s5    H%S" 	 	$ (*%r   c                    | j                   j                  ddt        d d       | j                   j                  dddd	       | j                   j                  d
ddd	       | j                   j                  dddd       | j                   j                  ddd	       | j                   j                  ddd	       | j                   j                  dd       | j                  | _        | j                          | j                          y )Nifname?zShow only this interface)nargstypedefaulthelpz-az--all
store_truez(Show all interface data (incl. inactive))actionr,   z-vz	--verbosezShow extra informationz-fz--formattabularz2Output in machine readable `json` or `yaml` format)r+   r,   z--diffz>Show the differences between the system's and netplan's statesz--diff-onlyzCOnly show the differences between the system's and netplan's statesz
--root-dirzBSearch for configuration files in this root directory instead of /)r,   )parseradd_argumentstrcommandfunc
parse_argsrun_commandr$   s    r   runzNetplanStatus.run;   s     3&@ 	! 	B  w|&P 	! 	R  {<&> 	! 	@  z9&Z 	! 	\  ,&h 	! 	j  |&m 	! 	o  &j 	! 	l LL	r   c           
          t         rWt        dddddddd      }| j                  rt        dddddddd      }t        t	               ||d	
      }|j
                  }|S | j                  }|S )Nz	bold cyanyellowgrey62z
green boldzred boldzyellow boldbold)znetplan.intznetplan.strmutedonlineofflineunknown	highlightF)highlighterthemewidthemoji)RICH_OUTPUTr   diffr   r   printplain_print)r$   _console_widthrC   consolepprints        r   _create_pretty_printz"NetplanStatus._create_pretty_printO   s    *'!&%(# E yy#+#+%*),!'  *<*>e$2%AG]]F  %%Fr   returnc                     | j                   rD| j                   d   j                  |      x}r$|j                  d      s|j                  d      r|S i S )N
interfacessystem_statenetplan_stater"   getr$   r'   rG   s      r   _get_interface_diffz!NetplanStatus._get_interface_diffn   sI    ??|488@@t@88N+txx/HK	r   c                 `    | j                   r"| j                   j                  d      x}r||v ryy)Nmissing_interfaces_netplanTFrS   )r$   r'   missings      r    _is_interface_missing_in_netplanz.NetplanStatus._is_interface_missing_in_netplanu   s2    ??//--.JKKwKW$r   r'   statepropertyc                     | j                   rB| j                   d   j                  |      x}r"|j                  |i       j                  |g       S g S NrP   rS   r$   r'   r[   r\   rG   s        r   _get_missing_property_listz(NetplanStatus._get_missing_property_list|   sK    ??|488@@t@xxr*..x<<	r   c                     | j                   rB| j                   d   j                  |      x}r"|j                  |i       j                  |d      S y)NrP    rS   r_   s        r   _get_missing_property_strz'NetplanStatus._get_missing_property_str   sI    ??|488@@t@xxr*..x<<r   c                     | j                   rJ| j                   d   j                  |      x}r*|j                  |i       j                  |t                     S t               S r^   )r"   rT   setr_   s        r   _get_missing_property_setz'NetplanStatus._get_missing_property_set   sO    ??|488@@t@xxr*..x??ur   c                     | j                   rB| j                   d   j                  |      x}r"|j                  |i       j                  |d      S y)NrP   FrS   r_   s        r   _get_missing_property_boolz(NetplanStatus._get_missing_property_bool   sI    ??|488@@t@xxr*..x??r   c                 (    | j                  |dd      S )NrR   missing_addressesr`   r$   r'   s     r   _get_missing_netplan_addressesz,NetplanStatus._get_missing_netplan_addresses   s    ..vH[\\r   c                 (    | j                  |dd      S )NrQ   missing_nameservers_addressesrk   rl   s     r   _get_missing_system_nameserversz-NetplanStatus._get_missing_system_nameservers   s    ..v~Gfggr   c                 (    | j                  |dd      S )NrR   ro   rk   rl   s     r    _get_missing_netplan_nameserversz.NetplanStatus._get_missing_netplan_nameservers   s    ..vHghhr   c                 (    | j                  |dd      S )NrR   missing_nameservers_searchrk   rl   s     r   _get_missing_netplan_searchz)NetplanStatus._get_missing_netplan_search   s    ..vHdeer   c                 (    | j                  |dd      S )NrQ   rt   rk   rl   s     r   _get_missing_system_searchz(NetplanStatus._get_missing_system_search   s    ..v~Gcddr   c                 (    | j                  |dd      S )NrQ   missing_macaddressrc   rl   s     r   _get_missing_system_macaddressz,NetplanStatus._get_missing_system_macaddress   s    --fnFZ[[r   c                 (    | j                  |dd      S )NrR   missing_routesrf   rl   s     r   _get_missing_netplan_routesz)NetplanStatus._get_missing_netplan_routes   s    --foGWXXr   c                 (    | j                  |dd      S )NrQ   r}   r~   rl   s     r   _get_missing_system_routesz(NetplanStatus._get_missing_system_routes   s    --fnFVWWr   c                 (    | j                  |dd      S )NrQ   missing_dhcp4_addressrh   rl   s     r   _is_missing_dhcp4_addressz'NetplanStatus._is_missing_dhcp4_address       ..v~G^__r   c                 (    | j                  |dd      S )NrQ   missing_dhcp6_addressr   rl   s     r   _is_missing_dhcp6_addressz'NetplanStatus._is_missing_dhcp6_address   r   r   c                 (    | j                  |dd      S )NrQ   missing_bond_linkrz   rl   s     r   _get_missing_system_bond_linkz+NetplanStatus._get_missing_system_bond_link   s    --fnFYZZr   c                 (    | j                  |dd      S )NrR   r   rz   rl   s     r   _get_missing_netplan_bond_linkz,NetplanStatus._get_missing_netplan_bond_link   s    --foGZ[[r   c                 (    | j                  |dd      S )NrQ   missing_bridge_linkrz   rl   s     r   _get_missing_system_bridge_linkz-NetplanStatus._get_missing_system_bridge_link   s    --fnF[\\r   c                 (    | j                  |dd      S )NrR   r   rz   rl   s     r    _get_missing_netplan_bridge_linkz.NetplanStatus._get_missing_netplan_bridge_link   s    --foG\]]r   c                 (    | j                  |dd      S )NrQ   missing_vrf_linkrz   rl   s     r   _get_missing_system_vrf_linkz*NetplanStatus._get_missing_system_vrf_link   s    --fnFXYYr   c                 (    | j                  |dd      S )NrR   r   rz   rl   s     r   _get_missing_netplan_vrf_linkz+NetplanStatus._get_missing_netplan_vrf_link   s    --foGYZZr   c                 (    | j                  |dd      S )NrR   missing_interfacesrk   rl   s     r   _get_missing_netplan_membersz*NetplanStatus._get_missing_netplan_members   s    ..vH\]]r   c                 (    | j                  |dd      S )NrQ   r   rk   rl   s     r   _get_missing_system_membersz)NetplanStatus._get_missing_system_members   s    ..v~G[\\r   c                 V    | j                   r| j                   j                  di       S i S )Nmissing_interfaces_systemrS   r7   s    r   _get_missing_system_interfacesz,NetplanStatus._get_missing_system_interfaces   s&    ????&&'BBGG	r   c                     | j                  |      ry| j                  rC| j                  d   j                  |      x}r#|j                  d      s|j                  d      ryy)NTrP   rQ   rR   F)rZ   r"   rT   rU   s      r   	_has_diffzNetplanStatus._has_diff   sV    008??|488@@t@88N+txx/Hr   c           
         |j                  di       }| j                  d| j                  z   dz   j                  d|j                  dd      rdnd	             |j                  d
i       }|j                  dg       }|j                  d      }|j                  dg       }|r`t	        |      D ]R  \  }}| j                  d| j                  z   dz   j                  |dk(  rdnd||rdj                  |      nd             T |rLt	        |      D ]>  \  }}| j                  d| j                  z   dz   j                  |dk(  rdnd|	             @ | j                          y )Nnetplan-global-state{title:>	} {value}zOnline state:r>   Fz[online]online[/online]z[offline]offline[/offline]titlevaluenameservers	addressesmodesearchz} {value}[muted]{mode}[/muted]r   DNS Addresses:rb    ({}))r   r   r   DNS Search:)rT   rL   PADformat	enumerate)	r$   dataglobal_statensdns_addrdns_mode
dns_searchivals	            r   _display_global_statez#NetplanStatus._display_global_state   sd   xx 6;Z(4<<!/;/?/?%/P+Vr =  	 mR0R0v66(B/
#H- 3Z01QQYY./1f*"5=12 Z   #J/ 3Z0<DD+,6-r E  
 	r   c                 6   |j                  dd      dz   |j                  dd      z   }d}|dk(  rd}d}n	|d	k(  rd
}d}|j                  dd      }|j                  d      }|j                  d      }|dk(  r|r|d|z   dz   z  }n|dk(  r
|r|d|z   z  }d}|j                  d      r dj                  |j                  d            nd}	d}
d}| j                  rZ| j                  |      r| j                  }d}|dz  }n5d}|j                  d      r dj                  |j                  d            nd}	| j
                  r| j                  |      rJ| j                  |j                  |||j                  dd      ||||j                  dd      |	|
 	             y y )!N	operstateUNKNOWN/
adminstater@   zUP/UPUPr>   z	DOWN/DOWNDOWNr?   r*   otherssidtunnel_modewifiz/""tunneluU   [{col}]●[/{col}] {idx:>2}: {name} {type} [{col}]{state}[/{col}] ({backend}{netdef})idz: [highlight]{}[/highlight]rb   uC   {sign} [{col}]●[/{col}] {idx:>2}: [green][highlight]{name} {type}z? [{col}]{state}[/{col}] ({backend}{netdef})[/highlight][/green]uH     [muted]● {idx:>2}: {name} {type} {state} ({backend}{netdef})[/muted]z: {}indexr(   backend	unmanaged)	signcolidxnamer*   r[   r   netdefextra)rT   r   rG   rZ   PLUS	diff_onlyr   rL   )r$   r'   r   r[   scolor	full_typer   r   r   r   r   r   s               r   _display_interface_headerz'NetplanStatus._display_interface_header   s   i036,PY9ZZGEFk!EFHHVW-	xxhh}-4$++,I("{#+,IhIMRV.55dhhtnE]_9944V<yy^[[c:>((4.txx~6b~~!7KKHHWc*K8 & 
 
 "8r   c                    |j                  d      x}r`d}| j                  |      }d| j                  z   dz   }d}| j                  r#|s!d| j                  z   dz   }| j                  r/d}n,| j                  r |r| j
                  }d	| j                  z   d
z   }|s| j                  |j                  |d||j                  d      r!dj                  |j                  dd            nd             | j                  rx|ru| j                  }d	| j                  z   dz   }| j                  |j                  |d||j                  d      r!dj                  |j                  dd            nd             y y y y y )N
macaddressFr   z} {mac}[muted]{vendor}[/muted]rb     [muted]{title:>z} {mac}{vendor}[/muted]T{sign} {title:>z5} [green][highlight]{mac}{vendor}[/highlight][/green]zMAC Address:vendorr   )r   r   macr   z1} [red][highlight]{mac}{vendor}[/highlight][/red])	rT   r{   r   rG   r   r   rL   r   MINUS)r$   r'   r   r   hide_macaddressmissing_system_macaddressr   r   s           r   _display_mac_addressz"NetplanStatus._display_mac_address  sh   ,//:/#O(,(K(KF(S%()IIFDyy!:,TXX56OO>>&*O8yy*48834kk"VOO("EIXXhEW7>>$((8R*@A]_	 ,   99!:::D.txx78kkFKK! 5IMRZI[w~~dhhx.DEac	 !0 !  ";9 # 0r   c                    |j                  dg       }d}|rR| j                  |      }|D ];  }d}d}t        |j                               d   \  }	}
|
j                  dd      }g }|
j                  d      r|
j                  dg       }d}d}|rd|v rd}d	}|	 d
| }| j                  r)||vr%d| j
                  z   dz   }d}d}| j                  rHd}nE| j                  r'||v r#| j                  }d| j
                  z   dz   }d}d	}nd| j
                  z   dz   }|r| j                  |j                  ||dk(  rdnd|	||rddj                  |      z   dz   nd||             |dz  }> | j                  |      x}r| j                  }|j                  di       j                  d      x}rF|D ]A  }	| j                  d| j
                  z   dz   j                  ||dk(  rdnd|	             |dz  }C | j                  |      r>| j                  d| j
                  z   dz   j                  ||dk(  rdnd             |dz  }| j                  |      r:| j                  d| j
                  z   dz   j                  ||dk(  rdnd             y y y )Nr   r   rb   Fprefixflagsdhcp[highlight][/highlight]r   r   z*} {start}{ip}/{prefix}{end}{extra}[/muted]Tr   z1} [green]{start}{ip}/{prefix}{extra}{end}[/green]r   z1} {start}{ip}/{prefix}{end}[muted]{extra}[/muted]z
Addresses: (, ))r   r   ipr   r   startend   rQ   rj   z(} [highlight][red]{ip}[/red][/highlight]r   r   r   z4} [highlight][red]0.0.0.0/0 (dhcp)[/red][/highlight])r   r   z/} [highlight][red]::/0 (dhcp)[/red][/highlight])rT   rm   listitemsrG   r   r   r   rL   r   joinrV   r   r   r   )r$   r'   r   lstaddresses_displayedmissing_netplan_addressesobjr   hide_addressr   r   r   r   highlight_starthighlight_endaddressr   rG   rj   s                      r   _display_ip_addressesz#NetplanStatus._display_ip_addresses<  s   HH["-(,(K(KF(S% '-$ -a0	E8R099W%!IIgr2E"$ "%&3O$2MD&*990I!I09:ffF&(O$&M~~'+YY7.G#G99D.txx78kkF&3O$2M'01ddF#KK!.AQ.FlB%;@d499U#33C7b-) !0 !  (1,'O'-R ++F3343::D$(HH^R$@$D$DEX$YY Y+ -BKK!2488!;<f!f n n!.AQ.FlB !o ! 
 (1,'- --f5.txx78nnvv*=*B, w   $q(#--f5.txx78iiqq*=*B, r   6! 4r   c           
         |j                  dg       }d}|r| j                  |      }|D ]  }d}d}| j                  r)||vr%d| j                  z   dz   }	d}
d}| j                  rLd}nI| j                  r'||v r#| j
                  }d| j                  z   d	z   }	d
}
d}nd| j                  z   dz   }	d}
d}|r| j                  |	j                  ||dk(  rdnd||
|             |dz  } | j                  |      rg| j                  |      x}rS| j                  }|D ]A  }| j                  d| j                  z   dz   j                  ||dk(  rdnd|             |dz  }C y y y )Ndns_addressesr   rb   Fr   } {value}[/muted]Tr   $} [green]{start}{value}{end}[/green]r   r   r   r   r   r   r   r   r   r   r   z(} [red][highlight]{ip}[/highlight][/red]r   )rT   rr   rG   r   r   r   rL   r   r   rp   r   )r$   r'   r   r   nameservers_displayedmissing_netplan_nameserversr   r   hide_nameserverr   r   r   ro   r   s                 r   _display_dns_addressesz$NetplanStatus._display_dns_addresses  s   hh+ !*.*O*OPV*W' /"'99,G!G09:MMF&(O$&M~~*.YY3*E#E99D.txx78^^F&3O$2M'0<F&(O$&M&KK!2G12L.RT!-) !0 !  *Q.)7/: >>&!040T0TU[0\\,\zz7 /BKK!2488!;<f!f n n!2G12L.RT !o ! 
 *Q.)/ ] "r   c           
         |j                  dg       }d}|r| j                  |      }t        |      D ]  \  }}d}d}	| j                  r)||vr%d| j                  z   dz   }
d}d}| j
                  rLd}	nI| j                  r'||v r#| j                  }d| j                  z   d	z   }
d
}d}nd| j                  z   dz   }
d}d}|	r| j                  |
j                  ||dk(  rdnd|||             |dz  } | j                  |      rg| j                  |      x}rS| j                  }|D ]A  }| j                  d| j                  z   dz   j                  ||dk(  rdnd|             |dz  }C y y y )Nr   r   rb   Fr   r   Tr   r   r   r   r   r   r   r  r   z,} [red][highlight]{domain}[/highlight][/red])r   r   domain)rT   ru   r   rG   r   r   r   rL   r   r   rw   r   )r$   r'   r   r   searches_displayedmissing_netplan_searchr   r   r   hide_searchr   r   r   rt   r  s                  r   _display_dns_searchz!NetplanStatus._display_dns_search  s   hh|R(%)%E%Ef%M"#C. ,3#99,B!B09:MMF&(O$&M~~&*YY3*@#@99D.txx78^^F&3O$2M'0<F&(O$&M"KK!/AQ/FmB!-) !0 !  '!+&7,: >>&!-1-L-LV-TT)Tzz8 ,FKK!2488!;<j!j r r!/AQ/FmB% !s ! 
 '!+&, U "r   c                 	   |j                  dg       }| j                  |      }| j                  |      }d}|r| j                  st	        j
                         | _        t        d d       }|D cg c]  }|j                  |       }	}| j                  st        d |	      }	|	D ]m  }d}
d}d}|j                  dk(  rd}d}d}|j                  rd	|j                  z   }d}|j                  rd
|j                  z   }d}|j                  t        j                  k  rdt!        |j                        z   }d}| j                  rN|j"                  dkD  r?dj%                  | j                  j                  |j"                  |j"                              }g }|j&                  r,|j&                  dk7  r|j&                  }|j)                  |       |j*                  r,|j*                  dk7  r|j*                  }|j)                  |       |j,                  r,|j,                  dk7  r|j,                  }|j)                  |       d}| j.                  r)||vr%d| j0                  z   dz   }d}d}| j2                  rId}
nF| j.                  r(||v r$| j4                  }d| j0                  z   dz   }|dz  }nd| j0                  z   dz   }|
r| j7                  |j%                  ||dk(  rdnd|j                  |||||rddj9                  |      z   dz   nd||
             |dz  }p | j.                  r|D ]  }d}|j                  rd	|j                  z   }d}|j                  rd
|j                  z   }d}|j                  t        j                  k  rdt!        |j                        z   }d}| j                  rN|j"                  dkD  r?dj%                  | j                  j                  |j"                  |j"                              }g }|j*                  r,|j*                  dk7  r|j*                  }|j)                  |       |j,                  r,|j,                  dk7  r|j,                  }|j)                  |       | j:                  }d| j0                  z   dz   }| j7                  |j%                  ||dk(  rdnd|j                  |||||rddj9                  |      z   dz   nddd
             |dz  } y y c c}w )Nroutesr   c                      | j                   dk(  S )N   )table)rs    r   <lambda>z/NetplanStatus._display_routes.<locals>.<lambda>  s    !''S. r   Frb   r+   r   r   z via z from z metric z	 table {}kernelglobalunicastr   z:} {start}{to}{via}{src}{metric}{table}{end}{extra}[/muted]Tr   z1} [green][highlight]{start}{to}{via}{src}{metric}z'{table}{end}{extra}[/highlight][/green]r   zA} {start}{to}{via}{src}{metric}{table}{end}[muted]{extra}[/muted]zRoutes:r   r   r   )
r   r   toviasrcmetricr  r   r   r   r   z=} {start}[red]{to}{via}{src}{metric}{table}{extra}[/red]{end})rT   r   r   r#   r   route_table_lookupr
   _system_route_to_netplanverbosefilterr  r  	from_addrr  r   _METRIC_UNSPEC_r2   r  r   protocolappendscoper*   rG   r   r   r   rL   r   r   )r$   r'   r   r   missing_netplan_routesmissing_system_routesroutes_displayed
diff_staterouter  
hide_routedefault_startdefault_endr  r  r  r  r   protor"  r*   r   r   s                          r   _display_routeszNetplanStatus._display_routes  s   hhx$!%!A!A&!I $ ? ? G00050H0H0J-)$5JNQRUj99%@RFR<< 8&A 9*"
 " 88y($1M"0K99!EII-C??"U__4C<<,">">>'#ell*;;F<<EKK!O'..t/L/L/P/PQVQ\Q\^c^i^i/jkE>>enn&@!NNELL';;5;;(#:!KKELL'::%**	"9 ::DLL&99.D!D09:vvF$&M"$K~~%)
YY5,B#B99D.txx78kkFGGF'01ttF!KK!+;q+@ib 88%#;@d499U#33C7b+' !. 
!) 
* %)$s9*v 99. #&99!EII-C??"U__4C<<,">">>'#ell*;;F<<EKK!O'..t/L/L/P/PQVQ\Q\^c^i^i/jkE;;5;;(#:!KKELL'::%**	"9 ::DLL&zz*48834ssFMM'71'<)"xx!7<$tyy//3"'& * 
( 
) !A% G#&  Ss   /S#c                 &   |j                  d      }|r| j                  |      }d| j                  z   dz   }d}d}| j                  r#|s!d| j                  z   dz   }| j                  r1d}n.| j                  r"|r | j
                  }d	| j                  z   d
z   }|}|s#| j                  |j                  |d|             | j                  |      x}rB| j                  }d	| j                  z   dz   }| j                  |j                  |d|             y y )Nbridger   r   rb   Fr   r   Tr   /} [highlight][green]{value}[/green][/highlight]zBridge:r   r   r   +} [highlight][red]{value}[/red][/highlight])
rT   r   r   rG   r   r   rL   r   r   r   )	r$   r'   r   r   missing_netplan_bridge_linkr   r   hide_bridgemissing_system_bridge_links	            r   _display_bridgezNetplanStatus._display_bridgeI  s!   hhx *.*O*OPV*W'(4FDKyy!<,TXX56II>>"&K:yy*48834ee1VOO# ,  
 *.)M)Mf)UU%U::D&txx/0]]FKK0 (   Vr   c                 &   |j                  d      }|r| j                  |      }d| j                  z   dz   }d}d}| j                  r#|s!d| j                  z   dz   }| j                  r1d}n.| j                  r"|r | j
                  }d	| j                  z   d
z   }|}|s#| j                  |j                  |d|             | j                  |      x}rB| j                  }d	| j                  z   dz   }| j                  |j                  |d|             y y )Nbondr   r   rb   Fr   r   Tr   r/  zBond:r0  r1  )
rT   r   r   rG   r   r   rL   r   r   r   )	r$   r'   r   r   missing_netplan_bond_linkr   r   	hide_bondmissing_system_bond_links	            r   _display_bondzNetplanStatus._display_bondh  s    hhv(,(K(KF(S%(4FDIyy!:,TXX56II>> $I8yy*48834ee/VOO! ,  
 (,'I'I&'QQ#Q::D&txx/0]]FKK. (   Rr   c                 &   |j                  d      }|r| j                  |      }d| j                  z   dz   }d}d}| j                  r#|s!d| j                  z   dz   }| j                  r1d}n.| j                  r"|r | j
                  }d	| j                  z   d
z   }|}|s#| j                  |j                  |d|             | j                  |      x}rB| j                  }d	| j                  z   dz   }| j                  |j                  |d|             y y )Nvrfr   r   rb   Fr   r   Tr   r/  zVRF:r0  r1  )
rT   r   r   rG   r   r   rL   r   r   r   )	r$   r'   r   r   missing_netplan_vrf_linkr   r   hide_vrfmissing_system_vrf_links	            r   _display_vrfzNetplanStatus._display_vrf  s   hhuo'+'I'I&'Q$(4FDHyy!9,TXX56II>>#H7yy*48834ee.VOO  ,  
 '+&G&G&OO"O::D&txx/0]]FKK- (   Pr   c           
         |j                  dg       }d}|r| j                  |      }|D ]  }d}d}| j                  r)||vr%d| j                  z   dz   }	d}
d}| j                  rLd}nI| j                  r'||v r#| j
                  }d| j                  z   d	z   }	d
}
d}nd| j                  z   dz   }	d}
d}|r| j                  |	j                  ||dk(  rdnd||
|             |dz  } | j                  |      rg| j                  |      x}rS| j                  }|D ]A  }| j                  d| j                  z   dz   j                  ||dk(  rdnd|             |dz  }C y y y )NrP   r   rb   Fr   r   Tr   r   r   r   r   r   zInterfaces:r  r   z,} [red][highlight]{member}[/highlight][/red])r   r   member)rT   r   rG   r   r   r   rL   r   r   r   r   )r$   r'   r   r   members_displayedmissing_netplan_interfacesr   r   hide_memberr   r   r   missing_membersrC  s                 r   _display_memberszNetplanStatus._display_members  s   hh|R()-)J)J6)R& +#99,F!F09:MMF&(O$&M~~&*YY3*D#D99D.txx78^^F&3O$2M'0<F&(O$&M"KK!/@A/Em2!-) !0 !  &*%7+: >>&!"&"B"B6"JJJzz- +FKK!2488!;<j!j r r!/@A/Em2% !s ! 
 &*%+ K "r   c                     |j                  d      }|r3| j                  d| j                  z   dz   j                  d|             y y )Nactivation_moder   r   zActivation Mode:r   )rT   rL   r   r   )r$   r   r   s      r   _display_activation_modez&NetplanStatus._display_activation_mode  sL    hh()KKDHH,[8@@( A   r   c                 ~   | j                         }| j                  }t        |j                         d      D ]  \  }\  }}| j                  r| j                  |k7  r%| j                  dj                  |dd||j                  d                   |t        |      k7  sh| j                  ru| j                           y )Nr   u1   {sign} [{col}]● {idx:>2}  {name} {type}[/{col}]redrb   r*   )r   r   r   r   r*   )	r   r   r   r   r'   rL   r   rT   len)r$   r   r   r   	interface
propertiess         r   _display_missing_interfacesz)NetplanStatus._display_missing_interfaces  s    !@@Bzz.78J8P8P8RTU.V 	*E*Iz{{t{{i7KKKRR^^F+ S   .//	r   c                 .   t        |      rt        |      }	 t        j                  |d         }|snN|D ]H  }|d   j	                  dj                  |      d      j	                  dj                  |      d      |d<   J it        |i |S t        |i |S )Nr   z[{}]rb   z[/{}])rN  r   
MATCH_TAGSfindallreplacer   rH   )r$   argskwargsr   tagstags         r   rI   zNetplanStatus.plain_print  s    t9t*C!))#a&1 EC V^^FMM#,>C$+GGNN3,?$D FE	  #(((d%f%%r   Nr   totalc                      j                  |       _        d _        d _        d _         j
                  rd _         j
                  s j                  |       |D cg c]  }|dk7  s	|||   f }} j                  rt        t         fd|            } j                         }t        |d      D ]E  \  }\  }}	 j                  r j                  |k7  r& j                  ||	        j                  ||	        j                  ||	        j!                  ||	        j#                  ||	        j%                  ||	        j'                  ||	        j)                  ||	        j+                  ||	        j-                  ||	        j/                  |	        j                  r j1                  |      s
|t3        |      k7  st3        |      dkD  s( j                  r6 j                          H  j
                  r j5                          |t3        |      z
  }
|
dkD  r, j
                  s  j                  d	j7                  |
              j
                  r j                  s j                  d
       y y y c c}w )Nz[green]+[/green]z[red]-[/red]1820r   c                 ,    j                  | d         S )Nr   )r   )r   r$   s    r   r  z,NetplanStatus.pretty_print.<locals>.<lambda>  s    t~~ad/C r   r   r   z8
{} inactive interfaces hidden. Use "--all" to show all.zn
Use [yellow]"--diff-only"[/yellow] to omit the information that is consistent between the system and Netplan.)rM   rL   r   r   r   rG   r   r   r   r  r   r   r'   r   r   r   r  r  r,  r5  r;  rA  rH  rK  r   rN  rQ  r   )r$   r   rZ  rJ   keyrP   r   r   r'   ifconfighiddens   `          r   pretty_printzNetplanStatus.pretty_print  s5   //?&	#
99 DH yy&&t, 37X3#AW:WsDI&X
X>>f%CZPQJ!@@B)2:q)A 	"%E%FH{{t{{f4**68<%%fh7&&vx8''9$$VX6  2  2vx0fh/!!&(3))(3>>T^^F%;S_,4F0G!0KUYU`U`KKM)	", 99,,.Z(A:diiKKSZZ[abc99T^^KK B ,9G Ys   !
J,	Jc                    | j                   rd| _        | j                  rd| _        t        | j                  | j                        }| j
                  j                         }| j                  rt        | j                        }t        ||      }|j                  | j                        | _        |dk(  r/t        t        j                  | j                  t                     y |dk(  rWt        j                  | j                  t              }t        t!        j"                  t        j$                  |                   y |dk(  r-t        t        j                  |j'                                      y |dk(  r-t        t!        j"                  |j'                                      y | j)                  |j'                         |j*                         y )NT)rootdirjson)clsyaml)r   rG   r!   r   r'   r   lowerr   root_dirr
   get_diffr"   rH   re  dumpsr	   rg  dumploadsget_datarb  number_of_interfaces)r$   rQ   output_formatrR   r&  
serializeds         r   r3   zNetplanStatus.command4  s;   >>DI 99DH(dhh?))+99.t}}EM),FJ(11$++>DO&djjoFG&(!ZZ_M
dii

: 678F"$**\22456f$$))L11345l335|7X7XYr   )N)9r   r   r   r    r8   rM   dictrV   boolrZ   r2   r   r`   rc   re   rf   rh   rm   rp   rr   ru   rw   r{   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r,  r5  r;  rA  rH  rK  rQ  rI   r   intrb  r3   __classcell__)r%   s   @r   r   r   2   s   +(>T $  S C TXY\T]  C 3 SV  C 3 SV  S C TX ]S	 ]hc hi$s) ifT#Y feDI e\ \YS5F YXC4E X`4 ``4 `[s [\ \] ]^# ^Zc Z[s [^d3i ^]T#Y ] 
4 2) )V3 @BC BH+/S +/Z+,Zm&^>>>++s ++Z(&5 5c 54 5n Zr   r   )__doc__re  loggingrenetplan.netdefr   rg  rb   r   r[   r   r   r   r"   r	   r
   compilerS  rF   rich.consoler   rich.highlighterr   
rich.themer   r   ImportErrordebugNetplanCommandr   r   r   r   <module>r     s   $ "   	 '   ? ? : RZZ45
J$1 -  K
bZE(( bZ	  JGMMHIJs   A; ;BB