From 9fa55ba4427f2d1017a6e7a5a9830ffc31934f2b Mon Sep 17 00:00:00 2001 From: Eason010212 <1371033826@qq.com> Date: Sat, 11 Mar 2023 11:42:26 +0800 Subject: [PATCH] mixio 1.10.1 --- .gitignore | 5 +- config/certs/file.crt | 15 - config/certs/private.pem | 16 - config/config.json | 20 -- mixio.js | 555 +++++++++++++++++++++++------- package-lock.json | 199 +++++++---- package.json | 3 + pkg_tools/linux/install.sh | 18 - pkg_tools/mixio.empty.db | Bin 172032 -> 0 bytes pkg_tools/reserve/1.db | Bin 12288 -> 0 bytes pkg_tools/reserve/2.db | Bin 12288 -> 0 bytes pkg_tools/reserve/3.db | Bin 12288 -> 0 bytes pkg_tools/reserve/4.db | Bin 12288 -> 0 bytes pkg_tools/reserve/5.db | Bin 12288 -> 0 bytes pkg_tools/reserve/6.db | Bin 12288 -> 0 bytes pkg_tools/reserve/7.db | Bin 12288 -> 0 bytes pkg_tools/reserve/8.db | Bin 12288 -> 0 bytes pkg_tools/reserve/filter.json | 2 - pkg_tools/win-x64-pkg.sh | 20 +- pkg_tools/win/autoStart.bat | 4 - pkg_tools/win/removeAutoStart.bat | 4 - pkg_tools/win/start.bat | 4 - storage/.gitignore | 2 - version.json | 5 - 24 files changed, 561 insertions(+), 311 deletions(-) delete mode 100644 config/certs/file.crt delete mode 100644 config/certs/private.pem delete mode 100644 config/config.json delete mode 100644 pkg_tools/linux/install.sh delete mode 100644 pkg_tools/mixio.empty.db delete mode 100644 pkg_tools/reserve/1.db delete mode 100644 pkg_tools/reserve/2.db delete mode 100644 pkg_tools/reserve/3.db delete mode 100644 pkg_tools/reserve/4.db delete mode 100644 pkg_tools/reserve/5.db delete mode 100644 pkg_tools/reserve/6.db delete mode 100644 pkg_tools/reserve/7.db delete mode 100644 pkg_tools/reserve/8.db delete mode 100644 pkg_tools/reserve/filter.json delete mode 100644 pkg_tools/win/autoStart.bat delete mode 100644 pkg_tools/win/removeAutoStart.bat delete mode 100644 pkg_tools/win/start.bat delete mode 100644 storage/.gitignore delete mode 100644 version.json diff --git a/.gitignore b/.gitignore index ccb2c80..58228be 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,5 @@ node_modules/ -package-lock.json \ No newline at end of file +package-lock.json +storage/ +logs/ +config/ \ No newline at end of file diff --git a/config/certs/file.crt b/config/certs/file.crt deleted file mode 100644 index 4569d86..0000000 --- a/config/certs/file.crt +++ /dev/null @@ -1,15 +0,0 @@ ------BEGIN CERTIFICATE----- -MIICRDCCAa0CFCVQzFjsGbbYOOlCxMGn1sZyBzwVMA0GCSqGSIb3DQEBCwUAMGEx -CzAJBgNVBAYTAkNOMRAwDgYDVQQIDAdCZWlqaW5nMRAwDgYDVQQHDAdCZWlqaW5n -MQ4wDAYDVQQKDAVNaXhseTEOMAwGA1UECwwFTWl4SU8xDjAMBgNVBAMMBU1peElP -MB4XDTIyMDEyOTA4MDE0MVoXDTIzMDEyOTA4MDE0MVowYTELMAkGA1UEBhMCQ04x -EDAOBgNVBAgMB0JlaWppbmcxEDAOBgNVBAcMB0JlaWppbmcxDjAMBgNVBAoMBU1p -eGx5MQ4wDAYDVQQLDAVNaXhJTzEOMAwGA1UEAwwFTWl4SU8wgZ8wDQYJKoZIhvcN -AQEBBQADgY0AMIGJAoGBAM3xzY1n5V05vAZbYniDbMoNXCzgL5puebmV2mIkMAHv -QnhMZHv2O938ezFae0l3A6zRkhWgX4XLmGUwKria3xCC9E0soF2wM0JfIFpDIQ5g -WnixtCiI8MjV8hXQ0Nh1hJ0MMwEX6g72N/YyH5Y/P9lsmr6OiG7dXe4oyaROY/U5 -AgMBAAEwDQYJKoZIhvcNAQELBQADgYEASvGJMK+h09mGCsza7h2ieVe75ogbG/nK -+c7KYYOBR2OXTNk90Od+2tJog5hJl8M1nRDHdOEPgTPDYKVz0hXjJBZnM5NtcoYS -pq6vf83MtY8polmly/EZsZqiVPaEsH97nniRoMOP4JdyKlqU2g94yFDUiTTZW4cS -iURo4pW8gRE= ------END CERTIFICATE----- diff --git a/config/certs/private.pem b/config/certs/private.pem deleted file mode 100644 index 0d78614..0000000 --- a/config/certs/private.pem +++ /dev/null @@ -1,16 +0,0 @@ ------BEGIN PRIVATE KEY----- -MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAM3xzY1n5V05vAZb -YniDbMoNXCzgL5puebmV2mIkMAHvQnhMZHv2O938ezFae0l3A6zRkhWgX4XLmGUw -Kria3xCC9E0soF2wM0JfIFpDIQ5gWnixtCiI8MjV8hXQ0Nh1hJ0MMwEX6g72N/Yy -H5Y/P9lsmr6OiG7dXe4oyaROY/U5AgMBAAECgYB8zETFpeoF/lCEgahAY1PvdP0g -bJIsQToeTkLSKh+1bGmZQKG7xNEuiiuVEsGXGTnu5ehilpaMG340A2ZADAmTf552 -Zr7AHSWmg4YEEykihSoJ2owfmqamm5Fsyoe/oxijsWwXAiZIv6VkDznchnQ+1I/w -Ioyigp+dHbHS3OjiAQJBAOaDx0XjofpJQe4oCufTIqltomRtxtP4fFbeEbmQrXRt -zNvH6QeKeanA+F4JQGVKcDSt6rz5yi8MqukOpZKBcdkCQQDktp4hfgvCQN8U50t+ -izZVImXGb47tfNKCWkNdrVnMI597ad3Qx+NV41oohMV4SFNCA8VgTq2onkhBbRjP -YSJhAkBp9n2t5Nvan75M6d9JfcbbN2iE3emeGwWdMOvY72astKSNCzJVoxQWMnx5 -TatqZHN7486aHAES67HM/EykMhjRAkArlooog+clzEs3pqUCpvFh5D5VRSmOJT3R -TfaMwd7dQuTAFnsJsS6oTb3+/t7Lf60uZZ2WLyh1fET1Ax+5Vh/BAkEAlNxqK/DI -Fu1JviGs33vE55YHu4F0u822PUT9XN8NNzFhsvK5Oza+O7Tyyq7WJejR7I8IjzOb -RvSzVsDN3/+4ug== ------END PRIVATE KEY----- diff --git a/config/config.json b/config/config.json deleted file mode 100644 index 09a9288..0000000 --- a/config/config.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "MIXIO_HTTP_PORT": 8080, - "MIXIO_HTTPS_PORT": 8081, - "MAX_PROJECT_NUM_PER_USER": 20, - "MAX_MESSAGE_PER_USER": 1000, - "MAX_MESSAGE_PER_SECOND": 5, - "ALLOW_REGISTER": true, - "ALLOW_HOOK": true, - "OFFLINE_MODE": true, - "BAIDU_MAP_AK": "", - "BAIDU_MAP_SERVER_AK": "", - "ADMIN_USERNAME":"admin", - "ADMIN_PASSWORD":"public", - "STORAGE_ENGINE":"sqlite", - "MYSQL_HOST":"localhost", - "MYSQL_PORT":3306, - "MYSQL_USER":"", - "MYSQL_PASS":"", - "MYSQL_DB":"mixio" -} \ No newline at end of file diff --git a/mixio.js b/mixio.js index 1bca56b..b927fa0 100644 --- a/mixio.js +++ b/mixio.js @@ -1,3 +1,5 @@ +var VERSION = "1.10.0" + // change pwd to src if (process.argv[0].indexOf("node") != -1) { // exec from source @@ -16,7 +18,7 @@ var logFileName = "logs/" + [ [spawnTime.getFullYear(), spawnTime.getMonth() + 1, spawnTime.getDate()].join("-"), [spawnTime.getHours() >= 10 ? spawnTime.getHours() : ("0" + spawnTime.getHours()), spawnTime.getMinutes() >= 10 ? spawnTime.getMinutes() : ("0" + spawnTime.getMinutes()), spawnTime.getSeconds() >= 10 ? spawnTime.getSeconds() : ("0" + spawnTime.getSeconds())].join("-") ].join("-") + ".log" const { spawn, exec } = require('child_process'); -var fs = require('fs') +var fs = require('fs-extra') var express = require('express'); var session = require('express-session'); const sqlite3 = require('sqlite3').verbose(); @@ -33,26 +35,211 @@ var jq = require("jquery"); const mqtt = require('mqtt'); var { JSLang, arrLang, lang } = require("./js/lang.js") const path = require('path'); +var readline = require('readline'); +var iconv = require('iconv-lite'); -var versionPath = "version.json" -var VERSION = JSON.parse(fs.readFileSync(versionPath), "utf-8")["version"] -var configPath = "config/config.json" -var configs = fs.readFileSync(configPath); -configs = JSON.parse(configs.toString()); - -var STORAGE_ENGINE = configs["STORAGE_ENGINE"] - +function init(cb){ + if (!fs.existsSync("logs")) { + fs.mkdirSync("logs") + } + if (!fs.existsSync("config")) { + fs.mkdirSync("config") + var defaultConfig = `{ + "MIXIO_HTTP_PORT": 8080, + "MIXIO_HTTPS_PORT": 8443, + "MAX_PROJECT_NUM_PER_USER": 20, + "MAX_MESSAGE_PER_USER": 1000, + "MAX_MESSAGE_PER_SECOND": 5, + "ALLOW_REGISTER": true, + "ALLOW_HOOK": true, + "OFFLINE_MODE": true, + "BAIDU_MAP_AK": "", + "BAIDU_MAP_SERVER_AK": "", + "ADMIN_USERNAME":"admin", + "ADMIN_PASSWORD":"public", + "STORAGE_ENGINE":"sqlite", + "MYSQL_HOST":"localhost", + "MYSQL_PORT":3306, + "MYSQL_USER":"", + "MYSQL_PASS":"", + "MYSQL_DB":"mixio" + }` + fs.writeFileSync("config/config.json", defaultConfig) + fs.mkdirSync("config/certs") + var defaultCrt = +`-----BEGIN CERTIFICATE----- +MIICRDCCAa0CFCVQzFjsGbbYOOlCxMGn1sZyBzwVMA0GCSqGSIb3DQEBCwUAMGEx +CzAJBgNVBAYTAkNOMRAwDgYDVQQIDAdCZWlqaW5nMRAwDgYDVQQHDAdCZWlqaW5n +MQ4wDAYDVQQKDAVNaXhseTEOMAwGA1UECwwFTWl4SU8xDjAMBgNVBAMMBU1peElP +MB4XDTIyMDEyOTA4MDE0MVoXDTIzMDEyOTA4MDE0MVowYTELMAkGA1UEBhMCQ04x +EDAOBgNVBAgMB0JlaWppbmcxEDAOBgNVBAcMB0JlaWppbmcxDjAMBgNVBAoMBU1p +eGx5MQ4wDAYDVQQLDAVNaXhJTzEOMAwGA1UEAwwFTWl4SU8wgZ8wDQYJKoZIhvcN +AQEBBQADgY0AMIGJAoGBAM3xzY1n5V05vAZbYniDbMoNXCzgL5puebmV2mIkMAHv +QnhMZHv2O938ezFae0l3A6zRkhWgX4XLmGUwKria3xCC9E0soF2wM0JfIFpDIQ5g +WnixtCiI8MjV8hXQ0Nh1hJ0MMwEX6g72N/YyH5Y/P9lsmr6OiG7dXe4oyaROY/U5 +AgMBAAEwDQYJKoZIhvcNAQELBQADgYEASvGJMK+h09mGCsza7h2ieVe75ogbG/nK ++c7KYYOBR2OXTNk90Od+2tJog5hJl8M1nRDHdOEPgTPDYKVz0hXjJBZnM5NtcoYS +pq6vf83MtY8polmly/EZsZqiVPaEsH97nniRoMOP4JdyKlqU2g94yFDUiTTZW4cS +iURo4pW8gRE= +-----END CERTIFICATE----- +` + fs.writeFileSync("config/certs/file.crt", defaultCrt) + var defaultPem = +`-----BEGIN PRIVATE KEY----- +MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAM3xzY1n5V05vAZb +YniDbMoNXCzgL5puebmV2mIkMAHvQnhMZHv2O938ezFae0l3A6zRkhWgX4XLmGUw +Kria3xCC9E0soF2wM0JfIFpDIQ5gWnixtCiI8MjV8hXQ0Nh1hJ0MMwEX6g72N/Yy +H5Y/P9lsmr6OiG7dXe4oyaROY/U5AgMBAAECgYB8zETFpeoF/lCEgahAY1PvdP0g +bJIsQToeTkLSKh+1bGmZQKG7xNEuiiuVEsGXGTnu5ehilpaMG340A2ZADAmTf552 +Zr7AHSWmg4YEEykihSoJ2owfmqamm5Fsyoe/oxijsWwXAiZIv6VkDznchnQ+1I/w +Ioyigp+dHbHS3OjiAQJBAOaDx0XjofpJQe4oCufTIqltomRtxtP4fFbeEbmQrXRt +zNvH6QeKeanA+F4JQGVKcDSt6rz5yi8MqukOpZKBcdkCQQDktp4hfgvCQN8U50t+ +izZVImXGb47tfNKCWkNdrVnMI597ad3Qx+NV41oohMV4SFNCA8VgTq2onkhBbRjP +YSJhAkBp9n2t5Nvan75M6d9JfcbbN2iE3emeGwWdMOvY72astKSNCzJVoxQWMnx5 +TatqZHN7486aHAES67HM/EykMhjRAkArlooog+clzEs3pqUCpvFh5D5VRSmOJT3R +TfaMwd7dQuTAFnsJsS6oTb3+/t7Lf60uZZ2WLyh1fET1Ax+5Vh/BAkEAlNxqK/DI +Fu1JviGs33vE55YHu4F0u822PUT9XN8NNzFhsvK5Oza+O7Tyyq7WJejR7I8IjzOb +RvSzVsDN3/+4ug== +-----END PRIVATE KEY----- +` + fs.writeFileSync("config/certs/private.pem", defaultPem) + } + if (!fs.existsSync("storage")) { + fs.mkdirSync("storage") + var newDB = new sqlite3.Database("storage/mixio.db", sqlite3.OPEN_READWRITE | sqlite3.OPEN_CREATE, function(err) { + if (err) { + console.log(err) + cb(false) + } + else{ + newDB.run(`CREATE TABLE "devices" ( + "userName" TEXT, + "clientid" TEXT, + "timestamp" INTEGER DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY("clientid") + )`,function(err){ + if(err){ + console.log(err) + cb(false) + } + else + { + newDB.run(`CREATE TABLE "project" ( + "projectName" TEXT, + "userName" TEXT, + "projectLayout" TEXT, + "dataStorage" TEXT, + "logicStorage" TEXT, + "timestamp" INTEGER DEFAULT CURRENT_TIMESTAMP, + "projectType" INTEGER + )`, function(err){ + if(err){ + console.log(err) + cb(false) + } + else + { + newDB.run(`CREATE TABLE "share" ( + "shareid" TEXT, + "userName" TEXT, + "projectName" TEXT, + "projectLayout" TEXT, + "dataStorage" TEXT, + "logicStorage" TEXT, + "timeStamp" INTEGER DEFAULT CURRENT_TIMESTAMP, + "status" INTEGER DEFAULT 1, + "shareCount" INTEGER DEFAULT 0 + )`, function(err){ + if(err){ + console.log(err) + cb(false) + } + else + { + newDB.run(`CREATE TABLE "share_key" ( + "userName" TEXT, + "projectPass" TEXT, + "projectName" TEXT, + "share_key" TEXT + )`, function(err){ + if(err) + { + console.log(err) + cb(false) + } + else + { + newDB.run(`CREATE TABLE "user" ( + "id" INTEGER, + "username" TEXT, + "password" TEXT, + "salt" TEXT, + "is_superuser" INTEGER DEFAULT 0, + "verified" INTEGER DEFAULT 1, + "question" TEXT, + "answer" TEXT, + PRIMARY KEY("id" AUTOINCREMENT) + )`, function(err){ + if(err) + { + console.log(err) + cb(false) + } + else + { + newDB.close() + fs.mkdirSync("storage/reserve") + fs.writeFileSync("storage/reserve/filter.json", "{}") + var newDB1 = new sqlite3.Database("storage/reserve/1.db", sqlite3.OPEN_READWRITE | sqlite3.OPEN_CREATE, function(err) { + if(err) + { + console.log(err) + cb(false) + } + else + { + newDB1.run(`CREATE TABLE "reserve" ( + "id" INTEGER, + "userName" TEXT NOT NULL, + "topic" TEXT NOT NULL, + "message" TEXT NOT NULL, + "time" INTEGER DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY("id" AUTOINCREMENT) + )`, function(err){ + if(err) + { + console.log(err) + cb(false) + } + else + { + newDB1.close() + for(var i = 2;i<=8;i = i+1){ + fs.copyFileSync("storage/reserve/1.db","storage/reserve/" + i + ".db") + } + cb(true) + } + }) + } + }) + } + }) + } + }) + } + }) + } + }) + } + }) + } + }) + } + else + cb(true) +} var mysql = require('mysql8'); -var MYSQL_HOST = configs["MYSQL_HOST"] -var MYSQL_USER = configs["MYSQL_USER"] -var MYSQL_PASS = configs["MYSQL_PASS"] -var MYSQL_DB = configs["MYSQL_DB"] -var MYSQL_PORT = configs["MYSQL_PORT"] - -var MAX_MESSAGE_PER_USER = configs["MAX_MESSAGE_PER_USER"] -var MAX_MESSAGE_PER_SECOND = configs["MAX_MESSAGE_PER_SECOND"] - var serverStatus = true var globalWeather = {} @@ -1845,132 +2032,238 @@ async function startOnce() { } const args = process.argv.slice(2) -if (args.length != 1) { - console.log("Invalid parameter(s). Use \"mixio help\" for help.") -} else { - if (args[0] == "debug") - { - daemon_start() - startOnce() - } - else if (args[0] == "start") - { - var parent_exit = function(child){ - var logFile = fs.openSync(logFileName, 'r') - while(true){ - // check log file for database connection - var data = fs.readFileSync(logFile, 'utf8') - if(data[data.length-1] == "\n") - data = data.slice(0, -1) - if(data!="") - console.log(data) - if(data.toString().indexOf("Database Connected!") != -1) - { - console.log("MixIO server is running now.") - child.unref() - process.exit() - } - else if(data.toString().indexOf("Error") != -1) - { - console.error("An error occured while initializing MixIO server. Log file: " + process.cwd() + logFileName) - child.unref() - process.exit() - } - } - } - // child process to run 'mixio' in background - var logFile = fs.openSync(logFileName, 'a') - if(process.argv[0].indexOf("node") != -1) - { - var child = spawn(process.argv[0], [process.argv[1], "debug"], { detached: true , stdio:['ignore', logFile, logFile]}) - parent_exit(child) - } - else - { - var child = spawn(process.argv[0], [process.argv[1], "debug"], { detached: true , stdio:['ignore', logFile, logFile]}) - parent_exit(child) - } - } - else if (args[0] == "stop") - { - // kill 'mixio' process if it is running - if(process.argv[0].indexOf("node") != -1) - { - if(process.platform == "win32") +var startMixIO = function(){ + var parent_exit = function(child){ + var logFile = fs.openSync(logFileName, 'r') + while(true){ + // check log file for database connection + var data = fs.readFileSync(logFile, 'utf8') + if(data[data.length-1] == "\n") + data = data.slice(0, -1) + if(data!="") + console.log(data) + if(data.toString().indexOf("Database Connected!") != -1) { - console.log("Shutting down MixIO server...") - exec('taskkill /F /IM node.exe', function(err, stdout, stderr) { - if (err) { - console.log(err) - } - }) + console.log("MixIO server is running now.") + child.unref() + for (var t = Date.now(); Date.now() - t <= 2000;); + process.exit() } - else - { - console.log("Shutting down MixIO server...") - exec('pkill node', function(err, stdout, stderr) { - if (err) { - console.log(err) - } - }) - } - } - else - { - if(process.platform == "win32") - { - console.log("Shutting down MixIO server...") - exec('taskkill /F /IM mixio.exe', function(err, stdout, stderr) { - if (err) { - console.log(err) - } - }) - } - else - { - console.log("Shutting down MixIO server...") - exec('pkill mixio', function(err, stdout, stderr) { - if (err) { - console.log(err) - } - }) + else if(data.toString().indexOf("Error") != -1) + { + console.error("An error occured while initializing MixIO server. Log file: " + process.cwd() + logFileName) + child.unref() + for (var t = Date.now(); Date.now() - t <= 2000;); + process.exit() } } } - else if (args[0] == "version") + // child process to run 'mixio' in background + var logFile = fs.openSync(logFileName, 'a') + if(process.argv[0].indexOf("node") != -1) { - console.log(fs.readFileSync("version.json", "utf8")) - } - else if (args[0] == "update") - { - // use git - console.log("Updating MixIO server...") - exec('git pull', function(err, stdout, stderr) { - if (err) { - console.log(err) - } - else - { - console.log("Update finished.") - } - }) - } - else if (args[0] == "help") - { - console.log("MixIO server help:") - console.log("mixio start: start MixIO server in background.") - console.log("mixio stop: stop MixIO server.") - console.log("mixio debug: start MixIO server in foreground.") - console.log("mixio version: show MixIO server version.") - console.log("mixio update: update MixIO server.") + var child = spawn(process.argv[0], [process.argv[1], "debug"], { detached: true , stdio:['ignore', logFile, logFile]}) + parent_exit(child) } else { - console.log("Invalid parameter(s). Use \"mixio help\" for help.") + var child = spawn(process.argv[0], [process.argv[1], "debug"], { detached: true , stdio:['ignore', logFile, logFile]}) + parent_exit(child) } } +var stopMixIO = function(){ + // kill 'mixio' process if it is running + if(process.argv[0].indexOf("node") != -1) + { + if(process.platform == "win32") + { + console.log("Shutting down MixIO server...") + exec('taskkill /F /IM node.exe', function(err, stdout, stderr) { + if (err) { + console.log(err) + } + }) + } + else + { + console.log("Shutting down MixIO server...") + exec('pkill node', function(err, stdout, stderr) { + if (err) { + console.log(err) + } + }) + } + } + else + { + if(process.platform == "win32") + { + console.log("Shutting down MixIO server...") + exec('taskkill /F /IM mixio.exe', function(err, stdout, stderr) { + if (err) { + console.log(err) + } + }) + } + else + { + console.log("Shutting down MixIO server...") + exec('pkill mixio', function(err, stdout, stderr) { + if (err) { + console.log(err) + } + }) + } + } +} + +init(function(res){ + if(res) + { + configPath = "config/config.json" + configs = fs.readFileSync(configPath); + configs = JSON.parse(configs.toString()); + + STORAGE_ENGINE = configs["STORAGE_ENGINE"] + + + MYSQL_HOST = configs["MYSQL_HOST"] + MYSQL_USER = configs["MYSQL_USER"] + MYSQL_PASS = configs["MYSQL_PASS"] + MYSQL_DB = configs["MYSQL_DB"] + MYSQL_PORT = configs["MYSQL_PORT"] + + MAX_MESSAGE_PER_USER = configs["MAX_MESSAGE_PER_USER"] + MAX_MESSAGE_PER_SECOND = configs["MAX_MESSAGE_PER_SECOND"] + if (args.length > 1 || (args.length == 0 && process.platform != "win32")) { + console.log("Invalid parameter(s). Use \"mixio help\" for help.") + } else { + var show = function(){ + if(args.length == 0){ + // wait for user input, 1 for start, 2 for stop, 3 for autoStart, 4 for remove autoStart + console.log("1. Start MixIO server") + console.log("2. Stop MixIO server") + console.log("3. Set MixIO server to auto start") + console.log("4. Remove MixIO server from auto start") + console.log("5. Exit") + var rl = readline.createInterface({ + input: process.stdin, + output: process.stdout + }) + rl.question("Please select an option: ", function(answer) { + rl.close() + if (answer == "1") { + startMixIO() + } else if (answer == "2") { + stopMixIO() + } else if (answer == "3") { + var child = spawn("schtasks", ["/create", "/sc", "onlogon", "/tn", "MixIO", "/tr", process.execPath + " start", "/rl", "highest", "/f"]) + child.stdout.on('data', function(data) { + // encode to ANSI + console.log(iconv.decode(data, 'cp936').toString()) + }) + child.stderr.on('data', function(data) { + // encode to ANSI + console.log(iconv.decode(data, 'cp936').toString()) + }) + child.on("close", function() { + show(); + }) + + + } else if (answer == "4") { + var child = spawn("schtasks", ["/delete", "/tn", "MixIO", "/f"]) + child.stdout.on('data', function(data) { + // encode to ANSI + console.log(iconv.decode(data, 'cp936').toString()) + }) + child.stderr.on('data', function(data) { + // encode to ANSI + console.log(iconv.decode(data, 'cp936').toString()) + }) + child.on("close", function() { + show(); + }) + } else if (answer == "5") { + process.exit() + } else { + console.log("Invalid option.") + } + }) + } + else if (args[0] == "debug") + { + if(res){ + daemon_start() + startOnce() + } + } + else if (args[0] == "start") + { + startMixIO() + + } + else if (args[0] == "stop") + { + stopMixIO() + } + else if (args[0] == "version") + { + console.log(VERSION) + } + else if (args[0] == "install" && process.platform == "linux") + { + var install_shell = ` + service=" + [UNIT] + Description=MixIO.Service + After=network.target + StartLimitIntervalSec=0 + + [Service] + Type=forking + Restart=always + RestartSec=1 + WorkingDirectory="`+ process.argv[0].slice(0,process.argv[0].lastIndexOf("/"))+`" + ExecStart=`+ process.argv[0].slice(0,process.argv[0].lastIndexOf("/"))+`/mixio start + ExecStop=`+ process.argv[0].slice(0,process.argv[0].lastIndexOf("/"))+`/mixio stop + + [Install] + WantedBy=multi-user.target + " + echo "${service}" > /etc/systemd/system/mixio.service + ` + //exec shell + exec(install_shell, function(err, stdout){ + if(err) + console.log(err) + else + console.log(stdout) + }) + } + else if (args[0] == "help") + { + console.log("MixIO server help:") + console.log("mixio start: start MixIO server in background.") + console.log("mixio stop: stop MixIO server.") + console.log("mixio debug: start MixIO server in foreground.") + console.log("mixio version: show MixIO server version.") + if(process.platform == "linux") + console.log("mixio install: install MixIO service.") + } + else + { + console.log("Invalid parameter(s). Use \"mixio help\" for help.") + } + } + show(); + } + } +}) + + //MixIO diff --git a/package-lock.json b/package-lock.json index 2668464..e0ca4aa 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,12 +13,15 @@ "express": "^4.17.2", "express-session": "^1.17.2", "forever-monitor": "^3.0.3", + "fs-extra": "^11.1.0", + "iconv-lite": "^0.6.3", "jquery": "^3.6.0", "js-md5": "^0.7.3", "jsdom": "^19.0.0", "mqtt": "^4.3.7", "mysql8": "^2.17.3", "net": "^1.0.2", + "readline": "^1.3.0", "sqlite3": "^5.0.2", "websocket-stream": "^5.5.2" }, @@ -633,7 +636,7 @@ }, "node_modules/at-least-node": { "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/at-least-node/-/at-least-node-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", "dev": true, "engines": { @@ -755,6 +758,17 @@ "ms": "2.0.0" } }, + "node_modules/body-parser/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -1429,18 +1443,6 @@ "iconv-lite": "^0.6.2" } }, - "node_modules/encoding/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "optional": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmmirror.com/end-of-stream/-/end-of-stream-1.4.4.tgz", @@ -2073,18 +2075,16 @@ "dev": true }, "node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.0.tgz", + "integrity": "sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==", "dependencies": { - "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" }, "engines": { - "node": ">=10" + "node": ">=14.14" } }, "node_modules/fs-minipass": { @@ -2386,11 +2386,11 @@ } }, "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" + "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { "node": ">=0.10.0" @@ -2761,7 +2761,6 @@ "version": "6.1.0", "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.1.0.tgz", "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, "dependencies": { "universalify": "^2.0.0" }, @@ -3909,6 +3908,36 @@ "pkg-fetch": "lib-es5/bin.js" } }, + "node_modules/pkg-fetch/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/pkg/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/posix-character-classes": { "version": "0.1.1", "resolved": "https://registry.npmmirror.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz", @@ -4093,6 +4122,17 @@ "node": ">= 0.8" } }, + "node_modules/raw-body/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/rc": { "version": "1.2.8", "resolved": "https://registry.npmmirror.com/rc/-/rc-1.2.8.tgz", @@ -4161,6 +4201,11 @@ "safe-buffer": "~5.1.0" } }, + "node_modules/readline": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/readline/-/readline-1.3.0.tgz", + "integrity": "sha512-k2d6ACCkiNYz222Fs/iNze30rRJ1iIicW7JuX/7/cozvih6YCkFZH+J6mAFDVgv0dRBaAyr4jDqC95R2y4IADg==" + }, "node_modules/regex-not": { "version": "1.0.2", "resolved": "https://registry.npmmirror.com/regex-not/-/regex-not-1.0.2.tgz", @@ -5216,7 +5261,6 @@ "version": "2.0.0", "resolved": "https://registry.npmmirror.com/universalify/-/universalify-2.0.0.tgz", "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true, "engines": { "node": ">= 10.0.0" } @@ -5438,17 +5482,6 @@ "node": ">=12" } }, - "node_modules/whatwg-encoding/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/whatwg-mimetype": { "version": "3.0.0", "resolved": "https://registry.npmmirror.com/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", @@ -6177,7 +6210,7 @@ }, "at-least-node": { "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/at-least-node/-/at-least-node-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", "dev": true }, @@ -6275,6 +6308,14 @@ "requires": { "ms": "2.0.0" } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } } } }, @@ -6818,17 +6859,6 @@ "optional": true, "requires": { "iconv-lite": "^0.6.2" - }, - "dependencies": { - "iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - } } }, "end-of-stream": { @@ -7360,12 +7390,10 @@ "dev": true }, "fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.0.tgz", + "integrity": "sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==", "requires": { - "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" @@ -7618,11 +7646,11 @@ } }, "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "requires": { - "safer-buffer": ">= 2.1.2 < 3" + "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "ieee754": { @@ -7915,7 +7943,6 @@ "version": "6.1.0", "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.1.0.tgz", "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, "requires": { "graceful-fs": "^4.1.6", "universalify": "^2.0.0" @@ -8793,6 +8820,20 @@ "prebuild-install": "6.1.4", "resolve": "^1.22.0", "stream-meter": "^1.0.4" + }, + "dependencies": { + "fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + } } }, "pkg-fetch": { @@ -8809,6 +8850,20 @@ "semver": "^7.3.5", "tar-fs": "^2.1.1", "yargs": "^16.2.0" + }, + "dependencies": { + "fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + } } }, "posix-character-classes": { @@ -8948,6 +9003,16 @@ "http-errors": "2.0.0", "iconv-lite": "0.4.24", "unpipe": "1.0.0" + }, + "dependencies": { + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + } } }, "rc": { @@ -9011,6 +9076,11 @@ } } }, + "readline": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/readline/-/readline-1.3.0.tgz", + "integrity": "sha512-k2d6ACCkiNYz222Fs/iNze30rRJ1iIicW7JuX/7/cozvih6YCkFZH+J6mAFDVgv0dRBaAyr4jDqC95R2y4IADg==" + }, "regex-not": { "version": "1.0.2", "resolved": "https://registry.npmmirror.com/regex-not/-/regex-not-1.0.2.tgz", @@ -9872,8 +9942,7 @@ "universalify": { "version": "2.0.0", "resolved": "https://registry.npmmirror.com/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" }, "unpipe": { "version": "1.0.0", @@ -10055,16 +10124,6 @@ "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", "requires": { "iconv-lite": "0.6.3" - }, - "dependencies": { - "iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - } } }, "whatwg-mimetype": { diff --git a/package.json b/package.json index 94da8a3..553bb46 100644 --- a/package.json +++ b/package.json @@ -5,12 +5,15 @@ "express": "^4.17.2", "express-session": "^1.17.2", "forever-monitor": "^3.0.3", + "fs-extra": "^11.1.0", + "iconv-lite": "^0.6.3", "jquery": "^3.6.0", "js-md5": "^0.7.3", "jsdom": "^19.0.0", "mqtt": "^4.3.7", "mysql8": "^2.17.3", "net": "^1.0.2", + "readline": "^1.3.0", "sqlite3": "^5.0.2", "websocket-stream": "^5.5.2" }, diff --git a/pkg_tools/linux/install.sh b/pkg_tools/linux/install.sh deleted file mode 100644 index f0ac52c..0000000 --- a/pkg_tools/linux/install.sh +++ /dev/null @@ -1,18 +0,0 @@ -service=" -[Unit] -Description=MixIO Service -After=network.target -StartLimitIntervalSec=0 - -[Service] -Type=forking -Restart=always -RestartSec=1 -WorkingDirectory="$(pwd)" -ExecStart="$(pwd)"/mixio start -ExecStop="$(pwd)"/mixio stop - -[Install] -WantedBy=multi-user.target -" -echo "${service}" > /etc/systemd/system/mixio.service \ No newline at end of file diff --git a/pkg_tools/mixio.empty.db b/pkg_tools/mixio.empty.db deleted file mode 100644 index c90a3b36199e5382d32a63c684e4cc639740eeea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 172032 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 J)1?ad{{h&Mglhl* diff --git a/pkg_tools/reserve/1.db b/pkg_tools/reserve/1.db deleted file mode 100644 index a5da3551f1447ddbc9b34a602fb1da311c12f335..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12288 zcmeI#O-sWt7zgmQ6QzTyw;?G!p9l|Id7xtgn-c2dgK zS}vyB!`3k7j^HGmYmd{`T6>Y^a-eqhK4#icr`y#&&o?m(S<2!~HjVx(hSj{a$Tr)C zmCY=}4FtdA@t_{B)y_bLwG6=@1qGq1iRW$Rs^x1o-8GTRvP@rg@5xjwYQ8`>{MJc4 zLBk}Dc_1dj_4!CRepJVgV%K-#G2QdAU7w4bM1*djPVcL=J+s}bb90sSqd))x5P$## uAOHafKmY;|fB*y_u*U+(|M&QE@oNx(00bZa0SG_<0uX=z1Rwx`M&KLop=00x diff --git a/pkg_tools/reserve/2.db b/pkg_tools/reserve/2.db deleted file mode 100644 index a5da3551f1447ddbc9b34a602fb1da311c12f335..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12288 zcmeI#O-sWt7zgmQ6QzTyw;?G!p9l|Id7xtgn-c2dgK zS}vyB!`3k7j^HGmYmd{`T6>Y^a-eqhK4#icr`y#&&o?m(S<2!~HjVx(hSj{a$Tr)C zmCY=}4FtdA@t_{B)y_bLwG6=@1qGq1iRW$Rs^x1o-8GTRvP@rg@5xjwYQ8`>{MJc4 zLBk}Dc_1dj_4!CRepJVgV%K-#G2QdAU7w4bM1*djPVcL=J+s}bb90sSqd))x5P$## uAOHafKmY;|fB*y_u*U+(|M&QE@oNx(00bZa0SG_<0uX=z1Rwx`M&KLop=00x diff --git a/pkg_tools/reserve/3.db b/pkg_tools/reserve/3.db deleted file mode 100644 index a5da3551f1447ddbc9b34a602fb1da311c12f335..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12288 zcmeI#O-sWt7zgmQ6QzTyw;?G!p9l|Id7xtgn-c2dgK zS}vyB!`3k7j^HGmYmd{`T6>Y^a-eqhK4#icr`y#&&o?m(S<2!~HjVx(hSj{a$Tr)C zmCY=}4FtdA@t_{B)y_bLwG6=@1qGq1iRW$Rs^x1o-8GTRvP@rg@5xjwYQ8`>{MJc4 zLBk}Dc_1dj_4!CRepJVgV%K-#G2QdAU7w4bM1*djPVcL=J+s}bb90sSqd))x5P$## uAOHafKmY;|fB*y_u*U+(|M&QE@oNx(00bZa0SG_<0uX=z1Rwx`M&KLop=00x diff --git a/pkg_tools/reserve/4.db b/pkg_tools/reserve/4.db deleted file mode 100644 index c868d785273766815e314790738025b05ba4fac9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12288 zcmeI2%Wl&^6hQ5y4-!>LZ@9orfhLp_nL;q{VfrhAyhm7!;{#iIWl` zQ4rz}_y88bnq@zM(p7!~30Uz1T!*xRG_6!;HlRC^;~9_d@%6E#nNhO*AXjZVsQMj0>VDqzDlNVFk7zY=_0G4;?mOFaA+Ksk$P}FYb;(Z$R1?2%W3EAeVO$v*!6?3^xUvv9ub)#QL&1p2sPx{AHfknDkAa~5W>0-_%3q{K^ z3--F5&6~@1I=|%cm#l0)ZI#Gq&sZ45* zejWg%5=AwrVyJLyqr1F78Yj@mH(sFkyg(&hpm81`c#nqnd4XQ?0_mJUL*IFUKJWrP zWFaiyas&UJGr+r$I^}-LyRcER^d&9uuDF|^wep&^js}T6y4C` zh8ovz`3a-?O&?(_so(GumN;7f{{;6~&;S}h184vZpaC?12G9T+Km%w14WNPl#lU$n LI4O4jvXJ@(Rb(F5 diff --git a/pkg_tools/reserve/5.db b/pkg_tools/reserve/5.db deleted file mode 100644 index a5da3551f1447ddbc9b34a602fb1da311c12f335..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12288 zcmeI#O-sWt7zgmQ6QzTyw;?G!p9l|Id7xtgn-c2dgK zS}vyB!`3k7j^HGmYmd{`T6>Y^a-eqhK4#icr`y#&&o?m(S<2!~HjVx(hSj{a$Tr)C zmCY=}4FtdA@t_{B)y_bLwG6=@1qGq1iRW$Rs^x1o-8GTRvP@rg@5xjwYQ8`>{MJc4 zLBk}Dc_1dj_4!CRepJVgV%K-#G2QdAU7w4bM1*djPVcL=J+s}bb90sSqd))x5P$## uAOHafKmY;|fB*y_u*U+(|M&QE@oNx(00bZa0SG_<0uX=z1Rwx`M&KLop=00x diff --git a/pkg_tools/reserve/6.db b/pkg_tools/reserve/6.db deleted file mode 100644 index a5da3551f1447ddbc9b34a602fb1da311c12f335..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12288 zcmeI#O-sWt7zgmQ6QzTyw;?G!p9l|Id7xtgn-c2dgK zS}vyB!`3k7j^HGmYmd{`T6>Y^a-eqhK4#icr`y#&&o?m(S<2!~HjVx(hSj{a$Tr)C zmCY=}4FtdA@t_{B)y_bLwG6=@1qGq1iRW$Rs^x1o-8GTRvP@rg@5xjwYQ8`>{MJc4 zLBk}Dc_1dj_4!CRepJVgV%K-#G2QdAU7w4bM1*djPVcL=J+s}bb90sSqd))x5P$## uAOHafKmY;|fB*y_u*U+(|M&QE@oNx(00bZa0SG_<0uX=z1Rwx`M&KLop=00x diff --git a/pkg_tools/reserve/7.db b/pkg_tools/reserve/7.db deleted file mode 100644 index a5da3551f1447ddbc9b34a602fb1da311c12f335..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12288 zcmeI#O-sWt7zgmQ6QzTyw;?G!p9l|Id7xtgn-c2dgK zS}vyB!`3k7j^HGmYmd{`T6>Y^a-eqhK4#icr`y#&&o?m(S<2!~HjVx(hSj{a$Tr)C zmCY=}4FtdA@t_{B)y_bLwG6=@1qGq1iRW$Rs^x1o-8GTRvP@rg@5xjwYQ8`>{MJc4 zLBk}Dc_1dj_4!CRepJVgV%K-#G2QdAU7w4bM1*djPVcL=J+s}bb90sSqd))x5P$## uAOHafKmY;|fB*y_u*U+(|M&QE@oNx(00bZa0SG_<0uX=z1Rwx`M&KLop=00x diff --git a/pkg_tools/reserve/8.db b/pkg_tools/reserve/8.db deleted file mode 100644 index a5da3551f1447ddbc9b34a602fb1da311c12f335..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12288 zcmeI#O-sWt7zgmQ6QzTyw;?G!p9l|Id7xtgn-c2dgK zS}vyB!`3k7j^HGmYmd{`T6>Y^a-eqhK4#icr`y#&&o?m(S<2!~HjVx(hSj{a$Tr)C zmCY=}4FtdA@t_{B)y_bLwG6=@1qGq1iRW$Rs^x1o-8GTRvP@rg@5xjwYQ8`>{MJc4 zLBk}Dc_1dj_4!CRepJVgV%K-#G2QdAU7w4bM1*djPVcL=J+s}bb90sSqd))x5P$## uAOHafKmY;|fB*y_u*U+(|M&QE@oNx(00bZa0SG_<0uX=z1Rwx`M&KLop=00x diff --git a/pkg_tools/reserve/filter.json b/pkg_tools/reserve/filter.json deleted file mode 100644 index 7a73a41..0000000 --- a/pkg_tools/reserve/filter.json +++ /dev/null @@ -1,2 +0,0 @@ -{ -} \ No newline at end of file diff --git a/pkg_tools/win-x64-pkg.sh b/pkg_tools/win-x64-pkg.sh index 69e5ab0..bbd9758 100644 --- a/pkg_tools/win-x64-pkg.sh +++ b/pkg_tools/win-x64-pkg.sh @@ -5,31 +5,13 @@ version="{ \"platform\":\"win-x64\", \"node-version\":\"16\" }" -gitignore="config/* -logs/* -storage/* -" cd ../../ rm -rf mixio_win_x64 mkdir mixio_win_x64 -cd mixio_win_x64 -echo "${version}" > version.json -echo "${gitignore}" > .gitignore -mkdir logs -mkdir storage -mkdir config -cd ../ chmod -R 777 mixio cd mixio npm install pkg -t node16-win-x64 package.json mv -f mixio ../mixio_win_x64/ -cp -r config ../mixio_win_x64/ -cd pkg_tools -cp win/autoStart.bat ../../mixio_win_x64/ -cp win/removeAutoStart.bat ../../mixio_win_x64/ -cp win/start.bat ../../mixio_win_x64/ -cp mixio.empty.db ../../mixio_win_x64/storage/mixio.db -cp -r reserve ../../mixio_win_x64/storage/ -cd ../../ +cd ../ chmod -R 777 mixio_win_x64 diff --git a/pkg_tools/win/autoStart.bat b/pkg_tools/win/autoStart.bat deleted file mode 100644 index 71319a5..0000000 --- a/pkg_tools/win/autoStart.bat +++ /dev/null @@ -1,4 +0,0 @@ -@echo off -cd /d %~dp0 -reg add hklm\software\microsoft\windows\currentversion\run /v MixIO /t reg_sz /d "%cd%\start.bat" -pause \ No newline at end of file diff --git a/pkg_tools/win/removeAutoStart.bat b/pkg_tools/win/removeAutoStart.bat deleted file mode 100644 index 6f0f770..0000000 --- a/pkg_tools/win/removeAutoStart.bat +++ /dev/null @@ -1,4 +0,0 @@ -@echo off -cd /d %~dp0 -reg delete hklm\software\microsoft\windows\currentversion\run /v MixIO -pause \ No newline at end of file diff --git a/pkg_tools/win/start.bat b/pkg_tools/win/start.bat deleted file mode 100644 index a140175..0000000 --- a/pkg_tools/win/start.bat +++ /dev/null @@ -1,4 +0,0 @@ -@echo off -cd /d %~dp0 -mixio.exe start -pause \ No newline at end of file diff --git a/storage/.gitignore b/storage/.gitignore deleted file mode 100644 index 970d3eb..0000000 --- a/storage/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -reserve/ -mixio.db \ No newline at end of file diff --git a/version.json b/version.json deleted file mode 100644 index 247bf88..0000000 --- a/version.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "version":"1.10.0", - "platform":"src", - "node-version":"16" -}