o x[h];@sddlZddlZddlZddlZddlmZmZmZddlm Z ddl m Z e e ZdZgdZGdddejZGd d d eZd d Zd dZddZddeddfddZddZGdddeZGdddeZeejffeejejffgZddZe dkrddZ e dSdS)N)sources url_helperutil)KlibcNetworkConfigSource)NetworkConfigSourcez 2012-03-01))meta-data/instance-idrFF)meta-data/local-hostnamerFF)meta-data/public-keysr FT)zmeta-data/vendor-data vendor-dataTT) user-datar TTc@sheZdZdZdZdZdZdZdZddZ e dd Z d d Z d d Z ddZddZddZddZdS)DataSourceMAASz DataSourceMAAS reads instance information from MAAS. Given a config metadata_url, and oauth tokens, it expects to find files under the root named: instance-id user-data hostname vendor-data MAASNx2cCs:tj||||d|_tj|jd|_t|j |_ dS)Nmaas) r DataSource__init__base_urlospathjoinseed_dirget_id_from_ds_cfgds_cfgid_hash)selfsys_cfgdistropathsrB/usr/lib/python3/dist-packages/cloudinit/sources/DataSourceMAAS.pyr2szDataSourceMAAS.__init__cCs|js t|j|_|jSN) _oauth_helperget_oauth_helperrrrrr oauth_helper8s zDataSourceMAAS.oauth_helpercCstj|}d||jfS)Nz%s [%s])rr__str__r)rrootrrr r&>s zDataSourceMAAS.__str__c Cs|j}z ||jt|jWdStyYnty-}z td|j|d}~ww|dd}|s8dSz| |sAWdS||t ||j j |j ddWdStycttd|YdSw)NTz%s was malformed: %s metadata_urlF)read_file_or_urlrretriesz$Failed fetching metadata from url %s)r _set_datarread_maas_seed_dirMAASSeedDirNoneMAASSeedDirMalformedLOGwarninggetwait_for_metadata_serviceread_maas_seed_urlr%readurlr Exceptionrlogexc)rmcfgexcurlrrr _get_dataBs>    zDataSourceMAAS._get_datac Csp||_|\}}}||_||_|r6z t||_WdSty5}ztd|d|_WYd}~dSd}~wwdS)Nz"Invalid content in vendor-data: %s) r userdata_rawmetadatarconvert_vendordatavendordata_raw ValueErrorr0r1)rr:dataudmdvderrr r,is  zDataSourceMAAS._set_datacCs d|jS)z/Return the subplatform metadata source details.z seed-dir (%s))rr$rrr _get_subplatformvs zDataSourceMAAS._get_subplatformcCs|}|jdkr dSt}|d}d|tf}|g}|jj||j|jd\}}|r6t d|t |St d|t t|t |S)NrF/z%s/%s/meta-data/instance-id)urlsmax_waittimeoutzUsing metadata source: '%s'z(Giving up on md from %s after %i seconds)get_url_paramsmax_wait_secondstime monotonicrstrip MD_VERSIONr% wait_for_urltimeout_secondsr0debugcriticalintbool)rr: url_params starttime check_urlrH _responserrr r3zs*     z(DataSourceMAAS.wait_for_metadata_servicecCs0|jdurdSt|d|jfi}|jt|kS)alocally check if the current system is the same instance. MAAS doesn't provide a real instance-id, and if it did, it is still only available over the network. We need to check based only on local resources. So compute a hash based on Oauth tokens.NF datasource)rrget_cfg_by_pathdsnamer)rrncfgrrr check_instance_ids z DataSourceMAAS.check_instance_id)__name__ __module__ __qualname____doc__r]rr" url_max_wait url_timeoutrpropertyr%r&r;r,rFr3r_rrrr r s   '  r cs0eZdZejejejejfZfddZ Z S)DataSourceMAASLocalcs,ts tddStdtS)NzNo initramfs applicable configFz!Found initramfs applicable config)r is_applicabler0rSsuperr;r$ __class__rr r;s    zDataSourceMAASLocal._get_data) r`rarbrCMD_LINE SYSTEM_CFGDS INITRAMFSnetwork_config_sourcesr; __classcell__rrrjr rgsrgcs*d}tfdd|D}tjdi|S)zReturn an oauth helper instance for values in cfg. @raises ValueError from OauthUrlHelper if some required fields have true-ish values but others do not.) consumer_keyconsumer_secret token_key token_secretcsg|] }||fqSrr2).0rcfgrr sz$get_oauth_helper..Nr)dictrOauthUrlHelper)rzkeyskwargsrryr r#sr#cs4d}dfdd|D}dt|dS)z;Given a config, generate a unique identifier for this node.)rrrtrucsg|]}|dqS)rv)rwfrrr r{sz&get_id_from_ds_cfg..zv1:zutf-8)rhashlibsha256encode hexdigest)rfieldsidstrrrr rsrcCsD|dr |dd}tj|rt|stdtd|ddS)Nfile://z%s: not a directoryz file://%s)version) startswithrrisdirlistdirr.r4)seed_drrr r-s  r-c Cs|durtj}|dr|dd}i}tD]n\}}} } |dur'd||f} nd|||f} z,t|} || ||| d} | rQ| rH| j||<nt| j||<nt d| | j Wqtj y}z|j dkrs| sst d ||f||j dkrz|WYd}~qd}~wwt||S) a Read the maas datasource at seed_url. read_file_or_url is a method that should provide an interface like util.read_file_or_url Expected format of seed_url is are the following files: * //meta-data/instance-id * //meta-data/local-hostname * //user-data If version is None, then / will not be used. NrGz%s/%sz%s/%s/%s)r+rJ ssl_detailsz4Fetching from %s resulted in an invalid http code %sizMissing required %s: %s)rr*endswith DS_FIELDSrfetch_ssl_detailsokcontents decode_binaryr0r1codeUrlErrorr/check_seed_contents)seed_urlr*rJrrr+rCr _dictnamebinaryoptionalr:rresprErrr r4sJ        r4c Csi}g}tD]5\}}}}||vr|s||qd|vr5|d\}} } ||vr,i||<||||| <q||||<q|sDtd||rNtd||fd} |drkt} tj|d| td} | | urktd|d|d | fS) zValidate if dictionary content valid as a return for a datasource. Either return a (userdata, metadata, vendordata) tuple or Raise MAASSeedDirMalformed or MAASSeedDirNone rGz%s: no data files foundz%s: missing files %sNr )defaultallowedz%vendor-data was not loadable as yaml.r meta-data) rappend partitionr.r/r2objectr load_yaml) contentseedretmissingspathdpath_binaryrtop_pvd_dataerrrrr r s4    rc@ eZdZdS)r.Nr`rarbrrrr r.0r.c@r)r/Nrrrrr r/4rr/cCs t|tSr!)rlist_from_depends datasources)dependsrrr get_datasource_list@s r__main__csddl}ddl}ddl}|jdd}|jddddd|jd d d dd|jd d d dd|jddddd|jddddd|jdddtd|jddd}dD]\}}|j||d}|jdddddqQ|}|j |j |j |j d } |j durd!D] } d"| d#} tj| rt| tjr|jd$| | |_ q||j rt|j } d%| vr| d%d&} | D]} | | vr| | dur| | | | <q|jdurd'| vr| d'|_|jdur|jd(|d)t| fd*d+fd,d-fd.d/|jd0krc|jd1|jj}|jdd2ks|jd3r't|j\}}}n t|j|j |d4d5\}}}t!d6t!|dur@d7n|"t!d8||t!d9||dur^d7dS|dS|jd:krp|jdS|jd;kr|j#d2sd<|j|_|jdSdS)=z Call with single argument of directory or http or https url. If url is given additional arguments are allowed, which will be interpreted as consumer_key, token_key, token_secret, consumer_secret rNzInteract with MAAS DS) descriptionz--configfilezspecify DS config file)metavarhelprz--ckeykeyzthe consumer key to auth withz--tkeyzthe token key to auth withz--csecsecretzthe consumer secret (likely '')rz--tseczthe token secret to auth withz--apiverrz the apiver to use ( can be used) subcommandssubcmd)titledest))crawlzcrawl the datasource)r2zdo a single GET of provided url) check-seedzread and verify seed at url)rr:zthe datasource url?)rnargsr)rrrtrurs)91_kernel_cmdline_url 90_dpkg_maasz/etc/cloud/cloud.cfg.d/z.cfgzUsed config in %s. r[r r(z)Must provide a url or a config with url. r)csj|ddjS)Nr))r+)r5rr:)r%rr geturlszmain..geturlcstd||fdS)Nz == %s == %s )printdecoder)rrr printurlszmain..printurlcsv|dr5|D]%}|drd||fq |dkr*d|dfq d||fq dS|dS)NrGz%s%srz meta-data/)rr splitlines)r:line)rrrrr rs   zmain..crawlrzChecking seed at %s rGr)rr*r+z=== user-data ===zN/Az=== meta-data ===z=== vendor-data ===r2rz%s/)$argparsepprintsysArgumentParser add_argumentrPadd_subparsers add_parser parse_argsckeytkeytseccsecconfigrrexistsaccessR_OKstderrwriter read_confr~r:exitr#rr5rr-r4apiverrrr)rrrparsersubcmdsnamerrargscredsfnamefpathrzrr5userdatar=rDr)rrr%rr mainFs                 "   r)!rloggingrrM cloudinitrrrcloudinit.net.cmdlinercloudinit.sourcesr getLoggerr`r0rPrrr rgr#rr-r4rr6r.r/DEP_FILESYSTEM DEP_NETWORKrrrrrrr sF        :'