Merge branch 'develop/2.2' of github.com:thingsboard/thingsboard into develop/2.2
This commit is contained in:
commit
0271e2b8e9
31
msa/js-executor/.gitignore
vendored
Normal file
31
msa/js-executor/.gitignore
vendored
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
*.toDelete
|
||||||
|
output/**
|
||||||
|
*.class
|
||||||
|
*~
|
||||||
|
*.iml
|
||||||
|
*/.idea/**
|
||||||
|
.idea/**
|
||||||
|
.idea
|
||||||
|
*.log
|
||||||
|
*.log.[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]
|
||||||
|
*/.classpath
|
||||||
|
.classpath
|
||||||
|
*/.project
|
||||||
|
.project
|
||||||
|
.cache/**
|
||||||
|
target/
|
||||||
|
logs/
|
||||||
|
build/
|
||||||
|
.settings/
|
||||||
|
/bin
|
||||||
|
bin/
|
||||||
|
**/dependency-reduced-pom.xml
|
||||||
|
pom.xml.versionsBackup
|
||||||
|
.DS_Store
|
||||||
|
**/.gradle
|
||||||
|
**/local.properties
|
||||||
|
**/build
|
||||||
|
**/target
|
||||||
|
**/.env
|
||||||
|
node_modules
|
||||||
|
package-lock.json
|
||||||
25
msa/js-executor/api/jsMessageConsumer.js
Normal file
25
msa/js-executor/api/jsMessageConsumer.js
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
/*
|
||||||
|
* Copyright © 2016-2018 The Thingsboard Authors
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
var logger = require('../config/logger')('JsMessageConsumer');
|
||||||
|
|
||||||
|
exports.onJsInvokeMessage = function(message, producer) {
|
||||||
|
|
||||||
|
logger.info('Received message: %s', message);
|
||||||
|
|
||||||
|
}
|
||||||
120
msa/js-executor/build.gradle
Normal file
120
msa/js-executor/build.gradle
Normal file
@ -0,0 +1,120 @@
|
|||||||
|
/**
|
||||||
|
* Copyright © 2016-2018 The Thingsboard Authors
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
import org.apache.tools.ant.filters.ReplaceTokens
|
||||||
|
|
||||||
|
buildscript {
|
||||||
|
ext {
|
||||||
|
osPackageVersion = "3.8.0"
|
||||||
|
}
|
||||||
|
repositories {
|
||||||
|
jcenter()
|
||||||
|
}
|
||||||
|
dependencies {
|
||||||
|
classpath("com.netflix.nebula:gradle-ospackage-plugin:${osPackageVersion}")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
apply plugin: "nebula.ospackage"
|
||||||
|
|
||||||
|
buildDir = projectBuildDir
|
||||||
|
version = projectVersion
|
||||||
|
distsDirName = "./"
|
||||||
|
|
||||||
|
// OS Package plugin configuration
|
||||||
|
ospackage {
|
||||||
|
packageName = pkgName
|
||||||
|
version = "${project.version}"
|
||||||
|
release = 1
|
||||||
|
os = LINUX
|
||||||
|
type = BINARY
|
||||||
|
|
||||||
|
into pkgInstallFolder
|
||||||
|
|
||||||
|
user pkgUser
|
||||||
|
permissionGroup pkgUser
|
||||||
|
|
||||||
|
// Copy the executable file
|
||||||
|
from("target/package/linux/bin/${pkgName}") {
|
||||||
|
fileMode 0500
|
||||||
|
into "bin"
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copy the init file
|
||||||
|
from("target/package/linux/init/${pkgName}") {
|
||||||
|
fileMode 0500
|
||||||
|
into "init"
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copy the config files
|
||||||
|
from("target/package/linux/conf") {
|
||||||
|
fileType CONFIG | NOREPLACE
|
||||||
|
fileMode 0754
|
||||||
|
into "conf"
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Configure our RPM build task
|
||||||
|
buildRpm {
|
||||||
|
|
||||||
|
arch = X86_64
|
||||||
|
|
||||||
|
version = projectVersion.replace('-', '')
|
||||||
|
archiveName = "${pkgName}.rpm"
|
||||||
|
|
||||||
|
preInstall file("${buildDir}/control/rpm/preinst")
|
||||||
|
postInstall file("${buildDir}/control/rpm/postinst")
|
||||||
|
preUninstall file("${buildDir}/control/rpm/prerm")
|
||||||
|
postUninstall file("${buildDir}/control/rpm/postrm")
|
||||||
|
|
||||||
|
user pkgUser
|
||||||
|
permissionGroup pkgUser
|
||||||
|
|
||||||
|
// Copy the system unit files
|
||||||
|
from("${buildDir}/control/${pkgName}.service") {
|
||||||
|
addParentDirs = false
|
||||||
|
fileMode 0644
|
||||||
|
into "/usr/lib/systemd/system"
|
||||||
|
}
|
||||||
|
|
||||||
|
directory(pkgLogFolder, 0755)
|
||||||
|
link("/etc/${pkgName}/conf", "${pkgInstallFolder}/conf")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Same as the buildRpm task
|
||||||
|
buildDeb {
|
||||||
|
|
||||||
|
arch = "amd64"
|
||||||
|
|
||||||
|
archiveName = "${pkgName}.deb"
|
||||||
|
|
||||||
|
configurationFile("${pkgInstallFolder}/conf/${pkgName}.conf")
|
||||||
|
configurationFile("${pkgInstallFolder}/conf/custom-environment-variables.yml")
|
||||||
|
configurationFile("${pkgInstallFolder}/conf/default.yml")
|
||||||
|
configurationFile("${pkgInstallFolder}/conf/logger.js")
|
||||||
|
|
||||||
|
preInstall file("${buildDir}/control/deb/preinst")
|
||||||
|
postInstall file("${buildDir}/control/deb/postinst")
|
||||||
|
preUninstall file("${buildDir}/control/deb/prerm")
|
||||||
|
postUninstall file("${buildDir}/control/deb/postrm")
|
||||||
|
|
||||||
|
user pkgUser
|
||||||
|
permissionGroup pkgUser
|
||||||
|
|
||||||
|
directory(pkgLogFolder, 0755)
|
||||||
|
link("/etc/init.d/${pkgName}", "${pkgInstallFolder}/init/${pkgName}")
|
||||||
|
link("/etc/${pkgName}/conf", "${pkgInstallFolder}/conf")
|
||||||
|
}
|
||||||
25
msa/js-executor/config/custom-environment-variables.yml
Normal file
25
msa/js-executor/config/custom-environment-variables.yml
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
#
|
||||||
|
# Copyright © 2016-2018 The Thingsboard Authors
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
# you may not use this file except in compliance with the License.
|
||||||
|
# You may obtain a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# See the License for the specific language governing permissions and
|
||||||
|
# limitations under the License.
|
||||||
|
#
|
||||||
|
|
||||||
|
kafka:
|
||||||
|
request_topic: "REMOTE_JS_EVAL_REQUEST_TOPIC"
|
||||||
|
bootstrap:
|
||||||
|
# Kafka Bootstrap Servers
|
||||||
|
servers: "TB_KAFKA_SERVERS"
|
||||||
|
logger:
|
||||||
|
level: "LOGGER_LEVEL"
|
||||||
|
path: "LOG_FOLDER"
|
||||||
|
filename: "LOGGER_FILENAME"
|
||||||
26
msa/js-executor/config/default.yml
Normal file
26
msa/js-executor/config/default.yml
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
#
|
||||||
|
# Copyright © 2016-2018 The Thingsboard Authors
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
# you may not use this file except in compliance with the License.
|
||||||
|
# You may obtain a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# See the License for the specific language governing permissions and
|
||||||
|
# limitations under the License.
|
||||||
|
#
|
||||||
|
|
||||||
|
kafka:
|
||||||
|
request_topic: "js.eval.requests"
|
||||||
|
bootstrap:
|
||||||
|
# Kafka Bootstrap Servers
|
||||||
|
servers: "localhost:9092"
|
||||||
|
|
||||||
|
logger:
|
||||||
|
level: "info"
|
||||||
|
path: "logs"
|
||||||
|
filename: "tb-js-executor-%DATE%.log"
|
||||||
59
msa/js-executor/config/logger.js
Normal file
59
msa/js-executor/config/logger.js
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
/*
|
||||||
|
* Copyright © 2016-2018 The Thingsboard Authors
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
var config = require('config'),
|
||||||
|
path = require('path'),
|
||||||
|
DailyRotateFile = require('winston-daily-rotate-file');
|
||||||
|
|
||||||
|
const { createLogger, format, transports } = require('winston');
|
||||||
|
const { combine, timestamp, label, printf, splat } = format;
|
||||||
|
|
||||||
|
var loggerTransports = [];
|
||||||
|
|
||||||
|
if (process.env.NODE_ENV !== 'production') {
|
||||||
|
loggerTransports.push(new transports.Console({
|
||||||
|
handleExceptions: true
|
||||||
|
}));
|
||||||
|
} else {
|
||||||
|
var filename = path.join(config.get('logger.path'), config.get('logger.filename'));
|
||||||
|
var transport = new (DailyRotateFile)({
|
||||||
|
filename: filename,
|
||||||
|
datePattern: 'YYYY-MM-DD-HH',
|
||||||
|
zippedArchive: true,
|
||||||
|
maxSize: '20m',
|
||||||
|
maxFiles: '14d',
|
||||||
|
handleExceptions: true
|
||||||
|
});
|
||||||
|
loggerTransports.push(transport);
|
||||||
|
}
|
||||||
|
|
||||||
|
const tbFormat = printf(info => {
|
||||||
|
return `${info.timestamp} [${info.label}] ${info.level.toUpperCase()}: ${info.message}`;
|
||||||
|
});
|
||||||
|
|
||||||
|
function _logger(moduleLabel) {
|
||||||
|
return createLogger({
|
||||||
|
level: config.get('logger.level'),
|
||||||
|
format:combine(
|
||||||
|
splat(),
|
||||||
|
label({ label: moduleLabel }),
|
||||||
|
timestamp({format: 'YYYY-MM-DD HH:mm:ss,SSS'}),
|
||||||
|
tbFormat
|
||||||
|
),
|
||||||
|
transports: loggerTransports
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = _logger;
|
||||||
19
msa/js-executor/config/tb-js-executor.conf
Normal file
19
msa/js-executor/config/tb-js-executor.conf
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
#
|
||||||
|
# Copyright © 2016-2018 The Thingsboard Authors
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
# you may not use this file except in compliance with the License.
|
||||||
|
# You may obtain a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# See the License for the specific language governing permissions and
|
||||||
|
# limitations under the License.
|
||||||
|
#
|
||||||
|
|
||||||
|
export NODE_CONFIG_DIR=${pkg.installFolder}/conf
|
||||||
|
export LOG_FOLDER=${pkg.logFolder}
|
||||||
|
export NODE_ENV=production
|
||||||
42
msa/js-executor/install.js
Normal file
42
msa/js-executor/install.js
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
/*
|
||||||
|
* Copyright © 2016-2018 The Thingsboard Authors
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
const fs = require('fs');
|
||||||
|
const fse = require('fs-extra');
|
||||||
|
const path = require('path');
|
||||||
|
|
||||||
|
let _projectRoot = null;
|
||||||
|
|
||||||
|
|
||||||
|
(async() => {
|
||||||
|
await fse.move(path.join(projectRoot(), 'target', 'thingsboard-js-executor-linux'),
|
||||||
|
path.join(targetPackageDir('linux'), 'bin', 'tb-js-executor'),
|
||||||
|
{overwrite: true});
|
||||||
|
await fse.move(path.join(projectRoot(), 'target', 'thingsboard-js-executor-win.exe'),
|
||||||
|
path.join(targetPackageDir('windows'), 'bin', 'tb-js-executor.exe'),
|
||||||
|
{overwrite: true});
|
||||||
|
})();
|
||||||
|
|
||||||
|
|
||||||
|
function projectRoot() {
|
||||||
|
if (!_projectRoot) {
|
||||||
|
_projectRoot = __dirname;
|
||||||
|
}
|
||||||
|
return _projectRoot;
|
||||||
|
}
|
||||||
|
|
||||||
|
function targetPackageDir(platform) {
|
||||||
|
return path.join(projectRoot(), 'target', 'package', platform);
|
||||||
|
}
|
||||||
35
msa/js-executor/package.json
Normal file
35
msa/js-executor/package.json
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
{
|
||||||
|
"name": "thingsboard-js-executor",
|
||||||
|
"private": true,
|
||||||
|
"version": "2.2.0",
|
||||||
|
"description": "ThingsBoard JavaScript Executor Microservice",
|
||||||
|
"main": "server.js",
|
||||||
|
"bin": "server.js",
|
||||||
|
"scripts": {
|
||||||
|
"install": "pkg -t node8-linux-x64,node8-win-x64 --out-path ./target . && node install.js",
|
||||||
|
"test": "echo \"Error: no test specified\" && exit 1",
|
||||||
|
"start": "nodemon server.js",
|
||||||
|
"start-prod": "NODE_ENV=production nodemon server.js"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"config": "^1.30.0",
|
||||||
|
"js-yaml": "^3.12.0",
|
||||||
|
"kafka-node": "^3.0.1",
|
||||||
|
"winston": "^3.0.0",
|
||||||
|
"winston-daily-rotate-file": "^3.2.1"
|
||||||
|
},
|
||||||
|
"engine": "node >= 5.9.0",
|
||||||
|
"nyc": {
|
||||||
|
"exclude": [
|
||||||
|
"test",
|
||||||
|
"__tests__",
|
||||||
|
"node_modules",
|
||||||
|
"target"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"fs-extra": "^6.0.1",
|
||||||
|
"nodemon": "^1.17.5",
|
||||||
|
"pkg": "^4.3.3"
|
||||||
|
}
|
||||||
|
}
|
||||||
310
msa/js-executor/pom.xml
Normal file
310
msa/js-executor/pom.xml
Normal file
@ -0,0 +1,310 @@
|
|||||||
|
<!--
|
||||||
|
|
||||||
|
Copyright © 2016-2018 The Thingsboard Authors
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
|
||||||
|
-->
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<parent>
|
||||||
|
<groupId>org.thingsboard</groupId>
|
||||||
|
<version>2.2.0-SNAPSHOT</version>
|
||||||
|
<artifactId>msa</artifactId>
|
||||||
|
</parent>
|
||||||
|
<groupId>org.thingsboard.msa</groupId>
|
||||||
|
<artifactId>js-executor</artifactId>
|
||||||
|
<packaging>pom</packaging>
|
||||||
|
|
||||||
|
<name>ThingsBoard JavaScript Executor Microservice</name>
|
||||||
|
<url>https://thingsboard.io</url>
|
||||||
|
<description>Service executing JavaScript functions in sandboxed environment</description>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
|
<main.dir>${basedir}/../..</main.dir>
|
||||||
|
<pkg.name>tb-js-executor</pkg.name>
|
||||||
|
<pkg.user>thingsboard</pkg.user>
|
||||||
|
<pkg.unixLogFolder>/var/log/${pkg.name}</pkg.unixLogFolder>
|
||||||
|
<pkg.installFolder>/usr/share/${pkg.name}</pkg.installFolder>
|
||||||
|
<pkg.linux.dist>${project.build.directory}/package/linux</pkg.linux.dist>
|
||||||
|
<pkg.win.dist>${project.build.directory}/package/windows</pkg.win.dist>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.sun.winsw</groupId>
|
||||||
|
<artifactId>winsw</artifactId>
|
||||||
|
<classifier>bin</classifier>
|
||||||
|
<type>exe</type>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>com.github.eirslett</groupId>
|
||||||
|
<artifactId>frontend-maven-plugin</artifactId>
|
||||||
|
<version>1.0</version>
|
||||||
|
<configuration>
|
||||||
|
<installDirectory>target</installDirectory>
|
||||||
|
<workingDirectory>${basedir}</workingDirectory>
|
||||||
|
</configuration>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<id>install node and npm</id>
|
||||||
|
<goals>
|
||||||
|
<goal>install-node-and-npm</goal>
|
||||||
|
</goals>
|
||||||
|
<configuration>
|
||||||
|
<nodeVersion>v8.11.3</nodeVersion>
|
||||||
|
<npmVersion>5.6.0</npmVersion>
|
||||||
|
</configuration>
|
||||||
|
</execution>
|
||||||
|
<execution>
|
||||||
|
<id>npm install</id>
|
||||||
|
<goals>
|
||||||
|
<goal>npm</goal>
|
||||||
|
</goals>
|
||||||
|
<configuration>
|
||||||
|
<arguments>install</arguments>
|
||||||
|
</configuration>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-dependency-plugin</artifactId>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<id>copy-winsw-service</id>
|
||||||
|
<phase>package</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>copy</goal>
|
||||||
|
</goals>
|
||||||
|
<configuration>
|
||||||
|
<artifactItems>
|
||||||
|
<artifactItem>
|
||||||
|
<groupId>com.sun.winsw</groupId>
|
||||||
|
<artifactId>winsw</artifactId>
|
||||||
|
<classifier>bin</classifier>
|
||||||
|
<type>exe</type>
|
||||||
|
<destFileName>service.exe</destFileName>
|
||||||
|
</artifactItem>
|
||||||
|
</artifactItems>
|
||||||
|
<outputDirectory>${pkg.win.dist}</outputDirectory>
|
||||||
|
</configuration>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-resources-plugin</artifactId>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<id>copy-linux-conf</id>
|
||||||
|
<phase>process-resources</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>copy-resources</goal>
|
||||||
|
</goals>
|
||||||
|
<configuration>
|
||||||
|
<outputDirectory>${pkg.linux.dist}/conf</outputDirectory>
|
||||||
|
<resources>
|
||||||
|
<resource>
|
||||||
|
<directory>config</directory>
|
||||||
|
<filtering>true</filtering>
|
||||||
|
</resource>
|
||||||
|
</resources>
|
||||||
|
<filters>
|
||||||
|
<filter>src/main/filters/unix.properties</filter>
|
||||||
|
</filters>
|
||||||
|
</configuration>
|
||||||
|
</execution>
|
||||||
|
<execution>
|
||||||
|
<id>copy-linux-init</id>
|
||||||
|
<phase>process-resources</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>copy-resources</goal>
|
||||||
|
</goals>
|
||||||
|
<configuration>
|
||||||
|
<outputDirectory>${pkg.linux.dist}/init</outputDirectory>
|
||||||
|
<resources>
|
||||||
|
<resource>
|
||||||
|
<directory>src/main/scripts/init</directory>
|
||||||
|
<filtering>true</filtering>
|
||||||
|
</resource>
|
||||||
|
</resources>
|
||||||
|
<filters>
|
||||||
|
<filter>src/main/filters/unix.properties</filter>
|
||||||
|
</filters>
|
||||||
|
</configuration>
|
||||||
|
</execution>
|
||||||
|
<execution>
|
||||||
|
<id>copy-win-conf</id>
|
||||||
|
<phase>process-resources</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>copy-resources</goal>
|
||||||
|
</goals>
|
||||||
|
<configuration>
|
||||||
|
<outputDirectory>${pkg.win.dist}/conf</outputDirectory>
|
||||||
|
<resources>
|
||||||
|
<resource>
|
||||||
|
<directory>config</directory>
|
||||||
|
<excludes>
|
||||||
|
<exclude>tb-js-executor.conf</exclude>
|
||||||
|
</excludes>
|
||||||
|
<filtering>true</filtering>
|
||||||
|
</resource>
|
||||||
|
</resources>
|
||||||
|
<filters>
|
||||||
|
<filter>src/main/filters/windows.properties</filter>
|
||||||
|
</filters>
|
||||||
|
</configuration>
|
||||||
|
</execution>
|
||||||
|
<execution>
|
||||||
|
<id>copy-control</id>
|
||||||
|
<phase>process-resources</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>copy-resources</goal>
|
||||||
|
</goals>
|
||||||
|
<configuration>
|
||||||
|
<outputDirectory>${project.build.directory}/control</outputDirectory>
|
||||||
|
<resources>
|
||||||
|
<resource>
|
||||||
|
<directory>src/main/scripts/control</directory>
|
||||||
|
<filtering>true</filtering>
|
||||||
|
</resource>
|
||||||
|
</resources>
|
||||||
|
<filters>
|
||||||
|
<filter>src/main/filters/unix.properties</filter>
|
||||||
|
</filters>
|
||||||
|
</configuration>
|
||||||
|
</execution>
|
||||||
|
<execution>
|
||||||
|
<id>copy-windows-control</id>
|
||||||
|
<phase>process-resources</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>copy-resources</goal>
|
||||||
|
</goals>
|
||||||
|
<configuration>
|
||||||
|
<outputDirectory>${pkg.win.dist}</outputDirectory>
|
||||||
|
<resources>
|
||||||
|
<resource>
|
||||||
|
<directory>src/main/scripts/windows</directory>
|
||||||
|
<filtering>true</filtering>
|
||||||
|
</resource>
|
||||||
|
</resources>
|
||||||
|
<filters>
|
||||||
|
<filter>src/main/filters/windows.properties</filter>
|
||||||
|
</filters>
|
||||||
|
</configuration>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.fortasoft</groupId>
|
||||||
|
<artifactId>gradle-maven-plugin</artifactId>
|
||||||
|
<configuration>
|
||||||
|
<tasks>
|
||||||
|
<task>build</task>
|
||||||
|
<task>buildDeb</task>
|
||||||
|
<task>buildRpm</task>
|
||||||
|
</tasks>
|
||||||
|
<args>
|
||||||
|
<arg>-PprojectBuildDir=${project.build.directory}</arg>
|
||||||
|
<arg>-PprojectVersion=${project.version}</arg>
|
||||||
|
<arg>-PpkgName=${pkg.name}</arg>
|
||||||
|
<arg>-PpkgUser=${pkg.user}</arg>
|
||||||
|
<arg>-PpkgInstallFolder=${pkg.installFolder}</arg>
|
||||||
|
<arg>-PpkgLogFolder=${pkg.unixLogFolder}</arg>
|
||||||
|
</args>
|
||||||
|
</configuration>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<phase>package</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>invoke</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-assembly-plugin</artifactId>
|
||||||
|
<version>3.0.0</version>
|
||||||
|
<configuration>
|
||||||
|
<finalName>${pkg.name}</finalName>
|
||||||
|
<descriptors>
|
||||||
|
<descriptor>src/main/assembly/windows.xml</descriptor>
|
||||||
|
</descriptors>
|
||||||
|
</configuration>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<id>assembly</id>
|
||||||
|
<phase>package</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>single</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
<profiles>
|
||||||
|
<profile>
|
||||||
|
<id>npm-start</id>
|
||||||
|
<activation>
|
||||||
|
<property>
|
||||||
|
<name>npm-start</name>
|
||||||
|
</property>
|
||||||
|
</activation>
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>com.github.eirslett</groupId>
|
||||||
|
<artifactId>frontend-maven-plugin</artifactId>
|
||||||
|
<version>1.0</version>
|
||||||
|
<configuration>
|
||||||
|
<installDirectory>target</installDirectory>
|
||||||
|
<workingDirectory>${basedir}</workingDirectory>
|
||||||
|
</configuration>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<id>npm start</id>
|
||||||
|
<goals>
|
||||||
|
<goal>npm</goal>
|
||||||
|
</goals>
|
||||||
|
|
||||||
|
<configuration>
|
||||||
|
<arguments>start</arguments>
|
||||||
|
</configuration>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
</profile>
|
||||||
|
</profiles>
|
||||||
|
<repositories>
|
||||||
|
<repository>
|
||||||
|
<id>jenkins</id>
|
||||||
|
<name>Jenkins Repository</name>
|
||||||
|
<url>http://repo.jenkins-ci.org/releases</url>
|
||||||
|
<snapshots>
|
||||||
|
<enabled>false</enabled>
|
||||||
|
</snapshots>
|
||||||
|
</repository>
|
||||||
|
</repositories>
|
||||||
|
</project>
|
||||||
83
msa/js-executor/server.js
Normal file
83
msa/js-executor/server.js
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
/*
|
||||||
|
* Copyright © 2016-2018 The Thingsboard Authors
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
var config = require('config'),
|
||||||
|
kafka = require('kafka-node'),
|
||||||
|
Consumer = kafka.Consumer,
|
||||||
|
Producer = kafka.Producer,
|
||||||
|
JsMessageConsumer = require('./api/jsMessageConsumer');
|
||||||
|
|
||||||
|
var logger = require('./config/logger')('main');
|
||||||
|
|
||||||
|
var kafkaBootstrapServers = config.get('kafka.bootstrap.servers');
|
||||||
|
var kafkaRequestTopic = config.get('kafka.request_topic');
|
||||||
|
|
||||||
|
logger.info('Kafka Bootstrap Servers: %s', kafkaBootstrapServers);
|
||||||
|
logger.info('Kafka Requests Topic: %s', kafkaRequestTopic);
|
||||||
|
|
||||||
|
var kafkaClient;
|
||||||
|
|
||||||
|
(async() => {
|
||||||
|
try {
|
||||||
|
logger.info('Starting ThingsBoard JavaScript Executor Microservice...');
|
||||||
|
|
||||||
|
kafkaClient = new kafka.KafkaClient({kafkaHost: kafkaBootstrapServers});
|
||||||
|
|
||||||
|
var consumer = new Consumer(
|
||||||
|
kafkaClient,
|
||||||
|
[
|
||||||
|
{ topic: kafkaRequestTopic, partition: 0 }
|
||||||
|
],
|
||||||
|
{
|
||||||
|
autoCommit: true
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
var producer = new Producer(kafkaClient);
|
||||||
|
producer.on('error', (err) => {
|
||||||
|
logger.error('Unexpected kafka producer error');
|
||||||
|
logger.error(err);
|
||||||
|
});
|
||||||
|
|
||||||
|
producer.on('ready', () => {
|
||||||
|
consumer.on('message', (message) => {
|
||||||
|
JsMessageConsumer.onJsInvokeMessage(message, producer);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
logger.info('Started ThingsBoard JavaScript Executor Microservice.');
|
||||||
|
} catch (e) {
|
||||||
|
logger.error('Failed to start ThingsBoard JavaScript Executor Microservice: %s', e.message);
|
||||||
|
logger.error(e);
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
|
||||||
|
process.on('exit', function () {
|
||||||
|
exit(0);
|
||||||
|
});
|
||||||
|
|
||||||
|
function exit(status) {
|
||||||
|
logger.info('Exiting with status: %d ...', status);
|
||||||
|
if (kafkaClient) {
|
||||||
|
logger.info('Stopping Kafka Client...');
|
||||||
|
kafkaClient.close(() => {
|
||||||
|
logger.info('Kafka Client stopped.');
|
||||||
|
process.exit(status);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
process.exit(status);
|
||||||
|
}
|
||||||
|
}
|
||||||
71
msa/js-executor/src/main/assembly/windows.xml
Normal file
71
msa/js-executor/src/main/assembly/windows.xml
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
<!--
|
||||||
|
|
||||||
|
Copyright © 2016-2018 The Thingsboard Authors
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
|
||||||
|
-->
|
||||||
|
<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3 http://maven.apache.org/xsd/assembly-1.1.3.xsd">
|
||||||
|
<id>windows</id>
|
||||||
|
|
||||||
|
<formats>
|
||||||
|
<format>zip</format>
|
||||||
|
</formats>
|
||||||
|
|
||||||
|
<!-- Workaround to create logs directory -->
|
||||||
|
<fileSets>
|
||||||
|
<fileSet>
|
||||||
|
<directory>${pkg.win.dist}</directory>
|
||||||
|
<outputDirectory>logs</outputDirectory>
|
||||||
|
<excludes>
|
||||||
|
<exclude>*/**</exclude>
|
||||||
|
</excludes>
|
||||||
|
</fileSet>
|
||||||
|
<fileSet>
|
||||||
|
<directory>${pkg.win.dist}/conf</directory>
|
||||||
|
<outputDirectory>conf</outputDirectory>
|
||||||
|
<lineEnding>windows</lineEnding>
|
||||||
|
</fileSet>
|
||||||
|
</fileSets>
|
||||||
|
|
||||||
|
<files>
|
||||||
|
<file>
|
||||||
|
<source>${pkg.win.dist}/bin/${pkg.name}.exe</source>
|
||||||
|
<outputDirectory>bin</outputDirectory>
|
||||||
|
<destName>${pkg.name}.exe</destName>
|
||||||
|
</file>
|
||||||
|
<file>
|
||||||
|
<source>${pkg.win.dist}/service.exe</source>
|
||||||
|
<outputDirectory/>
|
||||||
|
<destName>${pkg.name}.exe</destName>
|
||||||
|
</file>
|
||||||
|
<file>
|
||||||
|
<source>${pkg.win.dist}/service.xml</source>
|
||||||
|
<outputDirectory/>
|
||||||
|
<destName>${pkg.name}.xml</destName>
|
||||||
|
<lineEnding>windows</lineEnding>
|
||||||
|
</file>
|
||||||
|
<file>
|
||||||
|
<source>${pkg.win.dist}/install.bat</source>
|
||||||
|
<outputDirectory/>
|
||||||
|
<lineEnding>windows</lineEnding>
|
||||||
|
</file>
|
||||||
|
<file>
|
||||||
|
<source>${pkg.win.dist}/uninstall.bat</source>
|
||||||
|
<outputDirectory/>
|
||||||
|
<lineEnding>windows</lineEnding>
|
||||||
|
</file>
|
||||||
|
</files>
|
||||||
|
</assembly>
|
||||||
1
msa/js-executor/src/main/filters/unix.properties
Normal file
1
msa/js-executor/src/main/filters/unix.properties
Normal file
@ -0,0 +1 @@
|
|||||||
|
pkg.logFolder=${pkg.unixLogFolder}
|
||||||
2
msa/js-executor/src/main/filters/windows.properties
Normal file
2
msa/js-executor/src/main/filters/windows.properties
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
pkg.logFolder=${BASE}\\logs
|
||||||
|
pkg.winWrapperLogFolder=%BASE%\\logs
|
||||||
6
msa/js-executor/src/main/scripts/control/deb/postinst
Normal file
6
msa/js-executor/src/main/scripts/control/deb/postinst
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
chown -R ${pkg.user}: ${pkg.logFolder}
|
||||||
|
chown -R ${pkg.user}: ${pkg.installFolder}
|
||||||
|
update-rc.d ${pkg.name} defaults
|
||||||
|
|
||||||
3
msa/js-executor/src/main/scripts/control/deb/postrm
Normal file
3
msa/js-executor/src/main/scripts/control/deb/postrm
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
update-rc.d -f ${pkg.name} remove
|
||||||
18
msa/js-executor/src/main/scripts/control/deb/preinst
Normal file
18
msa/js-executor/src/main/scripts/control/deb/preinst
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
if ! getent group ${pkg.user} >/dev/null; then
|
||||||
|
addgroup --system ${pkg.user}
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! getent passwd ${pkg.user} >/dev/null; then
|
||||||
|
adduser --quiet \
|
||||||
|
--system \
|
||||||
|
--ingroup ${pkg.user} \
|
||||||
|
--quiet \
|
||||||
|
--disabled-login \
|
||||||
|
--disabled-password \
|
||||||
|
--home ${pkg.installFolder} \
|
||||||
|
--no-create-home \
|
||||||
|
-gecos "Thingsboard application" \
|
||||||
|
${pkg.user}
|
||||||
|
fi
|
||||||
5
msa/js-executor/src/main/scripts/control/deb/prerm
Normal file
5
msa/js-executor/src/main/scripts/control/deb/prerm
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
if [ -e /var/run/${pkg.name}/${pkg.name}.pid ]; then
|
||||||
|
service ${pkg.name} stop
|
||||||
|
fi
|
||||||
9
msa/js-executor/src/main/scripts/control/rpm/postinst
Normal file
9
msa/js-executor/src/main/scripts/control/rpm/postinst
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
chown -R ${pkg.user}: ${pkg.logFolder}
|
||||||
|
chown -R ${pkg.user}: ${pkg.installFolder}
|
||||||
|
|
||||||
|
if [ $1 -eq 1 ] ; then
|
||||||
|
# Initial installation
|
||||||
|
systemctl --no-reload enable ${pkg.name}.service >/dev/null 2>&1 || :
|
||||||
|
fi
|
||||||
6
msa/js-executor/src/main/scripts/control/rpm/postrm
Normal file
6
msa/js-executor/src/main/scripts/control/rpm/postrm
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
if [ $1 -ge 1 ] ; then
|
||||||
|
# Package upgrade, not uninstall
|
||||||
|
systemctl try-restart ${pkg.name}.service >/dev/null 2>&1 || :
|
||||||
|
fi
|
||||||
6
msa/js-executor/src/main/scripts/control/rpm/preinst
Normal file
6
msa/js-executor/src/main/scripts/control/rpm/preinst
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
getent group ${pkg.user} >/dev/null || groupadd -r ${pkg.user}
|
||||||
|
getent passwd ${pkg.user} >/dev/null || \
|
||||||
|
useradd -d ${pkg.installFolder} -g ${pkg.user} -M -r ${pkg.user} -s /sbin/nologin \
|
||||||
|
-c "Thingsboard application"
|
||||||
6
msa/js-executor/src/main/scripts/control/rpm/prerm
Normal file
6
msa/js-executor/src/main/scripts/control/rpm/prerm
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
if [ $1 -eq 0 ] ; then
|
||||||
|
# Package removal, not upgrade
|
||||||
|
systemctl --no-reload disable --now ${pkg.name}.service > /dev/null 2>&1 || :
|
||||||
|
fi
|
||||||
@ -0,0 +1,11 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=${pkg.name}
|
||||||
|
After=syslog.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
User=${pkg.user}
|
||||||
|
ExecStart=${pkg.installFolder}/init/${pkg.name}
|
||||||
|
SuccessExitStatus=143
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
233
msa/js-executor/src/main/scripts/init/tb-js-executor
Normal file
233
msa/js-executor/src/main/scripts/init/tb-js-executor
Normal file
@ -0,0 +1,233 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
#
|
||||||
|
|
||||||
|
|
||||||
|
### BEGIN INIT INFO
|
||||||
|
# Provides: tb-js-executor
|
||||||
|
# Required-Start: $remote_fs $syslog $network
|
||||||
|
# Required-Stop: $remote_fs $syslog $network
|
||||||
|
# Default-Start: 2 3 4 5
|
||||||
|
# Default-Stop: 0 1 6
|
||||||
|
# Short-Description: ${project.name}
|
||||||
|
# Description: ${project.description}
|
||||||
|
# chkconfig: 2345 99 01
|
||||||
|
### END INIT INFO
|
||||||
|
|
||||||
|
[[ -n "$DEBUG" ]] && set -x
|
||||||
|
|
||||||
|
# Initialize variables that cannot be provided by a .conf file
|
||||||
|
WORKING_DIR="$(pwd)"
|
||||||
|
# shellcheck disable=SC2153
|
||||||
|
|
||||||
|
mainfile=${pkg.installFolder}/bin/${pkg.name}
|
||||||
|
configfile=${pkg.name}.conf
|
||||||
|
|
||||||
|
# Follow symlinks to find the real script and detect init.d script
|
||||||
|
cd "$(dirname "$0")" || exit 1
|
||||||
|
[[ -z "$initfile" ]] && initfile=$(pwd)/$(basename "$0")
|
||||||
|
while [[ -L "$initfile" ]]; do
|
||||||
|
[[ "$initfile" =~ init\.d ]] && init_script=$(basename "$initfile")
|
||||||
|
initfile=$(readlink "$initfile")
|
||||||
|
cd "$(dirname "$initfile")" || exit 1
|
||||||
|
initfile=$(pwd)/$(basename "$initfile")
|
||||||
|
done
|
||||||
|
initfolder="$( (cd "$(dirname "initfile")" && pwd -P) )"
|
||||||
|
cd "$WORKING_DIR" || exit 1
|
||||||
|
|
||||||
|
# Initialize CONF_FOLDER location
|
||||||
|
[[ -z "$CONF_FOLDER" ]] && CONF_FOLDER="${pkg.installFolder}/conf"
|
||||||
|
|
||||||
|
# shellcheck source=/dev/null
|
||||||
|
[[ -r "${CONF_FOLDER}/${configfile}" ]] && source "${CONF_FOLDER}/${configfile}"
|
||||||
|
|
||||||
|
# Initialize PID/LOG locations if they weren't provided by the config file
|
||||||
|
[[ -z "$PID_FOLDER" ]] && PID_FOLDER="/var/run"
|
||||||
|
[[ -z "$LOG_FOLDER" ]] && LOG_FOLDER="${pkg.unixLogFolder}"
|
||||||
|
! [[ "$PID_FOLDER" == /* ]] && PID_FOLDER="$(dirname "$mainfile")"/"$PID_FOLDER"
|
||||||
|
! [[ "$LOG_FOLDER" == /* ]] && LOG_FOLDER="$(dirname "$mainfile")"/"$LOG_FOLDER"
|
||||||
|
! [[ -x "$PID_FOLDER" ]] && PID_FOLDER="/tmp"
|
||||||
|
! [[ -x "$LOG_FOLDER" ]] && LOG_FOLDER="/tmp"
|
||||||
|
|
||||||
|
# Set up defaults
|
||||||
|
[[ -z "$MODE" ]] && MODE="auto" # modes are "auto", "service" or "run"
|
||||||
|
[[ -z "$USE_START_STOP_DAEMON" ]] && USE_START_STOP_DAEMON="true"
|
||||||
|
|
||||||
|
# Create an identity for log/pid files
|
||||||
|
if [[ -z "$identity" ]]; then
|
||||||
|
if [[ -n "$init_script" ]]; then
|
||||||
|
identity="${init_script}"
|
||||||
|
else
|
||||||
|
identity=$(basename "${initfile%.*}")_${initfolder//\//}
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Initialize log file name if not provided by the config file
|
||||||
|
[[ -z "$LOG_FILENAME" ]] && LOG_FILENAME="${identity}.log"
|
||||||
|
|
||||||
|
# ANSI Colors
|
||||||
|
echoRed() { echo $'\e[0;31m'"$1"$'\e[0m'; }
|
||||||
|
echoGreen() { echo $'\e[0;32m'"$1"$'\e[0m'; }
|
||||||
|
echoYellow() { echo $'\e[0;33m'"$1"$'\e[0m'; }
|
||||||
|
|
||||||
|
# Utility functions
|
||||||
|
checkPermissions() {
|
||||||
|
touch "$pid_file" &> /dev/null || { echoRed "Operation not permitted (cannot access pid file)"; return 4; }
|
||||||
|
touch "$log_file" &> /dev/null || { echoRed "Operation not permitted (cannot access log file)"; return 4; }
|
||||||
|
}
|
||||||
|
|
||||||
|
isRunning() {
|
||||||
|
ps -p "$1" &> /dev/null
|
||||||
|
}
|
||||||
|
|
||||||
|
await_file() {
|
||||||
|
end=$(date +%s)
|
||||||
|
let "end+=10"
|
||||||
|
while [[ ! -s "$1" ]]
|
||||||
|
do
|
||||||
|
now=$(date +%s)
|
||||||
|
if [[ $now -ge $end ]]; then
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
sleep 1
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
# Determine the script mode
|
||||||
|
action="run"
|
||||||
|
if [[ "$MODE" == "auto" && -n "$init_script" ]] || [[ "$MODE" == "service" ]]; then
|
||||||
|
action="$1"
|
||||||
|
shift
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Build the pid and log filenames
|
||||||
|
if [[ "$identity" == "$init_script" ]] || [[ "$identity" == "$APP_NAME" ]]; then
|
||||||
|
PID_FOLDER="$PID_FOLDER/${identity}"
|
||||||
|
pid_subfolder=$PID_FOLDER
|
||||||
|
fi
|
||||||
|
pid_file="$PID_FOLDER/${identity}.pid"
|
||||||
|
log_file="$LOG_FOLDER/$LOG_FILENAME"
|
||||||
|
|
||||||
|
# Determine the user to run as if we are root
|
||||||
|
# shellcheck disable=SC2012
|
||||||
|
[[ $(id -u) == "0" ]] && run_user=$(ls -ld "$mainfile" | awk '{print $3}')
|
||||||
|
|
||||||
|
arguments=($RUN_ARGS "$@")
|
||||||
|
|
||||||
|
# Action functions
|
||||||
|
start() {
|
||||||
|
if [[ -f "$pid_file" ]]; then
|
||||||
|
pid=$(cat "$pid_file")
|
||||||
|
isRunning "$pid" && { echoYellow "Already running [$pid]"; return 0; }
|
||||||
|
fi
|
||||||
|
do_start "$@"
|
||||||
|
}
|
||||||
|
|
||||||
|
do_start() {
|
||||||
|
working_dir=$(dirname "$mainfile")
|
||||||
|
pushd "$working_dir" > /dev/null
|
||||||
|
mkdir -p "$PID_FOLDER" &> /dev/null
|
||||||
|
if [[ -n "$run_user" ]]; then
|
||||||
|
checkPermissions || return $?
|
||||||
|
if [[ -z "$pid_subfolder" ]]; then
|
||||||
|
chown "$run_user" "$pid_subfolder"
|
||||||
|
fi
|
||||||
|
chown "$run_user" "$pid_file"
|
||||||
|
chown "$run_user" "$log_file"
|
||||||
|
if [ $USE_START_STOP_DAEMON = true ] && type start-stop-daemon > /dev/null 2>&1; then
|
||||||
|
start-stop-daemon --start --quiet \
|
||||||
|
--chuid "$run_user" \
|
||||||
|
--name "$identity" \
|
||||||
|
--make-pidfile --pidfile "$pid_file" \
|
||||||
|
--background --no-close \
|
||||||
|
--startas "$mainfile" \
|
||||||
|
--chdir "$working_dir" \
|
||||||
|
-- "${arguments[@]}" \
|
||||||
|
>> "$log_file" 2>&1
|
||||||
|
await_file "$pid_file"
|
||||||
|
else
|
||||||
|
su -s /bin/sh -c "$mainfile $(printf "\"%s\" " "${arguments[@]}") >> \"$log_file\" 2>&1 & echo \$!" "$run_user" > "$pid_file"
|
||||||
|
fi
|
||||||
|
pid=$(cat "$pid_file")
|
||||||
|
else
|
||||||
|
checkPermissions || return $?
|
||||||
|
"$mainfile" "${arguments[@]}" >> "$log_file" 2>&1 &
|
||||||
|
pid=$!
|
||||||
|
disown $pid
|
||||||
|
echo "$pid" > "$pid_file"
|
||||||
|
fi
|
||||||
|
[[ -z $pid ]] && { echoRed "Failed to start"; return 1; }
|
||||||
|
echoGreen "Started [$pid]"
|
||||||
|
}
|
||||||
|
|
||||||
|
stop() {
|
||||||
|
working_dir=$(dirname "$mainfile")
|
||||||
|
pushd "$working_dir" > /dev/null
|
||||||
|
[[ -f $pid_file ]] || { echoYellow "Not running (pidfile not found)"; return 0; }
|
||||||
|
pid=$(cat "$pid_file")
|
||||||
|
isRunning "$pid" || { echoYellow "Not running (process ${pid}). Removing stale pid file."; rm -f "$pid_file"; return 0; }
|
||||||
|
do_stop "$pid" "$pid_file"
|
||||||
|
}
|
||||||
|
|
||||||
|
do_stop() {
|
||||||
|
kill -2 "$1" &> /dev/null || { echoRed "Unable to kill process $1"; return 1; }
|
||||||
|
for i in $(seq 1 60); do
|
||||||
|
isRunning "$1" || { echoGreen "Stopped [$1]"; rm -f "$2"; return 0; }
|
||||||
|
[[ $i -eq 30 ]] && kill -9 "$1" &> /dev/null
|
||||||
|
sleep 1
|
||||||
|
done
|
||||||
|
echoRed "Unable to kill process $1";
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
restart() {
|
||||||
|
stop && start
|
||||||
|
}
|
||||||
|
|
||||||
|
orce_reload() {
|
||||||
|
working_dir=$(dirname "$mainfile")
|
||||||
|
pushd "$working_dir" > /dev/null
|
||||||
|
[[ -f $pid_file ]] || { echoRed "Not running (pidfile not found)"; return 7; }
|
||||||
|
pid=$(cat "$pid_file")
|
||||||
|
rm -f "$pid_file"
|
||||||
|
isRunning "$pid" || { echoRed "Not running (process ${pid} not found)"; return 7; }
|
||||||
|
do_stop "$pid" "$pid_file"
|
||||||
|
do_start
|
||||||
|
}
|
||||||
|
|
||||||
|
status() {
|
||||||
|
working_dir=$(dirname "$mainfile")
|
||||||
|
pushd "$working_dir" > /dev/null
|
||||||
|
[[ -f "$pid_file" ]] || { echoRed "Not running"; return 3; }
|
||||||
|
pid=$(cat "$pid_file")
|
||||||
|
isRunning "$pid" || { echoRed "Not running (process ${pid} not found)"; return 1; }
|
||||||
|
echoGreen "Running [$pid]"
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
run() {
|
||||||
|
pushd "$(dirname "$mainfile")" > /dev/null
|
||||||
|
"$mainfile" "${arguments[@]}"
|
||||||
|
result=$?
|
||||||
|
popd > /dev/null
|
||||||
|
return "$result"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Call the appropriate action function
|
||||||
|
case "$action" in
|
||||||
|
start)
|
||||||
|
start "$@"; exit $?;;
|
||||||
|
stop)
|
||||||
|
stop "$@"; exit $?;;
|
||||||
|
restart)
|
||||||
|
restart "$@"; exit $?;;
|
||||||
|
force-reload)
|
||||||
|
force_reload "$@"; exit $?;;
|
||||||
|
status)
|
||||||
|
status "$@"; exit $?;;
|
||||||
|
run)
|
||||||
|
run "$@"; exit $?;;
|
||||||
|
*)
|
||||||
|
echo "Usage: $0 {start|stop|restart|force-reload|status|run}"; exit 1;
|
||||||
|
esac
|
||||||
|
|
||||||
|
exit 0
|
||||||
31
msa/js-executor/src/main/scripts/windows/install.bat
Normal file
31
msa/js-executor/src/main/scripts/windows/install.bat
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
@REM
|
||||||
|
@REM Copyright © 2016-2018 The Thingsboard Authors
|
||||||
|
@REM
|
||||||
|
@REM Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
@REM you may not use this file except in compliance with the License.
|
||||||
|
@REM You may obtain a copy of the License at
|
||||||
|
@REM
|
||||||
|
@REM http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
@REM
|
||||||
|
@REM Unless required by applicable law or agreed to in writing, software
|
||||||
|
@REM distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
@REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
@REM See the License for the specific language governing permissions and
|
||||||
|
@REM limitations under the License.
|
||||||
|
@REM
|
||||||
|
|
||||||
|
@ECHO OFF
|
||||||
|
|
||||||
|
setlocal ENABLEEXTENSIONS
|
||||||
|
|
||||||
|
@ECHO Installing ${pkg.name} ...
|
||||||
|
|
||||||
|
SET BASE=%~dp0
|
||||||
|
|
||||||
|
%BASE%${pkg.name}.exe install
|
||||||
|
|
||||||
|
@ECHO ${pkg.name} installed successfully!
|
||||||
|
|
||||||
|
GOTO END
|
||||||
|
|
||||||
|
:END
|
||||||
29
msa/js-executor/src/main/scripts/windows/service.xml
Normal file
29
msa/js-executor/src/main/scripts/windows/service.xml
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
<!--
|
||||||
|
|
||||||
|
Copyright © 2016-2018 The Thingsboard Authors
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
|
||||||
|
-->
|
||||||
|
<service>
|
||||||
|
<id>${pkg.name}</id>
|
||||||
|
<name>${project.name}</name>
|
||||||
|
<description>${project.description}</description>
|
||||||
|
<workingdirectory>%BASE%\bin</workingdirectory>
|
||||||
|
<logpath>${pkg.winWrapperLogFolder}</logpath>
|
||||||
|
<logmode>rotate</logmode>
|
||||||
|
<env name="NODE_CONFIG_DIR" value="%BASE%\conf" />
|
||||||
|
<env name="LOG_FOLDER" value="${pkg.winWrapperLogFolder}" />
|
||||||
|
<env name="NODE_ENV" value="production" />
|
||||||
|
<executable>%BASE%\bin\${pkg.name}.exe</executable>
|
||||||
|
</service>
|
||||||
25
msa/js-executor/src/main/scripts/windows/uninstall.bat
Normal file
25
msa/js-executor/src/main/scripts/windows/uninstall.bat
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
@REM
|
||||||
|
@REM Copyright © 2016-2018 The Thingsboard Authors
|
||||||
|
@REM
|
||||||
|
@REM Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
@REM you may not use this file except in compliance with the License.
|
||||||
|
@REM You may obtain a copy of the License at
|
||||||
|
@REM
|
||||||
|
@REM http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
@REM
|
||||||
|
@REM Unless required by applicable law or agreed to in writing, software
|
||||||
|
@REM distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
@REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
@REM See the License for the specific language governing permissions and
|
||||||
|
@REM limitations under the License.
|
||||||
|
@REM
|
||||||
|
|
||||||
|
@ECHO OFF
|
||||||
|
|
||||||
|
@ECHO Stopping ${pkg.name} ...
|
||||||
|
net stop ${pkg.name}
|
||||||
|
|
||||||
|
@ECHO Uninstalling ${pkg.name} ...
|
||||||
|
%~dp0${pkg.name}.exe uninstall
|
||||||
|
|
||||||
|
@ECHO DONE.
|
||||||
41
msa/pom.xml
Normal file
41
msa/pom.xml
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
<!--
|
||||||
|
|
||||||
|
Copyright © 2016-2018 The Thingsboard Authors
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
|
||||||
|
-->
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<parent>
|
||||||
|
<groupId>org.thingsboard</groupId>
|
||||||
|
<version>2.2.0-SNAPSHOT</version>
|
||||||
|
<artifactId>thingsboard</artifactId>
|
||||||
|
</parent>
|
||||||
|
<groupId>org.thingsboard</groupId>
|
||||||
|
<artifactId>msa</artifactId>
|
||||||
|
<packaging>pom</packaging>
|
||||||
|
|
||||||
|
<name>ThingsBoard Microservices</name>
|
||||||
|
<url>https://thingsboard.io</url>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<main.dir>${basedir}/..</main.dir>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
<modules>
|
||||||
|
<module>js-executor</module>
|
||||||
|
</modules>
|
||||||
|
|
||||||
|
</project>
|
||||||
Loading…
x
Reference in New Issue
Block a user