Add stat API
This commit is contained in:
parent
3d53e09141
commit
468dcd8715
6 changed files with 80 additions and 12 deletions
|
|
@ -1,4 +1,5 @@
|
|||
HTTP_PORT=80
|
||||
HTTPS_PORT=443
|
||||
BLACKLIST_HOSTS=
|
||||
BLACKLIST_REDIRECT=
|
||||
STAT_PORT=8081
|
||||
BLACKLIST_HOSTS="bad.example,evil.example"
|
||||
BLACKLIST_REDIRECT="https://forwarddomain.net/blacklisted"
|
||||
|
|
|
|||
|
|
@ -1,5 +1,9 @@
|
|||
# CHANGES
|
||||
|
||||
## v2.3 (2022-08-16)
|
||||
|
||||
+ Add stat API `s.forwarddomain.net`, separate node script.
|
||||
|
||||
## v2.2 (2022-06-16)
|
||||
|
||||
+ Moving all parameters to `.env` file
|
||||
|
|
|
|||
|
|
@ -79,7 +79,11 @@ We only keep caches of DNS records and SSL certs. This also means we can see how
|
|||
|
||||
Star our repo and spread the word, please :)
|
||||
|
||||
Additionally, you can also help us [cover hosting costs](https://ko-fi.com/willnode).
|
||||
Additionally, you can also help us [cover hosting costs](https://github.com/sponsors/willnode).
|
||||
|
||||
## Credits
|
||||
|
||||
Things in `package.json`. I also borrow code from [zbo14/certnode](https://github.com/zbo14/certnode).
|
||||
|
||||
## Usual Disclaimer
|
||||
|
||||
|
|
|
|||
13
package-lock.json
generated
13
package-lock.json
generated
|
|
@ -5,6 +5,7 @@
|
|||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "forward-domain",
|
||||
"version": "1.0.0",
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
|
|
@ -1208,9 +1209,9 @@
|
|||
"dev": true
|
||||
},
|
||||
"node_modules/moment": {
|
||||
"version": "2.29.3",
|
||||
"resolved": "https://registry.npmjs.org/moment/-/moment-2.29.3.tgz",
|
||||
"integrity": "sha512-c6YRvhEo//6T2Jz/vVtYzqBzwvPT95JBQ+smCytzf7c50oMZRsR/a4w88aD34I+/QVSfnoAnSBFPJHItlOMJVw==",
|
||||
"version": "2.29.4",
|
||||
"resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz",
|
||||
"integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==",
|
||||
"dev": true,
|
||||
"engines": {
|
||||
"node": "*"
|
||||
|
|
@ -3041,9 +3042,9 @@
|
|||
"dev": true
|
||||
},
|
||||
"moment": {
|
||||
"version": "2.29.3",
|
||||
"resolved": "https://registry.npmjs.org/moment/-/moment-2.29.3.tgz",
|
||||
"integrity": "sha512-c6YRvhEo//6T2Jz/vVtYzqBzwvPT95JBQ+smCytzf7c50oMZRsR/a4w88aD34I+/QVSfnoAnSBFPJHItlOMJVw==",
|
||||
"version": "2.29.4",
|
||||
"resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz",
|
||||
"integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==",
|
||||
"dev": true
|
||||
},
|
||||
"moment-timezone": {
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"name": "forward-domain",
|
||||
"version": "1.0.0",
|
||||
"description": "",
|
||||
"description": "Public service to forward domain for free",
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
"test": "echo \"Error: no test specified\" && exit 1",
|
||||
|
|
@ -10,8 +10,8 @@
|
|||
"count": "find .certs -type d | grep '.\\.' | wc -l"
|
||||
},
|
||||
"keywords": [],
|
||||
"author": "",
|
||||
"license": "ISC",
|
||||
"author": "Wildan Mubarok",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"await-lock": "^2.1.0",
|
||||
"axios": "^0.21.1",
|
||||
|
|
|
|||
58
stat.js
Normal file
58
stat.js
Normal file
|
|
@ -0,0 +1,58 @@
|
|||
// separate stat endpoint
|
||||
|
||||
require('dotenv').config()
|
||||
const { execSync } = require('child_process');
|
||||
const http = require('http');
|
||||
|
||||
const updateStat = function () {
|
||||
// run npm stat
|
||||
var buffer = execSync('npm run count');
|
||||
var lines = buffer.toString('utf-8').trimEnd().split('\n');
|
||||
var stat = {
|
||||
domains: parseInt(lines[lines.length - 1]),
|
||||
iat: Date.now(),
|
||||
exp: Date.now() + 1000 * 60 * 60 * 24,
|
||||
}
|
||||
return stat;
|
||||
}
|
||||
|
||||
let cacheStat = updateStat();
|
||||
|
||||
const listener = async function ( /** @type {import('http').IncomingMessage} */ req, /** @type {import('http').ServerResponse} */ res) {
|
||||
try {
|
||||
switch (req.url) {
|
||||
case '/':
|
||||
if (cacheStat.exp < Date.now()) {
|
||||
cacheStat = updateStat();
|
||||
}
|
||||
res.writeHead(200, { 'Content-Type': 'application/json' });
|
||||
res.end(JSON.stringify(cacheStat));
|
||||
break;
|
||||
default:
|
||||
res.writeHead(404, {
|
||||
'content-type': 'application/json'
|
||||
});
|
||||
res.write(JSON.stringify({
|
||||
error: 'Unknown url'
|
||||
}));
|
||||
break;
|
||||
}
|
||||
return;
|
||||
} catch (error) {
|
||||
res.writeHead(400);
|
||||
res.write(error.message || 'Unknown error');
|
||||
} finally {
|
||||
res.end();
|
||||
}
|
||||
}
|
||||
|
||||
const server = http.createServer(listener);
|
||||
|
||||
if (require.main === module) {
|
||||
const port = parseInt(process.env.STAT_PORT || "3000");
|
||||
server.listen(port, function () {
|
||||
console.log(`server start at port ${port}`);
|
||||
});
|
||||
} else {
|
||||
module.exports = server
|
||||
}
|
||||
Loading…
Add table
editor.link_modal.header
Reference in a new issue