oB]c@sddlZddlmZddlZddlZddlZdZejdeejdejdgZdZdej fd YZ dS( iN(tStringIOs[a-zA-Z_]+[a-zA-Z0-9_]*s\$s\$[0-9#\?\-@\*]s\$\{.+\}cCs(x!tD]}|j|rtSqWtS(N(tSHELL_VAR_REGEXEStsearchtTruetFalse(ttexttr((sF/usr/lib/python2.7/site-packages/cloudinit/distros/parsers/sys_conf.pyt_contains_shell_variable&s tSysConfcBs5eZdZdZdZedZdZRS(sA configobj.ConfigObj subclass specialised for sysconfig files. :param contents: The sysconfig file to parse, in a format accepted by ``configobj.ConfigObj.__init__`` (i.e. "a filename, file like object, or list of lines"). cCs#tjj||dtdtdS(Nt interpolationtwrite_empty_values(t configobjt ConfigObjt__init__RR(tselftcontents((sF/usr/lib/python2.7/site-packages/cloudinit/distros/parsers/sys_conf.pyR 5scCs`|j}t}t|ttfrC|jdj|n|jt||jS(Ns (twriteRt isinstancetlistttupletjointstrtgetvalue(RRt out_contents((sF/usr/lib/python2.7/site-packages/cloudinit/distros/parsers/sys_conf.pyt__str__:s   cs)t|tjs%td|nt|dkr;dSd}|ddkr|ddkrt|dkrfd}qn|jjd r|jjd rn`t j d |rt |r t j d |rfd }qfd}qt j }n|s|S||S(NsValue "%s" is not a stringitt"t'iicsj||S(N(t_get_single_quote(tx(R(sF/usr/lib/python2.7/site-packages/cloudinit/distros/parsers/sys_conf.pytKss$(t)s [\t\r\n ]s[\n\"']csj||S(N(t_get_triple_quote(R(R(sF/usr/lib/python2.7/site-packages/cloudinit/distros/parsers/sys_conf.pyRWscsj||S(N(R(R(R(sF/usr/lib/python2.7/site-packages/cloudinit/distros/parsers/sys_conf.pyRZs(RR(RR(Rtsixt string_typest ValueErrortlentNonetstript startswithtendswithtreRRtpipestquote(Rtvaluet multilinet quot_func((RsF/usr/lib/python2.7/site-packages/cloudinit/distros/parsers/sys_conf.pyt_quoteCs& *  cCs_|j|j|}|j|j|}|j|}d|||jd||fS(Ns %s%s%s%s%st=(t_decode_elementR/t_a_to_u(Rt indent_stringtentryt this_entrytcommenttvaltkeytcmnt((sF/usr/lib/python2.7/site-packages/cloudinit/distros/parsers/sys_conf.pyt _write_linebs (t__name__t __module__t__doc__R RRR/R:(((sF/usr/lib/python2.7/site-packages/cloudinit/distros/parsers/sys_conf.pyR-s   ( R!RR*R)R tSHELL_VAR_RULEtcompileRRR R(((sF/usr/lib/python2.7/site-packages/cloudinit/distros/parsers/sys_conf.pyts