forked from mirrorz-org/mirrorz-monitor
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.js
executable file
·129 lines (120 loc) · 4.55 KB
/
main.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
#!/usr/bin/env node
const SITE = "https://mirrors.dgut.edu.cn";
const Timeout = require("await-timeout");
const timeout = 15000;
fetch_extra = require("node-fetch-extra");
async function fetchV6First(u, opt) {
const promise = fetch_extra(u, { family: 6, ...opt });
return await Timeout.wrap(promise, timeout / 10, "Timeout").catch(
async (e) => {
const promise = fetch_extra(u, opt);
return await Timeout.wrap(promise, timeout / 3, "Timeout").catch(
() => null
);
}
);
}
global.fetch = fetchV6First;
// cname: async (repourl: string) => unix_timestamp: int
const GETTERS = {
archlinux: require("./lastupdate/archlinux"),
arch4edu: require("./lastupdate/arch4edu"),
archlinuxcn: require("./lastupdate/archlinuxcn"),
blackarch: require("./lastupdate/blackarch"),
anthon: require("./lastupdate/anthon"),
centos: require("./lastupdate/centos"),
"centos-altarch": require("./lastupdate/centos-altarch"),
"centos-vault": require("./lastupdate/centos-vault"),
ceph: require("./lastupdate/ceph"),
chakra: require("./lastupdate/chakra"),
CTAN: require("./lastupdate/CTAN"),
debian: require("./lastupdate/debian"),
"debian-cd": require("./lastupdate/debian-cd"),
"debian-security": require("./lastupdate/debian-security"),
deepin: require("./lastupdate/deepin"),
gnu: require("./lastupdate/gnu"),
"gnu-alpha": require("./lastupdate/gnu-alpha"),
kali: require("./lastupdate/kali"),
"kali-images": require("./lastupdate/kali-images"),
mageia: require("./lastupdate/mageia"),
manjaro: require("./lastupdate/manjaro"),
"manjaro-arm": require("./lastupdate/manjaro-arm"),
mariadb: require("./lastupdate/mariadb"),
msys2: require("./lastupdate/msys2"),
postgresql: require("./lastupdate/postgresql"),
ubuntu: require("./lastupdate/ubuntu"),
"ubuntu-releases": require("./lastupdate/ubuntu-releases"),
};
/** The END upstreams, not to include trailing slashes */
const UPSTREAMS = {
archlinux: "https://mirror.pkgbuild.com",
archlinuxcn: "https://repo.archlinuxcn.org",
centos: "http://mirror.centos.org/centos",
CTAN: "http://dante.ctan.org/tex-archive",
debian: "https://deb.debian.org/debian",
"debian-cd": "https://cdimage.debian.org/debian-cd",
"debian-security": "https://deb.debian.org/debian-security",
deepin: "http://packages.deepin.com/deepin",
"deepin-cd": "http://packages.deepin.com/deepin-cd",
epel: "https://download-ib01.fedoraproject.org/pub/epel",
kali: "https://archive.kali.org/kali",
"kali-images": "https://archive.kali.org/kali-images",
kicad: "https://kicad-downloads.s3.cern.ch",
manjaro: "https://repo.manjaro.org/repo",
"nixos-images": "https://channels.nixos.org",
php: "https://www.php.net/distributions",
raspberrypi: "https://archive.raspberrypi.org/debian",
raspbian: "https://archive.raspbian.org",
termux: "https://packages.termux.org",
ubuntu: "http://archive.ubuntu.com/ubuntu",
"ubuntu-releases": "https://releases.ubuntu.com/releases",
ubuntukylin: "http://archive.ubuntukylin.com/ubuntukylin",
"ubuntukylin-cd": "http://cdimage.ubuntukylin.com/releases/basic",
};
const { InfluxDB, Point, HttpError } = require("@influxdata/influxdb-client");
const { url, token, org, bucket } = require("./env");
const writeApi = new InfluxDB({ url, token }).getWriteApi(org, bucket, "ns");
/** Make sure a failure on a distro doesn't affect monitoring other distros */
async function getLastUpdated(name, baseUrl) {
try {
return await GETTERS[name](baseUrl);
} catch (err) {
console.error(err);
return null;
}
}
async function main() {
const resp = await fetch(`${SITE}/static/status.json`);
const status = await resp.json();
for (const distro of status) {
const lastUpdated =
distro.name in GETTERS
? await getLastUpdated(distro.name, `${SITE}/${distro.name}`)
: distro.last_update_ts;
const upstreamUpdated =
distro.name in GETTERS && distro.name in UPSTREAMS
? await getLastUpdated(distro.name, UPSTREAMS[distro.name])
: Math.round(Date.now() / 1000);
if (lastUpdated && upstreamUpdated) {
const p = new Point("delay")
.timestamp(new Date())
.tag("name", distro.name)
.intField("value", upstreamUpdated - lastUpdated);
writeApi.writePoint(p);
}
}
writeApi
.close()
.then(() => {
//console.log('FINISHED')
process.exit(0);
})
.catch((e) => {
if (e instanceof HttpError && e.statusCode === 401) {
console.log("Should setup a new InfluxDB database.");
}
console.log("\nFinished ERROR");
process.exit(0);
});
}
main();