initial
This commit is contained in:
@@ -0,0 +1,24 @@
|
||||
'use strict';
|
||||
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
|
||||
const txtPath = path.join(__dirname, '..', 'proxies.txt');
|
||||
const jsonPath = path.join(__dirname, '..', 'proxies.json');
|
||||
|
||||
if (fs.existsSync(jsonPath)) {
|
||||
process.stdout.write('migrate: proxies.json already exists. Skipping.\n');
|
||||
process.exit(0);
|
||||
}
|
||||
|
||||
if (!fs.existsSync(txtPath)) {
|
||||
process.stdout.write('migrate: no proxies.txt found. Nothing to migrate.\n');
|
||||
process.exit(0);
|
||||
}
|
||||
|
||||
const { ProxyRegistry } = require('../src/proxy/registry');
|
||||
|
||||
const reg = new ProxyRegistry({ persistPath: jsonPath, txtPath, log: (l, m) => process.stdout.write(` [${l}] ${m}\n`) });
|
||||
const n = reg.loadFromTxt(txtPath);
|
||||
reg.save();
|
||||
process.stdout.write(`migrate: imported ${n} proxies → ${jsonPath}\n`);
|
||||
@@ -0,0 +1,95 @@
|
||||
'use strict';
|
||||
|
||||
const http = require('http');
|
||||
const { createApp } = require('../src/server');
|
||||
|
||||
async function request(server, opts) {
|
||||
return new Promise((resolve, reject) => {
|
||||
const port = server.address().port;
|
||||
const headers = { ...(opts.headers || {}) };
|
||||
if (opts.cookie) headers['Cookie'] = opts.cookie;
|
||||
if (opts.body) headers['Content-Type'] = 'application/json';
|
||||
const req = http.request({
|
||||
hostname: '127.0.0.1',
|
||||
port,
|
||||
path: opts.path,
|
||||
method: opts.method || 'GET',
|
||||
headers,
|
||||
}, (res) => {
|
||||
const chunks = [];
|
||||
res.on('data', (c) => chunks.push(c));
|
||||
res.on('end', () => {
|
||||
const body = Buffer.concat(chunks).toString('utf8');
|
||||
let json = null;
|
||||
try { json = JSON.parse(body); } catch (_) {}
|
||||
resolve({ status: res.statusCode, headers: res.headers, body, json });
|
||||
});
|
||||
});
|
||||
req.on('error', reject);
|
||||
if (opts.body) req.write(JSON.stringify(opts.body));
|
||||
req.end();
|
||||
});
|
||||
}
|
||||
|
||||
function assert(cond, msg) {
|
||||
if (!cond) throw new Error('assertion failed: ' + msg);
|
||||
process.stdout.write(` ✓ ${msg}\n`);
|
||||
}
|
||||
|
||||
async function main() {
|
||||
const { server, shutdown } = createApp();
|
||||
await new Promise((resolve) => server.listen(0, '127.0.0.1', resolve));
|
||||
const port = server.address().port;
|
||||
process.stdout.write(`smoke: server listening on 127.0.0.1:${port}\n`);
|
||||
|
||||
try {
|
||||
const badLogin = await request(server, { method: 'POST', path: '/api/auth/login', body: { password: 'wrong' } });
|
||||
assert(badLogin.status === 401, 'wrong password returns 401');
|
||||
|
||||
const login = await request(server, { method: 'POST', path: '/api/auth/login', body: { password: process.env.SITE_PASSWORD } });
|
||||
assert(login.status === 200, 'correct password returns 200');
|
||||
assert(login.json && login.json.success === true, 'login response has success: true');
|
||||
const cookie = login.headers['set-cookie']?.[0]?.split(';')[0];
|
||||
assert(cookie && cookie.startsWith('auth_token='), 'auth_token cookie set');
|
||||
|
||||
const checkAuth = await request(server, { path: '/api/auth/check', cookie });
|
||||
assert(checkAuth.json && checkAuth.json.authenticated === true, 'auth check returns authenticated');
|
||||
|
||||
const stats = await request(server, { path: '/api/stats', cookie });
|
||||
assert(stats.status === 200, 'GET /api/stats returns 200');
|
||||
assert(stats.json && stats.json.activeBots === 0, 'initial activeBots is 0');
|
||||
assert(typeof stats.json.totalBotsSpawned === 'number', 'totalBotsSpawned is a number');
|
||||
|
||||
const proxyList = await request(server, { path: '/api/proxy/list', cookie });
|
||||
assert(proxyList.status === 200, 'GET /api/proxy/list returns 200');
|
||||
assert(proxyList.json && Array.isArray(proxyList.json.proxies), 'proxies is an array');
|
||||
|
||||
const strategies = await request(server, { path: '/api/test/strategies', cookie });
|
||||
assert(strategies.status === 200, 'GET /api/test/strategies returns 200');
|
||||
assert(strategies.json && Array.isArray(strategies.json.available), 'strategies has available list');
|
||||
|
||||
const badStart = await request(server, {
|
||||
method: 'POST', path: '/api/test/start', cookie,
|
||||
body: { target: 'not-a-url', bots: 1 },
|
||||
});
|
||||
assert(badStart.status === 400, 'invalid target returns 400');
|
||||
|
||||
const healthz = await request(server, { path: '/api/healthz' });
|
||||
assert(healthz.status === 200, 'GET /api/healthz returns 200');
|
||||
assert(healthz.json && healthz.json.status, 'healthz has status');
|
||||
|
||||
const metrics = await request(server, { path: '/api/metrics' });
|
||||
assert(metrics.status === 200, 'GET /api/metrics returns 200');
|
||||
assert(metrics.body.includes('crackedflooder_bots_active'), 'metrics has crackedflooder_bots_active');
|
||||
|
||||
process.stdout.write('smoke: all checks passed\n');
|
||||
shutdown();
|
||||
setTimeout(() => process.exit(0), 1000);
|
||||
} catch (err) {
|
||||
process.stderr.write(`smoke FAILED: ${err.message}\n`);
|
||||
shutdown();
|
||||
setTimeout(() => process.exit(1), 1000);
|
||||
}
|
||||
}
|
||||
|
||||
main();
|
||||
Reference in New Issue
Block a user