Compare commits
No commits in common. "be36cefd4b69a61b29a2ee2e8d45ebfc626686b2" and "a81869c96d1f54da2154b76f71e747cdfc81d313" have entirely different histories.
be36cefd4b
...
a81869c96d
@ -53,7 +53,7 @@ function getFirstAvailableId(ids: number[]) : number {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function generateNodeData(nodes : NodeData[]) : NodeData | null {
|
function generateNodeData(nodes : NodeData[]) : NodeData | null {
|
||||||
const hostId = getFirstAvailableId(nodes.filter(n => n.groupId == 0).map(n => n.hostId))
|
const hostId = getFirstAvailableId(nodes.map(n => n.hostId))
|
||||||
if(hostId > 255) return null
|
if(hostId > 255) return null
|
||||||
|
|
||||||
const privateKey = generateWireGuardPrivateKey();
|
const privateKey = generateWireGuardPrivateKey();
|
||||||
|
|||||||
@ -1,6 +1,5 @@
|
|||||||
import { useState, ReactNode } from 'react';
|
import { useState, ReactNode } from 'react';
|
||||||
import { NodeData, Settings } from '../types/graph';
|
import { NodeData, Settings } from '../types/graph';
|
||||||
import { generateWireGuardPrivateKey } from '../utils/wireguardConfig'
|
|
||||||
import './NodeEditor.css';
|
import './NodeEditor.css';
|
||||||
|
|
||||||
|
|
||||||
@ -40,10 +39,6 @@ export default function NodeEditor({
|
|||||||
// onClose();
|
// onClose();
|
||||||
};
|
};
|
||||||
|
|
||||||
const handleGenerateKey = (): void => {
|
|
||||||
handleInputChange('privateKey', generateWireGuardPrivateKey())
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="node-editor-overlay">
|
<div className="node-editor-overlay">
|
||||||
<div className="node-editor">
|
<div className="node-editor">
|
||||||
@ -75,80 +70,21 @@ export default function NodeEditor({
|
|||||||
<div className="item-group">
|
<div className="item-group">
|
||||||
<input
|
<input
|
||||||
value={formData.privateKey || ''}
|
value={formData.privateKey || ''}
|
||||||
|
onChange={(e) => handleInputChange('privateKey', e.target.value)}
|
||||||
readOnly
|
readOnly
|
||||||
/>
|
/>
|
||||||
<button className="btn-interect" onClick={handleGenerateKey}>重新生成</button>
|
<button className="btn-interect">重新生成</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="form-group">
|
<div className="form-group">
|
||||||
<label>主机ID</label>
|
<label>侦听端口</label>
|
||||||
<input
|
<input
|
||||||
type="number"
|
type="number"
|
||||||
min="0"
|
|
||||||
max="255"
|
|
||||||
step="1"
|
|
||||||
value={formData.hostId}
|
|
||||||
onChange={(e) => handleInputChange('hostId', e.target.value)}
|
|
||||||
placeholder="同一子网ID下主机ID不能重复,不得超过255"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className="form-group">
|
|
||||||
<label>子网ID</label>
|
|
||||||
<input
|
|
||||||
type="number"
|
|
||||||
min="0"
|
|
||||||
max="255"
|
|
||||||
step="1"
|
|
||||||
value={formData.groupId}
|
|
||||||
onChange={(e) => handleInputChange('groupId', e.target.value)}
|
|
||||||
placeholder="不得超过255"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{/* host options */}
|
|
||||||
|
|
||||||
<div className="form-group">
|
|
||||||
<label>PostUp (可选)</label>
|
|
||||||
<input
|
|
||||||
type="text"
|
|
||||||
value={formData.postUp || ''}
|
|
||||||
onChange={(e) => handleInputChange('postUp', e.target.value)}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className="form-group">
|
|
||||||
<label>PostDown (可选)</label>
|
|
||||||
<input
|
|
||||||
type="text"
|
|
||||||
value={formData.postDown || ''}
|
|
||||||
onChange={(e) => handleInputChange('postDown', e.target.value)}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className="form-group">
|
|
||||||
<label>mtu (可选)</label>
|
|
||||||
<input
|
|
||||||
type="number"
|
|
||||||
min="1"
|
|
||||||
step="1"
|
|
||||||
value={formData.mtu || ''}
|
|
||||||
onChange={(e) => handleInputChange('mtu', e.target.value)}
|
|
||||||
placeholder={settings.mtu ? `默认值:${settings.mtu}` : ''}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className="form-group">
|
|
||||||
<label>侦听端口 (可选)</label>
|
|
||||||
<input
|
|
||||||
type="number"
|
|
||||||
min="1024"
|
|
||||||
max="49151"
|
|
||||||
step="1"
|
|
||||||
value={formData.listenPort || ''}
|
value={formData.listenPort || ''}
|
||||||
onChange={(e) => handleInputChange('listenPort', e.target.value)}
|
onChange={(e) => handleInputChange('listenPort', e.target.value)}
|
||||||
placeholder={`默认值:${settings.listenPort}`}
|
placeholder="例如: 51820"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -158,16 +94,17 @@ export default function NodeEditor({
|
|||||||
type="text"
|
type="text"
|
||||||
value={formData.dnsServers || ''}
|
value={formData.dnsServers || ''}
|
||||||
onChange={(e) => handleInputChange('dnsServers', e.target.value)}
|
onChange={(e) => handleInputChange('dnsServers', e.target.value)}
|
||||||
placeholder="例如: 8.8.8.8,1.1.1.1"
|
placeholder="例如: 8.8.8.8"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="form-group">
|
<div className="form-group">
|
||||||
<label>备注 (可选)</label>
|
<label>持久保活 (可选)</label>
|
||||||
<textarea
|
<input
|
||||||
rows={3}
|
type="number"
|
||||||
value={formData.notes || ''}
|
value={formData.persistentKeepalive || ''}
|
||||||
onChange={(e) => handleInputChange('notes', e.target.value)}
|
onChange={(e) => handleInputChange('persistentKeepalive', e.target.value)}
|
||||||
|
placeholder="秒数"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
@ -4,23 +4,6 @@ export type AppNode = Node<NodeData>;
|
|||||||
|
|
||||||
export type AppEdge = Edge<EdgeData>;
|
export type AppEdge = Edge<EdgeData>;
|
||||||
|
|
||||||
export interface GroupAllowRule {
|
|
||||||
kind: 'group'
|
|
||||||
allowGroup: number
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface HostAllowRule {
|
|
||||||
kind: 'host'
|
|
||||||
allowHost: number
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface CustomAllowRule {
|
|
||||||
kind: 'custom'
|
|
||||||
allow: string
|
|
||||||
}
|
|
||||||
|
|
||||||
export type AllowRule = GroupAllowRule | HostAllowRule | CustomAllowRule
|
|
||||||
|
|
||||||
export type NodeData = {
|
export type NodeData = {
|
||||||
// basic
|
// basic
|
||||||
label: string;
|
label: string;
|
||||||
@ -28,28 +11,27 @@ export type NodeData = {
|
|||||||
groupId: number;
|
groupId: number;
|
||||||
hostId: number;
|
hostId: number;
|
||||||
|
|
||||||
// host options
|
// options
|
||||||
postUp?: string;
|
postUp?: string;
|
||||||
postDown?: string;
|
postDown?: string;
|
||||||
mtu?: number;
|
persistentKeepalive?: string;
|
||||||
notes?: string;
|
|
||||||
listenPort?: number;
|
|
||||||
dnsServers?: string;
|
dnsServers?: string;
|
||||||
|
disallowSubnet?: string;
|
||||||
// peer options
|
allowIPs?: string;
|
||||||
// allowRules?: AllowRule[];
|
mtu?: number;
|
||||||
// persistentKeepalive?: string; todo: 加到边上
|
listenPort?: number;
|
||||||
|
notes?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export type EdgeData = {
|
||||||
|
isTwoWayEdge: boolean
|
||||||
}
|
}
|
||||||
|
|
||||||
export type Settings = {
|
export type Settings = {
|
||||||
v4SubNetPrefix: [number, number];
|
v4SubNetPrefix: [number, number];
|
||||||
listenPort: number;
|
listenPort: number;
|
||||||
|
|
||||||
// options
|
// global options
|
||||||
v6SubNetPrefix?: [string, string, string, string];
|
v6SubNetPrefix?: [string, string, string, string];
|
||||||
mtu?: number;
|
mtu?: number;
|
||||||
}
|
|
||||||
|
|
||||||
export type EdgeData = {
|
|
||||||
isTwoWayEdge: boolean
|
|
||||||
}
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user