├── .gitignore ├── README ├── backend ├── app.js ├── config.js └── scripts │ ├── cisco_wlc_bands.sh │ ├── cisco_wlc_clients.sh │ ├── dashboard.sh │ ├── gsm.sh │ ├── icinga_wired_clients.sh │ ├── juniper_bandwidth.sh │ ├── nat64.sh │ ├── ohm.sh │ ├── openbeacon.sh │ ├── poc.sh │ ├── radiation.sh │ ├── sflow_protocols.sh │ └── streaming.sh ├── frontend ├── app.js ├── config.js ├── public │ ├── css │ │ ├── c3netmon.css │ │ ├── c3netmon_29c3.css │ │ ├── c3netmon_30c3.css │ │ ├── font-awesome-ie7.css │ │ ├── font-awesome.css │ │ └── socialshareprivacy.css │ ├── font │ │ ├── fontawesome-webfont.eot │ │ ├── fontawesome-webfont.svg │ │ ├── fontawesome-webfont.ttf │ │ └── fontawesome-webfont.woff │ ├── img │ │ ├── 2-klick-logo.jpg │ │ ├── 28c3.png │ │ ├── 29c3.png │ │ ├── Blackhole-2880x1600.jpg │ │ ├── carbon_fibre_big.png │ │ ├── dummy_facebook.png │ │ ├── dummy_facebook_en.png │ │ ├── dummy_gplus.png │ │ ├── dummy_gplus_alt.png │ │ ├── dummy_twitter.png │ │ ├── fremaks.png │ │ ├── loader.gif │ │ ├── logo-30c3.png │ │ ├── logo-31c3.png │ │ ├── ohm2013_logo.png │ │ ├── ps_neutral.png │ │ ├── settings.png │ │ ├── socialshareprivacy_info.png │ │ └── socialshareprivacy_on_off.png │ └── js │ │ ├── c3data.js │ │ ├── c3graph.js │ │ └── jquery.socialshareprivacy.js └── views │ ├── detail.html │ └── index.html ├── install.sh ├── release.sh └── screenshots ├── 28c3-1.png ├── 28c3-2.png ├── 28c3-3.png ├── 28c3-4.png └── ohm2013.png /.gitignore: -------------------------------------------------------------------------------- 1 | *.lck 2 | *.json 3 | */node_modules/* 4 | *.swp 5 | *.swo 6 | 7 | -------------------------------------------------------------------------------- /README: -------------------------------------------------------------------------------- 1 | 333333 tt 2 | cccc 3333 nn nnn eee tt mm mm mmmm oooo nn nnn 3 | cc 3333 nnn nn ee e tttt mmm mm mm oo oo nnn nn 4 | cc 333 nn nn eeeee tt mmm mm mm oo oo nn nn 5 | ccccc 333333 nn nn eeeee tttt mmm mm mm oooo nn nn 6 | (c) - morpheus - morpheus@morphhome.net 7 | - UI by _exe 8 | 9 | AUTOMATIC INSTALL 10 | 11 | 1. install & start memcache 12 | 2. install Node.Js (http://nodejs.org/) 13 | 4. git clone https://github.com/FremaksGmbH/c3netmon-public.git 14 | 5. cd c3netmon-public; chmod +x install.sh; ./install.sh 15 | 16 | CONFIGURATION 17 | 18 | 1. change backend config in backend/config.js [hint: user/group + memcache ip/port] 19 | 2. change frontend config in backend/config.js [hint: user/group + memcache ip/port] 20 | 3. test if c3netmon is working by starting frontend & backend 21 | 3a. cd backend/; node app.js 22 | 3b. cd frontend/; node app.js 23 | 4. test c3netmon with your web broweser 24 | 5. disable dummy data & debug mode in backend config 25 | 6. write your own scripts and modify the frontend & backend to use your data! 26 | 27 | STARTUP BACKEND (start memcached first!) 28 | 29 | cd backend 30 | NODE_ENV=production node app.js 31 | 32 | STARTUP FRONTEND (start memcached first!) 33 | 34 | cd frontend 35 | NODE_ENV=production node app.js 36 | 37 | EXTERNAL LIBRARIES USED 38 | 39 | - nodememcache -> See https://github.com/elbart/node-memcache 40 | - node express -> See http://expressjs.com/ 41 | - Rickshaw -> Copyright (C) 2011 by Shutterstock Images, LLC -> See https://github.com/shutterstock/rickshaw 42 | - jQuery JavaScript Library v1.7.1 -> Copyright (C) 2011 by The Dojo Foundation -> See http://jquery.org/ 43 | - Socket.IO.js -> Copyright (C) 2011 by LearnBoost -> See http://socket.io/ 44 | - d3 -> Copyright (C) 2011 Mike Bostock -> See http://mbostock.github.com/d3/ 45 | - jQuery UI 1.9.2 -> Copyright 2012, AUTHORS.txt -> See http://jqueryui.com/about 46 | 47 | LICENSE 48 | 49 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 50 | 51 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 52 | 53 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 54 | 55 | -------------------------------------------------------------------------------- /backend/app.js: -------------------------------------------------------------------------------- 1 | var fs = require('fs'), 2 | util = require('util'), 3 | http = require('http'), 4 | https = require('https'), 5 | exec = require('child_process').exec, 6 | config = require('./config'); 7 | 8 | var child; 9 | 10 | // change to non root if run as root 11 | process.setgid(config.nodeUserGid); 12 | process.setuid(config.nodeUserUid); 13 | 14 | // temp data for calulating current bandwith 15 | var temp = {} 16 | temp.collectedData = null; 17 | temp.last_bw_down = null; 18 | temp.last_bw_up = null; 19 | 20 | var cache = {} 21 | cache.bw = {} 22 | cache.bw.down = null; 23 | cache.bw.up = null; 24 | cache.bwreal = {} 25 | cache.bwreal.down = null; 26 | cache.bwreal.up = null; 27 | 28 | // initialzing data & info cache 29 | var data = {} 30 | var info = {} 31 | info.plugins = [] 32 | 33 | // connect to memcache 34 | var memcache = require('memcache'); 35 | var memcacheConnection = new memcache.Client(config.memcache.port, config.memcache.host); 36 | memcacheConnection.connect(); 37 | 38 | // initial run + timing 39 | initBandwidthData(); 40 | getBandwidthData(); 41 | setInterval(getBandwidthData, 30000); 42 | 43 | /* 44 | initClientsData(); 45 | getClientsData(); 46 | setInterval(getClientsData, 50000); 47 | */ 48 | 49 | initWirelessBandsData(); 50 | getWirelessBandsData(); 51 | setInterval(getWirelessBandsData, 60000); 52 | 53 | /* 54 | 55 | initPocData(); 56 | getPocData(); 57 | setInterval(getPocData, 120000); 58 | 59 | initGSMData(); 60 | getGSMData(); 61 | setInterval(getGSMData, 30000); 62 | 63 | initOHMStreamingData(); 64 | getOHMStreamingData(); 65 | setInterval(getOHMStreamingData, 60000); 66 | 67 | initnat64Data(); 68 | getnat64Data(); 69 | setInterval(getnat64Data, 60000); 70 | 71 | initprotocolsData(); 72 | getprotocolsData(); 73 | setInterval(getprotocolsData, 20000); 74 | 75 | initengelData(); 76 | getengelData(); 77 | setInterval(getengelData, 60000); 78 | 79 | initdashboardData(); 80 | getdashboardData(); 81 | setInterval(getdashboardData, 20000); 82 | */ 83 | 84 | setInterval(writeData, 10000); 85 | 86 | /*initOpenBeaconData();*/ 87 | /*getOpenBeaconData();*/ 88 | /*setInterval(getOpenBeaconData, 20000);*/ 89 | 90 | /*initRadiationData();*/ 91 | /*getRadiationData();*/ 92 | /*setInterval(getRadiationData, 30000);*/ 93 | 94 | function writeData() { 95 | // wait for first successfull run of getBandwidthData(); 96 | if (data.collectedData != null) { 97 | if (config.debug) { console.log("running writeData() -> writing data to memcache"); 98 | }; 99 | 100 | dateTemp = new Date; 101 | var unixtimeMs = dateTemp.getTime(); 102 | var unixtime = parseInt(unixtimeMs / 1000); 103 | unixtime += 3600; // timezone offset (maybe you've to comment this out) 104 | 105 | memcacheConnection.set('backendData', JSON.stringify(data), function (error, result) {}, 600); // write data to memcache 106 | 107 | memcacheConnection.set('backendInfo', JSON.stringify(info), function (error, result) {}, 600); // write data to memcache 108 | 109 | memcacheConnection.set('lastData', unixtime, function (error, result) {}, 600); // write last update time to memcache 110 | } 111 | } 112 | 113 | function initBandwidthData() 114 | { 115 | info.plugins.push("bw"); 116 | info.bw = {}; 117 | info.bw.name = 'Uplink Bandwidth'; 118 | info.bw.legend = []; 119 | info.bw.legend.push("Downstream"); 120 | info.bw.legend.push("Upstream"); 121 | info.bw.type = []; 122 | info.bw.type.push("mbit/s"); 123 | info.bw.type.push("mbit/s"); 124 | } 125 | 126 | function getBandwidthData() { 127 | if (config.debug) { console.log("running getBandwidthData()"); 128 | }; 129 | 130 | if (!config.dummy) { 131 | 132 | data.bw = {}; 133 | data.bw.value = []; 134 | 135 | child = exec("./scripts/juniper_bandwidth.sh down", function (error, tempbwdown, stderr) { 136 | temp.last_bw_down = cache.bw.down; 137 | cache.bw.down = parseInt(tempbwdown); 138 | 139 | // 32bit counter work arround - use 64bit counters(!) 140 | if (temp.last_bw_down > cache.bw.down) { 141 | cache.bwreal.down = parseInt(((4294967295 - temp.last_bw_down + cache.bw.down) / 30 / 1024 / 1024 * 8)); 142 | } else { 143 | cache.bwreal.down = parseInt(((cache.bw.down - temp.last_bw_down) / 30 / 1024 / 1024 * 8)); 144 | } 145 | 146 | 147 | 148 | }); 149 | child = exec("./scripts/juniper_bandwidth.sh up", function (error, tempbwup, stderr) { 150 | temp.last_bw_up = cache.bw.up; 151 | cache.bw.up = parseInt(tempbwup); 152 | 153 | // 32bit counter work arround - use 64bit counters(!) 154 | if (temp.last_bw_up > cache.bw.up) { 155 | cache.bwreal.up = parseInt(((4294967295 - temp.last_bw_up + cache.bw.up) / 30 / 1024 / 1024 * 8)); 156 | } else { 157 | cache.bwreal.up = parseInt(((cache.bw.up - temp.last_bw_up) / 30 / 1024 / 1024 * 8)); 158 | } 159 | }); 160 | 161 | console.log(cache.bwreal.up) 162 | console.log(cache.bwreal.down) 163 | 164 | // change this so it represents your up/down limits 165 | if (cache.bwreal.up < 30000 && cache.bwreal.up > 0 && cache.bwreal.down < 30000 && cache.bwreal.down > 0) { 166 | data.collectedData = 1; 167 | 168 | data.bw.value.push(parseInt(cache.bwreal.down)); 169 | data.bw.value.push(parseInt(cache.bwreal.up)); 170 | } 171 | 172 | } else { 173 | data.collectedData = 1; 174 | 175 | data.bw = {}; 176 | 177 | var now = new Date(); 178 | 179 | data.bw.value = []; 180 | data.bw.value.push(parseInt(now.getMinutes())); 181 | data.bw.value.push(parseInt(now.getMinutes())); 182 | 183 | } 184 | 185 | } 186 | 187 | function initClientsData() 188 | { 189 | info.plugins.push("clients"); 190 | info.clients = {}; 191 | info.clients.name = 'Clients'; 192 | info.clients.legend = []; 193 | info.clients.legend.push("Wireless"); 194 | info.clients.type = []; 195 | info.clients.type.push(""); 196 | info.clients.type.push(""); 197 | } 198 | 199 | function getClientsData() { 200 | if (config.debug) { console.log("running getClientsData()"); 201 | }; 202 | 203 | if (!config.dummy) { 204 | 205 | data.collectedData = 1; 206 | 207 | data.clients = {}; 208 | data.clients.value = []; 209 | 210 | try 211 | { 212 | 213 | child = exec("./scripts/cisco_wlc_clients.sh", function (error, tempclientswireless, stderr) { 214 | 215 | data.clients.value.push(parseInt(tempclientswireless)); 216 | 217 | }); 218 | 219 | } catch (e) {} 220 | 221 | } else { 222 | 223 | 224 | 225 | } 226 | 227 | } 228 | 229 | function initWirelessBandsData() 230 | { 231 | info.plugins.push("wireless"); 232 | info.wireless = {}; 233 | info.wireless.name = 'Wireless Bands'; 234 | info.wireless.legend = []; 235 | info.wireless.legend.push("A"); 236 | info.wireless.legend.push("G"); 237 | info.wireless.legend.push("N (2,4)"); 238 | info.wireless.legend.push("N (5)"); 239 | info.wireless.type = []; 240 | info.wireless.type.push(""); 241 | info.wireless.type.push(""); 242 | info.wireless.type.push(""); 243 | info.wireless.type.push(""); 244 | } 245 | 246 | function getWirelessBandsData() { 247 | if (config.debug) { console.log("running getWirelessBandsData()"); 248 | }; 249 | 250 | if (!config.dummy) { 251 | 252 | try { 253 | child = exec("./scripts/cisco_wlc_bands.sh", function (error, tempwirelessbands, stderr) { 254 | 255 | data.wireless = {}; 256 | 257 | data.wireless.value = []; 258 | 259 | var tempwirelessbandssplit = tempwirelessbands.split(":"); 260 | data.wireless.value.push(parseInt(tempwirelessbandssplit[0])); 261 | data.wireless.value.push(parseInt(tempwirelessbandssplit[1])); 262 | data.wireless.value.push(parseInt(tempwirelessbandssplit[2])); 263 | data.wireless.value.push(parseInt(tempwirelessbandssplit[3])); 264 | }); 265 | 266 | } catch (e) {} 267 | 268 | } else { 269 | 270 | data.wireless = {}; 271 | 272 | var now = new Date(); 273 | 274 | data.wireless.value = []; 275 | data.wireless.value.push(parseInt(now.getMinutes())); 276 | data.wireless.value.push(parseInt(now.getMinutes())); 277 | data.wireless.value.push(parseInt(now.getMinutes())); 278 | data.wireless.value.push(parseInt(now.getMinutes())); 279 | } 280 | } 281 | 282 | function initIPProtocolsData() 283 | { 284 | info.plugins.push("protocols"); 285 | info.protocols = {}; 286 | info.protocols.name = 'IP Protocol Distribution'; 287 | info.protocols.legend = []; 288 | info.protocols.legend.push("IPv4"); 289 | info.protocols.legend.push("IPv6"); 290 | info.protocols.type = []; 291 | info.protocols.type.push("%"); 292 | info.protocols.type.push("%"); 293 | } 294 | 295 | function getIPProtocolsData() { 296 | if (config.debug) { console.log("running getIPProtocolsData()"); 297 | }; 298 | 299 | if (!config.dummy) { 300 | 301 | try { 302 | child = exec("./scripts/sflow_protocols.sh", function (error, tempprotocols, stderr) { 303 | var tempprotocolssplit = tempprotocols.split(":"); 304 | cache.protocols.ipv4 = parseInt(tempprotocolssplit[0]); 305 | cache.protocols.ipv6 = parseInt(tempprotocolssplit[1]); 306 | }); 307 | 308 | } catch (e) {} 309 | 310 | } else { 311 | 312 | data.protocols = {}; 313 | 314 | var now = new Date(); 315 | 316 | data.protocols.value = []; 317 | data.protocols.value.push(parseInt(now.getMinutes())); 318 | data.protocols.value.push(parseInt(now.getMinutes())); 319 | 320 | } 321 | 322 | } 323 | 324 | function initOpenBeaconData() 325 | { 326 | info.plugins.push("openbeacon"); 327 | info.openbeacon = {}; 328 | info.openbeacon.name = 'OpenBeacon'; 329 | info.openbeacon.legend = []; 330 | info.openbeacon.legend.push("r0kets"); 331 | info.openbeacon.type = []; 332 | info.openbeacon.type.push(""); 333 | } 334 | 335 | function getOpenBeaconData() { 336 | if (config.debug) { console.log("running getOpenBeaconData()"); 337 | }; 338 | 339 | if (!config.dummy) { 340 | 341 | try { 342 | 343 | child = exec("./scripts/openbeacon.sh", function (error, tempopenbeacon, stderr) { 344 | cache.openbeacon.connected = parseInt(tempopenbeacon); 345 | }); 346 | 347 | } catch (e) {} 348 | 349 | } else { 350 | 351 | data.openbeacon = {}; 352 | 353 | var now = new Date(); 354 | 355 | data.openbeacon.value = []; 356 | data.openbeacon.value.push(parseInt(now.getMinutes())); 357 | 358 | } 359 | 360 | } 361 | 362 | function initRadiationData() 363 | { 364 | info.plugins.push("radiation"); 365 | info.radiation = {}; 366 | info.radiation.name = 'Radiation'; 367 | info.radiation.legend = []; 368 | info.radiation.legend.push("Radiation"); 369 | info.radiation.type = []; 370 | info.radiation.type.push(""); 371 | } 372 | 373 | function getRadiationData() { 374 | if (config.debug) { console.log("running getRadiationData()"); 375 | }; 376 | 377 | if (!config.dummy) { 378 | 379 | try { 380 | 381 | child = exec("./scripts/radiation.sh", function (error, tempgeigerpoc, stderr) { 382 | cache.geiger.poc = parseInt(tempgeigerpoc); 383 | }); 384 | 385 | } catch (e) {} 386 | 387 | } else { 388 | data.radiation = {}; 389 | 390 | var now = new Date(); 391 | 392 | data.radiation.value = []; 393 | data.radiation.value.push(parseInt(now.getMinutes())); 394 | 395 | } 396 | 397 | } 398 | 399 | function initPocData() 400 | { 401 | info.plugins.push("pocx"); 402 | info.pocx = {}; 403 | info.pocx.name = 'POC'; 404 | info.pocx.legend = []; 405 | info.pocx.legend.push("POC (DECT) Registered"); 406 | info.pocx.type = []; 407 | info.pocx.type.push(""); 408 | info.pocx.type.push(""); 409 | } 410 | 411 | function getPocData() { 412 | if (config.debug) { console.log("running getPocData()"); 413 | }; 414 | 415 | if (!config.dummy) { 416 | 417 | data.pocx = {}; 418 | data.pocx.value = []; 419 | 420 | try { 421 | child = exec("./scripts/poc.sh", function (error, temppocconnected, stderr) { 422 | 423 | data.pocx.value.push(parseInt(temppocconnected)); 424 | }); 425 | } catch (e) {} 426 | 427 | } else { 428 | data.poc = {}; 429 | 430 | var now = new Date(); 431 | 432 | data.pocx.value = []; 433 | data.pocx.value.push(parseInt(now.getMinutes())); 434 | } 435 | 436 | } 437 | 438 | function initStreamingData() 439 | { 440 | info.plugins.push("streaming"); 441 | info.streaming = {}; 442 | info.streaming.name = 'Streaming'; 443 | info.streaming.legend = []; 444 | info.streaming.legend.push("Saal 1"); 445 | info.streaming.legend.push("Saal 4"); 446 | info.streaming.legend.push("Saal 6"); 447 | info.streaming.type = []; 448 | info.streaming.type.push(""); 449 | info.streaming.type.push(""); 450 | info.streaming.type.push(""); 451 | } 452 | 453 | function setStreamingData(streaming) 454 | { 455 | data.streaming = {}; 456 | data.streaming.value = []; 457 | 458 | data.streaming.value.push(parseInt(streaming.saal1)); 459 | data.streaming.value.push(parseInt(streaming.saal4)); 460 | data.streaming.value.push(parseInt(streaming.saal6)); 461 | 462 | } 463 | function getStreamingData() { 464 | if (config.debug) { console.log("running getStreamingData()"); 465 | }; 466 | 467 | if (!config.dummy) { 468 | 469 | try { 470 | http.get({ 471 | host: 'api.29c3.fem-net.de', 472 | port: 80, 473 | path: '/stats/current.json' 474 | }, function (response) { 475 | var data = ""; 476 | response.on('data', function (chunk) { 477 | data += chunk; 478 | }); 479 | 480 | response.on('end', function () { 481 | var streaming = JSON.parse(data); 482 | 483 | setStreamingData(streaming); 484 | }); 485 | 486 | }); 487 | 488 | } catch (e) {} 489 | 490 | process.on('uncaughtException', function (err) { 491 | console.log("streaming" + err); 492 | }); 493 | 494 | } else { 495 | data.streaming = {}; 496 | 497 | var now = new Date(); 498 | 499 | data.streaming.value = []; 500 | data.streaming.value.push(parseInt(now.getMinutes())); 501 | data.streaming.value.push(parseInt(now.getMinutes())); 502 | data.streaming.value.push(parseInt(now.getMinutes())); 503 | 504 | } 505 | 506 | } 507 | 508 | function initGSMData() 509 | { 510 | info.plugins.push("gsm"); 511 | info.gsm = {}; 512 | info.gsm.name = 'GSM'; 513 | info.gsm.legend = []; 514 | info.gsm.legend.push("SMS Sent (MO)"); 515 | info.gsm.legend.push("SMS Delivered (MT)"); 516 | info.gsm.legend.push("Calls Issued (MO)"); 517 | info.gsm.legend.push("Calls Delivered (MT)"); 518 | info.gsm.type = []; 519 | info.gsm.type.push(""); 520 | info.gsm.type.push(""); 521 | info.gsm.type.push(""); 522 | info.gsm.type.push(""); 523 | } 524 | 525 | function setGSMData(gsm) 526 | { 527 | 528 | data.gsm = {}; 529 | data.gsm.value = []; 530 | 531 | data.gsm.value.push(parseInt(gsm.sms_submitted)); 532 | data.gsm.value.push(parseInt(gsm.sms_delivered)); 533 | data.gsm.value.push(parseInt(gsm.calls_mo)); 534 | data.gsm.value.push(parseInt(gsm.calls_mt)); 535 | 536 | } 537 | 538 | function getGSMData() { 539 | if (config.debug) { console.log("running getGSMData()"); 540 | }; 541 | 542 | if (!config.dummy) { 543 | 544 | try { 545 | http.get({ 546 | host: '94.45.247.251', 547 | port: 4223, 548 | path: '/' 549 | }, function (response) { 550 | var data = ""; 551 | response.on('data', function (chunk) { 552 | data += chunk; 553 | }); 554 | 555 | response.on('end', function () { 556 | var gsm = JSON.parse(data); 557 | 558 | setGSMData(gsm); 559 | 560 | }); 561 | 562 | }); 563 | 564 | } catch (e) {} 565 | 566 | process.on('uncaughtException', function (err) { 567 | console.log(err); 568 | }); 569 | 570 | } else { 571 | data.streaming = {}; 572 | 573 | var now = new Date(); 574 | 575 | data.streaming.value = []; 576 | data.streaming.value.push(parseInt(now.getMinutes())); 577 | data.streaming.value.push(parseInt(now.getMinutes())); 578 | data.streaming.value.push(parseInt(now.getMinutes())); 579 | 580 | } 581 | 582 | } 583 | 584 | function initnat64Data() 585 | { 586 | info.plugins.push("nat64"); 587 | info.nat64 = {}; 588 | info.nat64.name = 'nat64 Users'; 589 | info.nat64.legend = []; 590 | info.nat64.legend.push("nat64 Users"); 591 | info.nat64.type = []; 592 | info.nat64.type.push(""); 593 | } 594 | 595 | function getnat64Data() { 596 | if (config.debug) { console.log("running getnat64Data()"); 597 | }; 598 | 599 | if (!config.dummy) { 600 | 601 | data.nat64 = {}; 602 | data.nat64.value = []; 603 | 604 | try { 605 | child = exec("./scripts/nat64.sh", function (error, tempnat64connected, stderr) { 606 | 607 | data.nat64.value.push(parseInt(tempnat64connected)); 608 | }); 609 | } catch (e) {} 610 | 611 | } else { 612 | data.nat64 = {}; 613 | 614 | var now = new Date(); 615 | 616 | data.nat64.value = []; 617 | data.nat64.value.push(parseInt(now.getMinutes())); 618 | data.nat64.value.push(parseInt(now.getMinutes())); 619 | } 620 | } 621 | 622 | function initprotocolsData() 623 | { 624 | info.plugins.push("protocols"); 625 | info.protocols = {}; 626 | info.protocols.name = 'protocols'; 627 | info.protocols.legend = []; 628 | info.protocols.legend.push("IPv4"); 629 | info.protocols.legend.push("IPv6"); 630 | info.protocols.type = []; 631 | info.protocols.type.push("%"); 632 | info.protocols.type.push("%"); 633 | } 634 | 635 | function setprotocolsData(protocols) 636 | { 637 | 638 | data.protocols = {}; 639 | data.protocols.value = []; 640 | 641 | data.protocols.value.push(parseInt(protocols.ipv4)); 642 | data.protocols.value.push(parseInt(protocols.ipv6)); 643 | 644 | 645 | } 646 | 647 | function getprotocolsData() { 648 | if (config.debug) { console.log("running getprotocolsData()"); 649 | }; 650 | 651 | if (!config.dummy) { 652 | 653 | try { 654 | http.get({ 655 | host: '94.45.226.61', 656 | port: 82, 657 | path: '/ipv6.txt' 658 | }, function (response) { 659 | var data = ""; 660 | response.on('data', function (chunk) { 661 | data += chunk; 662 | }); 663 | 664 | response.on('end', function () { 665 | var protocols = JSON.parse(data); 666 | 667 | setprotocolsData(protocols); 668 | 669 | }); 670 | 671 | }); 672 | 673 | } catch (e) {} 674 | 675 | process.on('uncaughtException', function (err) { 676 | console.log(err); 677 | }); 678 | 679 | } else { 680 | 681 | } 682 | 683 | } 684 | 685 | function initengelData() 686 | { 687 | info.plugins.push("engel"); 688 | info.engel = {}; 689 | info.engel.name = 'Engelsystem'; 690 | info.engel.legend = []; 691 | info.engel.legend.push("Work Hours Done"); 692 | info.engel.legend.push("Users Arrived"); 693 | info.engel.type = []; 694 | info.engel.type.push(""); 695 | info.engel.type.push(""); 696 | 697 | } 698 | 699 | function setengelData(engel) 700 | { 701 | 702 | data.engel = {}; 703 | data.engel.value = []; 704 | 705 | data.engel.value.push(parseInt(engel.done_work_hours)); 706 | data.engel.value.push(parseInt(engel.arrived_user_count)); 707 | 708 | } 709 | 710 | function getengelData() { 711 | if (config.debug) { console.log("running getengelData()"); 712 | }; 713 | 714 | if (!config.dummy) { 715 | 716 | try { 717 | https.get({ 718 | host: 'engelsystem.de', 719 | port: 443, 720 | path: '/29c3/?p=stats&api_key=VWJyAvXN4eyuoCplfc8N5Uq7k9BMTkvV' 721 | }, function (response) { 722 | var data = ""; 723 | response.on('data', function (chunk) { 724 | data += chunk; 725 | }); 726 | 727 | response.on('end', function () { 728 | var engel = JSON.parse(data); 729 | 730 | console.log(engel); 731 | 732 | setengelData(engel); 733 | 734 | }); 735 | 736 | }); 737 | 738 | } catch (e) {} 739 | 740 | process.on('uncaughtException', function (err) { 741 | console.log(err); 742 | }); 743 | 744 | } else { 745 | 746 | } 747 | 748 | } 749 | 750 | function initdashboardData() 751 | { 752 | info.plugins.push("dashboard"); 753 | info.dashboard = {}; 754 | info.dashboard.name = 'Dashboard Users'; 755 | info.dashboard.legend = []; 756 | info.dashboard.legend.push("Current Users On Dashboard"); 757 | info.dashboard.type = []; 758 | info.dashboard.type.push(""); 759 | } 760 | 761 | function getdashboardData() { 762 | if (config.debug) { console.log("running getdashboardData()"); 763 | }; 764 | 765 | if (!config.dummy) { 766 | 767 | data.dashboard = {}; 768 | data.dashboard.value = []; 769 | 770 | try { 771 | child = exec("./scripts/dashboard.sh", function (error, tempdashboardconnected, stderr) { 772 | 773 | data.dashboard.value.push(parseInt(tempdashboardconnected)); 774 | }); 775 | } catch (e) {} 776 | 777 | } else { 778 | data.dashboard = {}; 779 | 780 | var now = new Date(); 781 | 782 | data.dashboard.value = []; 783 | data.dashboard.value.push(parseInt(now.getMinutes())); 784 | data.dashboard.value.push(parseInt(now.getMinutes())); 785 | } 786 | } 787 | 788 | function initOHMStreamingData() 789 | { 790 | info.plugins.push("OHMstreaming"); 791 | info.OHMstreaming = {}; 792 | info.OHMstreaming.name = 'Streaming'; 793 | info.OHMstreaming.legend = []; 794 | info.OHMstreaming.legend.push("Nifhack"); 795 | info.OHMstreaming.type = []; 796 | info.OHMstreaming.type.push("viewers"); 797 | } 798 | 799 | function getOHMStreamingData() { 800 | if (config.debug) { console.log("running getOHMStreamingData()"); 801 | }; 802 | 803 | if (!config.dummy) { 804 | 805 | data.OHMstreaming = {}; 806 | data.OHMstreaming.value = []; 807 | 808 | try { 809 | child = exec("./scripts/streaming.sh", function (error, tempstreaming, stderr) { 810 | 811 | data.OHMstreaming.value.push(parseInt(tempstreaming)); 812 | }); 813 | } catch (e) {} 814 | 815 | } else { 816 | 817 | // 818 | 819 | } 820 | 821 | } 822 | 823 | -------------------------------------------------------------------------------- /backend/config.js: -------------------------------------------------------------------------------- 1 | var config = {} 2 | config.memcache = {}; 3 | 4 | config.memcache.host = "127.0.0.1"; 5 | config.memcache.port = "11211"; 6 | 7 | config.nodeUserGid = "root"; 8 | config.nodeUserUid = "root"; 9 | 10 | config.debug = true; 11 | config.dummy = true 12 | 13 | module.exports = config; 14 | 15 | -------------------------------------------------------------------------------- /backend/scripts/cisco_wlc_bands.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | WLCIP="127.0.0.1" 3 | WLCCOMMUNITY="abc" 4 | 5 | clientsA=0 6 | clientsG=0 7 | clients24N=0 8 | clients5N=0 9 | 10 | data=$(snmpwalk -v 2c -c $WLCCOMMUNITY $WLCIP 1.3.6.1.4.1.14179.2.1.4.1.25|awk -F ':' '{ print $2 }') 11 | for i in $data 12 | do 13 | if test $i -eq 1; 14 | then 15 | clientsA=$(echo $clientsA+1|bc) 16 | fi 17 | if test $i -eq 3; 18 | then 19 | clientsG=$(echo $clientsA+1|bc) 20 | fi 21 | if test $i -eq 6; 22 | then 23 | clients24N=$(echo $clients24N+1|bc) 24 | fi 25 | if test $i -eq 7; 26 | then 27 | clients5N=$(echo $clients5N+1|bc) 28 | fi 29 | done 30 | echo $clientsA:$clientsG:$clients24N:$clients5N 31 | -------------------------------------------------------------------------------- /backend/scripts/cisco_wlc_clients.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | WLCIP="127.0.0.1" 3 | WLCCOMMUNITY="abc" 4 | 5 | clients=0 6 | data=$(snmpwalk -v 2c -c $WLCCOMMUNITY $WLCIP .1.3.6.1.4.1.14179.2.1.1.1.38|awk -F ':' '{ print $2 }') 7 | for i in $data 8 | do 9 | clients=$(echo $clients+$i|bc) 10 | done 11 | echo $clients 12 | -------------------------------------------------------------------------------- /backend/scripts/dashboard.sh: -------------------------------------------------------------------------------- 1 | wget -qO - http://dashboard.congress.ccc.de/users.json 2 | -------------------------------------------------------------------------------- /backend/scripts/gsm.sh: -------------------------------------------------------------------------------- 1 | echo 0 2 | #sleep 2 3 | #wget -qO - 123.123.123.123:4223|python -mjson.tool|grep active| awk -F ': ' '{ print $2 }'|sed s/,//g 4 | -------------------------------------------------------------------------------- /backend/scripts/icinga_wired_clients.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | wget -q --no-check-certificate -O - https://icinga.host/tmp/mactable-all 3 | -------------------------------------------------------------------------------- /backend/scripts/juniper_bandwidth.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | ROUTERIP="127.0.0.1" 3 | ROUTERCOMMUNITY="asdf" 4 | ROUTERINT="1" 5 | 6 | if [ "$1" = "down" ]; then 7 | snmpget -c $ROUTERCOMMUNITY $ROUTERIP -v 2c iso.3.6.1.2.1.31.1.1.1.6.$ROUTERINT|awk -F ':' '{ print $2 }' 8 | fi 9 | if [ "$1" = "up" ]; then 10 | snmpget -c $ROUTERCOMMUNITY $ROUTERIP -v 2c iso.3.6.1.2.1.31.1.1.1.10.$ROUTERINT|awk -F ':' '{ print $2 }' 11 | fi 12 | 13 | -------------------------------------------------------------------------------- /backend/scripts/nat64.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | ROUTERIP="123.123.123.123"; 3 | ROUTERCOMMUNITY="abcdef" 4 | 5 | snmpget -v2c -c $ROUTERCOMMUNITY $ROUTERIP .1.3.6.1.4.1.22610.2.4.3.18.4.1.2.0|awk -F ': ' '{ print $2 }' 6 | 7 | -------------------------------------------------------------------------------- /backend/scripts/ohm.sh: -------------------------------------------------------------------------------- 1 | if [ "$1" = "shadow" ] 2 | then 3 | wget -qO - http://camp.x23.nu/values.php|awk -F ',' '{ print $1 }' 4 | else 5 | wget -qO - http://camp.x23.nu/values.php|awk -F ',' '{ print $2 }' 6 | fi 7 | -------------------------------------------------------------------------------- /backend/scripts/openbeacon.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | wget -q -O - http://open_beacon_tracking_host/tracking.json|grep '"id":'|grep -v floor|wc -l 3 | -------------------------------------------------------------------------------- /backend/scripts/poc.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # 28c3 was 'http://www.eventphone.de/guru2/phonebook?event=OHM2013&s=&installedonly=1&page=1&format=xml' 3 | wget -q -O - 'http://www.eventphone.de/guru2/phonebook?event=OHM2013&s=&installedonly=1&page=1&format=xml'|grep extension|wc -l 4 | -------------------------------------------------------------------------------- /backend/scripts/radiation.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | wget -qO - http://host_with_geiger_data/geiger_poc.rad|awk -F 'cpm=' '{ print $2 }'|sed 's/;//' 3 | -------------------------------------------------------------------------------- /backend/scripts/sflow_protocols.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | wget -qO - http://sflow_host/dashboard|tail -1|awk -F ' ' '{ print $3 ":" $4 }' 3 | -------------------------------------------------------------------------------- /backend/scripts/streaming.sh: -------------------------------------------------------------------------------- 1 | wget -qO - http://tv.nifhack.nl/stream_stats/listeners.json|grep '}' -P1|head -1|awk -F ': ' '{ print $2 }'|sed s/','//g 2 | -------------------------------------------------------------------------------- /frontend/app.js: -------------------------------------------------------------------------------- 1 | var express = require('express'), 2 | fs = require('fs'), 3 | util = require('util'), 4 | config = require('./config'); 5 | 6 | var app = express() 7 | , http = require('http') 8 | , server = http.createServer(app) 9 | , io = require('socket.io').listen(server); 10 | 11 | app.use(express.static(__dirname + '/public')); 12 | 13 | var connect = server.listen(config.listenPort, '::', function() { 14 | process.setgid(config.nodeUserGid); 15 | process.setuid(config.nodeUserUid); 16 | }); 17 | 18 | console.log('created listener on port' + config.listenPort); 19 | 20 | // bind views 21 | app.get('/', function (req, res) { res.sendfile(__dirname + '/views/index.html'); }); 22 | app.get('/detail', function (req, res) { res.sendfile(__dirname + '/views/detail.html'); }); 23 | 24 | // creating socket io socket for connecting clients 25 | io.on('connection', function () { 26 | io.set('log level', 0); 27 | io.set('transports', ['websocket', 'flashsocket', 'htmlfile', 'xhr-polling', 'jsonp-polling']); 28 | }); 29 | 30 | // connect to memcache 31 | var memcache = require('memcache'); 32 | var memcacheConnection = new memcache.Client(config.memcache.port, config.memcache.host); 33 | memcacheConnection.connect(); 34 | 35 | var x = io.sockets.on('connection', function (socket) { /* nothing todo (yet) */ }); 36 | 37 | // save last graph generation and save time 38 | var nextGraph = null; 39 | var nextSave = null; 40 | var lastData = null; 41 | 42 | // check if history already exists (maybe node crashed) 43 | try { 44 | console.log("opening history"); 45 | var historyFile = fs.readFileSync("public/history.json", 'utf8'); 46 | var historyData = JSON.parse(historyFile); 47 | } catch (err) { 48 | var historyData = new Array(); 49 | console.log("creating history"); 50 | } 51 | 52 | setInterval(function () { 53 | memcacheConnection.get('lastData', function (error, result) { 54 | 55 | if (lastData < result) { 56 | lastData = result; 57 | 58 | var dateTemp = new Date; 59 | var unixtimeMs = dateTemp.getTime(); 60 | var unixtime = parseInt(unixtimeMs / 1000); 61 | unixtime += 3600; 62 | var graph = null; 63 | 64 | memcacheConnection.get('backendInfo', function (error, result) { 65 | 66 | var info = JSON.parse(result); 67 | fs.writeFileSync("public/info.json", JSON.stringify(info), 'utf8'); 68 | 69 | }) 70 | 71 | memcacheConnection.get('backendData', function (error, result) { 72 | 73 | var data = JSON.parse(result); 74 | 75 | // do we need to graph? 76 | if (nextGraph < unixtime) { 77 | graph = 1; 78 | nextGraph = unixtime + 10; 79 | } 80 | 81 | // generate full data block 82 | data.graph = graph; 83 | data.unixtime = unixtime; 84 | 85 | // send data block on all sockets (to clients) 86 | x.emit('data', data); 87 | fs.writeFileSync("public/current.json", JSON.stringify(data), 'utf8'); 88 | 89 | // do we need to save history block? 90 | if (nextSave < unixtime) { 91 | historyData.push(data); 92 | fs.writeFileSync("public/history.json", JSON.stringify(historyData), 'utf8'); 93 | nextSave = unixtime + 300; 94 | }; 95 | 96 | 97 | 98 | }); 99 | 100 | } 101 | }) 102 | }, 1000); 103 | 104 | 105 | // change to non root after binding port <1024 106 | process.setgid(config.nodeUserGid); 107 | process.setuid(config.nodeUserUid); 108 | -------------------------------------------------------------------------------- /frontend/config.js: -------------------------------------------------------------------------------- 1 | var config = {} 2 | config.memcache = {}; 3 | 4 | config.memcache.host = "127.0.0.1"; 5 | config.memcache.port = "11211"; 6 | 7 | config.nodeUserGid = "root"; 8 | config.nodeUserUid = "root"; 9 | 10 | config.listenPort = "80"; 11 | 12 | config.debug = true; 13 | config.dummy = true; 14 | 15 | module.exports = config; 16 | -------------------------------------------------------------------------------- /frontend/public/css/c3netmon.css: -------------------------------------------------------------------------------- 1 | body { 2 | font-family: Signika, Signika-Light, Signika-Semibold, Verdana; 3 | font-size: 13px; 4 | padding-top: 20px; 5 | background: RGB(26, 25, 25); 6 | color: RGBA(73, 19, 100, 1); 7 | } 8 | 9 | ul { 10 | margin: 0px !important; 11 | padding: 0px !important; 12 | } 13 | 14 | #container-head { 15 | width: 1000px; 16 | height: 120px; 17 | margin: 0 auto; 18 | } 19 | 20 | #container { 21 | width: 1000px; 22 | margin: 0 auto; 23 | margin-bottom: 100px; 24 | padding: 15px; 25 | background: RGBA(85, 52, 118, 0.5); 26 | box-shadow: 0px 20px 40px rgba(0, 0, 0, 0.5); 27 | } 28 | 29 | .metal-box { 30 | padding: 10px; 31 | text-shadow: 0px 1px 0px #fff; 32 | background: #f7f7f7; 33 | border-top: 4px solid RGBA(253, 157, 47, 1); 34 | box-shadow: 0px 0px 4px rgba(0, 0, 0, 0.2); 35 | } 36 | .caption { 37 | font-weight: bold; 38 | margin-bottom: 5px; 39 | } 40 | 41 | .gauge-title { 42 | font-size: 18px; 43 | color: RGBA(85, 52, 118, 1); 44 | text-transform: uppercase; 45 | line-height: 8px; 46 | padding-left: 8px; 47 | margin: 15px 8px; 48 | padding: 0px; 49 | } 50 | 51 | 52 | .gauge-value { 53 | font-size: 30px; 54 | line-height: 7px; 55 | } 56 | .gauge { 57 | background: RGBA(85, 52, 118, 0.1); 58 | border: 1px solid RGBA(85, 52, 118, 0.3); 59 | padding: 10px; 60 | font-size: 12px; 61 | } 62 | #bw .gauge, 63 | #clients .gauge, 64 | #poc .gauge, 65 | #geiger .gauge, 66 | #streaming .gauge { 67 | height: 260px; 68 | } 69 | 70 | img.logo { 71 | float: left; 72 | height: 120px; 73 | margin-top: -10px; 74 | } 75 | 76 | .header { 77 | height: 85px; 78 | margin-left: 520px; 79 | padding: 10px 15px 0px 15px; 80 | border: 2px solid #666; 81 | background: rgba(50, 50, 50, 1); 82 | } 83 | 84 | h2 { 85 | color: #fff; 86 | font-size: 15px; 87 | margin: 0px; 88 | padding: 0px; 89 | } 90 | .welcome { 91 | font-size: 12px; 92 | color: #fff; 93 | } 94 | 95 | #info { 96 | color: #fff; 97 | line-height: 19px; 98 | margin: -15px; 99 | margin-top: 0px; 100 | padding: 10px; 101 | border-top: 10px solid rgba(250, 250, 250, 0.2); 102 | background: RGBA(73, 19, 100, 1); 103 | } 104 | 105 | a { 106 | color: #fff; 107 | font-weight: bold; 108 | } 109 | a:hover { 110 | color: #007280; 111 | } 112 | 113 | #loading { 114 | width: 100%; 115 | height: 100%; 116 | top: 0px; 117 | left: 0px; 118 | position: fixed; 119 | display: block; 120 | opacity: 0.9; 121 | background-color: #fff; 122 | z-index: 99; 123 | text-align: center; 124 | } 125 | 126 | #loading-image { 127 | position: absolute; 128 | top: 250px; 129 | left: 50%; 130 | z-index: 100; 131 | } 132 | 133 | .ui-widget-header { 134 | border: 1px solid #56C4CF; 135 | background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(0%, #0090d3), color-stop(100%, #0090d3)); 136 | background-image: -moz-linear-gradient(top, #0090d3 0%, #0090d3 100%); 137 | background-image: linear-gradient(top, #0090d3 0%, #0090d3 100%); 138 | filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#0090d3', EndColorStr='#0090d3'); /* IE6–IE9 */ 139 | } 140 | .ui-widget-content { 141 | border: 1px solid #ccc; 142 | background: #fff; 143 | } 144 | 145 | .graph-box { 146 | background: none; 147 | width:425px; 148 | } 149 | .graph-legend { 150 | color: #0099ab; 151 | text-shadow: 0px 0px 2px #0090d3; 152 | padding: 0px; 153 | padding-left: 0px; 154 | border: 0px; 155 | background: none; 156 | } 157 | -------------------------------------------------------------------------------- /frontend/public/css/c3netmon_29c3.css: -------------------------------------------------------------------------------- 1 | body { 2 | font-family: Signika, Signika-Light, Signika-Semibold, Verdana; 3 | font-size: 13px; 4 | padding-top: 20px; 5 | background: #222 url(/img/carbon_fibre_big.png); 6 | color: #56c4cf; 7 | } 8 | 9 | ul { 10 | margin: 0px !important; 11 | padding: 0px !important; 12 | } 13 | 14 | #container { 15 | width: 1000px; 16 | margin: 0 auto; 17 | margin-bottom: 100px; 18 | padding: 15px; 19 | background: #191919; 20 | background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(0%, #191919), color-stop(100%, #000000)); 21 | background-image: -moz-linear-gradient(top, #191919 0%, #000000 100%); 22 | background-image: linear-gradient(top, #191919 0%, #000000 100%); 23 | filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#191919', EndColorStr='#000000'); /* IE6–IE9 */ 24 | border: 2px solid #222; 25 | -webkit-border-radius: 10px 10px; 26 | -moz-border-radius: 10px / 10px; 27 | -o-border-radius: 10px / 10px; 28 | -ms-border-radius: 10px / 10px; 29 | -khtml-border-radius: 10px / 10px; 30 | border-radius: 10px / 10px; 31 | } 32 | 33 | .metal-box { 34 | margin-left: 5px; 35 | margin-right: 5px; 36 | padding: 10px; 37 | text-shadow: 0px -1px 0px #000; 38 | background: #ffffff; 39 | background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(0%, #555555), color-stop(100%, #222222)); 40 | background-image: -moz-linear-gradient(top, #555555 0%, #222222 100%); 41 | background-image: linear-gradient(top, #555555 0%, #222222 100%); 42 | filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#555555', EndColorStr='#222222'); /* IE6–IE9 */ 43 | -webkit-border-radius: 8px; 44 | -moz-border-radius: 8px; 45 | -o-border-radius: 8px; 46 | -ms-border-radius: 8px; 47 | -khtml-border-radius: 8px; 48 | border-radius: 9px; 49 | border-bottom: 2px solid #222; 50 | -moz-box-shadow: 0px 0px 10px #111; 51 | -webkit-box-shadow: 0px 0px 10px #111; 52 | box-shadow: 0px 0px 10px #111; 53 | } 54 | .caption { 55 | font-weight: bold; 56 | margin-bottom: 5px; 57 | } 58 | 59 | .gauge-title { 60 | font-size: 18px; 61 | color: #ddd; 62 | text-transform: uppercase; 63 | } 64 | .gauge-title { 65 | line-height: 8px; 66 | padding-left: 8px; 67 | margin: 15px 8px; 68 | padding: 0px; 69 | } 70 | 71 | 72 | .gauge-value { 73 | font-size: 30px; 74 | line-height: 7px; 75 | } 76 | .gauge { 77 | background: #000; 78 | padding: 10px; 79 | font-size: 12px; 80 | text-shadow: 0px 0px 6px #56c4cf; 81 | border: 1px solid #222; 82 | border-bottom: 1px solid #555; 83 | -webkit-border-radius: 10px; 84 | -moz-border-radius: 10px / 10px; 85 | -o-border-radius: 10px / 10px; 86 | -ms-border-radius: 10px / 10px; 87 | -khtml-border-radius: 10px / 10px; 88 | border-radius: 10px / 10px; 89 | background: #000000; 90 | background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(0%, #000000), color-stop(100%, #173a3d)); 91 | background-image: -moz-linear-gradient(top, #000000 0%, #333333 100%); 92 | background-image: linear-gradient(top, #000000 0%, #333333 100%); 93 | filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#000000', EndColorStr='#333333'); /* IE6–IE9 */ 94 | -moz-box-shadow: 0px 0px 20px #032123 inset; 95 | -webkit-box-shadow: 0px 0px 20px #032123 inset; 96 | box-shadow: 0px 0px 20px #032123 inset; 97 | } 98 | #bw .gauge, 99 | #clients .gauge, 100 | #poc .gauge, 101 | #geiger .gauge, 102 | #streaming .gauge { 103 | height: 260px; 104 | } 105 | 106 | img.logo { 107 | float: left; 108 | width: 121px; 109 | height: 67px; 110 | } 111 | 112 | .header { 113 | height: 85px; 114 | margin-left: 140px; 115 | } 116 | 117 | h2 { 118 | color: #56c4cf; 119 | font-size: 15px; 120 | margin: 0px; 121 | padding: 0px; 122 | } 123 | .welcome { 124 | font-size: 12px; 125 | color: #56c4cf; 126 | } 127 | 128 | #info { 129 | color: #000; 130 | line-height: 19px; 131 | text-shadow: 0px 1px 0px #fff; 132 | margin: 5px; 133 | margin-top: 20px; 134 | padding: 10px; 135 | background: #ffffff; 136 | background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(0%, #ffffff), color-stop(100%, #cccccc)); 137 | background-image: -moz-linear-gradient(top, #ffffff 0%, #cccccc 100%); 138 | background-image: linear-gradient(top, #ffffff 0%, #cccccc 100%); 139 | filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#ffffff', EndColorStr='#cccccc'); /* IE6–IE9 */ 140 | -webkit-border-radius: 8px; 141 | -moz-border-radius: 8px; 142 | -o-border-radius: 8px; 143 | -ms-border-radius: 8px; 144 | -khtml-border-radius: 8px; 145 | border-radius: 8px; 146 | } 147 | #info a { 148 | color: #000; 149 | font-weight: bold; 150 | } 151 | 152 | #loading { 153 | width: 100%; 154 | height: 100%; 155 | top: 0px; 156 | left: 0px; 157 | position: fixed; 158 | display: block; 159 | opacity: 0.9; 160 | background-color: #fff; 161 | z-index: 99; 162 | text-align: center; 163 | } 164 | 165 | #loading-image { 166 | position: absolute; 167 | top: 250px; 168 | left: 50%; 169 | z-index: 100; 170 | } 171 | 172 | .ui-widget-header { 173 | border: 1px solid #56C4CF; 174 | background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(0%, #56C4CF), color-stop(100%, #255559)); 175 | background-image: -moz-linear-gradient(top, #56C4CF 0%, #255559 100%); 176 | background-image: linear-gradient(top, #56C4CF 0%, #255559 100%); 177 | filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#56C4CF', EndColorStr='#255559'); /* IE6–IE9 */ 178 | } 179 | .ui-widget-content { 180 | border: 1px solid #255559; 181 | background: #000; 182 | } 183 | 184 | .graph-box { 185 | background: none; 186 | width:425px; 187 | } 188 | .graph-legend { 189 | color: #56c4cf; 190 | text-shadow: 0px 0px 2px #56c4cf; 191 | padding: 0px; 192 | padding-left: 0px; 193 | border: 0px; 194 | background: none; 195 | } 196 | -------------------------------------------------------------------------------- /frontend/public/css/c3netmon_30c3.css: -------------------------------------------------------------------------------- 1 | body { 2 | font-family: Signika, Signika-Light, Signika-Semibold, Verdana; 3 | font-size: 13px; 4 | padding-top: 20px; 5 | background: url(/img/Blackhole-2880x1600.jpg) fixed; 6 | color: #00bfd5; 7 | } 8 | 9 | ul { 10 | margin: 0px !important; 11 | padding: 0px !important; 12 | } 13 | 14 | #container-head { 15 | width: 1000px; 16 | height: 120px; 17 | margin: 0 auto; 18 | } 19 | 20 | #container { 21 | width: 1000px; 22 | margin: 0 auto; 23 | margin-bottom: 100px; 24 | padding: 15px; 25 | background: rgba(255, 255, 255, 0.85); 26 | box-shadow: 0px 20px 40px rgba(0, 0, 0, 0.5); 27 | } 28 | 29 | .metal-box { 30 | padding: 10px; 31 | text-shadow: 0px 1px 0px #fff; 32 | background: #fff; 33 | background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(0%, #efefef), color-stop(100%, #f7f7f7)); 34 | background-image: -moz-linear-gradient(top, #efefef 0%, #f7f7f77 100%); 35 | background-image: linear-gradient(top, #efefef 0%, #f7f7f7 100%); 36 | filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#efefef', EndColorStr='#f7f7f7'); /* IE6–IE9 */ 37 | border-top: 4px solid #00a8bc; 38 | box-shadow: 0px 0px 4px rgba(0, 0, 0, 0.2); 39 | } 40 | .caption { 41 | font-weight: bold; 42 | margin-bottom: 5px; 43 | } 44 | 45 | .gauge-title { 46 | font-size: 18px; 47 | color: #007280; 48 | text-transform: uppercase; 49 | line-height: 8px; 50 | padding-left: 8px; 51 | margin: 15px 8px; 52 | padding: 0px; 53 | } 54 | 55 | 56 | .gauge-value { 57 | font-size: 30px; 58 | line-height: 7px; 59 | } 60 | .gauge { 61 | background: #e2f3f5; 62 | border: 1px solid #c6e8ec; 63 | padding: 10px; 64 | font-size: 12px; 65 | } 66 | #bw .gauge, 67 | #clients .gauge, 68 | #poc .gauge, 69 | #geiger .gauge, 70 | #streaming .gauge { 71 | height: 260px; 72 | } 73 | 74 | img.logo { 75 | float: left; 76 | width: 200px; 77 | margin-top: -10px; 78 | } 79 | 80 | .header { 81 | height: 85px; 82 | margin-left: 520px; 83 | padding: 10px 15px 0px 15px; 84 | border: 2px solid #0099ab; 85 | background: rgba(0, 114, 128, 0.5); 86 | } 87 | 88 | h2 { 89 | color: #fff; 90 | font-size: 15px; 91 | margin: 0px; 92 | padding: 0px; 93 | } 94 | .welcome { 95 | font-size: 12px; 96 | color: #fff; 97 | } 98 | 99 | #info { 100 | color: #fff; 101 | line-height: 19px; 102 | margin: -15px; 103 | margin-top: 0px; 104 | padding: 10px; 105 | border-top: 10px solid #00bfd5; 106 | background: #0099ab; 107 | } 108 | 109 | a { 110 | color: #fff; 111 | font-weight: bold; 112 | } 113 | a:hover { 114 | color: #007280; 115 | } 116 | 117 | #loading { 118 | width: 100%; 119 | height: 100%; 120 | top: 0px; 121 | left: 0px; 122 | position: fixed; 123 | display: block; 124 | opacity: 0.9; 125 | background-color: #fff; 126 | z-index: 99; 127 | text-align: center; 128 | } 129 | 130 | #loading-image { 131 | position: absolute; 132 | top: 250px; 133 | left: 50%; 134 | z-index: 100; 135 | } 136 | 137 | .ui-widget-header { 138 | border: 1px solid #56C4CF; 139 | background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(0%, #0090d3), color-stop(100%, #0090d3)); 140 | background-image: -moz-linear-gradient(top, #0090d3 0%, #0090d3 100%); 141 | background-image: linear-gradient(top, #0090d3 0%, #0090d3 100%); 142 | filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#0090d3', EndColorStr='#0090d3'); /* IE6–IE9 */ 143 | } 144 | .ui-widget-content { 145 | border: 1px solid #ccc; 146 | background: #fff; 147 | } 148 | 149 | .graph-box { 150 | background: none; 151 | width:425px; 152 | } 153 | .graph-legend { 154 | color: #0099ab; 155 | text-shadow: 0px 0px 2px #0090d3; 156 | padding: 0px; 157 | padding-left: 0px; 158 | border: 0px; 159 | background: none; 160 | } 161 | -------------------------------------------------------------------------------- /frontend/public/css/font-awesome-ie7.css: -------------------------------------------------------------------------------- 1 | [class^="icon-"], 2 | [class*=" icon-"] { 3 | font-family: FontAwesome; 4 | font-style: normal; 5 | font-weight: normal; 6 | } 7 | .btn.dropdown-toggle [class^="icon-"], 8 | .btn.dropdown-toggle [class*=" icon-"] { 9 | /* keeps button heights with and without icons the same */ 10 | 11 | line-height: 1.4em; 12 | } 13 | .icon-large { 14 | font-size: 1.3333em; 15 | } 16 | .icon-glass { 17 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 18 | } 19 | .icon-music { 20 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 21 | } 22 | .icon-search { 23 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 24 | } 25 | .icon-envelope { 26 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 27 | } 28 | .icon-heart { 29 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 30 | } 31 | .icon-star { 32 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 33 | } 34 | .icon-star-empty { 35 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 36 | } 37 | .icon-user { 38 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 39 | } 40 | .icon-film { 41 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 42 | } 43 | .icon-th-large { 44 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 45 | } 46 | .icon-th { 47 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 48 | } 49 | .icon-th-list { 50 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 51 | } 52 | .icon-ok { 53 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 54 | } 55 | .icon-remove { 56 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 57 | } 58 | .icon-zoom-in { 59 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 60 | } 61 | .icon-zoom-out { 62 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 63 | } 64 | .icon-off { 65 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 66 | } 67 | .icon-signal { 68 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 69 | } 70 | .icon-cog { 71 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 72 | } 73 | .icon-trash { 74 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 75 | } 76 | .icon-home { 77 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 78 | } 79 | .icon-file { 80 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 81 | } 82 | .icon-time { 83 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 84 | } 85 | .icon-road { 86 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 87 | } 88 | .icon-download-alt { 89 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 90 | } 91 | .icon-download { 92 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 93 | } 94 | .icon-upload { 95 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 96 | } 97 | .icon-inbox { 98 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 99 | } 100 | .icon-play-circle { 101 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 102 | } 103 | .icon-repeat { 104 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 105 | } 106 | .icon-refresh { 107 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 108 | } 109 | .icon-list-alt { 110 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 111 | } 112 | .icon-lock { 113 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 114 | } 115 | .icon-flag { 116 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 117 | } 118 | .icon-headphones { 119 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 120 | } 121 | .icon-volume-off { 122 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 123 | } 124 | .icon-volume-down { 125 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 126 | } 127 | .icon-volume-up { 128 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 129 | } 130 | .icon-qrcode { 131 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 132 | } 133 | .icon-barcode { 134 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 135 | } 136 | .icon-tag { 137 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 138 | } 139 | .icon-tags { 140 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 141 | } 142 | .icon-book { 143 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 144 | } 145 | .icon-bookmark { 146 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 147 | } 148 | .icon-print { 149 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 150 | } 151 | .icon-camera { 152 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 153 | } 154 | .icon-font { 155 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 156 | } 157 | .icon-bold { 158 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 159 | } 160 | .icon-italic { 161 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 162 | } 163 | .icon-text-height { 164 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 165 | } 166 | .icon-text-width { 167 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 168 | } 169 | .icon-align-left { 170 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 171 | } 172 | .icon-align-center { 173 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 174 | } 175 | .icon-align-right { 176 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 177 | } 178 | .icon-align-justify { 179 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 180 | } 181 | .icon-list { 182 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 183 | } 184 | .icon-indent-left { 185 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 186 | } 187 | .icon-indent-right { 188 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 189 | } 190 | .icon-facetime-video { 191 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 192 | } 193 | .icon-picture { 194 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 195 | } 196 | .icon-pencil { 197 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 198 | } 199 | .icon-map-marker { 200 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 201 | } 202 | .icon-adjust { 203 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 204 | } 205 | .icon-tint { 206 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 207 | } 208 | .icon-edit { 209 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 210 | } 211 | .icon-share { 212 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 213 | } 214 | .icon-check { 215 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 216 | } 217 | .icon-move { 218 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 219 | } 220 | .icon-step-backward { 221 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 222 | } 223 | .icon-fast-backward { 224 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 225 | } 226 | .icon-backward { 227 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 228 | } 229 | .icon-play { 230 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 231 | } 232 | .icon-pause { 233 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 234 | } 235 | .icon-stop { 236 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 237 | } 238 | .icon-forward { 239 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 240 | } 241 | .icon-fast-forward { 242 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 243 | } 244 | .icon-step-forward { 245 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 246 | } 247 | .icon-eject { 248 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 249 | } 250 | .icon-chevron-left { 251 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 252 | } 253 | .icon-chevron-right { 254 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 255 | } 256 | .icon-plus-sign { 257 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 258 | } 259 | .icon-minus-sign { 260 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 261 | } 262 | .icon-remove-sign { 263 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 264 | } 265 | .icon-ok-sign { 266 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 267 | } 268 | .icon-question-sign { 269 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 270 | } 271 | .icon-info-sign { 272 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 273 | } 274 | .icon-screenshot { 275 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 276 | } 277 | .icon-remove-circle { 278 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 279 | } 280 | .icon-ok-circle { 281 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 282 | } 283 | .icon-ban-circle { 284 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 285 | } 286 | .icon-arrow-left { 287 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 288 | } 289 | .icon-arrow-right { 290 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 291 | } 292 | .icon-arrow-up { 293 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 294 | } 295 | .icon-arrow-down { 296 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 297 | } 298 | .icon-share-alt { 299 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 300 | } 301 | .icon-resize-full { 302 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 303 | } 304 | .icon-resize-small { 305 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 306 | } 307 | .icon-plus { 308 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 309 | } 310 | .icon-minus { 311 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 312 | } 313 | .icon-asterisk { 314 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 315 | } 316 | .icon-exclamation-sign { 317 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 318 | } 319 | .icon-gift { 320 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 321 | } 322 | .icon-leaf { 323 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 324 | } 325 | .icon-fire { 326 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 327 | } 328 | .icon-eye-open { 329 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 330 | } 331 | .icon-eye-close { 332 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 333 | } 334 | .icon-warning-sign { 335 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 336 | } 337 | .icon-plane { 338 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 339 | } 340 | .icon-calendar { 341 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 342 | } 343 | .icon-random { 344 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 345 | } 346 | .icon-comment { 347 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 348 | } 349 | .icon-magnet { 350 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 351 | } 352 | .icon-chevron-up { 353 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 354 | } 355 | .icon-chevron-down { 356 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 357 | } 358 | .icon-retweet { 359 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 360 | } 361 | .icon-shopping-cart { 362 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 363 | } 364 | .icon-folder-close { 365 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 366 | } 367 | .icon-folder-open { 368 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 369 | } 370 | .icon-resize-vertical { 371 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 372 | } 373 | .icon-resize-horizontal { 374 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 375 | } 376 | .icon-bar-chart { 377 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 378 | } 379 | .icon-twitter-sign { 380 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 381 | } 382 | .icon-facebook-sign { 383 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 384 | } 385 | .icon-camera-retro { 386 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 387 | } 388 | .icon-key { 389 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 390 | } 391 | .icon-cogs { 392 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 393 | } 394 | .icon-comments { 395 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 396 | } 397 | .icon-thumbs-up { 398 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 399 | } 400 | .icon-thumbs-down { 401 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 402 | } 403 | .icon-star-half { 404 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 405 | } 406 | .icon-heart-empty { 407 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 408 | } 409 | .icon-signout { 410 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 411 | } 412 | .icon-linkedin-sign { 413 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 414 | } 415 | .icon-pushpin { 416 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 417 | } 418 | .icon-external-link { 419 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 420 | } 421 | .icon-signin { 422 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 423 | } 424 | .icon-trophy { 425 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 426 | } 427 | .icon-github-sign { 428 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 429 | } 430 | .icon-upload-alt { 431 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 432 | } 433 | .icon-lemon { 434 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 435 | } 436 | .icon-phone { 437 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 438 | } 439 | .icon-check-empty { 440 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 441 | } 442 | .icon-bookmark-empty { 443 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 444 | } 445 | .icon-phone-sign { 446 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 447 | } 448 | .icon-twitter { 449 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 450 | } 451 | .icon-facebook { 452 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 453 | } 454 | .icon-github { 455 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 456 | } 457 | .icon-unlock { 458 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 459 | } 460 | .icon-credit-card { 461 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 462 | } 463 | .icon-rss { 464 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 465 | } 466 | .icon-hdd { 467 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 468 | } 469 | .icon-bullhorn { 470 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 471 | } 472 | .icon-bell { 473 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 474 | } 475 | .icon-certificate { 476 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 477 | } 478 | .icon-hand-right { 479 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 480 | } 481 | .icon-hand-left { 482 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 483 | } 484 | .icon-hand-up { 485 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 486 | } 487 | .icon-hand-down { 488 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 489 | } 490 | .icon-circle-arrow-left { 491 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 492 | } 493 | .icon-circle-arrow-right { 494 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 495 | } 496 | .icon-circle-arrow-up { 497 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 498 | } 499 | .icon-circle-arrow-down { 500 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 501 | } 502 | .icon-globe { 503 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 504 | } 505 | .icon-wrench { 506 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 507 | } 508 | .icon-tasks { 509 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 510 | } 511 | .icon-filter { 512 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 513 | } 514 | .icon-briefcase { 515 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 516 | } 517 | .icon-fullscreen { 518 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 519 | } 520 | .icon-group { 521 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 522 | } 523 | .icon-link { 524 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 525 | } 526 | .icon-cloud { 527 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 528 | } 529 | .icon-beaker { 530 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 531 | } 532 | .icon-cut { 533 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 534 | } 535 | .icon-copy { 536 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 537 | } 538 | .icon-paper-clip { 539 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 540 | } 541 | .icon-save { 542 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 543 | } 544 | .icon-sign-blank { 545 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 546 | } 547 | .icon-reorder { 548 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 549 | } 550 | .icon-list-ul { 551 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 552 | } 553 | .icon-list-ol { 554 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 555 | } 556 | .icon-strikethrough { 557 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 558 | } 559 | .icon-underline { 560 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 561 | } 562 | .icon-table { 563 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 564 | } 565 | .icon-magic { 566 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 567 | } 568 | .icon-truck { 569 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 570 | } 571 | .icon-pinterest { 572 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 573 | } 574 | .icon-pinterest-sign { 575 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 576 | } 577 | .icon-google-plus-sign { 578 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 579 | } 580 | .icon-google-plus { 581 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 582 | } 583 | .icon-money { 584 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 585 | } 586 | .icon-caret-down { 587 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 588 | } 589 | .icon-caret-up { 590 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 591 | } 592 | .icon-caret-left { 593 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 594 | } 595 | .icon-caret-right { 596 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 597 | } 598 | .icon-columns { 599 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 600 | } 601 | .icon-sort { 602 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 603 | } 604 | .icon-sort-down { 605 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 606 | } 607 | .icon-sort-up { 608 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 609 | } 610 | .icon-envelope-alt { 611 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 612 | } 613 | .icon-linkedin { 614 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 615 | } 616 | .icon-undo { 617 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 618 | } 619 | .icon-legal { 620 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 621 | } 622 | .icon-dashboard { 623 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 624 | } 625 | .icon-comment-alt { 626 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 627 | } 628 | .icon-comments-alt { 629 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 630 | } 631 | .icon-bolt { 632 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 633 | } 634 | .icon-sitemap { 635 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 636 | } 637 | .icon-umbrella { 638 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 639 | } 640 | .icon-paste { 641 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 642 | } 643 | .icon-user-md { 644 | *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); 645 | } 646 | -------------------------------------------------------------------------------- /frontend/public/css/font-awesome.css: -------------------------------------------------------------------------------- 1 | /* Font Awesome 2 | the iconic font designed for use with Twitter Bootstrap 3 | ------------------------------------------------------- 4 | The full suite of pictographic icons, examples, and documentation 5 | can be found at: http://fortawesome.github.com/Font-Awesome/ 6 | 7 | License 8 | ------------------------------------------------------- 9 | The Font Awesome webfont, CSS, and LESS files are licensed under CC BY 3.0: 10 | http://creativecommons.org/licenses/by/3.0/ A mention of 11 | 'Font Awesome - http://fortawesome.github.com/Font-Awesome' in human-readable 12 | source code is considered acceptable attribution (most common on the web). 13 | If human readable source code is not available to the end user, a mention in 14 | an 'About' or 'Credits' screen is considered acceptable (most common in desktop 15 | or mobile software). 16 | 17 | Contact 18 | ------------------------------------------------------- 19 | Email: dave@davegandy.com 20 | Twitter: http://twitter.com/fortaweso_me 21 | Work: http://lemonwi.se co-founder 22 | 23 | */ 24 | @font-face { 25 | font-family: "FontAwesome"; 26 | src: url('../font/fontawesome-webfont.eot'); 27 | src: url('../font/fontawesome-webfont.eot?#iefix') format('eot'), url('../font/fontawesome-webfont.woff') format('woff'), url('../font/fontawesome-webfont.ttf') format('truetype'), url('../font/fontawesome-webfont.svg#FontAwesome') format('svg'); 28 | font-weight: normal; 29 | font-style: normal; 30 | } 31 | 32 | /* Font Awesome styles 33 | ------------------------------------------------------- */ 34 | [class^="icon-"]:before, [class*=" icon-"]:before { 35 | font-family: FontAwesome; 36 | font-weight: normal; 37 | font-style: normal; 38 | display: inline-block; 39 | text-decoration: inherit; 40 | } 41 | a [class^="icon-"], a [class*=" icon-"] { 42 | display: inline-block; 43 | text-decoration: inherit; 44 | } 45 | /* makes the font 33% larger relative to the icon container */ 46 | .icon-large:before { 47 | vertical-align: top; 48 | font-size: 1.3333333333333333em; 49 | } 50 | .btn [class^="icon-"], .btn [class*=" icon-"] { 51 | /* keeps button heights with and without icons the same */ 52 | 53 | line-height: .9em; 54 | } 55 | li [class^="icon-"], li [class*=" icon-"] { 56 | display: inline-block; 57 | width: 1.25em; 58 | text-align: center; 59 | } 60 | li .icon-large[class^="icon-"], li .icon-large[class*=" icon-"] { 61 | /* 1.5 increased font size for icon-large * 1.25 width */ 62 | 63 | width: 1.875em; 64 | } 65 | li[class^="icon-"], li[class*=" icon-"] { 66 | margin-left: 0; 67 | list-style-type: none; 68 | } 69 | li[class^="icon-"]:before, li[class*=" icon-"]:before { 70 | text-indent: -2em; 71 | text-align: center; 72 | } 73 | li[class^="icon-"].icon-large:before, li[class*=" icon-"].icon-large:before { 74 | text-indent: -1.3333333333333333em; 75 | } 76 | /* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen 77 | readers do not read off random characters that represent icons */ 78 | .icon-glass:before { content: "\f000"; } 79 | .icon-music:before { content: "\f001"; } 80 | .icon-search:before { content: "\f002"; } 81 | .icon-envelope:before { content: "\f003"; } 82 | .icon-heart:before { content: "\f004"; } 83 | .icon-star:before { content: "\f005"; } 84 | .icon-star-empty:before { content: "\f006"; } 85 | .icon-user:before { content: "\f007"; } 86 | .icon-film:before { content: "\f008"; } 87 | .icon-th-large:before { content: "\f009"; } 88 | .icon-th:before { content: "\f00a"; } 89 | .icon-th-list:before { content: "\f00b"; } 90 | .icon-ok:before { content: "\f00c"; } 91 | .icon-remove:before { content: "\f00d"; } 92 | .icon-zoom-in:before { content: "\f00e"; } 93 | 94 | .icon-zoom-out:before { content: "\f010"; } 95 | .icon-off:before { content: "\f011"; } 96 | .icon-signal:before { content: "\f012"; } 97 | .icon-cog:before { content: "\f013"; } 98 | .icon-trash:before { content: "\f014"; } 99 | .icon-home:before { content: "\f015"; } 100 | .icon-file:before { content: "\f016"; } 101 | .icon-time:before { content: "\f017"; } 102 | .icon-road:before { content: "\f018"; } 103 | .icon-download-alt:before { content: "\f019"; } 104 | .icon-download:before { content: "\f01a"; } 105 | .icon-upload:before { content: "\f01b"; } 106 | .icon-inbox:before { content: "\f01c"; } 107 | .icon-play-circle:before { content: "\f01d"; } 108 | .icon-repeat:before { content: "\f01e"; } 109 | 110 | /* \f020 doesn't work in Safari. all shifted one down */ 111 | .icon-refresh:before { content: "\f021"; } 112 | .icon-list-alt:before { content: "\f022"; } 113 | .icon-lock:before { content: "\f023"; } 114 | .icon-flag:before { content: "\f024"; } 115 | .icon-headphones:before { content: "\f025"; } 116 | .icon-volume-off:before { content: "\f026"; } 117 | .icon-volume-down:before { content: "\f027"; } 118 | .icon-volume-up:before { content: "\f028"; } 119 | .icon-qrcode:before { content: "\f029"; } 120 | .icon-barcode:before { content: "\f02a"; } 121 | .icon-tag:before { content: "\f02b"; } 122 | .icon-tags:before { content: "\f02c"; } 123 | .icon-book:before { content: "\f02d"; } 124 | .icon-bookmark:before { content: "\f02e"; } 125 | .icon-print:before { content: "\f02f"; } 126 | 127 | .icon-camera:before { content: "\f030"; } 128 | .icon-font:before { content: "\f031"; } 129 | .icon-bold:before { content: "\f032"; } 130 | .icon-italic:before { content: "\f033"; } 131 | .icon-text-height:before { content: "\f034"; } 132 | .icon-text-width:before { content: "\f035"; } 133 | .icon-align-left:before { content: "\f036"; } 134 | .icon-align-center:before { content: "\f037"; } 135 | .icon-align-right:before { content: "\f038"; } 136 | .icon-align-justify:before { content: "\f039"; } 137 | .icon-list:before { content: "\f03a"; } 138 | .icon-indent-left:before { content: "\f03b"; } 139 | .icon-indent-right:before { content: "\f03c"; } 140 | .icon-facetime-video:before { content: "\f03d"; } 141 | .icon-picture:before { content: "\f03e"; } 142 | 143 | .icon-pencil:before { content: "\f040"; } 144 | .icon-map-marker:before { content: "\f041"; } 145 | .icon-adjust:before { content: "\f042"; } 146 | .icon-tint:before { content: "\f043"; } 147 | .icon-edit:before { content: "\f044"; } 148 | .icon-share:before { content: "\f045"; } 149 | .icon-check:before { content: "\f046"; } 150 | .icon-move:before { content: "\f047"; } 151 | .icon-step-backward:before { content: "\f048"; } 152 | .icon-fast-backward:before { content: "\f049"; } 153 | .icon-backward:before { content: "\f04a"; } 154 | .icon-play:before { content: "\f04b"; } 155 | .icon-pause:before { content: "\f04c"; } 156 | .icon-stop:before { content: "\f04d"; } 157 | .icon-forward:before { content: "\f04e"; } 158 | 159 | .icon-fast-forward:before { content: "\f050"; } 160 | .icon-step-forward:before { content: "\f051"; } 161 | .icon-eject:before { content: "\f052"; } 162 | .icon-chevron-left:before { content: "\f053"; } 163 | .icon-chevron-right:before { content: "\f054"; } 164 | .icon-plus-sign:before { content: "\f055"; } 165 | .icon-minus-sign:before { content: "\f056"; } 166 | .icon-remove-sign:before { content: "\f057"; } 167 | .icon-ok-sign:before { content: "\f058"; } 168 | .icon-question-sign:before { content: "\f059"; } 169 | .icon-info-sign:before { content: "\f05a"; } 170 | .icon-screenshot:before { content: "\f05b"; } 171 | .icon-remove-circle:before { content: "\f05c"; } 172 | .icon-ok-circle:before { content: "\f05d"; } 173 | .icon-ban-circle:before { content: "\f05e"; } 174 | 175 | .icon-arrow-left:before { content: "\f060"; } 176 | .icon-arrow-right:before { content: "\f061"; } 177 | .icon-arrow-up:before { content: "\f062"; } 178 | .icon-arrow-down:before { content: "\f063"; } 179 | .icon-share-alt:before { content: "\f064"; } 180 | .icon-resize-full:before { content: "\f065"; } 181 | .icon-resize-small:before { content: "\f066"; } 182 | .icon-plus:before { content: "\f067"; } 183 | .icon-minus:before { content: "\f068"; } 184 | .icon-asterisk:before { content: "\f069"; } 185 | .icon-exclamation-sign:before { content: "\f06a"; } 186 | .icon-gift:before { content: "\f06b"; } 187 | .icon-leaf:before { content: "\f06c"; } 188 | .icon-fire:before { content: "\f06d"; } 189 | .icon-eye-open:before { content: "\f06e"; } 190 | 191 | .icon-eye-close:before { content: "\f070"; } 192 | .icon-warning-sign:before { content: "\f071"; } 193 | .icon-plane:before { content: "\f072"; } 194 | .icon-calendar:before { content: "\f073"; } 195 | .icon-random:before { content: "\f074"; } 196 | .icon-comment:before { content: "\f075"; } 197 | .icon-magnet:before { content: "\f076"; } 198 | .icon-chevron-up:before { content: "\f077"; } 199 | .icon-chevron-down:before { content: "\f078"; } 200 | .icon-retweet:before { content: "\f079"; } 201 | .icon-shopping-cart:before { content: "\f07a"; } 202 | .icon-folder-close:before { content: "\f07b"; } 203 | .icon-folder-open:before { content: "\f07c"; } 204 | .icon-resize-vertical:before { content: "\f07d"; } 205 | .icon-resize-horizontal:before { content: "\f07e"; } 206 | 207 | .icon-bar-chart:before { content: "\f080"; } 208 | .icon-twitter-sign:before { content: "\f081"; } 209 | .icon-facebook-sign:before { content: "\f082"; } 210 | .icon-camera-retro:before { content: "\f083"; } 211 | .icon-key:before { content: "\f084"; } 212 | .icon-cogs:before { content: "\f085"; } 213 | .icon-comments:before { content: "\f086"; } 214 | .icon-thumbs-up:before { content: "\f087"; } 215 | .icon-thumbs-down:before { content: "\f088"; } 216 | .icon-star-half:before { content: "\f089"; } 217 | .icon-heart-empty:before { content: "\f08a"; } 218 | .icon-signout:before { content: "\f08b"; } 219 | .icon-linkedin-sign:before { content: "\f08c"; } 220 | .icon-pushpin:before { content: "\f08d"; } 221 | .icon-external-link:before { content: "\f08e"; } 222 | 223 | .icon-signin:before { content: "\f090"; } 224 | .icon-trophy:before { content: "\f091"; } 225 | .icon-github-sign:before { content: "\f092"; } 226 | .icon-upload-alt:before { content: "\f093"; } 227 | .icon-lemon:before { content: "\f094"; } 228 | .icon-phone:before { content: "\f095"; } 229 | .icon-check-empty:before { content: "\f096"; } 230 | .icon-bookmark-empty:before { content: "\f097"; } 231 | .icon-phone-sign:before { content: "\f098"; } 232 | .icon-twitter:before { content: "\f099"; } 233 | .icon-facebook:before { content: "\f09a"; } 234 | .icon-github:before { content: "\f09b"; } 235 | .icon-unlock:before { content: "\f09c"; } 236 | .icon-credit-card:before { content: "\f09d"; } 237 | .icon-rss:before { content: "\f09e"; } 238 | 239 | .icon-hdd:before { content: "\f0a0"; } 240 | .icon-bullhorn:before { content: "\f0a1"; } 241 | .icon-bell:before { content: "\f0a2"; } 242 | .icon-certificate:before { content: "\f0a3"; } 243 | .icon-hand-right:before { content: "\f0a4"; } 244 | .icon-hand-left:before { content: "\f0a5"; } 245 | .icon-hand-up:before { content: "\f0a6"; } 246 | .icon-hand-down:before { content: "\f0a7"; } 247 | .icon-circle-arrow-left:before { content: "\f0a8"; } 248 | .icon-circle-arrow-right:before { content: "\f0a9"; } 249 | .icon-circle-arrow-up:before { content: "\f0aa"; } 250 | .icon-circle-arrow-down:before { content: "\f0ab"; } 251 | .icon-globe:before { content: "\f0ac"; } 252 | .icon-wrench:before { content: "\f0ad"; } 253 | .icon-tasks:before { content: "\f0ae"; } 254 | 255 | .icon-filter:before { content: "\f0b0"; } 256 | .icon-briefcase:before { content: "\f0b1"; } 257 | .icon-fullscreen:before { content: "\f0b2"; } 258 | 259 | .icon-group:before { content: "\f0c0"; } 260 | .icon-link:before { content: "\f0c1"; } 261 | .icon-cloud:before { content: "\f0c2"; } 262 | .icon-beaker:before { content: "\f0c3"; } 263 | .icon-cut:before { content: "\f0c4"; } 264 | .icon-copy:before { content: "\f0c5"; } 265 | .icon-paper-clip:before { content: "\f0c6"; } 266 | .icon-save:before { content: "\f0c7"; } 267 | .icon-sign-blank:before { content: "\f0c8"; } 268 | .icon-reorder:before { content: "\f0c9"; } 269 | .icon-list-ul:before { content: "\f0ca"; } 270 | .icon-list-ol:before { content: "\f0cb"; } 271 | .icon-strikethrough:before { content: "\f0cc"; } 272 | .icon-underline:before { content: "\f0cd"; } 273 | .icon-table:before { content: "\f0ce"; } 274 | 275 | .icon-magic:before { content: "\f0d0"; } 276 | .icon-truck:before { content: "\f0d1"; } 277 | .icon-pinterest:before { content: "\f0d2"; } 278 | .icon-pinterest-sign:before { content: "\f0d3"; } 279 | .icon-google-plus-sign:before { content: "\f0d4"; } 280 | .icon-google-plus:before { content: "\f0d5"; } 281 | .icon-money:before { content: "\f0d6"; } 282 | .icon-caret-down:before { content: "\f0d7"; } 283 | .icon-caret-up:before { content: "\f0d8"; } 284 | .icon-caret-left:before { content: "\f0d9"; } 285 | .icon-caret-right:before { content: "\f0da"; } 286 | .icon-columns:before { content: "\f0db"; } 287 | .icon-sort:before { content: "\f0dc"; } 288 | .icon-sort-down:before { content: "\f0dd"; } 289 | .icon-sort-up:before { content: "\f0de"; } 290 | 291 | .icon-envelope-alt:before { content: "\f0e0"; } 292 | .icon-linkedin:before { content: "\f0e1"; } 293 | .icon-undo:before { content: "\f0e2"; } 294 | .icon-legal:before { content: "\f0e3"; } 295 | .icon-dashboard:before { content: "\f0e4"; } 296 | .icon-comment-alt:before { content: "\f0e5"; } 297 | .icon-comments-alt:before { content: "\f0e6"; } 298 | .icon-bolt:before { content: "\f0e7"; } 299 | .icon-sitemap:before { content: "\f0e8"; } 300 | .icon-umbrella:before { content: "\f0e9"; } 301 | .icon-paste:before { content: "\f0ea"; } 302 | 303 | .icon-user-md:before { content: "\f200"; } 304 | -------------------------------------------------------------------------------- /frontend/public/css/socialshareprivacy.css: -------------------------------------------------------------------------------- 1 | .social_share_privacy_area { 2 | clear: both; 3 | margin: 0px 0 !important; 4 | margin-top: 8px !important; 5 | list-style-type: none; 6 | padding: 0 !important; 7 | width: auto; 8 | height: 25px; 9 | display: block; 10 | } 11 | .social_share_privacy_area li { 12 | margin: 0 !important; 13 | padding: 0 !important; 14 | height: 21px; 15 | float: left; 16 | } 17 | .social_share_privacy_area li .dummy_btn { 18 | float: left; 19 | margin: 0 0 0 10px; 20 | cursor: pointer; 21 | padding: 0; 22 | height: inherit; 23 | } 24 | .social_share_privacy_area li div iframe { 25 | overflow: hidden; 26 | height: inherit; 27 | width: inherit; 28 | } 29 | /* Facebook begin */ 30 | .social_share_privacy_area .facebook { 31 | width: 180px; 32 | display: inline-block; 33 | } 34 | .social_share_privacy_area .facebook .fb_like iframe { 35 | width: 145px; 36 | } 37 | /* Facebook end */ 38 | /* Twitter begin */ 39 | .social_share_privacy_area .twitter { 40 | width: 148px; 41 | } 42 | .social_share_privacy_area li div.tweet { 43 | width: 115px; 44 | } 45 | /* Twitter end */ 46 | /* Google+ begin */ 47 | .social_share_privacy_area .gplus { 48 | width: 123px; 49 | } 50 | .social_share_privacy_area li div.gplusone { 51 | width: 90px; 52 | } 53 | /* Google+ end */ 54 | /* Switch begin */ 55 | .social_share_privacy_area li .switch { 56 | display: inline-block; 57 | text-indent: -9999em; 58 | background: transparent url(../img/socialshareprivacy_on_off.png) no-repeat 0 0 scroll; 59 | width: 23px; 60 | height: 12px; 61 | overflow: hidden; 62 | float: left; 63 | margin: 4px 0 0; 64 | padding: 0; 65 | cursor: pointer; 66 | } 67 | .social_share_privacy_area li .switch.on { 68 | background-position: 0 -12px; 69 | } 70 | /* Switch end */ 71 | /* Tooltips begin */ 72 | .social_share_privacy_area li.help_info { 73 | position: relative; 74 | } 75 | .social_share_privacy_area li.help_info .info, 76 | .social_share_privacy_area li .help_info.icon .info { 77 | display: none; 78 | position: absolute; 79 | bottom: 40px; 80 | left: 0; 81 | width: 290px; 82 | padding: 10px 15px; 83 | margin: 0; 84 | font-size: 12px; 85 | line-height: 16px; 86 | font-weight: bold; 87 | border: 1px solid #ccc; 88 | -moz-border-radius: 4px; 89 | -webkit-border-radius: 4px; 90 | border-radius: 4px; 91 | -moz-box-shadow: 0 3px 4px #999; 92 | -webkit-box-shadow: 0 3px 4px #999; 93 | box-shadow: 0 3px 4px #999; 94 | background-color: #fdfbec; 95 | color: #000; 96 | z-index: 500; 97 | } 98 | .social_share_privacy_area li.gplus.help_info .info { 99 | left: -60px; 100 | } 101 | .social_share_privacy_area li .help_info.icon .info { 102 | left: -243px; 103 | width: 350px; 104 | } 105 | .social_share_privacy_area li.help_info.display .info, 106 | .social_share_privacy_area li .help_info.icon.display .info { 107 | display: block; 108 | } 109 | .social_share_privacy_area li.help_info.info_off.display .info { 110 | display: none; 111 | } 112 | .social_share_privacy_area li .help_info.icon { 113 | background: #fff url(../img/socialshareprivacy_info.png) no-repeat center center scroll; 114 | width: 25px; 115 | height: 20px; 116 | position: relative; 117 | display: inline-block; 118 | vertical-align: top; 119 | border: 2px solid #e7e3e3; 120 | border-right-width: 0; 121 | -moz-border-radius: 5px 0 0 5px; 122 | -webkit-border-radius: 5px 0 0 5px; 123 | border-radius: 5px 0 0 5px; 124 | margin: 0; 125 | padding: 0; 126 | } 127 | .social_share_privacy_area li.settings_info .settings_info_menu.on .help_info.icon { 128 | border-top-width: 0; 129 | border-left-width: 0; 130 | } 131 | .social_share_privacy_area li.settings_info .settings_info_menu.perma_option_off .help_info.icon { 132 | border-right-width: 2px; 133 | -moz-border-radius: 5px; 134 | -webkit-border-radius: 5px; 135 | border-radius: 5px; 136 | } 137 | /* Tooltips end */ 138 | /* Settings/Info begin */ 139 | .social_share_privacy_area li.settings_info { 140 | position: relative; 141 | top: -2px; 142 | } 143 | .social_share_privacy_area li.settings_info a { 144 | text-decoration: none; 145 | margin: 0 !important; 146 | } 147 | .social_share_privacy_area li.settings_info .settings_info_menu { 148 | background-color: #f3f4f5; 149 | border: 2px solid #e7e3e3; 150 | -moz-border-radius: 5px; 151 | -webkit-border-radius: 5px; 152 | border-radius: 5px; 153 | -moz-box-shadow: 2px 2px 3px #c1c1c1; 154 | -webkit-box-shadow: 2px 2px 3px #c1c1c1; 155 | box-shadow: 3px 3px 3px #c1c1c1; 156 | left: 0; 157 | position: absolute; 158 | top: 0; 159 | width: 135px; 160 | z-index: 1000; 161 | margin: 0; 162 | padding: 0; 163 | } 164 | .social_share_privacy_area li.settings_info .settings_info_menu.off { 165 | border-width: 0; 166 | -moz-box-shadow: none; 167 | -webkit-box-shadow: none; 168 | box-shadow: none; 169 | background-color: transparent; 170 | } 171 | .social_share_privacy_area li.settings_info .settings_info_menu.off form { 172 | display: none; 173 | margin: 0; 174 | padding: 0; 175 | } 176 | .social_share_privacy_area li.settings_info .settings_info_menu .settings { 177 | text-indent: -9999em; 178 | display: inline-block; 179 | background: #fff url(../img/settings.png) no-repeat center center scroll; 180 | width: 25px; 181 | height: 20px; 182 | border: 2px solid #e7e3e3; 183 | -moz-border-radius: 0 5px 5px 0; 184 | -webkit-border-radius: 0 5px 5px 0; 185 | border-radius: 0 5px 5px 0; 186 | border-left: 1px solid #ddd; 187 | margin: 0; 188 | padding: 0; 189 | } 190 | .social_share_privacy_area li.settings_info .settings_info_menu.on .settings { 191 | border-top-width: 0; 192 | } 193 | .social_share_privacy_area li.settings_info .settings_info_menu form fieldset { 194 | border-width: 0; 195 | margin: 0; 196 | padding: 0 10px 10px; 197 | } 198 | .social_share_privacy_area li.settings_info .settings_info_menu form fieldset legend { 199 | font-size: 11px; 200 | font-weight: bold; 201 | line-height: 14px; 202 | margin: 0; 203 | padding: 10px 0; 204 | width: 115px; 205 | } 206 | .social_share_privacy_area li.settings_info .settings_info_menu form fieldset input { 207 | clear: both; 208 | float: left; 209 | margin: 4px 10px 4px 0; 210 | padding: 0; 211 | } 212 | .social_share_privacy_area li.settings_info .settings_info_menu form fieldset label { 213 | display: inline-block; 214 | float: left; 215 | font-size: 12px; 216 | font-weight: bold; 217 | line-height: 24px; 218 | -moz-transition: color .5s ease-in; 219 | -webkit-transition: color .5s ease-in; 220 | transition: color .5s ease-in; 221 | margin: 0; 222 | padding: 0; 223 | } 224 | .social_share_privacy_area li.settings_info .settings_info_menu form fieldset label.checked { 225 | color: #090; 226 | } 227 | /* Settings/Info end */ 228 | -------------------------------------------------------------------------------- /frontend/public/font/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xmorpheus/c3netmon-public/5155b011c96770b200e3bd08830efe5208cb2f67/frontend/public/font/fontawesome-webfont.eot -------------------------------------------------------------------------------- /frontend/public/font/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xmorpheus/c3netmon-public/5155b011c96770b200e3bd08830efe5208cb2f67/frontend/public/font/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /frontend/public/font/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xmorpheus/c3netmon-public/5155b011c96770b200e3bd08830efe5208cb2f67/frontend/public/font/fontawesome-webfont.woff -------------------------------------------------------------------------------- /frontend/public/img/2-klick-logo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xmorpheus/c3netmon-public/5155b011c96770b200e3bd08830efe5208cb2f67/frontend/public/img/2-klick-logo.jpg -------------------------------------------------------------------------------- /frontend/public/img/28c3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xmorpheus/c3netmon-public/5155b011c96770b200e3bd08830efe5208cb2f67/frontend/public/img/28c3.png -------------------------------------------------------------------------------- /frontend/public/img/29c3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xmorpheus/c3netmon-public/5155b011c96770b200e3bd08830efe5208cb2f67/frontend/public/img/29c3.png -------------------------------------------------------------------------------- /frontend/public/img/Blackhole-2880x1600.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xmorpheus/c3netmon-public/5155b011c96770b200e3bd08830efe5208cb2f67/frontend/public/img/Blackhole-2880x1600.jpg -------------------------------------------------------------------------------- /frontend/public/img/carbon_fibre_big.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xmorpheus/c3netmon-public/5155b011c96770b200e3bd08830efe5208cb2f67/frontend/public/img/carbon_fibre_big.png -------------------------------------------------------------------------------- /frontend/public/img/dummy_facebook.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xmorpheus/c3netmon-public/5155b011c96770b200e3bd08830efe5208cb2f67/frontend/public/img/dummy_facebook.png -------------------------------------------------------------------------------- /frontend/public/img/dummy_facebook_en.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xmorpheus/c3netmon-public/5155b011c96770b200e3bd08830efe5208cb2f67/frontend/public/img/dummy_facebook_en.png -------------------------------------------------------------------------------- /frontend/public/img/dummy_gplus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xmorpheus/c3netmon-public/5155b011c96770b200e3bd08830efe5208cb2f67/frontend/public/img/dummy_gplus.png -------------------------------------------------------------------------------- /frontend/public/img/dummy_gplus_alt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xmorpheus/c3netmon-public/5155b011c96770b200e3bd08830efe5208cb2f67/frontend/public/img/dummy_gplus_alt.png -------------------------------------------------------------------------------- /frontend/public/img/dummy_twitter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xmorpheus/c3netmon-public/5155b011c96770b200e3bd08830efe5208cb2f67/frontend/public/img/dummy_twitter.png -------------------------------------------------------------------------------- /frontend/public/img/fremaks.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xmorpheus/c3netmon-public/5155b011c96770b200e3bd08830efe5208cb2f67/frontend/public/img/fremaks.png -------------------------------------------------------------------------------- /frontend/public/img/loader.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xmorpheus/c3netmon-public/5155b011c96770b200e3bd08830efe5208cb2f67/frontend/public/img/loader.gif -------------------------------------------------------------------------------- /frontend/public/img/logo-30c3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xmorpheus/c3netmon-public/5155b011c96770b200e3bd08830efe5208cb2f67/frontend/public/img/logo-30c3.png -------------------------------------------------------------------------------- /frontend/public/img/logo-31c3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xmorpheus/c3netmon-public/5155b011c96770b200e3bd08830efe5208cb2f67/frontend/public/img/logo-31c3.png -------------------------------------------------------------------------------- /frontend/public/img/ohm2013_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xmorpheus/c3netmon-public/5155b011c96770b200e3bd08830efe5208cb2f67/frontend/public/img/ohm2013_logo.png -------------------------------------------------------------------------------- /frontend/public/img/ps_neutral.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xmorpheus/c3netmon-public/5155b011c96770b200e3bd08830efe5208cb2f67/frontend/public/img/ps_neutral.png -------------------------------------------------------------------------------- /frontend/public/img/settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xmorpheus/c3netmon-public/5155b011c96770b200e3bd08830efe5208cb2f67/frontend/public/img/settings.png -------------------------------------------------------------------------------- /frontend/public/img/socialshareprivacy_info.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xmorpheus/c3netmon-public/5155b011c96770b200e3bd08830efe5208cb2f67/frontend/public/img/socialshareprivacy_info.png -------------------------------------------------------------------------------- /frontend/public/img/socialshareprivacy_on_off.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xmorpheus/c3netmon-public/5155b011c96770b200e3bd08830efe5208cb2f67/frontend/public/img/socialshareprivacy_on_off.png -------------------------------------------------------------------------------- /frontend/public/js/c3data.js: -------------------------------------------------------------------------------- 1 | // setup socket for socket.io 2 | var socket = io.connect(); 3 | 4 | var graphCount = 0; 5 | var max_bandwith = 50000; 6 | 7 | var config = new Array(); 8 | var Series = new Array(); 9 | var Peak = new Array(); 10 | 11 | // temp variable to check if history is loaded 12 | var history = null; 13 | 14 | var cache = []; 15 | cache.bw_down = null; 16 | cache.bw_up = null; 17 | cache.bw_down_total = null; 18 | cache.bw_up_total = null; 19 | 20 | $.ajaxSetup({ 21 | "async": false 22 | }); 23 | 24 | function initGraphHTML(name,div) 25 | { 26 | 27 | var width; 28 | var height; 29 | var members=0; 30 | var i=0; 31 | 32 | $.each(Series[name], function(subKey, subValue) { 33 | members++; 34 | }) 35 | 36 | if(detailGraph==false) { width=500; height=300; heightx=400 } else { width=1000; height=450; heightx=550 } 37 | 38 | var html; 39 | html = '
'; 40 | html += '
'; 41 | html += ' '; 52 | html += '
'; 53 | html += '
'; 54 | html += ' '; 55 | graphCount++; 56 | if(graphCount==2 || detailGraph==true) 57 | { 58 | graphCount=0; 59 | } 60 | $(div).append(html); 61 | if(graphCount==0) 62 | { 63 | } 64 | } 65 | 66 | function initGraphArray(newLength) 67 | { 68 | newArray = new Array(newLength); 69 | for (var i = 0; i < newArray.length; ++i) 70 | { 71 | newArray[i] = new Array(); 72 | newArray[i].push ({ x: 0, y: 0 }); 73 | } 74 | 75 | return newArray; 76 | } 77 | 78 | function initArray(newLength) 79 | { 80 | newArray = new Array(newLength); 81 | for (var i = 0; i < newArray.length; ++i) 82 | { 83 | newArray[i] = new Array(); 84 | } 85 | 86 | return newArray; 87 | } 88 | 89 | function init() 90 | { 91 | 92 | $.getJSON('/info.json', function (data) { 93 | 94 | $.each(data.plugins, function(key, value) 95 | { 96 | var members = 0; 97 | 98 | config.push(value); 99 | Peak.push(value); 100 | 101 | $.each(data[value].legend, function(key, value) 102 | { 103 | members++; 104 | }) 105 | 106 | Series[value] = initGraphArray(members); 107 | Peak[value] = initArray(members); 108 | 109 | initGraphHTML(value,"#graph"); 110 | 111 | $('#'+value+'Name').html(data[value].name); 112 | 113 | $.each(data[value].legend, function(lkey, lvalue) 114 | { 115 | $('#'+value+'Legend'+lkey).html(data[value].legend[lkey]); 116 | $('#'+value+'Type'+lkey).html(data[value].type[lkey]); 117 | }) 118 | 119 | 120 | }) 121 | 122 | initHistory(); 123 | 124 | $.each(config, function(key, value) 125 | { 126 | createGraph(value, data[value]); 127 | graphArray[value].render(); 128 | }) 129 | 130 | }) 131 | } 132 | 133 | function initHistory() 134 | { 135 | 136 | $.getJSON('/history.json', function (data) { 137 | // got json, removing dummy data 138 | 139 | $.each(config, function(key, value) { 140 | $.each(Series[value], function(key, value) { 141 | value.pop(); 142 | }) 143 | }); 144 | 145 | var historyCount = 0; 146 | 147 | // update graph arrays with historical data 148 | $.each(data, function (key, datax) { 149 | 150 | $.each(datax, function (keyy, datay) 151 | { 152 | $.each(config, function(keyz, dataz) 153 | { 154 | if(dataz==keyy) 155 | { 156 | 157 | /*console.log(Series[dataz]);*/ 158 | 159 | $.each(Series[dataz], function(subKey, subValue) { 160 | 161 | try { 162 | 163 | if(datax[dataz].value[subKey]>=0) 164 | { 165 | 166 | subValue.push({ 167 | x: datax.unixtime, 168 | y: datax[dataz].value[subKey] 169 | }) 170 | } 171 | 172 | $('#'+dataz+'Value'+subKey).html(datax[dataz].value[subKey]); 173 | 174 | if (datax[dataz].value[subKey] > Peak[dataz][subKey]) 175 | { 176 | Peak[dataz][subKey] = datax[dataz].value[subKey]; 177 | $('#'+dataz+'Value'+subKey+'Peak').html(Peak[dataz][subKey]); 178 | } 179 | 180 | } catch (e) { 181 | // skipping missing data point 182 | } 183 | 184 | 185 | }) 186 | } 187 | }) 188 | }) 189 | 190 | // some special manual stuff 191 | 192 | if(datax.bw.value[0]>0 && datax.bw.value[1]>0) 193 | { 194 | cache.bw_down_total += (datax.bw.value[0] * 300 / 8 / 1024); 195 | cache.bw_up_total += (datax.bw.value[1] * 300 / 8 / 1024); 196 | 197 | cache.bw_down = datax.bw.value[0]; 198 | cache.bw_up = datax.bw.value[1]; 199 | 200 | $('#bw_down_cur').html(datax.bw.value[0]); 201 | $('#bw_up_cur').html(datax.bw.value[1]); 202 | 203 | cache.bw_up_total = parseInt(cache.bw_up_total); 204 | cache.bw_down_total = parseInt(cache.bw_down_total); 205 | 206 | $('#bw_up_total').html(cache.bw_up_total); 207 | $('#bw_down_total').html(cache.bw_down_total); 208 | 209 | $("#downstream").progressbar({ 210 | value: (cache.bw_down / max_bandwith * 100) 211 | }); 212 | 213 | $("#upstream").progressbar({ 214 | value: (cache.bw_up / max_bandwith * 100) 215 | }) 216 | 217 | $('#bw_down_percent').html(parseInt(cache.bw_down / max_bandwith * 100)); 218 | $('#bw_up_percent').html(parseInt(cache.bw_up / max_bandwith * 100)); 219 | } 220 | 221 | }); 222 | 223 | $('#loading').hide(); 224 | history = 1; 225 | 226 | }); 227 | 228 | } 229 | 230 | // receive loop 231 | socket.on('data', function (data) { 232 | 233 | if (history == 1) { 234 | 235 | if (cache.firstgraph == null) { 236 | cache.firstgraph = 1; 237 | data.graph = 1; 238 | } 239 | 240 | 241 | $.each(config, function(key, value) 242 | { 243 | $.each(Series[value], function(subKey, subValue) { 244 | if(data[value] != null) 245 | { 246 | subValue.push({ 247 | x: data.unixtime, 248 | y: data[value].value[subKey] 249 | }); 250 | } 251 | $('#'+value+'Value'+subKey).html(data[value].value[subKey]); 252 | 253 | if (data[value].value[subKey] > Peak[value][subKey]) 254 | { 255 | Peak[value][subKey] = data[value].value[subKey]; 256 | $('#'+value+'Value'+subKey+'Peak').html(Peak[value][subKey]); 257 | } 258 | 259 | }) 260 | 261 | graphArray[value].render(); 262 | }) 263 | 264 | // some special manual stuff 265 | 266 | cache.bw_down_total += parseInt(data.bw.value[0] * 10 / 8 / 1024); 267 | cache.bw_up_total += parseInt(data.bw.value[1] * 10 / 8 / 1024); 268 | $('#bw_down_total').html(parseInt(cache.bw_down_total)); 269 | $('#bw_up_total').html(parseInt(cache.bw_up_total)); 270 | 271 | $("#downstream").progressbar({ 272 | value: (data.bw.value[0] / max_bandwith * 100) 273 | }); 274 | $("#upstream").progressbar({ 275 | value: (data.bw.value[1] / max_bandwith * 100) 276 | }); 277 | $('#bw_down_percent').html(parseInt(data.bw.value[0] / max_bandwith * 100)); 278 | $('#bw_up_percent').html(parseInt(data.bw.value[1] / max_bandwith * 100)); 279 | } 280 | 281 | }); 282 | console.log("loaded c3data"); 283 | -------------------------------------------------------------------------------- /frontend/public/js/c3graph.js: -------------------------------------------------------------------------------- 1 | var palette = new Rickshaw.Color.Palette({ 2 | scheme: 'cool' 3 | }); 4 | var palette2 = new Rickshaw.Color.Palette({ 5 | scheme: 'cool' 6 | }); 7 | 8 | var graphArray = new Array(); 9 | graphArray.legend = new Array(); 10 | graphArray.Xaxis = new Array(); 11 | graphArray.Yaxis = new Array(); 12 | graphArray.Hover = new Array(); 13 | graphArray.Slider = new Array(); 14 | 15 | function createGraph(name,data) { 16 | 17 | if (detailGraph == 1) { 18 | var globalWidth = 948; 19 | var globalHeight = 310; 20 | } else { 21 | var globalWidth = 450; 22 | var globalHeight = 165; 23 | } 24 | 25 | var mySeries = new Array(); 26 | 27 | $.each(Series[name], function(subKey, subValue) { 28 | 29 | mySeries.push({ 30 | color: palette.color(), 31 | data: Series[name][subKey], 32 | name: data.legend[subKey] 33 | }) 34 | 35 | /*console.log(mySeries);*/ 36 | }) 37 | 38 | Rickshaw.Series.zeroFill(mySeries); 39 | 40 | graphArray[name] = new Rickshaw.Graph({ 41 | element: document.getElementById(name+"_graph"), 42 | width: globalWidth, 43 | height: globalHeight, 44 | renderer: 'stack', 45 | series: mySeries, 46 | }); 47 | graphArray[name].render(); 48 | 49 | graphArray.legend.name = new Rickshaw.Graph.Legend({ 50 | graph: graphArray[name], 51 | element: document.getElementById(name+'_legend') 52 | }); 53 | 54 | var shelving = new Rickshaw.Graph.Behavior.Series.Toggle({ 55 | graph: graphArray[name], 56 | legend: graphArray.legend.name 57 | }); 58 | var ticksTreatment = 'glow'; 59 | graphArray.Xaxis.name = new Rickshaw.Graph.Axis.Time({ 60 | graph: graphArray[name], 61 | ticksTreatment: ticksTreatment 62 | }); 63 | graphArray.Xaxis.name.render(); 64 | graphArray.Yaxis.name = new Rickshaw.Graph.Axis.Y({ 65 | graph: graphArray[name], 66 | tickFormat: Rickshaw.Fixtures.Number.formatKMBT, 67 | ticksTreatment: ticksTreatment 68 | }); 69 | graphArray.Yaxis.name.render(); 70 | if (detailGraph == 1) { 71 | /*graphArray.Slider.name = new Rickshaw.Graph.RangeSlider({*/ 72 | /*graph: graphArray[name],*/ 73 | /*element: $('#'+name+'_slider')*/ 74 | /*});*/ 75 | graphArray.Hover.name = new Rickshaw.Graph.HoverDetail({ 76 | graph: graphArray[name] 77 | }); 78 | }; 79 | $('#'+name).show(); 80 | 81 | } 82 | console.log("loaded c3graph"); 83 | -------------------------------------------------------------------------------- /frontend/public/js/jquery.socialshareprivacy.js: -------------------------------------------------------------------------------- 1 | /* 2 | * jquery.socialshareprivacy.js | 2 Klicks fuer mehr Datenschutz 3 | * 4 | * http://www.heise.de/extras/socialshareprivacy/ 5 | * http://www.heise.de/ct/artikel/2-Klicks-fuer-mehr-Datenschutz-1333879.html 6 | * 7 | * Copyright (c) 2011 Hilko Holweg, Sebastian Hilbig, Nicolas Heiringhoff, Juergen Schmidt, 8 | * Heise Zeitschriften Verlag GmbH & Co. KG, http://www.heise.de 9 | * 10 | * is released under the MIT License http://www.opensource.org/licenses/mit-license.php 11 | * 12 | * Spread the word, link to us if you can. 13 | */ 14 | (function ($) { 15 | 16 | "use strict"; 17 | 18 | /* 19 | * helper functions 20 | */ 21 | 22 | // abbreviate at last blank before length and add "\u2026" (horizontal ellipsis) 23 | function abbreviateText(text, length) { 24 | var abbreviated = decodeURIComponent(text); 25 | if (abbreviated.length <= length) { 26 | return text; 27 | } 28 | 29 | var lastWhitespaceIndex = abbreviated.substring(0, length - 1).lastIndexOf(' '); 30 | abbreviated = encodeURIComponent(abbreviated.substring(0, lastWhitespaceIndex)) + "\u2026"; 31 | 32 | return abbreviated; 33 | } 34 | 35 | // returns content of tags or '' if empty/non existant 36 | function getMeta(name) { 37 | var metaContent = $('meta[name="' + name + '"]').attr('content'); 38 | return metaContent || ''; 39 | } 40 | 41 | // create tweet text from content of and 42 | // fallback to content of tag 43 | function getTweetText() { 44 | var title = getMeta('DC.title'); 45 | var creator = getMeta('DC.creator'); 46 | 47 | if (title.length > 0 && creator.length > 0) { 48 | title += ' - ' + creator; 49 | } else { 50 | title = $('title').text(); 51 | } 52 | 53 | return encodeURIComponent(title); 54 | } 55 | 56 | // build URI from rel="canonical" or document.location 57 | function getURI() { 58 | var uri = document.location.href; 59 | var canonical = $("link[rel=canonical]").attr("href"); 60 | 61 | if (canonical && canonical.length > 0) { 62 | if (canonical.indexOf("http") < 0) { 63 | canonical = document.location.protocol + "//" + document.location.host + canonical; 64 | } 65 | uri = canonical; 66 | } 67 | 68 | return uri; 69 | } 70 | 71 | function cookieSet(name, value, days, path, domain) { 72 | var expires = new Date(); 73 | expires.setTime(expires.getTime() + (days * 24 * 60 * 60 * 1000)); 74 | document.cookie = name + '=' + value + '; expires=' + expires.toUTCString() + '; path=' + path + '; domain=' + domain; 75 | } 76 | function cookieDel(name, value, path, domain) { 77 | var expires = new Date(); 78 | expires.setTime(expires.getTime() - 100); 79 | document.cookie = name + '=' + value + '; expires=' + expires.toUTCString() + '; path=' + path + '; domain=' + domain; 80 | } 81 | 82 | // extend jquery with our plugin function 83 | $.fn.socialSharePrivacy = function (settings) { 84 | var defaults = { 85 | 'services' : { 86 | 'facebook' : { 87 | 'status' : 'on', 88 | 'dummy_img' : 'img/dummy_facebook.png', 89 | 'txt_info' : '2 Klicks für mehr Datenschutz: Erst wenn Sie hier klicken, wird der Button aktiv und Sie können Ihre Empfehlung an Facebook senden. Schon beim Aktivieren werden Daten an Dritte übertragen – siehe <em>i</em>.', 90 | 'txt_fb_off' : 'nicht mit Facebook verbunden', 91 | 'txt_fb_on' : 'mit Facebook verbunden', 92 | 'perma_option' : 'on', 93 | 'display_name' : 'Facebook', 94 | 'referrer_track' : '', 95 | 'language' : 'de_DE', 96 | 'action' : 'recommend' 97 | }, 98 | 'twitter' : { 99 | 'status' : 'on', 100 | 'dummy_img' : 'img/dummy_twitter.png', 101 | 'txt_info' : '2 Klicks für mehr Datenschutz: Erst wenn Sie hier klicken, wird der Button aktiv und Sie können Ihre Empfehlung an Twitter senden. Schon beim Aktivieren werden Daten an Dritte übertragen – siehe <em>i</em>.', 102 | 'txt_twitter_off' : 'nicht mit Twitter verbunden', 103 | 'txt_twitter_on' : 'mit Twitter verbunden', 104 | 'perma_option' : 'on', 105 | 'display_name' : 'Twitter', 106 | 'referrer_track' : '', 107 | 'tweet_text' : getTweetText, 108 | 'language' : 'en' 109 | }, 110 | 'gplus' : { 111 | 'status' : 'on', 112 | 'dummy_img' : 'img/dummy_gplus.png', 113 | 'txt_info' : '2 Klicks für mehr Datenschutz: Erst wenn Sie hier klicken, wird der Button aktiv und Sie können Ihre Empfehlung an Google+ senden. Schon beim Aktivieren werden Daten an Dritte übertragen – siehe <em>i</em>.', 114 | 'txt_gplus_off' : 'nicht mit Google+ verbunden', 115 | 'txt_gplus_on' : 'mit Google+ verbunden', 116 | 'perma_option' : 'on', 117 | 'display_name' : 'Google+', 118 | 'referrer_track' : '', 119 | 'language' : 'de' 120 | } 121 | }, 122 | 'info_link' : 'http://www.heise.de/ct/artikel/2-Klicks-fuer-mehr-Datenschutz-1333879.html', 123 | 'txt_help' : 'Wenn Sie diese Felder durch einen Klick aktivieren, werden Informationen an Facebook, Twitter oder Google in die USA übertragen und unter Umständen auch dort gespeichert. Näheres erfahren Sie durch einen Klick auf das <em>i</em>.', 124 | 'settings_perma' : 'Dauerhaft aktivieren und Datenüber­tragung zustimmen:', 125 | 'cookie_path' : '/', 126 | 'cookie_domain' : document.location.host, 127 | 'cookie_expires' : '365', 128 | 'css_path' : 'css/socialshareprivacy.css', 129 | 'uri' : getURI 130 | }; 131 | 132 | // Standardwerte des Plug-Ings mit den vom User angegebenen Optionen ueberschreiben 133 | var options = $.extend(true, defaults, settings); 134 | 135 | var facebook_on = (options.services.facebook.status === 'on'); 136 | var twitter_on = (options.services.twitter.status === 'on'); 137 | var gplus_on = (options.services.gplus.status === 'on'); 138 | 139 | // check if at least one service is "on" 140 | if (!facebook_on && !twitter_on && !gplus_on) { 141 | return; 142 | } 143 | 144 | // insert stylesheet into document and prepend target element 145 | if (options.css_path.length > 0) { 146 | // IE fix (noetig fuer IE < 9 - wird hier aber fuer alle IE gemacht) 147 | if (document.createStyleSheet) { 148 | document.createStyleSheet(options.css_path); 149 | } else { 150 | $('head').append('<link rel="stylesheet" type="text/css" href="' + options.css_path + '" />'); 151 | } 152 | } 153 | 154 | return this.each(function () { 155 | 156 | $(this).prepend('<ul class="social_share_privacy_area"></ul>'); 157 | var context = $('.social_share_privacy_area', this); 158 | 159 | // canonical uri that will be shared 160 | var uri = options.uri; 161 | if (typeof uri === 'function') { 162 | uri = uri(context); 163 | } 164 | 165 | // 166 | // Facebook 167 | // 168 | if (facebook_on) { 169 | var fb_enc_uri = encodeURIComponent(uri + options.services.facebook.referrer_track); 170 | var fb_code = '<iframe src="http://www.facebook.com/plugins/like.php?locale=' + options.services.facebook.language + '&href=' + fb_enc_uri + '&send=false&layout=button_count&width=120&show_faces=false&action=' + options.services.facebook.action + '&colorscheme=light&font&height=21" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:145px; height:21px;" allowTransparency="true"></iframe>'; 171 | var fb_dummy_btn = '<img src="' + options.services.facebook.dummy_img + '" alt="Facebook "Like"-Dummy" class="fb_like_privacy_dummy" />'; 172 | 173 | context.append('<li class="facebook help_info"><span class="info">' + options.services.facebook.txt_info + '</span><span class="switch off">' + options.services.facebook.txt_fb_off + '</span><div class="fb_like dummy_btn">' + fb_dummy_btn + '</div></li>'); 174 | 175 | var $container_fb = $('li.facebook', context); 176 | 177 | $('li.facebook div.fb_like img.fb_like_privacy_dummy,li.facebook span.switch', context).live('click', function () { 178 | if ($container_fb.find('span.switch').hasClass('off')) { 179 | $container_fb.addClass('info_off'); 180 | $container_fb.find('span.switch').addClass('on').removeClass('off').html(options.services.facebook.txt_fb_on); 181 | $container_fb.find('img.fb_like_privacy_dummy').replaceWith(fb_code); 182 | } else { 183 | $container_fb.removeClass('info_off'); 184 | $container_fb.find('span.switch').addClass('off').removeClass('on').html(options.services.facebook.txt_fb_off); 185 | $container_fb.find('.fb_like').html(fb_dummy_btn); 186 | } 187 | }); 188 | } 189 | 190 | // 191 | // Twitter 192 | // 193 | if (twitter_on) { 194 | var text = options.services.twitter.tweet_text; 195 | if (typeof text === 'function') { 196 | text = text(); 197 | } 198 | // 120 is the max character count left after twitters automatic url shortening with t.co 199 | text = abbreviateText(text, '120'); 200 | 201 | var twitter_enc_uri = encodeURIComponent(uri + options.services.twitter.referrer_track); 202 | var twitter_count_url = encodeURIComponent(uri); 203 | var twitter_code = '<iframe allowtransparency="true" frameborder="0" scrolling="no" src="http://platform.twitter.com/widgets/tweet_button.html?url=' + twitter_enc_uri + '&counturl=' + twitter_count_url + '&text=' + text + '&count=horizontal&lang=' + options.services.twitter.language + '" style="width:130px; height:25px;"></iframe>'; 204 | var twitter_dummy_btn = '<img src="' + options.services.twitter.dummy_img + '" alt=""Tweet this"-Dummy" class="tweet_this_dummy" />'; 205 | 206 | context.append('<li class="twitter help_info"><span class="info">' + options.services.twitter.txt_info + '</span><span class="switch off">' + options.services.twitter.txt_twitter_off + '</span><div class="tweet dummy_btn">' + twitter_dummy_btn + '</div></li>'); 207 | 208 | var $container_tw = $('li.twitter', context); 209 | 210 | $('li.twitter div.tweet img,li.twitter span.switch', context).live('click', function () { 211 | if ($container_tw.find('span.switch').hasClass('off')) { 212 | $container_tw.addClass('info_off'); 213 | $container_tw.find('span.switch').addClass('on').removeClass('off').html(options.services.twitter.txt_twitter_on); 214 | $container_tw.find('img.tweet_this_dummy').replaceWith(twitter_code); 215 | } else { 216 | $container_tw.removeClass('info_off'); 217 | $container_tw.find('span.switch').addClass('off').removeClass('on').html(options.services.twitter.txt_twitter_off); 218 | $container_tw.find('.tweet').html(twitter_dummy_btn); 219 | } 220 | }); 221 | } 222 | 223 | // 224 | // Google+ 225 | // 226 | if (gplus_on) { 227 | // fuer G+ wird die URL nicht encoded, da das zu einem Fehler fuehrt 228 | var gplus_uri = uri + options.services.gplus.referrer_track; 229 | 230 | // we use the Google+ "asynchronous" code, standard code is flaky if inserted into dom after load 231 | var gplus_code = '<div class="g-plusone" data-size="medium" data-href="' + gplus_uri + '"></div><script type="text/javascript">window.___gcfg = {lang: "' + options.services.gplus.language + '"}; (function() { var po = document.createElement("script"); po.type = "text/javascript"; po.async = true; po.src = "https://apis.google.com/js/plusone.js"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(po, s); })(); </script>'; 232 | var gplus_dummy_btn = '<img src="' + options.services.gplus.dummy_img + '" alt=""Google+1"-Dummy" class="gplus_one_dummy" />'; 233 | 234 | context.append('<li class="gplus help_info"><span class="info">' + options.services.gplus.txt_info + '</span><span class="switch off">' + options.services.gplus.txt_gplus_off + '</span><div class="gplusone dummy_btn">' + gplus_dummy_btn + '</div></li>'); 235 | 236 | var $container_gplus = $('li.gplus', context); 237 | 238 | $('li.gplus div.gplusone img,li.gplus span.switch', context).live('click', function () { 239 | if ($container_gplus.find('span.switch').hasClass('off')) { 240 | $container_gplus.addClass('info_off'); 241 | $container_gplus.find('span.switch').addClass('on').removeClass('off').html(options.services.gplus.txt_gplus_on); 242 | $container_gplus.find('img.gplus_one_dummy').replaceWith(gplus_code); 243 | } else { 244 | $container_gplus.removeClass('info_off'); 245 | $container_gplus.find('span.switch').addClass('off').removeClass('on').html(options.services.gplus.txt_gplus_off); 246 | $container_gplus.find('.gplusone').html(gplus_dummy_btn); 247 | } 248 | }); 249 | } 250 | 251 | // 252 | // Der Info/Settings-Bereich wird eingebunden 253 | // 254 | context.append('<li class="settings_info"><div class="settings_info_menu off perma_option_off"><a href="' + options.info_link + '"><span class="help_info icon"><span class="info">' + options.txt_help + '</span></span></a></div></li>'); 255 | 256 | // Info-Overlays mit leichter Verzoegerung einblenden 257 | $('.help_info:not(.info_off)', context).live('mouseenter', function () { 258 | var $info_wrapper = $(this); 259 | var timeout_id = window.setTimeout(function () { $($info_wrapper).addClass('display'); }, 500); 260 | $(this).data('timeout_id', timeout_id); 261 | }); 262 | $('.help_info', context).live('mouseleave', function () { 263 | var timeout_id = $(this).data('timeout_id'); 264 | window.clearTimeout(timeout_id); 265 | if ($(this).hasClass('display')) { 266 | $(this).removeClass('display'); 267 | } 268 | }); 269 | 270 | var facebook_perma = (options.services.facebook.perma_option === 'on'); 271 | var twitter_perma = (options.services.twitter.perma_option === 'on'); 272 | var gplus_perma = (options.services.gplus.perma_option === 'on'); 273 | 274 | // Menue zum dauerhaften Einblenden der aktiven Dienste via Cookie einbinden 275 | // Die IE7 wird hier ausgenommen, da er kein JSON kann und die Cookies hier ueber JSON-Struktur abgebildet werden 276 | if (((facebook_on && facebook_perma) 277 | || (twitter_on && twitter_perma) 278 | || (gplus_on && gplus_perma)) 279 | && (!$.browser.msie || ($.browser.msie && $.browser.version > 7.0))) { 280 | 281 | // Cookies abrufen 282 | var cookie_list = document.cookie.split(';'); 283 | var cookies = '{'; 284 | var i = 0; 285 | for (; i < cookie_list.length; i += 1) { 286 | var foo = cookie_list[i].split('='); 287 | cookies += '"' + $.trim(foo[0]) + '":"' + $.trim(foo[1]) + '"'; 288 | if (i < cookie_list.length - 1) { 289 | cookies += ','; 290 | } 291 | } 292 | cookies += '}'; 293 | cookies = JSON.parse(cookies); 294 | 295 | // Container definieren 296 | var $container_settings_info = $('li.settings_info', context); 297 | 298 | // Klasse entfernen, die das i-Icon alleine formatiert, da Perma-Optionen eingeblendet werden 299 | $container_settings_info.find('.settings_info_menu').removeClass('perma_option_off'); 300 | 301 | // Perma-Optionen-Icon (.settings) und Formular (noch versteckt) einbinden 302 | $container_settings_info.find('.settings_info_menu').append('<span class="settings">Einstellungen</span><form><fieldset><legend>' + options.settings_perma + '</legend></fieldset></form>'); 303 | 304 | 305 | // Die Dienste mit <input> und <label>, sowie checked-Status laut Cookie, schreiben 306 | var checked = ' checked="checked"'; 307 | if (facebook_on && facebook_perma) { 308 | var perma_status_facebook = cookies.socialSharePrivacy_facebook === 'perma_on' ? checked : ''; 309 | $container_settings_info.find('form fieldset').append( 310 | '<input type="checkbox" name="perma_status_facebook" id="perma_status_facebook"' 311 | + perma_status_facebook + ' /><label for="perma_status_facebook">' 312 | + options.services.facebook.display_name + '</label>' 313 | ); 314 | } 315 | 316 | if (twitter_on && twitter_perma) { 317 | var perma_status_twitter = cookies.socialSharePrivacy_twitter === 'perma_on' ? checked : ''; 318 | $container_settings_info.find('form fieldset').append( 319 | '<input type="checkbox" name="perma_status_twitter" id="perma_status_twitter"' 320 | + perma_status_twitter + ' /><label for="perma_status_twitter">' 321 | + options.services.twitter.display_name + '</label>' 322 | ); 323 | } 324 | 325 | if (gplus_on && gplus_perma) { 326 | var perma_status_gplus = cookies.socialSharePrivacy_gplus === 'perma_on' ? checked : ''; 327 | $container_settings_info.find('form fieldset').append( 328 | '<input type="checkbox" name="perma_status_gplus" id="perma_status_gplus"' 329 | + perma_status_gplus + ' /><label for="perma_status_gplus">' 330 | + options.services.gplus.display_name + '</label>' 331 | ); 332 | } 333 | 334 | // Cursor auf Pointer setzen fuer das Zahnrad 335 | $container_settings_info.find('span.settings').css('cursor', 'pointer'); 336 | 337 | // Einstellungs-Menue bei mouseover ein-/ausblenden 338 | $($container_settings_info.find('span.settings'), context).live('mouseenter', function () { 339 | var timeout_id = window.setTimeout(function () { $container_settings_info.find('.settings_info_menu').removeClass('off').addClass('on'); }, 500); 340 | $(this).data('timeout_id', timeout_id); 341 | }); 342 | $($container_settings_info, context).live('mouseleave', function () { 343 | var timeout_id = $(this).data('timeout_id'); 344 | window.clearTimeout(timeout_id); 345 | $container_settings_info.find('.settings_info_menu').removeClass('on').addClass('off'); 346 | }); 347 | 348 | // Klick-Interaktion auf <input> um Dienste dauerhaft ein- oder auszuschalten (Cookie wird gesetzt oder geloescht) 349 | $($container_settings_info.find('fieldset input')).live('click', function (event) { 350 | var click = event.target.id; 351 | var service = click.substr(click.lastIndexOf('_') + 1, click.length); 352 | var cookie_name = 'socialSharePrivacy_' + service; 353 | 354 | if ($('#' + event.target.id + ':checked').length) { 355 | cookieSet(cookie_name, 'perma_on', options.cookie_expires, options.cookie_path, options.cookie_domain); 356 | $('form fieldset label[for=' + click + ']', context).addClass('checked'); 357 | } else { 358 | cookieDel(cookie_name, 'perma_on', options.cookie_path, options.cookie_domain); 359 | $('form fieldset label[for=' + click + ']', context).removeClass('checked'); 360 | } 361 | }); 362 | 363 | // Dienste automatisch einbinden, wenn entsprechendes Cookie vorhanden ist 364 | if (facebook_on && facebook_perma && cookies.socialSharePrivacy_facebook === 'perma_on') { 365 | $('li.facebook span.switch', context).click(); 366 | } 367 | if (twitter_on && twitter_perma && cookies.socialSharePrivacy_twitter === 'perma_on') { 368 | $('li.twitter span.switch', context).click(); 369 | } 370 | if (gplus_on && gplus_perma && cookies.socialSharePrivacy_gplus === 'perma_on') { 371 | $('li.gplus span.switch', context).click(); 372 | } 373 | } 374 | }); // this.each(function () 375 | }; // $.fn.socialSharePrivacy = function (settings) { 376 | }(jQuery)); 377 | 378 | -------------------------------------------------------------------------------- /frontend/views/detail.html: -------------------------------------------------------------------------------- 1 | <!doctype html> 2 | <html> 3 | <head> 4 | <title>c3netmon 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 17 | 27 | 28 | 29 | 30 |
31 | 32 |
33 |

c3netmon

34 | 35 | Realtime 30C3 data served by nodejs + websockets
36 | Thanks to the NOC, POC and VOC for providing the data.
37 | Detailed graphs can be found here. 38 |
39 |
40 |
41 | 42 |
43 | 44 |
45 | Loading... 46 |
47 | 48 |
49 | 50 | 51 | 59 | 82 | 83 |
52 | 53 | 54 | 55 | 56 | 57 |

Data sent

0 GB

Data received

0 GB

58 |
60 | 61 |
62 |
Upstream usage (%):
63 |
64 | 71 |
Downstream usage (%):
72 |
73 | 80 |
81 |
84 |
85 | 86 |
87 | 88 | 89 |
90 |
91 | Info: Values in parentheses are peaks.
92 | Historical data in json format is available here. Current values for your own projects can be found here
93 |
94 | If you have any questions contact morpheus@morphhome.net. 95 |
96 | 97 |
98 | 99 | 100 | 101 | 108 | 109 | 110 | 111 | 112 | 113 | -------------------------------------------------------------------------------- /frontend/views/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | c3netmon 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 17 | 27 | 28 | 29 | 30 |
31 | 32 |
33 |

c3netmon

34 | 35 | Realtime 30c3 data served by nodejs + websockets
36 | Thanks to the NOC, POC and VOC for providing the data.
37 | Detailed graphs can be found here. 38 |
39 |
40 |
41 | 42 |
43 | 44 |
45 | Loading... 46 |
47 | 48 | 49 | 50 |
51 | 52 | 53 | 61 | 84 | 85 |
54 | 55 | 56 | 57 | 58 | 59 |

Data sent

0 GB

Data received

0 GB

60 |
62 | 63 |
64 |
Upstream usage (%):
65 |
66 | 73 |
Downstream usage (%):
74 |
75 | 82 |
83 |
86 |
87 | 88 |
89 | 90 | 91 | 92 |
93 |
94 | Info: Values in parentheses are peaks.
95 | Historical data in json format is available here. Current values for your own projects can be found here
96 |
97 | If you have any questions contact morpheus@morphhome.net. 98 |
99 | 100 |
101 | 102 | 103 | 104 | 110 | 111 | 112 | 113 | 114 | 115 | -------------------------------------------------------------------------------- /install.sh: -------------------------------------------------------------------------------- 1 | cd backend 2 | npm install memcache 3 | cd ../frontend 4 | npm install memcache 5 | npm install socket.io-client 6 | npm install socket.io 7 | npm install express 8 | mkdir public/misc 9 | cd public/misc 10 | wget http://code.jquery.com/jquery-1.7.1.min.js -O jquery-1.7.1.min.js 11 | wget https://github.com/mbostock/d3/zipball/v2.7.3 -O d3.zip 12 | unzip d3.zip 13 | mv mbostock-d3-b22dd72 d3 14 | rm d3.zip 15 | mkdir jquery-ui 16 | cd jquery-ui 17 | wget http://jqueryui.com/resources/download/jquery-ui-1.9.2.custom.zip -O jqueryui.zip 18 | unzip jqueryui.zip 19 | rm index.html 20 | rm jqueryui.zip 21 | cd .. 22 | git clone https://github.com/shutterstock/rickshaw.git 23 | -------------------------------------------------------------------------------- /release.sh: -------------------------------------------------------------------------------- 1 | cd backend 2 | rm -rf node_modules 3 | cd ../frontend 4 | rm -rf node_modules 5 | rm -rf public/misc/* 6 | rm public/history.json 7 | rm public/current.json 8 | -------------------------------------------------------------------------------- /screenshots/28c3-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xmorpheus/c3netmon-public/5155b011c96770b200e3bd08830efe5208cb2f67/screenshots/28c3-1.png -------------------------------------------------------------------------------- /screenshots/28c3-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xmorpheus/c3netmon-public/5155b011c96770b200e3bd08830efe5208cb2f67/screenshots/28c3-2.png -------------------------------------------------------------------------------- /screenshots/28c3-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xmorpheus/c3netmon-public/5155b011c96770b200e3bd08830efe5208cb2f67/screenshots/28c3-3.png -------------------------------------------------------------------------------- /screenshots/28c3-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xmorpheus/c3netmon-public/5155b011c96770b200e3bd08830efe5208cb2f67/screenshots/28c3-4.png -------------------------------------------------------------------------------- /screenshots/ohm2013.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xmorpheus/c3netmon-public/5155b011c96770b200e3bd08830efe5208cb2f67/screenshots/ohm2013.png --------------------------------------------------------------------------------