From dd2baec866debe62153869c4cf96dfab9783c6cb Mon Sep 17 00:00:00 2001 From: Alicia Sykes Date: Fri, 7 Jul 2023 21:30:54 +0100 Subject: [PATCH] Fix for when Traceroute is not installed on host --- server/lambda/trace-route.js | 85 ++++++++++++++++++++++++++++-------- src/pages/Results.tsx | 15 ++++--- 2 files changed, 77 insertions(+), 23 deletions(-) diff --git a/server/lambda/trace-route.js b/server/lambda/trace-route.js index c90fc13..8720c65 100644 --- a/server/lambda/trace-route.js +++ b/server/lambda/trace-route.js @@ -1,37 +1,88 @@ const traceroute = require('traceroute'); -const util = require('util'); const url = require('url'); -// Convert traceroute.trace method to return a Promise -const traceroutePromise = util.promisify(traceroute.trace); - exports.handler = async function(event, context) { const urlString = event.queryStringParameters.url; const startTime = Date.now(); try { if (!urlString) { - throw new Error('URL parameter is missing!'); + + return { + statusCode: 400, + body: JSON.stringify({ + + + error: 'URL parameter is missing!' + }), + }; } // Parse the URL and get the hostname const urlObject = url.parse(urlString); const host = urlObject.hostname; - + if (!host) { - throw new Error('Invalid URL provided'); + + return { + statusCode: 400, + body: JSON.stringify({ + error: 'Invalid URL provided' + }), + }; } - const result = await traceroutePromise(host); - const timeTaken = Date.now() - startTime; - return { - statusCode: 200, - body: JSON.stringify({ message: "Traceroute completed!", result, timeTaken }), - }; + // Traceroute with callback + return await new Promise((resolve, reject) => { + traceroute.trace(host, (err, hops) => { + if (err) { + reject(err); + } else if (hops) { + resolve(hops); + } + }); + // Check if remaining time is less than 8.8 seconds, then reject promise + if (context.getRemainingTimeInMillis() < 8800) { + reject(new Error('Lambda is about to timeout')); + } + }).then((result) => { + const timeTaken = Date.now() - startTime; + + return { + statusCode: 200, + body: JSON.stringify({ + message: "Traceroute completed!", + result, + timeTaken + }), + }; + }).catch((err) => { + return { + statusCode: 500, + body: JSON.stringify({ + error: err.message + }), + }; + }); + + } catch (err) { - return { - statusCode: 500, - body: JSON.stringify({ message: `Error: ${err.message}` }), - }; + if (err.code === 'ENOENT') { + + return { + statusCode: 400, + body: JSON.stringify({ + error: 'Traceroute command is not installed on the host.' + }), + }; + } else { + + return { + statusCode: 500, + body: JSON.stringify({ + error: err.message + }), + }; + } } }; diff --git a/src/pages/Results.tsx b/src/pages/Results.tsx index 46da0cb..73e385b 100644 --- a/src/pages/Results.tsx +++ b/src/pages/Results.tsx @@ -9,6 +9,7 @@ import Card from 'components/Form/Card'; import Modal from 'components/Form/Modal'; import Footer from 'components/misc/Footer'; import { RowProps } from 'components/Form/Row'; +import ErrorBoundary from 'components/misc/ErrorBoundary'; import docs from 'utils/docs'; @@ -435,12 +436,14 @@ const Results = (): JSX.Element => { { resultCardData.map(({ id, title, result, refresh, Component }, index: number) => ( (result && !result.error) ? ( - showInfo(id)) : undefined} - /> + + showInfo(id)) : undefined} + /> + ) : <> )) }