U
    2îíhËx  ã                   @   s  d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
Z
d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZmZ d dlZd dlmZ d d	lmZ d d
lmZ d dlm  m Z  d dl!mZ dej"krej"d rdZ#dZ$dZ%dZ&dZ'ndZ#dZ$dZ%dZ&dZ'e j( )e'dd¡a*da+dgZ,e-e-e-dœdd„Z.dd„ Z/dd„ Z0G dd„ dej1ƒZ2dd„ Z3d d!„ Z4d"d#„ Z5d$d%„ Z6d&d'„ Z7d(d)„ Z8d*d+„ Z9e-d,œd-d.„Z:e-d,œd/d0„Z;d1d2„ Z<d3d4„ Z=d5d6„ Z>d7d8„ Z?dNd9d:„Z@d;d<„ ZAd=d>„ ZBdej"kr$ej"d srd?ZCd@dAiZDe
jEeCdB eDdCjFZGe
jEeCdD eDdCjFZHe
jEeCdE eDdCjFZIdFaJndGaJdaKdaLe<ƒ  daMe8ƒ  e.dHddIƒaNi aOi ZPdaQi ZRtND ]&ZSdtOeS< dePeS< e.dJeSdKƒeReS< q®e.dHddLƒZTe.dHddMƒZUe=ƒ  i aVtND ]ZSdtVeS< e;eSƒ qüdS )Oé    N)Údatetime)Úclosing)ÚMIMEApplication)ÚMIMEMultipart)ÚMIMEText)Ú
COMMASPACEÚ
formatdate)Úservice_account)Úbuild)Ú	HttpError)ÚappÚLOCALTFÚ z/var/www/FlaskAppzFlaskApp/appzservice_key.jsonz zd_zapier@mclarenwilliams.com.auú*https://www.googleapis.com/auth/gmail.send)Ú	secret_idÚcustomerÚ	parameterc                 C   s(   t t| ƒ}|r|| | }n|| }|S ©N)ÚgetattrÚsecrets)r   r   r   Ú	attributeÚsecret© r   ú(/var/www/FlaskApp/FlaskApp/app/common.pyÚaccess_secret_version/   s
    
r   c              	   C   sn   dt jkrt jd rd}nd}z,t||  dƒ}t ||¡ W 5 Q R X W dS    td|  d ƒ‚Y dS X d S )	Nr   ú./FlaskApp/app/ú/var/www/FlaskApp/FlaskApp/app/ÚwTz Storing of variable to json fileZfailedF)r   ÚconfigÚopenÚjsonÚdumpÚ	Exception)ÚfileÚvariableÚfile_prefixZoutfiler   r   r   Ú	json_dump8   s    r&   c              
   C   sŠ   dt jkrt jd rd}nd}z0t||  ƒ}t |¡W  5 Q R £ W S Q R X W n6 tk
r„ } zt t|ƒ¡ W Y ¢dS d }~X Y nX d S )Nr   r   r   F)	r   r   r   r    ÚloadÚFileNotFoundErrorÚloggerÚwarningÚstr)r#   r%   ÚinfileZ	fnf_errorr   r   r   Ú	json_loadF   s    "r-   c                       s<   e Zd Z‡ fdd„Zdd„ Zdd„ Zdd„ Zd	d
„ Z‡  ZS )ÚGmailLoggingHandlerc                    s0   t ƒ  ¡  || _|| _|| _|| _|  ¡ | _d S r   )ÚsuperÚ__init__Úservice_account_fileÚdelegated_userÚsenderÚ	recipientÚauthenticate_gmail_apiÚservice)Úselfr1   r2   r3   r4   ©Ú	__class__r   r   r0   S   s    
zGmailLoggingHandler.__init__c                 C   s6   dg}t jj| j|d}| | j¡}tdd|d}|S )Nr   ©ÚscopesÚgmailÚv1©Úcredentials)r	   ÚCredentialsÚfrom_service_account_filer1   Úwith_subjectr2   r
   )r7   ÚSCOPESr?   Zdelegated_credentialsr6   r   r   r   r5   [   s     ÿz*GmailLoggingHandler.authenticate_gmail_apic                 C   s>   t |ƒ}| j|d< | j|d< ||d< t | ¡ ¡ ¡ }d|iS )NÚtoÚfromÚsubjectÚraw)r   r4   r3   Úbase64Úurlsafe_b64encodeÚas_bytesÚdecode)r7   rF   Úmessage_textÚmessagerG   r   r   r   Úcreate_messagec   s    

z"GmailLoggingHandler.create_messagec              
   C   sf   z0| j  ¡  ¡ jd|d ¡ }td|d  ƒ W n0 tk
r` } ztd|› ƒ W 5 d }~X Y nX d S )NÚme©ZuserIdÚbodyzMessage Id: %sÚidzAn error occurred: )r6   ÚusersÚmessagesÚsendÚexecuteÚprintr"   )r7   rM   Zsent_messageÚerrorr   r   r   Úsend_messagek   s
    z GmailLoggingHandler.send_messagec                 C   s0   |   |¡}d|j› }|  ||¡}|  |¡ d S )NzUPHANCE-CROSSDOCKS-LOGGING: )ÚformatÚ	levelnamerN   rY   )r7   ÚrecordZ	log_entryrF   rM   r   r   r   Úemitr   s    
zGmailLoggingHandler.emit)	Ú__name__Ú
__module__Ú__qualname__r0   r5   rN   rY   r]   Ú__classcell__r   r   r8   r   r.   R   s
   r.   c               
   C   s  t  t¡at t j¡ t  ¡ } t  ¡ }| t j¡ t  dd¡}| |¡ t 	|¡ t 
d¡ tdd dƒ}t jjdtdd dƒtdd dƒd	t tdd dƒ|fd
d}ttttdd dƒd tdd dƒ¡ƒ}| t j¡ | t j¡ | |¡ | |¡ t 	|¡ t 
d¡ d S )NzP[%(asctime)s] p%(process)s {%(pathname)s:%(lineno)d} %(levelname)s - %(message)sz%m-%d %H:%M:%Sz Attempting to start SMTP loggingÚglobal_parametersÚemail_pw)úsmtp.gmail.coméK  Ú
from_emailÚemailsz'Cross Docks Uphance Google VM Logging: r   )ZmailhostZfromaddrZtoaddrsrF   r?   Úsecureú,zLCross Docks - Uphance API: Logging started for File, Stream and SMTP logging)ÚloggingÚ	getLoggerr^   r)   ÚsetLevelÚDEBUGÚStreamHandlerÚ	FormatterÚsetFormatterÚ
addHandlerÚdebugr   ÚhandlersZSMTPHandlerÚserverr.   ÚSERVICE_ACCOUNT_FILEÚDELEGATED_USERÚjoinÚINFO)Znew_relic_handlerZstream_handlerrZ   Ú	sender_pwZsmtp_handlerZgmail_handlerr   r   r   Úlogging_initiatex   s0    





û$


rz   c              
   K   sJ  |  dd ¡}|  dd ¡}|  dd ¡}|  dd ¡}|  dd ¡}	dg}
tjjt|
d}| t¡}tdd	|d
}tdd dƒ}t	|ƒt
krŠ|g}n¶t	|ƒtkr$g }|D ]€}|dkrÊtdd dƒD ]}| |¡ q¸q |dkrðtd|	dƒD ]}| |¡ qÞq t	|ƒtkr|D ]}| |¡ qq | |¡ q ntdt
|ƒ ƒ‚t ¡  dS t	|ƒt
krT|g}t	|ƒt
krh|g}t dt
|ƒ ¡ tƒ }||d< t |¡|d< tdd|d< |	r¼|	d | |d< n||d< |rÖ| d|¡ |rüt |¡|d< t t
|d ƒ¡ | t|dƒ¡ |pg D ]J}t|dƒ}t| ¡ t|ƒd}W 5 Q R X dt|ƒ |d < | |¡ qd!t | ¡ ¡  ¡ i}t d"t
|ƒ¡ t d#t
|ƒ¡ z:| !¡  "¡ j#d$|d% $¡ }t d&|› d'|d( › ¡ W dS  t%k
r } zt &d)|› ¡ d }W Y ¢dS d }~X Y n6 tk
rD } zt 'd*|¡ W Y ¢dS d }~X Y nX d S )+NÚattachmentsÚreply_toÚccÚbccr   r   r:   r<   r=   r>   rb   rf   Úglobalrg   Úcustomer_parametersúTError sending email: send email destination address in the wrong fomat. dest_email: FzDestination email address(es):ZFromZToT)Ú	localtimeÚDatez : ZSubjectzreply-toÚCcÚplainÚrb)ÚNamezattachment; filename="%s"zContent-DispositionrG   zMsg is : %szCreate message is : %srO   rP   zsent message to z Message Id: rR   zSend email API error occurred: z(Unexpected error while sending email: %s)(Úpopr	   r@   rA   ru   rB   rv   r
   r   Útyper+   ÚlistÚappendr"   ÚsmtpÚquitr)   rr   r   r   rw   r   Ú
add_headerÚattachr   r   r   ÚreadÚbasenamerH   rI   rJ   rK   rS   rT   rU   rV   r   rX   Ú	exception)Úemail_counterÚmessage_subjectrL   Ú
dest_emailÚkwargsr{   r|   r}   r~   r   rC   ÚcredsZdelegated_credsr6   Úsender_emailÚreceiver_email_addressÚtextÚeÚmsgÚfZfilÚpartrN   rM   rX   r   r   r   Ú
send_email¡   sˆ    
þrŸ   c              
   K   s,  |  dd ¡}| d7 } |r2td|dƒ}td|dƒ}ntdd dƒ}tdd dƒ}| d	k rxt d
t| ƒ d | d | ¡ dS | dkrîzHt dd¡}| ¡  | ||¡ t	|ƒtkrº|g}	nšt	|ƒt
kr6g }	|D ]b}
|
dksà|sþtdd dƒD ]}|	 |¡ qìqÐ|
dkr(td|dƒD ]}|	 |¡ qqÐ|	 |
¡ qÐntdt|ƒ ƒ‚| ¡  W dS dtdd dƒ d tdd dƒ d }|s‚d}|dd |	¡  d | d | d | }| ||	| d¡¡ | ¡  W dS  tjk
r” } z¦d	}|j}|j}t t ¡ d ¡ |dkrPt t ¡ d ¡ t| |d  t| ƒ ||	|d! | d8 } W Y ¢<dS t ¡ }t d"t|ƒ d# t|ƒ ¡ | d8 } W Y ¢dS d }~X Y nX tk
rê } z8t ¡ }t d$t|ƒ d# t|ƒ ¡ | d8 } W Y ¢dS d }~X Y nX n:t t ¡ d ¡ t|| |d% t| ƒ ||	ƒ | d8 } dS d S )&Nr   é   r€   Zreporting_emailZreporting_email_pwrb   rf   rc   r   zEmail counter below zero: Ú Fé   rd   re   r   rg   r   zFrom: Ú	from_nameÚ<z>
úNo customerz	To:  %s
ri   z	Subject: z : Uphance Cross Docks message z

zutf-8Ti¥  z depth: ©r   z;Send mail SMTP error - no retry performed/nException Info: z/nTraceback Info: z8Other email error - no retry performed/nException Info: z depth 5 or more: )rˆ   r   r)   r’   r+   ÚsmtplibZSMTPZstarttlsÚloginr‰   rŠ   r‹   r"   r   rw   ZsendmailÚencodeZSMTPResponseExceptionZ	smtp_codeZ
smtp_errorÚtimeÚsleepÚrandomrŸ   Ú	tracebackÚ
format_excr*   )r“   r”   rL   r•   r–   r   r˜   ry   rŒ   r™   rš   r›   Z	smtp_fromrM   ÚexZerror_countZ
error_codeZerror_messageÚtbr   r   r   Úsend_email_old  sx    "

$*

r±   c                 K   sì   |  dd¡}g }zˆtj| ddD ]n\}}}|D ]^}ttj | |¡dƒ}| ¡ }	W 5 Q R X tj tj | |¡¡}
||	t 	|
¡dœ}| 
|¡ q.q d|fW S  tk
ræ } z0t d| d ttƒ d	 t|ƒ ¡ W Y ¢d
S d }~X Y nX d S )Nr   r¥   T©ÚtopdownÚr)Ú	file_nameÚ	file_dataZmod_timeúLogging Warning Error for : z?
Uphance_webhook_error : Local File Reading Error 
File Names: ú
Error:)FN)rˆ   ÚosÚwalkr   Úpathrw   r   Úgetmtimer   Úfromtimestampr‹   r"   r)   r*   r+   Zlocal_files)Úfolderr–   r   Z
localfilesÚrootÚdirsÚfilesr   Ú	text_fileZfiledataÚtÚ	file_itemr¯   r   r   r   ÚgetLocalFilesa  s    
&rÅ   c           	   
   K   sÄ   |  dd¡}|  dd ¡}|  dd ¡}z0ttj | |¡dƒ}| |¡ W 5 Q R X W dS  tk
r¾ } zLt d| d | d	 t	|ƒ d
 t	|ƒ d | d t	|ƒ ¡ W Y ¢dS d }~X Y nX d S )Nr   r¥   rX   Úrequest_dictr   Tr·   z;
Uphance_webhook_error : Local File Save Error 
File Name: z
Error Info: r¸   z
Output file:
z
Input Request:
F)
rˆ   r   r¹   r»   rw   Úwriter"   r)   r*   r+   )	r¾   rµ   r¶   r–   r   rX   rÆ   rÂ   r¯   r   r   r   ÚstoreLocalFilex  s    BrÈ   c               
   C   sð   t sìtdd dƒ} tdd dƒ}tdd dƒ}tj| ||da zTt jdd}|jdkrVW dS d	a t ¡ }td
ddt	|jƒ d | dgƒ W d	S W n^ t
k
rê } z@td|ƒ t ¡ }td
ddt	|ƒ d | dgƒ d	a W Y ¢d	S d }~X Y nX d S )Nrb   Údbx_app_keyÚdbx_app_secretÚdbx_refresh_token)Zapp_keyZ
app_secretZoauth2_refresh_tokenzTest Me)ÚqueryTFr   zError Initialising DropboxzCheck result is: ú
Traceback:
r   z
Exception:zException: )Údbxr   ÚdropboxZDropboxZ	check_appÚresultr­   r®   rŸ   r+   r"   rW   )rÉ   rÊ   rË   Úcheckr°   r¯   r   r   r   Údropbox_initiate…  s&    
"

 rÒ   c           
   
   C   s€  d}t stdƒa t sd}|s†| t kr‚t t |  d t |  d  ¡}|t ¡  }|jdk r†t dt|jƒ d d	 |  d
 ¡ d}nd}|r|d}ddi}t	d| dƒ}|d |d ddœ}z~t
j|||d}|jdkrt d|  ¡ t sìi a | ¡ t | < tdt ƒ t d|  ¡ n"t d|  d t|jƒ ¡ W dS W nD tk
rz }	 z$t d|  d t|	ƒ ¡ W Y ¢dS d }	~	X Y nX dS )NFzuphance_access_tokens.jsonTÚ
created_atÚ
expires_iné   z;Uphance access token expiry - Uphance token will expire in z daysz for z
Getting new access tokenz#https://api.uphance.com/oauth/tokenúContent-Typeúapplication/jsonr€   Úuphance_loginÚusernameÚpassword)ÚemailrÚ   Ú
grant_type©r    ÚheaderséÈ   zNew token fetched for z!Uphance access token renewed for z1Problem getting new access token for Uphance for ú : Response Status Code = z3Exception getting new access token for Uphance for Ú
)Úuphance_access_tokenr-   r   ÚutcfromtimestampÚnowÚdaysr)   Úinfor+   r   ÚrequestsÚpostÚstatus_coder    r&   r*   r"   )
r   Zuphance_token_refreshÚuphance_expiresÚtdZuphance_token_urlÚuphance_headersrØ   Zuphance_get_tokenÚresponser¯   r   r   r   Úuphance_check_token_status  sH    
$þ

rî   r¦   c              
   K   sr  |  dd ¡}t| ƒrjt|  r$|r\t t|  d t|  d  ¡}dt|  d  ddœt| < dt|  i}zštjt	|t|  d	}|j
d
krÞtdkr®t d|  d | d¡ ¡ nt d|  d | d¡ ¡ t | ¡ ¡ W dS t d|  d t|j
ƒ ¡ W dS W nV tk
rX } z6t d|  d t|ƒ ¡ t ¡ }t |¡ W Y ¢dS d }~X Y nX n
t d¡ dS dS d S )NÚforce_initiaterÓ   rÔ   zBearer Úaccess_tokenr×   )ÚAuthorizationrÖ   ZorganizationIdrÝ   éÉ   Ú
Productionz
Logger Info for z1 Uphance initiated and Uphance token expires on: z%Y-%m-%dTzProblem initiating Uphance for rà   Fz8Exception occurred while trying to initiate Uphance for rá   zUphance already initiated)rˆ   rî   rì   r   rã   râ   Úuphance_org_idrç   rè   Úuphance_register_urlré   rt   r)   ræ   Ústrftimerr   r    r*   r+   r"   r­   r®   )r   r–   rï   rê   Zuphance_registerrí   r¯   r°   r   r   r   Úuphance_initiateË  s0    




r÷   c                 C   s.   t |  s&td| dƒtd| dƒdœt | < t |  S )Nr€   Zcross_docks_FTP_usernameZcross_docks_FTP_pw)rÙ   rÚ   )Úcross_docks_infor   r¦   r   r   r   Úget_CD_FTP_credentialsï  s
    

ÿ
rù   c                   C   s   t stƒ  t d¡ da d S )NzInitiate logging doneT)Úinitiate_logging_donerz   r)   rr   r   r   r   r   Úcheck_logging_initiateø  s    
rû   c                  C   s   t D ]} t| ƒt| < qd S r   )Ú	customersr÷   Úuphance_running)Úcr   r   r   Úcheck_uphance_initiate   s    rÿ   c                 K   s‚  |  dd ¡}|  dd ¡}|  dd ¡}ts6|s6|dkrLd}|dkrftj||t|  d}t d| ¡ nn|d	krtj|t|  d
}t d| ¡ nD|dkrºtj|t|  d
}t d| ¡ nt 	d| ¡ d}|dfS |j
dkrt d| d |  ¡ t | ¡ ¡ || ¡ fS t 	d| d |  d | d t|j
ƒ ¡ t|j
ƒdfS n2t d|  d | d t|ƒ d t|ƒ ¡ dS d S )NÚurlr    ÚoverrideÚgetFrè   rÝ   zPost Úput©rÞ   zPut zGet zError in api_type: zError in api_typeÚNULLrß   zUphance z successful for z error for z
URL: z
Response Status Code: zDummy API uphance call for rá   )Fz Testing Call to uphance_api_call)rˆ   ÚUphance_activerç   rè   rì   r)   rr   r  r  r*   ré   r    r+   ræ   )r   Zapi_typer–   r   r    Ú	_overrideZreturn_errorrí   r   r   r   Úuphance_api_call  s2    ,.r  c              
   C   s¼   zNt  |¡\}}t|ƒ.}|j}t d| ¡ t |¡W  5 Q R £ W S Q R X W nh tk
r¶ } zJt	 
¡ }t d|  d | d t|ƒ d t|ƒ ¡ t d¡ W Y ¢dS d }~X Y nX d S )NzDropbox Read done successfully:úLogging Warning Error for :z& Exception in read_dropbox
File Path: ú
Dropbox Error:rÍ   úDropbox Read ErrorF)rÎ   Zfiles_downloadr   Úcontentr)   rr   ÚioÚBytesIOr"   r­   r®   r*   r+   )r   Ú	file_pathÚ_ÚresrÐ   Z	byte_datar¯   r°   r   r   r   Úread_dropbox_bytestream-  s    
".
r  c                 K   s   |  dd ¡}ts|râzt | ¡ ¡*}| d¡ tj| ¡ |t	j
jjd W 5 Q R X t d| ¡ |s,td| dƒ}tjtj d| ¡dd	D ]š\}}	}
|	D ]Š}t|| d
}|d rž|d D ]h}t| |d tj |tj tj |¡¡|d ¡dƒr¾t tj ||d ¡¡ t d|  d |d  ¡ q¾qžqW dS  tk
rÞ } zŽt ¡ }t d|  d | d t|ƒ d t|ƒ ¡ t d| ¡ |sÈtj tj |¡¡}|dkrÈttj d| |¡t || d
 W Y ¢dS d }~X Y nX nt d| d | ¡ dS d S )Nr  r   )Úmodez#Dropbox Transferred Successfully : r€   Ú
dbx_folderz/home/gary/dropboxTr²   r¦   r    r¶   rµ   zLogger Info for zI
Local file successully transferred to dropbox and removed locally
File: r	  z' Exception in store_dropbox
File Path: r
  rÍ   z8Dropbox Transfer Error - will store locally and retry : )ÚsentZreceivedzhome/gary/dropboxFz<File not sent to Dropbox as inactive for testing
File Path: z
File Data:
)!rˆ   ÚDropbox_activer  r  r©   ÚseekrÎ   Zfiles_uploadr   rÏ   rÁ   Z	WriteModeÚ	overwriter)   rr   r   r¹   rº   r»   rw   rÅ   Ústore_dropboxr‘   ÚnormpathÚremoveræ   r"   r­   r®   r*   r+   rÈ   rµ   )r   r¶   r  Úretryr–   r  Ústreamr  r¿   rÀ   rÁ   ÚdZqueuedFilesrÄ   r¯   r°   Zfile_locr   r   r   r  @  s:    

$"2 .
r  c                  C   s<   i } t D ].}td|dƒ}|r| ¡ D ]\}}|| |< q$q| S )Nr€   Údashboard_auth)rü   r   Úitems)rS   rþ   Zuser_cÚkÚvr   r   r   Ú	get_usersh  s    r#  c              
   K   s~  z|  dd ¡}|  dd ¡}g }t |¡}d}d }|r˜|sFt |¡}n
t |¡}|jD ]2}	t|	tjjƒrV|	j	|	j
|	j|	jdœ}
| |
¡ qV|j}|j}q2|rt|ƒtk	r¶t |d¡}g }|D ]@}|d |kr¾|sÞ| |¡ q¾|D ]}||d krâ| |¡ qâq¾|W S |W S W nj tk
rx } zJt ¡ }t d|  d	 | d
 t|ƒ d t|ƒ ¡ t d¡ W Y ¢dS d }~X Y nX d S )NÚ	from_dateÚ	file_specT)ÚnameÚpath_displayÚclient_modifiedÚserver_modifiedz%d/%m/%Yr(  r&  r	  z/ Exception in get_dropbox_file_info
File Path: r
  rÍ   r  F)rˆ   rÎ   Zfiles_list_folderZfiles_list_folder_continueÚentriesÚ
isinstancerÏ   rÁ   ZFileMetadatar&  r'  r(  r)  r‹   Zhas_moreÚcursorr‰   r   Ústrptimer"   r­   r®   r)   r*   r+   rr   )r   r  r–   r$  r%  Z
files_listZ
files_infoZ	more_infor,  r#   ÚmetadataZfiltered_listrÁ   r   r¯   r°   r   r   r   Úget_dropbox_file_infos  sN    


ü
.
r/  z,http://metadata/computeMetadata/v1/instance/zMetadata-FlavorZGooglerR   r  Úhostnamezmachine-typeró   ÚTestrb   rü   r€   Zdata_store_folderrõ   rô   )F)Wr¹   r  r§   rª   r¬   r­   rÏ   rj   Zlogging.handlersr    rç   r   Ú
contextlibr   Zemail.mime.applicationr   Zemail.mime.multipartr   Zemail.mime.textr   Úemail.utilsr   r   rH   Zgoogle.oauth2r	   Zgoogleapiclient.discoveryr
   Zgoogleapiclient.errorsr   ZFlaskApp.app.secretsr   r   ÚFlaskApp.appr   Zrunning_localZ
FTP_activer  r  Zworking_dirr»   rw   ru   rv   rC   r+   r   r&   r-   ÚHandlerr.   rz   rŸ   r±   rÅ   rÈ   rÒ   rî   r÷   rù   rû   rÿ   r  r  r  r#  r/  Zmetadata_serverZmetadata_flavorr  rš   Zgce_idZgce_nameZgce_machine_typert   rú   r)   rÎ   rü   rì   rý   râ   Z
data_storerþ   rõ   rô   rø   r   r   r   r   Ú<module>   sª   	&)e[.$	'
(2