Skip to content

Commit 20e3ef7

Browse files
author
RaizeTheLimit
committed
fix(docker): load the config volume ocrrectly
1 parent f574785 commit 20e3ef7

4 files changed

Lines changed: 97 additions & 55 deletions

File tree

Dockerfile

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,10 @@ RUN yarn install --frozen-lockfile --production --ignore-scripts
3939
# Copy built application from builder stage
4040
COPY --from=builder /app/dist ./dist
4141

42-
# Copy source config directory structure (for config.json mount point)
43-
COPY --from=builder /app/src/config/example.config.json ./src/config/
42+
# Copy config directory structure (for config.json mount point)
43+
# Note: example.config.json is already in dist/config/ from the build process
44+
# This ensures the directory structure exists for the volume mount
45+
COPY --from=builder /app/dist/config/example.config.json ./dist/config/
4446

4547
# Create proto_samples directory
4648
RUN mkdir -p proto_samples

docker-compose.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ services:
77
ports:
88
- "8081:8081"
99
volumes:
10-
- ./src/config/config.json:/app/src/config/config.json:ro
10+
- ./src/config/config.json:/app/dist/config/config.json:ro
1111
- ./proto_samples:/app/proto_samples
1212
restart: unless-stopped
1313
environment:

src/index.ts

Lines changed: 83 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -133,27 +133,37 @@ const httpServer = http.createServer(function (req, res) {
133133
incomingData.push(chunk);
134134
});
135135
req.on("end", function () {
136-
const requestData = incomingData.join("");
137-
let parsedData = JSON.parse(requestData);
138-
res.writeHead(200, { "Content-Type": "application/json" });
139-
res.end("");
140-
if (Array.isArray(parsedData)) {
141-
console.error("Incoming Data is an array, need to be single object");
142-
return;
143-
}
144-
// redirect because endpoint is in use there, leave null to ignore.
145-
// ex http://123.123.123.123:9001/raw
146-
// this need a test ping ok or throw for better.
147-
if (config["redirect_to_golbat_url"]) {
148-
try {
149-
redirect_post_golbat(config["redirect_to_golbat_url"], config["redirect_to_golbat_token"], JSON.stringify(parsedData));
136+
try {
137+
const requestData = incomingData.join("");
138+
let parsedData = JSON.parse(requestData);
139+
res.writeHead(200, { "Content-Type": "application/json" });
140+
res.end("");
141+
if (Array.isArray(parsedData)) {
142+
console.error("Incoming Data is an array, need to be single object");
143+
return;
150144
}
151-
catch (err) {
152-
console.error("Endpoint golbat offline or bad!" + err);
145+
// Validate required fields
146+
if (!parsedData['contents'] || !Array.isArray(parsedData['contents'])) {
147+
console.error("Invalid golbat data: 'contents' field missing or not an array");
148+
return;
153149
}
154-
}
155-
const identifier = parsedData['username'];
156-
for (let i = 0; i < parsedData['contents'].length; i++) {
150+
if (parsedData['contents'].length === 0) {
151+
console.error("Invalid golbat data: 'contents' array is empty");
152+
return;
153+
}
154+
// redirect because endpoint is in use there, leave null to ignore.
155+
// ex http://123.123.123.123:9001/raw
156+
// this need a test ping ok or throw for better.
157+
if (config["redirect_to_golbat_url"]) {
158+
try {
159+
redirect_post_golbat(config["redirect_to_golbat_url"], config["redirect_to_golbat_token"], JSON.stringify(parsedData));
160+
}
161+
catch (err) {
162+
console.error("Endpoint golbat offline or bad!" + err);
163+
}
164+
}
165+
const identifier = parsedData['username'];
166+
for (let i = 0; i < parsedData['contents'].length; i++) {
157167
const rawRequest = parsedData['contents'][i].request || "";
158168
const rawResponse = parsedData['contents'][i].payload || "";
159169

@@ -191,6 +201,9 @@ const httpServer = http.createServer(function (req, res) {
191201
}
192202
}
193203
}
204+
} catch (error) {
205+
console.error("Error processing golbat request:", error);
206+
}
194207
});
195208
break;
196209
case "/traffic":
@@ -217,25 +230,34 @@ const httpServer = http.createServer(function (req, res) {
217230
incomingData.push(chunk);
218231
});
219232
req.on("end", () => {
220-
const requestData = incomingData.join("");
221-
let parsedData = JSON.parse(requestData);
222-
res.writeHead(200, { "Content-Type": "application/json" });
223-
res.end("");
224-
const parsedResponseData = decodePayload(
225-
parsedData.contents,
226-
"response"
227-
);
228-
if (typeof parsedResponseData === "string") {
229-
incomingProtoWebBufferInst.write({ error: parsedResponseData });
230-
} else {
231-
for (let parsedObject of parsedResponseData) {
232-
parsedObject.identifier =
233-
parsedData["uuid"] ||
234-
parsedData["devicename"] ||
235-
parsedData["deviceName"] ||
236-
parsedData["instanceName"];
237-
incomingProtoWebBufferInst.write(parsedObject);
233+
try {
234+
const requestData = incomingData.join("");
235+
let parsedData = JSON.parse(requestData);
236+
res.writeHead(200, { "Content-Type": "application/json" });
237+
res.end("");
238+
// Validate required fields
239+
if (!parsedData.contents) {
240+
console.error("Invalid raw data: 'contents' field missing");
241+
return;
242+
}
243+
const parsedResponseData = decodePayload(
244+
parsedData.contents,
245+
"response"
246+
);
247+
if (typeof parsedResponseData === "string") {
248+
incomingProtoWebBufferInst.write({ error: parsedResponseData });
249+
} else {
250+
for (let parsedObject of parsedResponseData) {
251+
parsedObject.identifier =
252+
parsedData["uuid"] ||
253+
parsedData["devicename"] ||
254+
parsedData["deviceName"] ||
255+
parsedData["instanceName"];
256+
incomingProtoWebBufferInst.write(parsedObject);
257+
}
238258
}
259+
} catch (error) {
260+
console.error("Error processing raw request:", error);
239261
}
240262
});
241263
break;
@@ -244,22 +266,31 @@ const httpServer = http.createServer(function (req, res) {
244266
incomingData.push(chunk);
245267
});
246268
req.on("end", function () {
247-
const requestData = incomingData.join("");
248-
let parsedData = JSON.parse(requestData);
249-
res.writeHead(200, { "Content-Type": "application/json" });
250-
res.end("");
251-
const parsedRequestData = decodePayload(parsedData.contents, "request");
252-
if (typeof parsedRequestData === "string") {
253-
outgoingProtoWebBufferInst.write({ error: parsedRequestData });
254-
} else {
255-
for (let parsedObject of parsedRequestData) {
256-
parsedObject.identifier =
257-
parsedData["uuid"] ||
258-
parsedData["devicename"] ||
259-
parsedData["deviceName"] ||
260-
parsedData["instanceName"];
261-
outgoingProtoWebBufferInst.write(parsedObject);
269+
try {
270+
const requestData = incomingData.join("");
271+
let parsedData = JSON.parse(requestData);
272+
res.writeHead(200, { "Content-Type": "application/json" });
273+
res.end("");
274+
// Validate required fields
275+
if (!parsedData.contents) {
276+
console.error("Invalid debug data: 'contents' field missing");
277+
return;
278+
}
279+
const parsedRequestData = decodePayload(parsedData.contents, "request");
280+
if (typeof parsedRequestData === "string") {
281+
outgoingProtoWebBufferInst.write({ error: parsedRequestData });
282+
} else {
283+
for (let parsedObject of parsedRequestData) {
284+
parsedObject.identifier =
285+
parsedData["uuid"] ||
286+
parsedData["devicename"] ||
287+
parsedData["deviceName"] ||
288+
parsedData["instanceName"];
289+
outgoingProtoWebBufferInst.write(parsedObject);
290+
}
262291
}
292+
} catch (error) {
293+
console.error("Error processing debug request:", error);
263294
}
264295
});
265296
break;

src/utils/index.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,15 @@ export function getIPAddress() {
3434
}
3535

3636
export function handleData(incoming: WebStreamBuffer, outgoing: WebStreamBuffer, identifier: any, parsedData: string, sampleSaver?: any) {
37+
// Validate required fields
38+
if (!parsedData['protos'] || !Array.isArray(parsedData['protos'])) {
39+
console.error("Invalid traffic data: 'protos' field missing or not an array");
40+
return;
41+
}
42+
if (parsedData['protos'].length === 0) {
43+
console.error("Invalid traffic data: 'protos' array is empty");
44+
return;
45+
}
3746
for (let i = 0; i < parsedData['protos'].length; i++) {
3847
const rawRequest = parsedData['protos'][i].request || "";
3948
const rawResponse = parsedData['protos'][i].response || "";

0 commit comments

Comments
 (0)