-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.js
171 lines (141 loc) · 5.25 KB
/
index.js
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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
const core = require('@actions/core');
const exec = require('@actions/exec');
const http = require('http');
const crypto = require('crypto');
async function fetchAPIStatus() {
return new Promise((resolve, reject) => {
http.get('http://127.0.0.1:16216/api/status', (res) => {
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
resolve(JSON.parse(data));
});
}).on('error', (err) => {
reject(err);
});
});
}
async function joinHusarnet(joinCode, hostname) {
return new Promise(async (resolve, reject) => {
let apiToken = '';
const opts = {
silent: true,
listeners: {
stdout: (data) => {
apiToken = data.toString().trim();
}
}
};
await exec.exec('sudo cat /var/lib/husarnet/daemon_api_token', [], opts);
core.setSecret(apiToken);
const postData = `secret=${apiToken}&code=${joinCode}&hostname=${hostname}`;
const options = {
hostname: '127.0.0.1',
port: 16216,
path: '/api/join',
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'Content-Length': Buffer.byteLength(postData)
}
};
const req = http.request(options, (res) => {
let responseData = '';
res.on('data', (chunk) => {
responseData += chunk;
});
res.on('end', () => {
if (res.statusCode === 200) {
resolve(responseData); // resolve with the response data
} else {
reject(new Error(`Failed to join Husarnet. HTTP Status Code: ${res.statusCode}`));
}
});
});
req.on('error', (error) => {
reject(error);
});
req.write(postData);
req.end();
});
}
async function run() {
try {
// Install Husarnet
await exec.exec('wget https://install.husarnet.com/tgz/husarnet-2.0.170-amd64.tar');
await exec.exec('sudo tar --directory=/ --no-same-owner --dereference -xf husarnet-2.0.170-amd64.tar');
await exec.exec('sudo /.scripts/after_install');
// Check if API is ready
let isReady = false;
let endTime = Date.now() + 30000; // 30 seconds from now
while (Date.now() < endTime) {
try {
const response = await fetchAPIStatus();
console.log(".")
if (response.result.is_ready_to_join) {
console.log("The Husarnet service is ready to join!");
isReady = true;
break; // exit the loop
}
} catch (err) {
console.error('Error fetching API status:', err);
}
await new Promise(resolve => setTimeout(resolve, 1000));
}
if (!isReady) {
console.error("Timeout reached!");
core.setFailed("Timeout reached while waiting for API");
return;
}
// ... [Joining to Husarnet network logic]
// Joining to Husarnet network
const joinCode = core.getInput('join-code');
const hostname = core.getInput('hostname', { required: true });
let full_hostname;
if (hostname === 'default-hostname') {
const repoName = process.env.GITHUB_REPOSITORY.split('/')[1];
full_hostname=`github-actions-${repoName}-${crypto.randomBytes(4).toString('hex')}`;
} else {
full_hostname = hostname
}
console.log("Joining to Husarnet network as: " + full_hostname + "...");
try {
await joinHusarnet(joinCode, full_hostname);
} catch (error) {
console.error('Failed to join Husarnet network', error);
core.setFailed(error.message);
}
let isJoined = false;
endTime = Date.now() + 30000; // 30 seconds from now
while (Date.now() < endTime) {
try {
const response = await fetchAPIStatus();
console.log(".")
if (response.result.is_joined) {
console.log("The device is joined!");
isJoined = true;
break; // exit the loop
}
} catch (err) {
console.error('Error fetching API status:', err);
}
await new Promise(resolve => setTimeout(resolve, 1000));
}
if (!isJoined) {
console.error("Failed to join the device!");
console.error("Check the limit for the number of devices at your account at https://app.husarnet.com");
core.setFailed("Timeout reached while waiting for device to join");
}
try {
const response = await fetchAPIStatus();
core.setOutput('ipv6', response.result.local_ip);
} catch (err) {
console.error('Error fetching API status:', err);
}
} catch (error) {
core.setFailed(error.message);
}
}
run();