dia-gov's picture
Upload 102 files
2f3c093 verified
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Trojan Dashboard</title>
<style>
body { font-family: sans-serif; margin: 20px; }
button { margin: 5px; padding: 8px 12px; cursor: pointer; }
textarea { width: 100%; height: 100px; margin: 5px 0; }
pre { border: 1px solid #ccc; padding: 10px; overflow-x: auto; }
.error { color: red; }
.success { color: green; }
table { border-collapse: collapse; width: 100%; }
th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }
th { background-color: #f2f2f2; }
.loading { opacity: 0.6; pointer-events: none; }
.form-group { margin-bottom: 10px; }
.form-group label { display: block; margin-bottom: 5px; }
button.loading::after {
content: "";
position: absolute;
width: 16px;
height: 16px;
top: 50%;
left: 50%;
margin: -8px 0 0 -8px;
border: 2px solid #f3f3f3;
border-top: 2px solid #3498db;
border-radius: 50%;
animation: spin 1s linear infinite;
}
@keyframes spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
.deployment-feedback {
margin-top: 10px;
padding: 10px;
border: 1px solid #ddd;
background-color: #f9f9f9;
}
.deployment-feedback.pending { background-color: #ffffcc; }
.deployment-feedback.in-progress { background-color: #ccffff; }
.deployment-feedback.success { background-color: #ccffcc; }
.deployment-feedback.error { background-color: #ffcccc; }
</style>
</head>
<body>
<h1>Trojan Dashboard</h1>
<div class="form-group">
<label for="apiKey">API Key:</label>
<input type="text" id="apiKey" placeholder="Enter API Key" required>
<button onclick="saveApiKey()">Save API Key</button>
</div>
<h2>Create Trojan Server</h2>
<form id="createTrojanServerForm">
<div class="form-group">
<label for="serverIP">Server IP:</label>
<input type="text" id="serverIP" placeholder="Server IP" required>
</div>
<div class="form-group">
<label for="serverPort">Server Port:</label>
<input type="number" id="serverPort" placeholder="Server Port" required>
</div>
<div class="form-group">
<label for="encryptionMethod">Encryption Method:</label>
<input type="text" id="encryptionMethod" placeholder="Encryption Method">
</div>
<div class="form-group">
<label for="serverDeploymentMethod">Deployment Method:</label>
<select id="serverDeploymentMethod">
<option value="ssh">SSH</option>
<option value="powershell">PowerShell</option>
<option value="manual">Manual</option>
</select>
</div>
<button type="submit">Create Server</button>
</form>
<pre id="createServerResult"></pre>
<h2>Create Trojan Client</h2>
<form id="createTrojanClientForm">
<div class="form-group">
<label for="clientConfig">Client Config (JSON):</label>
<textarea id="clientConfig" placeholder="Client Config (JSON)" required></textarea>
</div>
<div class="form-group">
<label for="clientDeploymentMethod">Deployment Method:</label>
<select id="clientDeploymentMethod">
<option value="ssh">SSH</option>
<option value="powershell">PowerShell</option>
<option value="manual">Manual</option>
</select>
</div>
<button type="submit">Create Client</button>
</form>
<pre id="createClientResult"></pre>
<h2>Generate Trojan with AI</h2>
<form id="generateTrojanAIForm">
<div class="form-group">
<label for="aiGoal">AI Goal:</label>
<input type="text" id="aiGoal" placeholder="AI Goal" required>
</div>
<div class="form-group">
<label for="aiConstraints">AI Constraints (JSON):</label>
<textarea id="aiConstraints" placeholder="AI Constraints (JSON)"></textarea>
</div>
<button type="submit">Generate with AI</button>
</form>
<pre id="generateAIResult"></pre>
<h2>List Trojan Servers</h2>
<button onclick="listTrojanServers()">List Servers</button>
<div id="trojanServerListContainer"></div>
<h2>List Trojan Clients</h2>
<button onclick="listTrojanClients()">List Clients</button>
<div id="trojanClientListContainer"></div>
<script>
const API_BASE_URL = '/api/trojan'; // Backend API endpoint
let apiKey = localStorage.getItem('apiKey') || '';
document.getElementById('apiKey').value = apiKey;
function saveApiKey() {
apiKey = document.getElementById('apiKey').value;
localStorage.setItem('apiKey', apiKey);
alert('API Key saved!');
}
async function createTrojanServer(event) {
event.preventDefault();
const serverIP = document.getElementById('serverIP').value;
const serverPort = document.getElementById('serverPort').value;
const encryptionMethod = document.getElementById('encryptionMethod').value;
const deploymentMethod = document.getElementById('serverDeploymentMethod').value;
const createButton = document.querySelector('#createTrojanServerForm button');
if (!serverIP || !serverPort) {
document.getElementById('createServerResult').textContent = 'Error: Server IP and Port are required.';
document.getElementById('createServerResult').classList.add('error');
return;
}
createButton.classList.add('loading');
try {
const response = await fetch(`${API_BASE_URL}/servers`, {
method: 'POST',
headers: { 'Content-Type': 'application/json', 'X-API-Key': apiKey },
body: JSON.stringify({ server_ip: serverIP, server_port: parseInt(serverPort), encryption_method: encryptionMethod, deployment_method: deploymentMethod })
});
const data = await response.json();
if (response.ok) {
document.getElementById('createServerResult').textContent = 'Trojan server created successfully: ' + JSON.stringify(data, null, 2);
document.getElementById('createServerResult').classList.remove('error');
document.getElementById('createServerResult').classList.add('success');
listTrojanServers(); // Update the list after creating a server
} else {
document.getElementById('createServerResult').textContent = 'Error creating trojan server: ' + JSON.stringify(data, null, 2);
document.getElementById('createServerResult').classList.add('error');
document.getElementById('createServerResult').classList.remove('success');
}
} catch (error) {
console.error('Error:', error);
document.getElementById('createServerResult').textContent = 'Error creating trojan server: ' + error;
document.getElementById('createServerResult').classList.add('error');
document.getElementById('createServerResult').classList.remove('success');
} finally {
createButton.classList.remove('loading');
}
}
async function createTrojanClient(event) {
event.preventDefault();
const clientConfig = document.getElementById('clientConfig').value;
const deploymentMethod = document.getElementById('clientDeploymentMethod').value;
const createButton = document.querySelector('#createTrojanClientForm button');
if (!clientConfig) {
document.getElementById('createClientResult').textContent = 'Error: Client config is required.';
document.getElementById('createClientResult').classList.add('error');
return;
}
createButton.classList.add('loading');
try {
const response = await fetch(`${API_BASE_URL}/clients`, {
method: 'POST',
headers: { 'Content-Type': 'application/json', 'X-API-Key': apiKey },
body: JSON.stringify({ config: JSON.parse(clientConfig), deployment_method: deploymentMethod })
});
const data = await response.json();
if (response.ok) {
document.getElementById('createClientResult').textContent = 'Trojan client created successfully: ' + JSON.stringify(data, null, 2);
document.getElementById('createClientResult').classList.remove('error');
document.getElementById('createClientResult').classList.add('success');
listTrojanClients(); // Update the list after creating a client
} else {
document.getElementById('createClientResult').textContent = 'Error creating trojan client: ' + JSON.stringify(data, null, 2);
document.getElementById('createClientResult').classList.add('error');
document.getElementById('createClientResult').classList.remove('success');
}
} catch (error) {
console.error('Error:', error);
document.getElementById('createClientResult').textContent = 'Error creating trojan client: ' + error;
document.getElementById('createClientResult').classList.add('error');
document.getElementById('createClientResult').classList.remove('success');
} finally {
createButton.classList.remove('loading');
}
}
async function generateTrojanAI(event) {
event.preventDefault();
const aiGoal = document.getElementById('aiGoal').value;
const aiConstraints = document.getElementById('aiConstraints').value;
const generateButton = document.querySelector('#generateTrojanAIForm button');
if (!aiGoal) {
document.getElementById('generateAIResult').textContent = 'Error: AI Goal is required.';
document.getElementById('generateAIResult').classList.add('error');
return;
}
generateButton.classList.add('loading');
try {
const response = await fetch(`${API_BASE_URL}/generate`, {
method: 'POST',
headers: { 'Content-Type': 'application/json', 'X-API-Key': apiKey },
body: JSON.stringify({ goal: aiGoal, constraints: JSON.parse(aiConstraints || '{}') })
});
const data = await response.json();
document.getElementById('generateAIResult').textContent = 'AI generated trojan config: ' + JSON.stringify(data, null, 2);
document.getElementById('generateAIResult').classList.remove('error');
document.getElementById('generateAIResult').classList.add('success');
} catch (error) {
console.error('Error:', error);
document.getElementById('generateAIResult').textContent = 'Error generating trojan config with AI: ' + error;
document.getElementById('generateAIResult').classList.add('error');
document.getElementById('generateAIResult').classList.remove('success');
} finally {
generateButton.classList.remove('loading');
}
}
async function listTrojanServers() {
const listButton = document.querySelector('#trojanServerListContainer').previousElementSibling;
listButton.classList.add('loading');
try {
const response = await fetch(`${API_BASE_URL}/servers`, {
headers: { 'X-API-Key': apiKey }
});
const data = await response.json();
if (response.ok) {
let tableHTML = '<table><thead><tr><th>ID</th><th>Server IP</th><th>Server Port</th><th>Encryption Method</th><th>Deployment Method</th><th>Actions</th></tr></thead><tbody>';
data.forEach(server => {
tableHTML += `<tr><td>${server.id}</td><td>${server.server_ip}</td><td>${server.server_port}</td><td>${server.encryption_method || ''}</td><td>${server.deployment_method || ''}</td><td><button onclick="deployTrojanServer(${server.id})">Deploy</button><div id="deploymentFeedbackServer${server.id}" class="deployment-feedback"></div></td></tr>`;
});
tableHTML += '</tbody></table>';
document.getElementById('trojanServerListContainer').innerHTML = tableHTML;
document.getElementById('trojanServerListContainer').classList.remove('error');
} else {
document.getElementById('trojanServerListContainer').textContent = 'Error listing trojan servers: ' + JSON.stringify(data, null, 2);
document.getElementById('trojanServerListContainer').classList.add('error');
}
} catch (error) {
console.error('Error:', error);
document.getElementById('trojanServerListContainer').textContent = 'Error listing trojan servers: ' + error;
document.getElementById('trojanServerListContainer').classList.add('error');
} finally {
listButton.classList.remove('loading');
}
}
async function listTrojanClients() {
const listButton = document.querySelector('#trojanClientListContainer').previousElementSibling;
listButton.classList.add('loading');
try {
const response = await fetch(`${API_BASE_URL}/clients`, {
headers: { 'X-API-Key': apiKey }
});
const data = await response.json();
if (response.ok) {
let tableHTML = '<table><thead><tr><th>ID</th><th>Config</th><th>Deployment Method</th><th>Actions</th></tr></thead><tbody>';
data.forEach(client => {
tableHTML += `<tr><td>${client.id}</td><td>${JSON.stringify(client.config)}</td><td>${client.deployment_method || ''}</td><td><button onclick="deployTrojanClient(${client.id})">Deploy</button><div id="deploymentFeedbackClient${client.id}" class="deployment-feedback"></div></td></tr>`;
});
tableHTML += '</tbody></table>';
document.getElementById('trojanClientListContainer').innerHTML = tableHTML;
document.