3 \meZ@sdZddlZddlZddlZddlmZddlmZddlm Z dZ ej e Z dZdd Zd d Zdd d ZdddZddZddZe dkrejedS)z0Generate multi-part mime messages for user-data.N) MIMEMultipart)MIMEText)INCLUSION_TYPES_MAPz make-mimezUExample: make-mime -a config.yaml:cloud-config -a script.sh:x-shellscript > user-datac Csg}g}x|t|D]p\}\}}}|j}t||tj}|jdd||jj} | tkrxd| |df} |j | |j |qWt } x|D]} | j | qW| |fS)NzContent-Dispositionzattachment; filename="%s"z3content type %r for attachment %s may be incorrect!) enumeratereadrsysgetdefaultencodingZ add_headerZget_content_typelowerget_content_typesappendrZattach) filesZ sub_messageserrorsiZfhfilenameZ format_typecontentsZ sub_message content_typemsgcombined_messager/usr/lib/python3.6/make_mime.pycreate_mime_messages$      rcCs^y$|jdd\}}t|d||jfStk rX}ztj|d||WYdd}~XnXdS)z@Return file content type by reading the first line of the input.:rrzInvalid value for %rN)splitopenstrip ValueErrorargparseZ ArgumentError)textrrerrrfile_content_type.s r!c Cs^|s tj}t|_t|_|jdddtdgddd|jdd d d d d |jddd d dd |S)aBuild or extend and arg parser for make-mime utility. @param parser: Optional existing ArgumentParser instance representing the subcommand which will be extended to support the args of this utility. @returns: ArgumentParser with proper argument configuration. z-az--attachr r z:z3attach the given file as the specified content-type)desttypeactiondefaultmetavarhelpz-lz --list-types store_trueFz&List support cloud-init content types.)r$r%r'z-fz--forcez$Ignore unknown content-type warnings)rArgumentParser__doc__ descriptionEPILOGZepilog add_argumentr!)parserrrr get_parser9s4r/FcstfddtjDS)zReturn a list of cloud-init supported content types. Optionally strip out the leading 'text/' of the type if strip_prefix=True. cs g|]}r|jddn|qS)ztext/)replace).0Zctype) strip_prefixrr gsz%get_content_types..)sortedrvalues)r3r)r3rr as r cCs|jrtdjtdddSt|j\}}|rz|jr:dnd}x$|D]}tjj |d|dqDWtjj d|jszd St|dS) a<Create a multi-part MIME archive for use as user-data. Optionally print out the list of supported content types of cloud-init. Also setup CLI log handlers to report to stderr since this is a development utility which should be run by a human on the CLI. @return 0 on success, 1 on failure.  T)r3rZWARNINGZERRORz: z-Invalid content-types, override with --force r) Z list_typesprintjoinr rr forcerstderrwrite)nameargsrrlevelerrorrrr handle_argsms   rAcCstj}tt|S)N)r/ parse_argsrANAME)r>rrrmains rD__main__)N)F)r*rZloggingrZemail.mime.multipartrZemail.mime.textrZcloudinit.handlersrrCZ getLogger__name__ZLOGr,rr!r/r rArDexitrrrrs"     (