Commit 074ebbb9 by Kornkitt Poolsup

Initial commit

parent eda6e9cc
POSTGRESQL_URI=postgres://postgres:dv5399e63b5f37073783a0d4756c86f8@kube-dev.nexpie.io:31633/nexpieio
POSTGRESQL_URI=postgres://postgres:jojyOwFJijidI2wmbMLDDWWkxx51uO1ps7L7wOnrLHgQB5VyQjfzUoYKUjosnNHE@n1.node.nexpie.io:31742/nexpieio
POSTGRESQL_SCHEMA=deviceregistry
const { Database, aql } = require("arangojs");
const fs = require('fs')
// netpie
//const db = new Database('http://root:2f1eba7d5917b7d217eed24b592a262e@127.0.0.1:49529');
// nexpie
const db = new Database('http://root:15388a8e461d9deb07c2b78cfc2d2a01@127.0.0.1:37529');
db.useDatabase('deviceregistry');
function dumpCollection(collectionname,filename) {
if (!filename) {
filename = collectionname;
}
return new Promise(async (resolve, reject) => {
try {
const bares = await db.query(`
FOR rec IN ${collectionname}
RETURN rec
`);
console.log(`Dumping ${collectionname} ...`);
var logger = fs.createWriteStream(`./data/arango-${filename}.json`, {});
let first = true;
for await (let ba of bares) {
let batext = JSON.stringify(ba);
if (first) {
logger.write(`[${batext}\n`) // append string to your file
}
else {
logger.write(`,${batext}\n`) // append string to your file
}
first = false;
}
logger.write(`]`) // append string to your file
logger.end();
resolve();
} catch (err) {
reject(err.message);
}
});
}
async function doit() {
await dumpCollection('device').catch(e=>{
console.log(e);
});
await dumpCollection('flowagent').catch(e=>{
console.log(e);
});
await dumpCollection('flowagentsession').catch(e=>{
console.log(e);
});
await dumpCollection('group').catch(e=>{
console.log(e);
});
await dumpCollection('membership').catch(e=>{
console.log(e);
});
await dumpCollection('project').catch(e=>{
console.log(e);
});
await dumpCollection('trigger','devicetrigger').catch(e=>{
console.log(e);
});
}
doit();
const { Database, aql } = require("arangojs");
const fs = require('fs')
// old arangoA
// netpie
//const db = new Database('http://root:2f1eba7d5917b7d217eed24b592a262e@127.0.0.1:48529');
//nexpie
const db = new Database('http://root:15388a8e461d9deb07c2b78cfc2d2a01@127.0.0.1:39529');
db.useDatabase('shadowdb');
function dumpCollection(collectionname,filename) {
if (!filename) {
filename = collectionname;
}
return new Promise(async (resolve, reject) => {
try {
const bares = await db.query(`
FOR rec IN ${collectionname}
RETURN rec
`);
console.log(`Dumping ${collectionname} ...`);
var logger = fs.createWriteStream(`./data/arango-${filename}.json`, {});
let first = true;
for await (let ba of bares) {
let batext = JSON.stringify(ba);
if (first) {
logger.write(`[${batext}\n`) // append string to your file
}
else {
logger.write(`,${batext}\n`) // append string to your file
}
first = false;
}
logger.write(`]`) // append string to your file
logger.end();
resolve();
} catch (err) {
reject(err.message);
}
});
}
async function doit() {
// await dumpCollection('apitoken').catch(e=>{
// console.log(e);
// });
await dumpCollection('trigger','shadowtrigger').catch(e=>{
console.log(e);
});
// await dumpCollection('usertoken').catch(e=>{
// console.log(e);
// });
}
doit();
const { Database, aql } = require("arangojs");
const fs = require('fs')
// old arangoA
//const db = new Database('http://root:2f1eba7d5917b7d217eed24b592a262e@127.0.0.1:48529');
const db = new Database('http://root:15388a8e461d9deb07c2b78cfc2d2a01@127.0.0.1:39529');
db.useDatabase('tokenregistry');
function dumpCollection(collectionname) {
return new Promise(async (resolve, reject) => {
try {
const bares = await db.query(`
FOR rec IN ${collectionname}
RETURN rec
`);
console.log(`Dumping ${collectionname} ...`);
var logger = fs.createWriteStream(`./data/arango-${collectionname}.json`, {});
let first = true;
for await (let ba of bares) {
let batext = JSON.stringify(ba);
if (first) {
logger.write(`[${batext}\n`) // append string to your file
}
else {
logger.write(`,${batext}\n`) // append string to your file
}
first = false;
}
logger.write(`]`) // append string to your file
logger.end();
resolve();
} catch (err) {
reject(err.message);
}
});
}
async function doit() {
// await dumpCollection('apitoken').catch(e=>{
// console.log(e);
// });
await dumpCollection('devicetoken').catch(e=>{
console.log(e);
});
// await dumpCollection('usertoken').catch(e=>{
// console.log(e);
// });
}
doit();
require('dotenv').config();
//------ ไม่ใช้ ---------------------
const PGPool = require('pg').Pool;
......@@ -11,13 +12,15 @@ function readJSON(filename) {
return jdata;
}
let POSTGRESQL_URI = process.env['POSTGRESQL_URI'];
let arango_device = readJSON('data/arango-device.json');
let arango_flowagent = readJSON('data/arango-flowagent.json');
let arango_flowagentsession = readJSON('data/arango-flowagentsession.json');
let arango_group = readJSON('data/arango-group.json');
let arango_membership = readJSON('data/arango-membership.json');
let arango_project = readJSON('data/arango-project.json');
let arango_trigger = readJSON('data/arango-triggerdevice.json');
let arango_trigger = readJSON('data/arango-devicetrigger.json');
let arango_devicetoken = readJSON('data/arango-devicetoken.json'); //-------------
......@@ -50,7 +53,7 @@ let hashtab_pg_project = convertToHashTable(pg_project, 'projectid');
let hashtab_pg_trigger = convertToHashTable(pg_trigger, 'deviceid');
let url = require('url');
let a = url.parse('postgres://yugabyte:VGh1LCBGZWIgMjQsIDIwMjIgMTI6MTU6MzIgUE0K@localhost:35433/deviceregistry');
let a = url.parse(POSTGRESQL_URI);
let u = a.auth.split(':');
......
......@@ -20,7 +20,7 @@ let arango_flowagentsession = readJSON('data/arango-flowagentsession.json');
let arango_group = readJSON('data/arango-group.json');
let arango_membership = readJSON('data/arango-membership.json');
let arango_project = readJSON('data/arango-project.json');
let arango_trigger = readJSON('data/arango-triggerdevice.json');
let arango_trigger = readJSON('data/arango-devicetrigger.json');
let arango_devicetoken = readJSON('data/arango-devicetoken.json'); //-------------
......@@ -191,14 +191,17 @@ function manageTags(B,A,type) {
let out = {};
for (let key in B) {
// Append Type to object (DEVICE, PROJECT, GROUP)
B[key]["type"] = type;
// Check if obj A has key in B and has tags or not
if (A[key] && A[key].tags) {
for (let k in A[key].tags) {
if (B[key].tags && !B[key].tags[k]) {
out[key] = B[key];
}
}
} else if (!A[key] && B[key].tags) {
} else if (!A[key] || !A[key].tags) {
out[key] = B[key];
}
}
......@@ -258,10 +261,10 @@ for (let k in alldata) {
}
for (let key in obj.tags) {
cmd = (cmd == '' ? CMDHEAD : ',') + ` ('${k}','${obj.type}','${key}','${obj.tags[key]}') \n`;
cmd = (cmd == '' ? CMDHEAD : (cmd + ',')) + ` ('${k}','${obj.type}','${key}','${obj.tags[key]}')`;
}
// console.log(cmd);
console.log(cmd);
cmd += `ON CONFLICT (objectid, key) DO NOTHING `;
cmdlist.push(cmd);
......
......@@ -14,7 +14,7 @@ let arango_flowagentsession = readJSON('data/arango-flowagentsession.json');
let arango_group = readJSON('data/arango-group.json');
let arango_membership = readJSON('data/arango-membership.json');
let arango_project = readJSON('data/arango-project.json');
let arango_trigger = readJSON('data/arango-triggerdevice.json');
let arango_trigger = readJSON('data/arango-devicetrigger.json');
let pg_device = readJSON('data/pg-Device.json');
let pg_flowchannel = readJSON('data/pg-Flowchannel.json');
......@@ -89,6 +89,7 @@ let diff_flowsession = minus(hashtab_arango_flowagentsession, hashtab_pg_flowses
console.log(`มี flowsession ใหม่เพิ่มมา : ${objlen(diff_flowsession)}`);
let diff_group = minus(hashtab_arango_group, hashtab_pg_group);
//console.log(diff_group)
console.log(`มี group ใหม่เพิ่มมา : ${objlen(diff_group)}`);
let diff_membership = minus(hashtab_arango_membership, hashtab_pg_membership); // pg billing membership
......
......@@ -19,7 +19,7 @@ let arango_flowagentsession = readJSON('data/arango-flowagentsession.json');
let arango_group = readJSON('data/arango-group.json');
let arango_membership = readJSON('data/arango-membership.json');
let arango_project = readJSON('data/arango-project.json');
let arango_trigger = readJSON('data/arango-triggerdevice.json');
let arango_trigger = readJSON('data/arango-devicetrigger.json');
let pg_device = readJSON('data/pg-Device.json');
let pg_flowchannel = readJSON('data/pg-Flowchannel.json');
......@@ -159,6 +159,17 @@ function minus(B,A) {
return out;
}
function cleanData(data) {
// check if existing in any Project or not
let out = {};
for (let key in data) {
if (hashtab_arango_project[data[key].projectid]) {
out[key] = data[key];
}
}
return out;
}
function objlen(obj) {
if (obj) {
return Object.keys(obj).length;
......@@ -200,7 +211,7 @@ for (let k in diff_project) {
let projectid = obj._key;
let name = obj.name.trim().replace(/'/g,"''");
let description = obj.description.replace(/'/g,"''");
let description = obj.description? obj.description.replace(/'/g,"''") : obj.description;
let hashtag = hashtag_obj_to_str(obj.tag);
let createdtime = toDateStr(obj.createdtime);
let allow_apicall = obj.quota.apicall;
......
......@@ -19,7 +19,7 @@ let arango_flowagentsession = readJSON('data/arango-flowagentsession.json');
let arango_group = readJSON('data/arango-group.json');
let arango_membership = readJSON('data/arango-membership.json');
let arango_project = readJSON('data/arango-project.json');
let arango_trigger = readJSON('data/arango-triggerdevice.json');
let arango_trigger = readJSON('data/arango-devicetrigger.json');
let pg_device = readJSON('data/pg-Device.json');
let pg_flowchannel = readJSON('data/pg-Flowchannel.json');
......@@ -82,12 +82,10 @@ function toSQLDateStr(dt) {
return dt.toISOString().replace(/T/, ' ').replace(/\..+/, '')+'+00';
}
else if(typeof(dt)=='number') {
return new Date(dt).toISOString().replace(/T/, ' ').replace(/\..+/,
'')+'+00';
return new Date(dt).toISOString().replace(/T/, ' ').replace(/\..+/, '')+'+00';
}
else if(typeof(dt)=='string' && !isNaN(new Date(dt).getDate()) ) {
return new Date(dt).toISOString().replace(/T/, ' ').replace(/\..+/,
'')+'+00';
return new Date(dt).toISOString().replace(/T/, ' ').replace(/\..+/, '')+'+00';
}
else {
return undefined
......@@ -161,6 +159,18 @@ function minus(B,A) {
return out;
}
function cleanData(data) {
// check if existing in any Project and Group or not
let out = {};
for (let key in data) {
if (hashtab_arango_project[data[key].projectid]
&& hashtab_arango_group[data[key].groupid]) {
out[key] = data[key];
}
}
return out;
}
function objlen(obj) {
if (obj) {
return Object.keys(obj).length;
......@@ -186,19 +196,29 @@ let fixnow = 1640842624896;
let cmdlist = [];
let diff_group = minus(hashtab_arango_group, hashtab_pg_group);
let clean_group = cleanData(hashtab_arango_group);
let diff_group = minus(clean_group, hashtab_pg_group);
console.log(`มี group ใหม่เพิ่มมา : ${objlen(diff_group)}`);
console.log(diff_group);
let cmd = '';
let CMDHEAD = `INSERT INTO ${POSTGRESQL_SCHEMA}."Group" (groupid, name, description,projectid, hashtag,createdtime) VALUES \n`;
let c = 0;
let summary = ''
for (let k in diff_group) {
let obj = diff_group[k];
if (!obj._key || obj._key.length!=13) continue;
// check if projectid does not exist
if (!hashtab_pg_project[obj.projectid]) {
summary += `skip ${obj._key} as projectid ${obj.projectid} is missing \n`;
continue;
}
if (!obj.name) obj.name = '';
if (!obj.description) obj.description = '';
if (!obj.createdtime) obj.createdtime = Date.now();
......@@ -236,3 +256,4 @@ console.log('start syncing database ....')
//console.log(cmdlist)
doit(cmdlist);
console.log(summary);
\ No newline at end of file
......@@ -20,7 +20,7 @@ let arango_flowagentsession = readJSON('data/arango-flowagentsession.json');
let arango_group = readJSON('data/arango-group.json');
let arango_membership = readJSON('data/arango-membership.json');
let arango_project = readJSON('data/arango-project.json');
let arango_trigger = readJSON('data/arango-triggerdevice.json');
let arango_trigger = readJSON('data/arango-devicetrigger.json');
let arango_devicetoken = readJSON('data/arango-devicetoken.json'); //-------------
......@@ -170,6 +170,18 @@ function minus(B,A) {
return out;
}
function cleanData(data) {
// check if existing in any Project and Group or not
let out = {};
for (let key in data) {
if (hashtab_arango_project[data[key].projectid]) {
out[key] = data[key];
}
}
return out;
}
function objlen(obj) {
if (obj) {
return Object.keys(obj).length;
......@@ -195,9 +207,12 @@ let fixnow = 1640842624896;
let cmdlist = [];
let diff_device = minus(hashtab_arango_device, hashtab_pg_device);
let clean_device = cleanData(hashtab_arango_device);
let diff_device = minus(clean_device, hashtab_pg_device);
console.log(`มี device ใหม่เพิ่มมา : ${objlen(diff_device)}`);
console.log(diff_device)
// console.log(diff_device)
// process.exit();
......
......@@ -19,7 +19,7 @@ let arango_flowagentsession = readJSON('data/arango-flowagentsession.json');
let arango_group = readJSON('data/arango-group.json');
let arango_membership = readJSON('data/arango-membership.json');
let arango_project = readJSON('data/arango-project.json');
let arango_trigger = readJSON('data/arango-triggerdevice.json');
let arango_trigger = readJSON('data/arango-devicetrigger.json');
let pg_device = readJSON('data/pg-Device.json');
let pg_flowchannel = readJSON('data/pg-Flowchannel.json');
......@@ -191,6 +191,7 @@ console.log(diff_membership)
let cmd = '';
let CMDHEAD = `INSERT INTO ${POSTGRESQL_SCHEMA}."Membership" (userid, projectid, username, level, createdtime) VALUES \n`;
let summary = '';
let c = 0;
for (let k in diff_membership) {
......@@ -199,6 +200,12 @@ for (let k in diff_membership) {
//console.log(obj)
//obj.tag='home,bedroom,temp'
if (!hashtab_pg_project[obj.projectid]) {
summary += `skip ${obj._key} as projectid ${obj.projectid} is missing \n`;
continue;
}
let userid = obj.userid;
let projectid = obj.projectid;
let username = obj.username;
......@@ -232,4 +239,5 @@ console.log('start syncing database ....')
doit(cmdlist);
//console.log(cmdlist[0])
console.log(summary);
......@@ -19,8 +19,8 @@ let arango_flowagentsession = readJSON('data/arango-flowagentsession.json');
let arango_group = readJSON('data/arango-group.json');
let arango_membership = readJSON('data/arango-membership.json');
let arango_project = readJSON('data/arango-project.json');
let arango_trigger = readJSON('data/arango-triggerdevice.json');
let arango_shadow_trigger = readJSON('data/arango-triggershadow.json');
let arango_trigger = readJSON('data/arango-devicetrigger.json');
let arango_shadow_trigger = readJSON('data/arango-shadowtrigger.json');
let pg_device = readJSON('data/pg-Device.json');
let pg_flowchannel = readJSON('data/pg-Flowchannel.json');
......
......@@ -20,7 +20,7 @@ let arango_flowagentsession = readJSON('data/arango-flowagentsession.json');
let arango_group = readJSON('data/arango-group.json');
let arango_membership = readJSON('data/arango-membership.json');
let arango_project = readJSON('data/arango-project.json');
let arango_trigger = readJSON('data/arango-triggerdevice.json');
let arango_trigger = readJSON('data/arango-devicetrigger.json');
let arango_devicetoken = readJSON('data/arango-devicetoken.json'); //-------------
......
......@@ -20,7 +20,7 @@ let arango_flowagentsession = readJSON('data/arango-flowagentsession.json');
let arango_group = readJSON('data/arango-group.json');
let arango_membership = readJSON('data/arango-membership.json');
let arango_project = readJSON('data/arango-project.json');
let arango_trigger = readJSON('data/arango-triggerdevice.json');
let arango_trigger = readJSON('data/arango-devicetrigger.json');
let arango_devicetoken = readJSON('data/arango-devicetoken.json'); //-------------
......
File added
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
[{"_key":"1637033496564-FWAG50485009","_id":"flowagentsession/1637033496564-FWAG50485009","_rev":"_eXERRBC---","flowagentid":"FWAG50485009","brokername":"devicebroker-1","createdtime":1656004758577}
,{"_key":"1646631351876-FWAG49984926","_id":"flowagentsession/1646631351876-FWAG49984926","_rev":"_eXERWMa---","flowagentid":"FWAG49984926","brokername":"devicebroker-2","createdtime":1656004763876}
,{"_key":"1642487656530-FWAG29637383","_id":"flowagentsession/1642487656530-FWAG29637383","_rev":"_eYAXq0W---","flowagentid":"FWAG29637383","brokername":"devicebroker-0","createdtime":1656256836454}
,{"_key":"FWAG493400931656286203462","_id":"flowagentsession/FWAG493400931656286203462","_rev":"_eYHXyAi---","flowagentid":"FWAG49340093","brokername":"devicebroker-1","createdtime":1656286203944}
,{"_key":"FWAG493400931656286208381","_id":"flowagentsession/FWAG493400931656286208381","_rev":"_eYHX24m---","flowagentid":"FWAG49340093","brokername":"devicebroker-0","createdtime":1656286208840}
,{"_key":"FWAG493400931656286214035","_id":"flowagentsession/FWAG493400931656286214035","_rev":"_eYHX8Wi---","flowagentid":"FWAG49340093","brokername":"devicebroker-1","createdtime":1656286214537}
[{"_key":"1651162856564-FWAG69935819","_id":"flowagentsession/1651162856564-FWAG69935819","_rev":"_esapVoq--C","flowagentid":"FWAG69935819","brokername":"devicebroker-2","createdtime":1661735755429}
,{"_key":"1657624637737-FWAG85568805","_id":"flowagentsession/1657624637737-FWAG85568805","_rev":"_esdeufm--A","flowagentid":"FWAG85568805","brokername":"devicebroker-1","createdtime":1661747642902}
]
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
[{"flowchannelid":"FWAG83343963","flowchannelsecret":"97PdEwowE!Jed6m~9yu)nx(6Z*4kqq(t","alias":null,"concurrent":3,"projectid":"P000415148283","description":null,"enabled":true,"banned":false,"createdtime":"2022-06-26T15:03:27.755Z","updatedtime":"2022-06-26T15:03:27.755Z"}
[{"flowchannelid":"FWAG83714469","flowchannelsecret":"Of4*R2o*Xwi2bzh*Urv3vh7Dh0GxlspD","alias":"","concurrent":1,"projectid":"P743459160165","description":"","enabled":true,"banned":false,"createdtime":"2020-11-26T08:19:14.000Z","updatedtime":"2022-08-29T07:31:20.117Z"}
,{"flowchannelid":"FWAG14589450","flowchannelsecret":"Xw^zk54L2rYo!h2tH9wQT9g-cFx240De","alias":"Deer NODE-RED","concurrent":1,"projectid":"P735288284814","description":"flow.nexpie.com:1888","enabled":true,"banned":false,"createdtime":"2019-08-19T04:52:41.000Z","updatedtime":"2022-08-29T07:31:20.117Z"}
,{"flowchannelid":"FWAG63923231","flowchannelsecret":"N0yZpd7-GXxIzox6ix$-DI5yN_75KVAt","alias":"","concurrent":1,"projectid":"P262869564287","description":"Debug: piebox-demo.nexpie.com","enabled":true,"banned":false,"createdtime":"2020-07-24T06:51:54.000Z","updatedtime":"2022-08-29T07:31:20.117Z"}
,{"flowchannelid":"FWAG32637008","flowchannelsecret":"Psxfy~#jZDrko38Md7co5sCsL~2yK3Vj","alias":"Main Dashboard","concurrent":30,"projectid":"P084122770682","description":"","enabled":true,"banned":false,"createdtime":"2021-03-10T08:15:50.000Z","updatedtime":"2022-08-29T07:31:20.117Z"}
,{"flowchannelid":"FWAG94980536","flowchannelsecret":"***xuPFVnMktx$(xYkVo273JsI1QqadM","alias":"","concurrent":1,"projectid":"P118051779427","description":"","enabled":true,"banned":false,"createdtime":"2021-02-17T07:32:46.000Z","updatedtime":"2022-08-29T07:31:20.117Z"}
,{"flowchannelid":"FWAG09915669","flowchannelsecret":"d#Pkg7bSvQxy9!5S2QMOdpiVEWjZFPfH","alias":"","concurrent":1,"projectid":"P879547678978","description":"","enabled":true,"banned":false,"createdtime":"2020-12-02T07:49:10.000Z","updatedtime":"2022-08-29T07:31:20.117Z"}
,{"flowchannelid":"FWAG03425788","flowchannelsecret":"h#kzHbFs!-N2_VycXnC_vHlxal4m1V-4","alias":"","concurrent":2,"projectid":"P749259663075","description":"","enabled":true,"banned":false,"createdtime":"2021-03-28T01:42:43.000Z","updatedtime":"2022-08-29T07:31:20.117Z"}
,{"flowchannelid":"FWAG85568805","flowchannelsecret":"fUiJ-MQaQ)EWu~rinEtmaYgg+c~QglFW","alias":"","concurrent":1,"projectid":"P357833769455","description":"INETRaspi","enabled":true,"banned":false,"createdtime":"2020-03-19T07:22:51.000Z","updatedtime":"2022-08-29T07:31:20.117Z"}
,{"flowchannelid":"FWAG03119466","flowchannelsecret":"Rz!ak!OXrGT77z1a1_IuSYpplXC0*THH","alias":"","concurrent":1,"projectid":"P262869564287","description":"Debug: piebox @chamac","enabled":true,"banned":false,"createdtime":"2020-05-02T07:00:23.000Z","updatedtime":"2022-08-29T07:31:20.117Z"}
,{"flowchannelid":"FWAG37017657","flowchannelsecret":"JCD#!6DWqq-ncKjty3US(zs7!M(BMR3X","alias":"","concurrent":1,"projectid":"P798183658017","description":"","enabled":true,"banned":false,"createdtime":"2021-03-17T06:39:35.000Z","updatedtime":"2022-08-29T07:31:20.117Z"}
,{"flowchannelid":"FWAG10470823","flowchannelsecret":"^5KnGy@N5mwF.V@QDR$luaHuF4YEOhz-","alias":"","concurrent":1,"projectid":"P357833769455","description":"Box1","enabled":true,"banned":false,"createdtime":"2020-03-28T04:41:50.000Z","updatedtime":"2022-08-29T07:31:20.117Z"}
,{"flowchannelid":"FWAG81626137","flowchannelsecret":"VH9loXn(YybsQsvvZ0Wc-s~AERS!s7XQ","alias":"","concurrent":1,"projectid":"P879547678978","description":"","enabled":true,"banned":false,"createdtime":"2020-12-02T07:55:37.000Z","updatedtime":"2022-08-29T07:31:20.117Z"}
,{"flowchannelid":"FWAG10147460","flowchannelsecret":"j$F~PC_JhsYHIci)R8aKDQKsssgw0XgM","alias":"","concurrent":1,"projectid":"P629452869138","description":"","enabled":true,"banned":false,"createdtime":"2020-10-21T02:21:47.000Z","updatedtime":"2022-08-29T07:31:20.117Z"}
,{"flowchannelid":"FWAG78763425","flowchannelsecret":"XGGiZP#RO$UXemhQcUdU#YfHzewD_(tu","alias":"","concurrent":1,"projectid":"P974762281924","description":"","enabled":true,"banned":false,"createdtime":"2021-02-24T14:59:14.000Z","updatedtime":"2022-08-29T07:31:20.117Z"}
,{"flowchannelid":"FWAG56088694","flowchannelsecret":"Ozp0mZuXFEE$qW9WO0SLs7TpIM2Uxb(a","alias":"","concurrent":10,"projectid":"P798183658017","description":"","enabled":true,"banned":false,"createdtime":"2021-03-10T06:36:54.000Z","updatedtime":"2022-08-29T07:31:20.117Z"}
,{"flowchannelid":"FWAG93345363","flowchannelsecret":"nm1ri3ZbeWp1vIqgmtq!LCIaa9xd_lwD","alias":"","concurrent":1,"projectid":"P907287889503","description":"","enabled":true,"banned":false,"createdtime":"2021-01-19T15:48:15.000Z","updatedtime":"2022-08-29T07:31:20.117Z"}
,{"flowchannelid":"FWAG69083855","flowchannelsecret":"r9s~5U&IBZMjs%)79DMQqjGOVrGVV6%*","alias":"","concurrent":1,"projectid":"P330352770003","description":"avilon vm 203.151.152.59:1880","enabled":true,"banned":false,"createdtime":"2020-04-08T03:00:07.000Z","updatedtime":"2022-08-29T07:31:20.117Z"}
,{"flowchannelid":"FWAG04168594","flowchannelsecret":"cUFgcm2WJtoR-Btx(p9yas-!OHN-vAXK","alias":"","concurrent":1,"projectid":"P769655864390","description":"","enabled":true,"banned":false,"createdtime":"2020-12-02T07:33:24.000Z","updatedtime":"2022-08-29T07:31:20.117Z"}
]
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
......@@ -11,4 +11,9 @@ user บน dev-portal พี่โคลนมาจาภnetpie ทั้งà
ดังนั้น ตองสามารถเอา account portal.netpie.io มาล็อคอิน dev-portal.netpie.io ได้
45fcb178-af0e-42e5-a115-aa3531300ba8
\ No newline at end of file
45fcb178-af0e-42e5-a115-aa3531300ba8
//----------------------------
dump group ไม่ครบ
dump device ไม่ครบ
group ที่ไม่มี project
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment