܍~c9DddlZddlZddlZddlmZddlmZmZmZej e Z dZ gdZ GddejZdZd Zd Zdde ddfd Zd ZGd deZGddeZeejejffgZdZe dkrdZedSdS)N)log)sources url_helperutilz 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^eZdZdZdZdZdZdZedZ dZ dZ dZ d Z d Zd ZdS) 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 MAASNctj||||d|_tj|jd|_t|j |_ dS)Nmaas) r DataSource__init__base_urlospathjoinseed_dirget_id_from_ds_cfgds_cfgid_hash)selfsys_cfgdistropathss B/usr/lib/python3/dist-packages/cloudinit/sources/DataSourceMAAS.pyrzDataSourceMAAS.__init__,sT##D'65AAA  U^V<< )$+66 cP|jst|j|_|jSN) _oauth_helperget_oauth_helperrrs r oauth_helperzDataSourceMAAS.oauth_helper2s(! ?!1$+!>!>D !!r cZtj|}|d|jdS)Nz [])rr__str__r)rroots rr)zDataSourceMAAS.__str__8s-!))$// DD$---00r c |j} ||jt|jdS#t$rYn3t $r'}t d|j|d}~wwxYw|dd}|sdS | |sdS||t||j j |j ddS#t$rtjt d|YdSwxYw)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)rmcfgexcurls r _get_datazDataSourceMAAS._get_data<sG{  NN4=**    4    KCS I I I55 s3-8 A4 A4 "A//A4C!)6C!!%D  D c||_|\}}}||_||_||_|rV t j||_dS#t$r-}t d|d|_Yd}~dSd}~wwxYwdS)Nz"Invalid content in vendor-data: %s) r userdata_rawmetadatavendordata_purerconvert_vendordatavendordata_raw ValueErrorr4r5)rr>dataudmdvdes rr0zDataSourceMAAS._set_datacs  B !  + +&-&@&D&D### + + + @!DDD&*####### + + +sA A8 "A33A8cd|jzS)z/Return the subplatform metadata source details.z seed-dir (%s))rr%s r_get_subplatformzDataSourceMAAS._get_subplatformqs..r c|j}d} t|d|}n+#t$rt jt d|YnwxYw|dkrdSd} ||vr#t|d|}n+#t$rt d|YnwxYwtj}| d r |dd }|d td }|g}|j ||| \}}|rt d |n=t d|ttj|z t|S)Nxmax_waitz Failed to get max wait. using %srF2timeoutzFailed to get timeout, using %s/z/meta-data/instance-id)urlsrPrRzUsing metadata source: '%s'z(Giving up on md from %s after %i seconds)rintr6r:rr;r4r5timeendswith MD_VERSIONr& wait_for_urldebugcriticalbool) rr>r<rPrR starttime check_urlrU _responses rr7z(DataSourceMAAS.wait_for_metadata_serviceus{ K488J99::HH K K K K? J J J J J K q==5 D$dhhy'::;; D D D KK97 C C C C C DIKK <<   crc(C58SS***E {*77'8  Y   II3S 9 9 9 9 LL:DIKK)+,,    Cyys!#/%AA%'B %B54B5c~|jdStj|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)rrncfgs rcheck_instance_idz DataSourceMAAS.check_instance_idsB < 5#GlDK-H"MM|1$7777r )__name__ __module__ __qualname____doc__rdrr#rpropertyr&r)r?r0rMr7rfr rr r sFGM777 ""X" 111%%%N + + +///$$$L 8 8 8 8 8r r c`d}tfd|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_secretc>g|]}||fSrlr6).0rcfgs r z$get_oauth_helper..s'111qAswwqzz?111r rl)dictrOauthUrlHelper)rvkeyskwargss` rr$r$sD LD 1111D111 2 2F  $ . .v . ..r cd}dfd|D}dtj|dzS)z;Given a config, generate a unique identifier for this node.)rnrprqc<g|]}|dS)rs)rtfrs rrwz&get_id_from_ds_cfg..s'999Qvzz!R((999r zv1:zutf-8)rhashlibsha256encode hexdigest)rfieldsidstrs` rrrs] :F II9999&999 : :E 7>%,,w"7"788BBDD DDr c|dr |dd}tj|r%t tj|dkrt dtd|zdS)Nfile://rz%s: not a directoryz file://%s)version) startswithrrisdirlenlistdirr2r8)seed_ds rr1r1s ## 7== 5C 6(:(:$;$;q$@$@3444 kF2D A A AAr cd| tj}|dr |dd}i}tD]\}}} } ||d|} n |d|d|} t j|} || ||| } | r*| r | j||<n>t j| j||<n!t d| | j #tj $r:}|j dkr| std|d|||j dkr|Yd}~d}~wwxYwt||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. NrSrT)r/rR ssl_detailsz4Fetching from %s resulted in an invalid http code %sizMissing required z: )rr.rX DS_FIELDSrfetch_ssl_detailsokcontents decode_binaryr4r5codeUrlErrorr3check_seed_contents)seed_urlr.rRrrr/rIr _dictnamebinaryoptionalr>rresprKs rr8r8s&%6!CRC= B-6)i ?%XXtt,CC ('''448C 077K##Wg;Dwwyy A#}BtHH#1$-@@BtHH JI "   v}}X}**15qq93   r8 , ,,sBCD%0DDci}g}tD]f\}}}}||vr|s||#d|vr4|d\}} } ||vri||<||||| <[||||<gt|dkrt d|z|rt |d|d} |drPt} tj |d| t} | | urt d|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 rSrz%s: no data files foundz: missing files Nr )defaultallowedz%vendor-data was not loadable as yaml.r meta-data) rappend partitionrr2r3r6objectr load_yaml) contentseedretmissingspathdpath_binaryrtop_pvd_dataerrs rrrsr CG+4 ( ('ugx    &u%%%  %<<,,ICA#~~C!%.CHQKK CJJ 3xx1}}7$>???M"TTT77#KLLLG ww}Phh. GGM " "C&    c>>&'NOO O 77;  !5!5w >>r ceZdZdS)r2Nrgrhrirlr rr2r2%Dr r2ceZdZdS)r3Nrrlr rr3r3)rr r3c6tj|tSr")rlist_from_depends datasources)dependss rget_datasource_listr4s  $Wk : ::r __main__c ddl}ddl}ddl}|d}|dddd|d d d d|d d d d|dddd|dddd|dddt |dd}dD]5\}}|||}|dddd6|}|j |j |j |j d } |j od!D]l} d"| zd#z} tj| rCtj| tjr$|jd$| z| |_ m|j rqt+j|j } d%| vr| d%d&} | D]} | | vr| |  | | | | <|jd'| vr | d'|_|j/|jd(|d)t5| fd*fd+fd,|jd-kr|jd.|jzj}|jdd/ks|jd0rt=|j\}}}n!t?|j|j |d12\}}}tCd3tC|d4n|"tCd5||tCd6||d4n|dS|jd7kr|jdS|jd8kr;|j#d/sd9|jz|_|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)r6zdo a single GET of provided url) check-seedzread and verify seed at url)rr>zthe datasource url?)rnargsr)rnrprqro)91_kernel_cmdline_url 90_dpkg_maasz/etc/cloud/cloud.cfg.d/z.cfgzUsed config in %s. rbrr,z)Must provide a url or a config with url. r-c<|djS)Nr-)r/)r9r)r>r&s rgeturlzmain..geturls''Q'77@ @r cjtd|d|ddS)Nz== z ==  )printdecode)r>rs rprinturlzmain..printurls< Eccc66#;;+=+=+?+?+?+?@ A A A A Ar cD|dr~|D]L}|dr||'|dkr|d=||MdS|dS)NrSrz meta-data/)rXr splitlines)r>linerrrs rrzmain..crawls||C  "F3KK..00;;==77D}}S))7TT23333,,\\:;;;; 33!5666677 r rzChecking seed at %s rSr)rr.r/z=== user-data ===zN/Az=== meta-data ===z=== vendor-data ===r6rz%s/)$argparsepprintsysArgumentParser add_argumentrYadd_subparsers add_parser parse_argsckeytkeytseccsecconfigrrexistsaccessR_OKstderrwriter read_confrzr>exitr$rr9rr1r8apiverrrrX)rrrparsersubcmdsnamerrargscredsfnamefpathrvrr9userdatarBrJrrr&rs @@@@rmainr:s   ((5L(MM )     0     -     2     0     3    ''m('KK   LT4 ""4d"33A NN0T       ""!I I#y    ; B ( (1E9FB7>>%(((RYubg-F-F(J$$%;e%CDDD"'DK ; /.--Cs"",'/zz|| * *#::%*"4!$SE#JxNc$9$9~. 8  J  I J J J HHQKKK'..  A A A A A B B B B B        ;, & & J  4tx? @ @ @"*Gx{c!!TX%8%8%C%C!+=dh+G+G(8RR+=H K%, ,,,(8R % & & & 8+%%1B1B C C C % & & & MM( # # # ' ( ( ( MM2:%%2 6 6 6 6 6 [E ! ! HTX      [G # #8$$S)) , 48+ E$(OOOOO$ #r )rrrW cloudinitrloggingrrr getLoggerrgr4rYrrr r$rr1r8rr:r2r3DEP_FILESYSTEM DEP_NETWORKrrrrlr rrs $$$$$$//////////g!!      G8G8G8G8G8W'G8G8G8T///EEEBBB     7-7-7-7-t$?$?$?N     i        9   g,g.ABC ;;; zHHHT DFFFFFYr