%PDF- %PDF-
Mini Shell

Mini Shell

Direktori : /lib/python2.7/site-packages/salt/fileserver/
Upload File :
Create Path :
Current File : //lib/python2.7/site-packages/salt/fileserver/svnfs.pyo

�
���^c@@s4dZddlmZmZmZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlmZddl
mZd"ZddlmZeZy"ddlZeZej�ZWnek
r�nXddlZddlZddlZddlZddlZddlZddl Zddl!Zddl"Zddl#m$Z$e	j%e&�Z'd
Z(d�Z)d�Z*d�Z+d�Z,d�Z-d�Z.dd�Z0dd�Z1d�Z2d�Z3ed�Z4d�Z5dd�Z6d�Z7d�Z8d�Z9d�Z:d �Z;d!�Z<dS(#u
Subversion Fileserver Backend

After enabling this backend, branches and tags in a remote subversion
repository are exposed to salt as different environments. To enable this
backend, add ``svnfs`` to the :conf_master:`fileserver_backend` option in the
Master config file.

.. code-block:: yaml

    fileserver_backend:
      - svnfs

.. note::
    ``svn`` also works here. Prior to the 2018.3.0 release, *only* ``svn``
    would work.

This backend assumes a standard svn layout with directories for ``branches``,
``tags``, and ``trunk``, at the repository root.

:depends:   - subversion
            - pysvn

.. versionchanged:: 2014.7.0
    The paths to the trunk, branches, and tags have been made configurable, via
    the config options :conf_master:`svnfs_trunk`,
    :conf_master:`svnfs_branches`, and :conf_master:`svnfs_tags`.
    :conf_master:`svnfs_mountpoint` was also added. Finally, support for
    per-remote configuration parameters was added. See the
    :conf_master:`documentation <svnfs_remotes>` for more information.
i(tabsolute_importtprint_functiontunicode_literalsN(tdatetime(tFileserverConfigErroru
mountpointurootutrunkubranchesutags(tsix(ttagifyusvncC@s�ttdkrtSts+tjd�tSg}xDdD]<}tjjt|�r8|j	dj
|t|��q8q8W|r�x|D]}tj|�q�Wtjd�tStS(	u.
    Only load if subversion is available
    ufileserver_backendufSubversion fileserver backend is enabled in configuration but could not be loaded, is pysvn installed?usvnfs_trunkusvnfs_branchesu
svnfs_tagsuLMaster configuration parameter '{0}' (value: {1}) cannot be an absolute pathu-Subversion fileserver backed will be disabled(usvnfs_trunkusvnfs_branchesu
svnfs_tags(t__virtualname__t__opts__tFalsetHAS_SVNtlogterrortostpathtisabstappendtformat(terrorstparamR((s9/usr/lib/python2.7/site-packages/salt/fileserver/svnfs.pyt__virtual__Ns"



cC@s{y&ttjtj|d���}WnCtjjtt	t
fk
rk}tjd|d|d|�nX|dj
SdS(u%
    Returns revision ID of repo
    urepouCError retrieving revision ID for svnfs remote %s (cachedir: %s): %suurlurevisionN(tdictRt	iteritemstCLIENTtinfotpysvnt_pysvntClientErrort	TypeErrortKeyErrortAttributeErrorRRtnumbertNone(trepot	repo_infotexc((s9/usr/lib/python2.7/site-packages/salt/fileserver/svnfs.pyt_revgs&
cC@std��dS(uB
    Fatal fileserver configuration issue, raise an exception
    u%Failed to load svn fileserver backendN(R(((s9/usr/lib/python2.7/site-packages/salt/fileserver/svnfs.pyt	_failhardyscC@stjjtdd�}t}g}i}x.tD]&}tjtdj|��||<q2Wx�tdD]�}t	j
|�}t|t�rst
t|��}tgtjtjjj||��D]!\}}	|tj|	�f^q��}
|
s
tjd|�t�nt}x=d�|
D�D]+}tjd||djt��t}q$W|rct�n|j|
�n|}t|tj�s�tjd	|�t�ny!tjjj|d
�|d
<Wntk
r�nXtttjdd��}||�j �}
tjj||
�}tjj!|�s>tj"|�ntj#|�s�y't$j%||�|j&|�t}Wq�t'j(j)k
r�}tjd
||�t�q�XnGyt$j*|�Wn3t'j(j)k
r�}tjd||�t�nX|ji|d6|d6|
d6|d6tjj|d�d6�|j&|�qgW|rtjjtdd�}y�tjj+j,|d��s}t-j.�j/d�}|j0dj|��x>|D]6}|j0tjj1j2dj|d|d���q�WWdQXWnt3k
rqXtj4d|�n|S(uL
    Return the list of svn remotes and their configuration information
    ucachedirusvnfsu	svnfs_{0}u
svnfs_remotesu�Invalid per-remote configuration for remote %s. If no per-remote parameters are being specified, there may be a trailing colon after the URL, which should be removed. Check the master configuration file.cs@s!|]}|tkr|VqdS(N(tPER_REMOTE_OVERRIDES(t.0tx((s9/usr/lib/python2.7/site-packages/salt/fileserver/svnfs.pys	<genexpr>�su|Invalid configuration parameter '%s' for remote %s. Valid parameters are: %s. See the documentation for further information.u, u[Invalid svnfs remote %s. Remotes must be strings, you may need to enclose the URL in quotesu
mountpointu	hash_typeumd5u*Failed to initialize svnfs remote '%s': %su�Cache path %s (corresponding remote: %s) exists but is not a valid subversion checkout. You will need to manually delete this directory on the master to continue to use this svnfs remote.urepouurluhashu	update.lkulockfileusvnfs/remote_map.txtuw+u%d %b %Y %H:%M:%S.%fu# svnfs_remote map as of {0}
u
{0} = {1}
Nu Wrote new svnfs_remote map to %s(5R
RtjoinRR	R&Rt	text_typeRtcopytdeepcopyt
isinstanceRtnexttiterRtsalttutilstdatatrepack_dictlistRRR%tTruetupdatetstring_typesturltstrip_protoRtgetattrthashlibtgett	hexdigesttisdirtmakedirstlistdirRtcheckoutRRRRtstatustfilestfopenRtnowtstrftimetwritetstringutilstto_strtOSErrorR(tbp_t
new_remotetrepostper_remote_defaultsRtremotet	repo_conftrepo_urltkeytvaltper_remote_conftper_remote_errorst	hash_typet	repo_hashtrp_R#t
remote_maptfp_t	timestamp((s9/usr/lib/python2.7/site-packages/salt/fileserver/svnfs.pytinit�s�
$J








	
&
cC@s�tjjtdd�}ytj|�}Wntk
rEg}nXt�}x7|D]/}y|j|d�WqVtk
r�qVXqVWg}xW|D]O}|dkr�q�ntjj||�}tjj	|�r�|j
|�q�q�Wg}|r`xh|D]]}ytj|�Wn3tk
rH}	t
jd||	�|j
|�q�Xt
jd|�q�Wnx|D]}
|j|
�qgWt|�|fS(uC
    Remove cache directories for remotes no longer configured
    ucachedirusvnfsuhashurefsu1Unable to remove old svnfs remote cachedir %s: %susvnfs removed old cachedir %s(uhashurefs(R
RR)RR?RIR[tremovet
ValueErrorR=RtshutiltrmtreeRRtdebugtbool(RJtcachedir_lsRLR!t	to_removetitemRtfailedtrdirR#tfdir((s9/usr/lib/python2.7/site-packages/salt/fileserver/svnfs.pyt_clear_old_remotes�s@

	





cC@s�tjjtdd�}tjjtdd�}g}xi||fD][}tjj|�rEytj|�Wq�tk
r�}|jdj	||��q�XqEqEW|S(u&
    Completely clear svnfs cache
    ucachedirusvnfsufile_lists/svnfsuUnable to delete {0}: {1}(
R
RR)RtexistsR^R_RIRR(tfsb_cachedirt
list_cachedirRRfR#((s9/usr/lib/python2.7/site-packages/salt/fileserver/svnfs.pytclear_cache(s$cC@s�d�}t|t�r"||�Sg}g}x�t�D]�}|r�y||dkr]w8nWq�tk
r�tj|�|dkr�q8q�q�Xn||�\}}|j|�|j|�q8W||fS(u�
    Clear update.lk

    ``remote`` can either be a dictionary containing repo configuration
    information, or a pattern. If the latter, then remotes for which the URL
    matches the pattern will be locked.
    cS@s�d�}g}g}tjj|d�r�ytj|d�Wnstk
r�}|jtjkr�ytj|d�Wq�tk
r�}||||�q�Xq�||||�q�Xdj	|d�}t
j|�|j|�n||fS(NcS@s;dj|d|d|�}tj|�|j|�dS(Nu0Unable to remove update lock for {0} ({1}): {2} uurlulockfile(RRR`R(terrlistR!R#tmsg((s9/usr/lib/python2.7/site-packages/salt/fileserver/svnfs.pyt
_add_errorAs
ulockfileuRemoved lock for {0}uurl(
R
RRiR\RIterrnotEISDIRR^R_RRR`R(R!RotsuccessReR#Rn((s9/usr/lib/python2.7/site-packages/salt/fileserver/svnfs.pyt_do_clear_lock@s"	
uurl(R-RR[RRR*textend(RNRstclearedRR!RrRe((s9/usr/lib/python2.7/site-packages/salt/fileserver/svnfs.pyt
clear_lock8s"	




cC@s�d�}t|t�r"||�Sg}g}x�t�D]�}|r�y tj|d|�scw8nWq�tk
r�tj|dtj|��s�q8q�q�Xn||�\}}|j|�|j|�q8W||fS(u�
    Place an update.lk

    ``remote`` can either be a dictionary containing repo configuration
    information, or a pattern. If the latter, then remotes for which the URL
    matches the pattern will be locked.
    cS@s�g}g}tjj|d�s�y6tjjj|dd��}|jd�WdQXWnPtt	fk
r�}dj
|d|d|�}tj|�|j
|�q�Xdj
|d�}tj|�|j
|�n||fS(Nulockfileuw+uu-Unable to set update lock for {0} ({1}): {2} uurluSet lock for {0}(R
RRiR0R1RBRCRFtIOErrorRIRRR`R(R!RrReRYR#Rn((s9/usr/lib/python2.7/site-packages/salt/fileserver/svnfs.pyt_do_lockxs

uurl(R-RR[tfnmatchRRR*Rt(RNRxtlockedRR!RrRe((s9/usr/lib/python2.7/site-packages/salt/fileserver/svnfs.pytlockps"	




c
C@s�itd6dd6}t�\|d<}x7|D]/}tjj|d�rktjd|d|d�q.nt|�\}}|r�tjd|d�q.ntj	d|d�t
|�}ytj|d	�Wn7t
jjk
r}tjd
|d|d|�nXt
|�}td�||fD��r:q.n||krSt|d<nt|�q.Wtjjtdd
�}|jdt�tks�tjj|�rDtjj|�}	tjj|	�s�tj|	�ntdt�}
tjjt�}tjjj|d��-}|j |j!|
��tj"d|�WdQXntjdt�r�tjj#j$dtdtddtdt�}
|
j%|t&ddgdd��ny*tj'j(tjjtdd�t)�Wnt*t+fk
r�nXdS(u3
    Execute an svn update on all of the repos
    uchangedusvnfsubackendulockfileu�Update lockfile is present for svnfs remote %s, skipping. If this warning persists, it is possible that the update process was interrupted. Removing %s or running 'salt-run fileserver.clear_lock svnfs' will allow updates to continue for this remote.uurlu8Unable to set update lock for svnfs remote %s, skipping.usvnfs is fetching from %surepou1Error updating svnfs remote %s (cachedir: %s): %sucachedircs@s|]}|dkVqdS(N(R (R'R(((s9/usr/lib/python2.7/site-packages/salt/fileserver/svnfs.pys	<genexpr>�susvnfs/envs.ptignore_cacheuwb+uWrote env cache data to %sNufileserver_eventsumasterusock_diru	transporttoptstlistenuupdatetprefixu
fileserveru
svnfs/hash(,R	RhR
RRiRtwarningR{RR`R$RR5RRRtanyR4RvR)RR;tisfiletdirnameR>tenvsR0tpayloadtSerialR1RBRCRFtdumpsttraceteventt	get_eventt
fire_eventRt
fileservertreap_fileserver_cache_dirt	find_fileRwRI(R2RLR!t_Rtold_revR#tnew_revt	env_cachetenv_cachedirtnew_envstserialRYR�((s9/usr/lib/python2.7/site-packages/salt/fileserver/svnfs.pyR5�sj



+
	%	cC@s�tdr-tjjjdd�td}n
td}tdrdtjjjdd�td}n
td}tjjj|d|d	|�S(
uc
    Check if an environment is exposed by comparing it against a whitelist and
    blacklist.
    usvnfs_env_whitelistuNeonutThe svnfs_env_whitelist config option has been renamed to svnfs_saltenv_whitelist. Please update your configuration.usvnfs_saltenv_whitelistusvnfs_env_blacklistutThe svnfs_env_blacklist config option has been renamed to svnfs_saltenv_blacklist. Please update your configuration.usvnfs_saltenv_blacklistt	whitelistt	blacklist(RR0R1tversionst
warn_untilRGtcheck_whitelist_blacklist(tenvR�R�((s9/usr/lib/python2.7/site-packages/salt/fileserver/svnfs.pyt_env_is_exposed�s 





c	C@s�|sGtjjtdd�}tjjt|�}|dk	rG|Snt�}x1t	�D]&}tjj|d|d�}tjj
|�r�|jd�ntj
d|d|d�tjj|d|d�}tjj
|�r|jtj|��ntj
d	|d|d�tjj|d|d
�}tjj
|�re|jtj|��qZtj
d|d
|d�qZWgt|�D]}t|�r�|^q�S(
u@
    Return a list of refs that can be used as environments
    ucachedirusvnfs/envs.purepoutrunkubaseudsvnfs trunk path '%s' does not exist in repo %s, no base environment will be provided by this remoteuurlubranchesu2svnfs branches path '%s' does not exist in repo %sutagsu.svnfs tags path '%s' does not exist in repo %sN(R
RR)RR0R�tcheck_env_cacheR tsetR[R=taddRRR5R?tsortedR�(	R|R�tcache_matchtretR!ttrunktbranchesttagsR(((s9/usr/lib/python2.7/site-packages/salt/fileserver/svnfs.pyR�s4	cC@s�|dkrFtjj|d|d�}tjj|�r?|SdSntjj|d|d�}tjj|�r�|tj|�kr�tjj||�Stjj|d|d�}tjj|�r�|tj|�kr�tjj||�SdS(u�
    Return the root of the directory corresponding to the desired environment,
    or None if the environment was not found.
    ubaseurepoutrunkubranchesutagsN(R
RR)R=R R?(R!tsaltenvR�R�R�((s9/usr/lib/python2.7/site-packages/salt/fileserver/svnfs.pyt	_env_root5s''ubasecK@sYidd6dd6}tjj|�s5|t�kr9|Sxt�D]}t||�}|dkrjqCn|dr�|j|dtjj�r�qCn|t	|d�j
tjj�}|dr�tjj|d|�}ntjj||�}tjj|�rC||d<||d<yt
tj|��|d<Wntk
rLnX|SqCW|S(u�
    Find the first file to match the path and ref. This operates similarly to
    the roots file sever but with assumptions of the directory structure
    based on svn standard practices.
    uupathurelu
mountpointurootustatN(R
RRR�R[R�R t
startswithtseptlentlstripR)R�tlisttstatt	Exception(Rttgt_envtkwargstfndR!tenv_roott	repo_pathtfull((s9/usr/lib/python2.7/site-packages/salt/fileserver/svnfs.pyR�Os0

!
#




c
@sOd�kr�jd�nidd6dd6}t�fd�dD��sP|S|ds^|S|d	|d<�jd
d
�}tjj|d�}tjj	j
|d���}|j�d�|jt
d�}|r
tjr
tjj	j|�r
|jt�}n|r;|r;tjjj||�}||d
<n||d<Wd
QX|S(u?
    Return a chunk from a file based on the data received
    uenvuudataudestc3@s|]}|�kVqdS(N((R'R((tload(s9/usr/lib/python2.7/site-packages/salt/fileserver/svnfs.pys	<genexpr>�supathulocusaltenvurelugzipurbufile_buffer_sizeN(upathulocusaltenv(tpoptallR;R R
RtnormpathR0R1RBRCtseektreadRRtPY3t	is_binarytdecodet__salt_system_encoding__t	gzip_utiltcompress(R�R�R�tgziptfpathRYR2((R�s9/usr/lib/python2.7/site-packages/salt/fileserver/svnfs.pyt
serve_file~s*


%
c@s�d�kr�jd�nt�fd�dD��s<dS�d}|dkr[d}ni}|d}|d}|s�tjj|�r�|Std	|d	<tjjtd
dd|d
j|td	��}tjj|�rJt	j
jj|d��H}|j
�jd�\}}	tjj|�|	krA||d<|SWdQXnt	j
jj|td	�|d<tjj|�}
tjj|
�s�tj|
�nt	j
jj|d��0}|jdj|dtjj|���WdQX|S(uL
    Return a file hash, the hash type is set in the master config file
    uenvc3@s|]}|�kVqdS(N((R'R((R�(s9/usr/lib/python2.7/site-packages/salt/fileserver/svnfs.pys	<genexpr>�supathusaltenvuubaseutrunkurelu	hash_typeucachedirusvnfsuhashu{0}.hash.{1}urbu:uhsumNuwu{0}:{1}(upathusaltenv(R�R�R
RR�RR)RRiR0R1RBRCR�tsplittgetmtimet	hashutilstget_hashR�R>RF(R�R�R�R�trelpathRt
cache_pathRYthsumtmtimet	cache_dir((R�s9/usr/lib/python2.7/site-packages/salt/fileserver/svnfs.pyt	file_hash�s@
	

	

 /c	C@s=d|kr|jd�nd|ks;|dt�kr?gStjjtdd�}tjj|�s�ytj|�Wq�tjk
r�t	j
d|�gSXntjj|dj|d��}tjj|dj|d��}tj
jt|||�\}}}|dk	r|S|r9it�d6t�d	6t�d
6}xut�D]j}	t|	|d�}
|
dkr}qRn|	dr�tjj|
|	d�jtjj�}
tjj|
�s�qRq�nx�tjjj|
�D]�\}}}
tjj||
�}tjj|	d|�}|d
kr_|d	j|�|r_|
r_|d
j|�q_nxV|
D]N}tjjtjj||�|
�}|djtjj|	d|��qfWq�WqRW|	dr�|d	j|	d�nx"|D]}t||�||<q�W|r)tj
jt|||�n|j|g�SgS(uY
    Return a dict containing the file lists for files, dirs, emptydirs and symlinks
    uenvusaltenvucachedirufile_lists/svnfsuUnable to make cachedir %su{0}.pu.{0}.wufilesudirsu
empty_dirsurootu
mountpointu.N(R�R�R
RR)RR=R>RRtcriticalRR0R�tcheck_file_list_cacheR R�R[R�trstripR�R1tos_walkR�R�R�twrite_file_list_cacheR;(R�tformRkt
list_cachetw_lockR�t
refresh_cachet
save_cacheR�R!R�troottdirsRBR�t
dir_rel_fntfnametrel_fnRQ((s9/usr/lib/python2.7/site-packages/salt/fileserver/svnfs.pyt_file_lists�sf""	



(	%
		0

	cC@s
t|d�S(uV
    Return a list of all files on the file server in a specified
    environment
    ufiles(R�(R�((s9/usr/lib/python2.7/site-packages/salt/fileserver/svnfs.pyt	file_listscC@s
t|d�S(u>
    Return a list of all empty directories on the master
    u
empty_dirs(R�(R�((s9/usr/lib/python2.7/site-packages/salt/fileserver/svnfs.pytfile_list_emptydirs scC@s
t|d�S(u8
    Return a list of all directories on the master
    udirs(R�(R�((s9/usr/lib/python2.7/site-packages/salt/fileserver/svnfs.pytdir_list's(u
mountpointurootutrunkubranchesutags(=t__doc__t
__future__RRRR+RpRyR:tloggingR
R^Rtsalt.exceptionsRR&tsalt.extRR	R
RR4tClientRtImportErrortsalt.utils.dataR0tsalt.utils.filestsalt.utils.gzip_utiltsalt.utils.hashutilstsalt.utils.pathtsalt.utils.stringutilstsalt.utils.urltsalt.utils.versionstsalt.fileservertsalt.utils.eventRt	getLoggert__name__RRRR$R%R[RhRlR RvR{R5R�R�R�R�R�R�R�R�R�R�(((s9/usr/lib/python2.7/site-packages/salt/fileserver/svnfs.pyt<module> sd
					}	)	8/	L	 *	/		6	G		

Zerion Mini Shell 1.0