summaryrefslogtreecommitdiffstats
path: root/skripti/ipranges.php
blob: a09e651866ec2bb3a04b388b75af722239482487 (plain) (blame)
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
#!/usr/bin/php
<?php
/**
 * program izpiše bind9 aclje za države v ripe območju.
 * privzeto izpiše vse, vendar bind9 umre ob prevelikem številu acljev
 * uporaba: ./ipranges.php si de hr it
 *      ali ./ipranges.php
 *      ali ./ipranges.php json
 *      ali ./ipranges.php moodle si de hr it
 *      ali ./ipranges.php moodle
 *      ali ./ipranges.php moodle4 # samo ipv4 naslovi
 * v argumentih lahko torej povemo, za katere države želimo aclje
 * moodle se navezuje na polje za vnos IPjev v pluginu multi-factor authentication
 * https://ucilnica.fmf.uni-lj.si/admin/settings.php?section=factor_iprange
 * z drugimi besedami izpiše range, ločene z newlineom
 * POZOR: output tip moodle odstrani tiste ranges, ki so oblike xxx-yyy!!!
 */
$a = "";
$p = [];
$c = [];
$response = file_get_contents("https://ftp.ripe.net/pub/stats/ripencc/membership/alloclist.txt");
if ($response === false)
	exit(1);
if (isset($_REQUEST["argv"])) {
	$argv = $_REQUEST["argv"];
	$invocation = $_SERVER["REQUEST_SCHEME"] . "://" . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"];
} else
	$invocation = implode(" ", $argv);
foreach (explode("\n", $response) as $l) {
	if ($l == "")
		continue;
	if ($l[0] != " ") {
		$a = trim($l);
		$p[$a] = [];
		$c[explode(".", $a)[0]][] = $a;
		continue;
	}
	if (strchr(trim($l), "\t") !== false)
		$p[$a]["ranges"][] = explode("\t", trim($l));
	else
		$p[$a]["name"] = trim($l);
}
ksort($p);
if (sizeof($argv) == 2 && strtolower($argv[1]) == "json") {
	if (isset($_REQUEST["argv"]))
		header("Content-Type: application/json");
	die(json_encode(["meta" => ["generator" => "http://ni.4a.si/sijanec/r/tree/skripti/ipranges.php", "invocation" => $invocation, "date" => date("Y-m-d H:i:s")], "data" => $p]) . PHP_EOL);
}
if (str_contains(strtolower($argv[1]), "moodle")) {
	if (isset($_REQUEST["argv"])) {
		header("Content-Type: text/plain");
		echo "# " . $invocation  . PHP_EOL;
	} else
		echo "# " . $invocation . PHP_EOL;
	echo "# http://ni.4a.si/sijanec/r/tree/skripti/ipranges.php" . PHP_EOL . "# " . date("Y-m-d H:i:s") . PHP_EOL;
	echo PHP_EOL;
	foreach ($p as $k => $v) {
		if (sizeof($argv) > 2)
			if (!in_array(explode(".", $k)[0], $argv))
				continue;
		echo "# $k\t{$v["name"]}" . PHP_EOL;
		foreach($v["ranges"] as $r) {
			if (str_contains($argv[1], "4") && str_contains($r[1], ":"))
				continue;
			if (str_contains($r[1], "-"))
				continue;
			echo "{$r[1]}\t# {$r[0]}" . PHP_EOL;
		}
		echo PHP_EOL;
	}
	die();
}
if (isset($_REQUEST["argv"]))
	header("Content-Type: text/plain");
echo "// http://ni.4a.si/sijanec/r/tree/skripti/ipranges.php" . PHP_EOL . "// $invocation" . PHP_EOL . "// " . date("Y-m-d H:i:s") . PHP_EOL . PHP_EOL;
foreach ($p as $k => $v) {
	if (sizeof($argv) > 1)
		if (!in_array(explode(".", $k)[0], $argv))
			continue;
	echo "acl $k {\t// {$v['name']}" . PHP_EOL;
	foreach ($v["ranges"] as $r) {
		echo "\t{$r[1]}; //\t{$r[0]}" . PHP_EOL;
	}
	echo "};" . PHP_EOL;
}
foreach ($c as $k => $v) {
	if (sizeof($argv) > 1)
		if (!in_array($k, $argv))
			continue;
	echo "acl $k {" . PHP_EOL;
	foreach ($v as $a) {
		echo "\t$a;\t// {$p[$a]["name"]}" . PHP_EOL;
	}
	echo "};" . PHP_EOL;
}
str_replace("/", "", str_replace(".", "", array_shift($argv)));
echo "acl ipranges.php {" . PHP_EOL;
foreach ($argv as $a) {
	echo "\t$a;" . PHP_EOL;
}
echo "};" . PHP_EOL;