ó ƒjbc@sdZddlmZddlZddlZddlZddlmZddlm Z dZ ej e ƒZ ej deƒZ dZd ZejeƒZd „Zd „Zdd „Zd „Zdddd„Zd„Zddd„Zd„Zd„ZdS(s< Mounts ------ **Summary:** configure mount points and swap files This module can add or remove mountpoints from ``/etc/fstab`` as well as configure swap. The ``mounts`` config key takes a list of fstab entries to add. Each entry is specified as a list of ``[ fs_spec, fs_file, fs_vfstype, fs_mntops, fs-freq, fs_passno ]``. For more information on these options, consult the manual for ``/etc/fstab``. When specifying the ``fs_spec``, if the device name starts with one of ``xvd``, ``sd``, ``hd``, or ``vd``, the leading ``/dev`` may be omitted. In order to remove a previously listed mount, an entry can be added to the mounts list containing ``fs_spec`` for the device to be removed but no mountpoint (i.e. ``[ sda1 ]`` or ``[ sda1, null ]``). The ``mount_default_fields`` config key allows default options to be specified for the values in a ``mounts`` entry that are not specified, aside from the ``fs_spec`` and the ``fs_file``. If specified, this must be a list containing 7 values. It defaults to:: mount_default_fields: [none, none, "auto", "defaults,nobootwait", "0", "2"] On a systemd booted system that default is the mostly equivalent:: mount_default_fields: [none, none, "auto", "defaults,nofail,x-systemd.requires=cloud-init.service", "0", "2"] Note that `nobootwait` is an upstart specific boot option that somewhat equates to the more standard `nofail`. Swap files can be configured by setting the path to the swap file to create with ``filename``, the size of the swap file with ``size`` maximum size of the swap file if using an ``size: auto`` with ``maxsize``. By default no swap file is created. **Internal name:** ``cc_mounts`` **Module frequency:** per instance **Supported distros:** all **Config keys**:: mounts: - [ /dev/ephemeral0, /mnt, auto, "defaults,noexec" ] - [ sdc, /opt/data ] - [ xvdh, /opt/data, "auto", "defaults,nofail", "0", "0" ] mount_default_fields: [None, None, "auto", "defaults,nofail", "0", "2"] swap: filename: size: <"auto"/size in bytes> maxsize: iÿÿÿÿ(t whitespaceN(t type_utils(tutils&^([x]{0,1}[shv]d[a-z][0-9]*|sr[0-9]+)$s[%s]+s /etc/fstabscomment=cloudconfigcCsM|dkrtSx6d D].}|j|ƒr|jdƒdkrtSqWtS( Ntamitroottswapt ephemeraltebst:iÿÿÿÿ(RRR(RR(tTruet startswithtfindtFalse(tnametenumname((s>/usr/lib/python2.7/site-packages/cloudinit/config/cc_mounts.pytis_meta_device_nameTs   $cCs^t|ƒd|fd|fg}x4|D],}d||f}tjj|ƒr*|Sq*WdS(Nsp%ss-part%ss%s%s(tstrtostpathtexiststNone(t device_pathtpartition_numbertpotential_suffixestsuffixtpotential_partition_device((s>/usr/lib/python2.7/site-packages/cloudinit/config/cc_mounts.pyt_get_nth_partition_for_device`s cCstjj|ƒjdƒd}tjjd|ƒ}|dk rqtjj|tjj|ƒjdƒdƒ}ntjj|ƒS(Nt/iÿÿÿÿs /sys/block/(RRtrealpathtsplittjoinRR(Rtpartition_patht device_nametsys_path((s>/usr/lib/python2.7/site-packages/cloudinit/config/cc_mounts.pyt_is_block_devicejs   (cCs3|jd|ƒ|}|dkr8d}|jdƒntj|ƒ\}}t|ƒrª|}||ƒ}|sudS|jdƒs”d|f}n|jd||ƒntj|ƒrÉd|f}nd}|dkrít|dƒ}nt||ƒ}|dkr dSt ||ƒr/|dk r+|S|SdS( Ns+Attempting to determine the real name of %sRt ephemeral0s2Adjusted mount option from ephemeral to ephemeral0Rs/dev/%ssMapped metadata name %s to %si( tdebugRtexpand_dotted_devnameRRR tDEVICE_NAME_REtmatchRR"(t startnamet transformertlogtdevnameRRtorigR((s>/usr/lib/python2.7/site-packages/cloudinit/config/cc_mounts.pytsanitize_devnamess8       c s|dkrtjƒd}nd‰dˆ}idd6|d6|d6}|dkrk|dkrk|}n’|rètj|ƒ}|j|j}||d<|dkrÂtt|d ƒ|ƒ}qý||d krýt|d ƒ}qýn|dkrý|}n||d /usr/lib/python2.7/site-packages/cloudinit/config/cc_mounts.pytºscsdˆS(Ni((R4(tGB(s>/usr/lib/python2.7/site-packages/cloudinit/config/cc_mounts.pyR5¼scSs|S(N((R4((s>/usr/lib/python2.7/site-packages/cloudinit/config/cc_mounts.pyR5¾sicsdˆS(Ni((R4(R6(s>/usr/lib/python2.7/site-packages/cloudinit/config/cc_mounts.pyR5Àsi@cSs|dS(Ni((R4((s>/usr/lib/python2.7/site-packages/cloudinit/config/cc_mounts.pyR5Âsitsizeis%s MBsCsuggest %s swap for %s memory with '%s' disk given max=%s [max=%s]'i@i( RRt read_meminfoRtstatvfstf_frsizetf_bfreetmintinttitemst isinstancetLOGR$(tmemsizetmaxsizetfsystsugg_maxtinfoR9R0tformulasR7ttoptfunctMBtpinfotktv((R6s>/usr/lib/python2.7/site-packages/cloudinit/config/cc_mounts.pytsuggested_swapsize›sX              csd‰‡‡fd†}tjj|ƒ}tj|ƒtj|ƒd‰ˆd kri|||dƒncy|||dƒWnLtjk rË}tjˆ||d|ƒtjdƒ|||dƒnXtj |d ƒytj d |gƒWn$tjk rtj |ƒ‚nXd S( sSize is in MiB.s6Failed to create swapfile '%s' of size %sMB via %s: %scsÁtjd|ˆ|ƒ|dkr;ddd||g}n,|dkrgddd|dd |g}nytj|d tƒWn<tjk r¼}tjˆ||||ƒtj|ƒnXdS( Ns3Creating swapfile in '%s' on fstype '%s' using '%s't fallocates-ls%sMtdds if=/dev/zerosof=%ssbs=1Mscount=%stcapture(R@R$RtsubpR tProcessExecutionErrortwarningtdel_file(tfnameR7tmethodtcmdte(terrmsgtfstype(s>/usr/lib/python2.7/site-packages/cloudinit/config/cc_mounts.pyt create_swapçs    itxfstbtrfsRORNsWill attempt with dd.i€tmkswapN(R\R]( RRtdirnameRt ensure_dirtget_mount_infoRRR@RStchmodRQRT(RUR7R[tswap_dirRX((RYRZs>/usr/lib/python2.7/site-packages/cloudinit/config/cc_mounts.pytcreate_swapfileâs&    c Csätjj|ƒ}t|ƒjƒdkr‹ytjƒd}Wntk r_tj dƒdSXtj |ƒt d|d|d|ƒ}ntt |dƒƒ}|s¸tj d ƒdStj tj d d d td||gƒ|S(s fname: full path string of filename to setup size: the size to create. set to "auto" for recommended maxsize: the maximum size tautoR.s)Not creating swap: failed to read meminfoNRCRBRAiis'Not creating swap: suggested size was 0tmsgsSetting up swap fileRHtargsi(RRR_RtlowerRR8tIOErrorR@R$R`RMR=tlog_timeRd(RUR7RBRcRAtmibsize((s>/usr/lib/python2.7/site-packages/cloudinit/config/cc_mounts.pytsetup_swapfiles"      c CsÃt|tƒs tjdƒdS|jddƒ}|jddƒ}|jddƒ}|o_|sstjdƒdStjj |ƒr.tjj d ƒs«tjd |ƒ|Sy[xDt j d ƒj ƒD]-}|j |d ƒrÄtjd |ƒ|SqÄWtjd |ƒWq.tk r*tjd|ƒ|SXnykt|tƒr^|dkr^t j|ƒ}nt|tƒrt j|ƒ}ntd|d|d|ƒSWn#tk r¾}tjd|ƒnXdS(sdhandle the swap config, calling setup_swap if necessary. return None or (filename, size) s%input for swap config was not a dict.tfilenames /swap.imgR7iRBsno need to setup swapNs /proc/swapss:swap file %s exists, but no /proc/swaps exists, being safet sswap file %s already in uses+swap file %s exists, but not in /proc/swapss.swap file %s exists. Error reading /proc/swapsReRUsfailed to setup swap: %s(R?tdictR@RSRtgetR$RRRRt load_filet splitlinesR t ExceptionRt human2bytesRl(tswapcfgRUR7RBtlineRX((s>/usr/lib/python2.7/site-packages/cloudinit/config/cc_mounts.pythandle_swapcfg+sB      c+Cs\d}|jjƒ}|r$d}nddd|ddg}|jd|ƒ}ddd|d ddgd d d d ddgg}g} d |kr¡|d } ntjd| ƒg} i} g} x~tjtƒj ƒD]g} t | krþ| j | ƒqÙnyt j | ƒ}Wntk r$nX| | |d<| j | ƒqÙWxVtt| ƒƒD]B}t| |tƒsš|jd|dtj| |ƒƒqWnt| |dƒ}t||j|ƒ}||kré|jd||fƒn|dkr |jd|ƒqWn)|| kr4|jd|| |ƒqWn|| |d %ss#Ignoring nonexistent named mount %ss&Device %s already defined in fstab: %sschanged default device %s => %ss+Ignoring nonexistent default named mount %ss-Not including %s, already previously includeds$Skipping nonexistent device named %ss No modifications to fstab neededs%s,%siRs t mountpoints Failed to make '%s' config-mountRns- s+ s%s s tswapons-asNo changes to /etc/fstab made.sChanges to fstab: %stmountt systemctls daemon-reloads#Activating swap and mounts with: %ssActivate mounts: %s:tPASStFAIL((tdistrot uses_systemdRRpR@R$RRqt FSTAB_PATHRrt MNT_COMMENTtappendtWSRRstrangetlenR?tlistRSRtobj_nameRR-tdevice_name_to_deviceRER R RwR RR}R>R`tlogexctsubtextendt write_fileRQRR(+t_nametcfgtcloudR*t_argst def_mnt_optsR…tdefvalstdefmntstcfgmntt fstab_linest fstab_devst fstab_removedRvttokstitstartt sanitizedtjtdefmntt cfgmnt_hastcfgmtactlistR4tswaprettcc_linestneedswaptneed_mount_alltdirsRKRLt mount_pointstdtntsaddstsdropstdroptaddtsopstcontentst activate_cmdstfmtRW((s>/usr/lib/python2.7/site-packages/cloudinit/config/cc_mounts.pythandleXs           $          "      %%&*   (t__doc__tstringRtloggingtos.pathRtret cloudinitRRtDEVICE_NAME_FILTERtcompileR&R‰R†R‡t getLoggert__name__R@RRRR"R-RMRdRlRwR·(((s>/usr/lib/python2.7/site-packages/cloudinit/config/cc_mounts.pyt?s*    (G , -