Commit 36f68cc3 authored by varun.chebbi's avatar varun.chebbi

Changes

parent fdee56b5

Too many changes to show.

To preserve performance only 1000 of 1000+ files are displayed.

# Default ignored files
/shelf/
/workspace.xml
<?xml version="1.0" encoding="UTF-8"?>
<module type="PYTHON_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$">
<excludeFolder url="file://$MODULE_DIR$/venv" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>
\ No newline at end of file
<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="PyPackageRequirementsInspection" enabled="true" level="WARNING" enabled_by_default="true">
<option name="ignoredPackages">
<value>
<list size="32">
<item index="0" class="java.lang.String" itemvalue="pyotp" />
<item index="1" class="java.lang.String" itemvalue="cassandra-driver" />
<item index="2" class="java.lang.String" itemvalue="Flask-Cors" />
<item index="3" class="java.lang.String" itemvalue="validate_email" />
<item index="4" class="java.lang.String" itemvalue="cryptography" />
<item index="5" class="java.lang.String" itemvalue="pycryptodome" />
<item index="6" class="java.lang.String" itemvalue="claptcha" />
<item index="7" class="java.lang.String" itemvalue="flask" />
<item index="8" class="java.lang.String" itemvalue="docker" />
<item index="9" class="java.lang.String" itemvalue="pymongo" />
<item index="10" class="java.lang.String" itemvalue="greenlet" />
<item index="11" class="java.lang.String" itemvalue="botocore" />
<item index="12" class="java.lang.String" itemvalue="Werkzeug" />
<item index="13" class="java.lang.String" itemvalue="PyYAML" />
<item index="14" class="java.lang.String" itemvalue="requests" />
<item index="15" class="java.lang.String" itemvalue="boltons" />
<item index="16" class="java.lang.String" itemvalue="gunicorn" />
<item index="17" class="java.lang.String" itemvalue="pyopenssl" />
<item index="18" class="java.lang.String" itemvalue="redis" />
<item index="19" class="java.lang.String" itemvalue="APScheduler" />
<item index="20" class="java.lang.String" itemvalue="bcrypt" />
<item index="21" class="java.lang.String" itemvalue="pandas" />
<item index="22" class="java.lang.String" itemvalue="getmac" />
<item index="23" class="java.lang.String" itemvalue="boto3" />
<item index="24" class="java.lang.String" itemvalue="captcha" />
<item index="25" class="java.lang.String" itemvalue="pycryptodomex" />
<item index="26" class="java.lang.String" itemvalue="python_dateutil" />
<item index="27" class="java.lang.String" itemvalue="pillow" />
<item index="28" class="java.lang.String" itemvalue="paho-mqtt" />
<item index="29" class="java.lang.String" itemvalue="flask_cors" />
<item index="30" class="java.lang.String" itemvalue="gevent" />
<item index="31" class="java.lang.String" itemvalue="bson" />
</list>
</value>
</option>
</inspection_tool>
<inspection_tool class="PyPep8NamingInspection" enabled="true" level="WEAK WARNING" enabled_by_default="true">
<option name="ignoredErrors">
<list>
<option value="N801" />
</list>
</option>
</inspection_tool>
<inspection_tool class="PyUnresolvedReferencesInspection" enabled="true" level="WARNING" enabled_by_default="true">
<option name="ignoredIdentifiers">
<list>
<option value="test.testmyjsonfile" />
<option value="json_push.my_json_file" />
</list>
</option>
</inspection_tool>
</profile>
</component>
\ No newline at end of file
<component name="InspectionProjectProfileManager">
<settings>
<option name="USE_PROJECT_PROFILE" value="false" />
<version value="1.0" />
</settings>
</component>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.9" project-jdk-type="Python SDK" />
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/things-new-splited.iml" filepath="$PROJECT_DIR$/.idea/things-new-splited.iml" />
</modules>
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<module type="PYTHON_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$" />
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>
\ No newline at end of file
from flask import Flask
# THINGS STUDIO blueprints
from scripts.config import app_configuration
from scripts.config.app_configuration import secure_flag, http_flag
from scripts.core.services.things.property import property_blueprint
from scripts.core.services.things.property_category import property_category_blueprint
from scripts.core.services.things.property_group import property_group_blueprint
from scripts.core.services.things.property_type import property_type_blueprint
from scripts.core.services.things.thing_configuration import thing_blueprint
from scripts.core.services.pipeline.pipeline_services import flow_diagram_blueprint
# declaring app
app = Flask(__name__)
app.config['SECRET_KEY'] = app_configuration.SERVICE_SECRET_KEY
app.config['SESSION_COOKIE_SECURE'] = secure_flag
app.config['SESSION_COOKIE_HTTPONLY'] = http_flag
app.register_blueprint(property_blueprint)
app.register_blueprint(property_category_blueprint)
app.register_blueprint(property_group_blueprint)
app.register_blueprint(property_type_blueprint)
app.register_blueprint(thing_blueprint)
app.register_blueprint(flow_diagram_blueprint)
app.run(host=app_configuration.SERVICE_HOST, port=app_configuration.SERVICE_PORT, debug=False, threaded=True, use_reloader=False)
[service]
name = ilens
host= 0.0.0.0
port=8585
interface=eth0
SECRET_KEY= KLKey
enable_security= False
cookie_max_age_in_mins= 30
max_attempts = 5
lockout_time_interval = 60
httpflag = True
secureflag = False
reset_time_interval = 0.5
workers = 1
[log]
file_name= ilens
path= logs/
level=DEBUG
handler= rotating_file_handler
max_bytes= 10000000
back_up_count= 10
[mongo_db]
host= 192.168.0.220
port= 2717
username=
password=
authSource=
authMechanism=
mongo_constants_file_path= conf/mongo_encryption_constants.json
[kairos_db]
url= http://#KAIROS_CASSANDRA_HOST#:8080
[system_login]
domain_list= ["knowledgelens.com"]
[csv_conf]
csv_path= Log/csv/
upload_path= Log/UPLOAD
[schedule_rule_engine]
url= http://localhost:9997/create_job
[profile_pic_path]
base_path= templates/profile_pic/
[email_default_baseurl]
base_url= https://app.ilens.io/cloud/send_mail
[ai_rules]
enabled= true
docker_endpoint= tcp://localhost:4243
[flow_model]
container_url= http://localhost:8180
[IMAGE]
path= /images/metaservice/
[LICENSE_PATH]
path= license/
[pipeline_internal]
mqtt_broker_host= #MQTT_HOST#
mqtt_broker_port= 1883
mqtt_broker_ssl= false
mqtt_broker_conn_type = tcp
mqtt_broker_ws_port= 8083
node_intermediate= queue
queue_host= #KAFKA_HOST#
queue_port= 9092
[channel_pp_debug_node]
host= #CHANNEL_PP#
port= 1883
topic = ilens/pipeline/debug
user_name =
password =
[AGENT]
manager_url = http://#AGENT_URL#/ilens_api
[REDIS]
host= #REDIS_HOST#
port= 6379
key_expiry= 100
rules_db=0
alarms_db=1
live_tags_db=4
audit_db = 6
audit_queue= audit
[ILENS_VERSION]
version = v5.1
[DATA_PROCESSOR]
host = #DATA_PROCESSOR_HOST#
connection = tcp
port = 1883
topic = ilens/monitor/live/device_monitor_alarms
\ No newline at end of file
[service]
name = ilens
host= 0.0.0.0
port=8585
interface=eth0
SECRET_KEY= KLKey
enable_security= False
cookie_max_age_in_mins= 30
max_attempts = 5
lockout_time_interval = 60
httpflag = True
secureflag = False
reset_time_interval = 0.5
apply_processor_count = False
workers = 3
threads = 6
ip_check = False
[log]
file_name= ilens
path= logs/
level=DEBUG
handler= rotating_file_handler
max_bytes= 10000000
back_up_count= 10
[mongo_db]
host= 192.168.0.220
port= 2717
username=
password=
authSource=
authMechanism=
mongo_constants_file_path= conf/mongo_encryption_constants.json
[kairos_db]
url= http://ilens_kairos:8080
[system_login]
domain_list= ["knowledgelens.com"]
[csv_conf]
csv_path= Log/csv/
upload_path= Log/UPLOAD
[schedule_rule_engine]
url= http://localhost:9997/create_job
[profile_pic_path]
base_path= templates/profile_pic/
[email_default_baseurl]
base_url= https://app.ilens.io/cloud/send_mail
[ai_rules]
enabled= true
docker_endpoint= tcp://localhost:4243
[flow_model]
container_url= http://localhost:8180
[IMAGE]
path= images/
[LICENSE_PATH]
path= license/
[pipeline_internal]
mqtt_broker_host= beta.ilens.io
mqtt_broker_port= 1883
mqtt_broker_ssl= false
mqtt_broker_conn_type = tcp
mqtt_broker_ws_port= 8083
node_intermediate= mqtt
queue_host= 192.168.0.220
queue_port= 9092
[channel_pp_debug_node]
host= 192.168.0.220
port= 1883
topic = ilens/pipeline/debug
user_name =
password =
[AGENT]
manager_url = http://192.168.0.220/ilens_api
[REDIS]
host= localhost
port= 6379
key_expiry= 100
rules_db=0
alarms_db=1
live_tags_db=4
audit_db = 6
audit_queue= audit
[ILENS_VERSION]
version = v5.1
[DATA_PROCESSOR]
host = localhost
connection = tcp
port = 1883
topic = ilens/monitor/live/device_monitor_alarms
[LICENSE_SERVER]
host = 192.168.0.220
port = 9816
[service]
name = ilens
host= 0.0.0.0
port=8585
interface=eth0
SECRET_KEY= KLKey
enable_security= False
cookie_max_age_in_mins= 30
max_attempts = 5
lockout_time_interval = 60
httpflag = True
secureflag = False
reset_time_interval = 0.5
apply_processor_count = False
workers = 3
threads = 2
ip_check = False
[log]
file_name= ilens
path= logs/
level=DEBUG
handler= rotating_file_handler
max_bytes= 10000000
back_up_count= 10
[mongo_db]
host= 192.168.0.220
port= 2717
username=
password=
authSource=
authMechanism=
mongo_constants_file_path= conf/mongo_encryption_constants.json
[kairos_db]
url= http://ilens_kairos:8080
[system_login]
domain_list= ["knowledgelens.com"]
[csv_conf]
csv_path= Log/csv/
upload_path= Log/UPLOAD
[schedule_rule_engine]
url= http://localhost:9997/create_job
[profile_pic_path]
base_path= templates/profile_pic/
[email_default_baseurl]
base_url= https://app.ilens.io/cloud/send_mail
[ai_rules]
enabled= true
docker_endpoint= tcp://localhost:4243
[flow_model]
container_url= http://localhost:8180
[IMAGE]
path= images/
[LICENSE_PATH]
path= license/
[pipeline_internal]
mqtt_broker_host= beta.ilens.io
mqtt_broker_port= 1883
mqtt_broker_ssl= false
mqtt_broker_conn_type = tcp
mqtt_broker_ws_port= 8083
node_intermediate= queue
queue_host= 192.168.0.210
queue_port= 9092
[channel_pp_debug_node]
host= 192.168.0.220
port= 1883
topic = ilens/pipeline/debug
user_name =
password =
[AGENT]
manager_url = http://192.168.0.220/ilens_api
[REDIS]
host= localhost
port= 6379
key_expiry= 100
rules_db=0
alarms_db=1
live_tags_db=4
audit_db = 6
audit_queue= audit
[ILENS_VERSION]
version = v5.1
[DATA_PROCESSOR]
host = localhost
connection = tcp
port = 1883
topic = ilens/monitor/live/device_monitor_alarms
[service]
name = ilens
host= 0.0.0.0
port=8585
interface=eth0
SECRET_KEY= KLKey
enable_security= False
cookie_max_age_in_mins= 30
max_attempts = 5
lockout_time_interval = 60
httpflag = True
secureflag = False
reset_time_interval = 0.5
apply_processor_count = False
workers = 5
threads = 6
ip_check = False
[log]
file_name= ilens
path= logs/
level=DEBUG
handler= rotating_file_handler
max_bytes= 10000000
back_up_count= 10
[mongo_db]
host= 192.168.0.207
port= 2717
username=
password=
authSource=
authMechanism=
mongo_constants_file_path= conf/mongo_encryption_constants.json
[kairos_db]
url= http://192.168.0.207:8080
[system_login]
domain_list= ["knowledgelens.com"]
[csv_conf]
csv_path= Log/csv/
upload_path= Log/UPLOAD
[schedule_rule_engine]
url= http://localhost:9997/create_job
[profile_pic_path]
base_path= templates/profile_pic/
[email_default_baseurl]
base_url= https://app.ilens.io/cloud/send_mail
[ai_rules]
enabled= true
docker_endpoint= tcp://localhost:4243
[flow_model]
container_url= http://localhost:8180
[IMAGE]
path= /images/metaservices/
[LICENSE_PATH]
path= license/
[pipeline_internal]
mqtt_broker_host= 192.168.0.207
mqtt_broker_port= 1883
mqtt_broker_ssl= false
mqtt_broker_conn_type = tcp
mqtt_broker_ws_port= 8083
node_intermediate= queue
queue_host= 192.168.0.207
queue_port= 9092
[channel_pp_debug_node]
host= 192.168.0.207
port= 1883
topic = ilens/pipeline/debug
user_name =
password =
[AGENT]
manager_url = http://192.168.0.207/ilens_api
[REDIS]
host= 192.168.0.207
port= 6379
key_expiry= 100
rules_db=0
alarms_db=1
live_tags_db=4
audit_db = 6
audit_queue= audit
[ILENS_VERSION]
version = v5.1
[DATA_PROCESSOR]
host = 192.168.0.207
connection = tcp
port = 1883
topic = ilens/monitor/live/device_monitor_alarms
[LICENSE_SERVER]
host = 192.168.0.207
port = 9816
2021-01-06 14:25:49 - DEBUG - logs/ilens - [MainThread:mongo_utility.py:__init__():465] - Mongo connection established
2021-01-06 14:25:49 - DEBUG - logs/ilens - [MainThread:mongo_utility.py:__init__():465] - Mongo connection established
2021-01-06 14:25:49 - DEBUG - logs/ilens - [MainThread:mongo_utility.py:__init__():465] - Mongo connection established
2021-01-06 14:25:54 - ERROR - logs/ilens - [Thread-1:thing_configuration_handler.py:get_folder_and_asset_list():442] - exception while fetching folder and assets with search option:[WinError 3] The system cannot find the path specified: 'D:\\flask0401/KLAssets'
Traceback (most recent call last):
File "D:\flask0401\scripts\core\handler\things\thing_configuration_handler.py", line 371, in get_folder_and_asset_list
folder_and_asset_list = os.listdir(final_path) # list of folders and assets in the given path
FileNotFoundError: [WinError 3] The system cannot find the path specified: 'D:\\flask0401/KLAssets'
2021-01-06 14:26:30 - DEBUG - logs/ilens - [MainThread:mongo_utility.py:__init__():465] - Mongo connection established
2021-01-06 14:26:30 - DEBUG - logs/ilens - [MainThread:mongo_utility.py:__init__():465] - Mongo connection established
2021-01-06 14:26:30 - DEBUG - logs/ilens - [MainThread:mongo_utility.py:__init__():465] - Mongo connection established
2021-01-06 14:28:36 - DEBUG - logs/ilens - [Thread-91:mongo_utility.py:find_record_count():845] - Fetched results from mongo
2021-01-06 14:34:49 - DEBUG - logs/ilens - [MainThread:mongo_utility.py:__init__():465] - Mongo connection established
2021-01-06 14:34:49 - DEBUG - logs/ilens - [MainThread:mongo_utility.py:__init__():465] - Mongo connection established
2021-01-06 14:34:49 - DEBUG - logs/ilens - [MainThread:mongo_utility.py:__init__():465] - Mongo connection established
2021-01-06 14:34:53 - ERROR - logs/ilens - [Thread-1:thing_configuration_handler.py:get_folder_and_asset_list():442] - exception while fetching folder and assets with search option:[WinError 3] The system cannot find the path specified: 'D:\\flask0401/KLAssets'
Traceback (most recent call last):
File "D:\flask0401\scripts\core\handler\things\thing_configuration_handler.py", line 371, in get_folder_and_asset_list
folder_and_asset_list = os.listdir(final_path) # list of folders and assets in the given path
FileNotFoundError: [WinError 3] The system cannot find the path specified: 'D:\\flask0401/KLAssets'
2021-01-06 15:44:03 - DEBUG - logs/ilens - [MainThread:mongo_utility.py:__init__():465] - Mongo connection established
2021-01-06 15:44:03 - DEBUG - logs/ilens - [MainThread:mongo_utility.py:__init__():465] - Mongo connection established
2021-01-06 15:44:03 - DEBUG - logs/ilens - [MainThread:mongo_utility.py:__init__():465] - Mongo connection established
2021-01-06 15:44:09 - ERROR - logs/ilens - [Thread-1:thing_configuration_handler.py:get_folder_and_asset_list():442] - exception while fetching folder and assets with search option:[WinError 3] The system cannot find the path specified: 'D:\\flask0401/KLAssets'
Traceback (most recent call last):
File "D:\flask0401\scripts\core\handler\things\thing_configuration_handler.py", line 371, in get_folder_and_asset_list
folder_and_asset_list = os.listdir(final_path) # list of folders and assets in the given path
FileNotFoundError: [WinError 3] The system cannot find the path specified: 'D:\\flask0401/KLAssets'
2021-01-06 15:44:19 - ERROR - logs/ilens - [Thread-2:thing_configuration_handler.py:get_folder_and_asset_list():442] - exception while fetching folder and assets with search option:[WinError 3] The system cannot find the path specified: 'D:\\flask0401/KLAssets'
Traceback (most recent call last):
File "D:\flask0401\scripts\core\handler\things\thing_configuration_handler.py", line 371, in get_folder_and_asset_list
folder_and_asset_list = os.listdir(final_path) # list of folders and assets in the given path
FileNotFoundError: [WinError 3] The system cannot find the path specified: 'D:\\flask0401/KLAssets'
2021-01-06 16:01:58 - DEBUG - logs/ilens - [MainThread:mongo_utility.py:__init__():465] - Mongo connection established
2021-01-06 16:01:58 - DEBUG - logs/ilens - [MainThread:mongo_utility.py:__init__():465] - Mongo connection established
2021-01-06 16:01:58 - DEBUG - logs/ilens - [MainThread:mongo_utility.py:__init__():465] - Mongo connection established
2021-01-06 16:02:06 - ERROR - logs/ilens - [Thread-1:thing_configuration.py:create_thing_left_side_bar():97] - exception while creating property:400 Bad Request: The browser (or proxy) sent a request that this server could not understand.
Traceback (most recent call last):
File "D:\flask0401\venv\lib\site-packages\werkzeug\wrappers\json.py", line 119, in get_json
rv = self.json_module.loads(data)
File "D:\flask0401\venv\lib\site-packages\flask\json\__init__.py", line 253, in loads
return _json.loads(s, **kwargs)
File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.8_3.8.1776.0_x64__qbz5n2kfra8p0\lib\json\__init__.py", line 370, in loads
return cls(**kw).decode(s)
File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.8_3.8.1776.0_x64__qbz5n2kfra8p0\lib\json\decoder.py", line 340, in decode
raise JSONDecodeError("Extra data", s, end)
json.decoder.JSONDecodeError: Extra data: line 1 column 12 (char 11)
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "D:\flask0401\scripts\core\services\things\thing_configuration.py", line 92, in create_thing_left_side_bar
input_data = request.get_json()
File "D:\flask0401\venv\lib\site-packages\werkzeug\wrappers\json.py", line 128, in get_json
rv = self.on_json_loading_failed(e)
File "D:\flask0401\venv\lib\site-packages\flask\wrappers.py", line 27, in on_json_loading_failed
raise BadRequest()
werkzeug.exceptions.BadRequest: 400 Bad Request: The browser (or proxy) sent a request that this server could not understand.
2021-01-06 16:10:20 - DEBUG - logs/ilens - [MainThread:mongo_utility.py:__init__():465] - Mongo connection established
2021-01-06 16:10:20 - DEBUG - logs/ilens - [MainThread:mongo_utility.py:__init__():465] - Mongo connection established
2021-01-06 16:10:20 - DEBUG - logs/ilens - [MainThread:mongo_utility.py:__init__():465] - Mongo connection established
2021-01-06 17:55:07 - DEBUG - logs/ilens - [MainThread:mongo_utility.py:__init__():465] - Mongo connection established
2021-01-06 17:55:08 - DEBUG - logs/ilens - [MainThread:mongo_utility.py:__init__():465] - Mongo connection established
2021-01-06 17:55:08 - DEBUG - logs/ilens - [MainThread:mongo_utility.py:__init__():465] - Mongo connection established
2021-01-06 18:29:27 - DEBUG - logs/ilens - [MainThread:mongo_utility.py:__init__():465] - Mongo connection established
2021-01-06 18:29:27 - DEBUG - logs/ilens - [MainThread:mongo_utility.py:__init__():465] - Mongo connection established
2021-01-06 18:29:27 - DEBUG - logs/ilens - [MainThread:mongo_utility.py:__init__():465] - Mongo connection established
2021-01-06 18:38:40 - DEBUG - logs/ilens - [MainThread:mongo_utility.py:__init__():465] - Mongo connection established
2021-01-06 18:38:40 - DEBUG - logs/ilens - [MainThread:mongo_utility.py:__init__():465] - Mongo connection established
2021-01-06 18:38:40 - DEBUG - logs/ilens - [MainThread:mongo_utility.py:__init__():465] - Mongo connection established
2021-01-06 18:40:59 - DEBUG - logs/ilens - [MainThread:mongo_utility.py:__init__():465] - Mongo connection established
2021-01-06 18:40:59 - DEBUG - logs/ilens - [MainThread:mongo_utility.py:__init__():465] - Mongo connection established
2021-01-06 18:40:59 - DEBUG - logs/ilens - [MainThread:mongo_utility.py:__init__():465] - Mongo connection established
2021-01-07 10:50:14 - DEBUG - logs/ilens - [MainThread:mongo_utility.py:__init__():465] - Mongo connection established
2021-01-07 10:50:15 - DEBUG - logs/ilens - [MainThread:mongo_utility.py:__init__():465] - Mongo connection established
2021-01-07 10:50:15 - DEBUG - logs/ilens - [MainThread:mongo_utility.py:__init__():465] - Mongo connection established
2021-01-07 11:03:50 - DEBUG - logs/ilens - [MainThread:mongo_utility.py:__init__():465] - Mongo connection established
2021-01-07 11:03:50 - DEBUG - logs/ilens - [MainThread:mongo_utility.py:__init__():465] - Mongo connection established
2021-01-07 11:08:23 - DEBUG - logs/ilens - [MainThread:mongo_utility.py:__init__():465] - Mongo connection established
2021-01-07 11:08:23 - DEBUG - logs/ilens - [MainThread:mongo_utility.py:__init__():465] - Mongo connection established
2021-01-07 11:08:23 - DEBUG - logs/ilens - [MainThread:mongo_utility.py:__init__():465] - Mongo connection established
2021-01-07 11:35:18 - DEBUG - logs/ilens - [MainThread:mongo_utility.py:__init__():465] - Mongo connection established
2021-01-07 11:35:18 - DEBUG - logs/ilens - [MainThread:mongo_utility.py:__init__():465] - Mongo connection established
2021-01-07 11:35:18 - DEBUG - logs/ilens - [MainThread:mongo_utility.py:__init__():465] - Mongo connection established
import configparser
import json
import os
# read config file based on already set environment variable : APP_ENV
# If APP_ENV is null default configuration file is used
# New application config file should be in folder with same name as environment variavble
APP_ENV = os.environ.get('APP_ENV')
if not APP_ENV:
APP_ENV = 'app'
config = configparser.ConfigParser()
CONFIGURATION_FILE = f"conf/{APP_ENV}/application.conf"
config.read(CONFIGURATION_FILE)
if not config.read(CONFIGURATION_FILE):
APP_ENV = "dev"
CONFIGURATION_FILE = f"conf/{APP_ENV}/application.conf"
config.read(CONFIGURATION_FILE)
"""
Configuration module
"""
"""
Service Info
"""
SERVICE_NAME = config["service"]["name"]
SERVICE_HOST = config["service"]["host"]
SERVICE_PORT = config.getint("service", "port")
SERVICE_SECRET_KEY = config["service"]["SECRET_KEY"]
SERVICE_ENABLE_SECURITY = config.getboolean("service", "enable_security", fallback=False)
SERVICE_INTERFACE = str(config["service"]["interface"])
DEVICE_STATUS_TIME = config.getint("service", "device_status_time_minutes", fallback=1)
APPLY_PROCESSOR_COUNT = config.getboolean("service", "apply_processor_count", fallback=False)
workers = config.getint("service", "workers", fallback=1)
threads = config.getint("service", "threads", fallback=1)
ip_check = config.getboolean("service", "ip_check", fallback=False)
cookie_max_age = config.getint("service", "cookie_max_age_in_mins", fallback=60)
max_attempts = config.getint("service", "max_attempts")
lockout_time_interval = config.getint("service", "lockout_time_interval")
reset_time_interval = config.getfloat("service", "reset_time_interval")
http_flag = config.getboolean('service', 'httpflag')
secure_flag = config.getboolean('service', 'secureflag')
"""
Log Info
"""
LOG_FILE_NAME = config["log"]["file_name"]
LOG_PATH = config["log"]["path"]
LOG_LEVEL = config["log"]["level"]
LOG_HANDLER = config["log"]["handler"]
LOG_MAX_BYTES = config.getint("log", "max_bytes")
LOG_BACKUP_COUNT = config.getint("log", "back_up_count")
"""
Mongo Info
"""
MONGO_HOST = config["mongo_db"]["host"]
MONGO_PORT = config.getint("mongo_db", "port", fallback=2717)
MONGO_USERNAME = config["mongo_db"]["username"]
MONGO_PASSWORD = config["mongo_db"]["password"]
MONGO_AUTHSOURCE = config["mongo_db"]["authSource"]
MONGO_AUTHMECHANISM = config["mongo_db"]["authMechanism"]
encryption_constants_file_path = config["mongo_db"]["mongo_constants_file_path"]
"""
Kairos Info
"""
KAIROS_DB_URL = config["kairos_db"]["url"]
"""
Additional info
"""
SYSTEM_LOGIN_DOMAIN_DOMAIN_LIST = json.loads(config["system_login"]["domain_list"])
CSV_PATH = config["csv_conf"]["csv_path"]
UPLOAD_CSV_PATH = config["csv_conf"]["upload_path"]
PROFILE_PIC_PATH = config["profile_pic_path"]["base_path"]
"""
Manual Entry conf
"""
SCHEDULER_BASE_URL = config["schedule_rule_engine"]["url"]
"""
Upload Parser
"""
# upload_parser = config["upload_parser"]
"""
Default email sender
"""
default_email_url = config["email_default_baseurl"]["base_url"]
"""
AI Rule : Auto Container Deployment Service
"""
AI_RULE_STATUS = config["ai_rules"]["enabled"]
if AI_RULE_STATUS.lower() == "true":
AI_RULE_DOCKER_ENDPOINT = config["ai_rules"]["docker_endpoint"]
else:
AI_RULE_DOCKER_ENDPOINT = "localhost"
CONTAINER_URL = config["flow_model"]["container_url"]
IMAGE_PATH = config.get('IMAGE', 'path', fallback="images/")
LICENSE_PATH = config.get('LICENSE_PATH', 'path', fallback="license/")
PIPELINE_INTERNAL_SECTION = 'pipeline_internal'
PIPELINE_INTERNAL_CONFIGURATION = {
"mqtt_broker_host": config.get(PIPELINE_INTERNAL_SECTION, 'mqtt_broker_host', fallback='localhost'),
"mqtt_broker_port": config.get(PIPELINE_INTERNAL_SECTION, 'mqtt_broker_port', fallback='1883'),
"mqtt_broker_ssl": config.get(PIPELINE_INTERNAL_SECTION, 'mqtt_broker_ssl', fallback='false'),
"mqtt_broker_conn_type": config.get(PIPELINE_INTERNAL_SECTION, 'mqtt_broker_conn_type', fallback='tcp'),
"mqtt_broker_ws_port": config.get(PIPELINE_INTERNAL_SECTION, 'mqtt_broker_ws_port', fallback='8083'),
"kafka_broker": config.get(PIPELINE_INTERNAL_SECTION, 'queue_host', fallback='localhost'),
"kafka_port": config.get(PIPELINE_INTERNAL_SECTION, 'queue_port', fallback='localhost'),
"broker_ssl_path": config.get(PIPELINE_INTERNAL_SECTION, 'broker_ssl_path', fallback='/opt/ssl'),
"node_intermediate": 'kafka' if config.get(PIPELINE_INTERNAL_SECTION, 'node_intermediate',
fallback='kafka') == 'queue' else "mqtt"
}
CHANNEL_PIPELINE_CONFIG = config['channel_pp_debug_node']
MQTT_BROKER_HOST = config['pipeline_internal']["mqtt_broker_host"]
MQTT_BROKER_PORT = config['pipeline_internal']["mqtt_broker_port"]
MQTT_BROKER_SSL = config['pipeline_internal']["mqtt_broker_ssl"]
MQTT_BROKER_CONN_TYPE = config['pipeline_internal']["mqtt_broker_conn_type"]
MQTT_BROKER_WS_PORT = config['pipeline_internal']["mqtt_broker_ws_port"]
BROKER_SSL_PATH = PIPELINE_INTERNAL_CONFIGURATION.get("broker_ssl_path", '/opt/ssl')
MANAGER_URL = config["AGENT"]["manager_url"]
DEVICE_MODE = config.get('AGENT', 'device_mode', fallback='agent')
SSL_CERT_PATH = config.get('AGENT', 'ssl_base_path', fallback='/opt/ssl')
TIME_SYNC_URL = config.get('AGENT', 'time_sync_url', fallback=None)
TIME_SYNC_URL_CERT_PATH = config.get('AGENT', 'cert_path', fallback=False)
# Redis Details
redis_host = str(config["REDIS"]["host"])
redis_port = int(config["REDIS"]["port"])
key_expiry_in_secs = int(config["REDIS"]["key_expiry"])
rules_redis_db = int(config["REDIS"]["rules_db"])
alarms_redis_db = int(config["REDIS"]["alarms_db"])
live_tags_db = int(config["REDIS"]["live_tags_db"])
audit_db = int(config["REDIS"]["audit_db"])
audit_queue = str(config["REDIS"]["audit_queue"])
#iLens version
version = str(config["ILENS_VERSION"]["version"])
# Data Processor configs
data_processor_host = config.get('DATA_PROCESSOR', 'host', fallback=None)
data_processor_conn_type = config.get('DATA_PROCESSOR', 'connection', fallback='tcp')
data_processor_ssl = bool(config.get('DATA_PROCESSOR', 'ssl_enabled', fallback=False))
data_processor_port = int(config.get('DATA_PROCESSOR', 'port', fallback=1883))
data_processor_topic = str(config.get('DATA_PROCESSOR', 'topic', fallback=None))
LICENSE_SERVER = config.get('LICENSE_SERVER','host', fallback="localhost")
LICENSE_PORT = config.get('LICENSE_SERVER','port', fallback=9816)
\ No newline at end of file
This diff is collapsed.
class ConnectionObj:
def __init__(self):
self.mongo_connection_obj = None
ConnectionObj = ConnectionObj()
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
# ------------------------------start of import statements---------------------------------#
import traceback
from flask import Blueprint, request
from scripts.core.handler.things.property_handler import PropertyHandler
#from scripts.services.login.login import login_required
# from scripts.utils.AESEnc import apply_encryption
from scripts.config import app_constants
from scripts.logging.logger import logger
# -------------------------------end of import statements-----------------------------------#
# ---------------------------------- Flask Blueprint ---------------------------------------#
property_blueprint = Blueprint("property", __name__)
# ---------------------------------- Flask Blueprint ---------------------------------------#
obj_property = PropertyHandler() # creating object for property type handler
@property_blueprint.route(app_constants.Endpoints.things_fetch_property, methods=['POST'])
# #@login_required
# @apply_encryption
def fetch_property():
"""
This is the service to fetch priority and it's info
:return: property with all it's details
"""
try:
if request.method == 'POST':
input_data = request.get_json()
return_json = obj_property.fetch_property(input_data)
return return_json
except Exception as e:
traceback.print_exc()
logger.exception("exception while fetching property details:" + str(e))
return {"status": "failed", "message": "failed to fetch property"}
@property_blueprint.route(app_constants.Endpoints.things_save_property, methods=['POST'])
#@login_required
# @apply_encryption
def create_property():
"""
This is the service to create property in the things studio
:return: Base64 encoded JSON with status success or failed
"""
try:
if request.method == 'POST':
input_data = request.get_json()
return_json = obj_property.save_property(input_data)
return return_json
except Exception as e:
traceback.print_exc()
logger.exception("exception while creating property:" + str(e))
return {"status": "failed", "message": "failed to create property"}
@property_blueprint.route(app_constants.Endpoints.things_list_property, methods=['POST'])
#@login_required
# @apply_encryption
def list_property():
"""
This is the service to list property in the things studio
:return: list of property available
"""
try:
if request.method == 'POST':
input_data = request.get_json()
return_json = obj_property.list_property(input_data)
return return_json
except Exception as e:
traceback.print_exc()
logger.exception("exception while fetching property details")
return {"status": "failed", "message": str(e)}
@property_blueprint.route(app_constants.Endpoints.things_delete_property, methods=['POST'])
#@login_required
# @apply_encryption
def delete_property():
"""
This is the service to delete property in the things studio
:return: Base64 encoded JSON with status success or failed
"""
try:
if request.method == 'POST':
input_data = request.data
return_json = obj_property.delete_property(input_data)
return return_json
except Exception as e:
traceback.print_exc()
logger.exception("exception while fetching property details")
return {"status": "failed", "message": str(e)}
@property_blueprint.route(app_constants.Endpoints.things_fetch_property_type_list, methods=['POST'])
#@login_required
# @apply_encryption
def fetch_property_types_available():
"""
This is the service to fetch all property types available in the things studio
:return: Base64 encoded JSON with status success or failed
"""
try:
if request.method == 'POST':
input_data = request.get_json()
return_json = obj_property.fetch_property_types(input_json=input_data)
return return_json
except Exception as e:
traceback.print_exc()
logger.exception("exception while fetching property details")
return {"status": "failed", "message": str(e)}
@property_blueprint.route(app_constants.Endpoints.things_fetch_unit_list, methods=['POST'])
#@login_required
# @apply_encryption
def fetch_unit_list():
"""
This is the service to fetch units from the units collection
:return: list of units and it's ids'
"""
try:
if request.method == 'POST':
input_data = request.data
return_json = obj_property.delete_property(input_data)
return return_json
except Exception as e:
traceback.print_exc()
logger.exception("exception while fetching property details")
return {"status": "failed", "message": str(e)}
# ------------------------------start of import statements---------------------------------#
import traceback
from flask import Blueprint, request
from scripts.core.handler.things.property_category_handler import PropertyCategoryHandler
#from scripts.services.login.login import login_required
# from scripts.utils.AESEnc import apply_encryption
from scripts.config import app_constants
from scripts.logging.logger import logger
# -------------------------------end of import statements-----------------------------------#
# ---------------------------------- Flask Blueprint ---------------------------------------#
property_category_blueprint = Blueprint("property_category", __name__)
# ---------------------------------- Flask Blueprint ---------------------------------------#
obj_property_category = PropertyCategoryHandler() # creating object for property type handler
@property_category_blueprint.route(app_constants.Endpoints.things_fetch_property_category, methods=['POST'])
#@login_required
# @apply_encryption
def fetch_property_category():
"""
This is the service to fetch property category and it's info
:return: property with all it's details
"""
try:
if request.method == 'POST':
input_data = request.get_json()
return_json = obj_property_category.fetch_property_category(input_data)
return return_json
except Exception as e:
traceback.print_exc()
logger.exception("exception while fetching property category details:" + str(e))
return {"status": "failed", "message": "failed to fetch property category"}
@property_category_blueprint.route(app_constants.Endpoints.things_save_property_category, methods=['POST'])
#@login_required
# @apply_encryption
def create_property_category():
"""
This is the service to create property category in the things studio
:return: Base64 encoded JSON with status success or failed
"""
try:
if request.method == 'POST':
input_data = request.get_json()
return_json = obj_property_category.save_property_category(input_data)
return return_json
except Exception as e:
traceback.print_exc()
logger.exception("exception while creating property:" + str(e))
return {"status": "failed", "message": "failed to create property"}
@property_category_blueprint.route(app_constants.Endpoints.things_list_property_category, methods=['POST'])
#@login_required
# @apply_encryption
def list_property_category():
"""
This is the service to list property category in the things studio
:return: list of property available
"""
try:
if request.method == 'POST':
input_data = request.data
return_json = obj_property_category.list_property_category(input_data)
return return_json
except Exception as e:
traceback.print_exc()
logger.exception("exception while fetching property category details")
return {"status": "failed", "message": str(e)}
@property_category_blueprint.route(app_constants.Endpoints.things_delete_property_category, methods=['POST'])
#@login_required
# @apply_encryption
def delete_property_category():
"""
This is the service to delete property category in the things studio
:return: Base64 encoded JSON with status success or failed
"""
try:
if request.method == 'POST':
input_data = request.get_json()
return_json = obj_property_category.delete_property_category(input_data)
return return_json
except Exception as e:
traceback.print_exc()
logger.exception("exception while fetching property details")
return {"status": "failed", "message": str(e)}
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
# --- All errors from this code base belong to the code series 0001-1000 --- #
IL0001 = 'Error Code IL0001: Login timeout, Please Login again'
IL0002 = 'Error Code IL0002: ILens faced an issue when processing.' \
' Please contact the administrator to resolve the issue.'
IL0003 = 'Error Code IL0003: Unsupported method was requested to server'
# --- All broader exceptions codes belong to the code series 1001-2000 --- #
IL1001 = ''
# --- All errors from dependent libraries belong to their respective code series --- #
# All error in the MONGO... series are exception codes for errors related to MongoDB
MONGO001 = "Error Code MONGO001: Server was unable to establish connection with MongoDB"
MONGO002 = "Error Code MONGO002: Server faced a problem when inserting document(s) into MongoDB"
MONGO003 = "Error Code MONGO003: Server faced a problem to find the document(s) with the given condition"
MONGO004 = "Error Code MONGO004: Server faced a problem to delete the document(s) with the given condition"
MONGO005 = "Error Code MONGO005: Server faced a problem to update the document(s) with the given condition and data"
MONGO006 = "Error Code MONGO006: Server faced a problem when aggregating the data"
MONGO007 = "Error Code MONGO007: Server faced a problem when closing MongoDB connection"
MONGO008 = "Error Code MONGO008: Found an existing record with the same ID in MongoDB"
MONGO009 = "Error Code MONGO009: Server faced a problem when fetching distinct documents from MongoDB"
MONGO010 = "Error Code MONGO010: Server faced a problem when performing a search and replace in MongoDB"
MONGO011 = "Error Code MONGO011: Server faced a problem when de-serializing MongoDB object"
# All error in the DCK... series are exception codes for errors related to Docker
DCK001 = "Error Code DCK001: Invalid docker client identifier"
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment