upleb.uk

Public git repos — served from a NIP-34 GRASP relay at git.upleb.uk

summaryrefslogtreecommitdiff
path: root/tests/helpers/network.mjs
blob: e4d5086e28685320bad0086d924b838b18aafb2e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
import { execSync } from 'child_process';

const ESP32_IP = process.env.TOLLGATE_IP || '192.168.4.1';
const TIMEOUT = 5000;

export function curl(args, expectStatus = null) {
  const cmd = `curl -s -o /dev/null -w "%{http_code}" --connect-timeout 5 --max-time ${TIMEOUT/1000} ${args}`;
  try {
    const result = execSync(cmd, { encoding: 'utf8', timeout: TIMEOUT + 2000 }).trim();
    if (expectStatus && result !== String(expectStatus)) {
      throw new Error(`Expected HTTP ${expectStatus}, got ${result}`);
    }
    return result;
  } catch (e) {
    if (e.status === 'ETIMEDOUT' || e.killed) return 'TIMEOUT';
    throw e;
  }
}

export function curlBody(url) {
  const cmd = `curl -s --connect-timeout 5 --max-time ${TIMEOUT/1000} "${url}"`;
  try {
    return execSync(cmd, { encoding: 'utf8', timeout: TIMEOUT + 2000 });
  } catch {
    return null;
  }
}

export function getPortalIP() { return ESP32_IP; }

export function canPing(host = '8.8.8.8', count = 2) {
  try {
    const result = execSync(`ping -c ${count} -W 2 -I wlp59s0 ${host}`, { encoding: 'utf8', timeout: 10000 });
    return result.includes('0% packet loss') || result.includes('1 packets transmitted');
  } catch {
    return false;
  }
}

export function canResolve(domain = 'google.com') {
  try {
    const result = execSync(`nslookup ${domain} ${ESP32_IP}`, { encoding: 'utf8', timeout: 10000 });
    return result.includes('Address') && !result.includes('NXDOMAIN');
  } catch (e) {
    const result = e.stdout || '';
    return result.includes('Address') && !result.includes('NXDOMAIN');
  }
}

export function dnsResolvesToSelf(domain = 'google.com') {
  try {
    const result = execSync(`nslookup ${domain} ${ESP32_IP}`, { encoding: 'utf8', timeout: 10000 });
    return result.includes(ESP32_IP);
  } catch (e) {
    return e.stdout && e.stdout.includes(ESP32_IP);
  }
}

export function connectToAP(ssid, password = '') {
  try {
    if (password) {
      execSync(`nmcli dev wifi connect "${ssid}" password "${password}" ifname wlan0`, { timeout: 30000 });
    } else {
      execSync(`nmcli dev wifi connect "${ssid}" ifname wlan0`, { timeout: 30000 });
    }
    return true;
  } catch {
    return false;
  }
}

export function disconnectAP() {
  try {
    execSync('nmcli dev disconnect wlan0 2>/dev/null || true', { timeout: 10000 });
    return true;
  } catch {
    return false;
  }
}

export function getWifiInterface() {
  try {
    const result = execSync('nmcli -t -f DEVICE,TYPE dev status', { encoding: 'utf8' });
    const line = result.split('\n').find(l => l.includes('wifi'));
    return line ? line.split(':')[0] : null;
  } catch {
    return null;
  }
}