3
( \=                 @   sz  d Z ddlmZ ddlZddlZddlmZmZm	Z	m
Z
mZ ddlmZ ddlmZmZ ddlmZmZ ddlmZmZmZmZmZmZ dd	lmZmZ dd
lm Z  ddl!m"Z" dZ#i Z$G dd deZ%e%e#e&ddZ'G dd de(Z)G dd deZ*e'j+dedd Z,e'j+dedd Z-d+ddZ.e'j+ddgd d!e'j+d"dgd#d!ed$d% Z/e'j+d&d'd(ed)d* Z0dS ),zImplements Backup Utility    )unicode_literalsN)render_templaterequestcurrent_appurl_forResponse)gettext)login_requiredcurrent_user)BatchProcessIProcessDesc)PgAdminModuleget_storage_directoryhtmlfs_short_pathdocument_diris_utility_exists)make_json_responsebad_request)PG_DEFAULT_DRIVER)Serverbackupc               @   s0   e Zd ZdZedZdd Zdd Zdd Zd	S )
BackupModulez
    class BackupModule(Object):

        It is a utility which inherits PgAdminModule
        class and define methods to load its own
        javascript file.
    Backupc             C   s   dt dd ddgS )zJ"
        Returns:
            list: js files used by this module
        zpgadmin.tools.backupzbackup.indexr   N)namepathZwhen)r   )self r   8/usr/share/pgadmin4/web/pgadmin/tools/backup/__init__.pyget_own_javascripts,   s    
z BackupModule.get_own_javascriptsc             C   s   | j S )z2
        return system preference objects
        )Zpref_show_system_objects)r   r   r   r   show_system_objects7   s    z BackupModule.show_system_objectsc             C   s
   dddgS )zL
        Returns:
            list: URL endpoints for backup module
        zbackup.create_server_jobzbackup.create_object_jobzbackup.utility_existsr   )r   r   r   r   get_exposed_url_endpoints=   s    z&BackupModule.get_exposed_url_endpointsN)	__name__
__module____qualname____doc___ZLABELr   r    r!   r   r   r   r   r   !   s
   r    )Zstatic_url_pathc               @   s   e Zd ZdZdZdZdZdS )BACKUPz0
    Constants defined for Backup utilities
             N)r"   r#   r$   r%   GLOBALSSERVEROBJECTr   r   r   r   r(   L   s   r(   c               @   s@   e Zd ZdZdd Zdd Zedd Zedd	 Zd
d Z	dS )BackupMessagez^
    BackupMessage(IProcessDesc)

    Defines the message shown for the backup operation.
    c             O   s   || _ || _|| _d|kr"|d nd | _d| _dd }xR|D ]J}|rtt|dkrt|d d dkrt|  jd| 7  _q<|  j||7  _q<W d S )Ndatabaser'   c             S   s8   | r4| j dd} | j dd} | j dd} d|  d S dS )N\z\\"z\"z""z "r'   )replace)xr   r   r   cmdArgc   s    z&BackupMessage.__init__.<locals>.cmdArgr*   z-- )backup_typesidZbfiler0   cmdlen)r   Z_typeZ_sidZ_bfileZ_argsZ_kwargsr5   argr   r   r   __init__\   s    
 zBackupMessage.__init__c             C   sh   t jj| jtjdj }ddlm} |t	}|j
| j}|jrD|jn|j}|jrV|jn|j}|j||fS )N)iduser_idr   )
get_driver)r   query	filter_byr8   r
   r=   firstpgadmin.utils.driverr?   r   connection_manageruse_ssh_tunnellocal_bind_hosthostlocal_bind_portportr   )r   sr?   drivermanagerrG   rI   r   r   r   get_server_detailsq   s    z BackupMessage.get_server_detailsc             C   sH   | j tjkrtdS | j tjkr(tdS | j tjkr<tdS tdS d S )Nz"Backing up an object on the serverzBacking up the global objectszBacking up the serverzUnknown Backup)r7   r(   r.   r&   r,   r-   )r   r   r   r   	type_desc   s    zBackupMessage.type_descc             C   s   | j  \}}}tj|}tj|}tj|}| jtjkrZtdjdj|||tj| jS | jtj	kr~tdjdj|||S | jtj
krtdjdj|||S dS d S )Nz<Backing up an object on the server '{0}' from database '{1}'z{0} ({1}:{2})z1Backing up the global objects on the server '{0}'zBacking up the server '{0}'zUnknown Backup)rM   r   safe_strr7   r(   r.   r&   formatr0   r,   r-   )r   r   rG   rI   r   r   r   message   s&    


zBackupMessage.messagec             C   s   | j  \}}}d}| jtjkrJtdjdj|||| j}|tj|7 }np| jtj	kr~tdjdj|||}|tj|7 }n<| jtj
krtdjdj|||}|tj|7 }n|d7 }|d7 }|td7 }|d	7 }|tj|| j 7 }|d
7 }|S )Nz<div>z?Backing up an object on the server '{0}' from database '{1}'...z{0} ({1}:{2})z4Backing up the global objects on the server '{0}'...zBacking up the server '{0}'...r   z</div><div class="py-1">zRunning command:z,<div class="pg-bg-cmd enable-selection p-1">z</div></div>)rM   r7   r(   r.   r&   rP   r0   r   rO   r,   r-   r9   )r   r9   argsr   rG   rI   resmsgr   r   r   details   s4    zBackupMessage.detailsN)
r"   r#   r$   r%   r<   rM   propertyrN   rQ   rU   r   r   r   r   r/   U   s   "r/   /c               C   s   t tddS )Nz#This URL cannot be called directly.)errormsg)r   r&   r   r   r   r   index   s    rY   z
/backup.jsc               C   s   t tdtddddS )zrender own javascriptzbackup/js/backup.js)r&      zapplication/javascript)ZresponsestatusZmimetype)r   r   r&   r   r   r   r   script   s
    r\   Tc          	   C   s   t  }|r&tjj|| jdjd} ntjj| sBtjjt | } |r\t| d W dQ R X t| }tj	dkr|dkrtjj
| }tjj| }t|d | }|S )z
    Args:
        file: File name returned from client file manager
        create_file: Set flag to False when file creation doesn't required

    Returns:
        Filename to use for backup with full path taken from preference
    rW   r1   aNntr'   )r   osr   joinlstripisabsr   openr   r   basenamedirname)Z_fileZcreate_fileZstorage_dirZ
short_pathZ	base_nameZdir_namer   r   r   filename_with_file_manager_path   s    

rf   z/job/<int:sid>ZPOSTZcreate_server_job)methodsendpointz/job/<int:sid>/objectZcreate_object_jobc                 s  t jrtjt jd ddntjt jddd}dkr@d }y4dkrfd dkrftd d	}ntd }W n* tk
r } ztt|d
S d}~X nX t	j
j| tjdj }|dkrtdtddS ddlm} |t}|j|j}|j }|j }	|	stdtddS |dkr(|jdn|jd}
t|
}|rLtd|dS d|d|jr`|jn|jd|jrxt|jnt|jd|jdg	 |dkr jd  j|j  |dkr jd  fdd}di fdd	}|d d! |d"d# |d$d% |dkrdkrd dk	rd d&krN j!d'g |d(d) |d*d+ n\d d,krt j!d-g |d(d) n6d d.kr j!d/g nd dkr j!d0g d1krd1 r|d1d2 dkr
d d.kr
|d3d4 nd5kr
d5 r
|d5d6 |d7d8 |d9d: |d;d< |d=d> |dd? |d@dA |dBdC |dDdE |dFdG |dHdI |dJdK |dLdM |dNdO |dPdQ |j"dRkr|dSdT |dUdV |dWdX |dYdZ d[krx d[ D ]} j!d\|g qW d]kr0x.d] D ]"\}} j!d^|j#|||g q
W y|dkr jd_  t$t%t&j'| t(d d`rtd j)dnd f d_d_ i|
 da}nPt$t%|dkrt&j*nt&j+| t(d d`rЈd j)dnd f  |
 da}|j,|j |j-dkr$t. }t|j-|db< |j/||dc n
|j/| |j0  |j}W n< tk
rz } zt1j2j3| tdddt|deS d}~X nX t|dfdgdhS )jz
    Args:
        sid: Server ID

        Creates a new job for backup task
        (Backup Database(s)/Schema(s)/Table(s))

    Returns:
        None
    datazutf-8)encodingobjectstyperP   Z	directoryfileF)rX   N)r=   r>   r   z$Could not find the specified server.)successrX   )r?   z#Please connect to the server first.r   backup_serverz--filez--hostz--portz
--usernamez--no-passwordz
--databaseglobalsz--globals-onlyc                s   | kr|  r j | d S )N)append)keyparam)rR   ri   r   r   	set_parami  s    z,create_backup_objects_job.<locals>.set_paramc                sZ   | kr:|  d k	r:|  dkr: j |  j |   n|d k	rV j |  j | d S )Nr'   )rq   )rr   rs   Zdefault_value)rR   ri   r   r   	set_valuem  s     

z,create_backup_objects_job.<locals>.set_valueverbosez	--verboseZdqoutez--quote-all-identifiersZrolez--roleZcustomz
--format=cZblobsz--blobsZratioz
--compressZtarz
--format=tZplainz
--format=pz
--format=dZ	only_dataz--data-onlyZdisable_triggerz--disable-triggersZonly_schemaz--schema-onlyZ	dns_ownerz
--no-ownerZinclude_create_databasez--createZinclude_drop_databasez--cleanZpre_dataz--section=pre-dataz--section=dataZ	post_dataz--section=post-dataZdns_privilegez--no-privilegesZdns_tablespacez--no-tablespacesZdns_unlogged_tbl_dataz--no-unlogged-table-dataZuse_insert_commandsz	--insertsZuse_column_insertsz--column-insertsZdisable_quotingz--disable-dollar-quotingZ	with_oidsz--oidsZuse_set_session_authz--use-set-session-authorizationi Zno_commentsz--no-commentsZload_via_partition_rootz--load-via-partition-rootrj   z
--encodingZ
no_of_jobsz--jobsZschemasz--schemaZtablesz--tabler0   encode)Zdescr9   rR   ZPGCONNECT_TIMEOUT)envi  )r[   rn   rX   r)   )Zjob_idZSuccess)ri   )N)4r   Zformjsonloadsri   rf   	Exceptionr   strr   r@   rA   r
   r=   rB   r   r&   rC   r?   r   rD   Z
connection	connectedutilityr   rE   rF   rG   rH   rI   Zusernamerq   Zmaintenance_dbextendversionZqtIdentr   r/   r(   r.   hasattrrw   r-   r,   Zexport_password_envZconnect_timeoutdictZset_env_variablesstartr   ZloggerZ	exception)r8   backup_obj_typeZbackup_fileeserverr?   rK   rL   Zconnr}   r~   ret_valrt   ru   rJ   tprx   Zjidr   )rR   ri   r   create_backup_objects_job  s   




































r   z+/utility_exists/<int:sid>/<backup_obj_type>Zutility_exists)rh   c             C   s   t jj| tjdj }|dkr.tdtddS ddlm	} |t
}|j|j}|dkr`|jdn|jd	}t|}|rtd|dS td
dS )z
    This function checks the utility file exist on the given path.

    Args:
        sid: Server ID
        backup_obj_type: Type of the object
    Returns:
        None
    )r=   r>   Nr   z$Could not find the specified server.)rn   rX   )r?   rk   r   ro   r)   )rn   )r   r@   rA   r
   r=   rB   r   r&   rC   r?   r   rD   r~   r   )r8   r   r   r?   rK   rL   r~   r   r   r   r   check_utility_exists  s"    
r   )T)1r%   Z
__future__r   Z
simplejsonry   r_   Zflaskr   r   r   r   r   Zflask_babelexr   r&   Zflask_securityr	   r
   Z pgadmin.misc.bgprocess.processesr   r   Zpgadmin.utilsr   r   r   r   r   r   Zpgadmin.utils.ajaxr   r   configr   Zpgadmin.modelr   ZMODULE_NAMEZserver_infor   r"   Z	blueprintobjectr(   r/   ZrouterY   r\   rf   r   r   r   r   r   r   <module>
   sB    &	 
# O