summaryrefslogtreecommitdiffstats
path: root/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo
diff options
context:
space:
mode:
Diffstat (limited to 'fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo')
-rw-r--r--fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/README.md50
-rw-r--r--fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/docker-compose.yml22
-rw-r--r--fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/Dockerfile9
-rwxr-xr-xfluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/db.sqlite3bin0 -> 45056 bytes
-rwxr-xr-xfluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/devices/__init__.py0
-rwxr-xr-xfluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/devices/admin.py3
-rwxr-xr-xfluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/devices/apps.py5
-rwxr-xr-xfluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/devices/migrations/__init__.py0
-rwxr-xr-xfluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/devices/models.py3
-rw-r--r--fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/devices/templates/application.html141
-rw-r--r--fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/devices/templates/appstore.html98
-rw-r--r--fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/devices/templates/empty.html125
-rwxr-xr-xfluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/devices/templates/help.html102
-rw-r--r--fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/devices/templates/mysite.html91
-rwxr-xr-xfluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/devices/tests.py3
-rwxr-xr-xfluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/devices/views.py273
-rwxr-xr-xfluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/manage.py21
-rwxr-xr-xfluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/mysite/__init__.py0
-rwxr-xr-xfluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/mysite/settings.py136
-rwxr-xr-xfluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/mysite/urls.py41
-rwxr-xr-xfluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/mysite/wsgi.py16
-rw-r--r--fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/server/Dockerfile6
-rwxr-xr-xfluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/server/wasm_server.py621
-rw-r--r--fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/css/application.css400
-rw-r--r--fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/css/appstore.css216
-rwxr-xr-xfluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/css/index.css197
-rw-r--r--fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/js/application.js217
-rw-r--r--fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/js/appstore.js125
-rw-r--r--fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/js/index.js51
-rw-r--r--fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/photo/app(1).pngbin0 -> 5421 bytes
-rwxr-xr-xfluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/photo/application.pngbin0 -> 7875 bytes
-rwxr-xr-xfluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/photo/delete.pngbin0 -> 4107 bytes
-rw-r--r--fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/photo/download(1).pngbin0 -> 1502 bytes
-rwxr-xr-xfluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/photo/menu.pngbin0 -> 1839 bytes
-rwxr-xr-xfluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/photo/milky-way-2695569_1280.jpgbin0 -> 535384 bytes
-rwxr-xr-xfluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/photo/net_device.pngbin0 -> 6867 bytes
-rw-r--r--fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/photo/software-icon-32081.pngbin0 -> 39956 bytes
-rw-r--r--fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/photo/totalblack.pngbin0 -> 2301 bytes
-rw-r--r--fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/upload/connection.wasmbin0 -> 6280 bytes
-rw-r--r--fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/upload/event_publisher.wasmbin0 -> 4958 bytes
-rw-r--r--fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/upload/event_subscriber.wasmbin0 -> 4015 bytes
-rw-r--r--fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/upload/request_handler.wasmbin0 -> 6776 bytes
-rw-r--r--fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/upload/request_sender.wasmbin0 -> 5311 bytes
-rw-r--r--fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/upload/sensor.wasmbin0 -> 4455 bytes
-rwxr-xr-xfluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/upload/simplebin0 -> 387456 bytes
-rw-r--r--fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/upload/sys/connection.wasmbin0 -> 6280 bytes
-rw-r--r--fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/upload/sys/event_publisher.wasmbin0 -> 4958 bytes
-rw-r--r--fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/upload/sys/event_subscriber.wasmbin0 -> 4015 bytes
-rw-r--r--fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/upload/sys/request_handler.wasmbin0 -> 6776 bytes
-rw-r--r--fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/upload/sys/request_sender.wasmbin0 -> 5311 bytes
-rw-r--r--fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/upload/sys/timer.wasmbin0 -> 2388 bytes
-rw-r--r--fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/upload/timer.wasmbin0 -> 2388 bytes
-rw-r--r--fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/upload/ui_app.wasmbin0 -> 1912 bytes
-rwxr-xr-xfluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/upload/wasm_runtime_wglbin0 -> 615016 bytes
54 files changed, 2972 insertions, 0 deletions
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/README.md b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/README.md
new file mode 100644
index 00000000..266255c0
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/README.md
@@ -0,0 +1,50 @@
+# IoT Application Store
+Wasm application management portal for WAMR
+
+## Start the server
+
+### Using docker
+1. install docker and docker-compose
+ ``` bash
+ sudo apt install docker.io docker-compose
+ ```
+
+2. start
+ ``` bash
+ docker-compose up
+ ```
+### Using commands
+> Note: must use python3.5. If you don't have python3.5 on your machine, had better using docker
+1. install the required package
+ ``` bash
+ pip3 install django
+ ```
+
+2. Start device server
+ ``` bash
+ cd wasm_django/server
+ python3 wasm_server.py
+ ```
+
+3. Start IoT application management web portal
+ ``` bash
+ cd wasm_django
+ python3 manage.py runserver 0.0.0.0:80
+ ```
+
+## Start the runtime
+1. Download WAMR runtime from [help](http://localhost/help/) page
+ > NOTE: You need to start the server before accessing this link!
+
+2. Start a WAMR runtime from localhost
+ ``` bash
+ chmod +x simple
+ ./simple
+ ```
+ or from other computers
+ ``` bash
+ ./simple -a [your.server.ip.address]
+ ```
+
+## Online demo
+ http://82.156.57.236/
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/docker-compose.yml b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/docker-compose.yml
new file mode 100644
index 00000000..331d064c
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/docker-compose.yml
@@ -0,0 +1,22 @@
+version: '2.0'
+
+services:
+ web_portal:
+ build: ./wasm_django
+ network_mode: "host"
+ depends_on:
+ - 'device_server'
+ restart: always
+ volumes:
+ - store:/app/static/upload/
+ device_server:
+ build:
+ context: ./wasm_django
+ dockerfile: ./server/Dockerfile
+ network_mode: "host"
+ restart: always
+ volumes:
+ - store:/app/static/upload/
+
+volumes:
+ store: \ No newline at end of file
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/Dockerfile b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/Dockerfile
new file mode 100644
index 00000000..a796725f
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/Dockerfile
@@ -0,0 +1,9 @@
+FROM python:3.5
+
+WORKDIR /app
+COPY . /app
+
+# hadolint ignore=DL3013
+RUN pip install django --no-cache-dir
+
+ENTRYPOINT ["python", "manage.py", "runserver", "0.0.0.0:80"]
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/db.sqlite3 b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/db.sqlite3
new file mode 100755
index 00000000..211576ca
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/db.sqlite3
Binary files differ
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/devices/__init__.py b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/devices/__init__.py
new file mode 100755
index 00000000..e69de29b
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/devices/__init__.py
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/devices/admin.py b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/devices/admin.py
new file mode 100755
index 00000000..8c38f3f3
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/devices/admin.py
@@ -0,0 +1,3 @@
+from django.contrib import admin
+
+# Register your models here.
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/devices/apps.py b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/devices/apps.py
new file mode 100755
index 00000000..d43cc4b6
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/devices/apps.py
@@ -0,0 +1,5 @@
+from django.apps import AppConfig
+
+
+class DevicesConfig(AppConfig):
+ name = 'devices'
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/devices/migrations/__init__.py b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/devices/migrations/__init__.py
new file mode 100755
index 00000000..e69de29b
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/devices/migrations/__init__.py
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/devices/models.py b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/devices/models.py
new file mode 100755
index 00000000..71a83623
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/devices/models.py
@@ -0,0 +1,3 @@
+from django.db import models
+
+# Create your models here.
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/devices/templates/application.html b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/devices/templates/application.html
new file mode 100644
index 00000000..0b2ea7fa
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/devices/templates/application.html
@@ -0,0 +1,141 @@
+<!--
+/* Copyright (C) 2019 Intel Corporation. All rights reserved.
+ * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+ */
+-->
+
+{% load static %}
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+
+<head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0,shrink-to-fit=no">
+ <title> Wasm-Micro-Runtime </title>
+ <link rel="stylesheet" type="text/css" href="{%static 'css/application.css'%}"/>
+
+<link rel="stylesheet" href="https://cdn.staticfile.org/twitter-bootstrap/4.1.0/css/bootstrap.min.css">
+<script src="https://cdn.staticfile.org/jquery/3.2.1/jquery.min.js"></script>
+<script src="https://cdn.staticfile.org/popper.js/1.12.5/umd/popper.min.js"></script>
+<script src="https://cdn.staticfile.org/twitter-bootstrap/4.1.0/js/bootstrap.min.js"></script>
+</head>
+
+<body style="background-image: linear-gradient(to right, rgb(248, 248, 248) , rgb(194, 194, 190))">
+
+<div id="container" style="background-image: url('{%static 'photo//totalblack.png'%}')">
+ <div id="content">
+ <div id= "mainnav">
+ <ul>
+ <li ><a href="https://github.com/intel/wasm-micro-runtime">GitHub</a></li>
+ <li ><a href="/">Devices</a></li>
+ <li ><a href="/appstore/">App Store</a></li>
+ <li ><a href="/help/">Help</a></li>
+ </ul>
+ </div>
+ </div>
+ <div class="headers" style="background-image: url('{%static 'photo/milky-way-2695569_1280.jpg'%}')">
+ <h1 id="maintitle">WebAssembly Micro Runtime - APP Store Demo</h1>
+ </div>
+</div>
+
+
+
+<div class="row">
+ <div class="col-sm-2 col-md-2 col-lg-2 col-xl-2"></div>
+ <div class="col-sm-8 col-md-8 col-lg-8 col-xl-8" id="section">
+ <div id="photo">
+ <p>
+ <img src="{%static 'photo/net_device.png'%}" ;height="65" width="65" />
+ </p>
+ </div>
+ <div id="IPs">IP : </div>
+ <div id="ports">Port : </div>
+ <div id="installs">Installed apps : </div>
+ </div>
+ <div class="col-sm-2 col-md-2 col-lg-2 col-xl-2"></div>
+</div>
+
+ <div class="middlebox" style="display:none;">
+ <div class="warning">Dialog Box</div>
+ <div class="findapp"> APP </div>
+ <button class="surebtn" type="button" value="sure">OK</button>
+ </div>
+
+ <div class="deletebox" style="display:none;">
+ <div class="warning2">Dialog Box</div>
+ <div class="findapp"> APP </div>
+ <button class="suresbtn" type="button" value="sure">OK</button>
+ <button class="cancelsbtn" type="button" value="Cancel">Cancel</button>
+ </div>
+
+ <div id="loading">
+ <p class="loadapp"> app is downloading now </p>
+ <div id="preloader">
+ <div id="loader"></div>
+ </div>
+ </div>
+
+
+<div class="main">
+ <div class="mainbox">
+ <div class= "close"> × </div>
+ <div class="hotapps">HOT Applications</div>
+ <div class="col-sm-6" id="searchbar">
+ <form method="post" action="/apps/" id="form_addServiceInfoAll">
+ {% csrf_token %}
+ <div class="input-group">
+ <input type="text" name="mykey" class="form-control" placeholder="Input the product name" required />
+ <input type="hidden" name="voip" id="aa" value="">
+ <input type="hidden" name="voport" id="bb" value="">
+ <span class="input-group-btn">
+ <input type="submit" class="btn btn-default" value="Search" />
+ </span>
+ </div>
+ </form>
+ </div>
+ <div id="scrollba">
+ <div id="Dapplications">
+ <div id="appslogo" style="width:45px; height:25px; float:left; "><img src="{%static 'photo/application.png'%}" ;height="35" width="35" /></div>
+ <p id="appsinfo1" style="font-size:15px;font-family:'sansationlight';width:310px; height:25px; float:left; "> Product Name: </p>
+ <p id="appsinfo2" style="font-size:15px;font-family:'sansationlight';width:120px; height:25px; float:left; "> Current Version: </p>
+ <button class="mybtn2" type="button" onclick="getthis(this)" value="downloadit"> ↓ Install</button>
+ </div>
+ </div>
+ </div>
+</div>
+
+
+ <div class="col-sm-8 col-md-8 col-lg-8 col-xl-8" id="download">
+ <p class = "explain pull-left" >List of Installed Apps:</p>
+ <button id="btn" class="btn btn-outline-primary pull-right" style="float:right" type="button" value="add">Install Application</button>
+ </div>
+
+
+ <div id="APPS" class="sourceapp">
+ <div id="applications">
+ <div id="applogo"><img src="{%static 'photo/app(1).png'%}" ;height="35" width="35" /></div>
+ <div id="appinfo1"> Product Name: </div>
+ <div id="appinfo2"> Staus: </div>
+ <div id="appinfo3"> Current Version: </div>
+ </div>
+ <div id="delete" ><img class="mybtn" style="cursor:pointer" src="{%static 'photo/delete.png'%}" ;height="35" width="35" /></div>
+ </div>
+
+<footer class="footer"> Copyright&copy; intel.com</footer>
+
+
+
+<script src="http://code.jquery.com/jquery-2.1.4.min.js"></script>
+<script>
+var alist = {{alist|safe}}; /*alist is a list of downloaded apps under the current device*/
+var dlist = {{dlist|safe}}; /*dlist saves the device info that includes its IP, Port and number of apps*/
+var llist = {{llist|safe}}; /*llist is a list of apps avaliable for installing that are synchronously updated with appstore*/
+var open_status ={{open_status|safe}};/*check is the search bar working&searching,otherwise, close window and return to the main page*/
+var search_node ={{search_node|safe}};/*THe queried app node*/
+</script>
+<script type="text/javascript" src="{%static 'js/application.js'%}"></script>
+
+</body>
+
+</html>
+
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/devices/templates/appstore.html b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/devices/templates/appstore.html
new file mode 100644
index 00000000..46ecedf1
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/devices/templates/appstore.html
@@ -0,0 +1,98 @@
+<!--
+/* Copyright (C) 2019 Intel Corporation. All rights reserved.
+ * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+ */
+-->
+
+{% load static %}
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+
+<head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0,shrink-to-fit=no">
+
+ <title> Wasm-Micro-Runtime </title>
+ <link rel="stylesheet" type="text/css" href="{%static 'css/appstore.css'%}"/>
+
+<link rel="stylesheet" href="https://cdn.staticfile.org/twitter-bootstrap/4.1.0/css/bootstrap.min.css">
+<script src="https://cdn.staticfile.org/jquery/3.2.1/jquery.min.js"></script>
+<script src="https://cdn.staticfile.org/popper.js/1.12.5/umd/popper.min.js"></script>
+<script src="https://cdn.staticfile.org/twitter-bootstrap/4.1.0/js/bootstrap.min.js"></script>
+</head>
+
+<body style="background-color:rgb(240, 240, 240)">
+
+<div id="container" style="background-image: url('{%static 'photo//totalblack.png'%}')">
+ <div id="content">
+ <div id= "mainnav">
+ <ul>
+ <li ><a href="https://github.com/intel/wasm-micro-runtime">GitHub</a></li>
+ <li ><a href="/">Devices</a></li>
+ <li ><a href="/appstore/">App Store</a></li>
+ <li ><a href="/help/">Help</a></li>
+ </ul>
+ </div>
+ </div>
+ <div class="headers" style="background-image: url('{%static 'photo/milky-way-2695569_1280.jpg'%}')">
+ <h1 id="maintitle">WebAssembly Micro Runtime - APP Store Demo</h1>
+ </div>
+</div>
+<!-- <div id="introinfo"></div> -->
+<!-- <div class="style-one"></div> -->
+
+<div class="deletebox" style="display:none;">
+ <div class="warning2">Dialog Box</div>
+ <div class="findapp"> APP </div>
+ <button class="suresbtn" type="button" value="sure">OK</button>
+ <button class="delsbtn" type="button" value="Cancel">Cancel</button>
+</div>
+
+ <div id = "introstore">
+ <div id="applicationlist">
+ <div class="bar">
+ <div class="leftpart">The products </div>
+ <div style="position:relative; float:left; left:50px; font-size:14px; height:50px; top:10px;">Application List</div>
+ <div class="rightpart">
+ <form action="/upload" method = "POST" enctype="multipart/form-data">
+ {%csrf_token%}
+ <div class="stylehere">
+ <input type ="file" required name="myfile" class = "file">
+ <a href="#" class="choosestyle">Choose File</a>
+ </div>
+ <div class="stylehere">
+ <input type="submit" value = "upload" class="btn btn-info">
+ </div>
+ </form>
+ </div>
+ </div>
+ <div class = "appbook">
+ <div id="applications">
+ <div id="appimage" ><img class="mysoftware" src="{%static 'photo/software-icon-32081.png'%}" ;height="50" width="40"/></div>
+ <p id="appinfo1" style="position:relative; font-size:15px;width:35%; height:25px; float:left; left:5%;"> Product Name: </p>
+ <p id="appinfo2" style="position:relative; font-size:15px;width:30%; height:25px; float:left; left:5%;"> Product Version: </p>
+ <p id="lable" style="position:relative;font-size:11px;font-family:'logo';width:10%; height:25px; float:left; left:5%;"> Preloaded Apps </p>
+ <button id="delbutton" type="button" style="position: relative; height:25px; float:left; left:5%;" onclick="deleteClick(this)" method = "get" name="delete">Remove</button>
+ </div>
+ </div>
+ <br>
+ </div>
+ </div>
+</div>
+
+<footer class="footer">
+ Copyright&copy; intel.com
+</footer>
+
+<script src="http://code.jquery.com/jquery-2.1.4.min.js"></script>
+<script>
+var elist = {{staticlist|safe}}/*saves all the apps that preloaded and are not able to be removed from applestore*/
+var flist = {{flist|safe}} /*a list of locally uploaded apps installed by users*/
+var ulist = {{ulist|safe}} /*Declare about is the app avaliable for uploading to the appstore: wasm_file OR preloaded already*/
+</script>
+<script type="text/javascript" src="{%static 'js/appstore.js'%}"></script>
+
+</body>
+
+</html>
+
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/devices/templates/empty.html b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/devices/templates/empty.html
new file mode 100644
index 00000000..5610a2d8
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/devices/templates/empty.html
@@ -0,0 +1,125 @@
+<!--
+/* Copyright (C) 2019 Intel Corporation. All rights reserved.
+ * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+ */
+-->
+
+<html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+
+<meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no">
+<title>wasm-micro-runtime</title>
+
+<style type="text/css">
+html, body{overflow:hidden;margin:0;background:#000;}
+body{font-family:'Open Sans', 'Helvetica Neue', 'Hiragino Sans GB', 'LiHei Pro', Arial, sans-serif;color:#333;}
+#wrapper{position:absolute;left:0;width:320px;text-align:center;top:50%;left:50%;margin-left:-160px;margin-top:-160px;-webkit-user-select:none;-moz-user-select:none;user-select:none;}
+h1{font-family:'Montserrat', 'Helvetica Neue', Arial, sans-serif;font-weight:700;font-size:50px;letter-spacing:9px;text-transform:uppercase;color:#eee;margin:12px 0;left:4px;}
+h2{color:#999;font-weight:normal;font-size:20px;letter-spacing:.200em;margin-bottom:30px;left:3px;}
+h1, h2{position:relative;}
+p{font-size:14px;line-height:2em;margin:0;letter-spacing:2px;}
+canvas{position:absolute;top:0;left:0;z-index:0;width:100%;height:100%;pointer-events:none;}
+a{color:#999;text-decoration:none;transition:color .2s ease;}
+a:hover{color:#f33;}
+</style>
+
+
+
+</head>
+<body>
+
+<script type="text/javascript" src="./js/jquery.min.js"></script>
+
+<div id="wrapper">
+ <h1>404</h1>
+ <h2>Server Not Found</h2>
+ <p><a href="https://github.com/intel/wasm-micro-runtime" target="_blank">Github</a></p>
+</div>
+
+
+<canvas width="1920" height="917"></canvas>
+
+<script type="text/javascript">
+document.addEventListener('touchmove', function (e) {
+ e.preventDefault()
+})
+var c = document.getElementsByTagName('canvas')[0],
+ x = c.getContext('2d'),
+ pr = window.devicePixelRatio || 1,
+ w = window.innerWidth,
+ h = window.innerHeight,
+ f = 90,
+ q,
+ m = Math,
+ r = 0,
+ u = m.PI*2,
+ v = m.cos,
+ z = m.random
+c.width = w*pr
+c.height = h*pr
+x.scale(pr, pr)
+x.globalAlpha = 0.6
+function i(){
+ x.clearRect(0,0,w,h)
+ q=[{x:0,y:h*.7+f},{x:0,y:h*.7-f}]
+ while(q[1].x<w+f) d(q[0], q[1])
+}
+function d(i,j){
+ x.beginPath()
+ x.moveTo(i.x, i.y)
+ x.lineTo(j.x, j.y)
+ var k = j.x + (z()*2-0.25)*f,
+ n = y(j.y)
+ x.lineTo(k, n)
+ x.closePath()
+ r-=u/-50
+ x.fillStyle = '#'+(v(r)*127+128<<16 | v(r+u/3)*127+128<<8 | v(r+u/3*2)*127+128).toString(16)
+ x.fill()
+ q[0] = q[1]
+ q[1] = {x:k,y:n}
+}
+function y(p){
+ var t = p + (z()*2-1.1)*f
+ return (t>h||t<0) ? y(p) : t
+}
+document.onclick = i
+document.ontouchstart = i
+i()
+</script>
+
+<script type="text/javascript">
+var snow = function() {
+if(1==1) {
+$("body").append('<canvas id="christmasCanvas" style="top: 0px; left: 0px; z-index: 5000; position: fixed; pointer-events: none;"></canvas>');
+var b = document.getElementById("christmasCanvas"), a = b.getContext("2d"), d = window.innerWidth, c = window.innerHeight;
+b.width = d;
+b.height = c;
+for(var e = [], b = 0;b < 70;b++) {
+e.push({x:Math.random() * d, y:Math.random() * c, r:Math.random() * 4 + 1, d:Math.random() * 70})
+}
+var h = 0;
+window.intervral4Christmas = setInterval(function() {
+a.clearRect(0, 0, d, c);
+a.fillStyle = "rgba(255, 255, 255, 0.6)";
+a.shadowBlur = 5;
+a.shadowColor = "rgba(255, 255, 255, 0.9)";
+a.beginPath();
+for(var b = 0;b < 70;b++) {
+var f = e[b];
+a.moveTo(f.x, f.y);
+a.arc(f.x, f.y, f.r, 0, Math.PI * 2, !0)
+}
+a.fill();
+h += 0.01;
+for(b = 0;b < 70;b++) {
+if(f = e[b], f.y += Math.cos(h + f.d) + 1 + f.r / 2, f.x += Math.sin(h) * 2, f.x > d + 5 || f.x < -5 || f.y > c) {
+e[b] = b % 3 > 0 ? {x:Math.random() * d, y:-10, r:f.r, d:f.d} : Math.sin(h) > 0 ? {x:-5, y:Math.random() * c, r:f.r, d:f.d} : {x:d + 5, y:Math.random() * c, r:f.r, d:f.d}
+}
+}
+}, 70)
+}
+}
+snow();
+</script><canvas id="christmasCanvas" style="top: 0px; left: 0px; z-index: 5000; position: fixed; pointer-events: none;" width="1920" height="917"></canvas>
+
+
+</body></html>
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/devices/templates/help.html b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/devices/templates/help.html
new file mode 100755
index 00000000..4ad7427b
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/devices/templates/help.html
@@ -0,0 +1,102 @@
+<!--
+/* Copyright (C) 2019 Intel Corporation. All rights reserved.
+ * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+ */
+-->
+
+{% load static %}
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+
+<head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <title> Wasm-Micro-Runtime </title>
+ <script src="http://apps.bdimg.com/libs/jquery/1.10.2/jquery.min.js"></script>
+ <!-- <link rel="stylesheet" type="text/css" href="{%static%/css/index.css"/> -->
+ <!-- <link rel="stylesheet" type="text/css" href="/home/xujun/mysite/static/css/index.css"/> -->
+
+ <link rel="stylesheet" href="https://cdn.staticfile.org/twitter-bootstrap/4.1.0/css/bootstrap.min.css">
+ <script src="https://cdn.staticfile.org/jquery/3.2.1/jquery.min.js"></script>
+ <script src="https://cdn.staticfile.org/popper.js/1.12.5/umd/popper.min.js"></script>
+ <script src="https://cdn.staticfile.org/twitter-bootstrap/4.1.0/js/bootstrap.min.js"></script>
+
+ <head>
+
+ <body>
+ <div class="container">
+ <div class="row clearfix">
+ <div class="col-md-12 column">
+ <div class="jumbotron">
+ <h1>
+ How to use?
+ </h1>
+ <p>
+ 1. Download a simple runtime (build for ubuntu 20.04 64 bits, other platforms please build
+ from the <a href="https://github.com/bytecodealliance/wasm-micro-runtime/tree/main/samples/simple">source code</a>)
+ </p>
+ <p>
+ 2. In the terminal: <code>cd ~/Download && ./simple -a 82.156.57.236</code>
+ </p>
+ <div class="span12">
+ <div class="alert alert-info">
+ <!-- <button class="close" type="button" data-dismiss="alert">×</button> -->
+ <h5>
+ Notes:
+ </h5> We also have a <strong>UI-enabled runtime</strong>, please <a
+ href="../static/upload/wasm_runtime_wgl">download here</a> and enjoy.</strong> It may require
+ a few more setups.
+ <p>Before running the UI-enabled runtime, please install some required softwares:</p>
+ <p><code>sudo apt-get install libsdl2-2.0-0:i386</code> </p>
+ <p>For more details please refer to this <a
+ href="https://github.com/bytecodealliance/wasm-micro-runtime/tree/main/samples/littlevgl">guide</a>
+ </p>
+ <p><code>cd ~/Download && ./wasm_runtime_wgl -a 82.156.57.236</code></p>
+ </div>
+ </div>
+ <p>
+ 3. Return to device page, find your device according to the IP address and click it, you
+ will enter application installation page
+ </p>
+ <p>
+ 4. In the application installation page, click the Install Application button, and chose an
+ app to install. (The "ui_app" is only for UI_enabled_runtimes, simple runtime can't install
+ this app)
+ </p>
+ <p>
+ 5. If you want to upload a new application, go to App Store page, choose a file and click
+ upload
+ </p>
+ <p>
+ <a class="btn btn-primary btn-large" href="/">Go Back</a>
+ <a class="btn btn-primary btn-large" href="../static/upload/simple">Download
+ simple_runtime</a>
+ <a class="btn btn-primary btn-large" href="../static/upload/wasm_runtime_wgl">Download
+ UI_enabled_runtime</a>
+ </p>
+ </div>
+ <div class="container">
+ <div class="card">
+ <div class="card-body">
+ <h4 class="card-title">Like this project?</h4>
+ <p class="card-text">Join us and build a powerful and interesting world for embedded
+ devices!</p>
+ <iframe
+ src="https://ghbtns.com/github-btn.html?user=intel&repo=wasm-micro-runtime&type=star&count=true&size=large"
+ frameborder="0" scrolling="0" width="160px" height="30px"></iframe>
+ <iframe
+ src="https://ghbtns.com/github-btn.html?user=intel&repo=wasm-micro-runtime&type=fork&count=true&size=large"
+ frameborder="0" scrolling="0" width="158px" height="30px"></iframe>
+ <p>
+ <a href="https://github.com/intel/wasm-micro-runtime" class="btn btn-success">View
+ on GitHub</a>
+ </p>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </body>
+
+</html>
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/devices/templates/mysite.html b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/devices/templates/mysite.html
new file mode 100644
index 00000000..3832791d
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/devices/templates/mysite.html
@@ -0,0 +1,91 @@
+<!--
+/* Copyright (C) 2019 Intel Corporation. All rights reserved.
+ * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+ */
+-->
+
+{% load static %}
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+
+<head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0,shrink-to-fit=no">
+ <title> Wasm-Micro-Runtime </title>
+ <link rel="stylesheet" type="text/css" href="{%static 'css/index.css'%}"/>
+
+<link rel="stylesheet" href="https://cdn.staticfile.org/twitter-bootstrap/4.1.0/css/bootstrap.min.css">
+<script src="https://cdn.staticfile.org/jquery/3.2.1/jquery.min.js"></script>
+<script src="https://cdn.staticfile.org/popper.js/1.12.5/umd/popper.min.js"></script>
+<script src="https://cdn.staticfile.org/twitter-bootstrap/4.1.0/js/bootstrap.min.js"></script>
+</head>
+
+
+<body>
+<div id="container" style="background-image: url('{%static 'photo/totalblack.png'%}')">
+ <div id="content">
+ <div id= "mainnav">
+ <ul>
+ <li ><a href="https://github.com/intel/wasm-micro-runtime">GitHub</a></li>
+ <li ><a href="/">Devices</a></li>
+ <li ><a href="/appstore/">App Store</a></li>
+ <li ><a href="/help/">Help</a></li>
+ </ul>
+ </div>
+ </div>
+ <div class="headers" style="background-image: url('{%static 'photo/milky-way-2695569_1280.jpg'%}')">
+ <h1 id="maintitle">WebAssembly Micro Runtime - APP Store Demo</h1>
+ </div>
+</div>
+
+<div class="row">
+ <div class="col-sm-1 col-md-1 col-lg-1 col-xl-1"></div>
+ <div class="col-sm-4 col-md-4 col-lg-4 col-xl-4">
+ <div id="photo2">
+ <p>
+ <img src="{%static 'photo/net_device.png'%}" ;height="45" width="45" />
+ </p>
+ </div>
+ <div id="devic"><p style="font-size:22px;">The devices</p></div>
+ </div>
+</div>
+
+<div id="dividebar"></div>
+
+
+<div id="devices" class="devics">
+ <div class="deviceClick" style="cursor:pointer" onclick="deviceClick(this)">
+ <div id="section">
+ <div id="photo">
+ <p>
+ <img src="{%static 'photo/net_device.png'%}" ;height="60" width="60" />
+ </p>
+ </div>
+ <div id="IPs">IP : </div>
+ <div id="ports">Port : </div>
+ <div id="installs">Installed apps : </div>
+ </div>
+ <div class="smenu">
+ <p id="del" style="cursor:pointer">
+ <img class = "toapps" src="{%static 'photo/menu.png'%}" href= "javascript:void(0);" height="30" width="30" />
+ </p>
+ </div>
+ </div>
+</div>
+
+<!-- <button class="prev" type="button" value="prev" onclick="prevpage(this)">Previous</button>-->
+<!-- <button class="next" type="button" value="next" onclick="nextpage(this)">Next</button> -->
+
+<footer class="footer">
+ Copyright&copy; intel.com
+</footer>
+
+
+<script src="http://code.jquery.com/jquery-2.1.4.min.js"></script>
+<script>
+var dlist = {{dlist|safe}};/*Devices List that render to the current page*/
+</script>
+<script type="text/javascript" src="{%static 'js/index.js'%}"></script>
+</body>
+
+</html>
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/devices/tests.py b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/devices/tests.py
new file mode 100755
index 00000000..7ce503c2
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/devices/tests.py
@@ -0,0 +1,3 @@
+from django.test import TestCase
+
+# Create your tests here.
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/devices/views.py b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/devices/views.py
new file mode 100755
index 00000000..1afa1f95
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/devices/views.py
@@ -0,0 +1,273 @@
+'''
+ /* Copyright (C) 2019 Intel Corporation. All rights reserved.
+ * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+ */
+'''
+
+# _*_
+from django.shortcuts import render, render_to_response
+from django.http import HttpResponse, HttpResponseRedirect, HttpResponseNotFound
+import json
+import socket
+import os
+
+# Create your views here.
+
+
+avaliable_list = [
+ {'ID': 'timer', 'Version': '1.0'},
+ {'ID': 'connection', 'Version': '1.0'},
+ {'ID': 'event_publisher', 'Version': '3.0'},
+ {'ID': 'event_subscriber', 'Version': '1.0'},
+ {'ID': 'request_handler', 'Version': '1.0'},
+ {'ID': 'sensor', 'Version': '1.0'},
+ {'ID': 'ui_app', 'Version': '1.0'}
+]
+
+# Help
+def help(req):
+# return "Help" page
+ return render(req, "help.html")
+
+# View
+def index(req):
+ s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+
+ host = '127.0.0.1'
+ port = 8889
+ msg = ""
+ err = ""
+
+ try:
+ s.connect((host, port))
+ s.send(bytes("query:all", encoding='utf8'))
+ s.settimeout(10)
+ msg = s.recv(1024)
+ except socket.timeout as e:
+ err = "empty"
+ print("no client connected")
+ except socket.error as e:
+ err = "refused"
+ print("server not started")
+
+ s.close()
+
+ device_list = []
+ if msg != "":
+ devices = msg.decode('utf-8').split("*")
+ for dev in devices:
+ dev_info = eval(dev)
+ addr = dev_info['addr']
+ port = dev_info['port']
+ apps = dev_info['num']
+ device_list.append({'IP': addr, 'Port': port, 'apps': apps})
+ else:
+ if err == "refused":
+ return render(req, "empty.html")
+
+ dlist = device_list
+
+ return render(req, 'mysite.html', {'dlist': json.dumps(dlist)})
+
+
+def apps(req):
+ open_status = ''
+ search_node = []
+ if req.method == "POST":
+ dev_search = req.POST['mykey']
+ dev_addr = req.POST['voip']
+ dev_port = req.POST['voport']
+ open_status = 'open'
+ for i in avaliable_list:
+ if i['ID'] == dev_search:
+ search_node = [{'ID':dev_search, 'Version': '1.0'}]
+ print("search_node:",search_node)
+ break
+ else:
+ search_node = ["Nothing find"]
+ print( "final:",search_node)
+ else:
+ dev_addr = req.GET['ip']
+ dev_port = req.GET['port']
+ open_status = 'close'
+
+ s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+ host = '127.0.0.1'
+ port = 8889
+ msg = ""
+ err = ""
+
+ try:
+ s.connect((host, port))
+ s.send(bytes("query:"+dev_addr+":"+str(dev_port), encoding='utf8'))
+ msg = s.recv(1024)
+ except socket.error as e:
+ print("unable to connect to server")
+ msg = b"fail"
+ s.close()
+
+ app_list = []
+
+ if msg != "":
+ if msg.decode() == "fail":
+ return render(req, "empty.html")
+ else:
+ dic = eval(msg.decode(encoding='utf8'))
+ app_num = dic["num"]
+ for i in range(app_num):
+ app_list.append(
+ {'pname': dic["applet"+str(i+1)], 'status': 'Installed', 'current_version': '1.0'})
+
+ alist = app_list
+ device_info = []
+ device_info.append(
+ {'IP': dev_addr, 'Port': str(dev_port), 'apps': app_num})
+
+ print(device_info)
+ return render(req, 'application.html', {'alist': json.dumps(alist), 'dlist': json.dumps(device_info), 'llist': json.dumps(avaliable_list),
+ "open_status":json.dumps(open_status),"search_node": json.dumps(search_node),})
+
+
+def appDownload(req):
+ dev_addr = req.GET['ip']
+ dev_port = req.GET['port']
+ app_name = req.GET['name']
+
+ s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+
+ host = '127.0.0.1'
+ port = 8889
+ msg = ""
+
+ app_path = os.path.abspath(os.path.join(os.getcwd(), "static", "upload"))
+ if app_path[-1] != '/':
+ app_path += '/'
+
+ try:
+ s.connect((host, port))
+ s.send(bytes("install:"+dev_addr+":"+str(dev_port)+":"+app_name +
+ ":"+app_path + app_name + ".wasm", encoding='utf8'))
+ msg = s.recv(1024)
+ except socket.error as e:
+ print("unable to connect to server")
+ s.close()
+
+ success = "ok"
+ fail = "Fail!"
+ status = [success, fail]
+ print(msg)
+ if msg == b"fail":
+ return HttpResponse(json.dumps({
+ "status": fail
+ }))
+ elif msg == b"success":
+ return HttpResponse(json.dumps({
+ "status": success
+ }))
+ else:
+ return HttpResponse(json.dumps({
+ "status": eval(msg.decode())["error message"].split(':')[1]
+ }))
+
+
+def appDelete(req):
+ dev_addr = req.GET['ip']
+ dev_port = req.GET['port']
+ app_name = req.GET['name']
+
+ s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+
+ host = '127.0.0.1'
+ port = 8889
+ s.connect((host, port))
+ s.send(bytes("uninstall:"+dev_addr+":" +
+ str(dev_port)+":"+app_name, encoding='utf8'))
+ msg = s.recv(1024)
+ s.close()
+ r = HttpResponse("ok")
+ return r
+
+static_list = [{'ID': 'timer', 'Version': '1.0'}, {'ID': 'connection', 'Version': '1.0'}, {'ID': 'event_publisher', 'Version': '3.0'}, {
+ 'ID': 'event_subscriber', 'Version': '1.0'}, {'ID': 'reuqest_handler', 'Version': '1.0'}, {'ID': 'sensor', 'Version': '1.0'}, {'ID': 'ui_app', 'Version': '1.0'}]
+
+def store(req):
+
+ store_path = os.path.join('static', 'upload')
+ status = []
+
+ print(user_file_list)
+ return render(req, 'appstore.html', {'staticlist': json.dumps(static_list), 'flist': json.dumps(user_file_list),'ulist':json.dumps(status)})
+
+user_file_list = []
+files_list = []
+def uploadapps(req):
+ status = []
+ local_list = ['timer','connection','event_publisher','event_subscriber','reuqest_handler','sensor']
+ req.encoding = 'utf-8'
+ if req.method == 'POST':
+ myfile = req.FILES.get("myfile", None)
+ obj = req.FILES.get('myfile')
+ store_path = os.path.join('static', 'upload')
+ file_path = os.path.join('static', 'upload', obj.name)
+
+ if not os.path.exists(store_path):
+ os.makedirs(store_path)
+
+ file_name = obj.name.split(".")[0]
+ file_prefix = obj.name.split(".")[-1]
+
+
+ if file_prefix != "wasm":
+ status = ["Not a wasm file"]
+ elif file_name in local_list:
+ status = ["This App is preloaded"]
+ elif file_name in files_list:
+ status = ["This App is already uploaded"]
+ else:
+ status = []
+ avaliable_list.append({'ID': file_name, 'Version': '1.0'})
+ user_file_list.append({'ID': file_name, 'Version': '1.0'})
+ files_list.append(file_name)
+
+ print(user_file_list)
+ f = open(file_path, 'wb')
+ for chunk in obj.chunks():
+ f.write(chunk)
+ f.close()
+ return render(req, 'appstore.html', {'staticlist': json.dumps(static_list), 'flist': json.dumps(user_file_list),'ulist':json.dumps(status)})
+
+appname_list = []
+
+def addapps(request):
+ types = ''
+ print("enter addapps")
+ request.encoding = 'utf-8'
+ app_dic = {'ID': '', 'Version': ''}
+
+ # if request.method == 'get':
+ if "NAME" in request.GET:
+ a_name = request.GET['NAME']
+ if a_name != "" and a_name not in appname_list:
+ appname_list.append(a_name)
+ message = request.GET['NAME'] + request.GET['Version']
+ app_dic['ID'] = request.GET['NAME']
+ app_dic['Version'] = request.GET['Version']
+ avaliable_list.append(app_dic)
+ else:
+ types = "Exist"
+ print(avaliable_list)
+ return render(request, 'appstore.html', {'alist': json.dumps(avaliable_list)})
+
+def removeapps(req):
+ app_name = req.GET['name']
+ app_version = req.GET['version']
+ remove_app = {'ID': app_name, 'Version': app_version}
+ avaliable_list.remove(remove_app)
+ user_file_list.remove(remove_app)
+ files_list.remove(app_name)
+ return render(req, 'appstore.html', {'alist': json.dumps(avaliable_list),'flist': json.dumps(user_file_list)})
+
+# Test
+# if __name__ == "__main__":
+# print(device_list[0]['IP'])
+# print(device['IP'])
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/manage.py b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/manage.py
new file mode 100755
index 00000000..341863cf
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/manage.py
@@ -0,0 +1,21 @@
+#!/usr/bin/env python
+"""Django's command-line utility for administrative tasks."""
+import os
+import sys
+
+
+def main():
+ os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mysite.settings')
+ try:
+ from django.core.management import execute_from_command_line
+ except ImportError as exc:
+ raise ImportError(
+ "Couldn't import Django. Are you sure it's installed and "
+ "available on your PYTHONPATH environment variable? Did you "
+ "forget to activate a virtual environment?"
+ ) from exc
+ execute_from_command_line(sys.argv)
+
+
+if __name__ == '__main__':
+ main()
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/mysite/__init__.py b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/mysite/__init__.py
new file mode 100755
index 00000000..e69de29b
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/mysite/__init__.py
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/mysite/settings.py b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/mysite/settings.py
new file mode 100755
index 00000000..7eb3685c
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/mysite/settings.py
@@ -0,0 +1,136 @@
+"""
+Django settings for mysite project.
+
+Generated by 'django-admin startproject' using Django 2.2.2.
+
+For more information on this file, see
+https://docs.djangoproject.com/en/2.2/topics/settings/
+
+For the full list of settings and their values, see
+https://docs.djangoproject.com/en/2.2/ref/settings/
+"""
+
+import os
+from django.conf.global_settings import STATIC_ROOT
+
+# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
+BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
+
+
+# Quick-start development settings - unsuitable for production
+# See https://docs.djangoproject.com/en/2.2/howto/deployment/checklist/
+
+# SECURITY WARNING: keep the secret key used in production secret!
+SECRET_KEY = '8m05#6yx5wcygj*a+v6+=-y(#o+(z58-3!epq$u@5)64!mmu8q'
+
+# SECURITY WARNING: don't run with debug turned on in production!
+DEBUG = True
+
+ALLOWED_HOSTS = ['*']
+
+
+# Application definition
+
+INSTALLED_APPS = [
+ 'django.contrib.admin',
+ 'django.contrib.auth',
+ 'django.contrib.contenttypes',
+ 'django.contrib.sessions',
+ 'django.contrib.messages',
+ 'django.contrib.staticfiles',
+
+
+ 'devices',
+]
+
+MIDDLEWARE = [
+ 'django.middleware.security.SecurityMiddleware',
+ 'django.contrib.sessions.middleware.SessionMiddleware',
+ 'django.middleware.common.CommonMiddleware',
+ 'django.middleware.csrf.CsrfViewMiddleware',
+ 'django.contrib.auth.middleware.AuthenticationMiddleware',
+ 'django.contrib.messages.middleware.MessageMiddleware',
+ 'django.middleware.clickjacking.XFrameOptionsMiddleware',
+]
+
+ROOT_URLCONF = 'mysite.urls'
+
+TEMPLATES = [
+ {
+ 'BACKEND': 'django.template.backends.django.DjangoTemplates',
+ 'DIRS': [],
+ 'APP_DIRS': True,
+ 'OPTIONS': {
+ 'context_processors': [
+ 'django.template.context_processors.debug',
+ 'django.template.context_processors.request',
+ 'django.contrib.auth.context_processors.auth',
+ 'django.contrib.messages.context_processors.messages',
+ ],
+ },
+ },
+]
+
+WSGI_APPLICATION = 'mysite.wsgi.application'
+
+
+# Database
+# https://docs.djangoproject.com/en/2.2/ref/settings/#databases
+
+DATABASES = {
+ 'default': {
+ 'ENGINE': 'django.db.backends.sqlite3',
+ 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
+ }
+}
+
+
+# Password validation
+# https://docs.djangoproject.com/en/2.2/ref/settings/#auth-password-validators
+
+AUTH_PASSWORD_VALIDATORS = [
+ {
+ 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
+ },
+ {
+ 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
+ },
+ {
+ 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
+ },
+ {
+ 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
+ },
+]
+
+
+# Internationalization
+# https://docs.djangoproject.com/en/2.2/topics/i18n/
+
+LANGUAGE_CODE = 'en-us'
+
+TIME_ZONE = 'UTC'
+
+USE_I18N = True
+
+USE_L10N = True
+
+USE_TZ = True
+
+APPEND_SLASH = False
+
+
+# Static files (CSS, JavaScript, Images)
+# https://docs.djangoproject.com/en/2.2/howto/static-files/
+
+STATIC_URL = '/static/'
+HERE = os.path.dirname(os.path.abspath(__file__))
+HERE = os.path.join(HERE,'../')
+STATICFILES_DIRS = (os.path.join(HERE,'static/'),)
+#STATICFILES_DIRS = (os.path.join(BASE_DIR,'static'),)
+#STATIC_ROOT = (os.path.join(os.path.dirname(_file_),'static')
+#templates
+TEMPLATE_DIRS=[
+ '/home/xujun/mysite/templates',
+]
+
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/mysite/urls.py b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/mysite/urls.py
new file mode 100755
index 00000000..8a74b550
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/mysite/urls.py
@@ -0,0 +1,41 @@
+#config:utf-8
+
+"""mysite URL Configuration
+
+The `urlpatterns` list routes URLs to views. For more information please see:
+ https://docs.djangoproject.com/en/2.2/topics/http/urls/
+Examples:
+Function views
+ 1. Add an import: from my_app import views
+ 2. Add a URL to urlpatterns: path('', views.home, name='home')
+Class-based views
+ 1. Add an import: from other_app.views import Home
+ 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
+Including another URLconf
+ 1. Import the include() function: from django.urls import include, path
+ 2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
+"""
+from django.contrib import admin
+#from django.conf.urls import include,url
+from django.urls import path,include
+from devices import views as devices_views
+#from login import views as login_views
+
+
+urlpatterns = [
+
+ path('admin/', admin.site.urls),
+ path('',devices_views.index),
+ path('apps/',devices_views.apps),
+ path('appDownload/', devices_views.appDownload),
+ path('appDelete/', devices_views.appDelete),
+ path('appstore/',devices_views.store),
+## path('apps/appstore/',devices_views.storeofdevic),
+## path('search/',devices_views.search),
+ path('upload',devices_views.uploadapps),
+ path('removeapps/',devices_views.removeapps),
+ path('help/',devices_views.help),
+
+]
+
+
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/mysite/wsgi.py b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/mysite/wsgi.py
new file mode 100755
index 00000000..45e28c9a
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/mysite/wsgi.py
@@ -0,0 +1,16 @@
+"""
+WSGI config for mysite project.
+
+It exposes the WSGI callable as a module-level variable named ``application``.
+
+For more information on this file, see
+https://docs.djangoproject.com/en/2.2/howto/deployment/wsgi/
+"""
+
+import os
+
+from django.core.wsgi import get_wsgi_application
+
+os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mysite.settings')
+
+application = get_wsgi_application()
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/server/Dockerfile b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/server/Dockerfile
new file mode 100644
index 00000000..371fa45b
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/server/Dockerfile
@@ -0,0 +1,6 @@
+FROM python:3.5
+
+WORKDIR /app
+COPY server/wasm_server.py /app/server/
+
+ENTRYPOINT ["python", "server/wasm_server.py"]
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/server/wasm_server.py b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/server/wasm_server.py
new file mode 100755
index 00000000..970ec6f6
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/server/wasm_server.py
@@ -0,0 +1,621 @@
+'''
+ /* Copyright (C) 2019 Intel Corporation. All rights reserved.
+ * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+ */
+'''
+import select
+import socket
+import queue
+from time import sleep
+import struct
+import threading
+import time
+from ctypes import *
+import json
+import logging
+import os
+
+attr_type_list = [
+ "ATTR_TYPE_BYTE", # = ATTR_TYPE_INT8
+ "ATTR_TYPE_SHORT",# = ATTR_TYPE_INT16
+ "ATTR_TYPE_INT", # = ATTR_TYPE_INT32
+ "ATTR_TYPE_INT64",
+ "ATTR_TYPE_UINT8",
+ "ATTR_TYPE_UINT16",
+ "ATTR_TYPE_UINT32",
+ "ATTR_TYPE_UINT64",
+ "ATTR_TYPE_FLOAT",
+ "ATTR_TYPE_DOUBLE",
+ "ATTR_NONE",
+ "ATTR_NONE",
+ "ATTR_TYPE_BOOLEAN",
+ "ATTR_TYPE_STRING",
+ "ATTR_TYPE_BYTEARRAY"
+]
+
+
+Phase_Non_Start = 0
+Phase_Leading = 1
+Phase_Type = 2
+Phase_Size = 3
+Phase_Payload = 4
+
+
+
+class imrt_link_message(object):
+ def __init__(self):
+ self.leading = bytes([0x12, 0x34])
+ self.phase = Phase_Non_Start
+ self.size_in_phase = 0
+ self.message_type = bytes()
+ self.message_size = bytes()
+ self.payload = bytes()
+ self.msg = bytes()
+
+ def set_recv_phase(self, phase):
+ self.phase = phase
+
+ def on_imrt_link_byte_arrive(self, ch):
+ self.msg += ch
+ if self.phase == Phase_Non_Start:
+ if ch == b'\x12':
+ self.set_recv_phase(Phase_Leading)
+ else:
+ return -1
+ elif self.phase == Phase_Leading:
+ if ch == b'\x34':
+ self.set_recv_phase(Phase_Type)
+ else:
+ self.set_recv_phase(Phase_Non_Start)
+ return -1
+ elif self.phase == Phase_Type:
+ self.message_type += ch
+ self.size_in_phase += 1
+
+ if self.size_in_phase == 2:
+ (self.message_type, ) = struct.unpack('!H', self.message_type)
+ self.size_in_phase = 0
+ self.set_recv_phase(Phase_Size)
+ elif self.phase == Phase_Size:
+ self.message_size += ch
+ self.size_in_phase += 1
+
+ if self.size_in_phase == 4:
+ (self.message_size, ) = struct.unpack('!I', self.message_size)
+ self.size_in_phase = 0
+ self.set_recv_phase(Phase_Payload)
+
+ if self.message_size == b'\x00':
+ self.set_recv_phase(Phase_Non_Start)
+ return 0
+
+ self.set_recv_phase(Phase_Payload)
+
+ elif self.phase == Phase_Payload:
+ self.payload += ch
+ self.size_in_phase += 1
+
+ if self.size_in_phase == self.message_size:
+ self.set_recv_phase(Phase_Non_Start)
+ return 0
+
+ return 2
+
+ return 1
+
+
+
+def read_file_to_buffer(file_name):
+ file_object = open(file_name, 'rb')
+ buffer = None
+
+ if not os.path.exists(file_name):
+ logging.error("file {} not found.".format(file_name))
+ return "file not found"
+
+ try:
+ buffer = file_object.read()
+ finally:
+ file_object.close()
+
+ return buffer
+
+def decode_attr_container(msg):
+
+ attr_dict = {}
+
+ buf = msg[26 : ]
+ (total_len, tag_len) = struct.unpack('@IH', buf[0 : 6])
+ tag_name = buf[6 : 6 + tag_len].decode()
+ buf = buf[6 + tag_len : ]
+ (attr_num, ) = struct.unpack('@H', buf[0 : 2])
+ buf = buf[2 : ]
+
+ logging.info("parsed attr:")
+ logging.info("total_len:{}, tag_len:{}, tag_name:{}, attr_num:{}"
+ .format(str(total_len), str(tag_len), str(tag_name), str(attr_num)))
+
+ for i in range(attr_num):
+ (key_len, ) = struct.unpack('@H', buf[0 : 2])
+ key_name = buf[2 : 2 + key_len - 1].decode()
+ buf = buf[2 + key_len : ]
+ (type_index, ) = struct.unpack('@c', buf[0 : 1])
+
+ attr_type = attr_type_list[int(type_index[0])]
+ buf = buf[1 : ]
+
+ if attr_type == "ATTR_TYPE_BYTE": # = ATTR_TYPE_INT8
+ (attr_value, ) = struct.unpack('@c', buf[0 : 1])
+ buf = buf[1 : ]
+ # continue
+ elif attr_type == "ATTR_TYPE_SHORT": # = ATTR_TYPE_INT16
+ (attr_value, ) = struct.unpack('@h', buf[0 : 2])
+ buf = buf[2 : ]
+ # continue
+ elif attr_type == "ATTR_TYPE_INT": # = ATTR_TYPE_INT32
+ (attr_value, ) = struct.unpack('@i', buf[0 : 4])
+ buf = buf[4 : ]
+ # continue
+ elif attr_type == "ATTR_TYPE_INT64":
+ (attr_value, ) = struct.unpack('@q', buf[0 : 8])
+ buf = buf[8 : ]
+ # continue
+ elif attr_type == "ATTR_TYPE_UINT8":
+ (attr_value, ) = struct.unpack('@B', buf[0 : 1])
+ buf = buf[1 : ]
+ # continue
+ elif attr_type == "ATTR_TYPE_UINT16":
+ (attr_value, ) = struct.unpack('@H', buf[0 : 2])
+ buf = buf[2 : ]
+ # continue
+ elif attr_type == "ATTR_TYPE_UINT32":
+ (attr_value, ) = struct.unpack('@I', buf[0 : 4])
+ buf = buf[4 : ]
+ # continue
+ elif attr_type == "ATTR_TYPE_UINT64":
+ (attr_value, ) = struct.unpack('@Q', buf[0 : 8])
+ buf = buf[8 : ]
+ # continue
+ elif attr_type == "ATTR_TYPE_FLOAT":
+ (attr_value, ) = struct.unpack('@f', buf[0 : 4])
+ buf = buf[4 : ]
+ # continue
+ elif attr_type == "ATTR_TYPE_DOUBLE":
+ (attr_value, ) = struct.unpack('@d', buf[0 : 8])
+ buf = buf[8 : ]
+ # continue
+ elif attr_type == "ATTR_TYPE_BOOLEAN":
+ (attr_value, ) = struct.unpack('@?', buf[0 : 1])
+ buf = buf[1 : ]
+ # continue
+ elif attr_type == "ATTR_TYPE_STRING":
+ (str_len, ) = struct.unpack('@H', buf[0 : 2])
+ attr_value = buf[2 : 2 + str_len - 1].decode()
+ buf = buf[2 + str_len : ]
+ # continue
+ elif attr_type == "ATTR_TYPE_BYTEARRAY":
+ (byte_len, ) = struct.unpack('@I', buf[0 : 4])
+ attr_value = buf[4 : 4 + byte_len]
+ buf = buf[4 + byte_len : ]
+ # continue
+
+ attr_dict[key_name] = attr_value
+
+ logging.info(str(attr_dict))
+ return attr_dict
+
+class Request():
+ mid = 0
+ url = ""
+ action = 0
+ fmt = 0
+ payload = ""
+ payload_len = 0
+ sender = 0
+
+ def __init__(self, url, action, fmt, payload, payload_len):
+ self.url = url
+ self.action = action
+ self.fmt = fmt
+ # if type(payload) == bytes:
+ # self.payload = bytes(payload, encoding = "utf8")
+ # else:
+ self.payload_len = payload_len
+ if self.payload_len > 0:
+ self.payload = payload
+
+
+ def pack_request(self):
+ url_len = len(self.url) + 1
+ buffer_len = url_len + self.payload_len
+
+ req_buffer = struct.pack('!2BH2IHI',1, self.action, self.fmt, self.mid, self.sender, url_len, self.payload_len)
+ for i in range(url_len - 1):
+ req_buffer += struct.pack('!c', bytes(self.url[i], encoding = "utf8"))
+ req_buffer += bytes([0])
+ for i in range(self.payload_len):
+ req_buffer += struct.pack('!B', self.payload[i])
+
+ return req_buffer, len(req_buffer)
+
+
+ def send(self, conn, is_install):
+ leading = struct.pack('!2B', 0x12, 0x34)
+
+ if not is_install:
+ msg_type = struct.pack('!H', 0x0002)
+ else:
+ msg_type = struct.pack('!H', 0x0004)
+ buff, buff_len = self.pack_request()
+ lenth = struct.pack('!I', buff_len)
+
+ try:
+ conn.send(leading)
+ conn.send(msg_type)
+ conn.send(lenth)
+ conn.send(buff)
+ except socket.error as e:
+ logging.error("device closed")
+ for dev in tcpserver.devices:
+ if dev.conn == conn:
+ tcpserver.devices.remove(dev)
+ return -1
+
+
+def query(conn):
+ req = Request("/applet", 1, 0, "", 0)
+ if req.send(conn, False) == -1:
+ return "fail"
+ time.sleep(0.05)
+ try:
+ receive_context = imrt_link_message()
+ start = time.time()
+ while True:
+ if receive_context.on_imrt_link_byte_arrive(conn.recv(1)) == 0:
+ break
+ elif time.time() - start >= 5.0:
+ return "fail"
+ query_resp = receive_context.msg
+ print(query_resp)
+ except OSError as e:
+ logging.error("OSError exception occur")
+ return "fail"
+
+ res = decode_attr_container(query_resp)
+
+ logging.info('Query device infomation success')
+ return res
+
+def install(conn, app_name, wasm_file):
+ wasm = read_file_to_buffer(wasm_file)
+ if wasm == "file not found":
+ return "failed to install: file not found"
+
+ print("wasm file len:")
+ print(len(wasm))
+ req = Request("/applet?name=" + app_name, 3, 98, wasm, len(wasm))
+ if req.send(conn, True) == -1:
+ return "fail"
+ time.sleep(0.05)
+ try:
+ receive_context = imrt_link_message()
+ start = time.time()
+ while True:
+ if receive_context.on_imrt_link_byte_arrive(conn.recv(1)) == 0:
+ break
+ elif time.time() - start >= 5.0:
+ return "fail"
+ msg = receive_context.msg
+ except OSError as e:
+ logging.error("OSError exception occur")
+ # TODO: check return message
+
+ if len(msg) == 24 and msg[8 + 1] == 65:
+ logging.info('Install application success')
+ return "success"
+ else:
+ res = decode_attr_container(msg)
+ logging.warning('Install application failed: %s' % (str(res)))
+ print(str(res))
+
+ return str(res)
+
+
+def uninstall(conn, app_name):
+ req = Request("/applet?name=" + app_name, 4, 99, "", 0)
+ if req.send(conn, False) == -1:
+ return "fail"
+ time.sleep(0.05)
+ try:
+ receive_context = imrt_link_message()
+ start = time.time()
+ while True:
+ if receive_context.on_imrt_link_byte_arrive(conn.recv(1)) == 0:
+ break
+ elif time.time() - start >= 5.0:
+ return "fail"
+ msg = receive_context.msg
+ except OSError as e:
+ logging.error("OSError exception occur")
+ # TODO: check return message
+
+ if len(msg) == 24 and msg[8 + 1] == 66:
+ logging.info('Uninstall application success')
+ return "success"
+ else:
+ res = decode_attr_container(msg)
+ logging.warning('Uninstall application failed: %s' % (str(res)))
+ print(str(res))
+
+ return str(res)
+
+class Device:
+ def __init__(self, conn, addr, port):
+ self.conn = conn
+ self.addr = addr
+ self.port = port
+ self.app_num = 0
+ self.apps = []
+
+cmd = []
+
+class TCPServer:
+ def __init__(self, server, server_address, inputs, outputs, message_queues):
+ # Create a TCP/IP
+ self.server = server
+ self.server.setblocking(False)
+
+ # Bind the socket to the port
+ self.server_address = server_address
+ print('starting up on %s port %s' % self.server_address)
+ self.server.bind(self.server_address)
+
+ # Listen for incoming connections
+ self.server.listen(10)
+
+ self.cmd_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+ self.cmd_sock.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
+
+ self.cmd_sock.bind(('127.0.0.1', 8889))
+ self.cmd_sock.listen(5)
+
+
+ # Sockets from which we expect to read
+ self.inputs = inputs
+ self.inputs.append(self.cmd_sock)
+
+ # Sockets to which we expect to write
+ # 处理要发送的消息
+ self.outputs = outputs
+ # Outgoing message queues (socket: Queue)
+ self.message_queues = message_queues
+
+ self.devices = []
+ self.conn_dict = {}
+
+ def handler_recever(self, readable):
+ # Handle inputs
+ for s in readable:
+ if s is self.server:
+ # A "readable" socket is ready to accept a connection
+ connection, client_address = s.accept()
+ self.client_address = client_address
+ print('connection from', client_address)
+ # this is connection not server
+ # connection.setblocking(0)
+ self.inputs.append(connection)
+
+ # Give the connection a queue for data we want to send
+ # self.message_queues[connection] = queue.Queue()
+
+ res = query(connection)
+
+ if res != "fail":
+ dev = Device(connection, client_address[0], client_address[1])
+ self.devices.append(dev)
+ self.conn_dict[client_address] = connection
+
+ dev_info = {}
+ dev_info['addr'] = dev.addr
+ dev_info['port'] = dev.port
+ dev_info['apps'] = 0
+
+ logging.info('A new client connected from ("%s":"%s")' % (dev.conn, dev.port))
+
+ elif s is self.cmd_sock:
+ connection, client_address = s.accept()
+ print("web server socket connected")
+ logging.info("Django server connected")
+ self.inputs.append(connection)
+ self.message_queues[connection] = queue.Queue()
+
+ else:
+ data = s.recv(1024)
+ if data != b'':
+ # A readable client socket has data
+ logging.info('received "%s" from %s' % (data, s.getpeername()))
+
+ # self.message_queues[s].put(data)
+ # # Add output channel for response
+
+ # if s not in self.outputs:
+ # self.outputs.append(s)
+
+ if(data.decode().split(':')[0] == "query"):
+ if data.decode().split(':')[1] == "all":
+ resp = []
+ print('start query all devices')
+ for dev in self.devices:
+ dev_info = query(dev.conn)
+ if dev_info == "fail":
+ continue
+ dev_info["addr"] = dev.addr
+ dev_info["port"] = dev.port
+ resp.append(str(dev_info))
+
+ print(resp)
+
+ if self.message_queues[s] is not None:
+ # '*' is used in web server to sperate the string
+ self.message_queues[s].put(bytes("*".join(resp), encoding = 'utf8'))
+ if s not in self.outputs:
+ self.outputs.append(s)
+ else:
+ client_addr = (data.decode().split(':')[1],int(data.decode().split(':')[2]))
+
+ if client_addr in self.conn_dict.keys():
+ print('start query device from (%s:%s)' % (client_addr[0], client_addr[1]))
+ resp = query(self.conn_dict[client_addr])
+ print(resp)
+
+ if self.message_queues[s] is not None:
+ self.message_queues[s].put(bytes(str(resp), encoding = 'utf8'))
+ if s not in self.outputs:
+ self.outputs.append(s)
+ else: # no connection
+ if self.message_queues[s] is not None:
+ self.message_queues[s].put(bytes(str("fail"), encoding = 'utf8'))
+ if s not in self.outputs:
+ self.outputs.append(s)
+ elif(data.decode().split(':')[0] == "install"):
+ client_addr = (data.decode().split(':')[1],int(data.decode().split(':')[2]))
+ app_name = data.decode().split(':')[3]
+ app_file = data.decode().split(':')[4]
+
+ if client_addr in self.conn_dict.keys():
+ print('start install application %s to ("%s":"%s")' % (app_name, client_addr[0], client_addr[1]))
+ res = install(self.conn_dict[client_addr], app_name, app_file)
+ if self.message_queues[s] is not None:
+ logging.info("response {} to cmd server".format(res))
+ self.message_queues[s].put(bytes(res, encoding = 'utf8'))
+ if s not in self.outputs:
+ self.outputs.append(s)
+ elif(data.decode().split(':')[0] == "uninstall"):
+ client_addr = (data.decode().split(':')[1],int(data.decode().split(':')[2]))
+ app_name = data.decode().split(':')[3]
+
+ if client_addr in self.conn_dict.keys():
+ print("start uninstall")
+ res = uninstall(self.conn_dict[client_addr], app_name)
+ if self.message_queues[s] is not None:
+ logging.info("response {} to cmd server".format(res))
+ self.message_queues[s].put(bytes(res, encoding = 'utf8'))
+ if s not in self.outputs:
+ self.outputs.append(s)
+
+
+ # if self.message_queues[s] is not None:
+ # self.message_queues[s].put(data)
+ # if s not in self.outputs:
+ # self.outputs.append(s)
+ else:
+ logging.warning(data)
+
+ # Interpret empty result as closed connection
+ try:
+ for dev in self.devices:
+ if s == dev.conn:
+ self.devices.remove(dev)
+ # Stop listening for input on the connection
+ if s in self.outputs:
+ self.outputs.remove(s)
+ self.inputs.remove(s)
+
+ # Remove message queue
+ if s in self.message_queues.keys():
+ del self.message_queues[s]
+ s.close()
+ except OSError as e:
+ logging.error("OSError raised, unknown connection")
+ return "got it"
+
+ def handler_send(self, writable):
+ # Handle outputs
+ for s in writable:
+ try:
+ message_queue = self.message_queues.get(s)
+ send_data = ''
+ if message_queue is not None:
+ send_data = message_queue.get_nowait()
+ except queue.Empty:
+ self.outputs.remove(s)
+ else:
+ # print "sending %s to %s " % (send_data, s.getpeername)
+ # print "send something"
+ if message_queue is not None:
+ s.send(send_data)
+ else:
+ print("client has closed")
+ # del message_queues[s]
+ # writable.remove(s)
+ # print "Client %s disconnected" % (client_address)
+ return "got it"
+
+ def handler_exception(self, exceptional):
+ # # Handle "exceptional conditions"
+ for s in exceptional:
+ print('exception condition on', s.getpeername())
+ # Stop listening for input on the connection
+ self.inputs.remove(s)
+ if s in self.outputs:
+ self.outputs.remove(s)
+ s.close()
+
+ # Remove message queue
+ del self.message_queues[s]
+ return "got it"
+
+
+def event_loop(tcpserver, inputs, outputs):
+ while inputs:
+ # Wait for at least one of the sockets to be ready for processing
+ print('waiting for the next event')
+ readable, writable, exceptional = select.select(inputs, outputs, inputs)
+ if readable is not None:
+ tcp_recever = tcpserver.handler_recever(readable)
+ if tcp_recever == 'got it':
+ print("server have received")
+ if writable is not None:
+ tcp_send = tcpserver.handler_send(writable)
+ if tcp_send == 'got it':
+ print("server have send")
+ if exceptional is not None:
+ tcp_exception = tcpserver.handler_exception(exceptional)
+ if tcp_exception == 'got it':
+ print("server have exception")
+
+
+ sleep(0.1)
+
+def run_wasm_server():
+ server_address = ('localhost', 8888)
+ server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+ server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
+ inputs = [server]
+ outputs = []
+ message_queues = {}
+ tcpserver = TCPServer(server, server_address, inputs, outputs, message_queues)
+
+ task = threading.Thread(target=event_loop,args=(tcpserver,inputs,outputs))
+ task.start()
+
+if __name__ == '__main__':
+ logging.basicConfig(level=logging.DEBUG,
+ filename='wasm_server.log',
+ filemode='a',
+ format=
+ '%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s'
+ )
+ server_address = ('0.0.0.0', 8888)
+ server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+ server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
+ inputs = [server]
+ outputs = []
+ message_queues = {}
+ tcpserver = TCPServer(server, server_address, inputs, outputs, message_queues)
+ logging.info("TCP Server start at {}:{}".format(server_address[0], "8888"))
+
+ task = threading.Thread(target=event_loop,args=(tcpserver,inputs,outputs))
+ task.start()
+
+ # event_loop(tcpserver, inputs, outputs) \ No newline at end of file
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/css/application.css b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/css/application.css
new file mode 100644
index 00000000..220d4b61
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/css/application.css
@@ -0,0 +1,400 @@
+/* Copyright (C) 2019 Intel Corporation. All rights reserved.
+* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+*/
+
+{% load static %}
+<style>
+#container{
+ position:relative;
+ margin:0px;
+ height:110px;
+}
+#content {
+ margin:0px 20% 0px 18%;
+ border:solid 1.5px;
+ border-color: white black white black;
+ height:50%;
+}
+#mainnav{
+ display:table;
+ margin: 0 auto;
+}
+#mainnav li{
+ display: table-cell;
+ padding-left:10px;
+}
+#mainnav ul li a{
+ width:120px;
+ height:30px;
+ background:black;
+ color:white;
+ margin:0px 50px;
+ font-size:21px;
+ font-family:'sansationlight';
+ display:block;
+ text-align:center;
+ text-decoration:none;
+}
+#mainnav ul li a:hover{
+ width:120px;
+ height:33px;
+ line-height:30px;
+ border:solid 1.5px;
+ border-color: black black white black;
+ color:#3FC3DF;
+ background:black;
+}
+.headers{
+ background-image: url("{%static 'photo/milky-way-2695569_1280.jpg'%}");
+ background-repeat: no-repeat;
+ background-size: 100% 100%;
+ color:white;
+ clear:both;
+ height:50%;
+ text-align:center;
+ padding:10px;
+ margin:0px;
+}
+#maintitle{
+ font-size:25px;
+ font-family:'sansationlight';
+}
+
+#section {
+ position:relative;
+ top:5px;
+ width:100%;
+ float:left;
+ height:120px;
+ border-style:double solid;
+ border-color:black rgb(194, 194, 190) black rgb(248, 248, 248) ;
+ border-width:0.5px;
+ padding:10px;
+}
+#photo{
+ position: relative;
+ float: left;
+ top:18%;
+ left:10%;
+ widows: 60px;
+}
+#IPs{
+ position: relative;
+ left: 20%;
+ top:10%;
+ width:35%;
+ font-size:17px;
+ font-family:'sansationlight';
+}
+#ports{
+ position: relative;
+ left: 20%;
+ top:30%;
+ bottom: 5%;
+ width:35%;
+ font-size:17px;
+ font-family:'sansationlight';
+}
+#installs{
+ position: relative;
+ float: left;
+ left:55%;
+ bottom:40%;
+ font-size:17px;
+ font-family:'sansationlight';
+}
+
+#download{
+ position:relative;
+ text-align: center;
+ left:15%;
+ width:70%;
+ top:40px;
+ height:40px;
+ /*border-color:#192C4F;*/
+}
+.explain{
+ width:250px;
+ height:40px;
+ top:50%;
+ float:left;
+ font-size:18px;
+}
+#btn{
+ float:right;
+}
+
+
+#APPS {
+ position:relative;
+ top:30px;
+ left:16.67%;
+ width:75%;
+}
+#applications{
+ position:relative;
+ float:left;
+ background-color:white;
+ width:88.9%;
+ height:45px;
+ padding:2px;
+ margin:5px 0px;
+ border-style:double solid;
+ border-color:black;
+ border-width:0.5px;
+}
+#applogo{
+ position:relative;
+ float:left;
+ top:10%
+}
+#appinfo1{ position:relative; float:left; left:40px; width:34%;font-size:15px;height:25px;top:33%}
+#appinfo2{ position:relative; float:left; left:20px; width:24%;font-size:15px;height:25px;top:33%}
+#appinfo3{ position:relative; float:left; left:20px; width:34%;font-size:15px;height:25px;top:33%}
+
+#delete{
+ position:relative;
+ margin:8px 0px;
+ float:right;
+ right:7%;
+}
+.main{
+ position: absolute;
+ float:left;
+ width:650px;
+ height:350px;
+ z-index: 9999;
+ background-color: white;
+ display:none;
+ border:solid 1px rgb(4, 30, 66);
+ border-width: 1.5px;
+ border-radius: 10px;
+}
+.close{
+ background-color: black;
+ color:white;
+ border-top-right-radius: 10px;
+ border-top-left-radius: 10px;
+}
+.hotapps{
+ background-color:rgb(202, 202, 202);
+ font-size: 16px;
+ font-family:'days';
+ height:30px;
+ text-align: justify;
+ border:solid 2px;
+ border-color: rgb(202, 202, 202) rgb(202, 202, 202) rgb(202, 202, 202) black;
+}
+#scrollba{
+ overflow-x: None;
+ overflow-y: scroll;
+ height: 270px;
+ width:650px;
+}
+#Dapplications{
+ width:630px;
+ margin:4px 10px 0px 10px;
+ height:45px;
+ border:solid 1px;
+ border-color: rgb(221, 221, 221) white white white;
+ /* background-color: rgb(233, 233, 233); */
+}
+.mybtn2{
+ position: relative;
+ float:left;
+ left:45px;
+ top:3px;
+ height:33px;
+ border-radius: 10px;
+ background-color: rgb(22, 109, 121);
+ color:white;
+}
+#types{
+ background-color: rgb(3, 90, 90);
+ color:white;
+ text-align: left
+}
+
+
+#loading{
+ position:relative;
+ float:left;
+ width: 100%;
+ display:None;
+ height:40px;
+ top:10px;
+ z-index:1010;
+}
+.loadapp{
+ font-size:20px;
+ text-align: center;
+ color:rgb(24, 77, 24);
+}
+#preloader {
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+}
+#loader {
+ display: block;
+ position: relative;
+ left: 50%;
+ top: 50%;
+ width: 150px;
+ height: 150px;
+ margin: -75px 0 0 -75px;
+ border-radius: 50%;
+ border: 3px solid transparent;
+ border-top-color: rgb(135, 155, 241);
+ -webkit-animation: spin 2s linear infinite;
+ animation: spin 2s linear infinite;
+}
+#loader:before {
+ content: "";
+ position: absolute;
+ top: 5px;
+ left: 5px;
+ right: 5px;
+ bottom: 5px;
+ border-radius: 50%;
+ border: 3px solid transparent;
+ border-top-color: rgb(23, 62, 146);
+ -webkit-animation: spin 3s linear infinite;
+ animation: spin 3s linear infinite;
+}
+#loader:after {
+ content: "";
+ position: absolute;
+ top: 15px;
+ left: 15px;
+ right: 15px;
+ bottom: 15px;
+ border-radius: 50%;
+ border: 3px solid transparent;
+ border-top-color: rgb(21, 44, 87);
+ -webkit-animation: spin 1.5s linear infinite;
+ animation: spin 1.5s linear infinite;
+}
+@-webkit-keyframes spin {
+ 0% {
+ -webkit-transform: rotate(0deg);
+ -ms-transform: rotate(0deg);
+ transform: rotate(0deg);
+ }
+ 100% {
+ -webkit-transform: rotate(360deg);
+ -ms-transform: rotate(360deg);
+ transform: rotate(360deg);
+ }
+}
+@keyframes spin {
+ 0% {
+ -webkit-transform: rotate(0deg);
+ -ms-transform: rotate(0deg);
+ transform: rotate(0deg);
+ }
+ 100% {
+ -webkit-transform: rotate(360deg);
+ -ms-transform: rotate(360deg);
+ transform: rotate(360deg);
+ }
+}
+
+.middlebox{
+ position:absolute;
+ z-index:1003;
+ height:180px;
+ width:340px;
+ background-color: white;
+ border-radius: 7px;
+ border-style:double;
+ border-color:rgb(2, 37, 11) solid;
+ border-width: 0.8px;
+ display: none;
+}
+.warning{
+ position: absolute;
+ left:10%;
+ top:6%;
+ FONT-size:18px;
+ color:rgb(0, 85, 0);
+ height:20%;
+ width:80%;
+ border-style:none none dashed none;
+ border-width: 1px;
+ border-color:rgb(0, 85, 0);
+}
+.surebtn{
+ position:relative;
+ float:left;
+ left:44%;
+ top:75%;
+}
+.findapp{
+ position:absolute;
+ left:10%;
+ height:25%;
+ top:40%;
+ width:80%;
+ font-size:15px;
+ text-align: center;
+ border-style:none none solid none;
+ border-color:rgb(182, 182, 182);
+ border-width:0.5px;
+}
+
+.deletebox{
+ position:absolute;
+ z-index:1003;
+ height:180px;
+ width:340px;
+ background-color: white;
+ border-radius: 7px;
+ border-style:double;
+ border-color:rgb(43, 9, 1) solid;
+ border-width: 0.8px;
+ display: none;
+}
+.warning2{
+ position: absolute;
+ left:10%;
+ top:6%;
+ FONT-size:18px;
+ color:rgb(185, 0, 0);
+ height:20%;
+ width:80%;
+ border-style:none none dashed none;
+ border-width: 1px;
+ border-color:rgb(185, 0, 0);
+}
+.suresbtn{
+ position:relative;
+ float:left;
+ left:24%;
+ top:75%;
+ color:green
+}
+.cancelsbtn{
+ position:relative;
+ float:right;
+ right:20%;
+ top:75%;
+ color:red
+}
+.footer {
+ position:absolute;
+ bottom:0px;
+ left:0px;
+ background-color:black;
+ color:white;
+ clear:both;
+ text-align:center;
+ padding:1px;
+ width:100%;
+ height:4%;
+ z-index: 999;
+}
+
+
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/css/appstore.css b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/css/appstore.css
new file mode 100644
index 00000000..1cebcefe
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/css/appstore.css
@@ -0,0 +1,216 @@
+/* Copyright (C) 2019 Intel Corporation. All rights reserved.
+* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+*/
+{% load static %}
+<style>
+#container{
+ position:relative;
+ margin:0px;
+ height:110px;
+}
+#content {
+ margin:0px 20% 0px 18%;
+ border:solid 1.5px;
+ border-color: white black white black;
+ height:50%;
+}
+#mainnav{
+ display:table;
+ margin: 0 auto;
+}
+#mainnav li{
+ display: table-cell;
+ padding-left:10px;
+}
+#mainnav ul li a{
+ width:120px;
+ height:30px;
+ background:black;
+ color:white;
+ margin:0px 50px;
+ font-size:21px;
+ font-family:'sansationlight';
+ display:block;
+ text-align:center;
+ text-decoration:none;
+}
+#mainnav ul li a:hover{
+ width:120px;
+ height:33px;
+ line-height:30px;
+ border:solid 1.5px;
+ border-color: black black white black;
+ color:#3FC3DF;
+ background:black;
+}
+.headers{
+ background-image: url("{%static 'photo/milky-way-2695569_1280.jpg'%}");
+ background-repeat: no-repeat;
+ background-size: 100% 100%;
+ color:white;
+ clear:both;
+ height:50%;
+ text-align:center;
+ padding:10px;
+ margin:0px;
+}
+#maintitle{
+ font-size:25px;
+ font-family:'sansationlight';
+}
+
+#introstore{
+ z-index:1003;
+ top:10px;
+ margin:10px 220px 10px 220px;
+ height:108px;
+}
+#applicationlist{
+ margin:26px 0px 0px 0px;
+ height:100%;
+}
+.bar{
+ height:50px;
+ top:2px;
+}
+.leftpart{
+ position:relative;
+ float:left;
+ left:30px;
+ font-size:22px;
+ display:inline-block;
+ height:30px;
+ border:solid 1px black;
+ border-style: none none solid none;
+}
+.rightpart{
+ position:relative;
+ float:right;
+ height:50px;
+ right:20px;
+ font-size:17px;
+}
+.rightpart .file{
+ width: 120px;
+ height: 35px;
+ position: absolute;
+ left: 0px;
+ top: 0px;
+ opacity: 0;
+ z-index: 2;
+}
+.stylehere{
+ position: relative;
+ display: inline-block;
+ width: 120px;
+ overflow: hidden;
+ height: 35px;
+ line-height: 35px;
+}
+.choosestyle{
+ position: absolute;
+ width: 120px;height: 35px;
+ background-color: rgb(0, 121, 202);color:white;
+ text-align: center;
+ left: 0px;top: 0px;
+ font-size:14px;
+ border-radius: 4px
+}
+.appbook{
+ margin:0px;
+ border:solid;
+ border-width: 1.5px;
+ border-color: white rgb(194, 194, 194) white rgb(194, 194, 194);
+ background-image:linear-gradient(to right, rgb(245, 243, 240),white)
+}
+#applications{
+ margin:1px;
+ left:0px;
+ width:100%;
+ height:50px;
+ border-style:none none solid none;
+ border-color:rgb(172, 172, 172);
+ border-width:0.5px;
+ padding:5px;
+}
+#delbutton{
+ width:100px;
+ height:40px;
+}
+#appimage{
+ float:left;
+ left:5%;
+}
+#lable{
+ color: red;
+ opacity:50}
+ .suresbtn{
+ position:relative;
+ float:left;
+ left:50px;
+ top:135px;
+ color:green
+}
+.deletebox{
+ position:absolute;
+ z-index:1003;
+ height:180px;
+ width:340px;
+ background-color: white;
+ border-radius: 7px;
+ border-style:double;
+ border-color:rgb(43, 9, 1) solid;
+ border-width: 0.8px;
+ display: none;
+}
+.warning2{
+ position: absolute;
+ left:10%;
+ top:6%;
+ FONT-size:18px;
+ color:rgb(185, 0, 0);
+ height:20%;
+ width:80%;
+ border-style:none none dashed none;
+ border-width: 1px;
+ border-color:rgb(185, 0, 0);
+}
+.findapp{
+ position:absolute;
+ left:10%;
+ height:25%;
+ top:40%;
+ width:80%;
+ font-size:15px;
+ text-align: center;
+ border-style:none none solid none;
+ border-color:rgb(182, 182, 182);
+ border-width:0.5px;
+}
+.suresbtn{
+ position:relative;
+ float:left;
+ left:24%;
+ top:75%;
+ color:green
+}
+.delsbtn{
+ position:relative;
+ float:right;
+ right:20%;
+ top:75%;
+ color:red
+}
+.footer {
+ position:absolute;
+ bottom:0px;
+ left:0px;
+ background-color:black;
+ color:white;
+ clear:both;
+ text-align:center;
+ padding:1px;
+ width:100%;
+ height:4%;
+ z-index: 999;
+}
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/css/index.css b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/css/index.css
new file mode 100755
index 00000000..d459469a
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/css/index.css
@@ -0,0 +1,197 @@
+/* Copyright (C) 2019 Intel Corporation. All rights reserved.
+* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+*/
+{% load static %}
+<style>
+#container{
+ position:relative;
+ margin:0px;
+ height:110px;
+}
+#content {
+ margin:0px 20% 0px 18%;
+ border:solid 1.5px;
+ border-color: white black white black;
+ height:50%;
+}
+#mainnav{
+ display:table;
+ margin: 0 auto;
+}
+#mainnav li{
+ display: table-cell;
+ padding-left:10px;
+}
+#mainnav ul li a{
+ width:120px;
+ height:30px;
+ background:black;
+ color:white;
+ margin:0px 50px;
+ font-size:21px;
+ font-family:'sansationlight';
+ display:block;
+ text-align:center;
+ text-decoration:none;
+}
+#mainnav ul li a:hover{
+ width:120px;
+ height:33px;
+ line-height:30px;
+ border:solid 1.5px;
+ border-color: black black white black;
+ color:#3FC3DF;
+ background:black;
+}
+.headers{
+ background-image: url("{%static 'photo/milky-way-2695569_1280.jpg'%}");
+ background-repeat: no-repeat;
+ background-size: 100% 100%;
+ color:white;
+ clear:both;
+ height:50%;
+ text-align:center;
+ padding:10px;
+ margin:0px;
+}
+#maintitle{
+ font-size:25px;
+ font-family:'sansationlight';
+}
+
+#photo2{
+ position: relative;
+ float: left;
+ top:10%;
+ left:20%;
+}
+#devic{
+ position: relative;
+ font-size:22px;
+ float: left;
+ left:25%;
+ top:30%;
+ width:40%;
+}
+#dividebar{
+ position: absolute;
+ top:210px;
+ margin:10px;
+ width:100%;
+ height:1px
+}
+
+#devices {
+ position:relative;
+ bottom: 2px;
+ background-color: #F2F2F2;
+ height:125px;
+ width:80%;
+ margin:8px 10%;
+}
+#section {
+ position:relative;
+ background-color:white;
+ top:14px;
+ left:13%;
+ width: 70%;
+ float:left;
+ height:96px;
+ border-style:double solid;
+ border-color:black;
+ border-width:0.5px;
+ padding:10px;
+}
+#photo{
+ position: relative;
+ float: left;
+ top:0px;
+ left:6%;
+}
+#ID{
+ position:relative;
+ float:left;
+ left:12%;
+ height:20px;
+ width:8%;
+ top:75%;
+ z-index:9999;
+ /* display:none; */
+ font-size:15px;
+ color:rgba(7, 38, 85, 0.87);
+}
+#IPs{
+ position: relative;
+ left: 14%;
+ top:10%;
+ width:30%;
+ font-size:17px;
+ font-family:'sansationlight';
+}
+#ports{
+ position: relative;
+ left: 14%;
+ top:25%;
+ bottom: 5px;
+ width:30%;
+ font-size:17px;
+ font-family:'sansationlight';
+}
+#installs{
+ position: relative;
+ float: right;
+ right: 20%;
+ bottom:57%;
+ font-size:17px;
+ font-family:'sansationlight';
+}
+.smenu{
+ position: relative;
+ float: right;
+ top:45px;
+ right: 5%;
+ width: 6%;
+}
+
+.prev{
+ position:absolute;
+ left:72%;
+ clear:both;
+ text-align:center;
+ padding:1px;
+ width:100px;
+ height:30px;
+ color:grey;
+ background-color:white;
+ border-radius:5px;
+ z-index: 996;
+}
+
+.next{
+ position:absolute;
+ left:80%;
+ clear:both;
+ text-align:center;
+ padding:1px;
+ width:100px;
+ height:30px;
+ color:grey;
+ background-color:white;
+ border-radius:5px;
+ z-index: 996;
+}
+
+.footer {
+ position:absolute;
+ bottom:0px;
+ left:0px;
+ background-color:black;
+ color:white;
+ clear:both;
+ text-align:center;
+ padding:1px;
+ width:100%;
+ height:4%;
+ z-index: 999;
+}
+</style>
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/js/application.js b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/js/application.js
new file mode 100644
index 00000000..0510fb90
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/js/application.js
@@ -0,0 +1,217 @@
+/* Copyright (C) 2019 Intel Corporation. All rights reserved.
+* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+*/
+
+/*
+ * Dom Location
+ *
+ */
+
+ function setDivCenter(divname)
+// make qn element center aligned
+ {
+ var Top =($(window).height()-$(divname).height())/2;
+ var Left = ($(window).width()-$(divname).width())/2;
+ var scrollTop = $(document).scrollTop();
+ var scrollLeft = $(document).scrollLeft();
+ $(divname).css({posisiton:'absolute','top':Top+scrollTop,'left':Left+scrollLeft});
+
+};
+
+setDivCenter(".middlebox");
+setDivCenter(".deletebox");
+
+function setmain(divname){
+// Set the pop-up window of apps for download at the right place
+ var x = $('#btn').offset().top;
+ var Top = x + $('#btn').height()+15;
+ var y = $('#btn').offset().left;
+ var Left = y + ($('#btn').width()/2)-($(divname).width()/2);
+ console.log(Top,Left)
+ $(divname).css({'top':Top,'left':Left});
+}
+setmain(".main")
+
+/*
+ * download apps
+ *
+ */
+
+function getthis(val)
+//Telling background which app to be loaded from appstore_list and to be installed in the current device.
+{
+
+ /* Get the ip adress and the port of a device, as well as the application ID to be downloaded on this device*/
+ var ip,port,name,version;
+ var ipArr=$("#IPs").text().split(":");
+ ip=ipArr[1];
+ var portArr=$("#ports").text().split(":");
+ port=portArr[1];
+ name = $(val).parent().find("#appsinfo1").text().split(":")[1];
+ version = $(val).parent().find("#appsinfo2").text().split(":")[1];
+ $(".main").fadeOut();
+
+ for (num in alist){
+ if (alist[num]['pname'].trim() == name.trim())
+ {alert("This app has been downloaded.");
+ return;}};
+ $("#loading").fadeIn();
+ var sNode = document.getElementById("APPS");
+ var tempNode= sNode.cloneNode(true);
+ sNode.parentNode.appendChild(tempNode);
+ $("#appinfo1").html("Product Name : "+ name);
+ $("#appinfo2").html("Status : "+"Installing");
+ $("#appinfo3").html("Current_Version : "+ version);
+
+ $.get("/appDownload/",{'ip':ip.trim(),'port':port.trim(),'name':name.trim(),},function (ret) {
+ var status = $.trim(ret.split(":")[1].split("}")[0]);
+ $(".loadapp").html(name+" is downloading now");
+ var msg = JSON.parse(status)
+ console.log(msg)
+ if (JSON.parse(status)=="ok"){
+ $(".middlebox").fadeIn();
+ $(".sourceapp").fadeOut();
+ $("#loading").fadeOut();
+ $(".findapp").html("Download "+name +" successfully");
+ $(".surebtn").click(function (){
+ $(".middlebox").fadeOut();
+ window.location.reload();
+ })}
+ else if (JSON.parse(status)=="Fail!"){
+ alert("Download failed!");
+ $("#loading").fadeOut();
+ sNode.remove();
+ }
+ else {
+ alert("Install app failed:" + msg)
+ $("#loading").fadeOut();
+ sNode.remove();
+ }
+ })
+};
+
+window.onload = function clone()
+//Add & Delete apps to the device.
+{
+ /*Install Apps*/
+ var sourceNode = document.getElementById("APPS");
+ if (alist.length != 0)
+ {
+ $("#appinfo1").html("Product Name : "+ alist[0]['pname']);
+ $("#appinfo2").html("Status : "+ alist[0]['status']);
+ $("#appinfo3").html("Current_Version : "+ alist[0]['current_version']);
+ $("#delete").attr('class','delet0');
+ $("#APPS").attr('class','app0');
+
+ for (var i=1; i<alist.length; i++)
+ {
+ var cloneNode= sourceNode.cloneNode(true);
+ sourceNode.parentNode.appendChild(cloneNode);
+ $("#appinfo1").html("Product Name : "+ alist[i]['pname']);
+ $("#appinfo2").html("Status : "+ alist[i]['status']);
+ $("#appinfo3").html("Current_Version : "+ alist[i]['current_version']);
+ $("#delete").attr('class','delet'+i);
+ $("#APPS").attr('class','app'+i);
+ }
+ }
+ $("#IPs").html("IP : "+ dlist[0]['IP']);
+ $("#ports").html("Port : "+ dlist[0]['Port']);
+ $("#installs").html("Installed Apps : "+ dlist[0]['apps']);
+
+
+
+ $(".mybtn").click(function ()
+ {
+ /*uninstall apps*/
+ var thisitem = $(this).parent().attr('class');
+ var indexa = thisitem.match(/\d+\b/);
+ var pname = $(".app"+indexa).find('#appinfo1').text();
+
+ var ip,port;
+ var ipArr=$("#IPs").text().split(":");
+ ip=ipArr[1];
+ var portArr=$("#ports").text().split(":");
+ port=portArr[1];
+
+ var name = pname.split(':')[1].trim();
+ $(".deletebox").fadeIn();
+ $(".findapp").html("Are you sure to delete "+name);
+ $(".suresbtn").click(function (){
+ $(".app"+indexa).remove();
+ $.get("/appDelete/",{'ip':ip.trim(),'port':port.trim(),"name":pname.split(':')[1].trim()},function (ret) {
+ console.log(ret);});
+ $(".deletebox").fadeOut();
+ window.location.reload();
+ })
+ $(".cancelsbtn").click(function (){
+ $(".deletebox").fadeOut(); })
+ });
+
+};
+
+function getdownloadapps()
+{
+/*Acquire apps for download from Appstore simultaneously whenever appstore is updated*/
+ if (search_node[0] == "Nothing find"){
+ alert(search_node[0])
+ }
+ if (search_node.length == 1 && search_node[0] != "Nothing find" ){
+ $("#appsinfo1").html("Product Name : "+ search_node[0]['ID']);
+ $("#appsinfo2").html("Version : "+ search_node[0]['Version']);
+ }
+ else{
+ var sourceNode = document.getElementById("Dapplications");
+ if (llist.length != 0)
+ {
+ $("#appsinfo1").html("Product Name : "+ llist[0]['ID']);
+ $("#appsinfo2").html("Version : "+ llist[0]['Version']);
+ $("#Dapplications").attr('class','dapp0');
+
+ for (var i=1; i<llist.length; i++)
+ {
+ var cloneNode= sourceNode.cloneNode(true);
+ sourceNode.parentNode.appendChild(cloneNode);
+ $("#appsinfo1").html("Product Name : "+ llist[i]['ID']);
+ $("#appsinfo2").html("Version : "+ llist[i]['Version']);
+ $("#Dapplications").attr('class','dapp'+i);
+ }
+ }};
+};
+
+getdownloadapps();
+
+function givevalue(){
+ var ip=dlist[0]['IP'].trim();
+ var port=dlist[0]['Port'].trim();
+ document.getElementById("aa").value = ip;
+ document.getElementById("bb").value = port;
+ if (open_status == "open"){
+ $(".main").fadeIn();
+ $(".close").click(function(){
+ $(".main").fadeOut();
+ var newurl = "?"+"ip="+ip+"&port="+port;
+ window.location.href= newurl;});
+ $(".mybtn2").click(function(){
+ if (alist.length >=3){
+ alert("Install app failed: exceed max app installations.")
+ }
+ $(".main").fadeOut();
+ getthis(".mybtn2");
+ var newurl = "?"+"ip="+ip+"&port="+port;
+ window.location.href= newurl;
+ });
+
+ }
+}
+givevalue();
+
+function popbox(){
+/*Open and close the "install apps" window*/
+ $(".btn").click(function(){
+ $(".main").fadeIn();
+ });
+ $(".close").click(function(){
+ $(".main").fadeOut();
+ });
+};
+popbox();
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/js/appstore.js b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/js/appstore.js
new file mode 100644
index 00000000..71d029ef
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/js/appstore.js
@@ -0,0 +1,125 @@
+/* Copyright (C) 2019 Intel Corporation. All rights reserved.
+* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+*/
+
+function setDivCenter(divname)
+//Center a dom
+{
+ var Top =($(window).height()-$(divname).height())/2;
+ var Left = ($(window).width()-$(divname).width())/2;
+ var scrollTop = $(document).scrollTop();
+ var scrollLeft = $(document).scrollLeft();
+ $(divname).css({posisiton:'absolute','top':Top+scrollTop,'left':Left+scrollLeft});
+
+};
+setDivCenter(".deletebox");
+
+function setDivheight(divname)
+//set the height of "appbook" to contain all its child elements.
+{
+ var leng = elist.length + flist.length;
+ var heig = 51 * leng;
+ $(divname).css({height:'heig'});
+};
+setDivheight(".appbook");
+
+function setfooterposition(divname)
+//Locate footer on the right place
+{
+ var Top = flist.length* $("#devices").height()+300;
+ var scrollTop = $(document).scrollTop();
+ if (flist.length >=4){
+ $(divname).css({posisiton:'absolute','top':Top+scrollTop});
+ }
+}
+setfooterposition(".footer");
+
+function deleteClick (obj)
+//Remove an app from apppstore if clicks the "OK" button
+{
+ var indexapp = $(obj).attr('class').match(/\d+\b/);
+ var removeitem = $(".applic"+indexapp);
+ var name=removeitem.find('#appinfo1').text().split(":")[1].trim();
+ var version=removeitem.find('#appinfo2').text().split(":")[1].trim();
+
+ if (flist.length >= 1){
+ $(".deletebox").fadeIn();
+ $(".findapp").html("Are you sure to delete "+name);
+ $(".suresbtn").click(function (){
+ removeitem.remove();
+ $.get("/removeapps/",{'name':name,'version':version},function (ret) {
+ console.log(ret);});
+ $(".deletebox").fadeOut();
+ window.location.href="/appstore/";
+ })
+ $(".delsbtn").click(function (){
+ $(".deletebox").fadeOut(); })}
+};
+
+function upload_file()
+//Make sure the uploading file is eligible
+{
+ var type = ulist[0];
+ console.log(type);
+ if (type == "Not a wasm file"){
+ alert(type);
+ window.location.href="/appstore/";
+ }
+ if (type == "This App is preloaded"){
+ alert(type);
+ window.location.href="/appstore/";
+ }
+ if (type == "This App is already uploaded"){
+ alert(type);
+ window.location.href="/appstore/";
+ }
+};
+upload_file();
+
+
+function clone()
+//Render a interface that shows all the apps for installing in appstore,
+//including preloaded ones and locally uploaded ones.
+{
+
+ var sourceNode = document.getElementById("applications");
+ $("#appinfo1").html("product name : "+ elist[0]['ID']);
+ $("#appinfo2").html("product Version : "+ elist[0]['Version']);
+ $("#delbutton").attr('class','del0');
+ $("#applications").attr('class','applic0');
+
+
+ for (var i=1; i<elist.length; i++)
+ {
+ var cloneNode= sourceNode.cloneNode(true);
+ sourceNode.parentNode.appendChild(cloneNode);
+ $("#appinfo1").html("product name : "+ elist[i]['ID']);
+ $("#appinfo2").html("product Version : "+ elist[i]['Version']);
+ $("#delbutton").attr('class','del'+i);
+ $("#applications").attr('class','applic'+i);
+
+ }
+
+ for (var i = elist.length; i< elist.length + flist.length; i++)
+ {
+ var cloneNode= sourceNode.cloneNode(true);
+ sourceNode.parentNode.appendChild(cloneNode);
+ $("#appinfo1").html("product name : "+ flist[i - elist.length]['ID']);
+ $("#appinfo2").html("product Version : "+ flist[i - elist.length]['Version']);
+ $("#lable").html("Custom Apps").css("color","green");
+ $("#delbutton").attr('class','del'+i);
+ $("#applications").attr('class','applic'+i);
+
+ }
+
+ for(var i = 0; i < elist.length; i++)
+ {
+ var tmp_node = document.getElementsByClassName("del" + i)[0]
+ tmp_node.disabled = true
+ }
+
+};
+
+clone();
+
+
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/js/index.js b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/js/index.js
new file mode 100644
index 00000000..b5850bd1
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/js/index.js
@@ -0,0 +1,51 @@
+/* Copyright (C) 2019 Intel Corporation. All rights reserved.
+* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+*/
+
+function setfooterposition(divname)
+//Locate footer on the right place
+{
+ var Top = dlist.length* $("#devices").height()+300;
+ var scrollTop = $(document).scrollTop();
+ if (dlist.length >=4){
+ $(divname).css({posisiton:'absolute','top':Top+scrollTop});
+ }
+}
+setfooterposition(".footer");
+
+window.onload = function clone()
+//Show the list of connected devices
+{
+ var sourceNode = document.getElementById("devices");
+ $("#IPs").html("IP : "+ dlist[0]['IP']);
+ $("#ports").html("Port : "+ dlist[0]['Port']);
+ $("#installs").html("Installed Apps : "+ dlist[0]['apps']);
+ $("#devices").attr('class','devic0');
+ $("#dbutton").attr('class','bt0');
+ $("#choose").attr('class','chos0');
+
+ for (var i=1; i<dlist.length; i++)
+ {
+ var cloneNode= sourceNode.cloneNode(true);
+ sourceNode.parentNode.appendChild(cloneNode);
+ $("#IPs").html("IP : "+ dlist[i]['IP']);
+ $("#ports").html("Port : "+ dlist[i]['Port']);
+ $("#installs").html("Installed Apps : "+ dlist[i]['apps']);
+ $("#devices").attr('class','devic'+i);
+ $("#dbutton").attr('class','bt'+i);
+ $("#choose").attr('class','chos'+i);
+ }
+
+};
+
+function deviceClick(obj){
+//Render to the application.html
+ var deviceObj=$(obj);
+ var ip=deviceObj.find('#IPs').text();
+ ip=ip.split(':')[1].split(' ')[1]
+ var port=deviceObj.find('#ports').text();
+ port=port.split(':')[1].split(' ')[1]
+ var newurl = "apps/?"+"ip="+ip+"&port="+port;
+ window.location.href= newurl;
+}
+
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/photo/app(1).png b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/photo/app(1).png
new file mode 100644
index 00000000..661750e5
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/photo/app(1).png
Binary files differ
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/photo/application.png b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/photo/application.png
new file mode 100755
index 00000000..f4c7a3e9
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/photo/application.png
Binary files differ
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/photo/delete.png b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/photo/delete.png
new file mode 100755
index 00000000..73e45681
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/photo/delete.png
Binary files differ
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/photo/download(1).png b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/photo/download(1).png
new file mode 100644
index 00000000..9a68da59
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/photo/download(1).png
Binary files differ
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/photo/menu.png b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/photo/menu.png
new file mode 100755
index 00000000..919da351
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/photo/menu.png
Binary files differ
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/photo/milky-way-2695569_1280.jpg b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/photo/milky-way-2695569_1280.jpg
new file mode 100755
index 00000000..61d935b7
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/photo/milky-way-2695569_1280.jpg
Binary files differ
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/photo/net_device.png b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/photo/net_device.png
new file mode 100755
index 00000000..e988a6aa
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/photo/net_device.png
Binary files differ
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/photo/software-icon-32081.png b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/photo/software-icon-32081.png
new file mode 100644
index 00000000..cab8cdae
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/photo/software-icon-32081.png
Binary files differ
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/photo/totalblack.png b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/photo/totalblack.png
new file mode 100644
index 00000000..85723f89
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/photo/totalblack.png
Binary files differ
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/upload/connection.wasm b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/upload/connection.wasm
new file mode 100644
index 00000000..936e80cf
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/upload/connection.wasm
Binary files differ
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/upload/event_publisher.wasm b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/upload/event_publisher.wasm
new file mode 100644
index 00000000..31dc1018
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/upload/event_publisher.wasm
Binary files differ
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/upload/event_subscriber.wasm b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/upload/event_subscriber.wasm
new file mode 100644
index 00000000..1dce622f
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/upload/event_subscriber.wasm
Binary files differ
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/upload/request_handler.wasm b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/upload/request_handler.wasm
new file mode 100644
index 00000000..85959790
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/upload/request_handler.wasm
Binary files differ
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/upload/request_sender.wasm b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/upload/request_sender.wasm
new file mode 100644
index 00000000..ce9a6f6e
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/upload/request_sender.wasm
Binary files differ
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/upload/sensor.wasm b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/upload/sensor.wasm
new file mode 100644
index 00000000..f24bd100
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/upload/sensor.wasm
Binary files differ
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/upload/simple b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/upload/simple
new file mode 100755
index 00000000..478a0f85
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/upload/simple
Binary files differ
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/upload/sys/connection.wasm b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/upload/sys/connection.wasm
new file mode 100644
index 00000000..936e80cf
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/upload/sys/connection.wasm
Binary files differ
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/upload/sys/event_publisher.wasm b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/upload/sys/event_publisher.wasm
new file mode 100644
index 00000000..31dc1018
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/upload/sys/event_publisher.wasm
Binary files differ
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/upload/sys/event_subscriber.wasm b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/upload/sys/event_subscriber.wasm
new file mode 100644
index 00000000..1dce622f
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/upload/sys/event_subscriber.wasm
Binary files differ
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/upload/sys/request_handler.wasm b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/upload/sys/request_handler.wasm
new file mode 100644
index 00000000..85959790
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/upload/sys/request_handler.wasm
Binary files differ
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/upload/sys/request_sender.wasm b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/upload/sys/request_sender.wasm
new file mode 100644
index 00000000..ce9a6f6e
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/upload/sys/request_sender.wasm
Binary files differ
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/upload/sys/timer.wasm b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/upload/sys/timer.wasm
new file mode 100644
index 00000000..0bb3c920
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/upload/sys/timer.wasm
Binary files differ
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/upload/timer.wasm b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/upload/timer.wasm
new file mode 100644
index 00000000..0bb3c920
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/upload/timer.wasm
Binary files differ
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/upload/ui_app.wasm b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/upload/ui_app.wasm
new file mode 100644
index 00000000..1182ca29
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/upload/ui_app.wasm
Binary files differ
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/upload/wasm_runtime_wgl b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/upload/wasm_runtime_wgl
new file mode 100755
index 00000000..30f8e92e
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/test-tools/IoT-APP-Store-Demo/wasm_django/static/upload/wasm_runtime_wgl
Binary files differ