pairmesh / pairmesh Goto Github PK
View Code? Open in Web Editor NEWThe next-generation security Mesh VPN implementation based on Golang.
Home Page: https://www.pairmesh.com
License: Apache License 2.0
The next-generation security Mesh VPN implementation based on Golang.
Home Page: https://www.pairmesh.com
License: Apache License 2.0
Please answer these questions before submitting your issue. Thanks!
Just started pairmesh and logged in. Got:
jiachen@Jiachens-Mini pairmesh % sudo ./bin/pairmesh -k <pmkey>
2022-03-19T00:05:56.356-0700 INFO Startup node successfully
2022-03-19T00:05:56.356-0700 INFO Driver initialized successfully
2022-03-19T00:06:36.492-0700 INFO Receive login callback {"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhY2Nlc3NfdXVpZCI6IjYzYWI1ZWVmLWI1YzgtNDI4OC1iM2NkLTdmYTg2ZjFjZDhmOSIsImF1dGhfa2V5X2lkIjowLCJhdXRob3JpemVkIjp0cnVlLCJleHAiOjE2NDg2NzM1OTYsIm1hY2hpbmVfaWQiOiJmOWMwZDc3YmQxODI4OTFlN2E0YjRkYjNiMDhkMWQ4NDMzOTY0NjA3MTJlMDZlNGIyMzJlNTQ5NjIyZWM0N2FjIiwidXNlcl9pZCI6IjE0OTE3MDI1NjQ5NTYxNDc3MTIiLCJ2ZW5kb3IiOjB9.SjiVSOVhiwUAd0YxZ0HmgFVXkb1C0NcmR2XqHEsd3IM"}
2022-03-19T00:06:36.494-0700 INFO Save the latest configuration {"path": "/Users/jiachen/Library/Application Support/pairmesh/pairmesh.conf", "config": {"token":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhY2Nlc3NfdXVpZCI6IjYzYWI1ZWVmLWI1YzgtNDI4OC1iM2NkLTdmYTg2ZjFjZDhmOSIsImF1dGhfa2V5X2lkIjowLCJhdXRob3JpemVkIjp0cnVlLCJleHAiOjE2NDg2NzM1OTYsIm1hY2hpbmVfaWQiOiJmOWMwZDc3YmQxODI4OTFlN2E0YjRkYjNiMDhkMWQ4NDMzOTY0NjA3MTJlMDZlNGIyMzJlNTQ5NjIyZWM0N2FjIiwidXNlcl9pZCI6IjE0OTE3MDI1NjQ5NTYxNDc3MTIiLCJ2ZW5kb3IiOjB9.SjiVSOVhiwUAd0YxZ0HmgFVXkb1C0NcmR2XqHEsd3IM","fast_key":"","dh_key":{"Private":"AwyNLVFXOG85So6vSpmY+WrA0TSTk27n4H+ts9vJQ0s=","Public":"uHgRD2zB2aHK3s/mvk4FmQJWA+kwQt2urwtZpF6MvlU="},"port":61683,"machine_id":"f9c0d77bd182891e7a4b4db3b08d1d843396460712e06e4b232e549622ec47ac","once_alert":false}}
2022-03-19T00:06:37.878-0700 INFO Preflight request successful
2022-03-19T00:06:37.935-0700 INFO Set virtual device address finished {"address": "100.68.80.110"}
2022-03-19T00:06:37.935-0700 INFO Driver preflight finished
2022-03-19T00:06:37.935-0700 INFO All background threads running
2022-03-19T00:06:39.410-0700 INFO Relay client noise protocol handshake is finished
2022-03-19T00:06:39.730-0700 INFO Relay client noise protocol handshake is finished
2022-03-19T00:06:48.086-0700 INFO ExternalAddressChanged {"address": "207.6.111.156:61683"}
2022-03-19T00:11:10.080-0700 ERROR Dial remote address failed {"address": "207.6.111.156:55889", "error": "dial udp 0.0.0.0:61683->207.6.111.156:55889: connect: address already in use"}
2022-03-19T00:11:10.080-0700 ERROR Dial remote address failed {"address": "192.168.50.129:34542", "error": "dial udp 0.0.0.0:61683->192.168.50.129:34542: connect: address already in use"}
2022-03-19T00:11:40.080-0700 ERROR Dial remote address failed {"address": "207.6.111.156:55889", "error": "dial udp 0.0.0.0:61683->207.6.111.156:55889: connect: address already in use"}
2022-03-19T00:11:40.080-0700 ERROR Dial remote address failed {"address": "192.168.50.129:34542", "error": "dial udp 0.0.0.0:61683->192.168.50.129:34542: connect: address already in use"}
2022-03-19T00:12:10.082-0700 ERROR Dial remote address failed {"address": "207.6.111.156:55889", "error": "dial udp 0.0.0.0:61683->207.6.111.156:55889: connect: address already in use"}
2022-03-19T00:12:10.082-0700 ERROR Dial remote address failed {"address": "192.168.50.129:34542", "error": "dial udp 0.0.0.0:61683->192.168.50.129:34542: connect: address already in use"}
2022-03-19T00:12:40.081-0700 ERROR Dial remote address failed {"address": "207.6.111.156:55889", "error": "dial udp 0.0.0.0:61683->207.6.111.156:55889: connect: address already in use"}
2022-03-19T00:12:40.081-0700 ERROR Dial remote address failed {"address": "192.168.50.129:34542", "error": "dial udp 0.0.0.0:61683->192.168.50.129:34542: connect: address already in use"}
2022-03-19T00:13:10.081-0700 ERROR Dial remote address failed {"address": "207.6.111.156:55889", "error": "dial udp 0.0.0.0:61683->207.6.111.156:55889: connect: address already in use"}
2022-03-19T00:13:10.081-0700 ERROR Dial remote address failed {"address": "192.168.50.129:34542", "error": "dial udp 0.0.0.0:61683->192.168.50.129:34542: connect: address already in use"}
2022-03-19T00:13:40.081-0700 ERROR Dial remote address failed {"address": "207.6.111.156:55889", "error": "dial udp 0.0.0.0:61683->207.6.111.156:55889: connect: address already in use"}
2022-03-19T00:13:40.081-0700 ERROR Dial remote address failed {"address": "192.168.50.129:34542", "error": "dial udp 0.0.0.0:61683->192.168.50.129:34542: connect: address already in use"}
2022-03-19T00:14:10.081-0700 ERROR Dial remote address failed {"address": "207.6.111.156:55889", "error": "dial udp 0.0.0.0:61683->207.6.111.156:55889: connect: address already in use"}
2022-03-19T00:14:10.084-0700 ERROR Dial remote address failed {"address": "192.168.50.129:34542", "error": "dial udp 0.0.0.0:61683->192.168.50.129:34542: connect: address already in use"}
2022-03-19T00:14:40.082-0700 ERROR Dial remote address failed {"address": "207.6.111.156:55889", "error": "dial udp 0.0.0.0:61683->207.6.111.156:55889: connect: address already in use"}
2022-03-19T00:14:40.082-0700 ERROR Dial remote address failed {"address": "192.168.50.129:34542", "error": "dial udp 0.0.0.0:61683->192.168.50.129:34542: connect: address already in use"}
2022-03-19T00:15:10.082-0700 ERROR Dial remote address failed {"address": "207.6.111.156:55889", "error": "dial udp 0.0.0.0:61683->207.6.111.156:55889: connect: address already in use"}
2022-03-19T00:15:10.085-0700 ERROR Dial remote address failed {"address": "192.168.50.129:34542", "error": "dial udp 0.0.0.0:61683->192.168.50.129:34542: connect: address already in use"}
Use GitHub actions to build releases automatically.
The current context menu is default to Chinese and it's better to provide a menu item to support switch to other languages. Further more, we can detect system language as the initial language.
Please answer these questions before submitting your issue. Thanks!
What did you do?
Try to start PairMesh.exe binary.
What did you expect to see?
Shoud be able to start and see icon in systray
What did you see instead?
Program exited with error notes
What version of PairMesh are you using (PairMesh --version
)?
PairMesh v0.0.1 on Windows 11, AMD Ryzen 5 3500U CPU
Is your feature request related to a problem? Please describe:
Describe the feature you'd like:
Describe alternatives you've considered:
Teachability, Documentation, Adoption, Migration Strategy:
Is your feature request related to a problem? Please describe:
Describe the feature you'd like:
Describe alternatives you've considered:
Teachability, Documentation, Adoption, Migration Strategy:
env:
CentOS Linux release 7.9.2009 (Core)
Linux 3.10.0-1160.21.1.el7.x86_64 #1 SMP Tue Mar 16 18:28:22 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
make error:
gofmt (simplify)
GO111MODULE=on CGO_ENABLED=1 GOOS=linux GOARCH=amd64 go build -ldflags '-w -s -X "github.com/pairmesh/pairmesh/version.GitHash=a39b637" -X "github.com/pairmesh/pairmesh/version.GitBranch=master" ' -o bin/pairmesh ./cmd/pairmesh
cmd/pairmesh/main.go:17:8: //go:build comment without // +build comment
make: *** [pairmesh] error 1
Is your feature request related to a problem? Please describe:
Describe the feature you'd like:
Describe alternatives you've considered:
Teachability, Documentation, Adoption, Migration Strategy:
Reference: https://github.com/pingcap/tidb
[![LICENSE](https://img.shields.io/github/license/pingcap/tidb.svg)](https://github.com/pingcap/tidb/blob/master/LICENSE)
[![Language](https://img.shields.io/badge/Language-Go-blue.svg)](https://golang.org/)
[![Build Status](https://travis-ci.org/pingcap/tidb.svg?branch=master)](https://travis-ci.org/pingcap/tidb)
[![Go Report Card](https://goreportcard.com/badge/github.com/pingcap/tidb)](https://goreportcard.com/report/github.com/pingcap/tidb)
[![GitHub release](https://img.shields.io/github/tag/pingcap/tidb.svg?label=release)](https://github.com/pingcap/tidb/releases)
[![GitHub release date](https://img.shields.io/github/release-date/pingcap/tidb.svg)](https://github.com/pingcap/tidb/releases)
[![CircleCI Status](https://circleci.com/gh/pingcap/tidb.svg?style=shield)](https://circleci.com/gh/pingcap/tidb)
[![Coverage Status](https://codecov.io/gh/pingcap/tidb/branch/master/graph/badge.svg)](https://codecov.io/gh/pingcap/tidb)
[![GoDoc](https://img.shields.io/badge/Godoc-reference-blue.svg)](https://godoc.org/github.com/pingcap/tidb)
Please answer these questions before submitting your issue. Thanks!
What did you do?
Just keep starting and stopping pairmesh
What did you expect to see?
virtual network interfaces should be automatically cleaned up
What did you see instead?
jiachen@Jiachens-Mini pairmesh % ifconfig
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
options=1203<RXCSUM,TXCSUM,TXSTATUS,SW_TIMESTAMP>
inet 127.0.0.1 netmask 0xff000000
inet6 ::1 prefixlen 128
inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1
nd6 options=201<PERFORMNUD,DAD>
gif0: flags=8010<POINTOPOINT,MULTICAST> mtu 1280
stf0: flags=0<> mtu 1280
anpi1: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
options=400<CHANNEL_IO>
ether 4e:af:59:d2:5e:25
inet6 fe80::4caf:59ff:fed2:5e25%anpi1 prefixlen 64 scopeid 0x4
nd6 options=201<PERFORMNUD,DAD>
media: none
status: inactive
anpi0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
options=400<CHANNEL_IO>
ether 4e:af:59:d2:5e:24
inet6 fe80::4caf:59ff:fed2:5e24%anpi0 prefixlen 64 scopeid 0x5
nd6 options=201<PERFORMNUD,DAD>
media: none
status: inactive
en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
options=50b<RXCSUM,TXCSUM,VLAN_HWTAGGING,AV,CHANNEL_IO>
ether 14:98:77:76:9a:3a
nd6 options=201<PERFORMNUD,DAD>
media: autoselect (none)
status: inactive
en4: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
options=400<CHANNEL_IO>
ether 4e:af:59:d2:5e:04
nd6 options=201<PERFORMNUD,DAD>
media: none
status: inactive
en5: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
options=400<CHANNEL_IO>
ether 4e:af:59:d2:5e:05
nd6 options=201<PERFORMNUD,DAD>
media: none
status: inactive
en2: flags=8963<UP,BROADCAST,SMART,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
options=460<TSO4,TSO6,CHANNEL_IO>
ether 36:bb:a6:33:61:c0
media: autoselect <full-duplex>
status: inactive
en3: flags=8963<UP,BROADCAST,SMART,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
options=460<TSO4,TSO6,CHANNEL_IO>
ether 36:bb:a6:33:61:c4
media: autoselect <full-duplex>
status: inactive
ap1: flags=8802<BROADCAST,SIMPLEX,MULTICAST> mtu 1500
options=400<CHANNEL_IO>
ether 36:98:77:82:e7:99
media: autoselect
status: inactive
en1: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
options=6463<RXCSUM,TXCSUM,TSO4,TSO6,CHANNEL_IO,PARTIAL_CSUM,ZEROINVERT_CSUM>
ether 14:98:77:82:e7:99
inet6 fe80::40e:593:1af2:21e6%en1 prefixlen 64 secured scopeid 0xc
inet 192.168.0.128 netmask 0xffffff00 broadcast 192.168.0.255
nd6 options=201<PERFORMNUD,DAD>
media: autoselect
status: active
en6: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
options=6467<RXCSUM,TXCSUM,VLAN_MTU,TSO4,TSO6,CHANNEL_IO,PARTIAL_CSUM,ZEROINVERT_CSUM>
ether c8:d9:d2:dc:36:eb
nd6 options=201<PERFORMNUD,DAD>
media: autoselect (none)
status: inactive
bridge0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
options=63<RXCSUM,TXCSUM,TSO4,TSO6>
ether 36:bb:a6:33:61:c0
Configuration:
id 0:0:0:0:0:0 priority 0 hellotime 0 fwddelay 0
maxage 0 holdcnt 0 proto stp maxaddr 100 timeout 1200
root id 0:0:0:0:0:0 priority 0 ifcost 0 port 0
ipfilter disabled flags 0x0
member: en2 flags=3<LEARNING,DISCOVER>
ifmaxaddr 0 port 9 priority 0 path cost 0
member: en3 flags=3<LEARNING,DISCOVER>
ifmaxaddr 0 port 10 priority 0 path cost 0
nd6 options=201<PERFORMNUD,DAD>
media: <unknown type>
status: inactive
awdl0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
options=400<CHANNEL_IO>
ether 46:d2:2f:f3:f7:84
inet6 fe80::44d2:2fff:fef3:f784%awdl0 prefixlen 64 scopeid 0xf
nd6 options=201<PERFORMNUD,DAD>
media: autoselect
status: active
llw0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
options=400<CHANNEL_IO>
ether 46:d2:2f:f3:f7:84
inet6 fe80::44d2:2fff:fef3:f784%llw0 prefixlen 64 scopeid 0x10
nd6 options=201<PERFORMNUD,DAD>
media: autoselect
status: active
utun0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1380
inet6 fe80::1407:b59a:58ff:88f0%utun0 prefixlen 64 scopeid 0x11
nd6 options=201<PERFORMNUD,DAD>
utun1: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 2000
inet6 fe80::c023:f6c7:52:81b%utun1 prefixlen 64 scopeid 0x12
nd6 options=201<PERFORMNUD,DAD>
utun2: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1000
inet6 fe80::ce81:b1c:bd2c:69e%utun2 prefixlen 64 scopeid 0x13
nd6 options=201<PERFORMNUD,DAD>
PairMesh --version
)?let appearanceName = statusItem?.button?.effectiveAppearance.name.rawValue.lowercased()
let isDarkMode = appearanceName?.contains("dark")
reference https://stackoverflow.com/questions/62685948/macos-big-sur-detect-dark-menu-bar-system-tray
请问,pairmesh有没有其他的社区交流方式,比如qq群,微信群,电报群,等等,可以更快捷的交流,谢谢!
Is your feature request related to a problem? Please describe:
Describe the feature you'd like:
Describe alternatives you've considered:
Teachability, Documentation, Adoption, Migration Strategy:
Please answer these questions before submitting your issue. Thanks!
sudo bin/pairmesh -k <secrety-key>
What did you expect to see?
success
What did you see instead?
/opt/pairmesh/pairmesh: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.32' not found (required by /opt/pairmesh/pairmesh)
/opt/pairmesh/pairmesh: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.34' not found (required by /opt/pairmesh/pairmesh)
ubuntu@VM-0-3-ubuntu /o/pairmesh> lsb_release
PairMesh --version
)?Reference:
https://cloud.google.com/apis/design/errors
Is your feature request related to a problem? Please describe:
Describe the feature you'd like:
Describe alternatives you've considered:
Teachability, Documentation, Adoption, Migration Strategy:
Is your feature request related to a problem? Please describe:
Describe the feature you'd like:
Describe alternatives you've considered:
Teachability, Documentation, Adoption, Migration Strategy:
Seems the renewal gouroutine doesn't be called.
https://github.com/pairmesh/pairmesh/blob/master/node/driver/renew_cred.go#L37
Build failed:
D:\devel\pairmesh\pairmesh> go build -o bin/PairMesh.exe -ldflags "-s -w -H=windowsgui -X github.com/pairmesh/pairmesh/version.GitHash=$(git describe --no-match --always --dirty) -X github.com/pairmesh/pairmesh/version.GitBranch=$(git rev-parse --abbrev-ref HEAD)" ./cmd/pairmesh
# github.com/pairmesh/pairmesh/node/entry
node\entry\entry_gui.go:268:13: app.baseApp.auto.IsEnabled undefined (type *autostart.App has no field or method IsEnabled)
node\entry\entry_gui.go:269:22: app.baseApp.auto.Disable undefined (type *autostart.App has no field or method Disable)
node\entry\entry_gui.go:271:22: app.baseApp.auto.Enable undefined (type *autostart.App has no field or method Enable)
node\entry\entry_gui.go:280:91: app.baseApp.auto.IsEnabled undefined (type *autostart.App has no field or method IsEnabled)
node\entry\gui_windows.go:119:31: app.baseApp.auto.IsEnabled undefined (type *autostart.App has no field or method IsEnabled)
node\entry\gui_windows.go:263:31: app.baseApp.auto.IsEnabled undefined (type *autostart.App has no field or method IsEnabled)
PS D:\devel\pairmesh\pairmesh> cd go-build\cb\cb976874e6582a71ec640a70371007756633f7bf7c07bd69d26161438c20729a-d(pairmesh_windows)
Is your feature request related to a problem? Please describe:
Describe the feature you'd like:
Whenever node greps primary server information for itself, the portal would check if the server is up online.
If yes, then just return this valid server.
If not, then automatically choose another valid one as the node's new primary relay server.
Describe alternatives you've considered:
N/A
Teachability, Documentation, Adoption, Migration Strategy:
As described above
Is your feature request related to a problem? Please describe:
Describe the feature you'd like:
Describe alternatives you've considered:
Teachability, Documentation, Adoption, Migration Strategy:
Is your feature request related to a problem? Please describe:
env variable is not reliable. MacOS and Windows have different ways of setting and handling env. And it's not a sustainable way of deploying to many users.
Describe the feature you'd like:
Let's YAML the nodes, just like how we YAML portal and relay
Describe alternatives you've considered:
N/A
Teachability, Documentation, Adoption, Migration Strategy:
N/A
Is your feature request related to a problem? Please describe:
Describe the feature you'd like:
Describe alternatives you've considered:
Teachability, Documentation, Adoption, Migration Strategy:
As the pull request #88 had implemented switch language from context menu. But the default language default to Chinese, and which may make the new users confuse if they cannot read Chinese.
It's better to detect language for first time of PairMesh bootstrap. I found a golang package to detect various operation system and distributions locale.
It's better to use NSMutableAttributedString to render device menu item instead of implementing a MenuLabelView
.
Is your feature request related to a problem? Please describe:
Describe the feature you'd like:
Describe alternatives you've considered:
Teachability, Documentation, Adoption, Migration Strategy:
Reference:
Is your feature request related to a problem? Please describe:
Describe the feature you'd like:
Describe alternatives you've considered:
Teachability, Documentation, Adoption, Migration Strategy:
Is your feature request related to a problem? Please describe:
Describe the feature you'd like:
Describe alternatives you've considered:
Teachability, Documentation, Adoption, Migration Strategy:
Is your feature request related to a problem? Please describe:
Describe the feature you'd like:
Describe alternatives you've considered:
Teachability, Documentation, Adoption, Migration Strategy:
Is your feature request related to a problem? Please describe:
Describe the feature you'd like:
Describe alternatives you've considered:
Teachability, Documentation, Adoption, Migration Strategy:
It's better to build docker images automatically to make PairMesh easy to deploy.
Is your feature request related to a problem? Please describe:
N/A
Describe the feature you'd like:
A better documented config guidelines for service bootcamps and setups
Describe alternatives you've considered:
N/A
Teachability, Documentation, Adoption, Migration Strategy:
N/A
Please answer these questions before submitting your issue. Thanks!
What did you do?
ctrl + c to a running pairmesh node.
What did you expect to see?
Should be pretty fast to shut and do the clean up.
What did you see instead?
Taking quite a while.
What version of PairMesh are you using (PairMesh --version
)?
0.0.1 on Ubuntu 21.10, amd64, kernel 5.13.0-37-generic
Please answer these questions before submitting your issue. Thanks!
./bin/pairmesh -k <key>
Normal running
2022-04-04T05:40:29.736+0800 WARN Client connection transporter terminated {"addr": "139.198.29.15:2328"}
panic: send on closed channel
goroutine 38 [running]:
github.com/pairmesh/pairmesh/internal/relay.(*Client).Send(0xc000280300, 0x2, {0x961280, 0xc000280440})
/home/lonng/devel/pairmesh/pairmesh/internal/relay/client.go:63 +0xb8
github.com/pairmesh/pairmesh/node/mesh.(*Manager).probePeers(0xc00059c280)
/home/lonng/devel/pairmesh/pairmesh/node/mesh/manager.go:273 +0x37c
github.com/pairmesh/pairmesh/node/mesh.(*Manager).Tick(...)
/home/lonng/devel/pairmesh/pairmesh/node/mesh/manager.go:167
github.com/pairmesh/pairmesh/node/driver.(*NodeDriver).pullPeerGraph(0xc00051c120, {0x96bef8, 0xc0002de540})
/home/lonng/devel/pairmesh/pairmesh/node/driver/pull_peers.go:84 +0x445
created by github.com/pairmesh/pairmesh/node/driver.(*NodeDriver).Drive
/home/lonng/devel/pairmesh/pairmesh/node/driver/driver.go:218 +0x191
PairMesh --version
)?Is your feature request related to a problem? Please describe:
Describe the feature you'd like:
Describe alternatives you've considered:
Teachability, Documentation, Adoption, Migration Strategy:
As title descripted, the webui only for portal service and It's better to move the directory to portal
as a sub-directory.
Is your feature request related to a problem? Please describe:
Describe the feature you'd like:
Describe alternatives you've considered:
Teachability, Documentation, Adoption, Migration Strategy:
密钥指定-k 在你们后台看不到设备呢
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.