[hNHUdZddlZddlZddlZddlZddlZddlmZmZm Z m Z m Z ddl m Z mZmZddlmZddlmZddlmZddlmZd d gegd Zeed <d ZdZdZdZdZdZej@e!Z"dZ#dZ$dZ%d7dZ&d7dZ'de(de e(dee(e(fde)fdZ*d8dZ+de(de(ddfd Z,d9d!Z-d"Z.de ee(ee(e(fee(ffd#Z/d$ee ee e(dee(e(fd%ee(e(fd&ee e(d'edeee(f d(Z0d$eee(deee(fd)Z1d$eee(d*e(dee(e(fd%ee(e(fd'edeee(f d+Z2d,eee(deee(fd-Z3d,eee(ddfd.Z4d/e)d0e)d1ee(ddfd2Z5d3e(d4ed'ed5e6ddf d6Z7y):z-Mounts: Configure mount points and swap filesN)DictListOptionalTuplecast) performancesubputil)Cloud)Config) MetaSchema) PER_INSTANCE cc_mountsall)iddistros frequencyactivate_by_schema_keysmetaz&^([x]{0,1}[shv]d[a-z][0-9]*|sr[0-9]+)$z^.+:.*z /etc/fstabzcomment=cloudconfigi@cl|dvrydD]*}|j|s|jddk(s*yy)N)amirootswapT) ephemeralebs:F) startswithfind)nameenumnames >4 5- -. r%ctjj|jdd}tjj d|}|Otjj |tjj|jdd}tjj |S)N/rz /sys/block/)r.r/realpathsplitjoinr0)r1partition_path device_namesys_paths r#_is_block_devicer?Ls''"";/55c:2>Kww||M;7H!77<< bgg&&~6<>( ##r%cDtjd||}|dk(rd}tjdt|r|Stj|\}}|}|r.|j ||}||k7rtjd||t |r9||}|sy|jdsd|}tjd||ntjt|rd|}d}| t|d }nt||}|yt||r||S|Sy) Nz+Attempting to determine the real name of %sr ephemeral0z2Adjusted mount option from ephemeral to ephemeral0zMapped device alias %s to %sr8z/dev/zMapped metadata name %s to %s) LOGdebugr*r expand_dotted_devnamegetr$rr'r(DEVICE_NAME_FILTERr6r?) startname transformeraliasesdevnamer1r2origr<s r#sanitize_devnamerMVs.II;YGG+ FG#$($>$>w$G!K! Dkk+{; ;  II4dK H;'!+. %%c*'24K 14E 88& 2'24KN6{AF6 )   ! ^4  %! ! r%original sanitized fstab_devsreturnc||k7rtjd|||tjd|y||vrtjd|||yy)z*Get if the sanitized device name is valid.zchanged %s => %sz+Ignoring nonexistent default named mount %sFz&Device %s already defined in fstab: %sT)rCrD)rNrOrPs r#sanitized_devname_is_validrSs_H $h : ?J j  4  y !  r%c |tjd}|dz}d||d}|||}nk|retj|}|j|j z}||d<|t t|dz |}n||dzkDrt|dz}n||}||d<|dtzkr|}nB|d tzkr dtz}n,ttj|tz tz}t ||}||d <i} |jD]*\} } t| trd | tz z| | <&| | | <,tj!d | d | d | d| d| d|S)Ntotalna)availmax_inmemrXg?maxsizez%s MBzCsuggest %s swap for %s memory with '%s' disk given max=%s [max=%s]'rZrY)r read_meminfor.statvfsf_frsizef_bfreeminintGBroundmathsqrtitems isinstanceMBrCrD) memsizemaxsizefsyssugg_maxinfor`rXminsizer^pinfokvs r#suggested_swapsizerus##%g.{HWW =D | **T"  7??2W ?#eai.(3G  &%#+&G DKR 27 b& 'B,/025 w DDL E 1 a !b&)E!HE!H  IIM f  e  g h e  Kr%fnamer^cdfd}tjj|}tj|tj |ddk(r1t j ddd|gt j dd |gd k(r"tjd kr |||d n |||d tjj|rtj|d t j d|gy#t j$r"tjd|||d YwxYw#t j$rtj|wxYw)zSize is in MiB.z6Failed to create swapfile '%s' of size %sMB via %s: %schtjd|||dk(r ddd|z|g}n(|dk(rddd|zdd |zg}ntjd  tj|d y#tj$r4}tj ||||t j |d}~wwxYw) Nz3Creating swapfile in '%s' on fstype '%s' using '%s' fallocatez-lz%sMddz if=/dev/zerozof=%szbs=1Mzcount=%sz:Missing dependency: 'dd' and 'fallocate' are not availableT)capture)rCrDr ProcessExecutionErrorrpr del_file)rvr^methodcmdeerrmsgfstypes r# create_swapz$create_swapfile..create_swaps A      [ edlE:C t^%T! C,,L   IIc4 ())  HHVUD&! 4 MM%  sA**B1=/B,,B1rBbtrfstruncatez-s0chattrz+Cxfs)r[rzryz4fallocate swap creation failed, will attempt with ddimkswapN)r.r/dirnamer ensure_dirget_mount_infor kernel_versionr|rCrpr0chmodr})rvr^rswap_dirrrs @@r#create_swapfilers4FF<wwu%HOOH   *1 -F  :tS%01 8T5)* 4..07:E4& + t[ 1  ww~~e 5%  8U#$)) + HHK L tT * +  % % e s5 D 5E 2EE*E/ctjj|}t|j dk(r; t j d}t j|t|||}tt|dz }|stjdytjd5t||ddd|S#t$rtjdYywxYw#1swY|SxYw) z fname: full path string of filename to setup size: the size to create. set to "auto" for recommended maxsize: the maximum size autorUz)Not creating swap: failed to read meminfoN)rnrmrlrz'Not creating swap: suggested size was 0zSetting up swap file)r.r/rr-lowerr r_IOErrorrCrDrrurdrTimedr)rvr^rmrrlmibsizes r#setup_swapfilers wwu%H 4yF" '')'2G !!7G #den%&G  ;<   1 2(w'( L#  IIA B  ( LsC; C6C32C36Dct|tstjdy|j dd}|j dd}|j dd}|r|stj dyt jj|rt jjd stj d ||S tjd jD]0}|j|d zstj d ||cStj d | t|tr|dk7rtj|}t|trtj|}t!|||S#t$rtjd||cYSwxYw#t$r }tjd|Yd}~yd}~wwxYw)zahandle the swap config, calling setup_swap if necessary. return None or (filename, size) z%input for swap config was not a dict.Nfilenamez /swap.imgr^rrmzno need to setup swapz /proc/swapsz:swap file %s exists, but no /proc/swaps exists, being safe zswap file %s already in usez+swap file %s exists, but not in /proc/swapsz.swap file %s exists. Error reading /proc/swapsr)rvr^rmzfailed to setup swap: %s)rjdictrCwarningrFrDr.r/r0r load_text_file splitlinesr Exceptionr- human2bytesr)swapcfgrvr^rmliners r#handle_swapcfgr/s gt $ ;< KK K 0E ;;vq !Dkk)T*G U )* ww~~eww~~m, IIL L ++M:EEG !??53;/II;UC L ! IICU K3 dC TV^##D)D gs #&&w/GEgFF  KK@% L   3 .22 3s7:F F#F;AF?!F<;F<? G(G##G(cBg}i}g}tjjtrrt j tj D]H}t|vr|j||j}|s0|||d<|j|J|||fS)asParse /etc/fstab. Parse fstab, ignoring any lines containing "comment=cloudconfig". :return: A 3-tuple containing: - A list of lines exactly as they appear in fstab - A dictionary with key being the first token in the line and value being the entire line - A list of any lines that were ignored due to "comment=cloudconfig" r) r.r/r0 FSTAB_PATHr rr MNT_COMMENTappendr:) fstab_linesrP fstab_removedrtokss r# parse_fstabr_sKJM ww~~j!'' 3>>@ )Dd"$$T*:: K-.ab9LL&l3 ?LE5}&4U&; U#&),u*=&> U#  ? s<'8':;; \*5+6 r%cg}g}|dddD]M}|d|d|vr.tjd|d|j|d=|j|O|dddS)zRemove any entries that have a device name that doesn't exist. If the second field of a mount line is None (not the string, the value), we skip it along with any other entries that came before it that share the same device name. NrrBrz$Skipping nonexistent device named %s)rCrDr)ractlist dev_denylistrs r#remove_nonexistent_devicesrszGLtt ! 7?d1g5 IIz,add_default_mounts_to_cfg..s$% ,0DG}Q' '% sz-Not including %s, already previously included) copydeepcopyrMrrSrr-anyrCrDr) rrrPrr new_mountsrrOdefault_already_existsrs @r#add_default_mounts_to_cfgrsv&J vv'.s 3%58v  3sswapon-aN)rr )rs r#activate_swap_if_neededrs& 37 33 8T"#4r% uses_systemd changes_madedirsc6d}|rd}nYtjjDchc] }d|vr|d }}tt |j |}|r2t j ddg|rt j ddgyyycc}w) zCall 'mount -a' if needed. If changes were made, always call 'mount -a'. Otherwise, call 'mount -a' if any of the directories in the mount list are not already mounted. FT mountpointmountr systemctlz daemon-reloadN)r rvaluesboolset differencer )rrrdo_mountval mount_pointss r#mount_if_neededrsH{{}++- s"    D ,,\:; 7D/"  II{O4 5  sBr!cfgargscX|jj}|rdnd}ddd|ddg}|jd|}|jdg}tj d |t \} } } |jd i} t || | ||} t| || | |} t| } t| } t|jd i}|r| j|d d d ddg| stj dy| Dcgc]}dj|}}| Dcgc]}|djds|d}}|D]} tj||Dcgc]}|j%dd}}| Dcgc]}|j%dd}}|Dcgc] }||vsd|c}|Dcgc] }||vsd|c}z}| j'|ddj| z}tj(t*||rtj d|ntj dt-| t/|t1||ycc}wcc}w#t $rtj"td|YJwxYwcc}wcc}wcc}wcc}w)z Handle the mounts configuration.z:defaults,nofail,x-systemd.after=cloud-init.service,_netdevzdefaults,nobootwaitNrrrmount_default_fieldsrzmounts configuration is %srrrrz No modifications to fstab needed rBr8z Failed to make '%s' config-mountrz- z+ z%s  zChanges to fstab: %szNo changes to /etc/fstab made.)distrorrFrCrDrrrrrrrr;rr rrlogexcreplaceextend write_filerrrr)r!rrrrrhardcoded_defaultsrrrrPrr updated_cfgswapfiler cfg_linesdrnsaddssdropsdropaddsopscontentss r#handlers<<,,.L  E " f.CS#N*-'' 2+N36''(B2GFII*F3-8]*K]WW-r2N/ NNEK,*JK-[9Kk*Kcggfb12HHffdCEF  45/:;e5!;I;% >Q1)=AaD >D > D D OOA D ,5 5aQYYtS ! 5E 5,9 :qaiic" :F :$* @Dd%.?bK @#Ds&'8"SE D Dy! +..HOOJ)  ($/ 23K(L$t*d37< >  D KK? C D 6 : @DsHI#%I(?I(I-)JJ' J"1J"> J'J'-$JJ)N)NNN)NN)8__doc__rloggingrgr.r'typingrrrrr cloudinitrr r cloudinit.cloudr cloudinit.configr cloudinit.config.schemar cloudinit.settingsrr__annotations__rGr)rrrkre getLogger__name__rCr$r*r6r?rMr-rrSrurrrrrrrrrrrrrr%r#rs4  44--!#.+ w! j?  #   g!  $.b&sm9=c3h &6r;3;c;d;|<-`2U49d38nd3i?@24+ $x}-. /+S#X+cN+#' +  +  $s)_ +\tDI4S ?&! cO!!S#X!cN !  !  $s)_ !Hd3iT$s)_$T$s)_$$ 66&*626s)6 62E4E46E4%E4tE4E4r%