├── .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 = '