]> git.sesse.net Git - nms/blob - web/overlay.pl
21eff198badc0f7778cb3e0f0c33b75e80ed4ecd
[nms] / web / overlay.pl
1 #! /usr/bin/perl
2 use GD;
3 use LWP::Simple;
4 use CGI;
5 use DBI;
6
7 my $cgi = CGI->new;
8 my $dbh = DBI->connect("dbi:Pg:dbname=snmpfetch;host=violet.tg05.gathering.org", "snmpfetch", "removed")
9 or die "Couldn't connect to database";
10
11 my $cam = $cgi->param('cam');
12 if (!defined($cam) || ($cam ne "1" && $cam ne "2")) {
13         $cam = 1;
14 }
15
16 GD::Image->trueColor(1);
17 my $imgfile = LWP::Simple::get(($cam == 1) ? 'http://tgcam.jodal.no/techserver.php' : 'http://tgcam.jodal.no/crewcam.php')
18         or die "LWP: $!";
19 my $gd = GD::Image->newFromJpegData($imgfile)
20         or die "GD: $!";
21
22 my @coeffs;
23 if ($cam == 1)  {
24         @coeffs = (
25                 2.295433895, -3.779680538, 1041.484066,
26                 0.2246879859, 6.923972919, -1575.662172,
27                 -0.0004822922595, 0.01151624710, -1.684908753
28         );
29 } else {
30         @coeffs = (
31                 3.656223906, -6.265111699, 863.9199590,
32                 -5.954616242, 51.56856164, -9307.725196,
33                 -0.006634136987, 0.04963057393, -7.875733154
34         );
35 }
36
37 # fetch our data
38 my $q = $dbh->prepare('select * from switches natural left join
39                 ( select switch,sum(bytes_in)/count(*) as
40                   bytes_in,sum(bytes_out)/count(*) as bytes_out from get_datarate() group
41                   by switch ) t1 where ip<>\'127.0.0.1\' and sysname like \'e%-%sw\'');
42 $q->execute();
43
44 my %sc = ();
45 while (my $ref = $q->fetchrow_hashref()) {
46         if (defined($ref->{'bytes_in'})) {
47                 my $intensity = 0.0;
48                 my $traffic = 4.0 * $ref->{'bytes_in'} + $ref->{'bytes_out'};  # average and convert to bits (should be about the same in practice)
49
50                 my $max = 20_000_000.0;   # 10mbit
51                 my $min =    100_000.0;   # 100kbit
52                 if ($traffic >= $min) {
53                         $intensity = 2.0 * (log($traffic / $min) / log(10)) / (log($max / $min) / log(10));
54                         $intensity = 2.0 if ($intensity > 2.0);
55                 }
56
57                 $sc{$ref->{'sysname'}} = get_color($intensity);
58         }
59 }
60
61 for my $y (0..479) {
62         for my $x (0..639) {
63                 my $z = 1.0;
64
65                 my $nx = $coeffs[0] * $x + $coeffs[1] * $y + $coeffs[2] * $z;
66                 my $ny = $coeffs[3] * $x + $coeffs[4] * $y + $coeffs[5] * $z;
67                 my $nz = $coeffs[6] * $x + $coeffs[7] * $y + $coeffs[8] * $z;
68
69                 my $kx = $nx / $nz + (($cam == 2) ? 700 : 0);
70                 my $ky = $ny / $nz + (($cam == 2) ? -15 : 0);
71
72                 if ($kx >= 0 && $kx < 640 && $ky >= 0 && $ky < 476) {
73                         my $col = int($kx / 213) + 1;
74                         my $row = int($ky / 32) * 2 + 5;
75
76                         my $gnf = $sc{"e$row-${col}sw"};
77                         if (defined($gnf)) {
78                                 my ($ra, $ga, $ba) = $gd->rgb($gd->getPixel($x, $y));
79                                 my ($rb, $gb, $bb) = $gd->rgb($gnf);
80
81                                 my $f = 0.5;
82
83                                 my $r = $ra * (1.0 - $f) + $rb * $f;
84                                 my $g = $ga * (1.0 - $f) + $gb * $f;
85                                 my $b = $ba * (1.0 - $f) + $bb * $f;
86
87                                 $gd->setPixel($x, $y, $gd->colorAllocate($r, $g, $b));
88                         }
89                 }
90                 if ($kx >= 680 && $kx < 1280 && $ky >= 0 && $ky < 476) {
91                         my $col = int(($kx - 680) / 213) + 4;
92                         my $row = int($ky / 32) * 2 + 5;
93
94                         my $gnf = $sc{"e$row-${col}sw"};
95                         if (defined($gnf)) {
96                                 my ($ra, $ga, $ba) = $gd->rgb($gd->getPixel($x, $y));
97                                 my ($rb, $gb, $bb) = $gd->rgb($gnf);
98
99                                 my $f = 0.5;
100
101                                 my $r = $ra * (1.0 - $f) + $rb * $f;
102                                 my $g = $ga * (1.0 - $f) + $gb * $f;
103                                 my $b = $ba * (1.0 - $f) + $bb * $f;
104
105                                 $gd->setPixel($x, $y, $gd->colorAllocate($r, $g, $b));
106                         }
107                 }
108                 if ($kx >= 0 && $kx < 640 && $ky >= 510 && $ky < 1050) {
109                         my $col = int($kx / 213) + 1;
110                         my $row = int($ky / 32) * 2 + 5;
111
112                         my $gnf = $sc{"e$row-${col}sw"};
113                         if (defined($gnf)) {
114                                 my ($ra, $ga, $ba) = $gd->rgb($gd->getPixel($x, $y));
115                                 my ($rb, $gb, $bb) = $gd->rgb($gnf);
116
117                                 my $f = 0.5;
118
119                                 my $r = $ra * (1.0 - $f) + $rb * $f;
120                                 my $g = $ga * (1.0 - $f) + $gb * $f;
121                                 my $b = $ba * (1.0 - $f) + $bb * $f;
122
123                                 $gd->setPixel($x, $y, $gd->colorAllocate($r, $g, $b));
124                         }
125                 }
126                 if ($kx >= 680 && $kx < 1280 && $ky >= 510 && $ky < 1050) {
127                         my $col = int(($kx - 680) / 213) + 4;
128                         my $row = int($ky / 32) * 2 + 5;
129
130                         my $gnf = $sc{"e$row-${col}sw"};
131                         if (defined($gnf)) {
132                                 my ($ra, $ga, $ba) = $gd->rgb($gd->getPixel($x, $y));
133                                 my ($rb, $gb, $bb) = $gd->rgb($gnf);
134
135                                 my $f = 0.5;
136
137                                 my $r = $ra * (1.0 - $f) + $rb * $f;
138                                 my $g = $ga * (1.0 - $f) + $gb * $f;
139                                 my $b = $ba * (1.0 - $f) + $bb * $f;
140
141                                 $gd->setPixel($x, $y, $gd->colorAllocate($r, $g, $b));
142                         }
143                 }
144         }
145 }
146
147
148 print CGI::header(-type=>'image/png', -refresh=>'10; http://nms.tg05.gathering.org/overlay.pl?cam=' . $cam);
149 print $gd->png;
150
151 sub get_color {
152         my $intensity = shift;
153         my $gamma = 1.0/1.90;
154         if ($intensity > 1.0) {
155                 return $gd->colorAllocate(255.0, 255.0 * ((2.0 - $intensity) ** $gamma), 0);
156         } else {
157                 return $gd->colorAllocate(255.0 * ($intensity ** $gamma), 255, 0);
158         }
159 }
160