--- /dev/null
+venv
+__pycache__
+.idea
--- /dev/null
+#
+# Copyright 2020 Huawei Technologies Co., Ltd.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+
+class VideoCamera(object):
+ """
+ opneCV to capture frame from a camera
+ """
+ """
+ def __init__(self, url):
+ # self.video = cv2.VideoCapture(url)
+
+ def delete(self):
+ # self.video.release()
+
+ def get_frame(self):
+ # get a frane from camera url
+ # success, image = self.video.read()
+ return
+ """
+
+
+class VideoFile(object):
+ """
+ opneCV to capture frame from a video stream
+ """
+ """
+ def __init__(self, video_name):
+ # self.video = cv2.VideoCapture("./test/resources/" + video_name)
+
+ def delete(self):
+ # self.video.release()
+
+ def get_frame(self):
+ # get a frane from stream
+ # success, image = self.video.read()
+ return
+ """
--- /dev/null
+#
+# Copyright 2020 Huawei Technologies Co., Ltd.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+import os
+
+# [Server Configurations]
+server_port = 9999
+server_address = os.environ.get('LISTEN_IP')
+
+# [SSL Configurations]
+ssl_enabled = False
+ssl_protocol = "TLSv1.2"
+ssl_ciphers = ["TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256",
+ "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256",
+ "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384",
+ "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384"]
+ssl_certfilepath = "/usr/app/ssl/server_tls.crt"
+ssl_keyfilepath = "/usr/app/ssl/server_tls.key"
+ssl_cacertpath = "/usr/app/ssl/ca.crt"
+ssl_server_name = os.environ.get('SERVER_NAME', "ealtedge")
+
+# [Service Configurations]
+api_gateway = os.environ.get("API_GATEWAY", "apigw.mep.org")
+Obj_Det = os.environ.get("OBJ_DETECTION", "objdetection")
+
+# [Constants]
+detection_url = "http://" + api_gateway + "/" + Obj_Det
--- /dev/null
+#!/bin/bash
+# Copyright 2020 Huawei Technologies Co., Ltd.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Validates if ip is valid
+validate_ip()
+{
+ ip_var="$1"
+ # checks if variable is unset
+ if [ -z "$ip_var" ] ; then
+ echo "ip is not set"
+ return 1
+ fi
+
+ if ! echo "$ip_var" | grep -qE '^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.)' ; then
+ return 1
+ fi
+ return 0
+}
+
+validate_name() {
+ hostname="$1"
+ len="${#hostname}"
+ if [ "${len}" -gt "64" ]; then
+ return 1
+ fi
+ if ! echo "$hostname" | grep -qE '^[a-zA-Z0-9]*$|^[a-zA-Z0-9][a-zA-Z0-9_\-]*[a-zA-Z0-9]$'; then
+ return 1
+ fi
+ return 0
+}
+
+# validates whether file exist
+validate_file_exists() {
+ file_path="$1"
+
+ # checks variable is unset
+ if [ -z "$file_path" ]; then
+ echo "file path variable is not set"
+ return 1
+ fi
+
+ # checks if file exists
+ if [ ! -f "$file_path" ]; then
+ echo "file does not exist"
+ return 1
+ fi
+
+ return 0
+}
+
+validate_ip "$LISTEN_IP"
+valid_listen_ip="$?"
+if [ ! "$valid_listen_ip" -eq "0" ]; then
+ echo "invalid ip address for listen ip"
+ exit 1
+fi
+
+if [ ! -z "$SERVER_NAME" ]; then
+ validate_name "$SERVER_NAME"
+ valid_name="$?"
+ if [ ! "$valid_name" -eq "0" ]; then
+ echo "invalid ssl server name"
+ exit 1
+ fi
+fi
+
+# ssl parameters validation
+validate_file_exists "/usr/app/ssl/server_tls.crt"
+valid_ssl_server_cert="$?"
+if [ ! "$valid_ssl_server_cert" -eq "0" ]; then
+ echo "invalid ssl server certificate"
+ exit 1
+fi
+
+# ssl parameters validation
+validate_file_exists "/usr/app/ssl/server_tls.key"
+valid_ssl_server_key="$?"
+if [ ! "$valid_ssl_server_key" -eq "0" ]; then
+ echo "invalid ssl server key"
+ exit 1
+fi
+
+# ssl parameters validation
+validate_file_exists "/usr/app/ssl/ca.crt"
+valid_ssl_ca_crt="$?"
+if [ ! "$valid_ssl_ca_crt" -eq "0" ]; then
+ echo "invalid ssl ca cert"
+ exit 1
+fi
+
+echo "Running Retail App"
+umask 0027
+cd /usr/app || exit
+python run.py
\ No newline at end of file
--- /dev/null
+#
+# Copyright 2020 Huawei Technologies Co., Ltd.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+import config
+from flask_sslify import SSLify
+from flask import Flask, request, Response
+from flask_cors import CORS
+
+
+app = Flask(__name__)
+CORS(app)
+sslify = SSLify(app)
+app.config['JSON_AS_ASCII'] = False
+app.config['UPLOAD_PATH'] = '/usr/app/images/'
+app.config['supports_credentials'] = True
+app.config['CORS_SUPPORTS_CREDENTIALS'] = True
+app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024
+ALLOWED_EXTENSIONS = set(['png', 'jpg', 'jpeg'])
+count = 0
+listOfMsgs = []
+
+
+class shelf_inventry():
+ """
+ def __init__(self, url):
+ # self.video = cv2.VideoCapture(url)
+
+ def delete(self):
+ # self.video.release()
+ return
+ """
+
+
+def store_data():
+ """
+ store time series data in influx db
+ """
+ # TODO config, schema table, DB, fill data set
+
+
+def obj_detect():
+ """
+ detect obj and count for self
+ """
+
+
+@app.route('/v1/monitor/cameras', methods=['POST'])
+def add_camera():
+ camera_info = request.json
+ app.logger.info("Received message from ClientIP [" + request.remote_addr
+ + "] Operation [" + request.method + "]" +
+ " Resource [" + request.url + "]")
+ camera_info = {"name": camera_info["name"],
+ "rtspurl": camera_info["rtspurl"],
+ "location": camera_info["location"]}
+ # listOfCameras.append(camera_info)
+ return Response("success")
+
+
+@app.route('/v1/monitor/cameras/<name>/<rtspurl>/<location>', methods=['GET'])
+def get_camera(name, rtspurl, location):
+ """
+ register camera with location
+ """
+ app.logger.info("Received message from ClientIP [" + request.remote_addr
+ + "] Operation [" + request.method + "]" +
+ " Resource [" + request.url + "]")
+ # camera_info = {"name": name, "rtspurl": rtspurl, "location": location}
+ """
+ if "mp4" in camera_info["rtspurl"]:
+ # video_file = VideoFile(camera_info["rtspurl"])
+ # video_dict = {camera_info["name"]:video_file}
+ # listOfVideos.append(video_dict)
+ # return Response(video(video_file, camera_info["name"]),
+ # mimetype='multipart/x-mixed-replace; boundary=frame')
+ else:
+ # video_file = VideoCamera(camera_info["rtspurl"])
+ # video_dict = {camera_info["name"]: video_file}
+ # listOfVideos.append(video_dict)
+ # return Response(video(video_file, camera_info["name"]),
+ # mimetype='multipart/x-mixed-replace; boundary=frame')
+ return Response("success")
+ """
+
+
+@app.route('/v1/monitor/cameras/<camera_name>', methods=['DELETE'])
+def delete_camera(camera_name):
+ app.logger.info("Received message from ClientIP [" + request.remote_addr
+ + "] Operation [" + request.method + "]" +
+ " Resource [" + request.url + "]")
+ """
+ for video1 in listOfVideos:
+ if camera_name in video1:
+ video_obj = video1[camera_name]
+ video_obj.delete()
+ for camera in listOfCameras:
+ if camera_name == camera["name"]:
+ listOfCameras.remove(camera)
+ for msg in listOfMsgs:
+ if camera_name in msg["msg"]:
+ listOfMsgs.remove(msg)
+ return Response("success")
+ """
+
+
+@app.route('/v1/monitor/cameras')
+def query_cameras():
+ app.logger.info("Received message from ClientIP [" + request.remote_addr
+ + "] Operation [" + request.method + "]" +
+ " Resource [" + request.url + "]")
+ # return jsonify(listOfCameras)
+ return Response("success")
+
+
+def start_server(handler):
+ app.logger.addHandler(handler)
+ if config.ssl_enabled:
+ context = (config.ssl_certfilepath, config.ssl_keyfilepath)
+ app.run(host=config.server_address, debug=True, ssl_context=context,
+ threaded=True, port=config.server_port)
+ else:
+ app.run(host=config.server_address, debug=True, threaded=True,
+ port=config.server_port)
--- /dev/null
+#
+# Copyright 2020 Huawei Technologies Co., Ltd.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+flask
+requests
+flask_sslify
+opencv-python
+flask_cors
--- /dev/null
+#
+# Copyright 2020 Huawei Technologies Co., Ltd.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+import logging
+from logging.handlers import RotatingFileHandler
+from inventry.retail_app import start_server
+
+if __name__ == '__main__':
+ handler = RotatingFileHandler('/usr/app/log/obj_detection.log',
+ maxBytes=10000000, backupCount=10)
+ handler.setLevel(logging.INFO)
+ start_server(handler)