Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
53d5239
bak
timzaak May 16, 2023
6b272bb
bak it
timzaak May 17, 2023
b36e6e0
bak
timzaak May 17, 2023
93f7878
bak
timzaak May 18, 2023
9b51fb4
bak
timzaak May 19, 2023
efb1f0e
bak it
timzaak May 21, 2023
0a2afef
bak it
timzaak May 22, 2023
6a2d0db
bak it
timzaak May 22, 2023
1f57958
bak it
timzaak May 22, 2023
c260b5c
bak
timzaak May 22, 2023
b36fef8
bak it
timzaak May 23, 2023
9675aff
bak it
timzaak May 23, 2023
0affc15
bak
timzaak May 26, 2023
d6999e8
bak it
timzaak May 26, 2023
95d35c4
bak
timzaak May 29, 2023
9495735
bak
timzaak May 30, 2023
1a13166
bak it
timzaak May 30, 2023
dff2128
bak it
timzaak May 31, 2023
ab40b03
bak it
timzaak Jun 4, 2023
7b85909
bak it
timzaak Jun 5, 2023
0015113
merge main branch
timzaak Jun 5, 2023
1146a56
[backend]refact pagination
timzaak Jun 6, 2023
db9e19b
bug fix: ID
timzaak Jun 6, 2023
b58207a
fix 2, IntId trigger bug
timzaak Jun 7, 2023
1a16bb9
[admin-web]add network protocol
timzaak Jun 7, 2023
52605dc
fix 3, IntID bug fix all
timzaak Jun 7, 2023
edcf323
client can run now
timzaak Jun 7, 2023
7b4ba3f
fix 4, IntID bug
timzaak Jun 8, 2023
fad145e
fix 1: add MQTT acl check
timzaak Jun 8, 2023
4b85a51
fix 2, mqtt add node_id to auth, change topic `client` to `client\{no…
timzaak Jun 9, 2023
12dd21e
bak, mqtt reconnect
timzaak Jun 9, 2023
2d8d6b3
mqtt reconnect
timzaak Jun 10, 2023
0ac7a0d
update rmqtt version
timzaak Jun 12, 2023
b63cdfd
fix mqtt auth plain text combine error
timzaak Jun 12, 2023
bc93e9d
fix 3, mqtt change channel topic
timzaak Jun 12, 2023
886e310
fix, tcp server create, bind tcp6 only
timzaak Jun 13, 2023
ab56873
bak, add nodeType to config.proto for TCP
timzaak Jun 13, 2023
03b5455
finish add node_type to proto
timzaak Jun 13, 2023
84efccd
fix3, tcp
timzaak Jun 14, 2023
046fdf5
1. disable network protocol change. 2. fix client should change peers…
timzaak Jun 14, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions admin-web/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions admin-web/src/api/authAPI.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import http from "./http";
import http, {ID} from "./http";

export function checkSampleTokenCorrect(token: string) {
return http.post('/auth/st/check', {
Expand All @@ -7,7 +7,7 @@ export function checkSampleTokenCorrect(token: string) {
}


export function getSSOInviteCode(networkId:number):Promise<string> {
export function getSSOInviteCode(networkId:ID):Promise<string> {
// @ts-ignore
return http.get<string>(`/auth/oauth/${networkId}/device_code`, {
// @ts-ignore
Expand Down
5 changes: 4 additions & 1 deletion admin-web/src/api/http.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,13 @@ const instance = axios.create({
timeout: 5 * 1000,
})


export type ID = string;
export interface CreatedSuccess {
id: number
id: ID
}


export interface Page<T> {
total: number
list: T[]
Expand Down
17 changes: 11 additions & 6 deletions admin-web/src/api/networkAPI.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,19 @@
import http, {CreatedSuccess, Page} from "./http";
import http, {CreatedSuccess, ID, Page} from "./http";

export enum NetworkProtocol {
TCP, UDP
}

export interface NetworkSetting {
mtu: number,
keepAlive: number,
dns?: string,
port: number,
protocol: NetworkProtocol,
}

export interface Network {
id: number,
id: ID,
name: string,
setting: NetworkSetting,
createdAt: string,
Expand All @@ -31,25 +35,26 @@ export function networkList(name: string | null, page: number = 1, pageSize: num
export interface CreateNetwork {
name: string,
addressRange: string,
protocol: NetworkProtocol,
}

export function createNetwork(data: CreateNetwork) {
return http.post<CreatedSuccess>('/network', data)
}

export function updateNetwork(id: number, data: Network) {
export function updateNetwork(id: ID, data: Network) {
return http.put<Network>(`/network/${id}`, data)
}

export function getNetwork(id: number) {
export function getNetwork(id: ID) {
return http.get<Network>(`/network/${id}`).then(r => r.data)
}

export function getNetworkInviteCode(networkId: number) {
export function getNetworkInviteCode(networkId: ID) {
return http.get<string>(`/network/${networkId}/invite_code`).then(r => r.data)
}


export function deleteNetwork(id:number) {
export function deleteNetwork(id:ID) {
return http.delete(`/network/${id}`)
}
18 changes: 9 additions & 9 deletions admin-web/src/api/nodeAPI.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import http, {CreatedSuccess} from "./http";
import http, {CreatedSuccess, ID} from "./http";


export enum NodeStatus {
Expand All @@ -10,11 +10,11 @@ export enum NodeType {
}

export interface Node {
id: number,
id: ID,
nodeType: NodeType,
status: NodeStatus,
setting: NodeSetting,
networkId: number,
networkId: ID,
name: string,
}

Expand All @@ -34,7 +34,7 @@ export interface UpdateNode {
setting: NodeSetting,
}

export function getNodeList(networkId: number, page: number = 1, pageSize: number = 10) {
export function getNodeList(networkId: ID, page: number = 1, pageSize: number = 10) {
return http.get<Node[]>(`/node/${networkId}`, {
params: {
page,
Expand All @@ -50,22 +50,22 @@ export interface CreateNode {
setting: NodeSetting,
}

export function createNode(networkId: number, data: CreateNode) {
export function createNode(networkId: ID, data: CreateNode) {
return http.post<CreatedSuccess>(`/node/${networkId}`, data)
}

export function getNode(networkId: number, nodeId: number) {
export function getNode(networkId: ID, nodeId: ID) {
return http.get<Node>(`/node/${networkId}/${nodeId}`).then(r => r.data)
}

export function updateNode(networkId: number, nodeId: number, data: UpdateNode) {
export function updateNode(networkId: ID, nodeId: ID, data: UpdateNode) {
return http.put(`/node/${networkId}/${nodeId}`, data)
}

export function getNodeActiveCode(networkId: number, nodeId: number) {
export function getNodeActiveCode(networkId: ID, nodeId: ID) {
return http.get<string>(`/node/${networkId}/${nodeId}/active_code`).then(r => r.data)
}

export function updateNodeStatus(networkId: number, nodeId: number, status: NodeStatus.Forbid | NodeStatus.Normal) {
export function updateNodeStatus(networkId: ID, nodeId: ID, status: NodeStatus.Forbid | NodeStatus.Normal) {
return http.put(`/node/${networkId}/${nodeId}/status`, {status})
}
20 changes: 17 additions & 3 deletions admin-web/src/view/network/CreateNetworkPage.tsx
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import {Button, Form, Input, message} from "antd";
import {Button, Form, Input, message, Select} from "antd";
import {useIntl} from "react-intl";
import {CreateNetwork, createNetwork} from "../../api/networkAPI";
import {CreateNetwork, createNetwork, NetworkProtocol} from "../../api/networkAPI";
import {useNavigate} from "react-router-dom";


const {Option} = Select;
export function CreateNetworkPage() {
const [form] = Form.useForm<CreateNetwork>()
const navi = useNavigate()
Expand All @@ -23,6 +23,9 @@ export function CreateNetworkPage() {
form={form}
labelCol={{span: 8}}
wrapperCol={{span: 16}}
initialValues={{
protocol: NetworkProtocol.UDP
}}
>
<Form.Item
label={intl.formatMessage({id: 'name'})}
Expand All @@ -40,6 +43,17 @@ export function CreateNetworkPage() {
>
<Input placeholder="10.2.0.0/16"/>
</Form.Item>
<Form.Item
label="Protocol"
required
rules={[{required: true}]}
name="protocol"
>
<Select>
<Option value={NetworkProtocol.TCP}>TCP</Option>
<Option value={NetworkProtocol.UDP}>UDP</Option>
</Select>
</Form.Item>
<Form.Item wrapperCol={{offset: 8, span: 16}}>
<Button type="ghost" onClick={onFinish}>{intl.formatMessage({id: 'submit'})}</Button>
</Form.Item>
Expand Down
20 changes: 16 additions & 4 deletions admin-web/src/view/network/NetworkDetailPage.tsx
Original file line number Diff line number Diff line change
@@ -1,25 +1,27 @@
import {useEffect} from "react";
import {getNetwork, Network, updateNetwork} from "../../api/networkAPI";
import {getNetwork, Network, NetworkProtocol, updateNetwork} from "../../api/networkAPI";
import {useParams} from "react-router-dom";
import {Button, Col, Form, Input, InputNumber, Row} from "antd";
import {Button, Col, Form, Input, InputNumber, message, Row, Select} from "antd";
import {useIntl} from "react-intl";
import {useForm} from "antd/es/form/Form";

const {Option} = Select;

export default function NetworkDetailPage() {
const {networkId} = useParams<{ networkId: string }>()
const intl = useIntl()
const [form] = useForm<Network>()

useEffect(() => {
getNetwork(parseInt(networkId!)).then((d) => {
getNetwork(networkId!).then((d) => {
form.setFieldsValue(d)
})
}, [networkId, form])

const submit = async () => {
const data = await form.validateFields()
await updateNetwork(parseInt(networkId!), data)
await updateNetwork(networkId!, data)
message.info(intl.formatMessage({id: 'result.updateSuccess'}, {'0': intl.formatMessage({id: 'nav.network'})}))
}
return (
<>
Expand Down Expand Up @@ -62,6 +64,15 @@ export default function NetworkDetailPage() {
max={600}/>
</Form.Item>
</Col>
<Col span={8}>
<Form.Item rules={[{required: true}]} name={['setting','protocol']}
label="Protocol">
<Select disabled>
<Option value={NetworkProtocol.TCP}>TCP</Option>
<Option value={NetworkProtocol.UDP}>UDP</Option>
</Select>
</Form.Item>
</Col>
</Row>
</Form>
<div style={{textAlign: 'center', marginTop: '20px'}}>
Expand All @@ -70,6 +81,7 @@ export default function NetworkDetailPage() {
</>
)
}
// add Nodes Navigator, Invite Code
// <Col span={8}>
// <Form.Item name={['setting', 'dns']} label="Default DNS"><Input/></Form.Item>
// </Col>
6 changes: 3 additions & 3 deletions admin-web/src/view/network/NetworkListPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import {deleteNetwork, getNetworkInviteCode, Network, networkList} from "../../a
import {useEffect, useState} from "react";
import DayjsFormat from "../../component/DayjsFormat";
import {Link, useSearchParams} from "react-router-dom";
import {defaultPage, Page} from "../../api/http";
import {defaultPage, ID, Page} from "../../api/http";
import {QRCodeCanvas} from "qrcode.react";
import copy from "copy-to-clipboard";
import {getPersistenceToken, getSSOInviteCode} from "../../api/authAPI";
Expand All @@ -23,13 +23,13 @@ export default function NetworkListPage() {
networkList(name, page).then((d) => setData(d))
}, [name, page])

const showInviteModel = (id: number) => {
const showInviteModel = (id: ID) => {
if((getPersistenceToken()??'').startsWith('Bearer')) {
getSSOInviteCode(id).then(r => setShowSSO(r))
}
getNetworkInviteCode(id).then(setShowModal)
}
const deleteNetworkAction = async (id: number) => {
const deleteNetworkAction = async (id: ID) => {
await deleteNetwork(id)
message.info(intl.formatMessage({id: 'result.deleteSuccess'},
{'0': intl.formatMessage({id: 'nav.network'})}))
Expand Down
4 changes: 2 additions & 2 deletions admin-web/src/view/node/CreateNodePage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ export function CreateNodePage() {
const intl = useIntl()
useEffect(() => {
if (networkId) {
getNetwork(parseInt(networkId)).then(r => setNetwork(r))
getNetwork(networkId).then(r => setNetwork(r))
}
}, [networkId])

Expand All @@ -36,7 +36,7 @@ export function CreateNodePage() {
delete data.ip
}

const {id} = (await createNode(parseInt(networkId as string), data)).data
const {id} = (await createNode(networkId!, data)).data
message.info(intl.formatMessage({id: 'result.createSuccess'}, {'0': intl.formatMessage({id: 'nav.node'})}))
navi(`/network/${networkId}/node/${id}`, {replace: true})
}
Expand Down
5 changes: 2 additions & 3 deletions admin-web/src/view/node/NodeDetailPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -71,8 +71,7 @@ export default function NodeDetailPage() {

useEffect(() => {
if (networkId && nodeId) {
const networkIdNum = parseInt(networkId)
Promise.all([getNetwork(networkIdNum), getNode(networkIdNum, parseInt(nodeId))]).then(r => {
Promise.all([getNetwork(networkId), getNode(networkId, nodeId)]).then(r => {
setNetwork(r[0])
form.setFieldsValue(r[1])
})
Expand All @@ -91,7 +90,7 @@ export default function NodeDetailPage() {
name: data.name,
setting: data.setting,
}
await updateNode(parseInt(networkId as string), parseInt(nodeId as string), updateData)
await updateNode(networkId!, nodeId!, updateData)
message.info(intl.formatMessage({id: 'result.updateSuccess'}, {'0': intl.formatMessage({id: 'nav.node'})}))
}

Expand Down
7 changes: 4 additions & 3 deletions admin-web/src/view/node/NodeListPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,21 +7,22 @@ import {useIntl} from "react-intl";
import {enumToDesc} from "../../local/intl";
import {QRCodeCanvas} from "qrcode.react";
import copy from "copy-to-clipboard";
import {ID} from "../../api/http";

export default function NodeListPage() {
const {networkId} = useParams<{ networkId: string }>()
const [showActiveCode, setShowActiveCode] = useState<string>()
const [data, setData] = useState<Node[]>([])
const intl = useIntl()
useEffect(() => {
getNodeList(parseInt(networkId!)).then((d) => setData(d.data))
getNodeList(networkId!).then((d) => setData(d.data))
}, [networkId])

const showActiveModalAction = async (networkId: number, nodeId: number) => {
const showActiveModalAction = async (networkId: ID, nodeId: ID) => {
const activeCode = await getNodeActiveCode(networkId, nodeId)
setShowActiveCode(activeCode)
}
const updateNodeStatusAction = async (networkId: number, nodeId: number, status: NodeStatus.Forbid | NodeStatus.Normal) => {
const updateNodeStatusAction = async (networkId: ID, nodeId: ID, status: NodeStatus.Forbid | NodeStatus.Normal) => {
await updateNodeStatus(networkId, nodeId, status)
message.info(intl.formatMessage({id: 'result.updateSuccess'}, {'0': intl.formatMessage({id: 'status'})}))
getNodeList(networkId).then((d) => setData(d.data))
Expand Down
3 changes: 2 additions & 1 deletion backend/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,5 @@ If Scala 3 is a good choice?

### TODO

- [ ] create IpArrange util to handle all, should be careful use.
- [ ] create IpArrange util to handle all, should be careful use.
- [ ] needs async runtime(thread pool) to handle push.
3 changes: 3 additions & 0 deletions backend/build.sbt
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,9 @@ Compile / PB.targets := Seq(
)
Compile / PB.protoSources += file("../protobuf")

// zio-json default value needs this
ThisBuild / scalacOptions ++= Seq("-Yretain-trees")

import Dependencies._

lazy val app = project
Expand Down
3 changes: 2 additions & 1 deletion backend/src/main/resources/application.conf
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ mqtt {


# should set keycloak or simple.
# please set this in private.conf wehn develop.
auth {
# ref from keycloak config, you can download it from keycloak/realm/client
#keycloak {
Expand All @@ -47,5 +48,5 @@ auth {
# userId: "admin"
#}
}

# you can set your private config in private.conf file
include "private.conf"
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package com.timzaak.fornet.controller
import com.google.common.base.Charsets
import com.timzaak.fornet.config.AppConfig
import com.timzaak.fornet.controller.auth.AppAuthSupport
import com.timzaak.fornet.dao.{ NetworkDao, NetworkStatus }
import com.timzaak.fornet.dao.{NetworkDao, NetworkStatus}
import com.timzaak.fornet.di.DI.hashId
import com.typesafe.config.Config
import org.hashids.Hashids
Expand Down
Loading