This commit is contained in:
Sefinek committed 2025-01-18 15:51:08 +01:00
1 parent 699354b85a
commit 8322427457
8 files changed
+143 -9

No files matched your search

+2 -2
View File
@@ -20,12 +20,12 @@ Also, check this out: [sefinek/Cloudflare-WAF-To-AbuseIPDB](https://github.com/s
## ✅ Features
1. A `config.js` file enabling easy configuration.
1. A [`config.js`](default.config.js) file enabling easy configuration.
2. A simple installer allowing quick integration deployment.
3. Integration with Discord Webhooks (coming soon):
- Alerts in case of script errors
- Daily summaries of reported IP addresses
4. Automatic updates.
## 📥 Installation
+4
View File
@@ -9,6 +9,10 @@ exports.MAIN = {
ABUSEIPDB_API_KEY: '', // Secret API key for AbuseIPDB.
IP_REPORT_COOLDOWN: 12 * 60 * 60 * 1000, // The minimum time (12 hours) that must pass before reporting the same IP address again.
// Automatic updates
AUTO_UPDATE_SCHEDULE: '0 18 * * *', // Schedule for automatic script updates (CRON format). Default: every day at 18:00
AUTO_UPDATE_ENABLED: true, // Do you want the script to automatically update to the latest version using 'git pull'? (true = enabled, false = disabled)
// Project
GITHUB_REPO: 'https://github.com/sefinek/UFW-AbuseIPDB-Reporter', // If you are using a fork, provide the link to the forked repository here.
};
+3
View File
@@ -14,6 +14,9 @@ const config = require('./config.js');
const { version } = require('./package.json');
const { UFW_LOG_FILE, ABUSEIPDB_API_KEY, SERVER_ID, GITHUB_REPO } = config.MAIN;
// Updates
require('./update.js');
let fileOffset = 0;
const reportToAbuseIPDb = async (logData, categories, comment) => {
+81 -1
View File
@@ -11,7 +11,9 @@
"dependencies": {
"axios": "^1.7.9",
"chokidar": "^4.0.3",
"ipaddr.js": "^2.2.0"
"cron": "^3.5.0",
"ipaddr.js": "^2.2.0",
"simple-git": "^3.27.0"
},
"devDependencies": {
"@eslint/js": "^9.18.0",
@@ -28,6 +30,27 @@
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
}
},
"node_modules/@kwsites/file-exists": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz",
"integrity": "sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==",
"license": "MIT",
"dependencies": {
"debug": "^4.1.1"
}
},
"node_modules/@kwsites/promise-deferred": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz",
"integrity": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==",
"license": "MIT"
},
"node_modules/@types/luxon": {
"version": "3.4.2",
"resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.4.2.tgz",
"integrity": "sha512-TifLZlFudklWlMBfhubvgqTXRzLDI5pCbGa4P8a3wPyUQSW+1xQ5eDsreP9DWHX3tjq1ke96uYG/nwundroWcA==",
"license": "MIT"
},
"node_modules/asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
@@ -72,6 +95,33 @@
"node": ">= 0.8"
}
},
"node_modules/cron": {
"version": "3.5.0",
"resolved": "https://registry.npmjs.org/cron/-/cron-3.5.0.tgz",
"integrity": "sha512-0eYZqCnapmxYcV06uktql93wNWdlTmmBFP2iYz+JPVcQqlyFYcn1lFuIk4R54pkOmE7mcldTAPZv6X5XA4Q46A==",
"license": "MIT",
"dependencies": {
"@types/luxon": "~3.4.0",
"luxon": "~3.5.0"
}
},
"node_modules/debug": {
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
"integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
"license": "MIT",
"dependencies": {
"ms": "^2.1.3"
},
"engines": {
"node": ">=6.0"
},
"peerDependenciesMeta": {
"supports-color": {
"optional": true
}
}
},
"node_modules/delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
@@ -137,6 +187,15 @@
"node": ">= 10"
}
},
"node_modules/luxon": {
"version": "3.5.0",
"resolved": "https://registry.npmjs.org/luxon/-/luxon-3.5.0.tgz",
"integrity": "sha512-rh+Zjr6DNfUYR3bPwJEnuwDdqMbxZW7LOQfUN4B54+Cl+0o5zaU9RJ6bcidfDtC1cWCZXQ+nvX8bf6bAji37QQ==",
"license": "MIT",
"engines": {
"node": ">=12"
}
},
"node_modules/mime-db": {
"version": "1.52.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
@@ -158,6 +217,12 @@
"node": ">= 0.6"
}
},
"node_modules/ms": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
"license": "MIT"
},
"node_modules/proxy-from-env": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
@@ -176,6 +241,21 @@
"type": "individual",
"url": "https://paulmillr.com/funding/"
}
},
"node_modules/simple-git": {
"version": "3.27.0",
"resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.27.0.tgz",
"integrity": "sha512-ivHoFS9Yi9GY49ogc6/YAi3Fl9ROnF4VyubNylgCkA+RVqLaKWnDSzXOVzya8csELIaWaYNutsEuAhZrtOjozA==",
"license": "MIT",
"dependencies": {
"@kwsites/file-exists": "^1.1.1",
"@kwsites/promise-deferred": "^1.1.1",
"debug": "^4.3.5"
},
"funding": {
"type": "github",
"url": "https://github.com/steveukx/git-js?sponsor=1"
}
}
}
}
+3 -1
View File
@@ -25,7 +25,9 @@
"dependencies": {
"axios": "^1.7.9",
"chokidar": "^4.0.3",
"ipaddr.js": "^2.2.0"
"cron": "^3.5.0",
"ipaddr.js": "^2.2.0",
"simple-git": "^3.27.0"
},
"devDependencies": {
"@eslint/js": "^9.18.0",
+19
View File
@@ -0,0 +1,19 @@
const { exec } = require('node:child_process');
const ecosystem = require('../ecosystem.config.js');
const executeCommand = cmd =>
new Promise((resolve, reject) => {
exec(cmd, (err, stdout, stderr) => {
if (err || stderr) reject(err || stderr);
else resolve(stdout);
});
});
module.exports = async () => {
try {
console.log(await executeCommand('npm install --omit=dev'));
console.log(await executeCommand(`pm2 restart ${ecosystem.apps[0].name}`));
} catch (err) {
console.error(err);
}
};
+3 -5
View File
@@ -1,7 +1,7 @@
const os = require('node:os');
const axios = require('./axios.js');
const isLocalIP = require('../utils/isLocalIP.js');
const { MAIN } = require('../config.js');
const { REFRESHING_IP_ADDRESS } = require('../config.js').MAIN;
const ipAddressList = new Set();
@@ -20,9 +20,7 @@ const fetchIPv6Address = () => {
Object.values(networkInterfaces).forEach(interfaces => {
interfaces.forEach(details => {
const ip = details.address;
if (!details.internal && ip && !isLocalIP(ip)) {
ipAddressList.add(ip);
}
if (!details.internal && ip && !isLocalIP(ip)) ipAddressList.add(ip);
});
});
};
@@ -35,7 +33,7 @@ const fetchIPAddress = async () => {
(async () => {
await fetchIPAddress();
setInterval(fetchIPAddress, MAIN.REFRESHING_IP_ADDRESS);
setInterval(fetchIPAddress, REFRESHING_IP_ADDRESS);
// console.debug(ipAddressList);
})();
+28
View File
@@ -0,0 +1,28 @@
const { SERVER_ID, AUTO_UPDATE_SCHEDULE, AUTO_UPDATE_ENABLED } = require('./config.js').MAIN;
if (AUTO_UPDATE_ENABLED) {
const simpleGit = require('simple-git');
const { CronJob } = require('cron');
const restartApp = require('./services/reloadApp.js');
const log = require('./utils/log.js');
const git = simpleGit();
const updateScript = async () => {
log(0, 'The script is being updated...');
try {
const { summary } = await git.pull();
log(0, `Changes: ${summary.changes}; Deletions: ${summary.insertions}; Insertions: ${summary.insertions};`);
if (SERVER_ID !== 'development') await restartApp();
} catch (err) {
log(2, err.message);
}
};
// https://crontab.guru
new CronJob(AUTO_UPDATE_SCHEDULE || '0 18 * * *', updateScript, null, true, 'UTC'); // At 18:00
if (SERVER_ID === 'development') (async () => updateScript())();
}