MSV FM

[email protected]: ~ $
Path : /lib/fm-agent/library/__pycache__/
File Upload :
Current < : //lib/fm-agent/library/__pycache__/agent.cpython-36.pyc

3

��f1��0@s�ddlmZmZddlmZmZddlmZmZmZddl	m
Z
mZddlm
Z
ddlmZmZmZmZmZddlmZddlmZdd	lmZdd
lmZddlmZddlmZdd
lm Z yddl!Z!Wnddl"Z!YnXddl#Z#ddl$Z$ddl%Z%ddl&Z&ddl'Z'ddl(Z(ddl)Z)ddl*Z*ddl+Z+ddl,Z+ddl-Z-ddl.Z.ddl/Z/ddl0Z0ddl1Z1ddlZddl2Z2ddl3Z3ddl4Z4ddl5Z5ddl6Z6ddl7m8Z8yddl9Z9Wn Gdd�d�Z:e:�Z9YnXyddl;Z<Wnddl<Z<YnXyddl=Z=Wn>e>k
�r0yddl?Z=Wne>k
�r*dZ=YnXYnXyddl@Z@e@jAZBWnddlCZCeCjDZBYnXdeEe1�k�r|dd�ZFeFe1_GyddlHZHWn ddlIjJZHddlKjLZMYnXGdd�deN�ZOdS)�)�execute_command�which)�datetime�	timedelta)�	Inspector�get_fqdn�get_server_name)�NoAgentSectionHeaderException�NoManifestFileException)�ProcessManager)�basename�exists�isdir�isfile�join)�PickleDatabase)�
PluginManager)�pprint)�ProgressPrinter)�ResultQueue)�Schedule)�exitN)�PluginBlacklisterc@seZdZdZdS)�SixTN)�__name__�
__module__�__qualname__�PY2�rr�"/usr/lib/fm-agent/library/agent.pyr-sr�check_outputcOs>d|krtd��tj|dtji|��}|j�\}}|j�}|S)N�stdoutz3stdout argument not allowed, it will be overridden.)�
ValueError�
subprocess�Popen�PIPE�communicate�poll)�	popenargs�kwargs�process�outputZ
unused_err�retcoderrr�fJsr-c@s�eZdZdZdZdZdbdd�Zd	d
�Zdd�Zdcdd�Z	dd�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdddd�Zdd �Zd!d"�Zd#d$�Zd%d&�Zd'd(�Zd)d*�Zd+d,�Zd-d.�Zd/d0�Zd1d2�Zd3d4�Zd5d6�Zd7d8�Zd9d:�Zded<d=�Zd>d?�Z d@dA�Z!dBdC�Z"dDdE�Z#dFdG�Z$dHdI�Z%dJdK�Z&dLdM�Z'dNdO�Z(dPdQ�Z)dRdS�Z*dTdU�Z+dVdW�Z,dXdY�Z-dZd[�Z.d\d]�Z/d^d_�Z0dfd`da�Z1d;S)g�AgentZcustom�INFO���
�cCsNtjd�}tjj|j�s(|jjd�dSy0t|j�j	�j
�jd�\}}t|�}t|�}Wn|jj
dtj��dSytj|�Wntk
r�dSXyhddl}|jtjd|�j�d}td	|�d
j�}	||jkp�d|	kp�d|j|	k�r|j�dSWnYnX|�rNtj�|d
|k�rN|jj
d|�tj|d�dStj�}
|j|
�\}}|j �r�|jdk�r�|jj
d|j�t!�}
|
j"tj#d��}|
j$||j�}|jj
ddj%|��x|D]}tjt|�d��q�WdS|dk�r6|j&d7_&|d
8}|jj
d|||f�tj'|�|j(||d�S|jj
d|�dSdS)z/Check to see if it's safe to start up the agentZlock_mgrz-No existing PID file found, proceeding to runT�:z#Error reading existing PID file: %srNz/proc/%dz
ps -o cmd= %d��pythonz%s_agentgN@z&Found stale agent process %s - killing�	�rootz7Uninstalling. Killing all process from the username %s z/proczFound pids %s � r2z]Found existing agent process %s, sleeping for %s and checking %s more times if safe to start.)�counterzAFound existing agent process %s, exiting to wait for it to finishF))�logging�	getLogger�os�pathr
�pid_file�log�debug�open�read�strip�split�int�critical�	traceback�
format_exc�getpgid�OSError�pwd�getpwuid�stat�st_uidr�lower�user�brand�remove_pid_file�time�kill�optparse�OptionParser�parse_arguments�	uninstallrZfilter_non_pid_process�listdirZget_process_from_userr�current_agent_delay�sleep�safe_to_start_agent)�self�timeoutZ
sleep_timer:r@�pid�	timestamprLZusernameZpsout�parser�options�argsZmanagerZpidsrrrr]`s^
"


zAgent.safe_to_start_agentcCs6tj�}ttj��}t|jd�}|jd||f�dS)z+Create a new PID file to track our instance�wz%s:%sN)r=�getpidrFrTrBr?�write)r^r`�nowr-rrr�write_pid_file�szAgent.write_pid_filecCstjj|j�rtj|j�dS)z1Remove an old PID file to clean up on the way outN)r=r>r
r?�remove)r^rrrrS�szAgent.remove_pid_fileFcCs�d}td|j|d�}|j|�}|r.|j�n
|jd�td|j|d�}tjd|j|j|jf�|j�d}td|j	dd	�|j�t
d
|j	�dS)Nr5zNotifying %s of uninstall)�indentzERROR CONNECTINGzRemoving %r directoryzrm -rf %s %s %sz

Uninstalling %s
T)�sectionz
Uninstall of %s complete
)rrRZnotify_of_uninstall�finish�log_dirr=�system�db_dir�
config_dir�pkg_dir�print)r^�aggregator_client�remove_instancerk�pp�successrrrrY�s


zAgent.uninstallcCs�tj�}y.|j|j�}|s"td��|jd�s4td��Wn�tjtfk
r�|jj	t
tj���t
jddkr�tjdt|jd�j��}n tjdt|jd�j�jd��}|j|�Yn(tk
r�|jjt
tj���YnX|S)	z�
        Get the manifest configuration if it exists. Also, throw a deprecation
        warning if the the manifest does not conform to the new-style format
        (It must have an [agent] section heading).
        zNo manifest file found�agentz�Using a manifest file without the section heading "[agent]" is deprecated; please add this heading to the file. Example:
                    [agent]
                    customer_key = customerkey
                    server_group = 123
                    rr3z[agent]
�rzutf-8)�configparser�ConfigParserrC�
manifest_filer
�has_sectionr	ZMissingSectionHeaderErrorr@�warn�strrHrI�sys�version_info�StringIOrB�decodeZreadfp�info)r^�manifestr|Zamended_manifest_filerrr�get_manifest�s&

	zAgent.get_manifestcCsxtj�}d}tjj|j�rb|jjd�t|jd�}|j	�}|j
�tj�}|j|j�|j||�}|j||�}|j
d�s�|jd�|jdd�s�|jdd|j�|jdd|j�d|jd�kr�|jdd�}ng}|jj|�}|r�|jdd|�tj�}|j
d��r�|�r�|jdd�}	yttj|	�}
|
j�r0|
j}n|
j}tj|��s�|jd�x8dD]0}|j|d�}
|
dk	�rR|jd||
jd���qRWWn2tj�d}t |�}|jj!d
j"|��YnXt|jd�}|j#|�|j
�tj$d|j�|dk	�rdt%j&�}|j'|t|jd�j	��}t(|�}dd�|D�}t)|��rV|jjd�|jj*ddj+|��n|jjd�n|jjd|j�|S)zo
        Create/update the config file with the settings from the manifest.
        Return the config.
        NzExisting config file found�rbrx�aggregator_url�versionZplugin_blacklist�agent_proxy�https�http�/r5zInstall proxy error: {}rezchmod 640 %srycSs$g|]}|jd�s|jd�r|�qS)z+ z- )�
startswith)�.0�linerrr�
<listcomp>.sz&Agent.write_config.<locals>.<listcomp>zConfig file overwrittenzConfig diff:
%s�zNo change to config filezCreated new config file: %s)r�r�),rzr{r=r>r
�config_filer@r�rB�	readlines�closerC�copy_config_settingsr}�add_section�
has_option�set�agg_urlr�rc�get�_blacklisterZupdate_list�
urlrequestZ
getproxies�urlparse�scheme�hostnameZproxy_bypassrDr��exc_infor�error�formatrgro�difflibZDifferZcompare�list�lenrAr)r^r�Z
new_configZold_config_linesZold_config_fileZ
old_configZoriginal_pluginsZupdated_pluginsZproxiesr�Zagg_url_optionZagg_hostname�keyZp_url�errr�Znew_config_fileZdifferZ
diff_linesZchangesrrr�write_config�sn








zAgent.write_configcCsPxJ|j�D]>}|j|�s"|j|�x$|j|�D]\}}|j|||�q.Wq
W|S)z�
        Copy settings from the original to the destination, overwriting
        destination's settings if they already exist.
        )Zsectionsr}r��itemsr�)r^�originalZdestinationrl�option�valuerrrr�:s

zAgent.copy_config_settingscCs�|jjd�|jr*td�|jjd�dS|j|j|j|jf}tj	d|�|jjd|�|j
�}|j|�}i}|jd�r�|d}t
j|||||d�}	y2|jdd�}td	|�|jjd	|�||	_WnYnXtd
|jdd�}
td
d�|jd�D��}|jd��r|d|	_|jd��r>tdd�|jd�D��}ni}y |	j|j�||�\}
}}}}Wndtd�td�x*|jd�D]}tdtjj|d���q�W|jjdtj��tj�YnX|�s�|�r�td|�|jjd|�tj�|jj d|
||||f�|�r&||j!d<d|j"d�k�r�|jdd�j#�dk�r�d|j"d�k�r�x<|jdd�jd�D]&}dtj$|j%|j&�f}tj	|��qpW|
�r�|
j'�n|jj(d|�|
j'd|�|
�r^|�r^|j)dd |�|j*t+|j,d!��|�rtd"|j-|jf�|jjd#�nBt.d+t/|�d%�}d&||}td'|j-|j|f�|jj0d(�n,td)|j-||j-|j|j1f�|jj(d*|�|j2�dS),NzBegining installationzAgent already installedzmkdir -p %s %s %s %sz Created directories: %s %s %s %sr�)�proxy_configrxr�z8Using manifest file aggregator for initial handshake: %sz
Handshaking with %s serversr5)rkcss |]\}}||jd�fVqdS)z'"N)rD)r�r�r�rrr�	<genexpr>qsz Agent.install.<locals>.<genexpr>Z
attributescss|]\}}||fVqdS)Nr)r�r�r�rrrr�yszI

There was an error in the initial handshake with the aggregator, pleasezIcheck your aggregator URL, and ensure you have connectivity to retrieve:
�,z     %s
zv2/hellozError in initial handshake: %szHandshake failed: %sz%s, %s, %s, %s, %s�	log_level�enable_countermeasures�true�countermeasures_remote_pluginsz0%s %s/countermeasure.py install_plugins --url %szInstallation failed:
%szERROR CONNECTING: %s�
server_keyrezxInstallation of %s complete.  Your server will now sync automatically with the %s ControlPanel.
                        z-Agent will automatically sync with aggregator�Pr1r9z� Installation of %s complete.  Please copy and paste the following
                    server key into the %s ControlPanel for your server: %sz^The server key must be manually entered into the Control Panel before agent will begin syncingz� Installation of %s had an error (%s).  The %s is installed but it cannot sync correctly.
                   Please contact %s and send them the log file at %s zAggregator sync failed:
%sgD@)3r@r��is_installedrsrnrprq�custom_plugin_dirr=ror�r�r}�
aggregator�Clientr�r�rrR�dictr�r�Z	handshake�get_all_ipsrEr>rr�rHrIr�rrA�dbrcrP�
executable�bin_dirrDrmrGr�rgrBr�rrrFr�r~�log_file�migrate_config)r^r�r�r��customer_key�dirsr��configr�rtrvZagent_settingsZserver_attributesrw�found_serverr�r��url�cmdZpaddingrrr�installGs�







z
Agent.installcCsg}td�}|}dtjks$dtjkr,|d}dtjkr�td�}|r�td|�\}}|dkr�x�|jd	�D]8}|j�jd
�sf|sf|dkr�qf|j�}|j|d�qfWn�|o�dtjk�rt|�\}}|dk�r6tjdkr�tj	d|�}dd�|D�}ndd�tj	d|�D�}n.td�}	td|	�\}}dd�tj	d|�D�}dd�|D�}dd�|D�}d|k�rjd||j
d�<|�s�|jjd�t
j|j|j|jd�}
y|
j�g}Wn:tk
�r�}z|jjdj|��g}WYdd}~XnX|�s�|jjd�n|jjd|�|S) NZifconfig�sunos�aixz -azhp-ux�netstatz%s -inr�
�namer�r3�freebsd�darwinzinet6? (.+?)\scSsg|]}|j�jd�d�qS)�%r)rDrE)r��iprrrr��sz%Agent.get_all_ips.<locals>.<listcomp>cSsg|]}|jd��qS)zaddr:)rD)r��xrrrr��sr�z%s addr showcSsg|]}|�qSrr)r�r�rrrr��scSsg|]}|r|�qSrr)r�r�rrrr��scSs(g|] }|j�jd�djd�d�qS)r�rr�)rDrE)r�r�rrrr��s�1z::1z@Unable to retrieve IP address(es) locally, contacting aggregator)r�zIP address lookup failure: {}z"Unable to determine IP address(es)zIP addresses: %s)r�r�)rr��platformrrErPr��append�re�findall�indexr@�warningr�r�r�r�r�Zget_local_ip�	Exceptionr�r�rA)r^ZipsZ
ifconfig_pathZifconfig_cmdr��coder+�lr�Zip_addr_pathrt�errrr��sR



zAgent.get_all_ipsc	CsPtjj|�siSy(t|�j�j�jd�}tdd�|D��Std�iSdS)Nr�cSs"g|]}tttj|jd����qS)�=)r��maprrDrE)r�r�rrrr�sz9Agent.get_old_style_config_properties.<locals>.<listcomp>zError reading manifest file)	r=r>r
rBrCrDrEr�rs)r^�manfileZmfrrr�get_old_style_config_properties�sz%Agent.get_old_style_config_properties�r+cCszt||�}d}xFtd�D]:}ytj|tjtjB�d}PWqtjd�YqXqW|rv|jj	d|�|j
�dS|S)NTr2Fg�?zCould not acquire lock on %s)rB�range�fcntl�flockZLOCK_EXZLOCK_NBrTr\r@�	exceptionr�)r^�fname�modeZofile�locked�irrr�
_open_files
zAgent._open_filec
Cs0t|j��r(|j|j�}|s iSi}y\tj|�}xL|D]D\}}}tj|d�}t|�}||tj	|j
��g|d||jd�f<q6WWn|jj
d�i}YnXt|j��}|jdd�d�i}x<|D]4\}}}||kr�||gg||<q�||j||g�q�W|jd�|j�tj|tj�|j�|SiSdS)	Nz%Y-%m-%d %H:%M:%Sz%s:%sz
%Y%m%d%H%Mz"Unable to parse custom metric filecSs|dS)Nr1r)�vrrr�<lambda>*sz)Agent.get_metric_values.<locals>.<lambda>)r�r)r
�report_filer��csv�readerr�strptime�floatrT�mktime�	timetuple�strftimer@r�r��values�sortr��seek�truncater�r��LOCK_UNr�)r^�csvfileZ
unique_valuesZ
csv_reader�textkeyr�raZ
custom_valuesrrr�get_metric_valuess6
.

zAgent.get_metric_valuescCs�t|j�r�|j|j�}|siStj|�}ytdd�|D��}Wn$tk
rb|jjd�i}YnX|j	d�|j
�tj|tj
�|j�|SiSdS)NcSsg|]}|d|df�qS)rr5r)r��rowrrrr�Esz0Agent.get_registered_metrics.<locals>.<listcomp>z)Error reading custom metric register filer)r
�
register_filer�r�r�r�r�r@r�r�r�r�r�r�r�)r^r�Z	csvreader�metricsrrr�get_registered_metrics=s 



zAgent.get_registered_metricscCsJg}x@t|jdj��D]*\}}d|j|jf}||kr|j|�qW|S)N�	schedulesz%s.%s)r�r�r��plugin_textkey�resource_textkeyr�)r^Zexisting_tkeys�sr_id�schedule�tkeyrrr�get_existing_metricsVszAgent.get_existing_metricscCs|dkr|jd�rdSdS)Nzcom.pnp-hcl.dominostatszMem.PID.TF)r�)r^rrrrr�
ignore_metric^s
zAgent.ignore_metriccCs(ddg}ddddg}ddddg}|j�}|jjd	�i}i}g}|jg}	|jd
d�r`|jd
d�pbd}
|
rx|	j|
jd��|j}|jd
d
�r�|jd
d
�p�d}|r�t	|�}g}
xr|	D]j}t
|�s�q�t|
�|kr�P|jjd|�x>tj
|�D]0}t|
�|kr�Ptt||��r�|
jt||��q�Wq�W�x�|
D�]�}t|�}tj|tj��sV|jjd|��q&t|d�}�y0|jjd|�tj|j��}|j�x2|D]*}|t|j��k�r�tjd||��q��q�W|jdg�}�x�|D�]�}x8|D]0}|t|j��k�r�tjd|�t|��qܐq�W|j|d|d��r*�q�yJyt	|d�}Wn4tk
�rpt j!|dd�}t"j#|j$��}YnXWn2tk
�r�|jjd|d|d��w�YnX|d|f}d|d|df}||k�r@||k�r�||j%dg�j|�nJ|jdd�}|dk�r|d}|d|d|d||jdd�|gd�||<n|j%|g�j|��q�W|jdg�}�x|D�]}x8|D]0}|t|j��k�rxtjd|�t|��qx�qxWyJyt	|d�}Wn4tk
�r�t j!|dd�}t"j#|j$��}YnXWn2tk
�r(|jjd|d|d��wlYnX|d|d||d|dd�}d|k�r`|d|d<d |k�rv|d |d <|j|��qlWtj&|�Wn�tk
�r|j'�r�t||j(�}|jjd!|�|j)d"�|jj|j��|jjt*j+��|jjd#�|j�tj&|��w&YnX�q&W|||fS)$NrZplugin_category_namer�r��unitra�description�actionz Processing incoming import filesrxZmetric_incoming_directoryr�Zmax_incoming_files_overridez
Looking in %sz&Can not delete %s so will not process.zr+z
Processing %sz1Can not process file %s! Missing required key: %srz0Can not process metric! Missing required key: %sz%Y-%m-%d %H:%M:%Sz,Could not process timestamp %s for metric %sz%s.%s�first_values�label)rZplugin_namerrr
r
�	incidentsz2Can not process incident! Missing required key: %sz.Could not process timestamp %s for incident %s)rrrarrZ	match_key�metadatazError processing %s:rz
Deleting file),rr@r��custom_import_dirr�r��extendrE�MAX_IMPORT_FILESrFrr�r=rZrrr�r�access�W_OKr�rB�json�loadsrCr�r��keysr;rr	r�rr��calendarZtimegmr��
setdefaultrj�closedr�r�rHrI)r^r�Zreq_top_keysZreq_metric_keysZreq_incident_keysZexisting_metricsZnew_metricsZ
new_values�custom_incidentsZimport_dirsZadditional_dirsZ	max_filesZmax_override�files�	directoryr-�	full_pathr��jZreqr�mZunix_timestampraZ	new_valuerrrZincident�objrrr�process_importsds�

















zAgent.process_importsc	Cs�dt�i}tjj|j�r�|j|j�}|s,|S|j|j�}|jd�|j�t	j
|t	j�|j�ytj
|j�WnYnX|S|jr�t�}|r�||d<|SdS)NZfqdnr�server_name)rr=r>r
�update_config_filer�r�r�r�r�r�r�r�rj�is_fortisase_installr)r^r�r�Z
propertiesr$rrr�get_update_config�s(

zAgent.get_update_configc s�|�_|�_|�_|�_|�_|�_|�_tj��_	d�_
tj�dkpPtj
�dk�_|
�_tjj|�j��_t�jd�j��_tjj|�j��_t�jd�j��_tjj|	�j��_t�jd�j��_tjj|
�j��_tjj�jd��_tjj�jd��_tjj|	d�j��_tjj|�j�}tjj|d	��_tjj|�jd
��_dtjj �k�r~tjj|d��_!tjj|d
��_"n^dtjj �k�r�tjj�jd��_!tjj�jd
��_"n(tjj|�jd��_!tjj|�jd
��_"d�_#d�_$d�_%d�_&d�_'d�_(d�_)d�_*d�_+�yjt,�j��s*t-d��tjj,�j��sJt-dj.�j���t/j0�}|j1�j�|j2d��rt|d�_+dtjk�rb|j3dd��r�|j4dd�j �dk�_$|j3dd��r�|j4dd��_%|j3dd��r�|j4dd��_&|j3dd��r�|j4dd��_'|j3dd��r|j4dd�j �dk�_(|j3dd��r8|j4dd��_)|j3dd ��rbd!|j4dd �j �k�rbd�_*|j4dd"�}|�s|t-d#��Wn<t-k
�r�}ztj5j6d$j.|��d�_#WYdd}~XnXyt7|j4dd%��}Wnd&}YnXd'tj8�k�r�d(t_d�_9�j:�t;j<�j=j>��_?yt@|j4dd)���_AWnt-k
�rF|�_AYnX�jB||d*��s|�fd+d,��_C�j?jDd-�tjEd.��jF��jG��_H�jI�tJ��_K�j?jLd/�dS)0Nirz%s.dbz%s.logz%s_agent.cfg�countermeasuresZincomingz%s-agent-manifestz	agent.pidz
update-configr��registerZreportr�TFZ
demserviceZ
updateservicez/tmp/com.fortinet.fortimonitorzNo bin directoryzNo config file {}r�ZdemZenabledr�Zserver_portrxzupdateservice.portZipc_path�auto_update�scheduled_updateZhandshake_typeZforticlientr�zMissing server keyzInitialize exception: {}�safe_counterr3ZVMkernelZvmwareZstartup_timeout)r:cs�jjd�S)NzPreventing pid file removal)r@r�r)r^rrr�ysz Agent.__init__.<locals>.<lambda>z=Exiting without running - other agent process already runningr5zActivity started)MrRr�r�rQ�lib_dirr�rr�tempfileZ
gettempdir�tmp_dir�metadata_rebuild_freqr=�getuid�geteuid�is_root�acceptable_sync_delayr>rrp�db_filernr�rqr�r��!countermeasures_custom_plugin_dirrr|r?r%r�r�rPr�r�r��has_dem�dem_port�update_service_port�ipcPathr*r+r&r�r
r�r�rzr{rCr}r�r��stderrrgrF�unamer[�set_up_loggingr;r<�	__class__rr@r�r_r]�__del__r�rri�open_dbr�r�rr�r�)r^rRr�r�rQr�r-rrr_Zbase_config_dirZbase_custom_plugin_dirZ
base_data_dirZbase_log_dirr4Zdata_dirr�r�r�r,r)r^r�__init__s�




zAgent.__init__cCs�|jdr|jjd�dStj�}|j|j�r�d}|jd�sV|jd�d}|jjd�|jd�r�x0|j	d�D]"\}}|d	kr�d
}|j
d||�qlW|jd�d}|jjd�|r�t|jd�}|j
|�|j�d|jd<dS)
z�
        Update agent configs to use "[agent]" instead of "[AgentConfig]" as
        the main heading and "aggregator_url" instead of "agg_url" (in order to
        match the option in the manifest file).
        �config_migratedzConfig is in the correct formatNFrxTzAdded [agent] section to configZAgentConfigr�r�zMCopied deprecated [AgentConfig] section to [agent] and removed it from configre)r�r@r�rzr{rCr�r}r�r�r�Zremove_sectionrBrgr�)r^r�Zconfig_has_changedr�r�r�rrrr��s.





zAgent.migrate_configcCs|j�dS)N)rS)r^rrrr?�sz
Agent.__del__cCstj�}tjj|j�s(tjdj|j��yt|j	d�}Wn>t
k
rvtd|j	tt
j��f�td�tj�}Yn X|j�tjj|j	dddd�}|jtjd	��|j|�|jtj�|j�}ytt|d
j��}Wntt|j�}YnX|j|�dS)
Nzmkdir -p {}�azCannot open log file %s: "%s"zLogging to stderr instead�ir1)ZmaxBytesZbackupCountzA%(process)d) %(asctime)s - %(name)s - %(levelname)s - %(message)sr�iiP)r;r<r=r>rrnror�rBr��IOErrorrsrrHrIZ
StreamHandlerr�ZhandlersZRotatingFileHandlerZsetFormatterZ	FormatterZ
addHandler�setLevelZNOTSETr@�getattr�upper�DEFAULT_LOG_LEVEL)r^Zroot_loggerr��handlerr�r�rrrr=�s0
zAgent.set_up_loggingcCs|jr(|jdddd�|jddddd	�|jd
dddd	�|jddd
dd	�|jddddd	�|jdddd�|jddddd�|jddddd�|jddddd�|jddddd�|jddddd�|jd ddd!d�|jd"ddd#d�|j�\}}||fS)$zJ
        Return the options and arguments parsed from the parser.
        z--server-keyr�Zstore)�destrz--rebuild-metadata�
store_true�rebuild_metadataF)rrK�defaultz--status�statusz--stats�statsz--from-cron�	from_cronz--aggregatorr�)rrKz	--installr�)rrNrKz--uninstallrYz--remove-instanceruz--customer-keyNr�)rNrrKz	--unpause�unpausez--list-containers�list_containersz--rebuild-container-metadata�rebuild_container_metadata)r�Z
add_option�
parse_args)r^rbrcrdrrrrX�s zAgent.parse_argumentsc�LCsJtj�}|jr|j}nd}d}tj�}|j|j�|jr�|r�|gkr�y|jdd�}Wnd}YnXy|jdd�px|j	|_	Wnd|_	YnXd|j
||j	f}nd|j
f}tj|d�}|j
|�\}}|j�rt||jt|jd�|j�}	tj|||d	|	�|j�r$tj|d	|d
|d�|j�rXtj|j	|j||jd�}
|j|
|j�t�|j�sj|j�r^|j�rz|j|_	|j�p�d}d
tjj �k�rF|j!df|j"df|jdf|j#df|j$dfg}x4|D],\}
}t%j&dj'|
��|�r�t%j(|
|��q�WxL|j)|j*gD]<}t+|d��}WdQRXt%j,j-|��s|j.j/dj'|���qW|j|j	|j||�dSdddddddg}d}x"|D]}t0||d��rzd}P�qzW|�s�d|j1|j||j	f}t2|�|j.j3|�dS|j4�r�t2d�d|d<|j5�dS|j6�r�d|k�s|dik�rt2d�dS|d}t2d�t2d�xV|j7�D]J\}}|jd d!�}|jd"d!�}|jd#d!�}t2d$|||dd%�|f��q>WdS|j8�r�d|d<t2d&�|j.j3d'�dSd}�y6d}|j9�r�d}|j9}t2d(|�|j:dd|�|j�rd}|j}t2d)|�|j:dd|�|�r<|j;t+|jd*��td+�|j<�rf|j=�rf|j.j>d,�t2d,�dS|jdd�}tj|j	|j||jd�}
|�s�t2d-�td.�|j?�ryLd}|j@d/|jAd0�} | dk�s�d1| k�r�d}|�s�|jB|��r�|jC|
�WnYnXt||jt|jd�|j�}	|jD�}!|!�r4|	jE|!�d2|jFd�k�r8|jdd2�j �d3k�r8d4|jFd�k�r8d5|jFd�k�r8tG|jdd5��d6}"d7|k�s�tHjH�|d7|"k�r
xL|jdd4�jId8�D]6}#|j.j3d9|#�d:tjJ|jK|#jL�f}$t%j&|$��q�WtHjH�|d7<n.d7|k�r8|j.j3d;|d7|"tHjH�d<�tj�}%g}&|jM�}'|jN|�\}(})}*d=|k�st|d=dk�r|i|d=<�x6tO|d	j7��D�] \}+},d>|,jP|,jQf}-d?}.|,jP|jRk�r�|,jQ|'k�r�|-|)k�r�|,jS|%tT|.d@�k�r�|j.j3dA|,��q�tT|,jUd@�}/tT|jVd@�}0|%|/|0|,_S|-|)k�r�|	jWj|-i�jdBdC�}1xJ|)|-D]>\}2}3|2dk	�rd|2|19}2|2dk�rr�qJ|&jX|+|3|2f�i}4�qJW�q�|,jP|jRk�r|,jQ|'k�r��q�|	jWj|,jPi�jdBdC�}1x�|'|,jQD]>\}2}3|2dk	�r�|2|19}2|2dk�r��q�|&jX|+|3|2f�i}4�q�Wn�|,jP|	jYk�r8|j.j3dD|-��q�nxtj�}5tHjH�}6|,jZ|	|d=j|,j[i��\}2}4tHjH�}7|j.j\dE|,|2|7|6f�|2dk�r��q�|&jX|+tHj]|5j^��|2f��q�W|j.j3dFtj�|%�|dGj_|&�|d�	rFtHjH�|dk�	r&|j5�|dtHjH�dH}8|j.j3dI|8�dSd|d<|j5�|j.j3dJ�dStHjH�}9d}i}:g};d}<t`jad+dK�d+k}=d}>dL|k�	r�d+|dL<tHjH�|dL|jbk�	r�d}>|j=�	r�d}>dM|k�	r�tHjH�|dM<t%j,jc|j�}?|?|dMk�	r�d}>|?|dM<|>�rp|j.j3dN�tHjH�|dL<dO|jFd�k�
r*|	jd|jddO��|	je�}@|@�
sR|j=�
sR|=�
sR|dP�
r�|	jf}|@�
rl|j.j3dQ�n@|j=�
r�|j.j3dR�n*|=�
r�|j.j3dS�n|dP�
s�|j.j3dT�tg|�jh|!�}<|ji�}:g};d2|jFd�k�r|jdd2�j �d3k�r�xt%j,j|jdUd�|j#fD�]�}At%j,jj|A��s �qtj,jX|A��x�t%jk|A�D�]�}B|BjldV��r�|BjmdW��r�ytnjo|Bdd���}CWn |j.jpdY|B��w:YnXtq�r�trjs�r�tqt+t%j,j|A|B��j��jt�}Dn$tqt+t%j,j|A|B��j�judZ��jt�}Dnd[}Dx�tO|Cjvj7��D]�\}E}Ftjwd+dXk�r tx|F�txk�s@tjwd+d\k�r�tx|F�tyjzk�r�|Ejld]��r�y(|F�}G|;jX|Gj{|Gj||Gj}|D|Gj~d^��WnYnX�q�W|Bjld_��r:yt+t%j,j|A|B��}HWn:|j.j>d`t%j,j|A|B��|j.j>tj����w:YnX|Hj�}Itq�
rtq|IjudZ��jt�}Dnd[}D|Hj��yt�j�|I�}JWn:t�k
�
r\|j.j>da|B�|j.j>tj����w:YnXdbdcdddeg}K|Jj��}Ld}Mx@|KD]8}||Lk�
s�|Jj|��
r||j.j>df||Bf�d}MP�
q|W|M�
sq:|Jjdc�}N|;jX|N|Jjdb�|Jjde�|D|Jjdg�d^���q:W�qWdh|k�s|dh�rTt�j��}O|Odik�r>d|dh<|j.j3dj�n|Odkk�rT|j.j3dl�dh|k�rp|dh�rpd|d<i}Pi}Qdm|k�r�|dm�r�t�|dm�|Qdm<dn|k�r�|dn�r�t�|dn�|Qdn<do|k�r�|do�r�t�|do�|Qdo<dp|k�r|dp�rt�|dp�|Qdp<g}Rdq|k�r|dq}R�y�g}S|j.j3drt�|&�t�|S��|�rlt�dsdt�tO|j7��D��}T|j.j\du|T�d}U|d
d+k�s�|d	ik�r�d}U|>�s�|dv�r�d}Ut`jad.|j��p�d.�}VtHj�|V�|dw�rtHjH�|dwk�r�|dGj�t�|d	��}Wnd|dw<|dGj��}Wn|dGj��}Wg}Xg}Yd%}Zdx|k�rd|dx}[x,t�t�t�|[�|Z��D]}\|XjX|[j�d+���qJWdy|k�r�|dy}]x&t�t�|]��D]}\|YjX|]j�d+���q�W|j�|�}^y�d+t_�tO|(j���}(|�rh|
j�|W|S||;|<|X|Y|j��|(|*|j��|j��|R|U|Q|j?|^|:dz�}Pd|dm<d|dn<d|do<d|dp<g|dq<d|dv<|Pjd{i�|Pjd|i�|Pjd}g�|Pjd~i�d�}_|j�|_�n|j.j3d��Wnd|dGj_|W�x(|^j��D]}`||`}a|aj_|^|`��q�W|j.jpd��|j.j\d�|W�|j5�dS|Pjd�d��r�d|dP<|d
d.7<tj�j�d��|d<Wn|j.jpd��Yn.X|>�rB|	j��|d�<|j.j3d�tHjH�|9|V�d2|jFd�k�r�|jdd2�j �d3k�r��x|PjdUg�D�]}b|bjd��}D|bjd�g�}c|bjd�i�}dd[}ey>d�|D}ft%j,j|j�|f�}et+|ed��}g|gj;t�j�|d��|gj��Wn:t�k
�r6|j.j>d�|D|cf�|j.j>tj���YnX|j.j3d�|D|cf�|c�r�d�tjJ|jK|Dd�j|c�f}$|e�r~|$d�|e7}$t%j�t%j�tjJ|$jI���q�W|j�|Pjd	g��|Pjd�g��r�|j.j3d�t�tO|Pd�j�����d|Pd�k�r|Pd�d}htHjH�|h|d<dw|Pd�k�r,|Pd�dw}htHjH�|h|dw<dm|Pd�k�rf|Pd�dm}it�j�d�|i|j�fdd��}j|j|dm<d�|Pd�k�r�|Pd�d�}k|k|dG_�d�|Pd�k�r�|Pd�d�}l|l|dG_�do|Pd�k�r8yb|Pd�jdo�}|jd��}m|mdk�r�d�}mtG|m�}md�}nt�d���rd�|m|nf}nt�j�|ndd��}o|o|do<Wntj��|do<YnXdp|Pd�k�ry�|Pd�jdp�}|jd��}p|jd��}m|mdk�rxd�}mtG|m�}m|pdk�r�t�j�|j	�}q|qj�dk�r�t�j�d�|j	�}q|qj�}pd�}r|r|p;}rt�d���r�d�|m|rf}rt�j�|rdd��}s|s|dp<Wntj��|dp<YnX|Pd�jd��}t|tdk	�r�|tj��}ty,t0t�|t�}u|t|d�<|j.j�|u�t�j�}vd�}wWn t�k
�rxt�j�}vd�}wYnX|j.j.|v|w|t�dn|Pd�k�r�|j�||j|j1�|dn<d�|Pd�k�r�d+|dL<d|d�<d�|Pd�k�r|d2|jFd�k�r||jdd2�j �d3k�r|d4|jFd�k�r|d5|jFd�k�r|xL|jdd4�jId8�D]6}#|j.j3d9|#�d:tjJ|jK|#jL�f}$t%j&|$��q6WtHjH�|d7<d|Pd�k�r�d|d<d�|Pd�k�r�d}dv|Pd�k�r�d|dv<d�|Pd�k�r�y|j�|�WnYnX|j<�r|j.j3d��t2d���n�dh|k�r�|dh�r�d|k�r*i|d<d}xd|k�rF|d�rFd}xd|d<|d}ytO|yj���}zyt�j�||	|y|xd��}{WnFt�k
�r�tj��dd\�\}|}}|j.j>|}�|j.j>d��d}{YnX|{�r�d�d��|{D�}~g}xd|{D]\}�|�d�dd��}�|�|y|�<|x�s
|�|zk�r|jX|��d�|�k�r�|�d��r�|�d�=|jX|���q�Wg}Yx*|yj7�D]\}�}�|�|~k�rL|YjX|���qLWx|YD]}�|y|�=�qtWdx|k�r�g|dx<dy|k�r�g|dy<|dxj�|�|dyj�|Y�|j.j3d�t�|��|j.j3d�t�|Y��|j�|�Wn|j.jpd��YnX|j�|||
|d��|j5�|j.j3d�j'tj�|j����dS)�NFrxr�r�zF%%prog [options]

    %s, server key: %s, aggregator endpoint: %s
    zGsudo python %%prog --install [--customer-key=YOUR_CUSTOMER_KEY]

    %s)�usage�pluginsr�	num_syncs�	last_sync)r�r�i�zmkdir -p {}za+zInstaller did not create {}rQr�rMrRrSrTTz5%s Agent v%s, server key: %s, aggregator endpoint: %sz.Unpausing agent, will run as usual on next run�pauseZdocker_containerszNo monitored containerszMonitored Containers:
z$CONTAINER ID	IMAGE		COMMAND			STATUSZImage�?ZCommandZStatusz
%s	%s	"%s"	%sr0zMetadata queued for rebuildz!Container metadata rebuild queuedzSetting server key to %sz!Setting aggregator endpoint to %s�wbrz.Linux agent should not run if executed as rootz1No server key found, please re-install the agent.r5zschedules-init)�port�nor�r�r�Zcountermeasures_refresh_pluginsiZcountermeasures_last_refreshr�z*Refreshing CounterMeasures plugins from %sz2%s %s/countermeasure.py install_plugins --url %s &z+Waiting to refresh CM plugins in %d minutes�<�	anomaliesz%s.%srD)�secondsz%r too early to check�scaleg�?z No custom value or plugin for %sz%r returned %s in %.2f secondszRunning all plugins took %s�result_queuegN@zPPause command recieved. Processing stopped. Process will resume in %.2f minutes.z=Pause duration exceeded, unpausing the agent for the next runi�Zlast_metadata_time�last_config_file_timezRebuilding plugin metadataZcustom_plugin_url�has_connected_with_aggregatorzmetadata changedzrebuilding metadataz!randomly forcing metadata rebuildz%we've never pushed up metadata beforer(z.py�__r3zUnable to import module %szutf-8r�r1ZCountermeasure)r�r��author�hashrz.jsonzUnable to open %sz+%s file is not a valid json file to be readr�r��commandrgz7%s is missing from the countermeasure declaration in %srZdocker_supportedrwzDocker supportedz
no-permissionz*Missing permission to access Docker socketZlog_request�diagnostics�socket_statsZmtr�auto_topo_scansz1Syncing with aggregator: %d results, %d anomaliescss*|]"\}\}}|tt|j���fVqdS)N)r�r�r)r�Z
plugin_key�_Zplugin_metadatarrrr��szAgent.main.<locals>.<genexpr>zMetadata summary: %r�sync_schedules�
single_result�discovered_containers�deleted_containers)Zdem_enabledZdem_service_results�fortisase_attributes�icmp_server_resources�monitor_schedules�traceroutes�traceroute_checks)rsrtrurvz"No server_key found, skipping synczCould not sync with aggregatorzSaving results locally: %rr�z%m/%d/%Y %H:%MzError syncing with aggregator�
last_metadatazsyncing took %.2f secondsrh�textkeysrzcountermeasure-metadata-%s.jsonrez1Failed parsing countermeasure metadata for %s: %sz#Queueing countermeasures for %s: %sz7%s %s/countermeasure.py execute --hash %s --textkeys %sr9z --metadata-file %sZcommandszgot %d agent commandsztail -%d %s)�shell�queue_batch_size�queue_max_resultsr_r2zss -t -u -r 2>&1z
timeout %d %s�hostzhttp://zmtr --csv -c 1 %s 2>&1r�zSet log level to "%s"zInvalid log level command: "%s"Zmetadata_resyncZrefresh_countermeasuresZupdate_agentZget_logsz9Linux agent running as root, skipping container discovery)Zrebuildz�Docker has been enabled but the fm-agent user needs to be added to the docker group.
You can do so with `sudo usermod -a -G docker fm-agent`cSsg|]}|ddd��qS)�IdN�r)r��crrrr��szAgent.main.<locals>.<listcomp>r}r~�updatedz$Discovered %d new/updated containersz!Found %d newly deleted containerszError in main loop)r�r��
agg_client�forcezActivity finished in {}s���)�rrhr�r�rzZRawConfigParserrCr�r�r�rrrVrWrXrOrrr-r��displayrPrYr�r�r�r�rurr�r�r�r�rPrprqr6rr=ror��chmodr�r�rBr>rr@r�rGrRrsr�rR�saverSr�rTr�r�rgr3rMr�r7�_sendReceiver8�_agent_version_updated�_init_dem_schedules�get_dem_wifi_infoZadd_dem_wifi_resultsrcrFrTrEr�r�rDr�r#r�rr�CUSTOMZnext_check_timer�	frequencyr[r�r�rW�check�idrAr�r��update�randomZrandintr0�getmtimeZinstall_remote_pluginsZis_metadata_stalerrZ
get_all_facts�get_fortisase_attributesr
rZ�endswithr��p_importlibZ
import_moduler��sha_func�sixrZ	hexdigest�encode�__dict__r��type�typesZ	ClassTyper�r�rgrrHrIr�rrr�r�container_discoveryZcheck_accessrr�r�r4r\�pop_resultsr��min�pop�_getDemResults�tracebacklimitr��syncrr'r��_updateDEMServiceSchedulesr�Zhashed_metadatar/�dumps�spawnvp�P_NOWAIT�update_schedulesr#r r�rzr{rr�r�rHr;rFr/�AttributeErrorZWARNING�build_diagnostics�upload_logsZdiscover_docker_containersr�r�run_auto_topo_scans�checkForUpdate�
total_seconds)�r^Z
activityStartr�r�r�rVrbrcrdrWrtr�Zdirs_to_create�dirZpermsZrfileZrfZ
valid_optionsZoption_givenZvalid_option�msgZ
containersZshort_idrZ
cont_imageZcont_commandZcont_statusZrequested_auto_updateZjust_set_option_and_quitr�ZaggZneeds_schedulesZschedules_receivedZ	wifi_infoZ
refresh_cycler�r�Zall_plugins_start_timeZresults_to_sendZcustom_metricsZnew_import_metricsZnew_import_valuesrrrZ
schedule_tkeyZleeway_timer�r[rbr�rar`Zplugin_start_timeZt0Zt1Z	time_leftZ
start_timerrZcountermeasures_metadataZfactsZ	lucky_dayrMrdZstalerZmod_name�modrhr�r"ZpluginZjson_counterZfile_contentZcounter_dataZrequired_fieldsZ
existing_keysrwr�Zcan_access_docker�responseZcommand_resultsrlZanomalies_to_reportZmetadata_summaryZforce_send_schedules�delayZresult_datarprqZMAX_CONTAINERS_SYNCZcontainer_queuer�Zdeleted_container_queueZdem_resultsZdem_updatesZdemKey�qZcountermeasurerxZcm_metadataZ
metadata_filer�r-ra�linesZ
log_outputrzr{r_�ss_cmdrkr|Z
parsed_urlZmtr_cmdZ
mtr_outputZ
log_level_keyr��level�messagerTZexisting_containersZexisting_container_idsZfound_containers�tr�Zfound_container_idsZnew_containersZ	containerZcontainer_idrrr�main�s�


"



$






 


 

 & 







































z
Agent.mainc	Cs4|js
iSyddlm}|�}|j�SiSdS)Nr)�ForticlientHelper)r&Zforticlient_helperr�Zget_handshake_data)r^r�Zhelperrrrr��szAgent.get_fortisase_attributescCs
ddl}ddl}|j���}|j|j|dd�tj�}dj|jd��}t	j
j|d�}t	j|�|j
t	j
jd|�d|�}zny:dj|j�}	d	j|||	�}
t	j|
�|jjd
j|��Wn.tk
r�}z|jj|�WYdd}~XnXWdt	j
j|�r�t	j|�XWdQRXdS)NrT)Z
dirs_exist_okz
agent-logs-{}z%Y%m%d%H%M%S�zipz/tmpz{}/v2/agent_logszHcurl -F file=@{} -H "Accept: application/json" -H "Authorization: {}" {}zUploaded log file {})�shutilr.ZTemporaryDirectoryZcopytreernrrhr�r�r=r>r�mkdirZmake_archiver�ror@r�r�r�rrj)r^r�r�r.Z
tmpdirnamerhZzip_file_prefixZ
zip_outputZzip_name�endpointZccr�rrrr��s0


"zAgent.upload_logsNcCs|r |jjd�|j|d�dSd}|js@||kr<|j|�dSd}|sX|jjd�dS|sttj|j|j	||j
d�}d}�y`tdd�}||k�r||jdkr�dd	l
m}|t|j���}	tj�t|	d
�||<n�yV|jjd�\}
}tj�}t|j|j|jt|
�t|�d�}
|
|k�r|
|}
|
||<Wn<tk
�r`}z|jjd
j|jt|���dSd}~XnX|jjdj||��dS||}|�s�tj�|k�r�|j|�|dk�r�tj�}||||<|jjdj||��Wn6tk
�r}z|jjdj|��WYdd}~XnXdS)NzAdmin update request)r��next_update_checkzcheckForUpdate: no server key)r�r5)Zdaysr)�	randrange)rar4)�year�month�dayZhourZminutez%Could not calculate next check {}: {}zNext update check at {}zcheckForUpdates problem: {})r@r��_onCheckUpdatesr*r�r~r�r�r�r�r�rr+r�r�rFr�rrhrEr�r�r�r�r�r�r)r^r�r�r�r�Zdb_keyr�Z
update_periodr�Z	randomSec�hr!ZrnZctr�rrrr�sX



 


zAgent.checkForUpdatecCs�|jjd�yBdj|j�}|j|dd�}t|�dkrL|jd|jtj	|�d�Wn4t
k
r�}z|jjdj|��WYdd}~XnXdS)	NzPerforming updates check...zagent_update_info/darwin/{}�GET)�methodr�updates)r]�payloadzUpdate check failure: {})r@r�r�r��callr�r�r9rr�r�r�)r^r�r�r�r�rrrr�BszAgent._onCheckUpdatescCsX|jjd�g}g}x�t|jdj��D]�\}}|jdj|�}|sR|jd|=q(x�t|j��D]�\}}|jjd|�|jr�|j|j	�r�|j
||tj|j
j��df�d|_|jjd|�|jo�|j�r`|j
||tj|j
j��df�d|_|jjd|�q`Wq(W|jjd	t|��|jjd
|�|jjdt|��|jjd|�|jj�||S)
NzGathering reportable anomaliesr`rzThreshold %sFTzCleared anomaly: %szLengthy anomaly: %sz$Found %d anomalies that have clearedzCleared anomalies: %rz5Found %d anomalies that exceed the threshold durationzLengthy anomalies: %r)r@r�r�r�r�r�rA�reported_as_clearedZhas_clearedZnumber_of_checksr�rTr�Ztime_last_detectedr�Zreported_as_exceeded_durationZexceeds_durationr�r�)r^Zcleared_anomaliesZlengthy_anomalies�schedule_idr`r�threshold_id�anomalyrrr�get_reportable_anomaliesUs@
zAgent.get_reportable_anomaliescCs�|jjd�xvt|jdj��D]`\}}xBt|j��D]2\}}|jr6|j|�}|jjd�|jjd|�q6W|s |jdj|�q W|jjd|jd�|jj�dS)Nz'Checking for reported cleared anomaliesr`z Removed reported cleared anomalyzAnomaly: %szRemaining anomalies: %s)	r@r�r�r�r�r�r�rAr�)r^r�r`r�r�rrr�!remove_reported_cleared_anomalies�s
z'Agent.remove_reported_cleared_anomaliesc	Cs4|gks|dkr |jjd�dS|jd}i|jd<x�|D]�}|d}|jjd|�|j|d�}y`|r~|j|�||j=d}n|s�t|�}d}||jd|j<|jjd||j�|jjd|�Wq:tk
r�t	j
�d	}t|�}|jjd
j
||��Yq:Xq:W|jj�|jjdt|��|jjdt|��dS)
Nz,No schedule changes received from aggregatorrr�z$Received schedule %s from aggregatorZEditedZCreatedz%s schedule %s locallyzSchedule data: %rr5zInvalid schedule {} data: {}zCreated/updated %d scheduleszDeleted %d schedules)r@r�r�r�r�r�rrAr�r�r�rr�r�r�r�)	r^Z
new_schedulesZexisting_schedulesZnew_schedule_dataZnew_schedule_idrrr�r�rrrr��s6




zAgent.update_schedulescCs�d}|d|j7}|dtjddd�7}dtjkrJ|dtjd	dd�7}n|dtjd
dd�7}|dtjddd�7}dtjkr�|d
tjd|jdd�7}|dtjddd�7}|dtj|jd|j	d�7}|S)zVFunction to build a string of diagnostics data to send
        back to the aggregator.zAGENT DIAGNOSTICS
zAgent version: %s
zAgent server hostname: %sr�T)ryr�zAgent OS: %szsw_vers | grep ProductVersionz%cat /etc/*-release | grep PRETTY_NAMEzuname output: %szuname -azPackage information: %s
zapt-cache show %s-agent || truez
ip output:
%szip addr showz!Local agent pickle file data:
%s
r1)rkrN)
r�r#r r�r�rRrr��data�defaultprint)r^r�r�rR�stringrrrr��s

zAgent.build_diagnosticscCst|t�r|j�SdSdS)N)�
isinstancer�__repr__)r^r"rrrr��s
zAgent.defaultprintcCs�tjj|j�s tjdj|j��yt|j�}Wn
dSiddddd|jddt	�iddt	ddd�t	ddd�t	ddd�t	ddd�d	�}x(t
|j��D]\}}||kr�|||<q�W|S)
Nzmkdir -p {}Fri��2)r{rz�drD)r`rBrjrerwrYr�rXrZrcrrornZ
check_resultsZserver_resource_levelsrurv)r=r>rrpror�rr5rIrr�r�)r^r�Zdefaultsr�rNrrrr@�s6


z
Agent.open_dbc	Cs y|jdd�dkSdSdS)N�topoZ	auto_scanr�F)r�)r^r�rrr�should_run_auto_topo_scans�sz Agent.should_run_auto_topo_scansc
Cs yt|jdd��SdSdS)Nr�Zscans_per_syncr)rFr�)r^r�rrr�get_num_topo_scans�szAgent.get_num_topo_scansc
Cs yt|jdd��SdSdS)Nr��
scan_sleepr5)rFr�)r^r�rrr�get_topo_scan_sleepszAgent.get_topo_scan_sleepcCshd}d}tj�}|jjd�yttj|dd��}Wntj�}YnXtj�|}|jjd|�|S)Nzss -t -u -r 2>&1r�zStarting topo scanT)ryz.Topo scan complete. Elapsed time: %.2f seconds)rTr@r�rr#r rHrI)r^r��resultr��elapsedrrr�
run_topo_scan
szAgent.run_topo_scancCsz|j|�sdS|j|�}|j|�}d|jkr6g|jd<x>t|�D]2}tj�}|j�}|jdj||f�tj|�q@WdS)Nrl)	r�r�r�r�r�rTr�r�r\)r^r��nr�r�r��scanrrrr�s




zAgent.run_auto_topo_scansc	Cs4|js
dS|jd|jd�}y
tj|�SdSdS)Nz	wifi-info)r])r7r�r8rr)r^r�rrrr�)s

zAgent.get_dem_wifi_infocCs�i}|js|S|jd|jd�}|dkr*|Stj|�}x�|j�D]x}y<||}|j�rb||||<n|j||�|j�||<Wq>t	k
r�}z|j
jdj|��w>WYdd}~Xq>Xq>W|S)NZcollect)r]z_getDemResults: {})
r7r�r8rrrZisEmptyr�r�r�r@r�r�)r^r�Zrvr�Z
latestResultsr�r�r�rrrr�6s$
zAgent._getDemResultscCsDd}d|kr2|dr2|d|jkr@|j|d<d}n|j|d<d}|S)NFZlast_ran_versionT)r�)r^r�Z
has_updaterrrr�Ms

zAgent._agent_version_updatedcCs�yN|jddd�}|jdg�|jdg�|jdg�d�}|jd|jtj|�d	�Wn6tk
r�}ztjd
j	t
|���WYdd}~XnXdS)Nrr�)r�rsrtrv)rsrtrvZ
initSchedules)r]r�z/schedules error: {})r�r�r�r8rr�r�r;r�r�r)r^Zclientr�rZaggExrrrr�Ys

&zAgent._init_dem_schedulescCs"|jr|jd|jtj|�d�}dS)Nzupdate-schedules)r]r�)r7r�r8rr�)r^ZnewSchedulesrmrrrr�gsz Agent._updateDEMServiceSchedulescCs�|std��ddl}|r$dj||�}|d7}y�|j|j|j��|}|jd�|jtjj	|j
|��|jd�}|j|�t
�}x$|jd�}dt|�kr�P||7}q|W|jd�}	d|	kr�dS|	SQRXWn4tk
�r�}
z|jjd	j|
��dSd}
~
XnXdS)
NzServer port not configuredrz{}:{}r�g$@zutf-8iZnackzSend/recv failure: {})r��socketr�ZAF_UNIXZSOCK_STREAMZ
settimeoutZconnectr=r>rr:r�Zsendall�bytesZrecvr�r�r@r�)r^rir]r�r�ZsockZtoSendZ
receivedBytesryZreceivedr�rrrr�ls2




zAgent._sendReceive)r1r2r3)F)r�)NNF)NN)2rrrr�rIrr]rirSrYr�r�r�r�r�r�r�r�rrr	r#r'rAr�r?r=rXr�r�r�r�r�r�r�r�r�r�r@r�r�r�r�r�r�r�r�r�r�r�rrrrr.[sl
D
&P
t=
%"'
/-#+
r.)PZ
agent_utilrrrrZ	inspectorrrrZagent_exceptionsr	r
Zprocess_managerrZos.pathrr
rrrZpickle_databaserZplugin_managerrrZprogress_printerrrcrrrr�rr��ior�rr�r�r�r�r�r�r;Zlogging.handlersrVr=r�r�r#r.rTrHr�r�Zblacklisterrr�rr{rzr�ImportErrorZ
simplejsonZhashlibZsha1r�Zsha�newr�r-r r�Zurllib.parse�parseZurllib.requestZrequestr��objectr.rrrr�<module>s�


Bethany
Bethany
0%

THE FINEST HOTEL NEAR LAKE KIVU

The Perfect Base For You

Required fields are followed by *





EC1A68011

About Us

Delicious Interior With The Pinch Of Everything

Bethany Investment group is Presbyterian church in Rwanda(EPR) company that manage Hotel and Guest house in Karongi (Bethany Hotel), ISANO branch in GIKONDO(Kigali), Kiyovu branch(Kigali), AMIZERO branch(Nyagatare-East) and Gisenyi Branch(Rubavu).

Accomodation

Get a Comfortable Room
Feel The Comfort

Get a comfortable room and feel our hotel’s comfort. Bethany Hotel features a variety of fully furnished rooms with extra space, Executive rooms, Deluxe rooms with a beautiful lake view and garden space, Deluxe rooms, comfort rooms, family rooms and standard rooms at your service.

Standard Single

Services

We Provide Top Class Facility
Especially For You

Beach BBQ Party

Kick back on the beach& and enjoy our berbecue from our masterchef

Breakfast

Kick back at our hotels& enjoy our breakfast from our masterchef

Conference Hall

Kick back at our hotels& enjoy our conference halls from all bethany branches

Enjoy with your partner

Honeymoon Package

80%

Get In Touch

Don’t Miss Any Update

    +

    Search your Room

    Required fields are followed by *