mirror of
https://github.com/fosrl/pangolin.git
synced 2026-02-10 23:16:38 +00:00
88 lines
2.7 KiB
TypeScript
88 lines
2.7 KiB
TypeScript
import axios from "axios";
|
|
import logger from "@server/logger";
|
|
import { db } from "@server/db";
|
|
import { exitNodes } from "@server/db";
|
|
import { eq } from "drizzle-orm";
|
|
|
|
export async function addPeer(
|
|
exitNodeId: number,
|
|
peer: {
|
|
publicKey: string;
|
|
allowedIps: string[];
|
|
}
|
|
) {
|
|
logger.info(
|
|
`Adding peer with public key ${peer.publicKey} to exit node ${exitNodeId}`
|
|
);
|
|
const [exitNode] = await db
|
|
.select()
|
|
.from(exitNodes)
|
|
.where(eq(exitNodes.exitNodeId, exitNodeId))
|
|
.limit(1);
|
|
if (!exitNode) {
|
|
throw new Error(`Exit node with ID ${exitNodeId} not found`);
|
|
}
|
|
if (!exitNode.reachableAt) {
|
|
throw new Error(`Exit node with ID ${exitNodeId} is not reachable`);
|
|
}
|
|
|
|
try {
|
|
const response = await axios.post(
|
|
`${exitNode.reachableAt}/peer`,
|
|
peer,
|
|
{
|
|
headers: {
|
|
"Content-Type": "application/json"
|
|
}
|
|
}
|
|
);
|
|
|
|
logger.info("Peer added successfully:", { peer: response.data.status });
|
|
return response.data;
|
|
} catch (error) {
|
|
if (axios.isAxiosError(error)) {
|
|
logger.error(
|
|
`Error adding peer (can Pangolin see Gerbil HTTP API?) for exit node at ${exitNode.reachableAt} (status: ${error.response?.status}): ${error.message}`
|
|
);
|
|
} else {
|
|
logger.error(
|
|
`Error adding peer for exit node at ${exitNode.reachableAt}: ${error}`
|
|
);
|
|
}
|
|
}
|
|
}
|
|
|
|
export async function deletePeer(exitNodeId: number, publicKey: string) {
|
|
logger.info(
|
|
`Deleting peer with public key ${publicKey} from exit node ${exitNodeId}`
|
|
);
|
|
const [exitNode] = await db
|
|
.select()
|
|
.from(exitNodes)
|
|
.where(eq(exitNodes.exitNodeId, exitNodeId))
|
|
.limit(1);
|
|
if (!exitNode) {
|
|
throw new Error(`Exit node with ID ${exitNodeId} not found`);
|
|
}
|
|
if (!exitNode.reachableAt) {
|
|
throw new Error(`Exit node with ID ${exitNodeId} is not reachable`);
|
|
}
|
|
try {
|
|
const response = await axios.delete(
|
|
`${exitNode.reachableAt}/peer?public_key=${encodeURIComponent(publicKey)}`
|
|
);
|
|
logger.info("Peer deleted successfully:", response.data.status);
|
|
return response.data;
|
|
} catch (error) {
|
|
if (axios.isAxiosError(error)) {
|
|
logger.error(
|
|
`Error deleting peer (can Pangolin see Gerbil HTTP API?) for exit node at ${exitNode.reachableAt} (status: ${error.response?.status}): ${error.message}`
|
|
);
|
|
} else {
|
|
logger.error(
|
|
`Error deleting peer for exit node at ${exitNode.reachableAt}: ${error}`
|
|
);
|
|
}
|
|
}
|
|
}
|