
"·T`7+  ã               @   s|   d  d l  m Z d  d l  m Z d  d l  m Z e j e ƒ Z d d „  Z d d d „ Z	 d	 d
 „  Z
 d d d d „ Z d S)é    )Úlog)Ú
type_utils)Úutilc             C   sí  t  |  t ƒ r$ |  j ƒ  j d ƒ }  t  |  t ƒ rˆi  } xF|  D]>} t  | t ƒ r=x&| j ƒ  D]Ô \ } } | | k r× t  | t ƒ rœ t | ƒ | | <q6t  | t ƒ r» | g | | <q6t d t j	 | ƒ ƒ ‚ qb t  | t ƒ rú | | j
 | ƒ qb t  | t ƒ r| | j | ƒ qb t d t j	 | ƒ ƒ ‚ qb Wq@ t  | t ƒ re| | k r~g  | | <q@ t d t j	 | ƒ ƒ ‚ q@ W| }  i  } t  |  t ƒ rÐxI |  j ƒ  D] \ } } t j | ƒ | | <qªWn t d t j	 |  ƒ ƒ ‚ | S)Nú,zBad group member type %szUnknown group name type %sz@Group config must be list, dict  or string types only and not %s)Ú
isinstanceÚstrÚstripÚsplitÚlistÚdictÚitemsÚ	TypeErrorr   Úobj_nameÚextendÚappendr   Úuniq_merge_sorted)Zgrp_cfgZ	c_grp_cfgÚiÚkÚvÚgroupsZgrp_nameZgrp_members© r   ú;/usr/lib/python3/dist-packages/cloudinit/distros/ug_util.pyÚ_normalize_groups   sB    r   Nc             C   s~  t  |  t ƒ rÃ g  } x¢ |  j ƒ  D]” \ } } t  | t t t t f ƒ rn t j | ƒ r¶ | j	 t | ƒ ƒ q" t  | t ƒ r— | | d <| j	 | ƒ q" t
 d t j | ƒ | f ƒ ‚ q" W| }  n t  |  t ƒ rá t j |  ƒ }  i  } x|  D]ù } t  | t t f ƒ rBxÛ t j | ƒ D]" } | r| | k ri  | | <qWqî t  | t ƒ rÎd | k r| j d ƒ } | j | ƒ p~i  }	 t j |	 | g ƒ | | <qç| j d ƒ p¯i  }	 t j |	 | g ƒ | d <qî t
 d t j | ƒ ƒ ‚ qî W| roi  }
 xo | j ƒ  D]a \ } } i  } xB | j ƒ  D]4 \ } } | j d d ƒ j ƒ  } | r#| | | <q#W| |
 | <qW|
 } d  } | r.d | k r.| j d ƒ } | r.| j ƒ  } | j d ƒ } | j d g  ƒ } | j | i  ƒ } | j d g  ƒ } t j | | ƒ } d j | ƒ | d <t j | | | g ƒ | | <| rzxC | j ƒ  D]5 \ } } | rl| | k rld	 | d <qAd
 | d <qAW| S)NÚnamez(Unmappable user value type %s for key %sÚdefaultzDUser config must be dictionary/list  or string types only and not %sú-Ú_r   r   TF)r   r   r   ÚboolÚintÚfloatr   r   Zis_truer   r   r   r   r   r
   Z
uniq_mergeÚpopÚgetÚmergemanydictÚreplacer   ÚcopyÚjoin)Zu_cfgZdef_user_cfgZad_ucfgr   r   ÚusersZuser_configÚuÚnZprev_configZc_usersÚunameZuconfigZ	c_uconfigZdef_userZ
def_configZ
def_groupsZparsed_configZparsed_groupsZusers_groupsr   r   r   Ú_normalize_usersV   sz    
				r*   c             C   sÄ  |  s i  }  i  } i  } d |  k r4 t  |  d ƒ } i  } d |  k r£ |  d r£ |  d } t | t ƒ ru d | i } t | t ƒ s£ t j d t j | ƒ ƒ i  } i  } y | j ƒ  } Wn t	 k
 rÚ t j d ƒ Yn Xt
 j | | g ƒ } |  j d g  ƒ } t | t t t f ƒ s9t j d t j | ƒ ƒ g  } | r«t | t ƒ rd| j d d i ƒ nG t | t ƒ r’t | ƒ j d d	 ƒ | d <n t | t ƒ r«| d
 7} t | | ƒ } | | f S)Nr   Úuserr   z?Format for 'user' key must be a string or dictionary and not %sziDistro has not implemented default user access. No distribution provided default user will be normalized.r&   z\Format for 'users' key must be a comma separated string or a dictionary or a list and not %sr   Tz,default)r   r   r   r   ÚLOGZwarningr   r   Zget_default_userÚNotImplementedErrorr   r"   r!   r
   r   r*   )ZcfgZdistror&   r   Zold_userZdistro_user_configZdefault_user_configZ
base_usersr   r   r   Únormalize_users_groupsÁ   sF    
		
r.   c             C   s   |  s i  }  d d „  } |  j  ƒ  } t t | | ƒ ƒ } | sI | | f St | ƒ d } | | } | j d d  ƒ | | f Sd  S)Nc             S   s-   |  d } | s d | k r! d S| d Sd  S)Né   r   Fr   )ÚentryÚconfigr   r   r   Ú	safe_find  s    
z"extract_default.<locals>.safe_findr   r   )r   r   Úfilterr
   r    )r&   Zdefault_nameZdefault_configr2   Z	tmp_usersr   r1   r   r   r   Úextract_default
  s    

r4   )Z	cloudinitr   Zloggingr   r   Z	getLoggerÚ__name__r,   r   r*   r.   r4   r   r   r   r   Ú<module>   s   9kI