From 61475567ed87bfd15ba3c84c0b79b347fc2200d9 Mon Sep 17 00:00:00 2001 From: inrepublica Date: Sun, 15 May 2016 18:48:37 +0200 Subject: [PATCH] Script install/remove --- LICENSE | 674 + README.md | 2 +- manifest.json | 64 + scripts/backup | 0 scripts/install | 42 + scripts/remove | 8 + scripts/restore | 0 scripts/upgrade | 0 sources/.gitignore | 1 + sources/.htaccess | 11 + sources/.travis.yml | 19 + sources/CHANGELOG.md | 286 + sources/COPYING | 339 + sources/Dockerfile | 26 + sources/README.md | 121 + sources/README_PLUGIN.md | 134 + sources/composer.json | 18 + sources/data/ModelTranslation.txt | 143 + sources/data/distros.ini | 827 ++ sources/data/languages.ini | 1025 ++ sources/data/osnames.ini | 36 + sources/gfx/ajax-loader.gif | Bin 0 -> 404 bytes sources/gfx/ajaxLoader.gif | Bin 0 -> 4659 bytes sources/gfx/attention.gif | Bin 0 -> 1044 bytes sources/gfx/blank.gif | Bin 0 -> 49 bytes sources/gfx/body.gif | Bin 0 -> 551 bytes sources/gfx/bullet_toggle_minus.gif | Bin 0 -> 877 bytes sources/gfx/bullet_toggle_plus.gif | Bin 0 -> 879 bytes sources/gfx/close.gif | Bin 0 -> 70 bytes sources/gfx/down_black.gif | Bin 0 -> 65 bytes sources/gfx/down_gray.gif | Bin 0 -> 65 bytes sources/gfx/favicon.gif | Bin 0 -> 925 bytes sources/gfx/favicon.ico | Bin 0 -> 15086 bytes sources/gfx/html.gif | Bin 0 -> 94 bytes sources/gfx/htmlwarn.gif | Bin 0 -> 120 bytes sources/gfx/images/4MLinux.png | Bin 0 -> 3211 bytes sources/gfx/images/AIX.png | Bin 0 -> 4346 bytes sources/gfx/images/ALT.png | Bin 0 -> 4217 bytes sources/gfx/images/Alpine.png | Bin 0 -> 972 bytes sources/gfx/images/Amazon.png | Bin 0 -> 2193 bytes sources/gfx/images/Android.png | Bin 0 -> 4217 bytes sources/gfx/images/Apple.png | Bin 0 -> 380 bytes sources/gfx/images/Arch.png | Bin 0 -> 1182 bytes sources/gfx/images/BOSS.png | Bin 0 -> 3211 bytes sources/gfx/images/Calculate.png | Bin 0 -> 3211 bytes sources/gfx/images/Canaima.png | Bin 0 -> 2193 bytes sources/gfx/images/CentOS.png | Bin 0 -> 1212 bytes sources/gfx/images/Chakra.png | Bin 0 -> 2193 bytes sources/gfx/images/ClearOS.png | Bin 0 -> 4217 bytes sources/gfx/images/Cloud.png | Bin 0 -> 4196 bytes sources/gfx/images/Cobalt.png | Bin 0 -> 1943 bytes sources/gfx/images/CoreOS.png | Bin 0 -> 2193 bytes sources/gfx/images/Crux.png | Bin 0 -> 4217 bytes sources/gfx/images/Darwin.png | Bin 0 -> 851 bytes sources/gfx/images/Debian.png | Bin 0 -> 1276 bytes sources/gfx/images/Deepin.png | Bin 0 -> 3211 bytes sources/gfx/images/DragonFly.png | Bin 0 -> 1805 bytes sources/gfx/images/Eisfair.png | Bin 0 -> 3827 bytes sources/gfx/images/Fedora.png | Bin 0 -> 742 bytes sources/gfx/images/Foresight.png | Bin 0 -> 4196 bytes sources/gfx/images/FreeBSD.png | Bin 0 -> 2562 bytes sources/gfx/images/Frugalware.png | Bin 0 -> 3190 bytes sources/gfx/images/Fuduntu.png | Bin 0 -> 4196 bytes sources/gfx/images/Generations.png | Bin 0 -> 3193 bytes sources/gfx/images/Gentoo.png | Bin 0 -> 1890 bytes sources/gfx/images/Gobo.png | Bin 0 -> 2193 bytes sources/gfx/images/HPUX.png | Bin 0 -> 2411 bytes sources/gfx/images/Haiku.png | Bin 0 -> 4217 bytes sources/gfx/images/Handy.png | Bin 0 -> 1671 bytes sources/gfx/images/HipServ.png | Bin 0 -> 811 bytes sources/gfx/images/IPFire.png | Bin 0 -> 2763 bytes sources/gfx/images/KaOS.png | Bin 0 -> 2257 bytes sources/gfx/images/Korora.png | Bin 0 -> 2193 bytes sources/gfx/images/LFS.png | Bin 0 -> 2193 bytes sources/gfx/images/Linaro.png | Bin 0 -> 4217 bytes sources/gfx/images/Lunar.png | Bin 0 -> 3211 bytes sources/gfx/images/Mageia.png | Bin 0 -> 3065 bytes sources/gfx/images/Mandrake.png | Bin 0 -> 451 bytes sources/gfx/images/Manjaro.png | Bin 0 -> 4196 bytes sources/gfx/images/Mer.png | Bin 0 -> 1458 bytes sources/gfx/images/Minix.png | Bin 0 -> 3701 bytes sources/gfx/images/Mint.png | Bin 0 -> 1268 bytes sources/gfx/images/NetBSD.png | Bin 0 -> 2723 bytes sources/gfx/images/Netrunner.png | Bin 0 -> 4217 bytes sources/gfx/images/NixOS.png | Bin 0 -> 3211 bytes sources/gfx/images/OpenBSD.png | Bin 0 -> 1876 bytes sources/gfx/images/OpenMamba.png | Bin 0 -> 4217 bytes sources/gfx/images/OpenMandriva.png | Bin 0 -> 2193 bytes sources/gfx/images/Oracle.png | Bin 0 -> 2066 bytes sources/gfx/images/PCLinuxOS.png | Bin 0 -> 3959 bytes sources/gfx/images/PLD.png | Bin 0 -> 952 bytes sources/gfx/images/Parsix.png | Bin 0 -> 2193 bytes sources/gfx/images/Pear.png | Bin 0 -> 2193 bytes sources/gfx/images/Peppermint.png | Bin 0 -> 4217 bytes sources/gfx/images/Pisi.png | Bin 0 -> 2193 bytes sources/gfx/images/Porteus.png | Bin 0 -> 4217 bytes sources/gfx/images/Puppy.png | Bin 0 -> 4196 bytes sources/gfx/images/QNX.png | Bin 0 -> 4217 bytes sources/gfx/images/QTS.png | Bin 0 -> 1769 bytes sources/gfx/images/Qubes.png | Bin 0 -> 979 bytes sources/gfx/images/ROSA.png | Bin 0 -> 4217 bytes sources/gfx/images/Raspbian.png | Bin 0 -> 1911 bytes sources/gfx/images/ReactOS.png | Bin 0 -> 3019 bytes sources/gfx/images/RedFlag.png | Bin 0 -> 2193 bytes sources/gfx/images/RedHat.png | Bin 0 -> 469 bytes sources/gfx/images/Rubix.png | Bin 0 -> 1403 bytes sources/gfx/images/SMEServer.png | Bin 0 -> 3211 bytes sources/gfx/images/SMS.png | Bin 0 -> 2193 bytes sources/gfx/images/SUSE.png | Bin 0 -> 2574 bytes sources/gfx/images/Sabayon.png | Bin 0 -> 3211 bytes sources/gfx/images/Salix.png | Bin 0 -> 2193 bytes sources/gfx/images/Scientific.png | Bin 0 -> 3925 bytes sources/gfx/images/Semplice.png | Bin 0 -> 1925 bytes sources/gfx/images/Slackware.png | Bin 0 -> 2551 bytes sources/gfx/images/Slax.png | Bin 0 -> 4217 bytes sources/gfx/images/SliTaz.png | Bin 0 -> 2193 bytes sources/gfx/images/Solus.png | Bin 0 -> 892 bytes sources/gfx/images/SolusOS.png | Bin 0 -> 4217 bytes sources/gfx/images/SolydXK.png | Bin 0 -> 2193 bytes sources/gfx/images/StartOS.png | Bin 0 -> 1510 bytes sources/gfx/images/SteamOS.png | Bin 0 -> 2225 bytes sources/gfx/images/SunOS.png | Bin 0 -> 2754 bytes sources/gfx/images/Synology.png | Bin 0 -> 4196 bytes sources/gfx/images/Tails.png | Bin 0 -> 2193 bytes sources/gfx/images/Tanglu.png | Bin 0 -> 2193 bytes sources/gfx/images/TinyCore.png | Bin 0 -> 3943 bytes sources/gfx/images/Tizen.png | Bin 0 -> 1933 bytes sources/gfx/images/Trisquel.png | Bin 0 -> 4217 bytes sources/gfx/images/Trustix.png | Bin 0 -> 2155 bytes sources/gfx/images/Turbo.png | Bin 0 -> 4217 bytes sources/gfx/images/Ubuntu.png | Bin 0 -> 1164 bytes sources/gfx/images/UltimateEdition.png | Bin 0 -> 2193 bytes sources/gfx/images/Vector.png | Bin 0 -> 3599 bytes sources/gfx/images/VortexBox.png | Bin 0 -> 3193 bytes sources/gfx/images/Win2000.png | Bin 0 -> 4196 bytes sources/gfx/images/Win8.png | Bin 0 -> 810 bytes sources/gfx/images/WinVista.png | Bin 0 -> 2691 bytes sources/gfx/images/WinXP.png | Bin 0 -> 2512 bytes sources/gfx/images/Zenwalk.png | Bin 0 -> 3211 bytes sources/gfx/images/Zorin.png | Bin 0 -> 4217 bytes sources/gfx/images/antiX.png | Bin 0 -> 4857 bytes sources/gfx/images/elementaryOS.png | Bin 0 -> 987 bytes sources/gfx/images/free-eos.png | Bin 0 -> 1676 bytes sources/gfx/images/gNewSense.png | Bin 0 -> 6137 bytes sources/gfx/images/iycc.png | Bin 0 -> 1636 bytes sources/gfx/images/openSUSE.png | Bin 0 -> 908 bytes sources/gfx/images/pfSense.png | Bin 0 -> 1169 bytes sources/gfx/images/unknown.png | Bin 0 -> 31826 bytes sources/gfx/logo_32.gif | Bin 0 -> 1285 bytes sources/gfx/next.gif | Bin 0 -> 893 bytes sources/gfx/prev.gif | Bin 0 -> 893 bytes sources/gfx/reload.gif | Bin 0 -> 935 bytes sources/gfx/right_black.gif | Bin 0 -> 65 bytes sources/gfx/right_gray.gif | Bin 0 -> 65 bytes sources/gfx/sort_asc.gif | Bin 0 -> 131 bytes sources/gfx/sort_both.gif | Bin 0 -> 150 bytes sources/gfx/sort_desc.gif | Bin 0 -> 129 bytes sources/gfx/treeTable/blank.gif | Bin 0 -> 55 bytes sources/gfx/treeTable/tv-collapsable-last.gif | Bin 0 -> 129 bytes sources/gfx/treeTable/tv-collapsable.gif | Bin 0 -> 90 bytes sources/gfx/treeTable/tv-expandable-last.gif | Bin 0 -> 131 bytes sources/gfx/treeTable/tv-expandable.gif | Bin 0 -> 133 bytes sources/gfx/treeTable/tv-item-last.gif | Bin 0 -> 66 bytes sources/gfx/treeTable/tv-item.gif | Bin 0 -> 70 bytes sources/gfx/treeTable/vertline.gif | Bin 0 -> 68 bytes sources/includes/autoloader.inc.php | 73 + .../includes/class.CommonFunctions.inc.php | 563 + sources/includes/class.Parser.inc.php | 271 + .../includes/error/class.PSI_Error.inc.php | 290 + .../interface/class.PSI_Interface_OS.inc.php | 50 + .../class.PSI_Interface_Output.inc.php | 35 + .../class.PSI_Interface_Plugin.inc.php | 43 + .../class.PSI_Interface_Sensor.inc.php | 43 + .../interface/class.PSI_Interface_UPS.inc.php | 42 + sources/includes/js/README | 10 + .../js/class.JavaScriptPacker.inc.php | 788 ++ sources/includes/mb/class.coretemp.inc.php | 102 + sources/includes/mb/class.freeipmi.inc.php | 177 + sources/includes/mb/class.hddtemp.inc.php | 135 + sources/includes/mb/class.healthd.inc.php | 159 + sources/includes/mb/class.hwmon.inc.php | 256 + sources/includes/mb/class.hwsensors.inc.php | 156 + sources/includes/mb/class.ipmi.inc.php | 197 + sources/includes/mb/class.ipmiutil.inc.php | 220 + sources/includes/mb/class.k8temp.inc.php | 91 + sources/includes/mb/class.lmsensors.inc.php | 411 + sources/includes/mb/class.mbm5.inc.php | 131 + sources/includes/mb/class.mbmon.inc.php | 143 + sources/includes/mb/class.ohm.inc.php | 145 + sources/includes/mb/class.pitemp.inc.php | 62 + sources/includes/mb/class.qtssnmp.inc.php | 93 + sources/includes/mb/class.sensors.inc.php | 64 + sources/includes/mb/class.speedfan.inc.php | 138 + sources/includes/mb/class.thermalzone.inc.php | 151 + sources/includes/os/class.AIX.inc.php | 352 + sources/includes/os/class.Android.inc.php | 253 + sources/includes/os/class.BSDCommon.inc.php | 580 + sources/includes/os/class.Darwin.inc.php | 475 + sources/includes/os/class.DragonFly.inc.php | 153 + sources/includes/os/class.FreeBSD.inc.php | 201 + sources/includes/os/class.HPUX.inc.php | 377 + sources/includes/os/class.Haiku.inc.php | 384 + sources/includes/os/class.Linux.inc.php | 1281 ++ sources/includes/os/class.Minix.inc.php | 350 + sources/includes/os/class.NetBSD.inc.php | 185 + sources/includes/os/class.OS.inc.php | 149 + sources/includes/os/class.OpenBSD.inc.php | 222 + sources/includes/os/class.QNX.inc.php | 237 + sources/includes/os/class.SunOS.inc.php | 334 + sources/includes/os/class.WINNT.inc.php | 632 + sources/includes/output/class.Output.inc.php | 58 + .../includes/output/class.Template.inc.php | 93 + sources/includes/output/class.Webpage.inc.php | 190 + .../includes/output/class.WebpageXML.inc.php | 177 + .../includes/output/class.WebpageXSLT.inc.php | 54 + .../includes/plugin/class.PSI_Plugin.inc.php | 134 + sources/includes/to/class.MBInfo.inc.php | 201 + sources/includes/to/class.System.inc.php | 1167 ++ sources/includes/to/class.UPSInfo.inc.php | 62 + .../to/device/class.CpuDevice.inc.php | 357 + .../to/device/class.DiskDevice.inc.php | 308 + .../includes/to/device/class.HWDevice.inc.php | 142 + .../to/device/class.NetDevice.inc.php | 225 + .../to/device/class.SensorDevice.inc.php | 192 + .../to/device/class.UPSDevice.inc.php | 555 + sources/includes/ups/class.apcupsd.inc.php | 145 + sources/includes/ups/class.nut.inc.php | 142 + sources/includes/ups/class.pmset.inc.php | 90 + .../includes/ups/class.powersoftplus.inc.php | 115 + sources/includes/ups/class.snmpups.inc.php | 286 + sources/includes/ups/class.ups.inc.php | 64 + .../xml/class.SimpleXMLExtended.inc.php | 212 + sources/includes/xml/class.XML.inc.php | 732 + sources/index.php | 96 + sources/js.php | 85 + sources/js/jQuery/README | 65 + sources/js/jQuery/README_bootstrap | 32 + sources/js/jQuery/jquery-1.js | 11027 ++++++++++++++++ sources/js/jQuery/jquery.dataTables.js | 7440 +++++++++++ sources/js/jQuery/jquery.ifixpng.js | 143 + sources/js/jQuery/jquery.jgrowl.js | 338 + sources/js/jQuery/jquery.js | 9831 ++++++++++++++ sources/js/jQuery/jquery.nyroModal.js | 1707 +++ sources/js/jQuery/jquery.timers.js | 75 + sources/js/jQuery/jquery.treeTable.js | 132 + sources/js/jQuery/jquery.treegrid.js | 626 + sources/js/phpSysInfo/phpsysinfo.js | 1664 +++ sources/js/phpSysInfo/phpsysinfo_bootstrap.js | 1515 +++ sources/js/vendor/README | 44 + sources/js/vendor/bootstrap.min.js | 7 + sources/js/vendor/console-shim.js | 32 + sources/js/vendor/html5shiv-printshiv.js | 520 + sources/js/vendor/respond.js | 359 + sources/js/vendor/sorttable.js | 466 + sources/js/vendor/transparency.js | 784 ++ sources/language/ast.xml | 369 + sources/language/bg.xml | 369 + sources/language/ca.xml | 369 + sources/language/cz.xml | 369 + sources/language/da.xml | 369 + sources/language/de.xml | 369 + sources/language/en.xml | 369 + sources/language/es.xml | 369 + sources/language/et.xml | 369 + sources/language/fi.xml | 369 + sources/language/fr.xml | 369 + sources/language/gl.xml | 369 + sources/language/gr.xml | 369 + sources/language/he.xml | 369 + sources/language/hu.xml | 369 + sources/language/is.xml | 369 + sources/language/it.xml | 369 + sources/language/ja.xml | 369 + sources/language/ko.xml | 369 + sources/language/language.php | 69 + sources/language/nl.xml | 369 + sources/language/no.xml | 369 + sources/language/pl.xml | 369 + sources/language/pt-br.xml | 369 + sources/language/pt-pt.xml | 369 + sources/language/ro.xml | 369 + sources/language/ru.xml | 369 + sources/language/sk.xml | 369 + sources/language/sl.xml | 369 + sources/language/sv.xml | 369 + sources/language/th.xml | 369 + sources/language/tr.xml | 369 + sources/language/translation-plugin.xsd | 34 + sources/language/translation.xsd | 35 + sources/language/tw.xml | 369 + sources/language/uk.xml | 369 + sources/language/zh.xml | 369 + sources/phpsysinfo.ini.new | 641 + sources/phpsysinfo.xslt | 1206 ++ sources/phpsysinfo3.xsd | 464 + sources/plugins/bat/bat_bootstrap.html | 70 + sources/plugins/bat/class.bat.inc.php | 579 + sources/plugins/bat/js/bat.js | 179 + sources/plugins/bat/js/bat_bootstrap.js | 89 + sources/plugins/bat/lang/cz.xml | 51 + sources/plugins/bat/lang/de.xml | 51 + sources/plugins/bat/lang/en.xml | 51 + sources/plugins/bat/lang/fr.xml | 51 + sources/plugins/bat/lang/pl.xml | 51 + sources/plugins/bat/lang/ro.xml | 51 + sources/plugins/bat/lang/ru.xml | 51 + sources/plugins/dmraid/class.dmraid.inc.php | 176 + sources/plugins/dmraid/css/dmraid.css | 14 + sources/plugins/dmraid/dmraid_bootstrap.html | 13 + sources/plugins/dmraid/gfx/error.png | Bin 0 -> 3617 bytes sources/plugins/dmraid/gfx/harddrivefail.png | Bin 0 -> 3920 bytes sources/plugins/dmraid/gfx/harddriveok.png | Bin 0 -> 3675 bytes sources/plugins/dmraid/gfx/harddrivespare.png | Bin 0 -> 1749 bytes sources/plugins/dmraid/gfx/harddrivewarn.png | Bin 0 -> 3602 bytes sources/plugins/dmraid/js/dmraid.js | 180 + sources/plugins/dmraid/js/dmraid_bootstrap.js | 94 + sources/plugins/dmraid/lang/en.xml | 42 + sources/plugins/dmraid/lang/fr.xml | 41 + sources/plugins/dmraid/lang/ro.xml | 42 + sources/plugins/dmraid/lang/ru.xml | 41 + .../plugins/ipmiinfo/class.ipmiinfo.inc.php | 269 + .../plugins/ipmiinfo/ipmiinfo_bootstrap.html | 17 + sources/plugins/ipmiinfo/js/ipmiinfo.js | 154 + .../plugins/ipmiinfo/js/ipmiinfo_bootstrap.js | 36 + sources/plugins/ipmiinfo/lang/cz.xml | 33 + sources/plugins/ipmiinfo/lang/de.xml | 33 + sources/plugins/ipmiinfo/lang/en.xml | 33 + sources/plugins/ipmiinfo/lang/fr.xml | 33 + sources/plugins/ipmiinfo/lang/pl.xml | 33 + sources/plugins/ipmiinfo/lang/ro.xml | 33 + sources/plugins/ipmiinfo/lang/ru.xml | 33 + .../plugins/mdstatus/class.mdstatus.inc.php | 236 + sources/plugins/mdstatus/css/mdstatus.css | 14 + sources/plugins/mdstatus/gfx/error.png | Bin 0 -> 3617 bytes .../plugins/mdstatus/gfx/harddrivefail.png | Bin 0 -> 3920 bytes sources/plugins/mdstatus/gfx/harddriveok.png | Bin 0 -> 3675 bytes .../plugins/mdstatus/gfx/harddrivespare.png | Bin 0 -> 1749 bytes sources/plugins/mdstatus/js/mdstatus.js | 228 + .../plugins/mdstatus/js/mdstatus_bootstrap.js | 146 + sources/plugins/mdstatus/lang/cz.xml | 57 + sources/plugins/mdstatus/lang/de.xml | 57 + sources/plugins/mdstatus/lang/en.xml | 57 + sources/plugins/mdstatus/lang/fr.xml | 57 + sources/plugins/mdstatus/lang/gr.xml | 57 + sources/plugins/mdstatus/lang/ro.xml | 57 + sources/plugins/mdstatus/lang/ru.xml | 57 + .../plugins/mdstatus/mdstatus_bootstrap.html | 13 + sources/plugins/ps/class.ps.inc.php | 255 + sources/plugins/ps/js/ps.js | 121 + sources/plugins/ps/js/ps_bootstrap.js | 60 + sources/plugins/ps/lang/cz.xml | 27 + sources/plugins/ps/lang/de.xml | 27 + sources/plugins/ps/lang/en.xml | 27 + sources/plugins/ps/lang/fr.xml | 27 + sources/plugins/ps/lang/gr.xml | 27 + sources/plugins/ps/lang/pl.xml | 27 + sources/plugins/ps/lang/ro.xml | 27 + sources/plugins/ps/lang/ru.xml | 27 + sources/plugins/ps/ps_bootstrap.html | 21 + .../plugins/psstatus/class.psstatus.inc.php | 179 + sources/plugins/psstatus/css/psstatus.css | 6 + sources/plugins/psstatus/gfx/offline.gif | Bin 0 -> 992 bytes sources/plugins/psstatus/gfx/online.gif | Bin 0 -> 988 bytes sources/plugins/psstatus/js/psstatus.js | 125 + .../plugins/psstatus/js/psstatus_bootstrap.js | 27 + sources/plugins/psstatus/lang/cz.xml | 21 + sources/plugins/psstatus/lang/de.xml | 21 + sources/plugins/psstatus/lang/en.xml | 21 + sources/plugins/psstatus/lang/fr.xml | 21 + sources/plugins/psstatus/lang/gr.xml | 21 + sources/plugins/psstatus/lang/pl.xml | 21 + sources/plugins/psstatus/lang/ro.xml | 21 + sources/plugins/psstatus/lang/ru.xml | 21 + .../plugins/psstatus/psstatus_bootstrap.html | 23 + sources/plugins/quotas/class.quotas.inc.php | 132 + sources/plugins/quotas/css/quotas.css | 7 + sources/plugins/quotas/js/quotas.js | 147 + sources/plugins/quotas/js/quotas_bootstrap.js | 50 + sources/plugins/quotas/lang/cz.xml | 42 + sources/plugins/quotas/lang/de.xml | 42 + sources/plugins/quotas/lang/en.xml | 42 + sources/plugins/quotas/lang/fr.xml | 42 + sources/plugins/quotas/lang/pl.xml | 42 + sources/plugins/quotas/lang/ro.xml | 42 + sources/plugins/quotas/lang/ru.xml | 42 + sources/plugins/quotas/quotas_bootstrap.html | 37 + sources/plugins/smart/class.smart.inc.php | 302 + sources/plugins/smart/css/smart.css | 6 + sources/plugins/smart/js/smart.js | 147 + sources/plugins/smart/js/smart_bootstrap.js | 84 + sources/plugins/smart/lang/cz.xml | 97 + sources/plugins/smart/lang/en.xml | 97 + sources/plugins/smart/lang/fr.xml | 97 + sources/plugins/smart/lang/gr.xml | 97 + sources/plugins/smart/lang/pl.xml | 97 + sources/plugins/smart/lang/ro.xml | 97 + sources/plugins/smart/lang/ru.xml | 42 + sources/plugins/smart/smart_bootstrap.html | 11 + .../plugins/snmppinfo/class.snmppinfo.inc.php | 233 + sources/plugins/snmppinfo/js/snmppinfo.js | 140 + .../snmppinfo/js/snmppinfo_bootstrap.js | 99 + sources/plugins/snmppinfo/lang/cz.xml | 30 + sources/plugins/snmppinfo/lang/de.xml | 30 + sources/plugins/snmppinfo/lang/en.xml | 30 + sources/plugins/snmppinfo/lang/fr.xml | 29 + sources/plugins/snmppinfo/lang/pl.xml | 30 + sources/plugins/snmppinfo/lang/ro.xml | 30 + sources/plugins/snmppinfo/lang/ru.xml | 30 + .../snmppinfo/snmppinfo_bootstrap.html | 20 + .../class.updatenotifier.inc.php | 109 + .../updatenotifier/js/updatenotifier.js | 113 + .../js/updatenotifier_bootstrap.js | 25 + sources/plugins/updatenotifier/lang/cz.xml | 30 + sources/plugins/updatenotifier/lang/de.xml | 30 + sources/plugins/updatenotifier/lang/en.xml | 30 + sources/plugins/updatenotifier/lang/fr.xml | 30 + sources/plugins/updatenotifier/lang/pl.xml | 30 + sources/plugins/updatenotifier/lang/ro.xml | 30 + sources/plugins/updatenotifier/lang/ru.xml | 30 + .../updatenotifier_bootstrap.html | 14 + .../plugins/uprecords/class.uprecords.inc.php | 124 + sources/plugins/uprecords/js/uprecords.js | 113 + .../uprecords/js/uprecords_bootstrap.js | 25 + sources/plugins/uprecords/lang/en.xml | 27 + sources/plugins/uprecords/lang/fr.xml | 26 + sources/plugins/uprecords/lang/hu.xml | 27 + sources/plugins/uprecords/lang/pl.xml | 27 + sources/plugins/uprecords/lang/ro.xml | 27 + sources/plugins/uprecords/lang/ru.xml | 27 + .../uprecords/uprecords_bootstrap.html | 27 + sources/read_config.php | 272 + .../sample/distrotest/4MLinux/10.0-server.txt | 2 + sources/sample/distrotest/ALT/6.0.0.txt | 14 + .../sample/distrotest/ALT/7.0.0-Simply.txt | 18 + sources/sample/distrotest/ALT/7.0.1.txt | 18 + sources/sample/distrotest/Alpine/2.6.4.txt | 2 + sources/sample/distrotest/Amazon/2013.09.txt | 8 + .../sample/distrotest/Arch/2011.08.19-ISO.txt | 2 + sources/sample/distrotest/Arch/2013.11.01.txt | 10 + sources/sample/distrotest/Arch/2014.01.05.txt | 22 + sources/sample/distrotest/BOSS/1.0-server.txt | 10 + sources/sample/distrotest/BOSS/5.0.txt | 19 + sources/sample/distrotest/Calculate/13.11.txt | 10 + sources/sample/distrotest/Canaima/4.1.txt | 19 + sources/sample/distrotest/CentOS/5.6.txt | 8 + sources/sample/distrotest/CentOS/6.5-SF.txt | 6 + sources/sample/distrotest/CentOS/6.5.txt | 14 + sources/sample/distrotest/CentOS/7.1.1503.txt | 23 + sources/sample/distrotest/Chakra/2013.02.txt | 21 + .../sample/distrotest/ClearOS/6.4.0-Beta.txt | 6 + sources/sample/distrotest/Cloud/5.10.txt | 10 + sources/sample/distrotest/Cloud/6.4.txt | 12 + sources/sample/distrotest/CoreOS/367.1.0.txt | 15 + sources/sample/distrotest/Crux/2.8.txt | 2 + sources/sample/distrotest/Debian/5.0.3.txt | 2 + sources/sample/distrotest/Debian/6.0.6.txt | 7 + .../Debian/8-20140106-netinstall.txt | 6 + .../sample/distrotest/Debian/8-20140106.txt | 15 + sources/sample/distrotest/Deepin/2013.txt | 22 + sources/sample/distrotest/Eisfair/1-2.6.5.txt | 10 + sources/sample/distrotest/Eisfair/2-1.8.1.txt | 4 + sources/sample/distrotest/Fedora/20-lsb.txt | 26 + sources/sample/distrotest/Fedora/20.txt | 20 + sources/sample/distrotest/Fedora/4.txt | 12 + sources/sample/distrotest/Foresight/2.5.3.txt | 2 + sources/sample/distrotest/Frugalware/1.9.txt | 9 + sources/sample/distrotest/Fuduntu/2013.2.txt | 19 + sources/sample/distrotest/Generations/3.1.txt | 22 + sources/sample/distrotest/Gentoo/2.2-NAME.txt | 18 + sources/sample/distrotest/Gentoo/2.2.txt | 18 + sources/sample/distrotest/Gobo/015.beta2.txt | 2 + sources/sample/distrotest/Handy/2.0.txt | 19 + sources/sample/distrotest/HipServ/2.6.txt | 2 + sources/sample/distrotest/IPFire/2.13.txt | 2 + sources/sample/distrotest/KaOS/2014.0301.txt | 21 + sources/sample/distrotest/Korora/20.txt | 21 + sources/sample/distrotest/Linaro/13.12.txt | 22 + sources/sample/distrotest/Lunar/1.7.0-rc2.txt | 13 + sources/sample/distrotest/Mageia/4.txt | 36 + sources/sample/distrotest/Mandrake/2011.0.txt | 24 + sources/sample/distrotest/Mandrake/9.2.txt | 16 + sources/sample/distrotest/Manjaro/0.8.8.txt | 21 + sources/sample/distrotest/Mer/0.2011.txt | 18 + sources/sample/distrotest/Mint/13.txt | 12 + sources/sample/distrotest/Mint/14.txt | 19 + sources/sample/distrotest/Mint/15.txt | 22 + .../sample/distrotest/Netrunner/13.06-SE.txt | 22 + sources/sample/distrotest/Netrunner/13.06.txt | 22 + .../sample/distrotest/Netrunner/2014.04.txt | 22 + sources/sample/distrotest/NixOS/13.10.txt | 7 + sources/sample/distrotest/OpenMamba/3.0.1.txt | 31 + .../distrotest/OpenMandriva/2013.0-RC1.txt | 41 + sources/sample/distrotest/Oracle/5.10-el.txt | 12 + sources/sample/distrotest/Oracle/6.3.txt | 12 + .../sample/distrotest/PCLinuxOS/2012.06.txt | 26 + sources/sample/distrotest/PLD/2.99.txt | 2 + sources/sample/distrotest/PLD/3.0.txt | 11 + sources/sample/distrotest/Parsix/5.0.txt | 19 + sources/sample/distrotest/Parsix/6.0.txt | 19 + sources/sample/distrotest/Pear/5.00.txt | 12 + sources/sample/distrotest/Pear/6.1-LTS.txt | 20 + sources/sample/distrotest/Pear/6.1.txt | 19 + sources/sample/distrotest/Pear/7.0.txt | 20 + sources/sample/distrotest/Peppermint/3.txt | 12 + .../distrotest/Peppermint/4-20131113.txt | 22 + sources/sample/distrotest/Pisi/1.0.txt | 15 + sources/sample/distrotest/Porteus/2.1.txt | 15 + sources/sample/distrotest/Puppy/431.txt | 11 + sources/sample/distrotest/Puppy/5.3-wary.txt | 23 + .../sample/distrotest/Puppy/5.3.3-slacko.txt | 22 + sources/sample/distrotest/Puppy/528-lucid.txt | 22 + sources/sample/distrotest/QTS/3.1.2.txt | 284 + sources/sample/distrotest/Qubes/3.0.txt | 16 + .../distrotest/ROSA/2012.0.0-11-LTS.txt | 34 + .../sample/distrotest/ROSA/2012.0.0-6-LTS.txt | 25 + .../sample/distrotest/ROSA/2012.1.0-20.txt | 34 + sources/sample/distrotest/ROSA/6.5-Server.txt | 14 + sources/sample/distrotest/Raspbian/7.txt | 13 + sources/sample/distrotest/Raspbian/8.0.txt | 17 + sources/sample/distrotest/RedFlag/8.0.txt | 23 + sources/sample/distrotest/RedHat/6.0.txt | 10 + sources/sample/distrotest/RedHat/7.0-Beta.txt | 17 + .../sample/distrotest/SMEServer/8.1beta3.txt | 11 + .../sample/distrotest/SMEServer/9.0beta3.txt | 8 + sources/sample/distrotest/SMS/2.0.5.txt | 15 + sources/sample/distrotest/Sabayon/14.01.txt | 22 + sources/sample/distrotest/Salix/14.0.txt | 15 + .../sample/distrotest/Scientific/6.3-lsb.txt | 10 + sources/sample/distrotest/Scientific/6.3.txt | 4 + sources/sample/distrotest/Scientific/6.4.txt | 12 + sources/sample/distrotest/Semplice/6.txt | 22 + sources/sample/distrotest/Slackware/14.0.txt | 13 + sources/sample/distrotest/Slax/7.0.1.txt | 15 + .../distrotest/SliTaz/2014.02.16-cooking.txt | 2 + sources/sample/distrotest/Solus/1.0-rc1.txt | 26 + sources/sample/distrotest/SolusOS/1.3.txt | 12 + .../sample/distrotest/SolusOS/2-alpha7.txt | 24 + .../sample/distrotest/SolydXK/2014.01-K.txt | 33 + .../sample/distrotest/SolydXK/2014.01-X.txt | 25 + sources/sample/distrotest/StartOS/5.0.txt | 4 + sources/sample/distrotest/StartOS/6.0.txt | 4 + .../sample/distrotest/SteamOS/1.0-beta.txt | 23 + .../sample/distrotest/Synology/4.1-2668.txt | 264 + sources/sample/distrotest/Tails/0.22.1.txt | 5 + .../sample/distrotest/Tanglu/2.0-beta2.txt | 20 + .../sample/distrotest/TinyCore/5.0.alpha4.txt | 2 + .../distrotest/Tizen/2.2.0-Magnolia.txt | 10 + .../sample/distrotest/Tizen/2.2.0-Tizen.txt | 10 + sources/sample/distrotest/Trisquel/6.0.txt | 19 + sources/sample/distrotest/Turbo/12.5.txt | 2 + sources/sample/distrotest/Ubuntu/10.04.txt | 7 + sources/sample/distrotest/Ubuntu/12.04.txt | 19 + sources/sample/distrotest/Ubuntu/13.10.txt | 22 + .../sample/distrotest/UltimateEdition/3.9.txt | 19 + sources/sample/distrotest/Vector/647.0.txt | 4 + sources/sample/distrotest/VortexBox/2.2.txt | 8 + .../sample/distrotest/VortexBox/2.3-beta.txt | 22 + sources/sample/distrotest/Zenwalk/7.4.txt | 11 + sources/sample/distrotest/Zorin/6.txt | 19 + sources/sample/distrotest/Zorin/7.txt | 22 + sources/sample/distrotest/Zorin/8.txt | 22 + .../sample/distrotest/antiX/2012.07.06.txt | 9 + .../sample/distrotest/elementaryOS/0.2.txt | 19 + sources/sample/distrotest/gNewSense/3.0.txt | 12 + sources/sample/distrotest/openSUSE/11.3.txt | 9 + sources/sample/distrotest/openSUSE/13.1.txt | 18 + sources/sample/logs/log_android21.txt | 270 + sources/sample/logs/log_android412.txt | 443 + sources/sample/logs/log_bluestacks.txt | 202 + sources/sample/logs/log_debian7.txt | 153 + sources/sample/logs/log_sf.txt | 697 + sources/sample/main/1-cpuinfo.txt | 21 + sources/sample/main/1-dfiP.txt | 6 + sources/sample/main/1-dfkP.txt | 6 + sources/sample/main/1-mount.txt | 10 + sources/sample/main/README | 6 + sources/sample/main/cpuinfo1.txt | 21 + sources/sample/main/cpuinfo2.txt | 12 + sources/sample/main/cpuinfo3.txt | 17 + sources/sample/main/cpuinfo4.txt | 14 + sources/sample/main/cpuinfo5.txt | 12 + sources/sample/main/cpuinfo6.txt | 12 + sources/sample/main/cpuinfo7.txt | 24 + sources/sample/main/cpuinfo8.txt | 17 + sources/sample/main/cpuinfo9.txt | 10 + sources/sample/main/dev1.txt | 6 + sources/sample/main/df1.txt | 24 + sources/sample/main/mount1.txt | 23 + sources/sample/main/pmset1.txt | 2 + sources/sample/main/pmset2.txt | 2 + sources/sample/main/pmset3.txt | 2 + sources/sample/main/pmset4.txt | 2 + sources/sample/main/swaps1.txt | 2 + sources/sample/main/vm_stat1.txt | 12 + sources/sample/main/vm_stat2.txt | 13 + sources/sample/main/vm_stat3.txt | 23 + .../motherboard/hwsensors/hwsensors1.txt | 13 + .../motherboard/hwsensors/hwsensors2.txt | 13 + .../motherboard/hwsensors/hwsensors3.txt | 15 + .../motherboard/hwsensors/hwsensors4.txt | 17 + .../motherboard/hwsensors/hwsensors5.txt | 33 + .../ipmi-sensors/ipmi-sensors1.txt | 30 + .../sample/motherboard/ipmitool/ipmitool1.txt | 64 + .../sample/motherboard/ipmiutil/ipmiutil1.txt | 217 + .../motherboard/lmsensors/lmsensors1.txt | 13 + .../motherboard/lmsensors/lmsensors10.txt | 15 + .../motherboard/lmsensors/lmsensors2.txt | 20 + .../motherboard/lmsensors/lmsensors3.txt | 15 + .../motherboard/lmsensors/lmsensors4.txt | 18 + .../motherboard/lmsensors/lmsensors5.txt | 30 + .../motherboard/lmsensors/lmsensors6.txt | 29 + .../motherboard/lmsensors/lmsensors7.txt | 24 + .../motherboard/lmsensors/lmsensors8.txt | 24 + .../motherboard/lmsensors/lmsensors9.txt | 14 + sources/sample/motherboard/mbm5/MBM51.csv | 11 + sources/sample/plugin_bat/README | 4 + sources/sample/plugin_bat/ac_state1.txt | 1 + sources/sample/plugin_bat/battery_info1.txt | 13 + sources/sample/plugin_bat/battery_state1.txt | 6 + sources/sample/plugin_bat/log_LenovoT530.txt | 31 + sources/sample/plugin_bat/log_android233.txt | 37 + sources/sample/plugin_bat/log_android412.txt | 20 + sources/sample/plugin_bat/log_android422.txt | 33 + sources/sample/plugin_bat/log_darwin_1.txt | 41 + sources/sample/plugin_bat/log_freebsd_1.txt | 18 + sources/sample/plugin_bat/log_freebsd_2.txt | 18 + sources/sample/plugin_bat/log_test_1.txt | 22 + sources/sample/plugin_bat/log_test_2.txt | 22 + sources/sample/plugin_bat/log_vbox.txt | 31 + sources/sample/plugin_dmraid/dmraid1.txt | 98 + sources/sample/plugin_dmraid/dmraid2.txt | 121 + sources/sample/plugin_dmraid/dmraid3.txt | 22 + sources/sample/plugin_dmraid/dmraid4.txt | 63 + sources/sample/plugin_dmraid/dmraid5.txt | 31 + sources/sample/plugin_mdstat/README | 2 + sources/sample/plugin_mdstat/raid1.txt | 5 + sources/sample/plugin_mdstat/raid10.txt | 6 + sources/sample/plugin_mdstat/raid11.txt | 6 + sources/sample/plugin_mdstat/raid12.txt | 6 + sources/sample/plugin_mdstat/raid2.txt | 5 + sources/sample/plugin_mdstat/raid3.txt | 5 + sources/sample/plugin_mdstat/raid4.txt | 6 + sources/sample/plugin_mdstat/raid5.txt | 5 + sources/sample/plugin_mdstat/raid6.txt | 6 + sources/sample/plugin_mdstat/raid7.txt | 5 + sources/sample/plugin_mdstat/raid8.txt | 11 + sources/sample/plugin_mdstat/raid9.txt | 6 + sources/sample/plugin_ps/README | 3 + sources/sample/plugin_ps/ps1.txt | 39 + sources/sample/plugin_ps/ps2.txt | 127 + sources/sample/plugin_psstatus/README | 2 + sources/sample/plugin_psstatus/psstatus1.txt | 7 + sources/sample/plugin_quotas/README | 2 + sources/sample/plugin_quotas/quotas1.txt | 5 + sources/sample/plugin_smart/smart0.txt | 43 + sources/sample/plugin_smart/smart1.txt | 86 + .../plugin_updatenotifier/ubuntu-landscape | 4 + .../plugin_updatenotifier/universal-format | 1 + sources/sample/processes/processes.txt | 71 + sources/sample/ups/1-upscDell2700.txt | 74 + sources/sample/ups/1-upscPW5110.txt | 19 + sources/sample/ups/1-upscl.txt | 1 + sources/sample/ups/apcaccess1.txt | 53 + sources/sample/ups/powersoftplus1.txt | 16 + sources/templates/aqua.css | 181 + sources/templates/aqua/aq_background.gif | Bin 0 -> 291 bytes sources/templates/blue.css | 166 + sources/templates/blue/bar.png | Bin 0 -> 1067 bytes sources/templates/blue/barwarn.png | Bin 0 -> 974 bytes sources/templates/blue/bg.png | Bin 0 -> 9687 bytes sources/templates/blue/title.png | Bin 0 -> 1169 bytes sources/templates/clean.css | 161 + sources/templates/cleansyn.css | 162 + sources/templates/cream.css | 161 + sources/templates/cream/bg.gif | Bin 0 -> 219 bytes sources/templates/dark_bootstrap.css | 189 + sources/templates/green_bootstrap.css | 189 + sources/templates/html/error_config.html | 22 + sources/templates/html/index_all.html | 40 + sources/templates/html/index_bootstrap.html | 429 + sources/templates/html/index_dynamic.html | 254 + sources/templates/idash.css | 172 + sources/templates/idash/bg.png | Bin 0 -> 30344 bytes sources/templates/idash/html.gif | Bin 0 -> 120 bytes sources/templates/idash/htmlwarn.gif | Bin 0 -> 120 bytes sources/templates/jstyle_blue.css | 157 + sources/templates/jstyle_green.css | 162 + sources/templates/nextgen.css | 172 + sources/templates/nextgen/nextgen_bg.png | Bin 0 -> 30250 bytes sources/templates/phpsysinfo.css | 162 + sources/templates/phpsysinfo_bootstrap.css | 144 + .../templates/phpsysinfo_bootstrap.css.new | 189 + .../templates/plugin/jquery.dataTables.css | 14 + sources/templates/plugin/jquery.jgrowl.css | 132 + sources/templates/plugin/jquery.treeTable.css | 37 + sources/templates/plugin/nyroModal.full.css | 105 + sources/templates/two.css | 143 + sources/templates/two/gradient.png | Bin 0 -> 525 bytes sources/templates/vendor/bootstrap.min.css | 6 + sources/tools/MakeRelease.sh | 32 + sources/tools/README | 4 + sources/tools/aptana/js.xml | 43 + sources/tools/aptana/php.xml | 90 + sources/tools/check.sh | 15 + sources/tools/checkdistro.php | 212 + sources/tools/distrotest.php | 45 + sources/tools/lint.bat | 10 + sources/tools/speedfan/SpeedFanGet_bin.zip | Bin 0 -> 2649 bytes sources/tools/speedfan/SpeedFanGet_src.zip | Bin 0 -> 1242 bytes sources/xml.php | 63 + 710 files changed, 91833 insertions(+), 1 deletion(-) create mode 100644 LICENSE create mode 100644 manifest.json create mode 100644 scripts/backup create mode 100644 scripts/install create mode 100644 scripts/remove create mode 100644 scripts/restore create mode 100644 scripts/upgrade create mode 100644 sources/.gitignore create mode 100644 sources/.htaccess create mode 100644 sources/.travis.yml create mode 100644 sources/CHANGELOG.md create mode 100644 sources/COPYING create mode 100644 sources/Dockerfile create mode 100644 sources/README.md create mode 100644 sources/README_PLUGIN.md create mode 100644 sources/composer.json create mode 100644 sources/data/ModelTranslation.txt create mode 100644 sources/data/distros.ini create mode 100644 sources/data/languages.ini create mode 100644 sources/data/osnames.ini create mode 100644 sources/gfx/ajax-loader.gif create mode 100644 sources/gfx/ajaxLoader.gif create mode 100644 sources/gfx/attention.gif create mode 100644 sources/gfx/blank.gif create mode 100644 sources/gfx/body.gif create mode 100644 sources/gfx/bullet_toggle_minus.gif create mode 100644 sources/gfx/bullet_toggle_plus.gif create mode 100644 sources/gfx/close.gif create mode 100644 sources/gfx/down_black.gif create mode 100644 sources/gfx/down_gray.gif create mode 100644 sources/gfx/favicon.gif create mode 100644 sources/gfx/favicon.ico create mode 100644 sources/gfx/html.gif create mode 100644 sources/gfx/htmlwarn.gif create mode 100644 sources/gfx/images/4MLinux.png create mode 100644 sources/gfx/images/AIX.png create mode 100644 sources/gfx/images/ALT.png create mode 100644 sources/gfx/images/Alpine.png create mode 100644 sources/gfx/images/Amazon.png create mode 100644 sources/gfx/images/Android.png create mode 100644 sources/gfx/images/Apple.png create mode 100644 sources/gfx/images/Arch.png create mode 100644 sources/gfx/images/BOSS.png create mode 100644 sources/gfx/images/Calculate.png create mode 100644 sources/gfx/images/Canaima.png create mode 100644 sources/gfx/images/CentOS.png create mode 100644 sources/gfx/images/Chakra.png create mode 100644 sources/gfx/images/ClearOS.png create mode 100644 sources/gfx/images/Cloud.png create mode 100644 sources/gfx/images/Cobalt.png create mode 100644 sources/gfx/images/CoreOS.png create mode 100644 sources/gfx/images/Crux.png create mode 100644 sources/gfx/images/Darwin.png create mode 100644 sources/gfx/images/Debian.png create mode 100644 sources/gfx/images/Deepin.png create mode 100644 sources/gfx/images/DragonFly.png create mode 100644 sources/gfx/images/Eisfair.png create mode 100644 sources/gfx/images/Fedora.png create mode 100644 sources/gfx/images/Foresight.png create mode 100644 sources/gfx/images/FreeBSD.png create mode 100644 sources/gfx/images/Frugalware.png create mode 100644 sources/gfx/images/Fuduntu.png create mode 100644 sources/gfx/images/Generations.png create mode 100644 sources/gfx/images/Gentoo.png create mode 100644 sources/gfx/images/Gobo.png create mode 100644 sources/gfx/images/HPUX.png create mode 100644 sources/gfx/images/Haiku.png create mode 100644 sources/gfx/images/Handy.png create mode 100644 sources/gfx/images/HipServ.png create mode 100644 sources/gfx/images/IPFire.png create mode 100644 sources/gfx/images/KaOS.png create mode 100644 sources/gfx/images/Korora.png create mode 100644 sources/gfx/images/LFS.png create mode 100644 sources/gfx/images/Linaro.png create mode 100644 sources/gfx/images/Lunar.png create mode 100644 sources/gfx/images/Mageia.png create mode 100644 sources/gfx/images/Mandrake.png create mode 100644 sources/gfx/images/Manjaro.png create mode 100644 sources/gfx/images/Mer.png create mode 100644 sources/gfx/images/Minix.png create mode 100644 sources/gfx/images/Mint.png create mode 100644 sources/gfx/images/NetBSD.png create mode 100644 sources/gfx/images/Netrunner.png create mode 100644 sources/gfx/images/NixOS.png create mode 100644 sources/gfx/images/OpenBSD.png create mode 100644 sources/gfx/images/OpenMamba.png create mode 100644 sources/gfx/images/OpenMandriva.png create mode 100644 sources/gfx/images/Oracle.png create mode 100644 sources/gfx/images/PCLinuxOS.png create mode 100644 sources/gfx/images/PLD.png create mode 100644 sources/gfx/images/Parsix.png create mode 100644 sources/gfx/images/Pear.png create mode 100644 sources/gfx/images/Peppermint.png create mode 100644 sources/gfx/images/Pisi.png create mode 100644 sources/gfx/images/Porteus.png create mode 100644 sources/gfx/images/Puppy.png create mode 100644 sources/gfx/images/QNX.png create mode 100644 sources/gfx/images/QTS.png create mode 100644 sources/gfx/images/Qubes.png create mode 100644 sources/gfx/images/ROSA.png create mode 100644 sources/gfx/images/Raspbian.png create mode 100644 sources/gfx/images/ReactOS.png create mode 100644 sources/gfx/images/RedFlag.png create mode 100644 sources/gfx/images/RedHat.png create mode 100644 sources/gfx/images/Rubix.png create mode 100644 sources/gfx/images/SMEServer.png create mode 100644 sources/gfx/images/SMS.png create mode 100644 sources/gfx/images/SUSE.png create mode 100644 sources/gfx/images/Sabayon.png create mode 100644 sources/gfx/images/Salix.png create mode 100644 sources/gfx/images/Scientific.png create mode 100644 sources/gfx/images/Semplice.png create mode 100644 sources/gfx/images/Slackware.png create mode 100644 sources/gfx/images/Slax.png create mode 100644 sources/gfx/images/SliTaz.png create mode 100644 sources/gfx/images/Solus.png create mode 100644 sources/gfx/images/SolusOS.png create mode 100644 sources/gfx/images/SolydXK.png create mode 100644 sources/gfx/images/StartOS.png create mode 100644 sources/gfx/images/SteamOS.png create mode 100644 sources/gfx/images/SunOS.png create mode 100644 sources/gfx/images/Synology.png create mode 100644 sources/gfx/images/Tails.png create mode 100644 sources/gfx/images/Tanglu.png create mode 100644 sources/gfx/images/TinyCore.png create mode 100644 sources/gfx/images/Tizen.png create mode 100644 sources/gfx/images/Trisquel.png create mode 100644 sources/gfx/images/Trustix.png create mode 100644 sources/gfx/images/Turbo.png create mode 100644 sources/gfx/images/Ubuntu.png create mode 100644 sources/gfx/images/UltimateEdition.png create mode 100644 sources/gfx/images/Vector.png create mode 100644 sources/gfx/images/VortexBox.png create mode 100644 sources/gfx/images/Win2000.png create mode 100644 sources/gfx/images/Win8.png create mode 100644 sources/gfx/images/WinVista.png create mode 100644 sources/gfx/images/WinXP.png create mode 100644 sources/gfx/images/Zenwalk.png create mode 100644 sources/gfx/images/Zorin.png create mode 100644 sources/gfx/images/antiX.png create mode 100644 sources/gfx/images/elementaryOS.png create mode 100644 sources/gfx/images/free-eos.png create mode 100644 sources/gfx/images/gNewSense.png create mode 100644 sources/gfx/images/iycc.png create mode 100644 sources/gfx/images/openSUSE.png create mode 100644 sources/gfx/images/pfSense.png create mode 100644 sources/gfx/images/unknown.png create mode 100644 sources/gfx/logo_32.gif create mode 100644 sources/gfx/next.gif create mode 100644 sources/gfx/prev.gif create mode 100644 sources/gfx/reload.gif create mode 100644 sources/gfx/right_black.gif create mode 100644 sources/gfx/right_gray.gif create mode 100644 sources/gfx/sort_asc.gif create mode 100644 sources/gfx/sort_both.gif create mode 100644 sources/gfx/sort_desc.gif create mode 100644 sources/gfx/treeTable/blank.gif create mode 100644 sources/gfx/treeTable/tv-collapsable-last.gif create mode 100644 sources/gfx/treeTable/tv-collapsable.gif create mode 100644 sources/gfx/treeTable/tv-expandable-last.gif create mode 100644 sources/gfx/treeTable/tv-expandable.gif create mode 100644 sources/gfx/treeTable/tv-item-last.gif create mode 100644 sources/gfx/treeTable/tv-item.gif create mode 100644 sources/gfx/treeTable/vertline.gif create mode 100644 sources/includes/autoloader.inc.php create mode 100644 sources/includes/class.CommonFunctions.inc.php create mode 100644 sources/includes/class.Parser.inc.php create mode 100644 sources/includes/error/class.PSI_Error.inc.php create mode 100644 sources/includes/interface/class.PSI_Interface_OS.inc.php create mode 100644 sources/includes/interface/class.PSI_Interface_Output.inc.php create mode 100644 sources/includes/interface/class.PSI_Interface_Plugin.inc.php create mode 100644 sources/includes/interface/class.PSI_Interface_Sensor.inc.php create mode 100644 sources/includes/interface/class.PSI_Interface_UPS.inc.php create mode 100644 sources/includes/js/README create mode 100644 sources/includes/js/class.JavaScriptPacker.inc.php create mode 100644 sources/includes/mb/class.coretemp.inc.php create mode 100644 sources/includes/mb/class.freeipmi.inc.php create mode 100644 sources/includes/mb/class.hddtemp.inc.php create mode 100644 sources/includes/mb/class.healthd.inc.php create mode 100644 sources/includes/mb/class.hwmon.inc.php create mode 100644 sources/includes/mb/class.hwsensors.inc.php create mode 100644 sources/includes/mb/class.ipmi.inc.php create mode 100644 sources/includes/mb/class.ipmiutil.inc.php create mode 100644 sources/includes/mb/class.k8temp.inc.php create mode 100644 sources/includes/mb/class.lmsensors.inc.php create mode 100644 sources/includes/mb/class.mbm5.inc.php create mode 100644 sources/includes/mb/class.mbmon.inc.php create mode 100644 sources/includes/mb/class.ohm.inc.php create mode 100644 sources/includes/mb/class.pitemp.inc.php create mode 100644 sources/includes/mb/class.qtssnmp.inc.php create mode 100644 sources/includes/mb/class.sensors.inc.php create mode 100644 sources/includes/mb/class.speedfan.inc.php create mode 100644 sources/includes/mb/class.thermalzone.inc.php create mode 100644 sources/includes/os/class.AIX.inc.php create mode 100644 sources/includes/os/class.Android.inc.php create mode 100644 sources/includes/os/class.BSDCommon.inc.php create mode 100644 sources/includes/os/class.Darwin.inc.php create mode 100644 sources/includes/os/class.DragonFly.inc.php create mode 100644 sources/includes/os/class.FreeBSD.inc.php create mode 100644 sources/includes/os/class.HPUX.inc.php create mode 100644 sources/includes/os/class.Haiku.inc.php create mode 100644 sources/includes/os/class.Linux.inc.php create mode 100644 sources/includes/os/class.Minix.inc.php create mode 100644 sources/includes/os/class.NetBSD.inc.php create mode 100644 sources/includes/os/class.OS.inc.php create mode 100644 sources/includes/os/class.OpenBSD.inc.php create mode 100644 sources/includes/os/class.QNX.inc.php create mode 100644 sources/includes/os/class.SunOS.inc.php create mode 100644 sources/includes/os/class.WINNT.inc.php create mode 100644 sources/includes/output/class.Output.inc.php create mode 100644 sources/includes/output/class.Template.inc.php create mode 100644 sources/includes/output/class.Webpage.inc.php create mode 100644 sources/includes/output/class.WebpageXML.inc.php create mode 100644 sources/includes/output/class.WebpageXSLT.inc.php create mode 100644 sources/includes/plugin/class.PSI_Plugin.inc.php create mode 100644 sources/includes/to/class.MBInfo.inc.php create mode 100644 sources/includes/to/class.System.inc.php create mode 100644 sources/includes/to/class.UPSInfo.inc.php create mode 100644 sources/includes/to/device/class.CpuDevice.inc.php create mode 100644 sources/includes/to/device/class.DiskDevice.inc.php create mode 100644 sources/includes/to/device/class.HWDevice.inc.php create mode 100644 sources/includes/to/device/class.NetDevice.inc.php create mode 100644 sources/includes/to/device/class.SensorDevice.inc.php create mode 100644 sources/includes/to/device/class.UPSDevice.inc.php create mode 100644 sources/includes/ups/class.apcupsd.inc.php create mode 100644 sources/includes/ups/class.nut.inc.php create mode 100644 sources/includes/ups/class.pmset.inc.php create mode 100644 sources/includes/ups/class.powersoftplus.inc.php create mode 100644 sources/includes/ups/class.snmpups.inc.php create mode 100644 sources/includes/ups/class.ups.inc.php create mode 100644 sources/includes/xml/class.SimpleXMLExtended.inc.php create mode 100644 sources/includes/xml/class.XML.inc.php create mode 100644 sources/index.php create mode 100644 sources/js.php create mode 100644 sources/js/jQuery/README create mode 100644 sources/js/jQuery/README_bootstrap create mode 100644 sources/js/jQuery/jquery-1.js create mode 100644 sources/js/jQuery/jquery.dataTables.js create mode 100644 sources/js/jQuery/jquery.ifixpng.js create mode 100644 sources/js/jQuery/jquery.jgrowl.js create mode 100644 sources/js/jQuery/jquery.js create mode 100644 sources/js/jQuery/jquery.nyroModal.js create mode 100644 sources/js/jQuery/jquery.timers.js create mode 100644 sources/js/jQuery/jquery.treeTable.js create mode 100644 sources/js/jQuery/jquery.treegrid.js create mode 100644 sources/js/phpSysInfo/phpsysinfo.js create mode 100644 sources/js/phpSysInfo/phpsysinfo_bootstrap.js create mode 100644 sources/js/vendor/README create mode 100644 sources/js/vendor/bootstrap.min.js create mode 100644 sources/js/vendor/console-shim.js create mode 100644 sources/js/vendor/html5shiv-printshiv.js create mode 100644 sources/js/vendor/respond.js create mode 100644 sources/js/vendor/sorttable.js create mode 100644 sources/js/vendor/transparency.js create mode 100644 sources/language/ast.xml create mode 100644 sources/language/bg.xml create mode 100644 sources/language/ca.xml create mode 100644 sources/language/cz.xml create mode 100644 sources/language/da.xml create mode 100644 sources/language/de.xml create mode 100644 sources/language/en.xml create mode 100644 sources/language/es.xml create mode 100644 sources/language/et.xml create mode 100644 sources/language/fi.xml create mode 100644 sources/language/fr.xml create mode 100644 sources/language/gl.xml create mode 100644 sources/language/gr.xml create mode 100644 sources/language/he.xml create mode 100644 sources/language/hu.xml create mode 100644 sources/language/is.xml create mode 100644 sources/language/it.xml create mode 100644 sources/language/ja.xml create mode 100644 sources/language/ko.xml create mode 100644 sources/language/language.php create mode 100644 sources/language/nl.xml create mode 100644 sources/language/no.xml create mode 100644 sources/language/pl.xml create mode 100644 sources/language/pt-br.xml create mode 100644 sources/language/pt-pt.xml create mode 100644 sources/language/ro.xml create mode 100644 sources/language/ru.xml create mode 100644 sources/language/sk.xml create mode 100644 sources/language/sl.xml create mode 100644 sources/language/sv.xml create mode 100644 sources/language/th.xml create mode 100644 sources/language/tr.xml create mode 100644 sources/language/translation-plugin.xsd create mode 100644 sources/language/translation.xsd create mode 100644 sources/language/tw.xml create mode 100644 sources/language/uk.xml create mode 100644 sources/language/zh.xml create mode 100644 sources/phpsysinfo.ini.new create mode 100644 sources/phpsysinfo.xslt create mode 100644 sources/phpsysinfo3.xsd create mode 100644 sources/plugins/bat/bat_bootstrap.html create mode 100644 sources/plugins/bat/class.bat.inc.php create mode 100644 sources/plugins/bat/js/bat.js create mode 100644 sources/plugins/bat/js/bat_bootstrap.js create mode 100644 sources/plugins/bat/lang/cz.xml create mode 100644 sources/plugins/bat/lang/de.xml create mode 100644 sources/plugins/bat/lang/en.xml create mode 100644 sources/plugins/bat/lang/fr.xml create mode 100644 sources/plugins/bat/lang/pl.xml create mode 100644 sources/plugins/bat/lang/ro.xml create mode 100644 sources/plugins/bat/lang/ru.xml create mode 100644 sources/plugins/dmraid/class.dmraid.inc.php create mode 100644 sources/plugins/dmraid/css/dmraid.css create mode 100644 sources/plugins/dmraid/dmraid_bootstrap.html create mode 100644 sources/plugins/dmraid/gfx/error.png create mode 100644 sources/plugins/dmraid/gfx/harddrivefail.png create mode 100644 sources/plugins/dmraid/gfx/harddriveok.png create mode 100644 sources/plugins/dmraid/gfx/harddrivespare.png create mode 100644 sources/plugins/dmraid/gfx/harddrivewarn.png create mode 100644 sources/plugins/dmraid/js/dmraid.js create mode 100644 sources/plugins/dmraid/js/dmraid_bootstrap.js create mode 100644 sources/plugins/dmraid/lang/en.xml create mode 100644 sources/plugins/dmraid/lang/fr.xml create mode 100644 sources/plugins/dmraid/lang/ro.xml create mode 100644 sources/plugins/dmraid/lang/ru.xml create mode 100644 sources/plugins/ipmiinfo/class.ipmiinfo.inc.php create mode 100644 sources/plugins/ipmiinfo/ipmiinfo_bootstrap.html create mode 100644 sources/plugins/ipmiinfo/js/ipmiinfo.js create mode 100644 sources/plugins/ipmiinfo/js/ipmiinfo_bootstrap.js create mode 100644 sources/plugins/ipmiinfo/lang/cz.xml create mode 100644 sources/plugins/ipmiinfo/lang/de.xml create mode 100644 sources/plugins/ipmiinfo/lang/en.xml create mode 100644 sources/plugins/ipmiinfo/lang/fr.xml create mode 100644 sources/plugins/ipmiinfo/lang/pl.xml create mode 100644 sources/plugins/ipmiinfo/lang/ro.xml create mode 100644 sources/plugins/ipmiinfo/lang/ru.xml create mode 100644 sources/plugins/mdstatus/class.mdstatus.inc.php create mode 100644 sources/plugins/mdstatus/css/mdstatus.css create mode 100644 sources/plugins/mdstatus/gfx/error.png create mode 100644 sources/plugins/mdstatus/gfx/harddrivefail.png create mode 100644 sources/plugins/mdstatus/gfx/harddriveok.png create mode 100644 sources/plugins/mdstatus/gfx/harddrivespare.png create mode 100644 sources/plugins/mdstatus/js/mdstatus.js create mode 100644 sources/plugins/mdstatus/js/mdstatus_bootstrap.js create mode 100644 sources/plugins/mdstatus/lang/cz.xml create mode 100644 sources/plugins/mdstatus/lang/de.xml create mode 100644 sources/plugins/mdstatus/lang/en.xml create mode 100644 sources/plugins/mdstatus/lang/fr.xml create mode 100644 sources/plugins/mdstatus/lang/gr.xml create mode 100644 sources/plugins/mdstatus/lang/ro.xml create mode 100644 sources/plugins/mdstatus/lang/ru.xml create mode 100644 sources/plugins/mdstatus/mdstatus_bootstrap.html create mode 100644 sources/plugins/ps/class.ps.inc.php create mode 100644 sources/plugins/ps/js/ps.js create mode 100644 sources/plugins/ps/js/ps_bootstrap.js create mode 100644 sources/plugins/ps/lang/cz.xml create mode 100644 sources/plugins/ps/lang/de.xml create mode 100644 sources/plugins/ps/lang/en.xml create mode 100644 sources/plugins/ps/lang/fr.xml create mode 100644 sources/plugins/ps/lang/gr.xml create mode 100644 sources/plugins/ps/lang/pl.xml create mode 100644 sources/plugins/ps/lang/ro.xml create mode 100644 sources/plugins/ps/lang/ru.xml create mode 100644 sources/plugins/ps/ps_bootstrap.html create mode 100644 sources/plugins/psstatus/class.psstatus.inc.php create mode 100644 sources/plugins/psstatus/css/psstatus.css create mode 100644 sources/plugins/psstatus/gfx/offline.gif create mode 100644 sources/plugins/psstatus/gfx/online.gif create mode 100644 sources/plugins/psstatus/js/psstatus.js create mode 100644 sources/plugins/psstatus/js/psstatus_bootstrap.js create mode 100644 sources/plugins/psstatus/lang/cz.xml create mode 100644 sources/plugins/psstatus/lang/de.xml create mode 100644 sources/plugins/psstatus/lang/en.xml create mode 100644 sources/plugins/psstatus/lang/fr.xml create mode 100644 sources/plugins/psstatus/lang/gr.xml create mode 100644 sources/plugins/psstatus/lang/pl.xml create mode 100644 sources/plugins/psstatus/lang/ro.xml create mode 100644 sources/plugins/psstatus/lang/ru.xml create mode 100644 sources/plugins/psstatus/psstatus_bootstrap.html create mode 100644 sources/plugins/quotas/class.quotas.inc.php create mode 100644 sources/plugins/quotas/css/quotas.css create mode 100644 sources/plugins/quotas/js/quotas.js create mode 100644 sources/plugins/quotas/js/quotas_bootstrap.js create mode 100644 sources/plugins/quotas/lang/cz.xml create mode 100644 sources/plugins/quotas/lang/de.xml create mode 100644 sources/plugins/quotas/lang/en.xml create mode 100644 sources/plugins/quotas/lang/fr.xml create mode 100644 sources/plugins/quotas/lang/pl.xml create mode 100644 sources/plugins/quotas/lang/ro.xml create mode 100644 sources/plugins/quotas/lang/ru.xml create mode 100644 sources/plugins/quotas/quotas_bootstrap.html create mode 100644 sources/plugins/smart/class.smart.inc.php create mode 100644 sources/plugins/smart/css/smart.css create mode 100644 sources/plugins/smart/js/smart.js create mode 100644 sources/plugins/smart/js/smart_bootstrap.js create mode 100644 sources/plugins/smart/lang/cz.xml create mode 100644 sources/plugins/smart/lang/en.xml create mode 100644 sources/plugins/smart/lang/fr.xml create mode 100644 sources/plugins/smart/lang/gr.xml create mode 100644 sources/plugins/smart/lang/pl.xml create mode 100644 sources/plugins/smart/lang/ro.xml create mode 100644 sources/plugins/smart/lang/ru.xml create mode 100644 sources/plugins/smart/smart_bootstrap.html create mode 100644 sources/plugins/snmppinfo/class.snmppinfo.inc.php create mode 100644 sources/plugins/snmppinfo/js/snmppinfo.js create mode 100644 sources/plugins/snmppinfo/js/snmppinfo_bootstrap.js create mode 100644 sources/plugins/snmppinfo/lang/cz.xml create mode 100644 sources/plugins/snmppinfo/lang/de.xml create mode 100644 sources/plugins/snmppinfo/lang/en.xml create mode 100644 sources/plugins/snmppinfo/lang/fr.xml create mode 100644 sources/plugins/snmppinfo/lang/pl.xml create mode 100644 sources/plugins/snmppinfo/lang/ro.xml create mode 100644 sources/plugins/snmppinfo/lang/ru.xml create mode 100644 sources/plugins/snmppinfo/snmppinfo_bootstrap.html create mode 100644 sources/plugins/updatenotifier/class.updatenotifier.inc.php create mode 100644 sources/plugins/updatenotifier/js/updatenotifier.js create mode 100644 sources/plugins/updatenotifier/js/updatenotifier_bootstrap.js create mode 100644 sources/plugins/updatenotifier/lang/cz.xml create mode 100644 sources/plugins/updatenotifier/lang/de.xml create mode 100644 sources/plugins/updatenotifier/lang/en.xml create mode 100644 sources/plugins/updatenotifier/lang/fr.xml create mode 100644 sources/plugins/updatenotifier/lang/pl.xml create mode 100644 sources/plugins/updatenotifier/lang/ro.xml create mode 100644 sources/plugins/updatenotifier/lang/ru.xml create mode 100644 sources/plugins/updatenotifier/updatenotifier_bootstrap.html create mode 100644 sources/plugins/uprecords/class.uprecords.inc.php create mode 100644 sources/plugins/uprecords/js/uprecords.js create mode 100644 sources/plugins/uprecords/js/uprecords_bootstrap.js create mode 100644 sources/plugins/uprecords/lang/en.xml create mode 100644 sources/plugins/uprecords/lang/fr.xml create mode 100644 sources/plugins/uprecords/lang/hu.xml create mode 100644 sources/plugins/uprecords/lang/pl.xml create mode 100644 sources/plugins/uprecords/lang/ro.xml create mode 100644 sources/plugins/uprecords/lang/ru.xml create mode 100644 sources/plugins/uprecords/uprecords_bootstrap.html create mode 100644 sources/read_config.php create mode 100644 sources/sample/distrotest/4MLinux/10.0-server.txt create mode 100644 sources/sample/distrotest/ALT/6.0.0.txt create mode 100644 sources/sample/distrotest/ALT/7.0.0-Simply.txt create mode 100644 sources/sample/distrotest/ALT/7.0.1.txt create mode 100644 sources/sample/distrotest/Alpine/2.6.4.txt create mode 100644 sources/sample/distrotest/Amazon/2013.09.txt create mode 100644 sources/sample/distrotest/Arch/2011.08.19-ISO.txt create mode 100644 sources/sample/distrotest/Arch/2013.11.01.txt create mode 100644 sources/sample/distrotest/Arch/2014.01.05.txt create mode 100644 sources/sample/distrotest/BOSS/1.0-server.txt create mode 100644 sources/sample/distrotest/BOSS/5.0.txt create mode 100644 sources/sample/distrotest/Calculate/13.11.txt create mode 100644 sources/sample/distrotest/Canaima/4.1.txt create mode 100644 sources/sample/distrotest/CentOS/5.6.txt create mode 100644 sources/sample/distrotest/CentOS/6.5-SF.txt create mode 100644 sources/sample/distrotest/CentOS/6.5.txt create mode 100644 sources/sample/distrotest/CentOS/7.1.1503.txt create mode 100644 sources/sample/distrotest/Chakra/2013.02.txt create mode 100644 sources/sample/distrotest/ClearOS/6.4.0-Beta.txt create mode 100644 sources/sample/distrotest/Cloud/5.10.txt create mode 100644 sources/sample/distrotest/Cloud/6.4.txt create mode 100644 sources/sample/distrotest/CoreOS/367.1.0.txt create mode 100644 sources/sample/distrotest/Crux/2.8.txt create mode 100644 sources/sample/distrotest/Debian/5.0.3.txt create mode 100644 sources/sample/distrotest/Debian/6.0.6.txt create mode 100644 sources/sample/distrotest/Debian/8-20140106-netinstall.txt create mode 100644 sources/sample/distrotest/Debian/8-20140106.txt create mode 100644 sources/sample/distrotest/Deepin/2013.txt create mode 100644 sources/sample/distrotest/Eisfair/1-2.6.5.txt create mode 100644 sources/sample/distrotest/Eisfair/2-1.8.1.txt create mode 100644 sources/sample/distrotest/Fedora/20-lsb.txt create mode 100644 sources/sample/distrotest/Fedora/20.txt create mode 100644 sources/sample/distrotest/Fedora/4.txt create mode 100644 sources/sample/distrotest/Foresight/2.5.3.txt create mode 100644 sources/sample/distrotest/Frugalware/1.9.txt create mode 100644 sources/sample/distrotest/Fuduntu/2013.2.txt create mode 100644 sources/sample/distrotest/Generations/3.1.txt create mode 100644 sources/sample/distrotest/Gentoo/2.2-NAME.txt create mode 100644 sources/sample/distrotest/Gentoo/2.2.txt create mode 100644 sources/sample/distrotest/Gobo/015.beta2.txt create mode 100644 sources/sample/distrotest/Handy/2.0.txt create mode 100644 sources/sample/distrotest/HipServ/2.6.txt create mode 100644 sources/sample/distrotest/IPFire/2.13.txt create mode 100644 sources/sample/distrotest/KaOS/2014.0301.txt create mode 100644 sources/sample/distrotest/Korora/20.txt create mode 100644 sources/sample/distrotest/Linaro/13.12.txt create mode 100644 sources/sample/distrotest/Lunar/1.7.0-rc2.txt create mode 100644 sources/sample/distrotest/Mageia/4.txt create mode 100644 sources/sample/distrotest/Mandrake/2011.0.txt create mode 100644 sources/sample/distrotest/Mandrake/9.2.txt create mode 100644 sources/sample/distrotest/Manjaro/0.8.8.txt create mode 100644 sources/sample/distrotest/Mer/0.2011.txt create mode 100644 sources/sample/distrotest/Mint/13.txt create mode 100644 sources/sample/distrotest/Mint/14.txt create mode 100644 sources/sample/distrotest/Mint/15.txt create mode 100644 sources/sample/distrotest/Netrunner/13.06-SE.txt create mode 100644 sources/sample/distrotest/Netrunner/13.06.txt create mode 100644 sources/sample/distrotest/Netrunner/2014.04.txt create mode 100644 sources/sample/distrotest/NixOS/13.10.txt create mode 100644 sources/sample/distrotest/OpenMamba/3.0.1.txt create mode 100644 sources/sample/distrotest/OpenMandriva/2013.0-RC1.txt create mode 100644 sources/sample/distrotest/Oracle/5.10-el.txt create mode 100644 sources/sample/distrotest/Oracle/6.3.txt create mode 100644 sources/sample/distrotest/PCLinuxOS/2012.06.txt create mode 100644 sources/sample/distrotest/PLD/2.99.txt create mode 100644 sources/sample/distrotest/PLD/3.0.txt create mode 100644 sources/sample/distrotest/Parsix/5.0.txt create mode 100644 sources/sample/distrotest/Parsix/6.0.txt create mode 100644 sources/sample/distrotest/Pear/5.00.txt create mode 100644 sources/sample/distrotest/Pear/6.1-LTS.txt create mode 100644 sources/sample/distrotest/Pear/6.1.txt create mode 100644 sources/sample/distrotest/Pear/7.0.txt create mode 100644 sources/sample/distrotest/Peppermint/3.txt create mode 100644 sources/sample/distrotest/Peppermint/4-20131113.txt create mode 100644 sources/sample/distrotest/Pisi/1.0.txt create mode 100644 sources/sample/distrotest/Porteus/2.1.txt create mode 100644 sources/sample/distrotest/Puppy/431.txt create mode 100644 sources/sample/distrotest/Puppy/5.3-wary.txt create mode 100644 sources/sample/distrotest/Puppy/5.3.3-slacko.txt create mode 100644 sources/sample/distrotest/Puppy/528-lucid.txt create mode 100644 sources/sample/distrotest/QTS/3.1.2.txt create mode 100644 sources/sample/distrotest/Qubes/3.0.txt create mode 100644 sources/sample/distrotest/ROSA/2012.0.0-11-LTS.txt create mode 100644 sources/sample/distrotest/ROSA/2012.0.0-6-LTS.txt create mode 100644 sources/sample/distrotest/ROSA/2012.1.0-20.txt create mode 100644 sources/sample/distrotest/ROSA/6.5-Server.txt create mode 100644 sources/sample/distrotest/Raspbian/7.txt create mode 100644 sources/sample/distrotest/Raspbian/8.0.txt create mode 100644 sources/sample/distrotest/RedFlag/8.0.txt create mode 100644 sources/sample/distrotest/RedHat/6.0.txt create mode 100644 sources/sample/distrotest/RedHat/7.0-Beta.txt create mode 100644 sources/sample/distrotest/SMEServer/8.1beta3.txt create mode 100644 sources/sample/distrotest/SMEServer/9.0beta3.txt create mode 100644 sources/sample/distrotest/SMS/2.0.5.txt create mode 100644 sources/sample/distrotest/Sabayon/14.01.txt create mode 100644 sources/sample/distrotest/Salix/14.0.txt create mode 100644 sources/sample/distrotest/Scientific/6.3-lsb.txt create mode 100644 sources/sample/distrotest/Scientific/6.3.txt create mode 100644 sources/sample/distrotest/Scientific/6.4.txt create mode 100644 sources/sample/distrotest/Semplice/6.txt create mode 100644 sources/sample/distrotest/Slackware/14.0.txt create mode 100644 sources/sample/distrotest/Slax/7.0.1.txt create mode 100644 sources/sample/distrotest/SliTaz/2014.02.16-cooking.txt create mode 100644 sources/sample/distrotest/Solus/1.0-rc1.txt create mode 100644 sources/sample/distrotest/SolusOS/1.3.txt create mode 100644 sources/sample/distrotest/SolusOS/2-alpha7.txt create mode 100644 sources/sample/distrotest/SolydXK/2014.01-K.txt create mode 100644 sources/sample/distrotest/SolydXK/2014.01-X.txt create mode 100644 sources/sample/distrotest/StartOS/5.0.txt create mode 100644 sources/sample/distrotest/StartOS/6.0.txt create mode 100644 sources/sample/distrotest/SteamOS/1.0-beta.txt create mode 100644 sources/sample/distrotest/Synology/4.1-2668.txt create mode 100644 sources/sample/distrotest/Tails/0.22.1.txt create mode 100644 sources/sample/distrotest/Tanglu/2.0-beta2.txt create mode 100644 sources/sample/distrotest/TinyCore/5.0.alpha4.txt create mode 100644 sources/sample/distrotest/Tizen/2.2.0-Magnolia.txt create mode 100644 sources/sample/distrotest/Tizen/2.2.0-Tizen.txt create mode 100644 sources/sample/distrotest/Trisquel/6.0.txt create mode 100644 sources/sample/distrotest/Turbo/12.5.txt create mode 100644 sources/sample/distrotest/Ubuntu/10.04.txt create mode 100644 sources/sample/distrotest/Ubuntu/12.04.txt create mode 100644 sources/sample/distrotest/Ubuntu/13.10.txt create mode 100644 sources/sample/distrotest/UltimateEdition/3.9.txt create mode 100644 sources/sample/distrotest/Vector/647.0.txt create mode 100644 sources/sample/distrotest/VortexBox/2.2.txt create mode 100644 sources/sample/distrotest/VortexBox/2.3-beta.txt create mode 100644 sources/sample/distrotest/Zenwalk/7.4.txt create mode 100644 sources/sample/distrotest/Zorin/6.txt create mode 100644 sources/sample/distrotest/Zorin/7.txt create mode 100644 sources/sample/distrotest/Zorin/8.txt create mode 100644 sources/sample/distrotest/antiX/2012.07.06.txt create mode 100644 sources/sample/distrotest/elementaryOS/0.2.txt create mode 100644 sources/sample/distrotest/gNewSense/3.0.txt create mode 100644 sources/sample/distrotest/openSUSE/11.3.txt create mode 100644 sources/sample/distrotest/openSUSE/13.1.txt create mode 100644 sources/sample/logs/log_android21.txt create mode 100644 sources/sample/logs/log_android412.txt create mode 100644 sources/sample/logs/log_bluestacks.txt create mode 100644 sources/sample/logs/log_debian7.txt create mode 100644 sources/sample/logs/log_sf.txt create mode 100644 sources/sample/main/1-cpuinfo.txt create mode 100644 sources/sample/main/1-dfiP.txt create mode 100644 sources/sample/main/1-dfkP.txt create mode 100644 sources/sample/main/1-mount.txt create mode 100644 sources/sample/main/README create mode 100644 sources/sample/main/cpuinfo1.txt create mode 100644 sources/sample/main/cpuinfo2.txt create mode 100644 sources/sample/main/cpuinfo3.txt create mode 100644 sources/sample/main/cpuinfo4.txt create mode 100644 sources/sample/main/cpuinfo5.txt create mode 100644 sources/sample/main/cpuinfo6.txt create mode 100644 sources/sample/main/cpuinfo7.txt create mode 100644 sources/sample/main/cpuinfo8.txt create mode 100644 sources/sample/main/cpuinfo9.txt create mode 100644 sources/sample/main/dev1.txt create mode 100644 sources/sample/main/df1.txt create mode 100644 sources/sample/main/mount1.txt create mode 100644 sources/sample/main/pmset1.txt create mode 100644 sources/sample/main/pmset2.txt create mode 100644 sources/sample/main/pmset3.txt create mode 100644 sources/sample/main/pmset4.txt create mode 100644 sources/sample/main/swaps1.txt create mode 100644 sources/sample/main/vm_stat1.txt create mode 100644 sources/sample/main/vm_stat2.txt create mode 100644 sources/sample/main/vm_stat3.txt create mode 100644 sources/sample/motherboard/hwsensors/hwsensors1.txt create mode 100644 sources/sample/motherboard/hwsensors/hwsensors2.txt create mode 100644 sources/sample/motherboard/hwsensors/hwsensors3.txt create mode 100644 sources/sample/motherboard/hwsensors/hwsensors4.txt create mode 100644 sources/sample/motherboard/hwsensors/hwsensors5.txt create mode 100644 sources/sample/motherboard/ipmi-sensors/ipmi-sensors1.txt create mode 100644 sources/sample/motherboard/ipmitool/ipmitool1.txt create mode 100644 sources/sample/motherboard/ipmiutil/ipmiutil1.txt create mode 100644 sources/sample/motherboard/lmsensors/lmsensors1.txt create mode 100644 sources/sample/motherboard/lmsensors/lmsensors10.txt create mode 100644 sources/sample/motherboard/lmsensors/lmsensors2.txt create mode 100644 sources/sample/motherboard/lmsensors/lmsensors3.txt create mode 100644 sources/sample/motherboard/lmsensors/lmsensors4.txt create mode 100644 sources/sample/motherboard/lmsensors/lmsensors5.txt create mode 100644 sources/sample/motherboard/lmsensors/lmsensors6.txt create mode 100644 sources/sample/motherboard/lmsensors/lmsensors7.txt create mode 100644 sources/sample/motherboard/lmsensors/lmsensors8.txt create mode 100644 sources/sample/motherboard/lmsensors/lmsensors9.txt create mode 100644 sources/sample/motherboard/mbm5/MBM51.csv create mode 100644 sources/sample/plugin_bat/README create mode 100644 sources/sample/plugin_bat/ac_state1.txt create mode 100644 sources/sample/plugin_bat/battery_info1.txt create mode 100644 sources/sample/plugin_bat/battery_state1.txt create mode 100644 sources/sample/plugin_bat/log_LenovoT530.txt create mode 100644 sources/sample/plugin_bat/log_android233.txt create mode 100644 sources/sample/plugin_bat/log_android412.txt create mode 100644 sources/sample/plugin_bat/log_android422.txt create mode 100644 sources/sample/plugin_bat/log_darwin_1.txt create mode 100644 sources/sample/plugin_bat/log_freebsd_1.txt create mode 100644 sources/sample/plugin_bat/log_freebsd_2.txt create mode 100644 sources/sample/plugin_bat/log_test_1.txt create mode 100644 sources/sample/plugin_bat/log_test_2.txt create mode 100644 sources/sample/plugin_bat/log_vbox.txt create mode 100644 sources/sample/plugin_dmraid/dmraid1.txt create mode 100644 sources/sample/plugin_dmraid/dmraid2.txt create mode 100644 sources/sample/plugin_dmraid/dmraid3.txt create mode 100644 sources/sample/plugin_dmraid/dmraid4.txt create mode 100644 sources/sample/plugin_dmraid/dmraid5.txt create mode 100644 sources/sample/plugin_mdstat/README create mode 100644 sources/sample/plugin_mdstat/raid1.txt create mode 100644 sources/sample/plugin_mdstat/raid10.txt create mode 100644 sources/sample/plugin_mdstat/raid11.txt create mode 100644 sources/sample/plugin_mdstat/raid12.txt create mode 100644 sources/sample/plugin_mdstat/raid2.txt create mode 100644 sources/sample/plugin_mdstat/raid3.txt create mode 100644 sources/sample/plugin_mdstat/raid4.txt create mode 100644 sources/sample/plugin_mdstat/raid5.txt create mode 100644 sources/sample/plugin_mdstat/raid6.txt create mode 100644 sources/sample/plugin_mdstat/raid7.txt create mode 100644 sources/sample/plugin_mdstat/raid8.txt create mode 100644 sources/sample/plugin_mdstat/raid9.txt create mode 100644 sources/sample/plugin_ps/README create mode 100644 sources/sample/plugin_ps/ps1.txt create mode 100644 sources/sample/plugin_ps/ps2.txt create mode 100644 sources/sample/plugin_psstatus/README create mode 100644 sources/sample/plugin_psstatus/psstatus1.txt create mode 100644 sources/sample/plugin_quotas/README create mode 100644 sources/sample/plugin_quotas/quotas1.txt create mode 100644 sources/sample/plugin_smart/smart0.txt create mode 100644 sources/sample/plugin_smart/smart1.txt create mode 100644 sources/sample/plugin_updatenotifier/ubuntu-landscape create mode 100644 sources/sample/plugin_updatenotifier/universal-format create mode 100644 sources/sample/processes/processes.txt create mode 100644 sources/sample/ups/1-upscDell2700.txt create mode 100644 sources/sample/ups/1-upscPW5110.txt create mode 100644 sources/sample/ups/1-upscl.txt create mode 100644 sources/sample/ups/apcaccess1.txt create mode 100644 sources/sample/ups/powersoftplus1.txt create mode 100644 sources/templates/aqua.css create mode 100644 sources/templates/aqua/aq_background.gif create mode 100644 sources/templates/blue.css create mode 100644 sources/templates/blue/bar.png create mode 100644 sources/templates/blue/barwarn.png create mode 100644 sources/templates/blue/bg.png create mode 100644 sources/templates/blue/title.png create mode 100644 sources/templates/clean.css create mode 100644 sources/templates/cleansyn.css create mode 100644 sources/templates/cream.css create mode 100644 sources/templates/cream/bg.gif create mode 100644 sources/templates/dark_bootstrap.css create mode 100644 sources/templates/green_bootstrap.css create mode 100644 sources/templates/html/error_config.html create mode 100644 sources/templates/html/index_all.html create mode 100644 sources/templates/html/index_bootstrap.html create mode 100644 sources/templates/html/index_dynamic.html create mode 100644 sources/templates/idash.css create mode 100644 sources/templates/idash/bg.png create mode 100644 sources/templates/idash/html.gif create mode 100644 sources/templates/idash/htmlwarn.gif create mode 100644 sources/templates/jstyle_blue.css create mode 100644 sources/templates/jstyle_green.css create mode 100644 sources/templates/nextgen.css create mode 100644 sources/templates/nextgen/nextgen_bg.png create mode 100644 sources/templates/phpsysinfo.css create mode 100644 sources/templates/phpsysinfo_bootstrap.css create mode 100644 sources/templates/phpsysinfo_bootstrap.css.new create mode 100644 sources/templates/plugin/jquery.dataTables.css create mode 100644 sources/templates/plugin/jquery.jgrowl.css create mode 100644 sources/templates/plugin/jquery.treeTable.css create mode 100644 sources/templates/plugin/nyroModal.full.css create mode 100644 sources/templates/two.css create mode 100644 sources/templates/two/gradient.png create mode 100644 sources/templates/vendor/bootstrap.min.css create mode 100644 sources/tools/MakeRelease.sh create mode 100644 sources/tools/README create mode 100644 sources/tools/aptana/js.xml create mode 100644 sources/tools/aptana/php.xml create mode 100644 sources/tools/check.sh create mode 100644 sources/tools/checkdistro.php create mode 100644 sources/tools/distrotest.php create mode 100644 sources/tools/lint.bat create mode 100644 sources/tools/speedfan/SpeedFanGet_bin.zip create mode 100644 sources/tools/speedfan/SpeedFanGet_src.zip create mode 100644 sources/xml.php diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..94a9ed0 --- /dev/null +++ b/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/README.md b/README.md index 918c5b9..570b233 100644 --- a/README.md +++ b/README.md @@ -4,4 +4,4 @@ PhpSysInfo for [Yunohost](http://yunohost.org/). Works with Debian 8 and YunoHos # Installation You can install this package by going through the administration web interface by choosing "Install custom app", or using the moulinette: -`yunohost app install https://github.com/clark17/phpsysinfo_for_yunohost` +`yunohost app install https://github.com/inrepublica/phpsysinfo_for_yunohost` diff --git a/manifest.json b/manifest.json new file mode 100644 index 0000000..00cc848 --- /dev/null +++ b/manifest.json @@ -0,0 +1,64 @@ +{ + "name": "PhpSysInfo", + "id": "phpsysinfo", + "packaging_format": 1, + "description": { + "en": "A customizable PHP script that displays information about your system nicely.", + "fr": "Un script PHP paramètrable qui affiche des informations sur votre système." + }, + "url": "http://phpsysinfo.github.io/phpsysinfo/", + "license": "free", + "maintainer": { + "name": "inrepublica", + "email": "duvalmickael@gmail.com" + }, + "requirements": { + "yunohost": ">> 2.4.0.1" + }, + "multi_instance": "false", + "services": [ + "nginx", + "php5-fpm", + ], + "arguments": { + "install" : [ + { + "name": "domain", + "type": "domain", + "ask": { + "en": "Choose a domain for PhpSysInfo", + "fr": "Choisissez un domaine pour PhpSysInfo" + }, + "example": "domain.org" + }, + { + "name": "path", + "type": "path", + "ask": { + "en": "Choose a path for PhpSysInfo", + "fr": "Choisissez un chemin pour PhpSysInfo" + }, + "example": "/phpsysinfo", + "default": "/phpsysinfo" + }, + { + "name": "admin", + "type": "user", + "ask": { + "en": "Choose an admin user", + "fr": "Choisissez l’administrateur" + }, + "example": "johndoe" + }, + { + "name": "is_public", + "ask": { + "en": "Is it a public application?", + "fr": "Est-ce une application publique ?" + }, + "choices": ["Yes", "No"], + "default": "Yes" + } + ] + } +} \ No newline at end of file diff --git a/scripts/backup b/scripts/backup new file mode 100644 index 0000000..e69de29 diff --git a/scripts/install b/scripts/install new file mode 100644 index 0000000..82ed52e --- /dev/null +++ b/scripts/install @@ -0,0 +1,42 @@ +# Retrieve arguments +domain=$1 +path=$2 +admin=$3 +is_public=$4 + +# Save app settings +# sudo yunohost app setting $app admin -v "$admin" +# sudo yunohost app setting $app is_public -v "$is_public" + +# Check domain/path availability +sudo yunohost app checkurl $domain$path -a phpsysinfo +if [[ ! $? -eq 0 ]]; then + exit 1 +fi + +# Copy files to the right place +final_path=/var/www/phpsysinfo +sudo mkdir -p $final_path +sudo cp -a ../sources/* $final_path + +# Create configuration file +cp $final_path/phpsysinfo.ini.new $final_path/phpsysinfo.ini + +# Set permissions to phpsysinfo directory +sudo chown -R www-data: $final_path + +# Modify Nginx configuration file and copy it to Nginx conf directory +sed -i "s@PATHTOCHANGE@$path@g" ../conf/nginx.conf +sed -i "s@ALIASTOCHANGE@$final_path/@g" ../conf/nginx.conf +sudo cp ../conf/nginx.conf /etc/nginx/conf.d/$domain.d/phpsysinfo.conf + +# If app is public, add url to SSOWat conf as skipped_uris +if [ "$is_public" = "Yes" ]; +then + # unprotected_uris allows SSO credentials to be passed anyway. + sudo yunohost app setting $app unprotected_uris -v "/" +fi + +# Reload Nginx and regenerate SSOwat conf +sudo service nginx reload +sudo yunohost app ssowatconf diff --git a/scripts/remove b/scripts/remove new file mode 100644 index 0000000..935397e --- /dev/null +++ b/scripts/remove @@ -0,0 +1,8 @@ +# Remove sources +sudo rm -rf /var/www/phpsysinfo + +# Remove configuration files +sudo rm -f /etc/nginx/conf.d/$domain.d/phpsysinfo.conf + +# Restart services +sudo service nginx reload \ No newline at end of file diff --git a/scripts/restore b/scripts/restore new file mode 100644 index 0000000..e69de29 diff --git a/scripts/upgrade b/scripts/upgrade new file mode 100644 index 0000000..e69de29 diff --git a/sources/.gitignore b/sources/.gitignore new file mode 100644 index 0000000..dbb8d5e --- /dev/null +++ b/sources/.gitignore @@ -0,0 +1 @@ +phpsysinfo.ini diff --git a/sources/.htaccess b/sources/.htaccess new file mode 100644 index 0000000..d84736a --- /dev/null +++ b/sources/.htaccess @@ -0,0 +1,11 @@ + +# Deny all requests from Apache 2.0-2.2 + + order deny,allow + deny from all + +# Deny all requests from Apache 2.4+ + + Require all denied + + diff --git a/sources/.travis.yml b/sources/.travis.yml new file mode 100644 index 0000000..0e28c0d --- /dev/null +++ b/sources/.travis.yml @@ -0,0 +1,19 @@ +language: php + +php: + - 5.2 + - 5.3 + - 5.4 + - 5.5 + - 5.6 + - 7.0 + +script: for i in `find . -name "*.php"`; do php -l $i; done; + +branches: + only: + - "master" + - "stable" + +notifications: + email: false diff --git a/sources/CHANGELOG.md b/sources/CHANGELOG.md new file mode 100644 index 0000000..821e9ed --- /dev/null +++ b/sources/CHANGELOG.md @@ -0,0 +1,286 @@ +Changelog of phpSysInfo +======================= + +http://phpsysinfo.sourceforge.net/ + +phpSysInfo 3.2.5 +---------------- + - [UPD] jQuery 2.2.0 and jQuery 1.12.0 + + - [ADD] Show network interfaces infos for NetBSD and OpenBSD + - [ADD] SHOW_NETWORK_INFOS_EXPANDED option + - [ADD] SHOW_MEMORY_INFOS_EXPANDED option + - [ADD] QTS, OpenMamba and HipServ to detected distros + - [ADD] SNMPups - monitoring UPS via SNMP + + - [NEW] reloading plugins also for frontend "bootstrap" + - [NEW] Network speed info on WinNT, Linux, Android, Darwin, NetBSD, OpenBSD and FreeBSD + - [NEW] Coretemp monitoring also on Linux + - [NEW] QTSsnmp - SNMP sensors monitoring for QTS Linux + - [NEW] Hwmon - sensors monitoring for Linux + - [NEW] SpeedFan - sensors monitoring for WinNT + - [NEW] Separate configuration sections for motherboard monitoring sensors programs + - [NEW] List of IP addresses of clients authorized to run + +phpSysInfo 3.2.4 +---------------- + - [ADD] Solus to detected distros + - [ADD] Uprecords plugin - MAX_ENTRIES option - maximum number of entries to show + + - [UPD] Refreshing status of all plugins for dynamic mode + - [UPD] bootstrap 3.3.6 + + - [NEW] language and template selection also for frontend "bootstrap" + + - [FIX] PHP 7 class Error issues + +phpSysInfo 3.2.3 +---------------- + - [UPD] jQuery 2.1.4 and jQuery 1.11.3 + - [UPD] bootstrap 3.3.5 + + - [NEW] I2C devices list on Android and Linux + + - [ADD] blue template + +phpSysInfo 3.2.2 +---------------- + - [UPD] bootstrap 3.3.4 + + - [NEW] Thunderbolt (TB) devices list on Darwin + + - [ADD] cleansyn template + - [ADD] PS plugin - support for Android + - [ADD] PS plugin - SHOW_KTHREADD_EXPANDED option + - [ADD] Qubes and HandyLinux to detected distros + + - [FIX] PS plugin - fixed display of the processes tree + +phpSysInfo 3.2.1 +---------------- + - [UPD] bootstrap 3.3.2 + + - [NEW] REFRESH parameter also for frontend "bootstrap" + + - [ADD] pfSense to detected distros + + - [FIX] Percentage memory usage + +phpSysInfo 3.2.0 +---------------- + - [UPD] jQuery 2.1.3 and jQuery 1.11.2 + + - [NEW] Frontend "bootstrap" with Bootstrap3 and Transparency (JSON) + + - [ADD] Catalan Translation ca.xml + - [ADD] Mer (core of Sailfish OS) and Tizen to detected distros + - [ADD] ThermalZone sensor support for Linux and Android + - [ADD] Temperature, voltage and current sensor for Banana Pi + + - [UPD] German Translation de.xml + +phpSysInfo 3.1.17 +---------------- + + - [UPD] BAT plugin - capacity unit, cycle count, FreeBSD support + - [UPD] Brazilian Portuguese Translation pt-br.xml + + - [ADD] Show the number of processes on Haiku + - [ADD] ThermalZone sensor support for WinNT + - [ADD] Tanglu to detected distros + - [ADD] Android and OS X version name + + - [FIX] Fixed display of treetables + +phpSysInfo 3.1.16 +---------------- + + - [ADD] Show the number of processes + - [ADD] Lunar and 4MLinux to detected distros + +phpSysInfo 3.1.15 +---------------- + + - [ADD] CoreOS and Pisi Linux to detected distros + - [ADD] pmset - UPS support on Darwin (thanks to pelletierr) + - [ADD] lspci support on Darwin + - [ADD] SHOW_CPULIST_EXPANDED option + - [ADD] lxc/docker detection on Linux + - [ADD] ability to hide all disks and all network interfaces + + - [FIX] Small CSS fix + + - [UPD] Memory informations on Darwin systems + - [UPD] BAT plugin - Darwin support + +phpSysInfo 3.1.14 +---------------- + + - [ADD] FreeIPMI sensor program support + - [ADD] IPMIutil sensor program support + - [ADD] PowerSoftPlus (EVER) UPS program support + - [ADD] Line frequency for the UPS info + - [ADD] SENSOR_EVENTS option - show events of sensors + - [ADD] HIDE_RAID_DEVICES option for plugins MDStatus and DMRaid - list of RAID devices to hide + - [ADD] idash template + +phpSysInfo 3.1.13 +---------------- + + - [UPD] jQuery 2.1.1 and jQuery 1.11.1 + - [UPD] Romanian Translation ro.xml + + - [ADD] SHOW_CPUINFO_EXPANDED option + - [ADD] Machine detection on WINNT, Linux, Android and Darwin systems + +phpSysInfo 3.1.12 +---------------- + + - [ADD] GoboLinux, UltimateEdition, BOSS, Canaima, VortexBox, KaOS and NixOS to detected distros + - [ADD] OpenHardwareMonitor sensor program support + - [ADD] Possibility to define multiple UPS_PROGRAM + - [ADD] UPS_NUT_LIST option + + - [FIX] Fixed incorrect network usage on FreeBSD + + - [UPD] SMART plugin - Smartctl --device option value setting method + +phpSysInfo 3.1.11 +---------------- + + - [ADD] Add Access-Control-Allow-Origin on XML (JSON) interface for Ajax Load PR#47 + - [ADD] Generations Linux and SliTaz to detected distros + - [ADD] IPMI and LMSensors currents information + - [ADD] Plugin IPMIInfo - added powers and currents values + - [ADD] Partial support of QNX + + - [FIX] Reduce execution time on Linux systems when showing load average PR#47 + +phpSysInfo 3.1.10 +---------------- + + - [ADD] Zenwalk and Raspbian to detected distros + + - [FIX] /etc/os-release Linux distro detection + +phpSysInfo 3.1.9 +---------------- + + - [NEW] New plugin DMRaid - software raid status + + - [ADD] Calculate, Tails, SMEServer, Semplice, SolydXK, Parsix, RedFlag, Amazon, Korora, OpenMandriva, SteamOS, ROSA Enterprise Server and ROSA Desktop Fresh to detected distros + + - [UPD] Rebuilding of the Linux distribution detection + - [UPD] jQuery 2.1.0 and jQuery 1.11.0 + +phpSysInfo 3.1.8 +---------------- + + - [ADD] Add printers messages in the XML output + - [ADD] PSStatus plugin - added optional regular expression search in the process name + - [ADD] RedHatEnterpriseClient distro icon #40 + - [ADD] Hebrew Translation he.xml + + - [FIX] BAT plugin - fix for old and new kernel /proc/acpi and /sys/class/power_supply + + - [UPD] LMSensors name for Mac hardware sensors + +phpSysInfo 3.1.7 +---------------- + + - [ADD] Ksplice support for Linux + - [ADD] Show CPU frequency max and min for Darwin (Mac OS X) + - [ADD] Show System Language and Code Page on Darwin (Mac OS X) + - [ADD] Show network interfaces infos for Minix and SunOS + - [ADD] SMS, gNewSense and Vector to detected distros + - [ADD] LMSensors power information + - [ADD] Battery installation date for the UPS info + + - [UPD] Network interfaces infos and filesystems infos for FreeBSD + - [UPD] Updated support of SunOS + - [UPD] Memory informations on Darwin systems + - [UPD] BAT plugin - updated Linux support + - [UPD] Updated HWSensors - OpenBSD sensor program + +phpSysInfo 3.1.6 +---------------- + + - [ADD] Porteus, Peppermint, Manjaro, Netrunner and Salix to detected distros + - [ADD] Show CPU frequency max for WINNT + - [ADD] Show network interfaces infos for Darwin (Mac OS X) + + - [UPD] SNMPPInfo plugin, ink level for some of the data + - [UPD] jQuery 2.0.3 and jQuery 1.10.2 + - [UPD] Russian Translation ru.xml + - [UPD] BAT plugin - WINNT support + + - [SEC] Fix JSONP + +phpSysInfo 3.1.5 +---------------- + + - [ADD] Possibility to define multiple SENSOR_PROGRAM + - [ADD] Added display of temperature and fan speed for IPMI sensor program + - [ADD] openSUSE and Eisfair to detected distros + - [ADD] Portuguese Translation pt-pt.xml + + - [FIX] Fixed incorrect display of the minimum fan speed + - [FIX] Fix recovery detection of RAID arrays on debian systems #18 + +phpSysInfo 3.1.4 +---------------- + + - [ADD] Option for reading the results of functions executeProgram() and rfts() from log + - [ADD] Show CPU frequency max and min for variable speed processors for Linux and Android + - [ADD] Filesystem usage warning on defined threshold FS_USAGE_THRESHOLD + + - [UPD] BAT plugin - added temperature, condition and type of battery, Android support + - [UPD] jQuery 2.0.2 and jQuery 1.10.1 + +phpSysInfo 3.1.3 +---------------- + + - [ADD] IPFire, Sabayon, PearOS, ClearOS, Frugalware, Fuduntu, Foresight, Tinycore, ALT Linux, ROSA Desktop Marathon and RedHatEnterpriseServer to detected distros + + - [UPD] Added "username" to filtered mount credentials + - [UPD] jQuery 2.0 coexistent with jQuery 1.9.1 for old Internet Explorer browser versions (IE 6/7/8) + + - [FIX] proc_open() malfunction on some PHP for Android by replacing by popen() + - [FIX] Run php-cs-fixer on php files (PSR-2 fixer) + +phpSysInfo 3.1.2 +---------------- + + - [ADD] Tempsensor and CPU frequency for Raspberry Pi (thanks to hawkeyexp) + - [ADD] Linaro to detected distros + - [ADD] Option for logging of functions executeProgram() and rfts() + - [ADD] Add support of JSONP + + - [FIX] Incorrect display of chunk size for the plugin mdstatus for some results + +phpSysInfo 3.1.1 +---------------- + + - [ADD] SolusOS, Deepin and antiX to detected distros + - [ADD] Simplified Chinese translation + + - [UPD] jQuery 1.9.1 + +phpSysInfo 3.1.0 +---------------- + + - [NEW] Configuration moved from config.php and subdirs of "plugins" to one file phpsysinfo.ini + + - [ADD] Turbolinux, Oracle Linux, CloudLinux, PCLinuxOS, StartOS, Trisquel, CRUX, Slax, Pear, Android, Zorin and elementary OS to detected distros + - [ADD] Show System Language and Code Page on Linux, Haiku and WINNT + - [ADD] Minor support of ReactOS + - [ADD] apcupsd-cgi support (thanks to duhast) + + - [UPD] Plugin ipmi renamed to IPMIInfo and Update-Notifier to UpdateNotifier (to avoid name conflicts) + - [UPD] Case-insensitive for most of parameters + - [UPD] Detection of Mac OS X and Linux distribution + - [UPD] CPU detection on Mac OS X + + - [FIX] Fixed UTF8 encoding for Linux + - [FIX] SMART plugin doesn't display for some results + - [FIX] Incorrect display of mountpoint on Mac OS X diff --git a/sources/COPYING b/sources/COPYING new file mode 100644 index 0000000..fd94e16 --- /dev/null +++ b/sources/COPYING @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/sources/Dockerfile b/sources/Dockerfile new file mode 100644 index 0000000..5b62375 --- /dev/null +++ b/sources/Dockerfile @@ -0,0 +1,26 @@ +# phpSysInfo +# VERSION 2 + +FROM ubuntu:14.04 + +MAINTAINER phpSysInfo + +# Update sources +RUN echo "deb http://archive.ubuntu.com/ubuntu trusty main universe" > /etc/apt/sources.list +RUN apt-get update + +RUN apt-get install -y apache2 php5 git pciutils + +RUN git clone https://github.com/phpsysinfo/phpsysinfo.git /var/www/html/phpsysinfo +#RUN cp /var/www/html/phpsysinfo/phpsysinfo.ini.new /var/www/html/phpsysinfo/phpsysinfo.ini +RUN cat /var/www/html/phpsysinfo/phpsysinfo.ini.new | sed 's/^LOAD_BAR=false/LOAD_BAR=true/' >/var/www/html/phpsysinfo/phpsysinfo.ini + +ENV APACHE_RUN_USER www-data +ENV APACHE_RUN_GROUP www-data +ENV APACHE_LOG_DIR /var/log/apache2 +ENV APACHE_LOCK_DIR /var/lock/apache2 +ENV APACHE_PID_FILE /var/run/apache2/apache2.pid + +CMD ["/usr/sbin/apache2", "-D", "FOREGROUND"] + +EXPOSE 80 diff --git a/sources/README.md b/sources/README.md new file mode 100644 index 0000000..18c32f1 --- /dev/null +++ b/sources/README.md @@ -0,0 +1,121 @@ +phpSysInfo +============== + +* Copyright (c), 1999-2008, Uriah Welcome (precision@users.sf.net) +* Copyright (c), 1999-2009, Michael Cramer (bigmichi1@users.sf.net) +* Copyright (c), 2007-2008, Audun Larsen (xqus@users.sf.net) +* Copyright (c), 2007-2015, Erkan Valentin +* Copyright (c), 2009-2016, Mieczyslaw Nalewaj (namiltd@users.sf.net) +* Copyright (c), 2010-2012, Damien Roth (iysaak@users.sf.net) + + + +CURRENT TESTED PLATFORMS +------------------------ + +- Linux 2.6.x +- FreeBSD 7.x +- OpenBSD 2.8+ +- NetBSD +- DragonFly +- HP-UX +- Darwin/OSX +- Windows 2000 / XP / 2003 / Vista / 2008 / 7 / 2011 / 2012 / 8 / 8.1 / 10 +- Android +- > PHP 5.2 or later (partial PHP 5.1.3 compatibility) + - With PCRE, XML, XSL, MBString and SimpleXML extension. + +####Platforms currently in progress: +- Haiku +- Minix +- SunOS +- ReactOS +- IBM AIX +- QNX + +If your platform is not here try checking out the mailing list archives or +the message boards on SourceForge. + +INSTALLATION AND CONFIGURATION +------------------------------ + +####Typical installation + +Just decompress and untar the source (which you should have done by now, +if you're reading this...), into your webserver's document root. + +There is a configuration file called phpsysinfo.ini.new. If this a brand new +installation, you should copy this file to phpsysinfo.ini and edit it. + +- make sure your `php.ini` file's `include_path` entry contains "." +- make sure your `php.ini` has `safe_mode` set to 'off'. + +phpSysInfo require php-xml extension. + +Please keep in the mind that because phpSysInfo requires access to many +files in `/proc` and other system binary you **MUST DISABLE** `php's safe_mode`. +Please see the PHP documentation for information on how you +can do this. + +That's it. Restart your webserver (if you changed php.ini), and voila. + +####Docker container installation + +- sudo docker build -t phpsysinfo github.com/phpsysinfo/phpsysinfo +- sudo docker run -i -p 8080:80 -t phpsysinfo +- go to http://localhost:8080/phpsysinfo/ + +KNOWN PROBLEMS +-------------- + +- phpSysInfo is not compatible with SELinux Systems +- small bug under FreeBSD with memory reporting + +PLATFORM SPECIFIC ISSUES +------------------------ + +####Windows with IIS + On Windows systems we get our informations through the WMI interface. + If you run phpSysInfo on the IIS webserver, phpSysInfo will not connect + to the WMI interface for security reasons. At this point you MUST set + an authentication mechanism for the directory in the IIS admin + interface for the directory where phpSysInfo is installed. Then you + will be asked for an user and a password when opening the page. At this + point it is necassary to log in with an user that will be able to + connect to the WMI interface. If you use the wrong user and/or password + you might get an "ACCESS DENIED ERROR". + +SENSOR RELATED INFORMATION +--------------------------- + +####MBM5 + Make sure you set MBM5 Interval Logging to csv and to the data + directory of phpSysInfo. The file must be called MBM5. Also make sure + MBM5 doesn't add symbols to the values. This is a Quick MBM5 log parser, + need more csv logs to make it better. + +WHAT TO DO IF IT DOESN'T WORK +----------------------------- + +First make sure you've read this file completely, especially the +"INSTALLATION AND CONFIGURATION" section. If it still doesn't work then +you can: + +Submit a bug on SourceForge (preferred) (http://sourceforge.net/projects/phpsysinfo/) + +Ask for help in the forum (http://sourceforge.net/projects/phpsysinfo/) + +***!! If you have any problems, please set `DEBUG` to true in `phpsysinfo.ini` +and include any error messages in your bug report / help request !!*** + +OTHER NOTES +----------- + +If you have a great idea or want to help out, just drop by the project +page at SourceForge (http://sourceforge.net/projects/phpsysinfo/). + +LICENSING +--------- + +This program and all associated files are released under the GNU Public +License, see [COPYING](COPYING) for details. diff --git a/sources/README_PLUGIN.md b/sources/README_PLUGIN.md new file mode 100644 index 0000000..26140ac --- /dev/null +++ b/sources/README_PLUGIN.md @@ -0,0 +1,134 @@ +phpSysInfo 3.1 - http://phpsysinfo.sourceforge.net/ +=================================================== + +Document written by Michael Cramer (bigmichi1 at sourceforge.net) + +!!Please read if you want to develop a plugin to understand our plugin system!! + + +Plugins +------- + +Beginning with phpSysInfo 3.0, phpSysInfo can be extended by Plugins. So here is +a description that a developer of a plugin must take care of. Plugins can be +enabled through the `phpsysinfo.ini` in the PLUGINS variable. The name of the +plugin is essential for the function of the plugin system. Lets say you write a +plugin with the name 'hdd_stats', then this name is added to the PLUGINS +variable in `phpsysinfo.ini`. And this is also then the name which is everywhere in +the plugin system used, like creating the object, locate the needed files and +so on. + +So if the name is now specified, phpSysInfo needs a special directory structure +to find the needed files. The directory structure for the example `hdd_stats` +plugin can be seen here: + +``` +-+ phpSysInfo root + | + +---+ plugins (directory in that plugins are installed) + | | + | +---+ hdd_stats (the real plugin directory, must have the same name like + | | | the plugin named in PLUGINS, else it won't be found) + | | | + | | +---+ js (directory in which the needed JavaScript file is located, + | | | | to generate the html output out of the xml) + | | | # hdd_stats.js (the js file must have the same name, like the + | | | plugin in PSI_PLUGINS with the extension js) + | | +---+ css (directory in which the needed style sheet information are + | | | | located, can exists, but it's up to the author) + | | | # hdd_stats.css (the css file must have the same name, like the + | | | plugin in PSI_PLUGINS with the extension css) + | | +---+ lang (directory where translations for the plugin are located) + | | | | + | | | # en.xml (at least an english translation file must exist) + | | | + | | # class.hdd_stats.inc.php (this is the core file of the plugin, + | | name must consists of 'class' + + | | name from PSI_PLUGINS + '.inc.php') +``` + +other files or directorys can be included in the plugin directory, but then +its up to the developer to include them in the plugin. So it might be possible +to have a 'gfx' directory in which some pics are located that are used in the +output. + +If the directory structure is build up, then it's time to start programming. + +Files +----- + +An example implementation is the mdstat plugin, which is shipped with phpSysInfo + +* en.xml - at least this file must exist to get the translation working, and the + the first entry in this file is normally the headline of the plugin. + So one translation migth exists everytime. Other translation files + are also in the same directory like the `en.xml` file. + The id's specified in the translation file SHOULD have the following + look `plugin_hdd_status_001`. First we say that this is a plugin + translation, then the name of plugin and at last a increasing number + for each translation. Please create your id's in that way, so that + other plugins don't redefine your translations. At the time of writing + this, there is no check to verify the id's, so be carfull. + +* hdd_stats.css - here can all custom style sheet informations written down. The + names of the id's and classes SHOULD also begin, like the translation + id's, with `'plugin_' + pluginname`. If thats not the case it might be + possible that another plugin is overwriting your css definitions. + +* class.hdd_stats.inc.php - this file MUST include a class with the plugin name + and also this class MUST extend the 'psi_plugin' class. A check that + such a class exist and also extends 'psi_plugin' will be included in + the near future. And if the check fails the plugin won't be loaded. + The psi_plugin class checks the existens of the js and the en.xml + files. Also an extra configuration of the plugin is loaded + automatically from `phpsysinfo.ini`, if present. + Through the extension of the psi_plugin class there is a need to + include at least two public function. These are the execute() function + and the xml() function. Other functions can be exist, that depends on + the plugin needs or the author of the class. The execute() function is + called to get the required information that should be later included + in the xml file. The xml() function is called when the xml output + should be generated. This function must return a simplexml object. This + object is then included in another xml at the right position or as a + standalone xml. So there is no need to do some special things, only + create a xml object for the plugin. + +* hdd_stats.js - this file is called when the page is loaded. A block for the + plugin is automatically created. This one is a div container with the + id `'plugin_'+ pluginname ("plugin_hdd_stats")`. The entire output must be + placed in that container. + There is a helper function for creating the headline: buildBlock() that + can be called. This function returns a string with the html code of the + headline, this code can then be appended to the plugin block. The + generated headline can provide a reload icon for an ajax request. Only + the click action of that icon must be created. The id of this icon is + `'reload_' + pluginname + 'Table' ("reload_hdd_statsTable")`. + Everything that then is done to get the html output out of the xml is up + to the author. + To get the xml document the ajax request url is `'xml.php?plugin=' + + pluginname (xml.php?plugin=hdd_stats)`. This xml includes only the xml + from the plugin nothing more. + The last two executed commands should/must be the translation call and + the unhide of the filled div container. + The translation function that needs to be called is named + plugin_traslate() with one argument, that is the pluginname like in + `PSI_PLUGINS (plugin_translate("hdd_stats");)`. + To unhide the filled container call the .show() function of it. + `$("plugin_" + pluginname).show() ($("plugin_hdd_stat").show())`. + +FAQ +--- + +Q: Is the plugin system ready to use? + +A: It can be used, but it might change slightly in the future, if there are some + special needs. + +SUGGESTION +---------- + +If anybody out there has some suggestions in improving the plugin system let us +know. We are looking forward to get some feedback, suggestions and patches and +more. Feel free to contact us on our website: http://phpsysinfo.sourceforge.net. + +$Id: README_PLUGIN 463 2011-04-19 17:34:41Z namiltd $ diff --git a/sources/composer.json b/sources/composer.json new file mode 100644 index 0000000..9930640 --- /dev/null +++ b/sources/composer.json @@ -0,0 +1,18 @@ +{ + "name": "phpsysinfo/phpsysinfo", + "description": "phpSysInfo is a customizable PHP Script that parses /proc, and formats information nicely. It will display information about system facts like Uptime, CPU, Memory, PCI devices, SCSI devices, IDE devices, Network adapters, Disk usage, and more.", + "license": "GPL", + "homepage": "http://phpsysinfo.github.io/phpsysinfo/", + "require": { + "php": ">=5.2.0", + "ext-simplexml": "*", + "ext-pcre": "*", + "ext-xml": "*", + "ext-dom": "*" + }, + "suggest": { + "ext-mbstring": "Required for *nix non UTF-8 systems", + "ext-com_dotnet": "Required for Windows environments", + "ext-xsl": "Required for static mode" + } +} diff --git a/sources/data/ModelTranslation.txt b/sources/data/ModelTranslation.txt new file mode 100644 index 0000000..dfa05e1 --- /dev/null +++ b/sources/data/ModelTranslation.txt @@ -0,0 +1,143 @@ +ADP2,1:Developer Transition Kit:Intel Pentium 4 +iMac,1:iMac G3:PowerPC 750 (G3) +iMac1,1:iMac G3*:PowerPC 750 (G3) +iMac4,1:iMac Core Duo:Intel Core Duo T2400/T2500 +iMac4,2:iMac Core Duo:Intel Core Duo T2400 +iMac5,1:iMac Core 2 Duo:Intel Core 2 Duo T7200/T7400/T7600 +iMac5,2:iMac Core 2 Duo:Intel Core 2 Duo T5600 +iMac6,1:iMac Core 2 Duo:Intel Core 2 Duo T7400/T7600 +iMac7,1:iMac Core 2 Duo/Extreme:Intel Core 2 Duo T7300/T7700/X7900 +iMac8,1:iMac Core 2 Duo:Intel Core 2 Duo E8135/E8335/E8235/E8435 +iMac9,1:iMac Core 2 Duo:Intel Core 2 Duo P7350/P7550/E8135/E8335/E8435 +iMac10,1:iMac Core 2 Duo:Intel Core 2 Duo E7600/E8600 +iMac10,2:iMac Core 2 Duo*:Intel Core 2 Duo E7500/E7600/E8600 +iMac11,1:iMac Core i5/i7:Intel Core I5-750/I7-860 +iMac11,2:iMac Core i3/i5:Intel Core I3-540/I3-550/I5-680 +iMac11,3:iMac Core i3/i5/i7:Intel Core I3-550/I5-760/I5-680/I7-870 +iMac12,1:iMac Core i3/i5/i7:Intel Core I3-2100/I5-2400S/I5-2500S/I5-2600S +iMac12,2:iMac Core i5/i7:Intel Core I5-2400/I5-2500S/I7-2600 +iMac13,1:iMac Core i3/i5/i7:Intel Core I3-3225/I5-3335S/I5-3470S/I7-3770S +iMac13,2:iMac Core i5/i7:Intel Core I5-3470/I5-3470S/I7-3770 +iMac14,1:iMac Core i5:Intel Core I5-4570R +iMac14,2:iMac Core i5/i7:Intel Core I5-4570/I5-4670/I7-4771 +iMac14,3:iMac Core i5/i7:Intel Core I5-4570S/I7-4770S +M43ADP1,1:Development Mac Pro:Intel Xeon X5340 +MacBook1,1:MacBook Core Duo:Intel Core Duo T2400/T2500 +MacBook2,1:MacBook Core 2 Duo:Intel Core 2 Duo T5600/T7200/T7400 +MacBook3,1:MacBook Core 2 Duo:Intel Core 2 Duo T7300/T7500 +MacBook4,1:MacBook Core 2 Duo:Intel Core 2 Duo T8100/T8300 +MacBook5,1:MacBook Core 2 Duo:Intel Core 2 Duo P7350/P8600 +MacBook5,2:MacBook Core 2 Duo:Intel Core 2 Duo P7350/P7450 +MacBook6,1:MacBook Core 2 Duo:Intel Core 2 Duo P7550 +MacBook7,1:MacBook Core 2 Duo:Intel Core 2 Duo P8600 +MacBookAir1,1:MacBook Air Core 2 Duo:Intel Core 2 Duo P7500/P7700 +MacBookAir2,1:MacBook Air Core 2 Duo:Intel Core 2 Duo SL9300/SL9400/SL9600 +MacBookAir3,1:MacBook Air Core 2 Duo:Intel Core 2 Duo SU9400/SU9600 +MacBookAir3,2:MacBook Air Core 2 Duo:Intel Core 2 Duo SL9400/SL9600 +MacBookAir4,1:MacBook Air Core i5/i7:Intel Core I5-2467M/I7-2677M +MacBookAir4,2:MacBook Air Core i5/i7:Intel Core I5-2467M/I5-2557M/I7-2677M +MacBookAir5,1:MacBook Air Core i5/i7:Intel Core I5-3317U/I7-3667U +MacBookAir5,2:MacBook Air Core i5/i7:Intel Core I5-3427U/I7-3667U +MacBookAir6,1:MacBook Air Core i5/i7:Intel Core I5-4250U/I5-4260U/I7-4650U +MacBookAir6,2:MacBook Air Core i5/i7:Intel Core I5-4250U/I5-4260U/I7-4650U +MacBookPro1,1:MacBook Pro Core Duo:Intel Core Duo L2400/T2400/T2500/T2600 +MacBookPro1,2:MacBook Pro Core Duo:Intel Core Duo T2600 +MacBookPro2,1:MacBook Pro Core 2 Duo:Intel Core 2 Duo T7600 +MacBookPro2,2:MacBook Pro Core 2 Duo:Intel Core 2 Duo T7400/T7600 +MacBookPro3,1:MacBook Pro Core 2 Duo:Intel Core 2 Duo T7500/T7700/T7800 +MacBookPro4,1:MacBook Pro Core 2 Duo:Intel Core 2 Duo T8300/T9300/T9500 +MacBookPro5,1:MacBook Pro Core 2 Duo:Intel Core 2 Duo P8600/T9400/T9550/T9600/T9800 +MacBookPro5,2:MacBook Pro Core 2 Duo:Intel Core 2 Duo T9550/T9600/T9800/T9900 +MacBookPro5,3:MacBook Pro Core 2 Duo:Intel Core 2 Duo P8800/T9600/T9900 +MacBookPro5,4:MacBook Pro Core 2 Duo:Intel Core 2 Duo P8700 +MacBookPro5,5:MacBook Pro Core 2 Duo:Intel Core 2 Duo P8400/P8700 +MacBookPro6,1:MacBook Pro Core i5/i7:Intel Core I5-540M/I7-620M/I7-640M +MacBookPro6,2:MacBook Pro Core i5/i7:Intel Core I5-520M/I5-540M/I7-620M/I7-640M +MacBookPro7,1:MacBook Pro Core 2 Duo:Intel Core 2 Duo P8600/P8800 +MacBookPro8,1:MacBook Pro Core i5/i7:Intel Core I5-2415M/I5-2435M/I7-2620M/I7-2640M +MacBookPro8,2:MacBook Pro Core i7:Intel Core I7-2635QM/I7-2720QM/I7-2675QM/I7-2820QM/I7-2760QM/I7-2860QM +MacBookPro8,3:MacBook Pro Core i7:Intel Core I7-2720QM/I7-2820QM/I7-2760QM/I7-2860QM +MacBookPro9,1:MacBook Pro Core i7:Intel Core I7-3615QM/I7-3720QM/I7-3820QM +MacBookPro9,2:MacBook Pro Core i5/i7:Intel Core I5-3210M/I7-3520M +MacBookPro10,1:MacBook Pro Core i7:Intel Core I7-3615QM/I7-3635QM/I7-3720QM/I7-3740QM/I7-3820QM/I7-3840QM +MacBookPro10,2:MacBook Pro Core i5/i7:Intel Core I5-3210M/I5-3230M/I7-3520M/I7-3540M +MacBookPro11,1:MacBook Pro Core i5/i7:Intel Core I5-4258U/I5-4288U/I7-4558U +MacBookPro11,2:MacBook Pro Core i7:Intel Core I7-4750HQ/I7-4850HQ/I7-4960HQ +MacBookPro11,3:MacBook Pro Core i7:Intel Core I7-4850HQ/I7-4960HQ +Macmini1,1:Mac mini Core Solo/Duo:Intel Core Duo T2300/T2400 Solo T1200 +Macmini2,1:Mac mini Core 2 Duo:Intel Core 2 Duo T5600/T7200 +Macmini3,1:Mac mini Core 2 Duo:Intel Core 2 Duo P7350/P8400/P7550/P8700/P8800 +Macmini4,1:Mac mini Core 2 Duo:Intel Core 2 Duo P8600/P8800 +Macmini5,1:Mac mini Core i5:Intel Core I5-2415M +Macmini5,2:Mac mini Core i5/i7:Intel Core I5-2520M/I7-2620M +Macmini5,3:Mac mini Core i7:Intel Core I7-2635QM +Macmini6,1:Mac mini Core i5:Intel Core I5-3210M +Macmini6,2:Mac mini Core i7:Intel Core i7 I7-3615QM/I7-3720QM +MacPro1,1:Mac Pro Quad Core:Intel Xeon 5130/5150/5160 +MacPro2,1:Mac Pro Eight Core:Intel Xeon X5365 +MacPro3,1:Mac Pro Quad/Eight Core:Intel Xeon E5462/E5472/X5482 +MacPro4,1:Mac Pro Quad/Eight Core:Intel Xeon E5520/E5550/X5570/W3520/W3540/W3580 +MacPro5,1:Mac Pro Quad/Six/Eight/Twelve Core:Intel Xeon E5620/E5645/W3530/W3565/W3680/X5650/X5670/X5675 +MacPro6,1:Mac Pro Quad/Six/Eight/Twelve Core:Intel Xeon E5-1620v2/E5-1650v2/E5-1680v2/E5-2697v2 +PowerBook1,1:PowerBook G3:PowerPC 750 (G3) +PowerBook2,1:iBook G3:PowerPC 750 (G3) +PowerBook2,2:iBook G3:PowerPC 750cx (G3) +PowerBook2,3:iBook G3*:PowerPC 750cx (G3) +PowerBook2,4:iBook G3*:PowerPC 750cx (G3) +PowerBook3,1:PowerBook G3:PowerPC 750 (G3) +PowerBook3,2:PowerBook G4:PowerPC 7410 (G4) +PowerBook3,3:PowerBook G4:PowerPC 7440 (G4) +PowerBook3,4:PowerBook G4:PowerPC 7451 (G4) +PowerBook3,5:PowerBook G4:PowerPC 7455 (G4) +PowerBook4,1:iBook G3:PowerPC 750cx (G3) +PowerBook4,2:iBook G3 600:PowerPC 750cx (G3) +PowerBook4,3:iBook G3:PowerPC 750fx (G3) +PowerBook5,1:PowerBook G4:PowerPC 7455 (G4) +PowerBook5,2:PowerBook G4:PowerPC 7447 (G4) +PowerBook5,3:PowerBook G4:PowerPC 7447 (G4) +PowerBook5,4:PowerBook G4:PowerPC 7447a (G4) +PowerBook5,5:PowerBook G4:PowerPC 7447a (G4) +PowerBook5,6:PowerBook G4:PowerPC 7447a (G4) +PowerBook5,7:PowerBook G4:PowerPC 7447a (G4) +PowerBook5,8:PowerBook G4:PowerPC 7447a (G4) +PowerBook5,9:PowerBook G4:PowerPC 7447a (G4) +PowerBook6,1:PowerBook G4:PowerPC 7455 (G4) +PowerBook6,2:PowerBook G4:PowerPC 7447 (G4) +PowerBook6,3:iBook G4:PowerPC 7457 (G4) +PowerBook6,4:PowerBook G4:PowerPC 7447a (G4) +PowerBook6,5:iBook G4:PowerPC 7447a (G4) +PowerBook6,7:iBook G4:PowerPC 7447a (G4) +PowerBook6,8:PowerBook G4:PowerPC 7447a (G4) +PowerMac1,1:Power Macintosh/Mac Server G3:PowerPC 750 (G3) +PowerMac1,2:Power Macintosh G4:PowerPC 7400 (G4) +PowerMac2,1:iMac G3:PowerPC 750 (G3) +PowerMac2,2:iMac G3:PowerPC 750 (G3) +PowerMac3,1:Power Macintosh/Mac Server G4:PowerPC 7400 (G4) +PowerMac3,2:Power Macintosh/Mac Server G4*:PowerPC 7400 (G4) +PowerMac3,3:Power Macintosh/Mac Server G4:PowerPC 7400 (G4) +PowerMac3,4:Power Macintosh/Mac Server G4:PowerPC 7410 (G4) +PowerMac3,5:Power Macintosh/Mac Server G4:PowerPC 7450/7455 (G4) +PowerMac3,6:Power Macintosh/Mac Server G4:PowerPC 7455 (G4) +PowerMac4,1:iMac G3:PowerPC 750/750cx (G3) +PowerMac4,2:iMac G4:PowerPC 7441/7445 (G4) +PowerMac4,4:eMac G4:PowerPC 7441/7445 (G4) +PowerMac4,5:iMac G4:PowerPC 7445 (G4) +PowerMac5,1:Power Macintosh G4 Cube:PowerPC 7400 (G4) +PowerMac6,1:iMac G4:PowerPC 7445 (G4) +PowerMac6,3:iMac G4:PowerPC 7445 (G4) +PowerMac6,4:eMac G4:PowerPC 7447a (G4) +PowerMac7,2:Power Macintosh G5:PowerPC 970 (G5) +PowerMac7,3:Power Macintosh G5:PowerPC 970fx (G5) +PowerMac8,1:iMac G5:PowerPC 970 (G5) +PowerMac8,2:iMac G5:PowerPC 970 (G5) +PowerMac9,1:Power Macintosh G5:PowerPC 970fx (G5) +PowerMac10,1:Mac mini G4:PowerPC 7447a (G4) +PowerMac10,2:Mac mini G4:PowerPC 7447a (G4) +PowerMac11,2:Power Macintosh G5 Dual/Quad Core:PowerPC 970MP (G5) +PowerMac12,1:iMac G5:PowerPC 970fx (G5) +RackMac1,1:Xserve G4:PowerPC 7455 (G4) +RackMac1,2:Xserve G4:PowerPC 7455 (G4) +RackMac3,1:Xserve G5:PowerPC 970fx (G5) +Xserve1,1:Xserve Xeon Quad Core:Intel Xeon 5130/5150/5160 +Xserve2,1:Xserve Xeon Quad/Eight Core:Intel Xeon E5462/E5472 +Xserve3,1:Xserve Xeon Nehalem Quad/Eight Core:Intel Xeon E5520/E5550/E5570 diff --git a/sources/data/distros.ini b/sources/data/distros.ini new file mode 100644 index 0000000..520f8d2 --- /dev/null +++ b/sources/data/distros.ini @@ -0,0 +1,827 @@ +; linux-distros.ini - Defines known linux distros for phpSysInfo. +; http://phpsysinfo.sourceforge.net/ +; $Id: distros.ini 709 2012-12-05 11:20:40Z namiltd $ +; + +[GoboLinux] +Image = "Gobo.png" +Name = "GoboLinux" +Files = "/etc/GoboLinuxVersion" + +[SliTaz] +Image = "SliTaz.png" +Name = "SliTaz" +Files = "/etc/slitaz-release" + +[eisfair project] +Image = "Eisfair.png" +Files = "/etc/eisfair-system" +Files2 = "/etc/version" +;detected in "lsb_release -a" + +[TinyCore] +Image = "TinyCore.png" +Name = "Tiny Core Linux" +Files = "/usr/share/doc/tc/release.txt" + +[Frugalware] +Image = "Frugalware.png" +Files = "/etc/frugalware-release" +;detected in "/etc/os-release" + +[antiX] +Image = "antiX.png" +Files = "/etc/antix-version" +;wrong in "/etc/os-release" Debian GNU/Linux +;wrong in "/etc/debian_version" Debian + +[IPFire] +Image = "IPFire.png" +;detected in "/etc/system-release" + +[QTS] +Image = "QTS.png" +Name = "QTS" +;detected in "/etc/config/uLinux.conf" + +[4MLinux] +Image = "4MLinux.png" +Name = "4MLinux" +Files = "/etc/4MLinux-version" + +[Lunar Linux] +Image = "Lunar.png" +;detected in "/etc/lsb-release" +;detected in "/etc/os-release" + +[CRUX] +Image = "Crux.png" +Mode = "Execute" +Files = "/usr/bin/crux" + +[Foresight] +Image = "Foresight.png" +;detected in "/etc/distro-release" + +[Trustix] +Image = "Trustix.png" +Files = "/etc/trustix-release;/etc/trustix-version" + +[NixOS] +Image = "NixOS.png" +;detected in "/etc/os-release" + +[FreeEOS] +Image = "free-eos.png" +Files = "/etc/eos-version" + +[generations] +Image = "Generations.png" +;detected in "lsb_release -a" +;detected in "/etc/lsb-release" + +[Generations Linux] +Image = "Generations.png" +;detected in "/etc/os-release" + +[Manjaro Linux] +Image = "Manjaro.png" +Files = "/etc/manjaro-release" +;detected in "/etc/os-release" + +[ManjaroLinux] +Image = "Manjaro.png" +;detected in "lsb_release -a" +;detected in "/etc/lsb-release" + +[Arch Linux] +Image = "Arch.png" +Files = "/etc/arch-release" +;detected in "/etc/os-release" + +[Arch] +Image = "Arch.png" +;detected in "lsb_release -a" +;detected in "/etc/lsb-release" + +[Cobalt] +Image = "Cobalt.png" +Files = "/etc/cobalt-release" + +[LinuxFromScratch] +Image = "LFS.png" +Files = "/etc/lfs-release" + +[Rubix] +Image = "Rubix.png" +Files = "/etc/rubix-version" + +[Tails] +Image = "Tails.png" +;detected in "/etc/os-release" +;wrong in "/etc/debian_version" Debian + +[Tanglu] +Image = "Tanglu.png" +;detected in "lsb_release -a" +;detected in "/etc/lsb-release" +;wrong in "/etc/debian_version" Debian + +[Tanglu GNU/Linux] +Image = "Tanglu.png" +;detected in "/etc/os-release" + +[Mer] +Image = "Mer.png" +Mode = "Analyse" +Files = "/etc/mer-release;/etc/meego-release;/etc/moblin-release" +;detected in "lsb_release -a" +;detected in "/etc/system-release" + +[KaOS] +Image = "KaOS.png" +Files = "/etc/KaOS-release" +;detected in "lsb_release -a" +;detected in "/etc/lsb-release" +;detected in "/etc/os-release" + +[openmamba] +Image = "OpenMamba.png" +Files = "/etc/openmamba-release" +;detected in "lsb_release -a" +;detected in "/etc/lsb-release" +;detected in "/etc/os-release" +;detected in "/etc/system-release" + +[CoreOS] +Image = "CoreOS.png" +;detected in "/etc/lsb-release" +;detected in "/etc/os-release" + +[BOSS] +Image = "BOSS.png" +Name = "BOSS GNU/Linux" +Files = "/etc/boss_version" +;detected in "lsb_release -a" +;wrong in "/etc/debian_version" Debian + +[BOSS GNU/Linux] +Image = "BOSS.png" +;detected in "/etc/os-release" + +[BOSS Server Beta] +Image = "BOSS.png" +;detected in "lsb_release -a" + +[Solus] +Image = "Solus.png" +Files = "/etc/solus-release" +;detected in "lsb_release -a" +;detected in "/etc/lsb-release" + +[Solus Operating System] +Image = "Solus.png" +;detected in "/etc/os-release" + +[Canaima] +Image = "Canaima.png" +Name = "Canaima GNU/Linux" +Files = "/etc/canaima_version" +;detected in "lsb_release -a" +;wrong in "/etc/debian_version" Debian + +[Canaima GNU/Linux] +Image = "Canaima.png" +;detected in "/etc/os-release" + +[Semplice] +Image = "Semplice.png" +Name = "Semplice" +Files = "/etc/semplice_version" +;detected in "lsb_release -a" +;detected in "/etc/lsb-release" +;detected in "/etc/os-release" +;wrong in "/etc/debian_version" Debian + +[SolydXK] +Image = "SolydXK.png" +;detected in "lsb_release -a" +;detected in "/etc/lsb-release" +;detected in "/etc/solydxk/info" +;wrong in "/etc/os-release" Debian GNU/Linux +;wrong in "/etc/debian_version" Debian + +[HandyLinux] +Image = "Handy.png" +Files = "/etc/handylinux_version" +;detected in "lsb_release -a" +;wrong in "/etc/os-release" Debian GNU/Linux +;wrong in "/etc/debian_version" Debian + +[Parsix] +Image = "Parsix.png" +Files = "/etc/parsix-version" +;detected in "lsb_release -a" +;detected or wrong version in "/etc/os-release" | Parsix 4.0 +;wrong in "/etc/debian_version" Debian + +[Linaro] +Image = "Linaro.png" +;detected in "lsb_release -a" +;detected in "/etc/lsb-release" +;detected in "/etc/os-release" +;wrong in "/etc/debian_version" Debian + +[LinuxDeepin] +Image = "Deepin.png" +;detected in "lsb_release -a" +;detected in "/etc/lsb-release" +;wrong in "/etc/os-release" Debian GNU/Linux +;wrong in "/etc/debian_version" Debian + +[Ultimate_Edition] +Image = "UltimateEdition.png" +;detected in "lsb_release -a" +;detected in "/etc/lsb-release" +;detected in "/etc/os-release" +;wrong in "/etc/debian_version" Debian + +[elementary OS] +Image = "elementaryOS.png" +;detected in "lsb_release -a" +;detected in "/etc/lsb-release" +;detected in "/etc/os-release" +;wrong in "/etc/debian_version" Debian + +[PearLinux] +Image = "Pear.png" +;detected in "lsb_release -a" +;detected in "/etc/lsb-release" +;wrong in "/etc/os-release" Ubuntu +;wrong in "/etc/debian_version" Debian + +[Pear Linux] +Image = "Pear.png" +;detected in "lsb_release -a" +;detected in "/etc/lsb-release" +;wrong in "/etc/os-release" Ubuntu +;wrong in "/etc/debian_version" Debian + +[PearOS] +Image = "Pear.png" +;detected in "lsb_release -a" +;detected in "/etc/lsb-release" +;wrong in "/etc/os-release" Ubuntu +;wrong in "/etc/debian_version" Debian + +[SolusOS] +Image = "SolusOS.png" +Files = "/etc/solusos_version" +;detected in "lsb_release -a" +;detected in "/etc/lsb-release" +;wrong in "/etc/os-release" Debian GNU/Linux +;wrong in "/etc/debian_version" Debian + +[LinuxMint] +Image = "Mint.png" +;detected in "lsb_release -a" +;detected in "/etc/lsb-release" +;wrong in "/etc/os-release" Ubuntu +;wrong in "/etc/debian_version" Debian + +[Trisquel] +Image = "Trisquel.png" +;detected in "lsb_release -a" +;detected in "/etc/lsb-release" +;wrong in "/etc/os-release" Ubuntu +;wrong in "/etc/debian_version" Debian + +[Zorin] +Image = "Zorin.png" +;detected in "lsb_release -a" +;detected in "/etc/lsb-release" +;wrong or almost in "/etc/os-release" Ubuntu | Zorin OS +;wrong in "/etc/debian_version" Debian + +[Zorin OS] +Image = "Zorin.png" +;detected in "/etc/os-release" +;wrong in "/etc/debian_version" Debian + +[Netrunner] +Image = "Netrunner.png" +;detected in "lsb_release -a" +;detected in "/etc/lsb-release" +;detected in "/etc/os-release" +;wrong in "/etc/debian_version" Debian + +[NetrunnerSE] +Image = "Netrunner.png" +;detected in "lsb_release -a" +;detected in "/etc/lsb-release" +;wrong in "/etc/debian_version" Debian + +[Netrunner Rolling] +Image = "Netrunner.png" +;detected in "/etc/os-release" +;wrong in "/etc/manjaro-release" Manjaro + +[Peppermint] +Image = "Peppermint.png" +;detected in "lsb_release -a" +;detected in "/etc/lsb-release" +;detected in "/etc/os-release" +;wrong in "/etc/debian_version" Debian + +[Ubuntu] +Image = "Ubuntu.png" +;detected in "lsb_release -a" +;detected in "/etc/lsb-release" +;detected in "/etc/os-release" +;wrong in "/etc/debian_version" Debian + +[Chakra] +Image = "Chakra.png" +Files = "/etc/chakra-release" +;detected in "lsb_release -a" +;detected in "/etc/lsb-release" + +[The Chakra-Project] +Image = "Chakra.png" +;detected in "/etc/os-release" + +[IYCC] +Image = "iycc.png" +;detected in "/etc/lsb-release" + +[HipServ] +Image = "HipServ.png" +;detected in "/etc/redhat-release" + +[Mageia] +Image = "Mageia.png" +Files = "/etc/mageia-release" +;detected in "lsb_release -a" +;detected in "/etc/lsb-release" +;detected in "/etc/mandriva-release" +;detected in "/etc/mandrake-release;/etc/mandrakelinux-release" +;detected in "/etc/redhat-release" +;detected in "/etc/os-release" + +[PLD Linux] +Image = "PLD.png" +Files = "/etc/pld-release" +;detected in "/etc/os-release" + +[LFS] +Image = "lfs.png" +Files = "/etc/lfs-release;/etc/lfs_version" + +[HLFS] +Image = "lfs.png" +Files = "/etc/hlfs-release;/etc/hlfs_version" + +[Synology] +Image = "Synology.png" +Mode = "Detection" +Files = "/etc/synoinfo.conf" +Files2 = "/etc/VERSION" + +[Alpine] +Name = "Alpine" +Image = "Alpine.png" +Files = "/etc/alpine-release" + +[Puppy] +Image = "Puppy.png" +;detected in "/etc/DISTRO_SPECS" + +[Lucid] +Name = "Lucid Puppy" +Image = "Puppy.png" +;detected in "/etc/DISTRO_SPECS" + +[Slacko Puppy] +Image = "Puppy.png" +;detected in "/etc/DISTRO_SPECS" + +[Wary Puppy] +Image = "Puppy.png" +;detected in "/etc/DISTRO_SPECS" + +[Turbolinux] +Image = "Turbo.png" +Files = "/etc/turbolinux-release" + +[Amazon] +Image = "Amazon.png" +;detected in "/etc/system-release" + +[AmazonAMI] +Image = "Amazon.png" +;detected in "lsb_release -a" + +[RedFlag] +Image = "RedFlag.png" +Files = "/etc/redflag-release" +;detected in "/etc/system-release" + +[Red Flag inWise] +Image = "RedFlag.png" +;detected in "lsb_release -a" +;detected in "/etc/lsb-release" +;detected in "/etc/os-release" + +[StartOS] +Image = "StartOS.png" +Files = "/etc/startos-release" +;detected in "lsb_release -a" + +[PisiLinux] +Image = "Pisi.png" +Files = "/etc/pisilinux-release" +;detected in "lsb_release -a" +;detected in "/etc/lsb-release" + +[Pisi_Linux] +Image = "Pisi.png" +;detected in "/etc/system-release" + +[SME] +Image = "SMEServer.png" +Files = "/etc/e-smith-release" +;wrong in "/etc/centos-release" CentOS +;detected in "/etc/redhat-release" +;detected in "/etc/system-release" + +[SMEServer] +Image = "SMEServer.png" +;detected in "lsb_release -a" + +[Scientific] +Image = "Scientific.png" +;detected in "lsb_release -a" +;detected in "/etc/redhat-release" +;detected in "/etc/system-release" + +[ScientificSL] +Image = "Scientific.png" +;detected in "lsb_release -a" + +[ScientificCERNSLC] +Image = "Scientific.png" +;detected in "lsb_release -a" + +[ScientificFermi] +Image = "Scientific.png" +;detected in "lsb_release -a" + +[ScientificFermiLTS] +Image = "Scientific.png" +;detected in "lsb_release -a" + +[ScientificSLF] +Image = "Scientific.png" +;detected in "lsb_release -a" + +[ClearOS] +Image = "ClearOS.png" +Files = "/etc/clearos-release" +;detected in "/etc/redhat-release" +;detected in "/etc/system-release" + +[CloudLinuxServer] +Image = "Cloud.png" +;detected in "lsb_release -a" + +[CloudLinux] +Image = "Cloud.png" +Files = "/etc/CloudLinux-release" +;detected in "/etc/redhat-release" +;detected in "/etc/system-release" + +; at the end because some distros may also have the same files (like SMEServer) +[CentOS] +Image = "CentOS.png" +Files = "/etc/centos-release" +;detected in "lsb_release -a" +;detected in "/etc/redhat-release" +;detected in "/etc/system-release" + +[Oracle] +Image = "Oracle.png" +Files = "/etc/oracle-release;/etc/enterprise-release" +;detected in "/etc/system-release" +;wrong in "/etc/redhat-release" RedHat + +[OracleServer] +Image = "Oracle.png" +;detected in "lsb_release -a" + +[EnterpriseEnterpriseServer] +Image = "Oracle.png" +;detected in "lsb_release -a" + +[PCLinuxOS] +Image = "PCLinuxOS.png" +Files = "/etc/pclinuxos-release" +;detected in "lsb_release -a" +;detected in "/etc/lsb-release" +;detected in "/etc/mandriva-release" +;detected in "/etc/mandrake-release;/etc/mandrakelinux-release" +;detected in "/etc/redhat-release" + +[Salix] +Image = "Salix.png" +Mode = "Detection" +Files = "/etc/salix-update-notifier.conf" +Files2 = "/etc/slackware-version" +;wrong in "/etc/os-release" Slackware +;wrong in "/etc/slackware-version" Slackware + +[Slax] +Image = "Slax.png" +Files = "/etc/slax-version" +;wrong in "/etc/os-release" Slackware +;wrong in "/etc/slackware-version" Slackware + +[SMS] +Image = "SMS.png" +Files = "/etc/sms-version" +;detected in "/etc/os-release" +;wrong in "/etc/slackware-version" Slackware + +[Porteus] +Image = "Porteus.png" +Files = "/etc/porteus-version" +;wrong in "/etc/os-release" Slackware +;wrong in "/etc/slackware-version" Slackware + +[Vector] +Image = "Vector.png" +Files = "/etc/vector-version" +;wrong in "/etc/slackware-version" Slackware + +[Zenwalk] +Name = "Zenwalk" +Image = "Zenwalk.png" +Files = "/etc/zenwalk-version" +;detected in "/etc/os-release" +;wrong in "/etc/slackware-version" Slackware + +[Calculate] +Image = "Calculate.png" +;detected in "/etc/gentoo-release" +;wrong in "/etc/os-release" Gentoo + +[Tizen] +Image = "Tizen.png" +Files = "/etc/tizen-release" +;detected in "/etc/system-release" +;detected in "/etc/os-release" + +[Sabayon] +Image = "Sabayon.png" +Files = "/etc/sabayon-release" +;detected in "lsb_release -a" +;detected in "/etc/lsb-release" +;detected in "/etc/system-release" +;detected in "/etc/os-release" +;wrong in "/etc/gentoo-release" Gentoo + +[VortexBox] +Image = "VortexBox.png" +Name = "VortexBox" +Files = "/etc/vortexbox/vortexbox-version" +;wrong in "/etc/fedora-release" Fedora +;wrong in "/etc/redhat-release" Fedora +;wrong in "/etc/system-release" Fedora +;wrong in "/etc/os-release" Fedora + +[ALT] +Image = "ALT.png" +Files = "/etc/altlinux-release" +;detected in "/etc/fedora-release" +;detected in "/etc/redhat-release" +;detected in "/etc/system-release" + +[Simply] +Image = "ALT.png" +;detected in "/etc/fedora-release" +;detected in "/etc/redhat-release" +;detected in "/etc/system-release" + +[Simply Linux] +Image = "ALT.png" +;detected in "/etc/os-release" + +[ALT Linux] +Image = "ALT.png" +;detected in "/etc/os-release" + +[Fuduntu] +Image = "Fuduntu.png" +Files = "/etc/fuduntu-release" +;detected in "lsb_release -a" +;detected in "/etc/lsb-release" +;detected in "/etc/fedora-release" +;detected in "/etc/redhat-release" +;detected in "/etc/system-release" + +[gNewSense] +Image = "gNewSense.png" +;detected in "lsb_release -a" +;detected in "/etc/lsb-release" +;wrong in "/etc/debian_version" Debian + +[SteamOS] +Image = "SteamOS.png" +;detected in "lsb_release -a" +;detected in "/etc/lsb-release" +;wrong in "/etc/debian_version" Debian + +[SteamOS GNU/Linux] +Image = "SteamOS.png" +;detected in "/etc/os-release" + +[Raspbian] +Image = "Raspbian.png" +;detected in "lsb_release -a" +;wrong in "/etc/debian_version" Debian + +[Raspbian GNU/Linux] +Image = "Raspbian.png" +;detected in "/etc/os-release" + +[Debian] +Name = "Debian" +Image = "Debian.png" +Files = "/etc/debian_release" +;detected in "lsb_release -a" +;detected in "/etc/lsb-release" +;detected in "/etc/debian_version" + +[Debian GNU/Linux] +Image = "Debian.png" +;detected in "/etc/os-release" + +[openSUSE] +Image = "openSUSE.png" +;detected in "/etc/os-release" +;detected in "/etc/SuSE-release" + +[openSUSE project] +Image = "openSUSE.png" +;detected in "lsb_release -a" + +; at the end because some distros may also have the same files (like openSUSE) +[SUSE LINUX] +Image = "SUSE.png" +Mode = "Analyse" +Files = "/etc/SuSE-release;/etc/UnitedLinux-release" + +; at the end because some distros may also have the same files (like Sabayon, Calculate) +[Gentoo] +Image = "Gentoo.png" +Mode = "Analyse" +Files = "/etc/gentoo-release" +;detected in "lsb_release -a" +;detected in "/etc/lsb-release" +;detected in "/etc/os-release" + +; at the end because some distros may also have the same files (like Salix, Slax, SMS, Porteus, Vector, Zenwalk) +[Slackware] +Image = "Slackware.png" +Files = "/etc/slackware-release;/etc/slackware-version" +;detected in "/etc/os-release" + +[Qubes] +Image = "Qubes.png" +Files = "/etc/qubes-release" +;detected in "/etc/fedora-release" +;detected in "/etc/redhat-release" +;detected in "/etc/system-release" +;detected in "/etc/os-release" + +[Korora] +Image = "Korora.png" +;detected in "lsb_release -a" +;detected in "/etc/fedora-release" +;detected in "/etc/redhat-release" +;detected in "/etc/system-release" +;detected in "/etc/os-release" + +; at the end because some distros may also have the same files (like Fuduntu, ALT, VortexBox, Qubes, Korora) +[Fedora] +Image = "Fedora.png" +Mode = "Analyse" +Files = "/etc/fedora-release" +;detected in "lsb_release -a" +;detected in "/etc/redhat-release" +;detected in "/etc/system-release" +;detected in "/etc/os-release" + +[FedoraCore] +Image = "Fedora.png" +;detected in "/etc/lsb-release" + +[OpenMandriva] +Image = "OpenMandriva.png" +;detected in "/etc/rosa-release" +;detected in "/etc/mandriva-release" +;detected in "/etc/mandrake-release;/etc/mandrakelinux-release" +;detected in "/etc/redhat-release" +;detected in "/etc/distro-release" +;detected in "/etc/system-release" + +[OpenMandriva Lx] +Image = "OpenMandriva.png" +;detected in "/etc/os-release" + +[OpenMandrivaLinux] +Image = "OpenMandriva.png" +;detected in "lsb_release -a" +;detected in "/etc/lsb-release" + +[ROSA MarathonLinux] +Image = "ROSA.png" +;detected in "/etc/lsb-release" + +[RosaDesktop.Marathon] +Image = "ROSA.png" +;detected in "lsb_release -a" +;detected in "/etc/lsb-release" + +[RosaDesktop.Fresh] +Image = "ROSA.png" +;detected in "lsb_release -a" +;detected in "/etc/lsb-release" + +[ROSA Desktop Fresh] +Image = "ROSA.png" +;detected in "/etc/os-release" + +[ROSA Marathon] +Image = "ROSA.png" +;detected in "/etc/os-release" + +[ROSAEnterpriseServer] +Image = "ROSA.png" +;detected in "lsb_release -a" + +; at the end because some distros may also have the same files (like OpenMandriva) +[ROSA] +Image = "ROSA.png" +Mode = "Analyse" +Files = "/etc/rosa-release" +;detected in "lsb_release -a" +;detected in "/etc/system-release" +;detected in "/etc/mandriva-release" +;detected in "/etc/mandrake-release;/etc/mandrakelinux-release" +;detected in "/etc/redhat-release" + +[MandrivaLinux] +Image = "Mandrake.png" +;detected in "lsb_release -a" +;detected in "/etc/lsb-release" + +; at the end because some distros may also have the same files (like Mageia, PCLinuxOS, ROSA, OpenMandriva) +[Mandriva] +Image = "Mandrake.png" +Mode = "Analyse" +Files = "/etc/mandriva-release" +;detected in "/etc/mandrake-release;/etc/mandrakelinux-release" +;detected in "/etc/redhat-release" + +; at the end because some distros may also have the same files (like Mandriva, Mageia, PCLinuxOS, ROSA, OpenMandriva) +[Mandrake] +Image = "Mandrake.png" +Mode = "Analyse" +Files = "/etc/mandrake-release;/etc/mandrakelinux-release" + +; at the end because some distros may also have the same files (like SMEServer, Fuduntu, ALT, VortexBox, Qubes, Korora, Fedora, CentOS, Oracle, Scientific, CloudLinux, Mandrake, MandrivaLinux, Mageia, PCLinuxOS, ROSA, OpenMandriva, HipServ) +[RedHat] +Image = "RedHat.png" +Mode = "Analyse" +Files = "/etc/redhat-release;/etc/redhat_version" +;detected in "/etc/system-release" + +[Red Hat Enterprise Linux Everything] +Image = "RedHat.png" +;detected in "/etc/os-release" + +[RedHatEnterpriseES] +Image = "RedHat.png" +;detected in "lsb_release -a" + +[RedHatEnterpriseAS] +Image = "RedHat.png" +;detected in "lsb_release -a" + +[RedHatEnterpriseServer] +Image = "RedHat.png" +;detected in "lsb_release -a" + +[RedHatEnterpriseClient] +Image = "RedHat.png" +;detected in "lsb_release -a" diff --git a/sources/data/languages.ini b/sources/data/languages.ini new file mode 100644 index 0000000..c93aea4 --- /dev/null +++ b/sources/data/languages.ini @@ -0,0 +1,1025 @@ +[WINNT] +1="Arabic" +4="Simplified Chinese - China" +9="English" +1025="Arabic - Saudi Arabia" +1026="Bulgarian" +1027="Catalan" +1028="Traditional Chinese - Taiwan" +1029="Czech" +1030="Danish" +1031="German - Germany" +1032="Greek" +1033="English - United States" +1034="Spanish - Traditional Sort" +1035="Finnish" +1036="French - France" +1037="Hebrew" +1038="Hungarian" +1039="Icelandic" +1040="Italian - Italy" +1041="Japanese" +1042="Korean" +1043="Dutch - Netherlands" +1044="Norwegian - Bokmal" +1045="Polish" +1046="Portuguese - Brazil" +1047="Rhaeto-Romanic" +1048="Romanian" +1049="Russian" +1050="Croatian" +1051="Slovak" +1052="Albanian" +1053="Swedish" +1054="Thai" +1055="Turkish" +1056="Urdu" +1057="Indonesian" +1058="Ukrainian" +1059="Belarusian" +1060="Slovenian" +1061="Estonian" +1062="Latvian" +1063="Lithuanian" +1065="Persion" +1066="Vietnamese" +1069="Basque" +1070="Serbian" +1071="Macedonian (FYROM)" +1072="Sutu" +1073="Tsonga" +1074="Tswana" +1076="Xhosa" +1077="Zulu" +1078="Afrikaans" +1080="Faeroese" +1081="Hindi" +1082="Maltese" +1084="Scottish Gaelic" +1085="Yiddish" +1086="Malay - Malaysia" +2049="Arabic - Iraq" +2052="Simplified Chinese - PRC" +2055="German - Switzerland" +2057="English - United Kingdom" +2058="Spanish - Mexico" +2060="French - Belgium" +2064="Italian - Switzerland" +2067="Dutch - Belgium" +2068="Norwegian - Nynorsk" +2070="Portuguese - Portugal" +2072="Romanian - Moldova" +2073="Russian - Moldova" +2074="Serbian - Latin" +2077="Swedish - Finland" +3073="Arabic - Egypt" +3076="Traditional Chinese - Hong Kong SAR" +3079="German - Austria" +3081="English - Australia" +3082="Spanish - International Sort" +3084="French - Canada" +3098="Serbian - Cyrillic" +4097="Arabic - Libya" +4100="Simplified Chinese - Singapore" +4103="German - Luxembourg" +4105="English - Canada" +4106="Spanish - Guatemala" +4108="French - Switzerland" +5121="Arabic - Algeria" +5127="German - Liechtenstein" +5129="English - New Zealand" +5130="Spanish - Costa Rica" +5132="French - Luxembourg" +6145="Arabic - Morocco" +6153="English - Ireland" +6154="Spanish - Panama" +7169="Arabic - Tunisia" +7177="English - South Africa" +7178="Spanish - Dominican Republic" +8193="Arabic - Oman" +8201="English - Jamaica" +8202="Spanish - Venezuela" +9217="Arabic - Yemen" +9226="Spanish - Colombia" +10241="Arabic - Syria" +10249="English - Belize" +10250="Spanish - Peru" +11265="Arabic - Jordan" +11273="English - Trinidad" +11274="Spanish - Argentina" +12289="Arabic - Lebanon" +12298="Spanish - Ecuador" +13313="Arabic - Kuwait" +13322="Spanish - Chile" +14337="Arabic - U.A.E." +14346="Spanish - Uruguay" +15361="Arabic - Bahrain" +15370="Spanish - Paraguay" +16385="Arabic - Qatar" +16394="Spanish - Bolivia" +17418="Spanish - El Salvador" +18442="Spanish - Honduras" +19466="Spanish - Nicaragua" +20490="Spanish - Puerto Rico" + +[Linux] +_aa="Afar" +_aa_DJ="Afar Djibouti" +_aa_ER="Afar Eritrea" +_aa_ER_SAAHO="Afar Eritrea Saho" +_aa_ET="Afar Ethiopia" +_aar="Afar" +_aar_DJ="Afar Djibouti" +_aar_ER="Afar Eritrea" +_aar_ER_SAAHO="Afar Eritrea Saho" +_aar_ET="Afar Ethiopia" +_af="Afrikaans" +_af_NA="Afrikaans Namibia" +_afr="Afrikaans" +_afr_NA="Afrikaans Namibia" +_afr_ZA="Afrikaans South Africa" +_af_ZA="Afrikaans South Africa" +_aka="Akan" +_aka_GH="Akan Ghana" +_ak="Akan" +_ak_GH="Akan Ghana" +_alb_AL="Albanian Albania" +_alb="Albanian" +_am="Amharic" +_am_ET="Amharic Ethiopia" +_amh="Amharic" +_amh_ET="Amharic Ethiopia" +_ara_AE="Arabic United Arab Emirates" +_ara="Arabic" +_ara_BH="Arabic Bahrain" +_ara_DZ="Arabic Algeria" +_ar_AE="Arabic United Arab Emirates" +_ara_EG="Arabic Egypt" +_ara_IQ="Arabic Iraq" +_ara_JO="Arabic Jordan" +_ara_KW="Arabic Kuwait" +_ara_LB="Arabic Lebanon" +_ara_LY="Arabic Libya" +_ara_MA="Arabic Morocco" +_ara_OM="Arabic Oman" +_ara_QA="Arabic Qatar" +_ar="Arabic" +_ara_SA="Arabic Saudi Arabia" +_ara_SD="Arabic Sudan" +_ara_SY="Arabic Syria" +_ara_TN="Arabic Tunisia" +_ara_YE="Arabic Yemen" +_ar_BH="Arabic Bahrain" +_ar_DZ="Arabic Algeria" +_ar_EG="Arabic Egypt" +_ar_IQ="Arabic Iraq" +_ar_JO="Arabic Jordan" +_ar_KW="Arabic Kuwait" +_ar_LB="Arabic Lebanon" +_ar_LY="Arabic Libya" +_ar_MA="Arabic Morocco" +_arm_AM="Armenian Armenia" +_arm_AM_REVISED="Armenian Armenia Revised Orthography" +_arm="Armenian" +_ar_OM="Arabic Oman" +_ar_QA="Arabic Qatar" +_ar_SA="Arabic Saudi Arabia" +_ar_SD="Arabic Sudan" +_ar_SY="Arabic Syria" +_ar_TN="Arabic Tunisia" +_ar_YE="Arabic Yemen" +_as="Assamese" +_as_IN="Assamese India" +_asm="Assamese" +_asm_IN="Assamese India" +_az_AZ="Azerbaijani Azerbaijan" +_az="Azerbaijani" +_az_Cyrl_AZ="Azerbaijani Azerbaijan (Cyrillic)" +_az_Cyrl="Azerbaijani (Cyrillic)" +_aze_AZ="Azerbaijani Azerbaijan" +_aze_AZ_Cyrl="Azerbaijani Azerbaijan (Cyrillic)" +_aze="Azerbaijani" +_aze_AZ_Latn="Azerbaijani Azerbaijan (Latin)" +_aze_Cyrl="Azerbaijani (Cyrillic)" +_aze_Latn="Azerbaijani (Latin)" +_az_Latn_AZ="Azerbaijani Azerbaijan (Latin)" +_az_Latn="Azerbaijani (Latin)" +_baq="Basque" +_baq_ES="Basque Spain" +_be="Belarusian" +_be_BY="Belarusian Belarus" +_bel="Belarusian" +_bel_BY="Belarusian Belarus" +_ben_BD="Bengali Bangladesh" +_ben="Bengali" +_ben_IN="Bengali India" +_bg_BG="Bulgarian Bulgaria" +_bg="Bulgarian" +_bn_BD="Bengali Bangladesh" +_bn="Bengali" +_bn_IN="Bengali India" +_bokmal="Norwegian BokmÃ¥l" +_bokmÃ¥l="Norwegian BokmÃ¥l" +_bos_BA="Bosnian Bosnia and Herzegovina" +_bos="Bosnian" +_bs_BA="Bosnian Bosnia and Herzegovina" +_bs="Bosnian" +_bul_BG="Bulgarian Bulgaria" +_bul="Bulgarian" +_bur="Burmese" +_bur_MM="Burmese Myanmar" +_byn="Blin" +_byn_ER="Blin Eritrea" +_ca="Catalan" +_ca_ES="Catalan Spain" +_catalan="Catalan Spain" +_cat="Catalan" +_cat_ES="Catalan Spain" +_cch="Atsam" +_cch_NG="Atsam Nigeria" +_C="English United States Computer" +_chi="Chinese" +_chi_CN="Chinese China" +_chi_CN_Hans="Chinese China (Simplified Han)" +_chi_Hans="Chinese (Simplified Han)" +_chi_Hant="Chinese (Traditional Han)" +_chi_HK="Chinese Hong Kong SAR China" +_chi_HK_Hans="Chinese Hong Kong SAR China (Simplified Han)" +_chi_HK_Hant="Chinese Hong Kong SAR China (Traditional Han)" +_chi_MO="Chinese Macau SAR China" +_chi_MO_Hans="Chinese Macau SAR China (Simplified Han)" +_chi_MO_Hant="Chinese Macau SAR China (Traditional Han)" +_chi_SG="Chinese Singapore" +_chi_SG_Hans="Chinese Singapore (Simplified Han)" +_chi_TW="Chinese Taiwan" +_chi_TW_Hant="Chinese Taiwan (Traditional Han)" +_cop="Coptic" +_cor="Cornish" +_cor_GB="Cornish United Kingdom" +_croatian="Croatian" +_cs_CZ="Czech Czech Republic" +_cs="Czech" +_cy_GB="Welsh United Kingdom" +_cy="Welsh" +_czech="Czech" +_cze_CZ="Czech Czech Republic" +_cze="Czech" +_da="Danish" +_da_DK="Danish Denmark" +_dan="Danish" +_dan_DK="Danish Denmark" +_danish="Danish" +_dansk="Danish" +_de_AT="German Austria" +_de_BE="German Belgium" +_de_CH="German Switzerland" +_de_DE="German Germany" +_de="German" +_de_LI="German Liechtenstein" +_de_LU="German Luxembourg" +_deutsch="German" +_div="Divehi" +_div_MV="Divehi Maldives" +_dut_BE="Dutch Belgium" +_dutch="Dutch" +_dut="Dutch" +_dut_NL="Dutch Netherlands" +_dv="Divehi" +_dv_MV="Divehi Maldives" +_dz_BT="Dzongkha Bhutan" +_dz="Dzongkha" +_dzo_BT="Dzongkha Bhutan" +_dzo="Dzongkha" +_ee="Ewe" +_ee_GH="Ewe Ghana" +_eesti="Estonian" +_ee_TG="Ewe Togo" +_el_CY="Greek Cyprus" +_el="Greek" +_el_GR="Greek Greece" +_el_POLYTON="Greek" +_en_AS="English American Samoa" +_en_AU="English Australia" +_en_BE="English Belgium" +_en_BW="English Botswana" +_en_BZ="English Belize" +_en_CA="English Canada" +_en_Dsrt="English (Deseret)" +_en_Dsrt_US="English United States (Deseret)" +_en="English" +_eng_AS="English American Samoa" +_eng_AU="English Australia" +_eng_BE="English Belgium" +_en_GB="English United Kingdom" +_eng_BW="English Botswana" +_eng_BZ="English Belize" +_eng_CA="English Canada" +_eng_Dsrt="English (Deseret)" +_eng="English" +_eng_GB="English United Kingdom" +_eng_GU="English Guam" +_eng_HK="English Hong Kong SAR China" +_eng_IE="English Ireland" +_eng_IN="English India" +_eng_JM="English Jamaica" +_eng_MH="English Marshall Islands" +_eng_MP="English Northern Mariana Islands" +_eng_MT="English Malta" +_eng_NA="English Namibia" +_eng_NZ="English New Zealand" +_eng_PH="English Philippines" +_eng_PK="English Pakistan" +_eng_SG="English Singapore" +_eng_Shaw="English (Shavian)" +_eng_TT="English Trinidad and Tobago" +_en_GU="English Guam" +_eng_UM="English United States Minor Outlying Islands" +_eng_US_Dsrt="English United States (Deseret)" +_eng_US="English United States" +_eng_US_POSIX="English United States Computer" +_eng_VI="English U.S. Virgin Islands" +_eng_ZA="English South Africa" +_eng_ZW="English Zimbabwe" +_en_HK="English Hong Kong SAR China" +_en_IE="English Ireland" +_en_IN="English India" +_en_JM="English Jamaica" +_en_MH="English Marshall Islands" +_en_MP="English Northern Mariana Islands" +_en_MT="English Malta" +_en_NA="English Namibia" +_en_NZ="English New Zealand" +_en_PH="English Philippines" +_en_PK="English Pakistan" +_en_SG="English Singapore" +_en_Shaw="English (Shavian)" +_en_TT="English Trinidad and Tobago" +_en_UM="English United States Minor Outlying Islands" +_en_US="English United States" +_en_US_POSIX="English United States Computer" +_en_VI="English U.S. Virgin Islands" +_en_ZA="English South Africa" +_en_ZW="English Zimbabwe" +_eo="Esperanto" +_epo="Esperanto" +_es_AR="Spanish Argentina" +_es_BO="Spanish Bolivia" +_es_CL="Spanish Chile" +_es_CO="Spanish Colombia" +_es_CR="Spanish Costa Rica" +_es_DO="Spanish Dominican Republic" +_es_EC="Spanish Ecuador" +_es_ES="Spanish Spain" +_es_GT="Spanish Guatemala" +_es_HN="Spanish Honduras" +_es_MX="Spanish Mexico" +_es_NI="Spanish Nicaragua" +_es_PA="Spanish Panama" +_es_PE="Spanish Peru" +_es_PR="Spanish Puerto Rico" +_es_PY="Spanish Paraguay" +_es="Spanish" +_es_SV="Spanish El Salvador" +_est_EE="Estonian Estonia" +_est="Estonian" +_estonian="Estonian" +_es_US="Spanish United States" +_es_UY="Spanish Uruguay" +_es_VE="Spanish Venezuela" +_et_EE="Estonian Estonia" +_et="Estonian" +_eu="Basque" +_eu_ES="Basque Spain" +_ewe="Ewe" +_ewe_GH="Ewe Ghana" +_ewe_TG="Ewe Togo" +_fa_AF="Persian Afghanistan" +_fa_IR="Persian Iran" +_fao="Faroese" +_fao_FO="Faroese Faroe Islands" +_fa="Persian" +_fi_FI="Finnish Finland" +_fi="Finnish" +_fil="Filipino" +_fil_PH="Filipino Philippines" +_fin_FI="Finnish Finland" +_fin="Finnish" +_finnish="finnish" +_fo="Faroese" +_fo_FO="Faroese Faroe Islands" +_français="French" +_fr_BE="French Belgium" +_fr_CA="French Canada" +_fr_CH="French Switzerland" +_fre_BE="French Belgium" +_fre_CA="French Canada" +_fre_CH="French Switzerland" +_fre="French" +_fre_FR="French France" +_fre_LU="French Luxembourg" +_fre_MC="French Monaco" +_french="French" +_fre_SN="French Senegal" +_fr="French" +_fr_FR="French France" +_fr_LU="French Luxembourg" +_fr_MC="French Monaco" +_fr_SN="French Senegal" +_fur="Friulian" +_fur_IT="Friulian Italy" +_gaa="Ga" +_gaa_GH="Ga Ghana" +_ga_IE="Irish Ireland" +_ga="Irish" +_galego="Galician" +_galician="Galician" +_geo_GE="Georgian Georgia" +_geo="Georgian" +_ger_AT="German Austria" +_ger_BE="German Belgium" +_ger_CH="German Switzerland" +_ger_DE="German Germany" +_ger="German" +_ger_LI="German Liechtenstein" +_ger_LU="German Luxembourg" +_german="German" +_gez_ER="Geez Eritrea" +_gez_ET="Geez Ethiopia" +_gez="Geez" +_gle_IE="Irish Ireland" +_gle="Irish" +_gl_ES="Galician Spain" +_gl="Galician" +_glg_ES="Galician Spain" +_glg="Galician" +_glv_GB="Manx United Kingdom" +_glv="Manx" +_gre_CY="Greek Cyprus" +_greek="Greek" +_gre="Greek" +_gre_GR="Greek Greece" +_gre_POLYTON="Greek" +_gu="Gujarati" +_gu_IN="Gujarati India" +_guj="Gujarati" +_guj_IN="Gujarati India" +_gv_GB="Manx United Kingdom" +_gv="Manx" +_ha_Arab="Hausa (Arabic)" +_ha_Arab_NG="Hausa Nigeria (Arabic)" +_ha_Arab_SD="Hausa Sudan (Arabic)" +_ha_GH="Hausa Ghana" +_ha="Hausa" +_ha_Latn_GH="Hausa Ghana (Latin)" +_ha_Latn="Hausa (Latin)" +_ha_Latn_NE="Hausa Niger (Latin)" +_ha_Latn_NG="Hausa Nigeria (Latin)" +_ha_NE="Hausa Niger" +_ha_NG="Hausa Nigeria" +_ha_SD="Hausa Sudan" +_hau_Arab="Hausa (Arabic)" +_hau_GH="Hausa Ghana" +_hau_GH_Latn="Hausa Ghana (Latin)" +_hau="Hausa" +_hau_Latn="Hausa (Latin)" +_hau_NE="Hausa Niger" +_hau_NE_Latn="Hausa Niger (Latin)" +_hau_NG_Arab="Hausa Nigeria (Arabic)" +_hau_NG="Hausa Nigeria" +_hau_NG_Latn="Hausa Nigeria (Latin)" +_hau_SD_Arab="Hausa Sudan (Arabic)" +_hau_SD="Hausa Sudan" +_haw="Hawaiian" +_haw_US="Hawaiian United States" +_heb="Hebrew" +_heb_IL="Hebrew Israel" +_hebrew="Hebrew" +_he="Hebrew" +_he_IL="Hebrew Israel" +_hi="Hindi" +_hi_IN="Hindi India" +_hin="Hindi" +_hin_IN="Hindi India" +_hr="Croatian" +_hr_HR="Croatian Croatia" +_hrvatski="Croatian" +_hrv="Croatian" +_hrv_HR="Croatian Croatia" +_hu_HU="Hungarian Hungary" +_hu="Hungarian" +_hungarian="Hungarian" +_hun_HU="Hungarian Hungary" +_hun="Hungarian" +_hy_AM="Armenian Armenia" +_hy_AM_REVISED="Armenian Armenia Revised Orthography" +_hy="Armenian" +_ia="Interlingua" +_ibo="Igbo" +_ibo_NG="Igbo Nigeria" +_ice="Icelandic" +_ice_IS="Icelandic Iceland" +_icelandic="Icelandic" +_id_ID="Indonesian Indonesia" +_id="Indonesian" +_ig="Igbo" +_ig_NG="Igbo Nigeria" +_ii_CN="Sichuan Yi China" +_iii_CN="Sichuan Yi China" +_iii="Sichuan Yi" +_ii="Sichuan Yi" +_iku="Inuktitut" +_ina="Interlingua" +_ind_ID="Indonesian Indonesia" +_ind="Indonesian" +_is="Icelandic" +_is_IS="Icelandic Iceland" +_ita_CH="Italian Switzerland" +_ita="Italian" +_ita_IT="Italian Italy" +_italian="Italian" +_it_CH="Italian Switzerland" +_it="Italian" +_it_IT="Italian Italy" +_iu="Inuktitut" +_iw="Hebrew" +_iw_IL="Hebrew Israel" +_ja="Japanese" +_ja_JP="Japanese Japan" +_japanese="Japanese" +_jpn="Japanese" +_jpn_JP="Japanese Japan" +_ka_GE="Georgian Georgia" +_ka="Georgian" +_kaj="Jju" +_kaj_NG="Jju Nigeria" +_kal_GL="Kalaallisut Greenland" +_kal="Kalaallisut" +_kam="Kamba" +_kam_KE="Kamba Kenya" +_kan_IN="Kannada India" +_kan="Kannada" +_kaz_Cyrl="Kazakh (Cyrillic)" +_kaz="Kazakh" +_kaz_KZ_Cyrl="Kazakh Kazakhstan (Cyrillic)" +_kaz_KZ="Kazakh Kazakhstan" +_kcg_NG="Tyap Nigeria" +_kcg="Tyap" +_kfo_CI="Koro Ivory Coast" +_kfo="Koro" +_khm_KH="Khmer Cambodia" +_khm="Khmer" +_kin="Kinyarwanda" +_kin_RW="Kinyarwanda Rwanda" +_kir_KG="Kirghiz Kyrgyzstan" +_kir="Kirghiz" +_kk_Cyrl="Kazakh (Cyrillic)" +_kk_Cyrl_KZ="Kazakh Kazakhstan (Cyrillic)" +_kk="Kazakh" +_kk_KZ="Kazakh Kazakhstan" +_kl_GL="Kalaallisut Greenland" +_kl="Kalaallisut" +_km_KH="Khmer Cambodia" +_km="Khmer" +_kn_IN="Kannada India" +_kn="Kannada" +_kok_IN="Konkani India" +_kok="Konkani" +_ko="Korean" +_ko_KR="Korean South Korea" +_korean="Korean" +_kor="Korean" +_kor_KR="Korean South Korea" +_kpe_GN="Kpelle Guinea" +_kpe="Kpelle" +_kpe_LR="Kpelle Liberia" +_ku_Arab="Kurdish (Arabic)" +_ku="Kurdish" +_ku_Latn="Kurdish (Latin)" +_ku_Latn_TR="Kurdish Turkey (Latin)" +_kur_Arab="Kurdish (Arabic)" +_kur="Kurdish" +_kur_Latn="Kurdish (Latin)" +_kur_TR="Kurdish Turkey" +_kur_TR_Latn="Kurdish Turkey (Latin)" +_ku_TR="Kurdish Turkey" +_kw="Cornish" +_kw_GB="Cornish United Kingdom" +_ky_KG="Kirghiz Kyrgyzstan" +_ky="Kirghiz" +_lao_LA="Lao Laos" +_lao="Lao" +_lav="Latvian" +_lav_LV="Latvian Latvia" +_lin_CD="Lingala Congo - Kinshasa" +_lin_CG="Lingala Congo - Brazzaville" +_lin="Lingala" +_lithuanian="Lithuanian" +_lit="Lithuanian" +_lit_LT="Lithuanian Lithuania" +_ln_CD="Lingala Congo - Kinshasa" +_ln_CG="Lingala Congo - Brazzaville" +_ln="Lingala" +_lo_LA="Lao Laos" +_lo="Lao" +_lt="Lithuanian" +_lt_LT="Lithuanian Lithuania" +_lv="Latvian" +_lv_LV="Latvian Latvia" +_mac="Macedonian" +_mac_MK="Macedonian Macedonia" +_mal_IN="Malayalam India" +_mal="Malayalam" +_mar_IN="Marathi India" +_mar="Marathi" +_may_BN="Malay Brunei" +_may="Malay" +_may_MY="Malay Malaysia" +_mk="Macedonian" +_mk_MK="Macedonian Macedonia" +_ml_IN="Malayalam India" +_ml="Malayalam" +_mlt="Maltese" +_mlt_MT="Maltese Malta" +_mn_CN="Mongolian China" +_mn_Cyrl_MN="Mongolian Mongolia (Cyrillic)" +_mn_Cyrl="Mongolian (Cyrillic)" +_mn_MN="Mongolian Mongolia" +_mn_Mong_CN="Mongolian China (Mongolian)" +_mn_Mong="Mongolian (Mongolian)" +_mn="Mongolian" +_mol="Moldavian" +_mo="Moldavian" +_mon_CN_Mong="Mongolian China (Mongolian)" +_mon_CN="Mongolian China" +_mon_Cyrl="Mongolian (Cyrillic)" +_mon_MN_Cyrl="Mongolian Mongolia (Cyrillic)" +_mon_MN="Mongolian Mongolia" +_mon_Mong="Mongolian (Mongolian)" +_mon="Mongolian" +_mr_IN="Marathi India" +_mr="Marathi" +_ms_BN="Malay Brunei" +_ms="Malay" +_ms_MY="Malay Malaysia" +_mt="Maltese" +_mt_MT="Maltese Malta" +_my="Burmese" +_my_MM="Burmese Myanmar" +_nbl="South Ndebele" +_nbl_ZA="South Ndebele South Africa" +_nb_NO="Norwegian BokmÃ¥l Norway" +_nb="Norwegian BokmÃ¥l" +_ne_IN="Nepali India" +_ne="Nepali" +_ne_NP="Nepali Nepal" +_nep_IN="Nepali India" +_nep="Nepali" +_nep_NP="Nepali Nepal" +_nl_BE="Dutch Belgium" +_nl="Dutch" +_nl_NL="Dutch Netherlands" +_nn_NO="Norwegian Nynorsk Norway" +_nn="Norwegian Nynorsk" +_nno_NO="Norwegian Nynorsk Norway" +_nno="Norwegian Nynorsk" +_nob_NO="Norwegian BokmÃ¥l Norway" +_nob="Norwegian BokmÃ¥l" +_no_NO="Norwegian Nynorsk Norway" +_no_NO_NY="Norwegian Nynorsk Norway" +_no="Norwegian" +_no="Norwegian Nynorsk" +_nor="Norwegian" +_norwegian="Norwegian" +_nr="South Ndebele" +_nr_ZA="South Ndebele South Africa" +_nso="Northern Sotho" +_nso_ZA="Northern Sotho South Africa" +_nya_MW="Nyanja Malawi" +_nya="Nyanja" +_ny_MW="Nyanja Malawi" +_nynorsk="Norwegian Nynorsk" +_ny="Nyanja" +_om_ET="Oromo Ethiopia" +_om_KE="Oromo Kenya" +_om="Oromo" +_ori_IN="Oriya India" +_or_IN="Oriya India" +_ori="Oriya" +_orm_ET="Oromo Ethiopia" +_orm_KE="Oromo Kenya" +_orm="Oromo" +_or="Oriya" +_pa_Arab_PK="Punjabi Pakistan (Arabic)" +_pa_Arab="Punjabi (Arabic)" +_pa_Guru_IN="Punjabi India (Gurmukhi)" +_pa_Guru="Punjabi (Gurmukhi)" +_pa_IN="Punjabi India" +_pan_Arab="Punjabi (Arabic)" +_pan_Guru="Punjabi (Gurmukhi)" +_pan_IN_Guru="Punjabi India (Gurmukhi)" +_pan_IN="Punjabi India" +_pan_PK_Arab="Punjabi Pakistan (Arabic)" +_pan_PK="Punjabi Pakistan" +_pan="Punjabi" +_pa_PK="Punjabi Pakistan" +_pa="Punjabi" +_per_AF="Persian Afghanistan" +_per_IR="Persian Iran" +_per="Persian" +_pl_PL="Polish Poland" +_pl="Polish" +_polish="Polish" +_pol_PL="Polish Poland" +_pol="Polish" +_por_BR="Portuguese Brazil" +_por="Portuguese" +_por_PT="Portuguese Portugal" +_portuguese="Portuguese" +_POSIX="English United States Computer" +_ps_AF="Pashto Afghanistan" +_ps="Pashto" +_pt_BR="Portuguese Brazil" +_pt="Portuguese" +_pt_PT="Portuguese Portugal" +_pus_AF="Pashto Afghanistan" +_pus="Pashto" +_romanian="Romanian" +_ro_MD="Romanian Moldova" +_root="Root" +_ro="Romanian" +_ro_RO="Romanian Romania" +_rum_MD="Romanian Moldova" +_rum="Romanian" +_rum_RO="Romanian Romania" +_ru_RU="Russian Russia" +_ru="Russian" +_rus_RU="Russian Russia" +_rus="Russian" +_russian="Russian" +_rus_UA="Russian Ukraine" +_ru_UA="Russian Ukraine" +_rw="Kinyarwanda" +_rw_RW="Kinyarwanda Rwanda" +_sa_IN="Sanskrit India" +_san_IN="Sanskrit India" +_san="Sanskrit" +_sa="Sanskrit" +_se_FI="Northern Sami Finland" +_se_NO="Northern Sami Norway" +_se="Northern Sami" +_sh_BA="Serbo-Croatian Bosnia and Herzegovina" +_sh_CS="Serbo-Croatian Serbia and Montenegro" +_sh="Serbo-Croatian" +_sh_YU="Serbo-Croatian" +_sid_ET="Sidamo Ethiopia" +_sid="Sidamo" +_si_LK="Sinhala Sri Lanka" +_sin_LK="Sinhala Sri Lanka" +_sin="Sinhala" +_si="Sinhala" +_sk_SK="Slovak Slovakia" +_sk="Slovak" +_slo_SK="Slovak Slovakia" +_slo="Slovak" +_slovak="Slovak" +_slovene="Slovenian" +_slovenian="Slovenian" +_sl_SI="Slovenian Slovenia" +_sl="Slovenian" +_slv_SI="Slovenian Slovenia" +_slv="Slovenian" +_sme_FI="Northern Sami Finland" +_sme_NO="Northern Sami Norway" +_sme="Northern Sami" +_so_DJ="Somali Djibouti" +_so_ET="Somali Ethiopia" +_so_KE="Somali Kenya" +_som_DJ="Somali Djibouti" +_som_ET="Somali Ethiopia" +_som_KE="Somali Kenya" +_som="Somali" +_som_SO="Somali Somalia" +_so="Somali" +_so_SO="Somali Somalia" +_sot_LS="Southern Sotho Lesotho" +_sot="Southern Sotho" +_sot_ZA="Southern Sotho South Africa" +_spa_AR="Spanish Argentina" +_spa_BO="Spanish Bolivia" +_spa_CL="Spanish Chile" +_spa_CO="Spanish Colombia" +_spa_CR="Spanish Costa Rica" +_spa_DO="Spanish Dominican Republic" +_spa_EC="Spanish Ecuador" +_spa_ES="Spanish Spain" +_spa_GT="Spanish Guatemala" +_spa_HN="Spanish Honduras" +_spa_MX="Spanish Mexico" +_spanish="Spanish" +_spa_NI="Spanish Nicaragua" +_spa_PA="Spanish Panama" +_spa_PE="Spanish Peru" +_spa_PR="Spanish Puerto Rico" +_spa_PY="Spanish Paraguay" +_spa="Spanish" +_spa_SV="Spanish El Salvador" +_spa_US="Spanish United States" +_spa_UY="Spanish Uruguay" +_spa_VE="Spanish Venezuela" +_sq_AL="Albanian Albania" +_sq="Albanian" +_sr_BA="Serbian Bosnia and Herzegovina" +_sr_CS="Serbian Serbia and Montenegro" +_sr_Cyrl_BA="Serbian Bosnia and Herzegovina (Cyrillic)" +_sr_Cyrl_CS="Serbian Serbia and Montenegro (Cyrillic)" +_sr_Cyrl_ME="Serbian Montenegro (Cyrillic)" +_sr_Cyrl_RS="Serbian Serbia (Cyrillic)" +_sr_Cyrl="Serbian (Cyrillic)" +_sr_Cyrl_YU="Serbian (Cyrillic)" +_sr_Latn_BA="Serbian Bosnia and Herzegovina (Latin)" +_sr_Latn_CS="Serbian Serbia and Montenegro (Latin)" +_sr_Latn_ME="Serbian Montenegro (Latin)" +_sr_Latn_RS="Serbian Serbia (Latin)" +_sr_Latn="Serbian (Latin)" +_sr_Latn_YU="Serbian (Latin)" +_sr_ME="Serbian Montenegro" +_srp_BA_Cyrl="Serbian Bosnia and Herzegovina (Cyrillic)" +_srp_BA_Latn="Serbian Bosnia and Herzegovina (Latin)" +_srp_BA="Serbian Bosnia and Herzegovina" +_srp_CS_Cyrl="Serbian Serbia and Montenegro (Cyrillic)" +_srp_CS_Latn="Serbian Serbia and Montenegro (Latin)" +_srp_CS="Serbian Serbia and Montenegro" +_srp_Cyrl="Serbian (Cyrillic)" +_srp_Latn="Serbian (Latin)" +_srp_ME_Cyrl="Serbian Montenegro (Cyrillic)" +_srp_ME_Latn="Serbian Montenegro (Latin)" +_srp_ME="Serbian Montenegro" +_srp_RS_Cyrl="Serbian Serbia (Cyrillic)" +_srp_RS_Latn="Serbian Serbia (Latin)" +_srp_RS="Serbian Serbia" +_srp="Serbian" +_srp_YU_Cyrl="Serbian (Cyrillic)" +_srp_YU_Latn="Serbian (Latin)" +_srp_YU="Serbian" +_sr_RS="Serbian Serbia" +_sr="Serbian" +_sr_YU="Serbian" +_ss="Swati" +_ss_SZ="Swati Swaziland" +_ssw="Swati" +_ssw_SZ="Swati Swaziland" +_ssw_ZA="Swati South Africa" +_ss_ZA="Swati South Africa" +_st_LS="Southern Sotho Lesotho" +_st="Southern Sotho" +_st_ZA="Southern Sotho South Africa" +_sv_FI="Swedish Finland" +_sv_SE="Swedish Sweden" +_sv="Swedish" +_swa_KE="Swahili Kenya" +_swa="Swahili" +_swa_TZ="Swahili Tanzania" +_swedish="Swedish" +_swe_FI="Swedish Finland" +_swe_SE="Swedish Sweden" +_swe="Swedish" +_sw_KE="Swahili Kenya" +_sw="Swahili" +_sw_TZ="Swahili Tanzania" +_syr="Syriac" +_syr_SY="Syriac Syria" +_ta_IN="Tamil India" +_tam_IN="Tamil India" +_tam="Tamil" +_ta="Tamil" +_tat_RU="Tatar Russia" +_tat="Tatar" +_te_IN="Telugu India" +_tel_IN="Telugu India" +_tel="Telugu" +_te="Telugu" +_tg_Cyrl="Tajik (Cyrillic)" +_tg_Cyrl_TJ="Tajik Tajikistan (Cyrillic)" +_tgk_Cyrl="Tajik (Cyrillic)" +_tgk="Tajik" +_tgk_TJ_Cyrl="Tajik Tajikistan (Cyrillic)" +_tgk_TJ="Tajik Tajikistan" +_tgl="Tagalog" +_tg="Tajik" +_tg_TJ="Tajik Tajikistan" +_thai="Thai" +_tha="Thai" +_tha_TH="Thai Thailand" +_th="Thai" +_th_TH="Thai Thailand" +_ti_ER="Tigrinya Eritrea" +_ti_ET="Tigrinya Ethiopia" +_tig_ER="Tigre Eritrea" +_tig="Tigre" +_tir_ER="Tigrinya Eritrea" +_tir_ET="Tigrinya Ethiopia" +_tir="Tigrinya" +_ti="Tigrinya" +_tl="Tagalog" +_tn="Tswana" +_tn_ZA="Tswana South Africa" +_ton="Tonga" +_ton_TO="Tonga Tonga" +_to="Tonga" +_to_TO="Tonga Tonga" +_tr_TR="Turkish Turkey" +_tr="Turkish" +_tsn="Tswana" +_tsn_ZA="Tswana South Africa" +_tso="Tsonga" +_tso_ZA="Tsonga South Africa" +_ts="Tsonga" +_ts_ZA="Tsonga South Africa" +_tt_RU="Tatar Russia" +_tt="Tatar" +_turkish="Turkish" +_tur_TR="Turkish Turkey" +_tur="Turkish" +_ug_Arab_CN="Uighur China (Arabic)" +_ug_Arab="Uighur (Arabic)" +_ug_CN="Uighur China" +_ug="Uighur" +_uig_Arab="Uighur (Arabic)" +_uig_CN_Arab="Uighur China (Arabic)" +_uig_CN="Uighur China" +_uig="Uighur" +_ukr_UA="Ukrainian Ukraine" +_ukr="Ukrainian" +_uk_UA="Ukrainian Ukraine" +_uk="Ukrainian" +_urd_IN="Urdu India" +_urd_PK="Urdu Pakistan" +_urd="Urdu" +_ur_IN="Urdu India" +_ur_PK="Urdu Pakistan" +_ur="Urdu" +_uz_AF="Uzbek Afghanistan" +_uz_Arab_AF="Uzbek Afghanistan (Arabic)" +_uz_Arab="Uzbek (Arabic)" +_uzb_AF_Arab="Uzbek Afghanistan (Arabic)" +_uzb_AF="Uzbek Afghanistan" +_uzb_Arab="Uzbek (Arabic)" +_uzb_Cyrl="Uzbek (Cyrillic)" +_uzb_Latn="Uzbek (Latin)" +_uzb="Uzbek" +_uzb_UZ_Cyrl="Uzbek Uzbekistan (Cyrillic)" +_uzb_UZ_Latn="Uzbek Uzbekistan (Latin)" +_uzb_UZ="Uzbek Uzbekistan" +_uz_Cyrl="Uzbek (Cyrillic)" +_uz_Cyrl_UZ="Uzbek Uzbekistan (Cyrillic)" +_uz_Latn="Uzbek (Latin)" +_uz_Latn_UZ="Uzbek Uzbekistan (Latin)" +_uz="Uzbek" +_uz_UZ="Uzbek Uzbekistan" +_ven="Venda" +_ven_ZA="Venda South Africa" +_ve="Venda" +_ve_ZA="Venda South Africa" +_vie="Vietnamese" +_vie_VN="Vietnamese Vietnam" +_vi="Vietnamese" +_vi_VN="Vietnamese Vietnam" +_wal_ET="Walamo Ethiopia" +_wal="Walamo" +_wel_GB="Welsh United Kingdom" +_wel="Welsh" +_wo_Latn_SN="Wolof Senegal (Latin)" +_wo_Latn="Wolof (Latin)" +_wol_Latn="Wolof (Latin)" +_wol_SN_Latn="Wolof Senegal (Latin)" +_wol_SN="Wolof Senegal" +_wol="Wolof" +_wo_SN="Wolof Senegal" +_wo="Wolof" +_xho="Xhosa" +_xho_ZA="Xhosa South Africa" +_xh="Xhosa" +_xh_ZA="Xhosa South Africa" +_yo_NG="Yoruba Nigeria" +_yor_NG="Yoruba Nigeria" +_yor="Yoruba" +_yo="Yoruba" +_zh="Chinese" +_zh_CN="Chinese China" +_zh_Hans="Chinese (Simplified Han)" +_zh_Hans_CN="Chinese China (Simplified Han)" +_zh_Hans_HK="Chinese Hong Kong SAR China (Simplified Han)" +_zh_Hans_MO="Chinese Macau SAR China (Simplified Han)" +_zh_Hans_SG="Chinese Singapore (Simplified Han)" +_zh_Hant="Chinese (Traditional Han)" +_zh_Hant_HK="Chinese Hong Kong SAR China (Traditional Han)" +_zh_Hant_MO="Chinese Macau SAR China (Traditional Han)" +_zh_Hant_TW="Chinese Taiwan (Traditional Han)" +_zh_HK="Chinese Hong Kong SAR China" +_zh_MO="Chinese Macau SAR China" +_zh_SG="Chinese Singapore" +_zh_TW="Chinese Taiwan" +_zul_ZA="Zulu South Africa" +_zul="Zulu" +_zu_ZA="Zulu South Africa" +_zu="Zulu" diff --git a/sources/data/osnames.ini b/sources/data/osnames.ini new file mode 100644 index 0000000..210264e --- /dev/null +++ b/sources/data/osnames.ini @@ -0,0 +1,36 @@ +[Android] +1.0="Apple Pie" +1.1="Banana Bread" +1.5="Cupcake" +1.6="Donut" +2.0="Eclair" +2.1="Eclair" +2.2="Froyo" +2.3="Gingerbread" +3.0="Honeycomb" +3.1="Honeycomb" +3.2="Honeycomb" +4.0="Ice Cream Sandwich" +4.1="Jelly Bean" +4.2="Jelly Bean" +4.3="Jelly Bean" +4.4="KitKat" +5.0="Lollipop" +5.1="Lollipop" +6.0="Marshmallow" +6.1="Marshmallow" + +[OS X] +10.0="Cheetah" +10.1="Puma" +10.2="Jaguar" +10.3="Panther" +10.4="Tiger" +10.5="Leopard" +10.6="Snow Leopard" +10.7="Lion" +10.8="Mountain Lion" +10.9="Mavericks" +10.10="Yosemite" +10.11="El Capitan" +10.12="Fuji" diff --git a/sources/gfx/ajax-loader.gif b/sources/gfx/ajax-loader.gif new file mode 100644 index 0000000000000000000000000000000000000000..028e8e6ce21d5f9d179c528ce852ac5c80c8ee96 GIT binary patch literal 404 zcmZ?wbhEHb)Mnsj_{hNU|Nnp2xsMi~`v4>r|8x7fh6Fo12DlpO889<4Ffb_olX5Of zO)N=GQ7F$W$xuklO03AqPfXFv%uCB>Q2fcl$puuU1H=p<0~wf%TKYInPrG@e`SVdO z>3d<7;X@&q%!Yy(eYHjQOV)dO3R)=?VR7W&kvC<*cmeJNb|JxrDb@KCJ9na%I7aU3|;9554wDHtT$T^4!axL9=G8 zF+F3@<9_PprPOeD{LQz~Z1&c< m{eL$-o|xhs`}Uc(SJ??yVSzmfO6LSbe=&(LFj#}a4GaK;UYOYc literal 0 HcmV?d00001 diff --git a/sources/gfx/ajaxLoader.gif b/sources/gfx/ajaxLoader.gif new file mode 100644 index 0000000000000000000000000000000000000000..2b3542497207707021696d31ab3f04b3a458690a GIT binary patch literal 4659 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 U-3q*%u=+qe&h)IpIRM!553u`&EdT%j literal 0 HcmV?d00001 diff --git a/sources/gfx/attention.gif b/sources/gfx/attention.gif new file mode 100644 index 0000000000000000000000000000000000000000..48ede3f50e80dd1526dab18daae3c0f958d59741 GIT binary patch literal 1044 zcmZ?wbhEHbRA5kG_|Cw>dQoelp^5of*Bgc+RnKb3fwJUF4z4`O+&z@a-RMb@7 z0Hq#1IdbU8n|E(a%uIOrcuI;&7)HTp2n@;)Q2fcl$iN`MpaXIpC{M6+d}J`>knz~C z;9xU{uvW|ofo4W#US+PD9|1|u%)C+#TULBXJk}*6nDk|bVT$7Ynp^?};f!{eoA!0@HnVG6A7qSjEKR<2s`q`8K#skfl=GmVDzfNY>Fh|Ltj$Y2csQN9XW literal 0 HcmV?d00001 diff --git a/sources/gfx/body.gif b/sources/gfx/body.gif new file mode 100644 index 0000000000000000000000000000000000000000..76d78ff7368e6e6575760c6c93ac2ee4f6c85faa GIT binary patch literal 551 zcmV+?0@(dWNk%w1VblXM0J8u900030|Noe{IIPe>qQpFkrZcI`KmY� z00000000000000000000A^8LW000L7EC2ui0Mr9A00RX7aL8$hC@1U9yZ>M)j$~<` zXsWJk>%MR-&vb3yc&_h!@BhG{uv8Eb43ng?av3_G(5Q4uty-_xtai)odQHWnay(#S zzUZ`i&2GEj@VIQ#>>pj&d<<2 z$YaXU*4NnC+RM{Rire7f;^X9<-HA=*>g(+7?qBB=-|zJG_V@TP@tO1a{{H|2zS~!( zpTL6%6Dll5u-d|h5F<+D)X?C>ix@L%+*2{##*ZM>LyELyfIXxF5ka^>G};!xUkv5h7&8cig>Z( z$4DDPo=o|swz>y})(c4bOm&z5y-YU)ak z9NM#F(VU*PmMxps)RdJR*|%lRtSM_&Eoo`1`Sb73o=s~QM!{$Z4A~G+{K>+|z`)9& z1M&eVPq1@%F>rIpcx+g3u$eY&g(xoRve!E5c#n nlO|41$&x=S6c#e{h%>5`Txe)$VrNh?xN~yz^7Hc;85yhrRBuWk literal 0 HcmV?d00001 diff --git a/sources/gfx/bullet_toggle_plus.gif b/sources/gfx/bullet_toggle_plus.gif new file mode 100644 index 0000000000000000000000000000000000000000..17efd6f4b50e39dbd3d884e7c3fb32502e816fc1 GIT binary patch literal 879 zcmZ?wbhEHb6krfw_|CvkQk1i2*OoccrmR`Eq@}5*<=>wz>y})(c4bOm&z5y-YU)ak z9NM#F(VU*PmMxps)RdJR*|%lRtSM_&Eoo`1`Sb73o=s~QM!{$Z4A~G+{K>+|z`)9& z1M&eVPq1_NFmQ9ocx+g3u$eY&gKc%FHdGGG#+U p(@9ogA)^;R3LBeRm<-}rCR}i2X5x}#=s2)p`T6+{^=vE*)&RS`Njv}m literal 0 HcmV?d00001 diff --git a/sources/gfx/close.gif b/sources/gfx/close.gif new file mode 100644 index 0000000000000000000000000000000000000000..fa0962168ee41011c56c6b8f5cebbe75afbb0bb6 GIT binary patch literal 70 zcmZ?wbhEHbFaLjV8( literal 0 HcmV?d00001 diff --git a/sources/gfx/down_black.gif b/sources/gfx/down_black.gif new file mode 100644 index 0000000000000000000000000000000000000000..81ba91c9702f98f72bf5ae3f793bc7107e58bb6a GIT binary patch literal 65 zcmZ?wbhEHb6ky0r5dH3``O|{VPwusxdJ#QBhM_vue$qdv|=id>BT-Xb23B5K#Qd0(OWFhy>*cc8)3r zMh+Q|4GRu7a|mmNWH=t_Xp-jPa7l1{z|P9TQNUoJ(89*X#LzM$VIxxmo2r{gfkQ!x zXQQBj$b}CH3%nWRg$fiVE@WmB5Z6!;@Dx&K;b*tvadB{Dx;ULpou#7d@)HM61+f;6 a%F9O%H}cC^tl&&IbfGol@*-Xi25SKAa8xS* literal 0 HcmV?d00001 diff --git a/sources/gfx/favicon.ico b/sources/gfx/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..cda179995d2d5408ea968e93532b1b7d413ba96f GIT binary patch literal 15086 zcmeHOX-t&o7M|wb&BY_bS$RB zqd)YA*Jw0e^@lP3(KP0IQ*VsR5A}x&HEuDQxa0;SQNoXN&vS6T>Ls1#er>(%3!doP=l;Wo4=0z))ky}Y(?MBTcFN0( zrPNf1_I~8ZSV~W~Yy7WXy-L%jP1D{hd1`7R=gou2=d1tz{rhR>&Yg7e z;zc@h=8WhA{AbLt(uNJ;guWRWA~VgJWffBT*UJw*-nny!-_N3j3!|vEHiCd%>BJv? zrN5Mv6ngOB0ZpGiomQ`opm*PmG4##Mw9}+XHkvupN=Zo$nSby%#f$vCm6!LOzZ%z9TU;C?{GoI89{h37m^?YAOa5!uu4Vfe%(5kF zebpF&w9pCU^Cf>E{I6ZRMyF1lq7x@h(18O7X!GXHa(_rjNaz+1bU%A`H2wUunHn0x z>xkiP74-9$vqNs z|N3i~*noZ=2CDyth6cV%O_clQj2Sbis;Y`EUAjcCU%#fCH*eCgVZ$^Gsi|>t|Jt-E zTw8~$S4R@ogSTx4%HP-e$DV|{XKQOK)zs7o|FpC?xw}GM=o@xjP++`|D&3=1`v2sU z-r4`LW5z`v#r8^@nZ1r*k^t5U$7ur z_I>DR=+HR&=9>t<*NV^4iT|EGd*sdzTQ4s!XCB+=?%lie>eVYcckZ0r;lX3ns93@t z`^zt3vgUGg?J{OzVXXKObLK?zJ>MZ`QDtSM;wRYQzhM4+$^YWT3wrkK89jaal<*9l z!}gCJJu2%$$p`x`Ew%EQV~_bA?}&GL{_vBk ztE*}I_U!~6?A^Op{I*rAR*CNd{|kGfHx(2l@OfgV%1RsS)ke#f*?2FAW!_Hy*2Q+2 zz`jd7ty&dDUwviaHiG8P6(7^UU&)0QJ{I^Twfjr(gSsQPJDK-}WWV2KW+qWlQ39_~ zC(nyh=0Pt%ctSSt!T#Uh#6B8i6#Ijm@biWa9U4?(zp{mSwqSn?5w&DwWPtc=4nDDO z+>)K04Wdv`R#sL^PEHPpLP6}?x3GWy-@Lp$Ua!HYf`WoS3kwV9GX2FqKi}PhN6h=L z(W6Jt)rA5=@`yMELZpkCv^WLFO1=L$ZZwGZt6HX~*dqrBJ>`A1n)kMUaJyoFVD_ck z3dW9DiLZA9;Wxy?|2Kf~1AFrT#t-ao@rQ2xyw!i`bdUY%N+v9w%`%4Qg%F>F-~Hi-HiB>56_30;J0U)a`00;7nq@4n z?+y6t>gvQVhHt!Y-@Y!#_8Q0VZApoZzWXjhiya}J;g71SA|=-BYdqv*w`?&>{PoK( zEgb(cv+rt%N%RZ;%1Vn*y!G{FEf%ep2l^d9-kA4fd`8U$Vpsa_6#k+jPiz|B1p~hxLwC1lhYlU$c;qsvx6tzo^cnG6sGVmN4@(h{P?}6>-Wl)E3{+B4k5&i z4<9~Er%#`j__bah#IS2?YyHZA{T^pPZEc60>#^6=MEc!p`-0!!{Q1*sNDF(1uhL%gsrALZ z8@>YW-tFV`82^L`6C{_Y$A0hLJ;`q=Y~Zgyqj0bE@|zTY&LPHep4DnNdq<4$$d6pC z8dJ6K>yY>C4*&D#&!x5#=NRe?Zr!>?Po6x{^sV%cJ+!2xM2)Al@RO7cp@lv_|J=el zwaQ+&Vugj)t&0#F!F#=3Lni!&dKHCRwRLsjoF~=x1HbxL`24jvcaI-GF84b%w!TH) zbIu$qS7 z+ftv4{RQ)Ydjx86ke5OZ*`{=0{^Z;#}dLKNqnt!&SB z&g*(|(vTZ+;<`c$f~Q6!gmJzdii}l121qT>FRw|-ESbR+nvO^OJr<` zTp!+1GwiD`cw}e0_`Hr`JBt+jxJP;6>K4Dswa2N(&t?J!*zfIf}S(x4eUz|^3((2|B1ri J+cwyG_&=Hrh literal 0 HcmV?d00001 diff --git a/sources/gfx/html.gif b/sources/gfx/html.gif new file mode 100644 index 0000000000000000000000000000000000000000..9c5d471227e0f3ed9e9ae48c6458edc2d4d70265 GIT binary patch literal 94 zcmZ?wbhEHb6krfwSi}GV|NsBrbv5(godO^OEC3=Df3h$#Ft9M_fH)wv49vRu!u`?}_L#>8!3Csr@Ed43<~ch13&w#8>^ z)dLmBaq2nC%o2X5_^(0=`}=+|jGud+rN!r5oBxD^oXA0 zhNtId9^3ujB~!yctCDuR4c*-hzPvjfg9LrsJ802=*`jZqAuKJCNTgCJAw&51_&A%* z(iFi{tE=<#^RSFLJ3E8Y=kt*OKqkz# zx3_n2a4U1(%b21$ur`|w>7&so6GS2r02}};92t3|7AV&0KeZa5)}#s)CkgSHsi#~}fZWN{(jfO4ZsFAYKXsoQPFy`MK;JF0?0m^Yhf~%`5YFZ|f0j7H4hT|n? zfLg5vi<_#`=}`Nx&cKr-O}AL0ZWnYP+U>@rXoCdQie6yQqF$XLe$XOnMK2Kf{OHH~ S4-Y$kl5f`Eq~0 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 literal 0 HcmV?d00001 diff --git a/sources/gfx/images/Amazon.png b/sources/gfx/images/Amazon.png new file mode 100644 index 0000000000000000000000000000000000000000..3ed73c2448fc1efcdbd1612c1d33a93792ca5a42 GIT binary patch literal 2193 zcmeH{`%{!v7{|}blCp6zC2w@Wz_mgyy31V%*Ii(N76vF&OQ6EWE^5gX*89FY3yubf_3fUT{~EtOR{O! zoFS*LifiBV(FQT{86SL`ovEQ6UfSxStvT}MxSYByXK%0u2k)(BfkNI>#k#9#n}@c0 zXrPewR?DeNlF!JQYXT=!PXER_i{;;=yzj8M)JYqiw4+c8&KjL!{1ofRlQ*yMp`&8_ zw49yb18=gEyT#-f>!}iB0oIzsx+~@67;Vm!e3msO^ZwV_slDQ-Px!gxtR;(I_(-xD zaj}^X9b=s(?8`FtRXHDghkj8cF1Cm(J>r)p4*9p|@_{3)DTSYVUtH~{?fI<3D{uWt z+udSfSX@8PnzxFHA8CV=cUSR~yJ(w>wq&!Or)i*o57+bIkJ;H;)_0iq)k=0tPX5Z; za%qEuHab|NLrMw9@&8!F4%9CnJ5Gp&)Rg+l;5Zg@ki`s+v4brGYv3qC4(9JXL`Zlq zK9&=4;ZcNG`b+vwTUw&YD8Lm}n+zWCp@N}n2=0D0!U~M3P_*rtm8-!B z4tQ(uIm*;W#< zMtPlSIjg*6Low`GS`%g3{F|TMtepO&7lW%GHFN+r0$}J%+>d9O9`zlO#FIcVCxD5sX#ju9zOv4*7{@8fXGPat2 z1QJjm)iemR6o3aY0`v;QYLG($vZjPx--H0z4I|yu#3bkBQ38Ps6f@E>DV0Nl(l*aY zi&F}AL_k#2?5a$R2mOZ~CSb=Llu_ld(L6jbf>kNt%#HwTnQIiLrP+;ttH7i&1dzE< zMLPIkt%Ot+DmW_I?K*Z6TzCW2Fab@62(X4A*as+EDPT;@Ap=6e9s~@1KlT9@@KHG- z5RY1*0Ek^Bi7alwkJ)O~L|p26F0n>pGz^0v0`XwL6ySVx;{fqzCO(;Z2z+2QfedUE zCcZayPeG=6t5fbr1Vqd#V6N-Y6)AYR=6*O^?n=#uZ3tkJ*>~RIF>l};0IOJErT#*! z-?QG>tn zch2|wzVpj>&iT&0-*4^uTq>{^0FXSJJGV1gtvva8?Dyc2BU4OR4{ZMOAYi+$Jmi$a zRtXe4Je}=3dmfYO;-}-p>-936aa-l;mu`o9?9!muXN1lLYcdMP?Y@3jcxD;aZE?f@ z`$S9mi(#@ck)+k}ILgcdi4Y4NvE*T>x$cL-EB>D5s+yu3+*eP&a|V;k$`_bK%m*3<MntbT0|v_fZ2>`bv^+zsy+|J zV!=3fXB#_GLA$k&;ivVa*PIW(XvS+xA%5bH^O5Zh+pgvp;7`$nC$=(j!q<<~J)p$Q zx(zcY8kSo2MyBvZ=6EiBC-r)?@L5Zs1zfCgLjvr*KwYo*Az@U^)PkTDyv~Wfhj(CS z?+B#?WGN_Js$xYlL}hkku*Ph8%=Y$GO~42t2o_h6OL(q&WGRMwAl+j~Y~3Zx^eaBr z;`*k0;(B*#hYzB;9E6JXM^|iZt a6LZ^!qxRn2%XXzcd_0@FI(s|zeD?+d<}PUf literal 0 HcmV?d00001 diff --git a/sources/gfx/images/Apple.png b/sources/gfx/images/Apple.png new file mode 100644 index 0000000000000000000000000000000000000000..ac1178d61d92d4b08838665e972817b7d767b3a8 GIT binary patch literal 380 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dy%*9TgAsieWw;%dH0CG7CJR*x3 z7#OF3FylS0oE)H_WQl7;NpOBzNqJ&XDnogBxn5>oc5!lIL8@MUQTpt6Hc~)EP60k4 zuK)l4-v|bq!C=#-O+en3En9#LAPE!$GJqt64N-$ey5DL}1ezvV666=mpl)bpWAEta zpO#%v-`Kl+_x?kV-&_%DS`Jju?djqeVsU!wBu}A320Se7uAJQp954RYPu1=eKF?ZG z6k2{$Ir5Ucmf9|xh1xw1-&h(JS0)&6CUwiYc@|DmIkeo5Nf2y_Z8I{A#&V zDbsrVgW)e3(`7@4phxznP44$rjF6*2UngDdToo@gD literal 0 HcmV?d00001 diff --git a/sources/gfx/images/Arch.png b/sources/gfx/images/Arch.png new file mode 100644 index 0000000000000000000000000000000000000000..eb350072a82553bb19700a30521c67acb3576457 GIT binary patch literal 1182 zcmV;P1Y!G$P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01ejw01ejxLMWSf00007bV*G`2iOJy z5eqH8it63~00bUML_t(o!@ZYXXk0}U$N%Td%L`r>i|c!YXb1_Cw<$43NI=K zq8U&`nDr%h@0Zv1tvWz3C~s*dZJ1yd05lUOJqs3FyXpX1t8sDI*qZA!5ggLX& zh?)u30nTA>*_msPuQ-5azs@jk2q@YSV*1%Izo`_TRZLc^`BE4LCOpdu(y*dZT>M3U z_Qnuj6(Hmw5W)Nffs^_AI{`!l4nRgoJLB6YzbW6TKWk`w+Myf?#yTQ=Y@PXEEtnM4Z671%YCMQH1q|5niudnliiF zUfO;!sn2nmm}5p!&^p1ul#jv52&N-0=DRZs_nR}o-?u!@P6^ZjcsAh-yztePUBRIF zZD`Whe~!<=v$8zRU_#c0P-(}(oj)a%fiaKj2F9lKq!)9=PJmyCU?C`t)la??j7-fo z04QB{1~#{J=88}k02Sl$GzsmyaX9}x0Aw}xln}db0c?y(%6M+%&?Db1YZr*n@i@Uj zz&p|405DvWcR>V); zGyoA2;*S<-+Y7x%bG^IfD~lome7#7&H{j?G`knyc=I(Nk#MN>k^v4Y$)Olwg0%!x# z=K!UIH)T{T3Xs$Edk};V7ylQRp|}8qe`D;jayYr=SnU*`XHkF&nyCWt;G){iv?XqK zAZam+MtGZ?e_pH|jSGvq! z=-n8$JpfKX(Yc|j{6ChWfLTpF4-vaE2r2;N-PPuh*N3YMPW=zCwXydB%YHwA(85a* zKu)pa*1?+m%gLS}9lJvSy$T?Db{O#jksV`|MdJ(rKKu0x!Dj$zQBLO!RToqw8yo-z zYw|A-RToq!r*lN46~HWj%wWWP005NP+EKuc+d*{FM!fe&j}#4J700ILU$-jK4G?)n wfeI+x+ literal 0 HcmV?d00001 diff --git a/sources/gfx/images/BOSS.png b/sources/gfx/images/BOSS.png new file mode 100644 index 0000000000000000000000000000000000000000..23745c64a156dde4ddad295c7d38798adf6b031f GIT binary patch literal 3211 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 literal 0 HcmV?d00001 diff --git a/sources/gfx/images/CentOS.png b/sources/gfx/images/CentOS.png new file mode 100644 index 0000000000000000000000000000000000000000..e2c8a1152a0fdd25856f71162163153ed53511f6 GIT binary patch literal 1212 zcmc&y`!~}I0RLJ@IVz`Ox`k8S5Eu89*S)xzEe&_=B6QsxD>KJyhY|BA&kC{Qdgrk$ zX+>Ky^1g=6W8^h4l2ZwJAOHY5@GDTS zJvaV`TKo1CTARb%Gj)v1uPy*U9kkQP+1Selu`vHwZ)`|xJSqkaxCCQwqK)B^C=A*Q zjS9v`51}0aKrI#N=>y}Fz}xercjUi>(hp?vkW|jw;SIdFZ0J(sZE zb)B{xfRBHFk`{wu)(stWyYQJFzcBBFTg(jA=jOB90CbwBBQ#7`ADiunp^?bN=pa7vNM0% zdCaLJUi$b$0uZFoNc4H;;jK0vj?os}1sZKK4G&!W{QfFC>nQS&ksA=21zE0qQgx4b zf%U~1%cs%ovB5!>i=i@ZoQ^WU)sb#p0)2ogBb}5j7}isUqIX%cqdBCqep^^}%wsIL zbmaZMAk*CTP=o#W`c)ggq^nfB^%e2 zyX_DXj&}_AhCAna9A0aVN=y9iG^5h3di&@Eh<34?La4pd*A#cD>%1ld`3n&OPVIXA z;i{d5@YEyP5wq<@r%I!4##@+sTY!7@*}|d1!#BF8K%#=_l{X+Ocyi6jz&N%$Yl4=l zo{4ye0}jvsA$GS=^%@2?SNQ5t(kE_|E$)BgO`#j5FHWeos33JjF7M{O{y2>(jPxGi*~ohZ6)s`+(S5sfUY`KQIhNgz*if>n})Lf;t zQftksHEUO|UAJZ(v6i-e-TDp0M(qvSI&>X|_IFGjrY=Kw6O-JmyP4Xwh1$IJduqFZ zzT%#kdB(8@JK1Wx@9Z$#v49&Vw=YS_B;L?y=QLjOLem6gvqU4#u9@a3DrR?={E);k z-mPenx`)eA<;8PNjF<5eOia1U%@a+{Of)R+er=tiX_;iU*L0;-vdV$fRr^y`Tl1IN zr132FsU6BNx8$kYW?JsI*l%q`*zz~prP2?lY1^kCu=!EPA=Bp2LB^4LhwN-<&N;e{ zS?iDG+S%J~IG%Ud!Op?aev3=ik)sZdPDi%6c*|8 zo6$E;->HfI_13wVsxz^5K5_N_agT1t{B|LsCLpmkChksPQhi)PY;a0L2){8gDIqkq z`EGLJ)wKHX^d~8)$q^Y1k@uR?GWgfCTQcsY-^^{x%E^q*@3@`c6m!2NCqFy3ur;qB zH(t&g|c8twnFz9;jJyIQ=ASse0SrY*EvO5Gp6N2`zOk$3GKoBH6N|F@ptk(0fJ~B_khq_DL*m_$A~k*5n>O-1UqK4*$gI=VG5j(gP1rftc}5&lxR2%9zx9^ zUBG!zE(o>L$W)nmOq#`q+R-5lDhQUK1Afd0kH z{2|EG4Pi5=`$4BK4Vn}bTS@_=jRdd#A+!wK5|klAl6P3dU?X%}=7cBH!A?hr4Y2^6 z4TJC+!QTm?Od3|n$QB`4`$@k@C^N*zh8Ll)xV6AoBUFf4K%+?5wR+mdTMHt+6#V&0 zI|MmEfq}xoBT3;)?mYyUz_9i{ZH#o5kM#UcTY`f7I6e}3^(lHN8%{jaf=}5I3Wv+!g!1~d q8MN6r0_MbV{22Pyh(UYvvGTKWczE(&zKHb_gADYHSp03)Xa56pxmFYa literal 0 HcmV?d00001 diff --git a/sources/gfx/images/ClearOS.png b/sources/gfx/images/ClearOS.png new file mode 100644 index 0000000000000000000000000000000000000000..f2a1f2ecb9a0f643f33cb0506bc9169b959a27cc GIT binary patch literal 4217 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 BlV<<` literal 0 HcmV?d00001 diff --git a/sources/gfx/images/Cloud.png b/sources/gfx/images/Cloud.png new file mode 100644 index 0000000000000000000000000000000000000000..0b0fd83bed3cd46f87cceb226a635731a5f62403 GIT binary patch literal 4196 zcmc(iO=wj|6vyXE{l*XsN-YRd@n#VhMkp=>#q!!13nE2OT&S3xNGS?hbs-8O5o&EI z-L670}ZvK+hLDBrhH{GnHeX%q)vUcwy zzRP#NUFPPtZg3OBiF-CWplcSlk7Zx(><#PdbfyHrjgvKd-Ynlfx6{r@)*rk`zdU$l zhmC0qfT9RHjeyhzU{q&6oH!hA-uiYq>DYFuJUZC!va6j=zH|DPuDX}|{`3ACV})~a zbN-_~0O(%WcHaG0?sU(_H?lt595zh3C{31h4B6odj4A$!I3xRd{}x+k zZA}2_u9IhRGB%`#e*HNt=JsX^&jxd0%ofHiK>z*wa~u>_i;h|aK&gK^_OZjWm%r2E zpixAr$Jt;*4$VH@{DA=t`f$Ky>pGNn28|{9kM0cCGDCG9sDzj!tlUUnr+7Epol<#w zT%!OmY0o+O1DJ_hwSO~jw=QJNi<-k<07mhpq8X|g@S%pigO|UUxJAe*)#evb+$(GN z%J@)Q$PclJELwb+#!OT*VDPPFQ`*%cw`pO>+c1~)ieu_@6T=%7um_@SObmAd5Vl~H z^Jei=C1yLhd6*mNn^eCD0}VRDjz)|>2PQQt(yo4Xm9HNSSu_BE#>kGE-7M3IFHEXB z{Gv%g365&Z0g)Y9d0ZVcO5*_l@m{|7-D6z-0p-o9z?gVW;m{gzBfHX6Hj8{0WW8~iDMMgaql=yYLoAx;V_JV+&?UnG0Bfw4YuHfh&Hi$GO}ouTL40dWN%gEFxkMC7uOL+r zc(7D8jav?VI<{JXl$<;^Vj4L+WJBtQh^FqI;mR9g=_-aQVhcrV2W5L7_1a$HC;HwFMiJTcEB;#blyuO6V4Uvf~ z?S>bU%<03$Kkwr3;|!!O048%F7(gP0m4V7{Q10!{s5)ho731~RZwSB^DUjknBTNby z6ssxx!_)TEqTA-;wkZJd2J34`Qaz~=aheu$HTplm_FG$>2W)1FR!cX^$&L%#X7q0v pDrU^U6!@B+uAK*(-u~(fKl|fy?@w!QoadzO_qLXPe0T4u{{g`*!HWO@ literal 0 HcmV?d00001 diff --git a/sources/gfx/images/Cobalt.png b/sources/gfx/images/Cobalt.png new file mode 100644 index 0000000000000000000000000000000000000000..674def8ecb4dc8669e6b932cfe0a50b366aebca5 GIT binary patch literal 1943 zcmd^<30KmI0>%GoW|lUVj_bT?%5Bs!d*ecxMh0&9Tp%Sg%Oy2)D|bcH#4Q(;AW^^s z1$Re9a%ILs++Zp(G?kHZ&#e@fTr!{YzQ()f{OKj(>+0jP+sQOU=0Oaj#A@GAd z^AAU)4je+u>Hz>Lz}ewCR9@k>f)e8RsRuuuyLI^Iup#$%&U#6%SSQ4+}~pv)(- z!Y91i7gZmWSnC_#5*0)Dd&EYi5QCGe15?_f(#oPUYva?)lQ0!gnJ*G?%_w{~`cV-Y z{S1vJr)3vnFwb&x3-bu688~8oRskM|$K!|uQgI=HNF)}JNTk%%(wtmc_ETy$zWPaF z8x~jk6kkgq(#T{Qp}6TekySz^6jO;=l#T*w2a)oEOl_x>P^sijYT5J3s^U^Aokp)I zudJ=Crq|Tgl+zn4DjRBQ8mWwy`i6!&W_x3OV*{g>!Dwn=v^TdiTUe~N*0u~%Zz|8rMj=Gj#tyft7;Z7U$7gRc`fa4J6P=2j=sj05o-NM*2@+~*HFi+ z!9Tcy_C8S^XR@vD3z2*xCU-Jgu2>6480>Rku$Pj;Yd}K&8GBzv}3OT%a-q4&tFgY+X zJ3PK5{Cn!%=*qZIESjAaPKrMY$0jDHrl%L@KF!U3T3VQyUR;`9{0H&;+}ix&>X$ED z3*v>(t6x_?i#OM2SJswS#p1P%ov&MK8{4~Eo9o*fJGw&*}A{qFgzb?DuoK*4_M&c>e8st7Zj z-m6HGQJKyfI%cfuYpbL^N83ycF;YG$YtNjL&ctLk9y>fXxX#96dUOu;mnrRRZvoLK zz@>`+8s!wwdZqKC;g&OJ&E>w5zTaz-cOfjz8PE9}CX)y=+00~)r^5{A( zGMG_Sx}@d6n~-T6A>f~7mIf8EkUC~amiZd{C- zL6?l)pMY8F{}O6wcSC=2@SCK1OJ@+}=^cyKhcaF+%O5OO&lhbN!m+Vpy8F)D@)gqM zKeYd}&+q@a=-;8fQg=N=XhYK+HWL&ZvpkYeoA+C!b{ECXWVTNsX_yrDQ$$jn&R?D1 zJLMM6nAWt@^SfVH+P>1#I-8KBq9gw#yMDN` zsY3-60p0)J+Zm_qw6+ithV@s$!V&jGHAQeW@KVfY;ekDC|+Lsw^Qt*J@G={np1;*KWMBhA=LPjk5&`6gbj(of$>F+1+9xaqJq zk5%kD>Oi=i5YjEdX}L=}(YkrqwAnNx$$=O$on5{1?N|U8ZUsvQz$@N~+u?&p6+^vx zluh32-yo*>ByZ`Sa?HfbUPL12U)g2qGQ$@Jv=pSy@Ub{gosHy*oxr7_K;Xhc{-S+~ z*K{Vdd6CIg8!N_0r~;~oOl{)KRJx}(^>?J6cnqpsK c-oM|Ml4f9C5C0godoUcp4(bT`-O4NFzm1Muu>b%7 literal 0 HcmV?d00001 diff --git a/sources/gfx/images/CoreOS.png b/sources/gfx/images/CoreOS.png new file mode 100644 index 0000000000000000000000000000000000000000..c955f77159741f5386aa6a0e527961f58d1eb451 GIT binary patch literal 2193 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 literal 0 HcmV?d00001 diff --git a/sources/gfx/images/Darwin.png b/sources/gfx/images/Darwin.png new file mode 100644 index 0000000000000000000000000000000000000000..a4d8d2de7f3240d0247657bdb51b0e88dd021fe0 GIT binary patch literal 851 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 ZXc<-WHTK)>JI#{1S@UYQ%~<-}e*r};N~Zt- literal 0 HcmV?d00001 diff --git a/sources/gfx/images/DragonFly.png b/sources/gfx/images/DragonFly.png new file mode 100644 index 0000000000000000000000000000000000000000..e51e1aebe9e4f2f94109a565b0c844cd2878052f GIT binary patch literal 1805 zcmV+o2lDudP)Px#1ZP1_K>z@;j|==^1poj5AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBUy7<5HgbW?9;ba!ELWdKlNX>N2bPDNB8b~7$BF*k#Eh5!HtXGugs zR2Uh}!F^2BhXKdo&+m>mxq8sU9(O-xhiGdJTeVSXRc@0w#pyDVwbNB1c8VG8)CBu{Kr)Y#+wC43A0M9$yujDZOB`iaenpJdSDC7)bF2C@w@zJfYy7WmI(go$V`tsk zRby)PQByNEn~IJLz6Qi|SI4lhu(5G*akGJLJg9<#f-4HBs;bhsapTGj!{`G%``un) zw{y#5wBbWjM?P`u>?N1>?2A%fUPr}twrbw|j;i^KQ>QMtwXe>t)kjTDd@EW(p~g|* zu`XS@OwG^FzvB1%b@S#;MMOko@}LqD5@t6vH0X{)hYqzQB_&;aajHXa|IyTeQ*M3s zg-h43yW}gh>)?SX4Gu;Z&O7yn&#tSDF4bLdYuCr73M))KlMtzyGiNsV{eIn1R8-Um zxcMK1rl+S@H#axyj+T}d?bx|Z-syc+QRUR%8(q5DOp8I8>ES9_9if{| zE`8bH(t;J8G;P*+oj-qG_o}Y0mdoWD!$WX;z1~x|Zr#$oZr{GG^&3{n=j*OZmz-Mr zW`uG;vq5tWbYP!Dd&(V}Gv{Zjt*zDljvqg+9zA-@;1P%%K74rT{{8z~0(7sYrY5ai zxlrlfbLbXGppQYLf0C#pM-Jkve)pon!^3L;JKq4?cj80; zmA^Men?7)9$H6DGcdtV`cRG|AYUm@-InW-^ulj{(+t$ZbzBfu+E1i1h15@7OXaOZW z0u~@1c&SsTPToF!`pg+NY?v?6)Boy(S;?A~J5+fEL$!2SvQ{ilR+cAGg*|&}VN8rx z4j7=Umj`Oaie&kgBx`>DP)(UXRKFPiLwP)&BOZ?@H#Ro*w^pk)4d@TpXe)=q@uQra zoX;yOD|PwuWwo@l=)Y-fY*fyO5h{$0)yb15)fP8y+|Y>=CsbTqd@C_AF^9HDN=jOC z{rYvaMN?CgO4h8&Z(`kv$HSJMz(~6gtuI6y3?w%Dz_%)Ih8qUq{_<5bnV(T-S6tvtJ=76 z<3CbUQ{Mxg;Q<93hB0`^kRgk`UT;NKR#s(NTH3o^yLSCOFeoU*sQN*wT{E_rdcE9K zfz6^TptSLJ73_=AgraE0Jr~vt;Kf}MhQ1X~2h1T})e1Y`gnTD=cc06D-IU=c7KC;=7&Yk+(p2Urcv z0erw_pwp}1-wm=tDXzSE zehMrDtU!050}u%W0}((-7F5@OfDwS5R!$%en9ElLZh{rflFZF0XzpJ z0YUr+KZf%8ARv*ivjdOuZ5j(34uF8CX>WSLvJ4OqMSIg5W*0#V5KMd10VbuvHQK3H v(%>BJRLUs$6YZ3zKa|r>J!yji9+7_oEp7``GM|i^00000NkvXXu0mjf)&DZ; literal 0 HcmV?d00001 diff --git a/sources/gfx/images/Eisfair.png b/sources/gfx/images/Eisfair.png new file mode 100644 index 0000000000000000000000000000000000000000..3450cef6d2d1524333846c321c413be84bb2212e GIT binary patch literal 3827 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 literal 0 HcmV?d00001 diff --git a/sources/gfx/images/Fedora.png b/sources/gfx/images/Fedora.png new file mode 100644 index 0000000000000000000000000000000000000000..883e96a4a00b36db82269a7c6864f69b2e3d782d GIT binary patch literal 742 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmUfZd~z?Faq)=OI#yL zg7ec#$`gxH85~pclTsBta}(23gHjVyDhp4h+5i>Z2=EDU1=9cj|7UQmqX>C4F?hEz z_;oP^_AvxcVhEeY5IKt>W*$S*GKSPu3>oVfvNkc~Zeu9e#ZbIYAh1m!W|~0RE`gdu z3Nd{ONz)Wsj~Qf4GsvFhP%_V+4V4-hc7_{>zW|-+6!j&hzv4U!Q;a`TmRd?>~Qk|Lr%>MWF7qRFFa-D=M&q_ot!_* zH?1!DdFbbo+b3DmzPSI8QjjP*_xnL=)AFCzT*gu?$>)wgFxHe1uHpPRvDdGV>y>b; zm57$j>_d#4zo#CWDN-ZUx2lEXr@(xk*2g`q;e|4bCp>yw(=ey~$2CVsGus(wt~))Q z{exl4h1msl`aL-ndMqb)S{|O%|10vLtY*N`LXk9EmBO0K!LgUM6cps9Oq;n>wN;>% zL#wq-XxCMyU?+`we{ZMYd1@t}W0@;l9y%7=_-G#JnARJsm(dxldu46R0jcTUA2qih zSh3-!|Dz8r_D`dyOsUXwC{g#i|GRIOc>AX>PvNM`^5 literal 0 HcmV?d00001 diff --git a/sources/gfx/images/Foresight.png b/sources/gfx/images/Foresight.png new file mode 100644 index 0000000000000000000000000000000000000000..34d427ddac898eee507610cf64e58a026a05dfe6 GIT binary patch literal 4196 zcmeHJdu&rx9R5zbKGv?=y3MkU?g7NXU^3jm$zzKf6BuDYc*GbJMTrS&qKPI(mcV$# z2PPQ*(rCm7goheH2qHseGGIy=;6@Ci2xEh}SJ$q4_O@$}-|e!o5hTNq@Xt{7cs6*yxS%%r{&pB$Gr%Rion$6;*8mc zImyw)A#i|5vLEmfSnKDSM0{RA?RF|LP*)dQp2DfYjM~O_Si3ZM!zH55$x|KIhZDLd zfuaI2xjPmI>_$wDi~#xx=p&$_dQ1X-UX8s#b2AVdi*J-3toC%lloADu<0VO~pEjyA z?Oj|`u5O8zaXOqh=fR%NQ}W1v5)iYDOJ~}YL-W%CFTLs`FryBIb1l1fZ4+?W1H|y) zjsT80FUn%oGqHA=W#*N`>j?Ith3hE(sLh^RLz4i>D zL@J?%hC@p=dZ-$Y=&LQ0CN4*g==oy7B7!f<1a?*cCmk!(XH0=R(ZN3*I%~cB=lo@LW0=S+4$Q8RvQi!yJjjwI9?3|?w-?%xAIpkq zbuv5_(?wa{lQn2_w|j^{(lYUKLJU4%Q3yD$qm^yeHa?ljHXUGchGabY3s83h%FUZN zTHl61WD7qB66S99hj1+doeGL=j8AhbBSUrgZCKlULVkHS(BaQQ1Y+~VhJ_2UCBS%n zw{Oa-)%CT195f&;V=j^tld&~zB9h{h*x#8eLB`$5glnOP-OPnvRscWEsB2(?_ORi3 zvGHn|e1AB|z2-w9NGldQOa{!U-oNH?DZgUNxIIMN3+Z%@06I0;Tv1-(k zRN5h&Z3rWWXJ(w;QFmIt#OdhA5P{Ked9aqDKJZ|VyuZ`N2#hH(rohMcq%Xccd7?zE Ooua3g79J>Av*lk%vM#^? literal 0 HcmV?d00001 diff --git a/sources/gfx/images/FreeBSD.png b/sources/gfx/images/FreeBSD.png new file mode 100644 index 0000000000000000000000000000000000000000..597afb57ce96270d2659a7903a430ae70879779a GIT binary patch literal 2562 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 literal 0 HcmV?d00001 diff --git a/sources/gfx/images/Fuduntu.png b/sources/gfx/images/Fuduntu.png new file mode 100644 index 0000000000000000000000000000000000000000..73e2e432ef925ddb537631b0605acae1fbd14f22 GIT binary patch literal 4196 zcmc&%ZHS%46@KP@?|bjNo4v`JO-D-K_wL^JV|<>OJ2#ue*zAwu zT;@G9XU>`PoO9;uZoFc}#r5v~ZUFUVmn>aLdXj2d<@fiu-+ln-U9@cJlB?EzWKQb+ z*NCy!a^(9fm7|&N?lwPaHgPt`%NQ{V6fxUd2sl5QPT(73D!ZP-29 zcz@q6+t~M6km*oGV0z_17waR&ph>FmbgBVHqX>T@uQFXHv{zq=fm=%^o`;g?}$jw5F}7!(k}Q4y3tL!0CE z9>;APu5`pbcLv`g_*PQMay}VW_~n%P)4{OQma&t5k9Yt@fl+R)|9QYj|L_uXA#hS< zTc*_Z(eOQ=2<-?z=4HA5N5-e^f>z7E&4~sNpZr+*?kLstA?v}UeAUlK;$U(VlN`yW z$Ef25^=07!`xoDu+1G{5=T@c#MWNR&@Kg|dYW#Q)qD>E>cgx^bcNldRUvBNg5u%%B zW}ebogrUfUKL>m~d|H$YABQT;dpj}zk>{}1jxXOQwL>nW!WIK@ViuG+ZVhuD6P4dF zJ(jP&3W_&uXrn}Gc^Yorj{2rYargV5*?}Y%>3)_N8C5EXD%CQsva%hgX&EyrhFDZai0rLuj6c`w<_C_$PY1xAbId9E z0bIeb74(Ih!sXP-bzW`LBB43`yaM0?WGbXwz%EXrS~}vBdr3>htP+of$xJ;}*9&k4&!`?HY!k~yN+AJh_DFF6+h zhWR2P`tEMaa;boZgGlQ+G7Uh{hBtw$+{B@qZ$z z2hbCvlG76z7t=ZJKB41z9iw4P!ioT`J0moh(~#H#klJjm$B<6+?L4VWO_44Af1}j%RQY@^sTg&S2Foe#mP#z7`4;*Ax&QC!}gq$`W76Fm2*wr36tzMk{DA2p?BgWU2k%Hk|3G{ z)yOj%kNoxD0r1{Dtl?w(V|rJmCrCKrD#0+15RX*gcu1hOy9>jgWcC$-Z&|y8C*9}t zR-rHADvDgui0Lt_RAOeGw8ik(=>2ZKLH;J)4uEZY?AV?$EapCJF`g-fc~4NnU#xTl zh}k~SMEaq{=UW=KUlWAVn6gh0*a%gsTtEI$;*rL@BVycn&J=M4_2v|QQLp0Jpm)S& zbS0N4qx!P mX1_N55(;`p1rP-O-?ab5WYN+qo43i%vR|%P`pgA4tp5huO%+)H literal 0 HcmV?d00001 diff --git a/sources/gfx/images/Generations.png b/sources/gfx/images/Generations.png new file mode 100644 index 0000000000000000000000000000000000000000..f3adfd0472283b6db52f844fef100a95479c2c0b GIT binary patch literal 3193 zcmai0ON$*v7(G?h-M8;!9vNqn$wV-s2qC!AtOSD+NkSk7ag&`J7ve^6yG zbO0<|zI5Rg{-2g#ZaJ3g_dn)e`>jjY-v$r6C431GcxxpW1gG%kn90k85c ztw2N2z?r!T>1wiQO4LsD#yMh#c0VvluY^gF(pKJ=E#iZkAcFqy7zv2Tlh)SgI!U^e z%#{*e*Ht^Wk*BdBY9xo!1iDLms4B6^Q%@zgxZhNV&_s7m$l`HM*ody$#dxj3CY9=TJM*#~A;) zYj^Ksv5P>mKGrr|n&4m;VL?EMNMDHs6X9@kHKukEH#J7k0UBEk1DQsnYPX*=7x(sX zat*)VMt?}RpnD9*x=0eVmQW=qhe&ccNOX=f7m-~gM05!?-Dl>k9d<6AcHd(`D=Y*n|Az7>R2U(U)ylXvs4kuRd z;|)A>27@t9J%Z!MT{)5T=T7eDDb~S6m}+b#Q)ZnBC*8`jd`OUHtH(y8Y3uZpSUZ7H zRXz1MtJ^5=_=;F5+RKtlbUg_~Q%lZ9`Ek_xuJYqGH!%{D&T0X(FogEWjsDF)dg~`f z{R1p7bkX*tm#G(E>8_UDnB2Q~4m;JZDA2cqk%b<4(uGHgJN@ zP;0&(F+x6DNWj(D^ihy0MHNMuSV!A4m19D|x)MUlEQm)aGb%O4TW@Jlb18tToB65) zM2vRSOqTVFRm9|FH88Hjuvhf83xsP)Kmja2|V9zp%yV>O612mj(8`m~<$ zTC;%o2! E16j?cHvj+t literal 0 HcmV?d00001 diff --git a/sources/gfx/images/Gentoo.png b/sources/gfx/images/Gentoo.png new file mode 100644 index 0000000000000000000000000000000000000000..d806c576b7bf5069dad97953a5c740c2e7c6f47b GIT binary patch literal 1890 zcmd^;|5wt79>%H8U0Ru|eQ9mE%x&K8PVU;bt!~Sk8>N|ZPQBZ7cUxPvc~eW1qCn*% zipU2!cI~&PDWN|YxT5e>v!(r{$u8HAr`K_D1NJMYet?nF@41thmWy?{hK@>`b0vLG+ zTt1RmkWDJc@m^^`PI&=}nx9>X&Z@~nwd7_C^HGA_oIW6Dun;Il=iMy?N^k%fho*pN z3NE(-%%$Q0dTt&E3ox;0c3vKjkk7{DHG&u}h-o4e)DsIDh{YTtk&6LZuxKF`eILx@ z7h(lqfe?>v#}!EMSSbN3A>u@YLNU3hnS>XSiXPl9W01()@{(p6t(HcsqtTj5N<^h3 z>D|&c7K>R^!{u^$?AkVoq**MH0zeNs_b~?Z7{orrWBWkx5rNQ!!wnSS`ilttIP5SU zuOJqU5%5}Kk(x-D|q8VCeEk@&p0c#cfgkx0)elvxVJR93b?r5fmT1C=^QtC*wHOk}c+N_Eg^ih2JR>^$P^!t*zQt;e@btQXuBpD>!sE?VS35YhHV$XGq0!3YEj9A&0)b8>(zmr4`20D6z$_Hbx3!tu z?=5t6%!tJ%vDhq?F7Wv_k;p2M*u-MHRO;yHa19Nqh86Ph@h2*kT&*6{YDctFn$Av3 zkIdN9W9jRA+10fulPz{Wa&>pF4-8oQ`W%CU)`0={e!^(<=8Vy#*Xf+IvrfI< zrPq552A9#eY%;kP7TjjDXK88HZhv95&O4oEm&;cKeFcxwf+6bh%dD?pGd< zdu?sq<5^o@U-xd|(}7**yzs!{V&Xmj*Mj`E1}1u|*zoJQ2&jj>+1BHIeA6QnGrf%b zpU?ECgh3!17tcb&6OPH#O5r!RX1vq;<-&ER_UZnA)g(34N#8nnIUf0PhcY9eF7bqK zStTryr?i-cF8s<1#zrtEj>~f3;Zer;KpsSBG9%b8@DTRm-pb*rVY+cr^cZ zi1ubs@h2g~c{yhK2kP;m+uwBsTH0+7;rpEp>JpxOc=~(IM}@1++tU3JDWAPp^xDb5 z&?BdFcHE8Mauf2FCgd;f-^ybz>^w-GxbwqKU`xQa4azu3v|R%G_s3_TIMQ&(ufS@z zDP6Sy;a|LD625zWU)1ZeaMUCOT6${RPL!iIiqiT0hd!>1lC3TpwDe5}78d*2r)g9C z1@yNcoC}9;40}-Z(J|4kgThf0Yd;yGPM&zad(%)|s4x1%#b1uWg69_}mIC}~_qYJEyY_>LQ`{TGh__mW4IhY}9N zNr`^c;dBr=Iq0+L18I{{`c8kGCE(;AKee0)jX2bLz42kDZ0~4rh~vHZ)tHRu zJ$WJ0@OSq17pX$@-c47Q89mGv}9d;Q32g!q|RlzwVj zwIlnP$f6mknc6Ht&jciJzHYAkDMW*eMn;apFypV15z~vK%|_6^x9HM_wrHU+z&irS N+0!x5rZ3K;{|kUas<{9F literal 0 HcmV?d00001 diff --git a/sources/gfx/images/Gobo.png b/sources/gfx/images/Gobo.png new file mode 100644 index 0000000000000000000000000000000000000000..9efde30119e0af4b39f09646e4a24793e5ba56b8 GIT binary patch literal 2193 zcmd^q7usjfTY9|HKVjd#@AG_qpWp9!(=_Ru zxj8ywX4u>?0Km-14dFDjFC_2jQ_vb-p2Y)T3fTPfmi54ve=iifHOE}K*xbAT<}EkY zF2QauGZnAU-(3dtzSFV4v|L%ED_>>Ih|=b6@US9A&i$g!p=obMo36)blM*~v<1|gt zFnO=ySfZT1N5!LIhmH*GIWCP$f{DqJ%)|2HL~X%A_07G+z7z?2w`s@u!Kwqs_MLbH z9j2dB?!O4PUG85{1oKX5c4rNioYZW}6`x9z(l5y?PZ}>|4Q*w>xO`D%3LHG*PGk%; zoHos_oM6xuf+SmUhH~@uzW9>9-x-4)r>(q{vE7Am-3?FS<>9ke;q6R)c!h9fl^{PG z&V4Yl=NgQu=xs^2He{M|3svjxccqld-fx!3Qa!0mm|PAk3bol~s&5~69j%tK3q~6A z&ChdSc)e?TUEc~`ry$RErW#6fT?@L~ch$j)n+6F3?<^WUSl{1T4D;@)fTD(3txjm} z<=(JF^UdcPBs=&b_8m`Yjpwt04*o3@gAHGlK~9xrYxnb|vU^kXyo6`{`}l4}IdQMn zc$Ozwq<(UhBX6i3nPK9VHmTEFVS-TgwW>pN$MvAzkjkwB~fn=mPl)tSVJNEF5c5)j1m443!=F$|vwe6TBp{$Lsi= z&92iDV~KEhE!I^gfJsVOUn};7t5d-pm$%?F{Qi@tgs$09(`)$2@$B#C?ozR;NTMzo z@DxaFad=(NGmO`5r>lpm2ekVw{js?4khSMgFN}9|9T@$mP-#1F5+5Grvc>K;k*T-O z%90a>I{lE)erB|tBOOU{im)EHUPx4HtmmC=42z;(WxPA=%yNp`RPc^P`vgG^4e>Y!fg8dSNOjRe<(ml2|VoxR;;t|G*JM)<&?={4DE2!+7xvJDe0 zxJ_$tnDx#!r-3)F=^3|39AhHFs>eMq+y=v#LpfnLy2sFe;f5#D3P1=rL5q$7@c*5# zeEbLWle}?s!?xo9%xWd?5XRD3^8lE-G%|e6mXqR;g;QnYXoeE()6kHRkkC~WMMdoO z8TY;Qu28BDuwTp7;QHGEO9AqYg@R3+mW$q5uVy+v>1N_!I+mFD%0SH$pLz}LVd(R6 z-t-B4HiGxSC&HHpNKd9~(Xa8x78POdPL_c+veA#ej{4X~e&gNW2~=}^Ulzps!Q1)( z0Dp~8nf`gikAWj3H2wwvYIyTiqkScUIlgjoquIez@+A*w=sEMhQ6ic@+3~H50YDc@ z(-i=oen^scA;FuE0YDduJr*sohtRT|ECcx-5L+e--v$7^BhUq)gHB%Ftnq8TPk8Gz zJt*@Xi1QDC)d2!v(*#J{q$hNU?teErlpHmE)u|e8}feoQ<1t zmgArZAk9dnmHD3{4(ve;a%fXiYsIjsNo0bqM3jhoGCb`1zxr7sVFQML=XS!|Es fl}=C$_?{9ppltQ=QRRi~1X4w=j}B+8-Er|>^MSgX literal 0 HcmV?d00001 diff --git a/sources/gfx/images/HPUX.png b/sources/gfx/images/HPUX.png new file mode 100644 index 0000000000000000000000000000000000000000..6f55dd42698a7d69cfb580f068265232eec5d4bf GIT binary patch literal 2411 zcmb_deQZ-z6#u<`tXnv5-(y3L6)>KLu=(`~GsfNpPW?cVX6n#u@}DC0KwoqNtb z_x#TLo%3#Yt|}|BSyC+kY^5uTpJ186GtL~v&n4gc#1LJzqGBTu6E9Q2p%0STmR4F^ z^i=g#B`$hIRnWk0_Zao=dczWJN!AYij_XIKj#_Mb+pwqJGkOo#8JX@%z**$9j%uTo z>a(f^2eCQVoa^(#o5Lu6lVUm_tHr+G-`L+gBh+b!??}K}Xq`8S$vWOoobXO`qXS*~ zGW~K5nm%$y2VF28@o)Q8|5mgj7_mR7)I|;^6(v2YLj8slNMDP!U*QpCo-R9maXPs8 zvTh6@@T%Qneydo)Y~ zY`Ma_J+y@mSztL=o>Z=vMs|@ao0Igy-uCeYK66c z*IjmRE z6gCYu&6cwx%18kNY7TM)L?18?Jf=WNvXSjOJM6Vwx(rRzUYo$gsRSkA-JA6{e-J-N z76uqRykc$@jm}Uld8vaN?V3pXn7+tD)-N8OlvtDp7fYfkJz+ zcMnBV6;0Bu0u(fGe;lL$4J9MFPZD6cexYumBMMQ2{HE0sFEb|7WQMt&K@W(YkNgzY ze`6;9a7DT7VPLk443~fz2(gO&*#9}xVO)1%-Gakw4tH~>jqS$n$MFf4qZi%nXrG5? zP{;>c{qXap1~BctLl|;QVJd;|i8iqX$AYO$c_t^-Dte#N_a=)(_L-$lstd(-dvF$< z-A5cKNN4FhlinVS*kNw7U+Fm2vK(es_DyFXOhXcq%DC4$=_hIn#aL5Z1sY z+Qo_0K7Oa!`2Lba^XZ zJZ`beV7iIRw0%0b*#8f(_{;eBD)!g=eQCP10*h`_)bqlPuI*~ zZ=b#^fyh?)&UeFvB80MIX|2$rC9pUgG%iYW(iYBks#n9n;Kz5daNPoeU|#$%LpypppyZ)__BLPH-#< zlM^5B^_{C6xk7zdxsMcrirQMk(u$T$IzT!EMEGh{3Bjjsxd=qh0A5Q5Vsb;+_6B(; z?Gwk$S;~WeJQRTAur9k*N{2BR)^Dh7wS`4fBJ@Q>evb-Q~-L99Eu}T$|$b5S2?b+ z!14sBmhk@9mj_;hivB@xmgYSeO0jV5>S`Il%|!N+=kayp_2jmCu%L2QTjn0N;KkhfGF!J$AW7nE_uHmv=W1PS_kAgvgnCGnrnTzKc~NS}aoNZ~b0yI57~oV}ujTO% znDu?#-eWx_n35dffTvu{Gq_@*tECMv6kyHAM-R6hodnZA6lZ;Cg57!YJ8{j;QxmQ{)x)FF%LvZh3-o?;q-g^ zwT+9m2#31@9c9ms8CdHsUp1>HcOmX@MRj8i6c}OcQ$N)%*4G(kr!<2DAn8I=<|`xg zvEM6&=L@r8Sb8#-4F=tI^A?V(#3i@EPgVLjLxgj>xWaQ$Cr;IpkK;B=<|Ed`mx z7FOs$Ul8ODnePS@e}hooj|h#$$-cy$^P#*TFKHr3{O_G_MfOLNP+#!BC%K#<&pW2< zs`BK&q{59GMhLoXpoY>3)zecFAZu(s8F1=4z4mkl@zu9OMmOemh#Cc=k=xW_^numx z0}w*IS0JjzfT7K2UQ;03sj$TMxZOtnT%AcXipkSUgh3y@$}c;0NSzlg!;|HkOS#;V z1`O=xRc~#cQ=1#hTDA!j(+JI8BUoi4NEU^cyHs7b8+99InKe~`8=yE+Qgx`P&{#Mh zNZ3m}&}<)U=}PMmAQ;Rg+hE$wb;g~Qh^gv;c_`%%u^Ua5jq|q%) zCQw#=vM-wwht+O!Z*?|+#rCx*0JB}yFS$z%RYey+-xD5DU-a{lBVGK^8QO3I(I#r3 z3_e&zmezdqVnV}LrE;M~qdW+N2ck;KU&)~$x6sYhZ=NIE2?SFWs_v+chni&(LJA$oO_^qj1z zAIRaza6tmi+YRA={~69`$(iA}^-M7L_ZD3RO=JRej?6Qpp_foVUvu;&XdF>PGZQlTj)DB^x zx%a%a=ZpdSz&SK)_%hF)=*iH#xpy*TzFDVqUO)shDv$UXfDljwp^FjFeH|b+tSA5B zLeSMW0ond20JeBOQh3`mXSeZ%AolpvADOpK|HwzjtJ+?9(`E0*mp0R$2@=&*7^i@tML?BhW00uWzh z-tf4qTlY3K-y)MwU$*LE((DoY4z8VU>;ydEpx9-yrNOU!KFAZp5W(c*;>tw@TN)~7 z6&=0|{-$@KPE+h{0NM9g&-6X;Qp#c+JvczJav>`**&wv?rtodFayiR(p9qRKgk^@7 z3z%@Y4)Qh7uWW#m0gu5$An^hf)7$&IA>Y>naZj)@nzc?Rn__re{Oq7m=nKG$SZ=a_ z9UM8D>F5Pr#+VCNA$4r5Lj4>T)F6eZ zc^ZTg8jnHOU+2T$yjLMD>lyNxF_WgCZ~0I+L;`1_OFD08)y=e#SM{qyrU9m+lLe$- z>K}lkn=C$T8r{_drt6oW>C^4x)1%w%LA-K@co_oNQuXG2nu+374Z_&oF(Zk_g{U<} z1RsP-9^$8jq3RdFxl?I$s?ENMsP7;eSm-3qYPX7Qs<*`0UU$3G;LLGrq%wA) zkFNzA-E>s_owI<+xW@x1i5xpyX0{E_O*7UM-*VKRjX*R9?||=7ZnE++XBt0*8?x_m zgn@|d%{5!oWrP20u2xogEnHs@ocU~-(V8AGNQq9JR=RZtjLAqFRAO%2pD|+NmDCTJ P^zmaSmG2xqPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BKeVQFr3E>1;MAa*k@Gd8K`;w1n81^7usK~z{r#aC-=lVubxa+QmhAc25j5XBe~ zg7Jd-Lqd=U$xMtGgW?YqOpJ+%B>oXX76WP!H9_5-G3G81w=y~g+XOaXtXsc+?bfw) z>)MsByL9cg-ftV^@tk**uw_?**_)j7^1bhQp7)&RocH|{_Yaj+k$m#nMf_BG9>*%n z9;&fV_RSb~;f9ZWXUnQq+MI_??Wi?aE*PkZ^mFO#uVTVQ`zPuRTZ)-E+ZZdBQ_BIUyU&si!m8naYIv@ z{ED&$wHgTnx8sP$Bcm=%nA;yfTdxnX_~_5aGxp6GjK!FYt*EX)m%RRLEi|$$9*(v! zVZLAxJ5>g}bJl=JcxcYomO%!e| z6zMw3w-#w6yl5l>uRn;)Mkii7Lu)7S{rWN5(aOx50Bm(=dnDI=uRsb%{ zl(C46oinK=1YSgb-@HZ2{;;~Cd7gq9GE--4*wl8 zQWIQ#J{+mFV08|I%b1r=gwkbve!+;MCc9Ao0s>VK$u%@*Z>1S(s)B@%geJy~KzwjW zTs*nW(}(11H?iYf6Sk7DeyeRkSHBO&jvo5YD8M=Vi%#goj^|N-Sba*51J^AuyZuxt zA=s%W)Hpo&@rFeZGIV+-P62~AclF}MLOqq07CTD}_@cs$m05Loy-*9As}FuE!%xag zP!Q-$O2b+zyC2k6bWyr)dHRtm+py=~W~@D>!Hg6Q=2H1?E^dU~?VXrFzu%9o|LE|6 zstFBLVhk1uhhU&QZYXG=qtztJPut#ul_ajmNdv#v+i+ZC!*+_+svJG$kUr-9C1E)| zdz-|VqHPn^5vNqf$I}4szR>8z^QYACc>SW=sam>l&g8%VEj~s->k9N}clQbs?-vhM z2ir{21=~|u546v|Ik2 zMWKBmR||W$N7VYK@M7qc^w4<5A?4$g%aM@UZ32?S?Q@{jXEz}{GyB(E{ zi^8_4s7V|!4EWtu3zABW7^K}Zp%0ZhvFk0xIyidzV5N?ErL_xr#tt03ZpJ~X8o7gn zHx&Z!k<+8~ZS*~g5FNR@OZ8ASccRqn#LM{->TbEnVGOt2eRzo)6h~k|hD4>O!>W^d zJdvTn>@>1e4VF_nj;by9TK9wm_~9@0R%|M)M>srmJF>d_QA@eZ&{}cD);)Bopa`T% zR?%!Y|E%;iITCgh>G0)M8xGa9prFYK9f_FdCcq~}prNx5t8*nZIyrPhCm4sDjeql} zrrm?3nRQs4p~WsL$7|GZY#u*VP*8}Icg)6f?+2e00e0|nT`M-`)xqu}wcjNnh|r~^ zj8gGzeglb-w9@E6jQ$&W=8tC+5@4WUFn~kXTd@A`dK{pWu)^9cz>-Sz6df(Tt+vpP zy+Wul66a_@W7(Jl_@2f!nz+Yt?$nMRQnLl0RW@VarB?i*v%^4Ll0!T4Ml@Mt0>kcv zBX7m`Pi7!d$8@t9BpWNQQ!&OEb}OFt_W~Z%`eu|E)B0|h7}NT8JUv69_z$Byu6&ob RYl;8>002ovPDHLkV1g#@6&L^j literal 0 HcmV?d00001 diff --git a/sources/gfx/images/HipServ.png b/sources/gfx/images/HipServ.png new file mode 100644 index 0000000000000000000000000000000000000000..4df68cc7b1dde7df89188f6b0902848ff6e1010c GIT binary patch literal 811 zcmV+`1JwM9P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BKeVQFr3E>1;MAa*k@Gd8K`;w1n80-Q-iK~z{r?Uvn(Oko_yXBTZNinSq@y}`w1 zTSbbj$jilY<6@QNf|M0`xgjJ9g>XSz8{q;W)?0Zi;lh>w%IACLJJT~i&o;Bu>=obo z)STz{d4A8#nRA|VO8?Vre*GR9g!}LvzQR@Lb$NQjLi^xnhR?9l+Vq44dO*KA_XWg5 ztJ4z}I1m=h(PO>!q4}w>SdKN;TOXQF_W!3WvEKU7d@+1W7K@BoZ7wue4wv9Pe1bbL z;Bpa;cfk*ci@$|s*5tLp9(V-0RbRqUm~Evt6#C!`#Ku}|hqWRc55Nt015e>3EO5E9 z_+^N_#AB%a5)8D18s#PkeX)7g>jrmwGB?L@tK~4DU!N0GhOE~O?#(baGGVnG2DStt z$3g4zyWu>%f+uhoX1T1oPIInD6|3bi&>w{iyY0>aT~M)pt!PI0d^^-4@2r-?fUbe( zi4f6MJm2pAWIWPmXDEzEPRpwagR4OcMOk;jPHXZmCbdZAEX{yh$#}{O$Y0PDdO^3( z2lxnT((iH+j*mgEvDj!$-b^?Ix>Z%v)AAg2S!pgb(3i~ZhWZOTtkq<)@uow=^)LaI z#m8W&%dHDdyFd@13vdFe+cKYZ;cDyd_K?Q(-){zOxudWF+FYJmn5bW==Rta!#Todk zDP!6j9@t5_3v;bC7AEMam%Ae>3|lS2vG)G)q#n6qwXrZkr!d#3!fUHVI9?a(IU0Xc zLaw)yiR!(~=aEp$vDJG0AYTuYb97plzcPRyq;kF(wbpo;vq4mbza1VBhYSb>S6K<*ao`N p>u#wy3qkJ}o1o#hsDCk~(jSVuTeBYouwDQF002ovPDHLkV1hT5e3SqH literal 0 HcmV?d00001 diff --git a/sources/gfx/images/IPFire.png b/sources/gfx/images/IPFire.png new file mode 100644 index 0000000000000000000000000000000000000000..5e7870f5947c0de59f304f105758c8dfdf396bee GIT binary patch literal 2763 zcmZ{mc{J2*8^?b%!XQfuk@DEG&R8C07bE+UEQ4$@7~3$$lwA!mNXb5yELkF3S<1eQ zA~V*Bgi0F8kYvsJj^{n^dC&XDd!KXN-*a8}_j7;Gx&ONHmgWW=;B#OA062^cVODg# zcw8(e>3eWk*alrdURTYo0zmykwtY7yde0DSWuObx3<>=>cDfr{nE^nU1OUXu0>CbP z6tf5bAy5EVas>djYyjX3%xk%>K|eTo%ftXiSNi&+*BVV1)<8r1U;tn{eOwFxA&>uf zhz-2zMc0e}RQzsUK7Gb)1iNYt?=8*rP0rUBcpI&>?mR@*oSc2>wc0xC)U*;XI2KTJ zM&U0eYcOvjg{_!XM2tw}l!#Cu?A-Ofb!!86&D}Ja=S*TV5u_~59X@Y`lxiQvwwg50 zYKCijZO?q(&R;v>;^$D2C{jFXt<&BZ>D*q_WPnW;?1TcjN0Y9#I@YY9hYsPfTCtq1BsOiOPeMY^A!h_C3q|+M&=T z+gSL)B6xp81fClgSqtt0y)d=PAbWiy;B)eHT0Beq61gi$KD~FlQddpeYkJ2!tBrJ` z#bP>VBwsbp-mNt%Kfrn^K!IIvFqe~}T$7nC>I;ML&j6dT(zb>z_LVa6eLVSf* zdtc+`PsiZXSr@Ks>@)6f9-Vl^Fy^3$n<##5Mj~87#!7)@NC;#Ts&uL`e`EzGTS1jt z9a#UCrzz;`FkNiLUaH>MWZ*}`TPWm(lX zjj_2gogH3?7KxZ@?zQhe#stzJ>&+_w+MC&%^W zKVNNhn6p-J^}1dka!qnsNKk7$0=a7s-?s$bU40;}hUoLtO{)ZInYB!U9_|Ia&bisa z5$h2#ePz$Z!Ht$O&HoxHSZbB}U497tR2Yg?U2e{AWWHq|37Xjky($x63i3wQO-ZfW zEMcr;o>|T}HH;E`MK>bN+d|WE%$%;VVwr}iWKVv6A&)@6WC2OtYVX+W%cplphd$fv z7rT##2@>BBy(GO*8`?XAKuAY5#td)Oa^6=Q0Sj9@;Y zIV;O&xAV4>^EatOn@3g_-CCH_yzjYi(?~@F{CP*7Y@o%dJ-yAKI-+^D2;G!4zY2S2R-v^uvE6otVSq-X6qExvJvtv$2&O#al)nP&W^|BA@eXvnX{wCvedd?Z>j z6?1m-K^^T=_|(hoV4=F3QGVeX^+xLsKd+4sEQtf*D`I25}=qH$+m+j#pM0-(4`CvM22n+df zf%%>BG%j|WU!@s7r7)I73A|_@DF8CM?r8M@RqNjG zA6&}U4@|$rmb{65wBe^!UlO#->3q;!ZlRj{SA7DXMZ8MvHo(m4F17z(1 z5{IVxroC5BWq+oJ?zUgKfW^goYGnji_z8aA9$Jh!J|*DVgt_R!_|63X!J2zRv+?NP zV+{puzK4t31piM`Kg z|9S?@vUaNZ6F6V97S2pAnX^Z*o~qV|5Z5p8)VGTi^~r zlJCZCi~WWz46sc7 z+{`v$E=gO~ln`#yg%NT5DJf<`+NJ~*xA(c6i-9yOdiwhBI8|)l@NfLiT+8F{L%19O z0X;bLtwQ1^a|c&HZ$(2lv0MAb+qOs^A1@u8Ii(`GXz(^#)lkXKv30kj>TJUsp8J&F z(y6>o#o7mH&@c;AuuWu|bnZ*?bz4JGf@ITk6JxKnSn5BP{SK#M3lp3XZm zsGN+~pz^OyB=PwV1@T{^*?%~kzwWIIelG!$-3o*^Jf;x5y%W6Mg+%IuL%-tL6$Vu@ zR|+wPud<(NM2p&-Kj#8w6!&IvTawVVhh3VGk(Gic_0?c{j~H8?ek8bj#B|XAM&cNK zIL5;bgHUrvBj^GsLKUELPz5<9sI?+gO$n-|Om8o%L7_%Q>vR7D_@g|Ko}vFAxWa4V zL>w52Be3b(- literal 0 HcmV?d00001 diff --git a/sources/gfx/images/KaOS.png b/sources/gfx/images/KaOS.png new file mode 100644 index 0000000000000000000000000000000000000000..0e504989d685ee6653f2a121e91a622c9e76ac76 GIT binary patch literal 2257 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 literal 0 HcmV?d00001 diff --git a/sources/gfx/images/LFS.png b/sources/gfx/images/LFS.png new file mode 100644 index 0000000000000000000000000000000000000000..3796f48e6128987490cf7e6040319d8925ff92cb GIT binary patch literal 2193 zcmeH|v1=4T6vp4o?966o-`q}dm8OWLM6B`;C>P9u93dWp5YW=XLNtiAg`mY%vC=XG z1W6%+jid?|VkN;s1RG0BD-EaLo7r%;`4d7O+|JFs-+b?zx5M4D_0hH9&v_yW!?nQ% z#wGbI7(53%&p#3wTE9MCWzQcb{q4#2=4j>De*f^x=kd+)&SdlFr_H13(aPmZhr9iE zZ{NInwD|k$;&eLQdTcw*JJW;Vc99$Vc{-&0SAAhNtg=Oa1to=3zu>1tMlgJFPk|*+PJ1R3kr@Ux% zh#3%D!0QaOm;jvi94mM&HrS9$2mp)1k!|aNOk|G9PZR=xOWwT6Cdo^ra;X@JKqB%$ z-Z)P!D}JegIj6HG7^gLJ(!@k0s4--;wK{KdFl=pVnJ7kX2o<8Oswy4Ab5&Ve+2bRl zh5(kGt}2mm0vcV(iNq?jiOE~zK}g{!Dd)I~WL!i*K>%!Z0K9jpl8=@44(&i>Km<9R zpOX~HfP(tNobatdclRU=>YB#L^$ zijK!0R%#RslxhwDQYbkyLc=6lZNhPWA!&dJ8HngZ!>C_Ng`AWcs?LCqn&ox30<}s= z9Wa+aOxQ>YxI6(T48{bpsFZxm9?&e5fP@JFoplQ0*sWaDQ6!8@Cebe)v8FXRg$P)e zTjxX|DKwU`WYG!Pj%v}B?kgmXdzIl1^!qM%$gYVL~;p%9xclFMb{|2a7PXGV_ literal 0 HcmV?d00001 diff --git a/sources/gfx/images/Linaro.png b/sources/gfx/images/Linaro.png new file mode 100644 index 0000000000000000000000000000000000000000..b076f7a3e4b02be8ed59d0b0d37ce84d69cdaaaf GIT binary patch literal 4217 zcmeHK+iMh882_EQ>}0ap&1Q2UjY(Wh3vC0jB}zfthqSRZFDgYJe3QJCf~A&FD1oZ+ zq2NmkN*~lepeWSGLMbh@v=3FJh;%Da$RgTAqmgX0lij(UerMN7=eRo?bu0Vg2eap# z?{dE1`7UQ>Pwd_OUZStAx6qZ;5dWC;ddY9e zfqnMfA5L~b!6%F(!hUU63mm78jPviM6ln0MMxvYxV@~?+)-19rgQjtCQ*i0Hh7KhG zA0v<9T$r?y%{DP9r(otsHbRKfFHT}8orTx31aEM*R}^y;yX z&&x=+^&mmeB2!ZaK=~*sq5DYB!=p_kBL}L!46~E^k6JG_M)?ssYotQQt#8JRYnaOg z%-CQqxA#lDVWvUKySe^nw0zzDxmAdO$Dw21K`n;M|9Ptb9UT5`eDks|OK^{*SH zQsHyh6vL}xApxjwwZ7EEfD=OpMW+J5L#cS}yK`UcID}HznhME{-@{G8`(FX5w4I97 zT6a+QdDex)^PhkF)qEI0crL2Fsnm1;ktxWrO)WO;tqOQtgy>VGJFlYuCAx@o3o+*+ z2If~l7h{7I34jW9qYCeJ4yCMeuf5*m!2K`rFiM2Ly>D}*xUi%M; zCR{wh+JvJA^Qe(Nor*4))B%s`Mn>RK#W;#q3f7_pBPnEY*!StyjI3^l5L5wFuzBmI zbH`5t8UHzXfaIT_U;cgn$tNmYQC3M%JAqWRXW#Av2M(NMkl*u$N#xI8h;je^|7T)k z6yReF6#U5a^-V`xCq8R{$rKkzN=annWMN=p10gmpCQcqEUJ(Xi83r+B21zvrSv>|t zBLyStfFS?75ANVHgaKKizOhb7L=b51q$v}@Ml&z~QyCG6nT>Jw+*z&dEkMiU6y$&m zxUnb}07cK9KLb=vjGmuGG^wc+jeYqadXD>7SPbRgxF16HcClL!mYHmw<)hI zTfTA`(1I7Qo&ybprlNBf&R)HG^}~k`pFe-zv17-XPdwi*?trHaE-nr}UjEl_U;X_9 zEx3Rp92}fKetiG-?FX{5?Z@PQC9zTAps;cVk;|;X{Xzsy-2QOT>@a@~T>#u(Q z{PY%CC!DRL@?TM!ftiI7?iIKckn!s`BT&1Wi#re@#3A7hA&;Fns;aI6O!B~F4odQ{ z1PY7*2;${oxVWAH7(;LoxEc^6eSWZ?FS3C^Hc%J@np>Ov0(^nKTd`tANOh-(Ptm`h z-yl-<_IB)S>_9fq)t|pHBvvv0Vgj*&B0zClTN^fZM0vx+1T_$%7eu022;>&GO$53H z#c43F5D?6slarB#W+1|HxSjvsJz#q;_zTV_n&Be!*H+I7O*w{-7#LVtStaftgsB5% z2^c_T!^DtijnB8jLc);*Kujza087VM4|AA0WS=0jVe&9qSy}1t@2@Z(g2rM2P?DXU z-O0%jp^6BWwYBxMDbukiM2izR7g(n1=;;uMRiN|0C^I_)SdPKTNvd7q!3&&$i}_wV0Rrc4nRl|Yk) za|u`gQCCw}{rvfJZf0M(l|ZumOe`K+xzFMo^CD}Q8D_1%rzo(Dpw zWEH;%hZX{X#HI~vAKyDD4h6oE6^`R@-P}dQ;|ekv9ho(CuzxrnX&o|?fQ?QA4h(Ld z8$g*G_LG?vDS@fTGf?aH!~3i4AhIk*+<=H1V&>oMzjp)|EJ$#p61WSBUQc@$CzrJe z-28QmF?M7n`VV`!L~+;6g8%<%0R+C;+XRp2K{)x-sIokm4(tb11-5kzQ-_Wsk+4bc z|L}W9%cU`r)X2rhM$ojU7ZXR)$ofN2z4h>Det7i-vlv_%(ki_(z>5XSF;Y z7fQr{lDypeG=#Pee$|FOeI91-%g8@a3$MC@SS5G@)v$wi6W9fp&gXcge9F1Yuuu{) zp&E!N$>Da=p|7SgbZ8;~-Fpu_8$&p^BMntO3x^az%R-EPKr|&v-$*xAklCrw!cp<( zq)^w!Ia+*mDXIe+T9&SX>UjbT6WGps?TEZMF#$V~-Oags>oNV$X$&uFLc!xj?e_AG!V!VvtwB`Z z_bh6wen36xn9BVemp<5sp+hAuaSsqoJqm;YBf_>+vkeXYpTVzGx$K#+kS|_Ep>zV4 z^&U!-*H9IlkCJvDg8CNLrBIw1YE5BcbmAo}f8hYSxsL}(js%^jCf|O38R}Y3BH#_d zRg|QV*~C#9>9&TF$-bg+&Z0xP&30g`0*>XH$3>tKW#sdZVcz?vWJ*w|QIY(8mw>l! zFMLXn`2xrmuVZZDRb-~eC^rQb2UW#^hxhRaDuQx0iI$tnVs!E~aAoQrJRpmLm8Sc1n9dDieDXA= zOTWa8%yamA>ICXTXPIlZbH9f~G$K_zoxFZ>h_pmieCZ3{#^>hk<6XhcA0mJD0X&>2 z!f=@vXz${kyMc*^G$am`5s9E{TT*m9Aie6j0a`U9oXzhE4c`gaSl9U3RS4|KA|=t&ueZskMQvqBin-41-( zC79C5oU`mYXaQY8@&*S?6^_XbtfrMmYM0#VmRpC&wv%3yEf*4Hrh{0_9)5(nDreHL zOBS(6d)beW&#QzHl#2_lN(7~;VP52B%uNQj4!BdxTZ!&JL>!bo3uv`QB`GLc87iru zq#_BM(KSdzsB2b_^I)>kz4V+(1*N@;TQ|XZ#d^h@#%Z(CT zFr*tWW_~BiSKmlM^swHJDgV###;Jj@z{T=bg!E-h5kS6_rJQ@C{A^GX1ZmsdJC5-q4VJc6URUd z;^Thix^v?xc=Yw~`xa7~Ug+!(O_YX?+&GKP(-y+KK{zVHiI{RP{oNW#>gm$f?P#oi z4SubbX-XiSy^8eZ9cWpVO%4n=m3$uKBawLbspVKubrdy$&&!)rmL}4WL;~}fo>?c zX3|nJ8jbR)OKxt2uVxPe;VFayHIj9gPr1UDpo}3|^QAmSGsiGF`C>Hl&gHNHr<0LJ z7+1>_{Y>F%2Ax!a4B!(Z9DM=vqpxE${V3}7br9agw9>~z%B1TGCiACIoI2jM@0|;E z{QjlyxLcN6<`V1E?#z_@mC9gJq6`fYW2TCdK#Hmg$dM1#j6%1oZIx3EgO!ld*;Xg0h{qTa{vGU literal 0 HcmV?d00001 diff --git a/sources/gfx/images/Mandrake.png b/sources/gfx/images/Mandrake.png new file mode 100644 index 0000000000000000000000000000000000000000..09ccd20aaefeaec1f47f83a9360f3afbf5388e39 GIT binary patch literal 451 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvg8-ipS0$^;9i8fNWt+F}IrDiD zJpbXS2P!i-94CEpM zh6l>Al0Z4eByV>Yeu-TSH-Q|^0*}aIAngIhZYQ(tfC>aWT^vI+&L{uqXOqwn{L!m7 zA*f&LgSv{m+6UQ1$(%68WrhoAq` z`)95WI~({FbV!xe_+9qBMHFpGoM(K!C+`$aIzopr08OsanE(I) literal 0 HcmV?d00001 diff --git a/sources/gfx/images/Manjaro.png b/sources/gfx/images/Manjaro.png new file mode 100644 index 0000000000000000000000000000000000000000..ae3a642fb3958c5cf4c3dbdb8d1f22dd6da91cfd GIT binary patch literal 4196 zcmeHKy=xRf6#u>1&F1dR$EC1PECQkuf+4LSh!W9jf{Lj`NFn|MHj+X_w9qoPVr3!t zQ3#^g+Q-V1NK_=49Jz!fUNm>f?u>8tyzIRVo-21I%?-@XzBljVHy>~2&E0dOXSy@{ zGXT1CXGbn@+iz>iW5H@%l&V&wg2kF=j{W&G+!?eUc?=g`N!$g47g1 zMIhqW`v21QvC4_jj(5{9{NZUpvAEG&Iz$8$q!26(nX%b#HNIQ>30v(~;CS;Ovmp4% zh%y4d(zzEt3VNOgVMh=FFornN~FwPzp`9pl_Zm7=W z_I~?Hs^CDYCD7Mexh>`$&<-#Rs7^segi@R(Cc$BD_41)*M&~Nqu2hAkY`Bqks9zZ?+Y1Lg8sREZ^VS+ zqyS(p&6J+x@$z_I-5Jgrb6oR9cKaWS06>q14kP2d<@H_QDUKW(bnpN_T^>TN)ffZ- zq?NtBc>2lK2mtX72Nm0Nt$`wsV!dhC(C}n)Ywz-{TFqKo<5O6X07Tc$5N!Z*26XD5 zn z4nv!G+8Pyt$I+1r8P$H97nUOd{v*mlb-Al0n>ndoX7E)~_cpYbn;}kSJdwyq0DgJ} zYU2SEt;vkQILuoL9r}w8+0knlUnV5vboO*im9DI!{Ki?n0psxnrlW(66u%997ioTy g*A?+PuH*06@6pfuj+AcSxo;ijPLGZ}KQ(^q7mK1QCjbBd literal 0 HcmV?d00001 diff --git a/sources/gfx/images/Mer.png b/sources/gfx/images/Mer.png new file mode 100644 index 0000000000000000000000000000000000000000..90489649cb087ed69f38c25e136ab949690fbbe1 GIT binary patch literal 1458 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ℑN$0CmjL+nyNm^!C zOuPIcs!yA@xl6G=CSb*B<-IryXAw0&ebiPjt)X;6o&!3hR1$NZ&vXJ_i|;ahbTL*S zIda0W_zccL+2}mVKw6|h8ur>?1;?KA4re{5g~OM4jwcYkuqeHF1PauBNU^H`8#)5* zMZ&YZrlZF0euZTA>HO63d<{xKu4n;!-x65yhc#5QeeuN~&qoij5f&jDuVaU^0lVPu zSbQ1c+~WwHa#S3?Vwe*IxHV$Li-{#hNhHmay#O_tY)a=Y0luC!A}Oddq?+< z?=_}((;;-QZgeV7(6kM7#{+dbkX3`>1kkMyh716n$oYMHV)8v8(u5W7J294sUuSB# zL~WdXE3{g;f|+8*Q>4s`9pfaXrk}p+FG20>b4hqVJZNq#ZPb^B-BsTmt23%)y|z87 zo(JJk;fdjrlWiwkPBvY401-0q_%$GN0>|1xjSQr8gYtBc=m;YGK~*Uz@Bv42!J{Lf zAsv(+2O_k%|K_753Wso;1%|}xH3{Q_WK5)I z-EX|~FJ@Kys;aSSs&ILfxz@FQY4PXkx-#2SkI16U2Y^!PxMcRBVuMG z`y{`f)Kl*c_7;Hd5YRFRyqAHvw?Wq%fFG!&4n$uDx&g=$_+cg}ECa$*h}qQMP<36M zd(kFx2VbR_7uNW3nmj%D>p9Cb9XFmxOsG>CJGcKTXLei8Me3EmbniU3CdeRN)!kh1(f#yzv*Ky07)7UhS&o{ zn(*TI6PDEN^HIUKn8;4+`_dO4<+V3FC6k!U$N6;&H8)CAlLr;(K-<#e?B4K8r_fU} za6qiwnSj>ZWTG$U#;j-$Zp&&tobQl-ufV2YZhl{WQHd+KP5||1p!p+^;{vYi19!4P zuOBGP1-~f4^-ZAUeNgKTgkgnqI>C#n1Y%!3O5wO04IoGMb0LmmUr_tlUkD7Fv$Vd@ zo@QS&q;PzOm8w+(p+>>sQWBwNE9W>z_k|_rL~(vkCm7xASZLl0a4JVgC0bAb6U)Bj zvuSs>lW@G?g&{sfUoy^YqG5&7*k57#^b;&)Zqj>jGg{B=V(Xodiox1`%_+Wl-j8|T z=6#SjDbX@m-Z1$-d>`@${0000cdQ@0+Q*UN;cVTj6004N}a}V%QaL>puE-6kf$}A{R du+TF!1pr5D28z`2Hdz1w002ovPDHLkV1ktRB%A;M literal 0 HcmV?d00001 diff --git a/sources/gfx/images/Netrunner.png b/sources/gfx/images/Netrunner.png new file mode 100644 index 0000000000000000000000000000000000000000..7616118654703486446357954f14676f0aa27649 GIT binary patch literal 4217 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 KZ_fSspZ*IV>l&c| literal 0 HcmV?d00001 diff --git a/sources/gfx/images/NixOS.png b/sources/gfx/images/NixOS.png new file mode 100644 index 0000000000000000000000000000000000000000..054a0b00813cf101c2096e5ce562f7f00e90a93d GIT binary patch literal 3211 zcmc&#O=}ZT6umDEezYAo(jdBUw#FZz#X|GaNSjTNet_=$34&R;Xemt>Md;FQs!)o% zE(HHTGi`r>%ZeZ_OBSw5H$^g@H*a!ha%bXX0>RfN@4b7^J?Gu~KJxxWW6_zsKS@MR zeW|vL-Zh_F1$_Ux_xm%t8_ng$3i;;m$;$^Du-tyL^y)3qoloYYZhlz#Ni_YqUel}Z zekgbP*QN4(AGq-~v%Imk+yYx$g#Y1NZh_&cE%JX0?C;a|cE+N$_Wps$$l&6Fx?NNB z-Q9GOfL*2g0&9lA<|a){7~s`azP)A13<2QQ*9kJV2%J|zk^gMLtQG(9391EiP8m9Wtg2+A!7w#QL1}|l9>yY%DYK&>$(jtqh`O~}5ilhKI7gqXc1Ox&mkPC=6Jh--k%}hm!q(Gb+P&>t-T0ODlvQLF2##6Dj7HWvV(3&g}5L2j?L(V5l7k0T}tBfJp0kCK7=>%{WDj69cg0b;I5SPla&y zO-B^KgB)x)o_@tS^%3_b83I#N;ZJ4{-`C^dLPjB%!7XDCl7V);d|s0PVadoqphuXF gT_AUf@+L9%3=Z#p`?~niT{R1(40lSWs>;%@eMqNg*9Vm1Q%`Fr+1KTvyjX~YCku}sgE&Urk^EuD+{XXZ+ndgUd zD(7dX4Ka_w5GT9q-&X;K!2GQIIgSOu0B``psgA+`#~gt>;7%9E zF`U2&XBz_o2ZF#!01^Wd2a*7ibigPKC>$sPC>o~$Xa;8}U}%h?aTb8ZfhB=ufOFso zo&gUI0u4M1JcoG*@G#(IFdq%uodZ1P;lb-5IAC56F7hA>m`?zo2dZCxC?r5ogpd!D z{LmP1h9@zM#Bq{JBx#yV&7=f@C|ow$>mj{fQgm2H`9xytJ5L3CM46us_=!M(3Iyn& zp9lu1V33ylbkToDlS``5+Wx!(mqR1tkAEUX(oR zR#;W0Rhdy02Ue3YO{Ps1Yz2@4hDvA(t;>|IFxQ$XqyaJjS%7Rn2rL~#8iq^^Aogd+=AbpjcLp^>IaYbx7)D%DacTXk-r?4GBQ$smhCHiHm>5Qz|l5RDL{YpkKM zw!tC?lSPP?Wlm8zRpoSz({;{pFgVlTEQ3Q17Kae0X}qTMx`V;%CU5AxVeqEOTNaOO z9wEmHrYTsKVA}#hj_@Glv5*%HA|m8N$d6C}p^&1;vZAV*rt5~`Fqllk91K~t4Aa4u zHKb@rHISww-9)C1EDPCaFx*9VCICc05ucs+U*rFqAkThyob#a~3g@P~p(5&u495&z zld(v2>Y&bmv<~kKfXK_4?pgWMPZ#f5Kffw>WLwU;7j}(bUUztPZv67!jx6Bwb{!tM z4c}e*%ebted!+b|m{0sunhsaJG5U>tYE0FvCzYP!n;XYf6=(DgEWNs3QR|w^LgJ>^ zkBcKJnqnG0FFzDBsWn_WZHbh7VDrlI_bx4&S3d(HOSI&rBjTWB)4jgV$o>Ai$;Wfn zetM@ibUj*3F7H3P)y6HixG^{s#Y=^=S5JN}xQ|K|4CxmDK=oM_lW{?s#L z%8j*r+*_4(qx#iRtFC1{A6w)OBoepsh1!US?lG>dWZ8qX8!S8BGbh+zeKBD~&Oe=z zUGJCwfNd?D`Eg+Vfk#H=Cm&vSf9{pLt*L(2&ivur)_e4Ofv08{U3Tp_pZ}_rB9np|mT5R9c6(3#=wv5kmeI5Vu#;&RNgO3f=w|~DjQE2ivwvc4= z*)=^0Do6k(2T~*!OzIgeV+pak^Kc2mrb@At!$Kvl!-cnL<;>v;*e`*U--z}I~ zFBZl%%sJWaL+r9G{{p>y^}YZA literal 0 HcmV?d00001 diff --git a/sources/gfx/images/OpenMamba.png b/sources/gfx/images/OpenMamba.png new file mode 100644 index 0000000000000000000000000000000000000000..caa72002d9e2d552f5bb1be20fe56ab5cdcac7b4 GIT binary patch literal 4217 zcmc&$YiL|W6#nMk&1N?-VY^zWk7#TWlvt|-2|*$@Ci{rZVuCFiF%(gXwnCwzH3+T# zvLJ$1TcPTYBE_cGA5oL-CTS?O;G;fjEJ$0iqG-{YChaEK*S+JMz$D|{xp$NGhXePX z_n9+i&YYQD4<@2DRo7JksENngx&^GKFW?vdZGC-d0fJj&k8A^KKckPm)lhpq5Ne3G zt$k?w8CDn}n@Zqxo?%Ne%1@QjT~r3TlB|CkXe;H+ zDGzX1IRniikaJF%q&)+8;48Kw`!~i7z?25%z>tBb`Xl_H&Q|z#ALazU{;!jh_emRj zpH8wnbThdI&^pL^G8{pj5%Fxm3NXydk7%iTRRPQBlQh9Iz-Vv(=e;D^l9zpj2H2WSh zak;;p*Q*Xx{AdS1VEEV*H?(4vzaCc$Sx(A-*abfrF61v^qu{+L`Pwar9bs#vf(k7Q zV=Ar18K!<6#f@k8A*;&kIx*?1L>)L*s(ft#b{;dTlEm`{+9mD=?L6`B zx EeTb}8;5{l|8$fCuKdUN9JY%D3!!SGFHpn~!nfj3@3l;cX+DS-#LE;j+)&MDI zSn>Ivv`{Mw^k8R_Wrer*b2d_y%Q61x-TZ=dN^qLvSq8izRyfx~=#giRdVAK^zyFEYsPtni^n6d#|tg56`?{5Pk)YXGDuR(V`h zQiIc|6g}61fkSn`{(W)&xtG3Y0A#o>#l973zRAmpmn>l8i=2sP-0lNy5vmS9iSWC8 z9PiN{s{F;`qG>hR9A8F;*gZO%k{OUjvE%GoGlQ*$gImw6wu^6VV(g{L(<*p zy(!k3vk*<2h%9A$sErRqxp)*U3~d12N7&}e96RX+)ADR= z((#@Bq$mI~@^kFg8Z$iHIn2J%$y8oqkPX>FSLMy)2DZ=R0x3ELQW#0H35h!)t)j}t z$!QaZO$#SUZW*|(#>AuI(bDMEs8TWhuXlp$bzHEq#b@A6=j23FAyJDpIhte@QDx1P zXx7yhb~ydHW`Gn$77ht;ztgB3TJ-MIbUdB5+8U5bB3bwu5^cs@9#Xzy@Y#k8Y6XV~z=`Sh()tFvNX&alx`*5|&mpFAm@uJ;365$_6 ho)=tl0A9|@k*(gjH&sw51fcWPiYZ$@$**eV(Vy*VBCG zWQB$9b6)7S5CEJ*_6Hq8sylkkpNp(Pwb^Qbxe#_RA{b6E;Aj~frMpDj2jT;V<5fVa zb|TT>a&{mW4f81z*=Kjjo2%P47^uF{hc!Pu0w))Z=1m;cP3! zvsT2?oz65sJO>h*-aFg4DDL6=aV$t;LlPew-vk#pi_bCL&b2sPYIjR)#3!=dF4j4x z@Z6I)F3FJ9zrE^tE!;)0N+7z~TaxG9L%dZOIrgYtvwiVYzm|L>t z*Lhx7TNb3t-LH2M(%8-!%2iaMYo^LKjkS^59GF(;dxPmi?=Ry%&ANw_@na;ypNN`1O%)OS#vW_5Hk9W=Zt_P#!a*lu1*b$m!SIyAAD&ujQ;B&6mk>=V_JBMd`m-QaPCCc0J@UOz%%h%VK15F7epnW{LZB#qIQ$m~pI z3Q5hwXIQ%PjfzW+;;))}sr9_fhPLN%%xdDE=a^1)jND*%UE?Uv z@&+k#Hbn4%166)WZ zTsRbZ828N zcrzr#rz9khGuT#8N0aiwMA^P~y$~i&zVH0HVm`X&b4dWU>Gq z$zNCin2d}>zI}%3$Vgh!p@tEA_}6KHCR&xIe&QE0ge}Kl<;? z!ao2Y+{zp14%j=(MFzhBnA&6IHK_b{y&d?(4<7HdG6j!6CcGU$l)>#*L;#+iZv`Zt ztKoY;D;oipc?8Z*czS#euciaO09p@^Spk!I-aJhMfFpj1eFBI76d4KApc`;;akM2y z99_`Y929s?gZ#*!9kGtPe?Vo!hghuH2Uukz4l(ATU@*wyT znDxH{{8oSl0Kdk@ve#ziyGe7ox6E8Xh__>nMMG8w9&g?a(jLRj0>95TN>UEyc+ T4601_6PgSO4h?GFL#F->x~ywe literal 0 HcmV?d00001 diff --git a/sources/gfx/images/Oracle.png b/sources/gfx/images/Oracle.png new file mode 100644 index 0000000000000000000000000000000000000000..a9b1de15de859cd7f90400cb15fdacc3b2d80d44 GIT binary patch literal 2066 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 literal 0 HcmV?d00001 diff --git a/sources/gfx/images/PLD.png b/sources/gfx/images/PLD.png new file mode 100644 index 0000000000000000000000000000000000000000..2b09d7d29406ba42531fb1c7747fa2ac36df35c7 GIT binary patch literal 952 zcmV;p14sOcP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BKeVQFr3E>1;MAa*k@Gd8K`;w1n811U*FK~z{r?N!?=Y*8E@_xq*1U=pHCxjcB0 zQq}{xmAnwjbtdJ3qU4gx@epVg*P8vie%~?#5Ws(hy}dow-QA6olM}YIv;-jpcW?a+hK7a^7Z-ZzrP>1x3|o_t)ii!0XaE2XliOgVPPTYH_ZW6A~!cze+#I5nVFeN zSwliX5EK-I($Z3;&o3`8N+8t#)YMdDWo02LDM{Ib}zKs=_>PEJl@V`D>; z1<9>^d}t{tDcIWD(wF_h!U8AG%ca77v)N2*6}7ds8fU+=nwlDV>O*^byYdm5;^N|B zWM^lix3?Dq0|UITuaD>DgsBc zwYIiu=;&)yAxT*-0~S|TS85y1&d!*;s=1VQ|JIPKN?{S{>FMa`=+OMp7sP9MH~6U| znMaVQb;K4aQlu5UrKLsG)zu+3Hdc}Bl9CeG?eQ+92~^j+S*?aj+_-i zy6+uGMn(qG($bU)MMp;~m5hjp&;;jM)75QQUtedmxVX5`Etd|5gU`;+^3Ban^&7{> z$9#HvTA3M{m?$bL0$o^iNs&O&kW%7?ySqDmRMCNlhX;OndC5;tPx;f+(~tQLAb@`v a2E#ib>EL~(?fEYN00006Lq`2qs~&~qd?xWn^0^jM+`e;qQJ_W{rau6sO)IcLrQ9iY4Tqa{lh>lrLvZe+On z^Hs(sYt6qjx7xU&6@X2fH$D0U*nW+FvJCUUz=&YCUA|(aVvUIdaaXOm#d8zfp1nWF zaT_Z(S&I;)Z9VRp)%y0YHtq9tZ~yk2O8Z?04;|p{+1t7OyAB8Yn?HIgzb73(;jMB4 zZ}xs%@8;a^`caRYUYFa-_pYGbbEVu1OFiv3?7r;DPuS*zma-$r@O}fyQCsoxZM5J( z$x-i$lRMQ1))x9wRY#1w50gv$UDE^3mY;T3p0o+2hp2qkjhx(&5^_Os{_rr>sxBb# zrLS*BxIdrnD+$FjVxmX<@o&#=6^Gl&!mNuUT-njlouMmkNAFh!+V+Gk$zuHajBd`0 z@qQhucQrOv9b{J;5it~|QxkD)G8AO|5pgL#EF139(OS(fcoi zsKXp5BK2#Tr_&ODzju+Aclpv_jF~FJX)wxjocUP`Ggckto_6huB;kOJ<#jD3xi2az zD>*@N@x&OzBReI0F!s<$tS2Y^N*X6Mlf#;bH&?N2xSaH{IC2puM0Vxsog3#zScht_ zGbXQY?n_Jll%xtpcc=4@z2);K3ccl`08v@#XhD3(os6jxs-hxPTv`4=%&)C1dL&M5FH4nI zCcYO%wUyngtuE=UOsbJow^mhli3Q4s@u?Ny(+5nkujJlB)6?%J1qz3=*a zrd~at?vs!8_l^!cRlVs{4gUl8!m2GhoB-Sb0q)NG!1Vt+n5#qE;UoFfpS1rM0Q9TT zLnp~fe+>YOtQ;NeJ%XR=tXtGR4xRZ~j=@0V!@*#&##r=A^no~GjnTkmSP&Um25b5n zZfXdd*GZ!J5{}?P!~tLg1yfT~BLHw@KeR9#gyaH)13@S@GYbONetv!dr?$;n!OJ zgslTw&hep97(IDga0+2-Rb*s!tFRkqS0|^?*bEvfQP~_Wm&>No1m#WF&_Yg=R6t=A zmE47)05Hjb7!Bi=Vqzuhs3b}=ly-9ur_7;p|CiOS`%X`aUmkqV&_4x(%lDsW-v z_EKmJ1|<`{qxsy=35s!R5)p|OmP@7O!bmbg#EIS&M@4m`T$2DIlgUJIh2iPx;SC5v zB9VyJvkW~Gn9MjPi9|S!uEh`@a+tZ*27fZ+P)@>yU}2oBGk-ok`?t=3Cf Z3byNwbcJG*`6#07+cWpB_3oFF`2 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 literal 0 HcmV?d00001 diff --git a/sources/gfx/images/Pisi.png b/sources/gfx/images/Pisi.png new file mode 100644 index 0000000000000000000000000000000000000000..3d44955c336b4fac7c5d4a6bdaa2c59b0e321bd5 GIT binary patch literal 2193 zcmd^=iBl6-7{DJzr)rBm$f$$2Befj$z+yFO)q+L_L@p6TDy@!UEedMUQM78M#uKqp zIv}D5rl3SY1Ot)~jzq)+10?L`fK4{UfH8+L7YO$4hKil>Kj=5JyI^ zN^=|MF%AIW7PK}n0)A%@&lp$u4lF#w1Hcu8g+#3eE@12j;DgaFAB}PyJ!aI$Ke_gfAw|(r%fR$fM+>QkVETsi57ECzN>3)hvTM-hp zJR~>}nVhjcWTkBC*>&qfI%d&jGcv`qPq)lD6CM#384(;ENehpTiHeSVH1`bRof#Dq z7Z($TTf-Y^ znL85`cI@1~d*?=ZK-TtMN%Fv4*_wh~Nk6IAX6;YjePHhvNmw2hnzeU-N?Pi+Uk>c= zjx5GD{KZMg#W&nkY%Dx>C=rXx!s4$e@)bZW&Z6&{@pE#Sown`I$QAsJgpaRQo=*=!IzV&y-?MtQ1^4`3%sykVC z%9yOOY*}GrQ)yM*ovQMRvfBH(x}vg&_gK~UE4Y=}_p9#p72jjkJa|}B&aKU@sjXI& zKVq@D&FuU-PNlxQqJjO8T~~|W6LC2Wb@d#6LqRi#C#WxIY^dfm@*0}z4Xg)Gn~IwF z4UhQj7XAZ4Gec3=_JUpWnBT%};Tbtq{Kq_XU5EH_iK0=+f703_Xch_Bq9>1W9?~IX z8F@9*R%XXjZmUSx+%D*BFY6Vs(Kfc>2?uEtJr#Ghi`&e?8c7GzA!)}us}yLZ1QDCs z*(#JHmdX*S1eJAKBwVQ+H6r!hU0j($+AUYgyJU)Pc^9VWR(ADZU6`s{sm3(87VlB2 zHF%d+)$>fP(e_|{J;3Y8T&8$>QJmU;spRR)DNcYwp=_eG5_liwnR;$&hl*0t{KmscwO%qEy8jv^$05Gm*lM1+CYgRcp| z4r7o&9wf?0U>TL_Z+i=*P^nae@F0XhEdoR6e1{^ZP>B%GgCprnw;>jb1ULW)MMRPd zhWw|vr8$!v^q=L1923GM5g`izo(O?uZZz2E+zq$GA{~ywSiglsGjc0dUBFfujApZC z_yMsI`T!|tgi4!0yg~Xv})jAq%2U`7do0hbf58KIJ z;9lD8T&->a^}JR;SN(kjiXbC)04hUO05?S7~*cRg8yqL@;J z7m{QDFs#bwU3;|n)Y&o-LR=a`kj~qRN#GsA1FRr$Nol13MLT(gfTLG^ui`(GRjnEGORZ|Gs-chKt4K<0M|C;kBioD4Al literal 0 HcmV?d00001 diff --git a/sources/gfx/images/Porteus.png b/sources/gfx/images/Porteus.png new file mode 100644 index 0000000000000000000000000000000000000000..0ddafdbcea4fb758a443570063c09f4783d25f8f GIT binary patch literal 4217 zcmb_eeN2^Q6#t#~#{O;>w(ABavcni32fwR5$JokBi=bYbr z-se2eSvPBDPONv77eH+8^z7MErvx95Oa87bD7Y$B%uCZ3tOVkY1RvUz88;djnwgt@ z|D614N*P+yOw25C(TRuNNeiekSs*P9Lfim>7)Aal(CRJCF2jvOj&seTj=p$}ihz%b zvf4E743NlC%uA^P&BNSibK3w}x|ih33B~la3UBN=`28E1SA5nRi9Qh^`p^s2%ma+Y z!09Z_uBsKd_yfVLv|(R_sxoZbEeVW*o;*P_lOGmHPb3UIXnSIw=JsdK^++W62_ij+ z`#2GLX_11}O)Bo&uVK`*Nchkv&4k`zy0SF%gKPDhN^0R!h?o2QunIxTJTH7Y!7x5n=zdhHJ8Hyi%rC&;QhaZ}0T1}>BW z2j()D?Q<}x^oFNaOS%iHYYt5RR8=&l5-z(e)og^IMzDtoaY-6{BTbjO8;1ETbAB^X zVIdS{B-?A3JHCRt+f5h>q9^_dKDLF;?He2eO4ybHzmcaHE%O+E+{&o_*@gDvB$$WJ zbJZmW7jjHXlHeNgAguUDAv|w0KYxN;8}|9k$_1^w^`e9AmVlc|=NnY@Dl&>D@kus< zU>|M1y$x7KsLo>?t^*pDGS`lC8m4CwA`c}6?{t0O}bSCVXW$jaeLC<(tnsJl%x z%~#P>(P<Eubvc(K^=@mGRK7 z>;g4^ZRuC5VK!Z{+#`h+NE$6b69oe07JvIyxP6y0#4Vr1!oB)?r(~dfuuR9AX3+R= zoH<8p*qj4*@e$BdExqv%169X5p!kl4-rl!uggon)n<#Gq*DnlbPTHn< zQ2c9P9Cm{%CNtLtOD<|r{%^s&#f0GP!FjdKKV3y#8gMp0{F`f3@(4snfg*NmK0Y|L zzrjPXBc%%7kG=z*I1!GC#fEWEi}!+N%d$&O4PWcexJw4YGeZ8BvG4>sONMBP-l_~) z3{f)$%E_0RFVuwN`!nvk2g1BC0>fdQ-+z57>rN6z4)FUaVO4#8eZK#rh#3G(9ackm zr+W>v-DnucYU_KQa|0Yi%m9He39bosHbgsOWXCbdMuQ9XuX_g=x6?dg23Qs6JCUxx z$FPE%ZM0O%%_i^o!I6jr6x*&QO7(<785{>y$ezop9GuYCyhJ1*VC(=MnjC^^E=k1F z<(V!|y}^@+1en+F)!+)HLo%w<4J`)H9a<{M7EG_Xj zWK9@oV8=cx0^Cu!$AWnPYW$OqgMsR(2wV&1UnpDdSwt_48EEjJebfYGLs=)=ubEJ3 z-Cz*twkz(7W1{CWWyd&PR>_xr!S{&iPZQzTBqBEsDW7_r|NYUFxHPV4+QwBug1OUX LX774n(b|6j(+GR7 literal 0 HcmV?d00001 diff --git a/sources/gfx/images/Puppy.png b/sources/gfx/images/Puppy.png new file mode 100644 index 0000000000000000000000000000000000000000..b4835e84ef203f680179c4d38dfee1bd83c4ac55 GIT binary patch literal 4196 zcmbtXX>=7u8ok|b%}eq~NPrLsK^BokMOj3`Vh|;P$Us041W_0VVcfuNz)=D?dIS_u zTv5Y_q9B3`i^fqDNDyTekTry8*h2D>yuDv9HMd@X!yM0<`7w1)zv@?A)%UCW-S7LV zUmP)fNU|r>10Xp+Z*U>|w(@d2`TN-H*+C$sYyRNe(SJLpv`wj~Q;LfC;EFbPF4T*E z?d;{U7%xkX3Bmu`TWzA^FMapy!Ku$m;IF>`^Ul#o>DwC_kqBaI*5k|@Z=vqs?vs`$ zqn#LEh{SPY(Ui~IxZUfvqIy)d(gLwLbK>vCWdkk(+eIBbNO{OY?3K1e9jPk%*Kj<4 zX6x2DIm3n{5{$mn9cJHic?De(J9R{gVu$_MG1PAQqP7O^G!zU)#x-4#p6rGz6oY>F zSJZ4P!-e|uAGQ=mwX1dJjJ;LmnqP6azn4bHT|$D3El>}pi$7hP`l1WoN1RA0_1e^= zTE&X=7PkF82IiIRK6<$CgV|Ys?&wtHs>Wuplk^CY2Gf8=mJD8K2*EEDIHOTC#G=sr zk-JSzLwM8I@GeYTd0fqO4Ap+l`UZ+~i3=c{p@+m(}KS`c9! zM)~n|KjjTtP+?d4MjZqX>d-6`rezV#A}DPzO;|A<(D~otKtf(VW=)!iZv6&fNP{0f zIiCiJJBA^5!TfUPp~HLCZcrL`zVrhz5E4fR3Pg@d@zsueo! z*!$$zcI`*+uCBvrxn%-sMAi)hrXGV4jzMS!|8qPPLhWatq3DSx#-{E&fW4{;l}jvP zLXeT5;_7qSk%qA(&aUDXc(#?I)5>B@iAA7CNLe5PBS_kG9T8qyR723^LgJdw*QT}1 z`t@19P$96zxk`k<5gmf`$8-Z)Oyk9Md=}WVZ}s)lCUni>d^-e`m`MZ48aTi{E_V52 zefs5UdwLqOF4Uto6ooE9m7qua5HaJ9}tY!bs%1S9hX@DV&a|yK3L4U`B z8h6dz*i<+;IWAJUkbai*g&vtT%U)7~E%c{FBce345uDW108NX=S&Ie2FsgkBju?%h zA~t+f^=VWlCc;}?jq{3GaHux)Vv^Kf8~|$2LrW}|3Y$XU%HME!_ih|)-W=X*yWvKU z2g#BRYQsr?ixcIjmn`vKqh$sS(dh!&TXYvlb&TSKUC!s&`jT&xM-J|snAZC6o3*DL z#g!-YFWM&dt04oH9cQ2_ZBj!vZn5Gt%7^CW`V{A5+onHUkY4s9et+QJsSVV%kvnwR z?^)UKzW>Jcw|@Qo{uo0m5Z}E{5fX&=Li*Tb)F`Ar7(#H&@B!pyTLD}HH>_NLIPlXB zwEy+E{#4#5_=Nu!?_BTqJ_XfCQd+>S(E;l@R{rcBH-(El+(0RNZeK&2` zQtDwiSVITjUxnC9GZdvsy&X2G#tA3t{kYJfJ-SHY)Dt+T&p%g*z`gUiv>UI+=9&4* ztpi^|U5JV&pfu7TAOQp^7t9;+oIn8vVC@_fU!*cl7fD!`#+6rH@7RaK|exH z?mQMllwm9@D;Q0Vd&bYM#&0h?t)e;oW;0zXeNTEq(2rj&C$YuZ8I+4&)JH8-a*#Af z98I==EVF`Nx`DV{XLFH_lw>5inZkGO!qMS*3(JNLy3NPTs&S5BY7R
", "
" ], + area: [ 1, "", "" ], + + // Support: IE8 + param: [ 1, "", "" ], + thead: [ 1, "", "
" ], + tr: [ 2, "", "
" ], + col: [ 2, "", "
" ], + td: [ 3, "", "
" ], + + // IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags, + // unless wrapped in a div with non-breaking characters in front of it. + _default: support.htmlSerialize ? [ 0, "", "" ] : [ 1, "X
", "
" ] +}; + +// Support: IE8-IE9 +wrapMap.optgroup = wrapMap.option; + +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + + +function getAll( context, tag ) { + var elems, elem, + i = 0, + found = typeof context.getElementsByTagName !== "undefined" ? + context.getElementsByTagName( tag || "*" ) : + typeof context.querySelectorAll !== "undefined" ? + context.querySelectorAll( tag || "*" ) : + undefined; + + if ( !found ) { + for ( found = [], elems = context.childNodes || context; + ( elem = elems[ i ] ) != null; + i++ + ) { + if ( !tag || jQuery.nodeName( elem, tag ) ) { + found.push( elem ); + } else { + jQuery.merge( found, getAll( elem, tag ) ); + } + } + } + + return tag === undefined || tag && jQuery.nodeName( context, tag ) ? + jQuery.merge( [ context ], found ) : + found; +} + + +// Mark scripts as having already been evaluated +function setGlobalEval( elems, refElements ) { + var elem, + i = 0; + for ( ; ( elem = elems[ i ] ) != null; i++ ) { + jQuery._data( + elem, + "globalEval", + !refElements || jQuery._data( refElements[ i ], "globalEval" ) + ); + } +} + + +var rhtml = /<|&#?\w+;/, + rtbody = / from table fragments + if ( !support.tbody ) { + + // String was a , *may* have spurious + elem = tag === "table" && !rtbody.test( elem ) ? + tmp.firstChild : + + // String was a bare or + wrap[ 1 ] === "
" && !rtbody.test( elem ) ? + tmp : + 0; + + j = elem && elem.childNodes.length; + while ( j-- ) { + if ( jQuery.nodeName( ( tbody = elem.childNodes[ j ] ), "tbody" ) && + !tbody.childNodes.length ) { + + elem.removeChild( tbody ); + } + } + } + + jQuery.merge( nodes, tmp.childNodes ); + + // Fix #12392 for WebKit and IE > 9 + tmp.textContent = ""; + + // Fix #12392 for oldIE + while ( tmp.firstChild ) { + tmp.removeChild( tmp.firstChild ); + } + + // Remember the top-level container for proper cleanup + tmp = safe.lastChild; + } + } + } + + // Fix #11356: Clear elements from fragment + if ( tmp ) { + safe.removeChild( tmp ); + } + + // Reset defaultChecked for any radios and checkboxes + // about to be appended to the DOM in IE 6/7 (#8060) + if ( !support.appendChecked ) { + jQuery.grep( getAll( nodes, "input" ), fixDefaultChecked ); + } + + i = 0; + while ( ( elem = nodes[ i++ ] ) ) { + + // Skip elements already in the context collection (trac-4087) + if ( selection && jQuery.inArray( elem, selection ) > -1 ) { + if ( ignored ) { + ignored.push( elem ); + } + + continue; + } + + contains = jQuery.contains( elem.ownerDocument, elem ); + + // Append to fragment + tmp = getAll( safe.appendChild( elem ), "script" ); + + // Preserve script evaluation history + if ( contains ) { + setGlobalEval( tmp ); + } + + // Capture executables + if ( scripts ) { + j = 0; + while ( ( elem = tmp[ j++ ] ) ) { + if ( rscriptType.test( elem.type || "" ) ) { + scripts.push( elem ); + } + } + } + } + + tmp = null; + + return safe; +} + + +( function() { + var i, eventName, + div = document.createElement( "div" ); + + // Support: IE<9 (lack submit/change bubble), Firefox (lack focus(in | out) events) + for ( i in { submit: true, change: true, focusin: true } ) { + eventName = "on" + i; + + if ( !( support[ i ] = eventName in window ) ) { + + // Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP) + div.setAttribute( eventName, "t" ); + support[ i ] = div.attributes[ eventName ].expando === false; + } + } + + // Null elements to avoid leaks in IE. + div = null; +} )(); + + +var rformElems = /^(?:input|select|textarea)$/i, + rkeyEvent = /^key/, + rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, + rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, + rtypenamespace = /^([^.]*)(?:\.(.+)|)/; + +function returnTrue() { + return true; +} + +function returnFalse() { + return false; +} + +// Support: IE9 +// See #13393 for more info +function safeActiveElement() { + try { + return document.activeElement; + } catch ( err ) { } +} + +function on( elem, types, selector, data, fn, one ) { + var origFn, type; + + // Types can be a map of types/handlers + if ( typeof types === "object" ) { + + // ( types-Object, selector, data ) + if ( typeof selector !== "string" ) { + + // ( types-Object, data ) + data = data || selector; + selector = undefined; + } + for ( type in types ) { + on( elem, type, selector, data, types[ type ], one ); + } + return elem; + } + + if ( data == null && fn == null ) { + + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if ( fn == null ) { + if ( typeof selector === "string" ) { + + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } + } + if ( fn === false ) { + fn = returnFalse; + } else if ( !fn ) { + return elem; + } + + if ( one === 1 ) { + origFn = fn; + fn = function( event ) { + + // Can use an empty set, since event contains the info + jQuery().off( event ); + return origFn.apply( this, arguments ); + }; + + // Use same guid so caller can remove using origFn + fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); + } + return elem.each( function() { + jQuery.event.add( this, types, fn, data, selector ); + } ); +} + +/* + * Helper functions for managing events -- not part of the public interface. + * Props to Dean Edwards' addEvent library for many of the ideas. + */ +jQuery.event = { + + global: {}, + + add: function( elem, types, handler, data, selector ) { + var tmp, events, t, handleObjIn, + special, eventHandle, handleObj, + handlers, type, namespaces, origType, + elemData = jQuery._data( elem ); + + // Don't attach events to noData or text/comment nodes (but allow plain objects) + if ( !elemData ) { + return; + } + + // Caller can pass in an object of custom data in lieu of the handler + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + selector = handleObjIn.selector; + } + + // Make sure that the handler has a unique ID, used to find/remove it later + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure and main handler, if this is the first + if ( !( events = elemData.events ) ) { + events = elemData.events = {}; + } + if ( !( eventHandle = elemData.handle ) ) { + eventHandle = elemData.handle = function( e ) { + + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== "undefined" && + ( !e || jQuery.event.triggered !== e.type ) ? + jQuery.event.dispatch.apply( eventHandle.elem, arguments ) : + undefined; + }; + + // Add elem as a property of the handle fn to prevent a memory leak + // with IE non-native events + eventHandle.elem = elem; + } + + // Handle multiple events separated by a space + types = ( types || "" ).match( rnotwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // There *must* be a type, no attaching namespace-only handlers + if ( !type ) { + continue; + } + + // If event changes its type, use the special event handlers for the changed type + special = jQuery.event.special[ type ] || {}; + + // If selector defined, determine special event api type, otherwise given type + type = ( selector ? special.delegateType : special.bindType ) || type; + + // Update special based on newly reset type + special = jQuery.event.special[ type ] || {}; + + // handleObj is passed to all event handlers + handleObj = jQuery.extend( { + type: type, + origType: origType, + data: data, + handler: handler, + guid: handler.guid, + selector: selector, + needsContext: selector && jQuery.expr.match.needsContext.test( selector ), + namespace: namespaces.join( "." ) + }, handleObjIn ); + + // Init the event handler queue if we're the first + if ( !( handlers = events[ type ] ) ) { + handlers = events[ type ] = []; + handlers.delegateCount = 0; + + // Only use addEventListener/attachEvent if the special events handler returns false + if ( !special.setup || + special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + + // Bind the global event handler to the element + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle, false ); + + } else if ( elem.attachEvent ) { + elem.attachEvent( "on" + type, eventHandle ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add to the element's handler list, delegates in front + if ( selector ) { + handlers.splice( handlers.delegateCount++, 0, handleObj ); + } else { + handlers.push( handleObj ); + } + + // Keep track of which events have ever been used, for event optimization + jQuery.event.global[ type ] = true; + } + + // Nullify elem to prevent memory leaks in IE + elem = null; + }, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, selector, mappedTypes ) { + var j, handleObj, tmp, + origCount, t, events, + special, handlers, type, + namespaces, origType, + elemData = jQuery.hasData( elem ) && jQuery._data( elem ); + + if ( !elemData || !( events = elemData.events ) ) { + return; + } + + // Once for each type.namespace in types; type may be omitted + types = ( types || "" ).match( rnotwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // Unbind all events (on this namespace, if provided) for the element + if ( !type ) { + for ( type in events ) { + jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); + } + continue; + } + + special = jQuery.event.special[ type ] || {}; + type = ( selector ? special.delegateType : special.bindType ) || type; + handlers = events[ type ] || []; + tmp = tmp[ 2 ] && + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); + + // Remove matching events + origCount = j = handlers.length; + while ( j-- ) { + handleObj = handlers[ j ]; + + if ( ( mappedTypes || origType === handleObj.origType ) && + ( !handler || handler.guid === handleObj.guid ) && + ( !tmp || tmp.test( handleObj.namespace ) ) && + ( !selector || selector === handleObj.selector || + selector === "**" && handleObj.selector ) ) { + handlers.splice( j, 1 ); + + if ( handleObj.selector ) { + handlers.delegateCount--; + } + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + } + + // Remove generic event handler if we removed something and no more handlers exist + // (avoids potential for endless recursion during removal of special event handlers) + if ( origCount && !handlers.length ) { + if ( !special.teardown || + special.teardown.call( elem, namespaces, elemData.handle ) === false ) { + + jQuery.removeEvent( elem, type, elemData.handle ); + } + + delete events[ type ]; + } + } + + // Remove the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + delete elemData.handle; + + // removeData also checks for emptiness and clears the expando if empty + // so use it instead of delete + jQuery._removeData( elem, "events" ); + } + }, + + trigger: function( event, data, elem, onlyHandlers ) { + var handle, ontype, cur, + bubbleType, special, tmp, i, + eventPath = [ elem || document ], + type = hasOwn.call( event, "type" ) ? event.type : event, + namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; + + cur = tmp = elem = elem || document; + + // Don't do events on text and comment nodes + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + // focus/blur morphs to focusin/out; ensure we're not firing them right now + if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { + return; + } + + if ( type.indexOf( "." ) > -1 ) { + + // Namespaced trigger; create a regexp to match event type in handle() + namespaces = type.split( "." ); + type = namespaces.shift(); + namespaces.sort(); + } + ontype = type.indexOf( ":" ) < 0 && "on" + type; + + // Caller can pass in a jQuery.Event object, Object, or just an event type string + event = event[ jQuery.expando ] ? + event : + new jQuery.Event( type, typeof event === "object" && event ); + + // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) + event.isTrigger = onlyHandlers ? 2 : 3; + event.namespace = namespaces.join( "." ); + event.rnamespace = event.namespace ? + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : + null; + + // Clean up the event in case it is being reused + event.result = undefined; + if ( !event.target ) { + event.target = elem; + } + + // Clone any incoming data and prepend the event, creating the handler arg list + data = data == null ? + [ event ] : + jQuery.makeArray( data, [ event ] ); + + // Allow special events to draw outside the lines + special = jQuery.event.special[ type ] || {}; + if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { + return; + } + + // Determine event propagation path in advance, per W3C events spec (#9951) + // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) + if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { + + bubbleType = special.delegateType || type; + if ( !rfocusMorph.test( bubbleType + type ) ) { + cur = cur.parentNode; + } + for ( ; cur; cur = cur.parentNode ) { + eventPath.push( cur ); + tmp = cur; + } + + // Only add window if we got to document (e.g., not plain obj or detached DOM) + if ( tmp === ( elem.ownerDocument || document ) ) { + eventPath.push( tmp.defaultView || tmp.parentWindow || window ); + } + } + + // Fire handlers on the event path + i = 0; + while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { + + event.type = i > 1 ? + bubbleType : + special.bindType || type; + + // jQuery handler + handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && + jQuery._data( cur, "handle" ); + + if ( handle ) { + handle.apply( cur, data ); + } + + // Native handler + handle = ontype && cur[ ontype ]; + if ( handle && handle.apply && acceptData( cur ) ) { + event.result = handle.apply( cur, data ); + if ( event.result === false ) { + event.preventDefault(); + } + } + } + event.type = type; + + // If nobody prevented the default action, do it now + if ( !onlyHandlers && !event.isDefaultPrevented() ) { + + if ( + ( !special._default || + special._default.apply( eventPath.pop(), data ) === false + ) && acceptData( elem ) + ) { + + // Call a native DOM method on the target with the same name name as the event. + // Can't use an .isFunction() check here because IE6/7 fails that test. + // Don't do default actions on window, that's where global variables be (#6170) + if ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ) { + + // Don't re-trigger an onFOO event when we call its FOO() method + tmp = elem[ ontype ]; + + if ( tmp ) { + elem[ ontype ] = null; + } + + // Prevent re-triggering of the same event, since we already bubbled it above + jQuery.event.triggered = type; + try { + elem[ type ](); + } catch ( e ) { + + // IE<9 dies on focus/blur to hidden element (#1486,#12518) + // only reproducible on winXP IE8 native, not IE9 in IE8 mode + } + jQuery.event.triggered = undefined; + + if ( tmp ) { + elem[ ontype ] = tmp; + } + } + } + } + + return event.result; + }, + + dispatch: function( event ) { + + // Make a writable jQuery.Event from the native event object + event = jQuery.event.fix( event ); + + var i, j, ret, matched, handleObj, + handlerQueue = [], + args = slice.call( arguments ), + handlers = ( jQuery._data( this, "events" ) || {} )[ event.type ] || [], + special = jQuery.event.special[ event.type ] || {}; + + // Use the fix-ed jQuery.Event rather than the (read-only) native event + args[ 0 ] = event; + event.delegateTarget = this; + + // Call the preDispatch hook for the mapped type, and let it bail if desired + if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { + return; + } + + // Determine handlers + handlerQueue = jQuery.event.handlers.call( this, event, handlers ); + + // Run delegates first; they may want to stop propagation beneath us + i = 0; + while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { + event.currentTarget = matched.elem; + + j = 0; + while ( ( handleObj = matched.handlers[ j++ ] ) && + !event.isImmediatePropagationStopped() ) { + + // Triggered event must either 1) have no namespace, or 2) have namespace(s) + // a subset or equal to those in the bound event (both can have no namespace). + if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) { + + event.handleObj = handleObj; + event.data = handleObj.data; + + ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || + handleObj.handler ).apply( matched.elem, args ); + + if ( ret !== undefined ) { + if ( ( event.result = ret ) === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + } + } + } + + // Call the postDispatch hook for the mapped type + if ( special.postDispatch ) { + special.postDispatch.call( this, event ); + } + + return event.result; + }, + + handlers: function( event, handlers ) { + var i, matches, sel, handleObj, + handlerQueue = [], + delegateCount = handlers.delegateCount, + cur = event.target; + + // Support (at least): Chrome, IE9 + // Find delegate handlers + // Black-hole SVG instance trees (#13180) + // + // Support: Firefox<=42+ + // Avoid non-left-click in FF but don't block IE radio events (#3861, gh-2343) + if ( delegateCount && cur.nodeType && + ( event.type !== "click" || isNaN( event.button ) || event.button < 1 ) ) { + + /* jshint eqeqeq: false */ + for ( ; cur != this; cur = cur.parentNode || this ) { + /* jshint eqeqeq: true */ + + // Don't check non-elements (#13208) + // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) + if ( cur.nodeType === 1 && ( cur.disabled !== true || event.type !== "click" ) ) { + matches = []; + for ( i = 0; i < delegateCount; i++ ) { + handleObj = handlers[ i ]; + + // Don't conflict with Object.prototype properties (#13203) + sel = handleObj.selector + " "; + + if ( matches[ sel ] === undefined ) { + matches[ sel ] = handleObj.needsContext ? + jQuery( sel, this ).index( cur ) > -1 : + jQuery.find( sel, this, null, [ cur ] ).length; + } + if ( matches[ sel ] ) { + matches.push( handleObj ); + } + } + if ( matches.length ) { + handlerQueue.push( { elem: cur, handlers: matches } ); + } + } + } + } + + // Add the remaining (directly-bound) handlers + if ( delegateCount < handlers.length ) { + handlerQueue.push( { elem: this, handlers: handlers.slice( delegateCount ) } ); + } + + return handlerQueue; + }, + + fix: function( event ) { + if ( event[ jQuery.expando ] ) { + return event; + } + + // Create a writable copy of the event object and normalize some properties + var i, prop, copy, + type = event.type, + originalEvent = event, + fixHook = this.fixHooks[ type ]; + + if ( !fixHook ) { + this.fixHooks[ type ] = fixHook = + rmouseEvent.test( type ) ? this.mouseHooks : + rkeyEvent.test( type ) ? this.keyHooks : + {}; + } + copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; + + event = new jQuery.Event( originalEvent ); + + i = copy.length; + while ( i-- ) { + prop = copy[ i ]; + event[ prop ] = originalEvent[ prop ]; + } + + // Support: IE<9 + // Fix target property (#1925) + if ( !event.target ) { + event.target = originalEvent.srcElement || document; + } + + // Support: Safari 6-8+ + // Target should not be a text node (#504, #13143) + if ( event.target.nodeType === 3 ) { + event.target = event.target.parentNode; + } + + // Support: IE<9 + // For mouse/key events, metaKey==false if it's undefined (#3368, #11328) + event.metaKey = !!event.metaKey; + + return fixHook.filter ? fixHook.filter( event, originalEvent ) : event; + }, + + // Includes some event props shared by KeyEvent and MouseEvent + props: ( "altKey bubbles cancelable ctrlKey currentTarget detail eventPhase " + + "metaKey relatedTarget shiftKey target timeStamp view which" ).split( " " ), + + fixHooks: {}, + + keyHooks: { + props: "char charCode key keyCode".split( " " ), + filter: function( event, original ) { + + // Add which for key events + if ( event.which == null ) { + event.which = original.charCode != null ? original.charCode : original.keyCode; + } + + return event; + } + }, + + mouseHooks: { + props: ( "button buttons clientX clientY fromElement offsetX offsetY " + + "pageX pageY screenX screenY toElement" ).split( " " ), + filter: function( event, original ) { + var body, eventDoc, doc, + button = original.button, + fromElement = original.fromElement; + + // Calculate pageX/Y if missing and clientX/Y available + if ( event.pageX == null && original.clientX != null ) { + eventDoc = event.target.ownerDocument || document; + doc = eventDoc.documentElement; + body = eventDoc.body; + + event.pageX = original.clientX + + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - + ( doc && doc.clientLeft || body && body.clientLeft || 0 ); + event.pageY = original.clientY + + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - + ( doc && doc.clientTop || body && body.clientTop || 0 ); + } + + // Add relatedTarget, if necessary + if ( !event.relatedTarget && fromElement ) { + event.relatedTarget = fromElement === event.target ? + original.toElement : + fromElement; + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + // Note: button is not normalized, so don't use it + if ( !event.which && button !== undefined ) { + event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); + } + + return event; + } + }, + + special: { + load: { + + // Prevent triggered image.load events from bubbling to window.load + noBubble: true + }, + focus: { + + // Fire native event if possible so blur/focus sequence is correct + trigger: function() { + if ( this !== safeActiveElement() && this.focus ) { + try { + this.focus(); + return false; + } catch ( e ) { + + // Support: IE<9 + // If we error on focus to hidden element (#1486, #12518), + // let .trigger() run the handlers + } + } + }, + delegateType: "focusin" + }, + blur: { + trigger: function() { + if ( this === safeActiveElement() && this.blur ) { + this.blur(); + return false; + } + }, + delegateType: "focusout" + }, + click: { + + // For checkbox, fire native event so checked state will be right + trigger: function() { + if ( jQuery.nodeName( this, "input" ) && this.type === "checkbox" && this.click ) { + this.click(); + return false; + } + }, + + // For cross-browser consistency, don't fire native .click() on links + _default: function( event ) { + return jQuery.nodeName( event.target, "a" ); + } + }, + + beforeunload: { + postDispatch: function( event ) { + + // Support: Firefox 20+ + // Firefox doesn't alert if the returnValue field is not set. + if ( event.result !== undefined && event.originalEvent ) { + event.originalEvent.returnValue = event.result; + } + } + } + }, + + // Piggyback on a donor event to simulate a different one + simulate: function( type, elem, event ) { + var e = jQuery.extend( + new jQuery.Event(), + event, + { + type: type, + isSimulated: true + + // Previously, `originalEvent: {}` was set here, so stopPropagation call + // would not be triggered on donor event, since in our own + // jQuery.event.stopPropagation function we had a check for existence of + // originalEvent.stopPropagation method, so, consequently it would be a noop. + // + // Guard for simulated events was moved to jQuery.event.stopPropagation function + // since `originalEvent` should point to the original event for the + // constancy with other events and for more focused logic + } + ); + + jQuery.event.trigger( e, null, elem ); + + if ( e.isDefaultPrevented() ) { + event.preventDefault(); + } + } +}; + +jQuery.removeEvent = document.removeEventListener ? + function( elem, type, handle ) { + + // This "if" is needed for plain objects + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle ); + } + } : + function( elem, type, handle ) { + var name = "on" + type; + + if ( elem.detachEvent ) { + + // #8545, #7054, preventing memory leaks for custom events in IE6-8 + // detachEvent needed property on element, by name of that event, + // to properly expose it to GC + if ( typeof elem[ name ] === "undefined" ) { + elem[ name ] = null; + } + + elem.detachEvent( name, handle ); + } + }; + +jQuery.Event = function( src, props ) { + + // Allow instantiation without the 'new' keyword + if ( !( this instanceof jQuery.Event ) ) { + return new jQuery.Event( src, props ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = src.defaultPrevented || + src.defaultPrevented === undefined && + + // Support: IE < 9, Android < 4.0 + src.returnValue === false ? + returnTrue : + returnFalse; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if ( props ) { + jQuery.extend( this, props ); + } + + // Create a timestamp if incoming event doesn't have one + this.timeStamp = src && src.timeStamp || jQuery.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + constructor: jQuery.Event, + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse, + + preventDefault: function() { + var e = this.originalEvent; + + this.isDefaultPrevented = returnTrue; + if ( !e ) { + return; + } + + // If preventDefault exists, run it on the original event + if ( e.preventDefault ) { + e.preventDefault(); + + // Support: IE + // Otherwise set the returnValue property of the original event to false + } else { + e.returnValue = false; + } + }, + stopPropagation: function() { + var e = this.originalEvent; + + this.isPropagationStopped = returnTrue; + + if ( !e || this.isSimulated ) { + return; + } + + // If stopPropagation exists, run it on the original event + if ( e.stopPropagation ) { + e.stopPropagation(); + } + + // Support: IE + // Set the cancelBubble property of the original event to true + e.cancelBubble = true; + }, + stopImmediatePropagation: function() { + var e = this.originalEvent; + + this.isImmediatePropagationStopped = returnTrue; + + if ( e && e.stopImmediatePropagation ) { + e.stopImmediatePropagation(); + } + + this.stopPropagation(); + } +}; + +// Create mouseenter/leave events using mouseover/out and event-time checks +// so that event delegation works in jQuery. +// Do the same for pointerenter/pointerleave and pointerover/pointerout +// +// Support: Safari 7 only +// Safari sends mouseenter too often; see: +// https://code.google.com/p/chromium/issues/detail?id=470258 +// for the description of the bug (it existed in older Chrome versions as well). +jQuery.each( { + mouseenter: "mouseover", + mouseleave: "mouseout", + pointerenter: "pointerover", + pointerleave: "pointerout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + delegateType: fix, + bindType: fix, + + handle: function( event ) { + var ret, + target = this, + related = event.relatedTarget, + handleObj = event.handleObj; + + // For mouseenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { + event.type = handleObj.origType; + ret = handleObj.handler.apply( this, arguments ); + event.type = fix; + } + return ret; + } + }; +} ); + +// IE submit delegation +if ( !support.submit ) { + + jQuery.event.special.submit = { + setup: function() { + + // Only need this for delegated form submit events + if ( jQuery.nodeName( this, "form" ) ) { + return false; + } + + // Lazy-add a submit handler when a descendant form may potentially be submitted + jQuery.event.add( this, "click._submit keypress._submit", function( e ) { + + // Node name check avoids a VML-related crash in IE (#9807) + var elem = e.target, + form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? + + // Support: IE <=8 + // We use jQuery.prop instead of elem.form + // to allow fixing the IE8 delegated submit issue (gh-2332) + // by 3rd party polyfills/workarounds. + jQuery.prop( elem, "form" ) : + undefined; + + if ( form && !jQuery._data( form, "submit" ) ) { + jQuery.event.add( form, "submit._submit", function( event ) { + event._submitBubble = true; + } ); + jQuery._data( form, "submit", true ); + } + } ); + + // return undefined since we don't need an event listener + }, + + postDispatch: function( event ) { + + // If form was submitted by the user, bubble the event up the tree + if ( event._submitBubble ) { + delete event._submitBubble; + if ( this.parentNode && !event.isTrigger ) { + jQuery.event.simulate( "submit", this.parentNode, event ); + } + } + }, + + teardown: function() { + + // Only need this for delegated form submit events + if ( jQuery.nodeName( this, "form" ) ) { + return false; + } + + // Remove delegated handlers; cleanData eventually reaps submit handlers attached above + jQuery.event.remove( this, "._submit" ); + } + }; +} + +// IE change delegation and checkbox/radio fix +if ( !support.change ) { + + jQuery.event.special.change = { + + setup: function() { + + if ( rformElems.test( this.nodeName ) ) { + + // IE doesn't fire change on a check/radio until blur; trigger it on click + // after a propertychange. Eat the blur-change in special.change.handle. + // This still fires onchange a second time for check/radio after blur. + if ( this.type === "checkbox" || this.type === "radio" ) { + jQuery.event.add( this, "propertychange._change", function( event ) { + if ( event.originalEvent.propertyName === "checked" ) { + this._justChanged = true; + } + } ); + jQuery.event.add( this, "click._change", function( event ) { + if ( this._justChanged && !event.isTrigger ) { + this._justChanged = false; + } + + // Allow triggered, simulated change events (#11500) + jQuery.event.simulate( "change", this, event ); + } ); + } + return false; + } + + // Delegated event; lazy-add a change handler on descendant inputs + jQuery.event.add( this, "beforeactivate._change", function( e ) { + var elem = e.target; + + if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "change" ) ) { + jQuery.event.add( elem, "change._change", function( event ) { + if ( this.parentNode && !event.isSimulated && !event.isTrigger ) { + jQuery.event.simulate( "change", this.parentNode, event ); + } + } ); + jQuery._data( elem, "change", true ); + } + } ); + }, + + handle: function( event ) { + var elem = event.target; + + // Swallow native change events from checkbox/radio, we already triggered them above + if ( this !== elem || event.isSimulated || event.isTrigger || + ( elem.type !== "radio" && elem.type !== "checkbox" ) ) { + + return event.handleObj.handler.apply( this, arguments ); + } + }, + + teardown: function() { + jQuery.event.remove( this, "._change" ); + + return !rformElems.test( this.nodeName ); + } + }; +} + +// Support: Firefox +// Firefox doesn't have focus(in | out) events +// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 +// +// Support: Chrome, Safari +// focus(in | out) events fire after focus & blur events, +// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order +// Related ticket - https://code.google.com/p/chromium/issues/detail?id=449857 +if ( !support.focusin ) { + jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { + + // Attach a single capturing handler on the document while someone wants focusin/focusout + var handler = function( event ) { + jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); + }; + + jQuery.event.special[ fix ] = { + setup: function() { + var doc = this.ownerDocument || this, + attaches = jQuery._data( doc, fix ); + + if ( !attaches ) { + doc.addEventListener( orig, handler, true ); + } + jQuery._data( doc, fix, ( attaches || 0 ) + 1 ); + }, + teardown: function() { + var doc = this.ownerDocument || this, + attaches = jQuery._data( doc, fix ) - 1; + + if ( !attaches ) { + doc.removeEventListener( orig, handler, true ); + jQuery._removeData( doc, fix ); + } else { + jQuery._data( doc, fix, attaches ); + } + } + }; + } ); +} + +jQuery.fn.extend( { + + on: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn ); + }, + one: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn, 1 ); + }, + off: function( types, selector, fn ) { + var handleObj, type; + if ( types && types.preventDefault && types.handleObj ) { + + // ( event ) dispatched jQuery.Event + handleObj = types.handleObj; + jQuery( types.delegateTarget ).off( + handleObj.namespace ? + handleObj.origType + "." + handleObj.namespace : + handleObj.origType, + handleObj.selector, + handleObj.handler + ); + return this; + } + if ( typeof types === "object" ) { + + // ( types-object [, selector] ) + for ( type in types ) { + this.off( type, selector, types[ type ] ); + } + return this; + } + if ( selector === false || typeof selector === "function" ) { + + // ( types [, fn] ) + fn = selector; + selector = undefined; + } + if ( fn === false ) { + fn = returnFalse; + } + return this.each( function() { + jQuery.event.remove( this, types, fn, selector ); + } ); + }, + + trigger: function( type, data ) { + return this.each( function() { + jQuery.event.trigger( type, data, this ); + } ); + }, + triggerHandler: function( type, data ) { + var elem = this[ 0 ]; + if ( elem ) { + return jQuery.event.trigger( type, data, elem, true ); + } + } +} ); + + +var rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g, + rnoshimcache = new RegExp( "<(?:" + nodeNames + ")[\\s/>]", "i" ), + rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi, + + // Support: IE 10-11, Edge 10240+ + // In IE/Edge using regex groups here causes severe slowdowns. + // See https://connect.microsoft.com/IE/feedback/details/1736512/ + rnoInnerhtml = /\s*$/g, + safeFragment = createSafeFragment( document ), + fragmentDiv = safeFragment.appendChild( document.createElement( "div" ) ); + +// Support: IE<8 +// Manipulating tables requires a tbody +function manipulationTarget( elem, content ) { + return jQuery.nodeName( elem, "table" ) && + jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ? + + elem.getElementsByTagName( "tbody" )[ 0 ] || + elem.appendChild( elem.ownerDocument.createElement( "tbody" ) ) : + elem; +} + +// Replace/restore the type attribute of script elements for safe DOM manipulation +function disableScript( elem ) { + elem.type = ( jQuery.find.attr( elem, "type" ) !== null ) + "/" + elem.type; + return elem; +} +function restoreScript( elem ) { + var match = rscriptTypeMasked.exec( elem.type ); + if ( match ) { + elem.type = match[ 1 ]; + } else { + elem.removeAttribute( "type" ); + } + return elem; +} + +function cloneCopyEvent( src, dest ) { + if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) { + return; + } + + var type, i, l, + oldData = jQuery._data( src ), + curData = jQuery._data( dest, oldData ), + events = oldData.events; + + if ( events ) { + delete curData.handle; + curData.events = {}; + + for ( type in events ) { + for ( i = 0, l = events[ type ].length; i < l; i++ ) { + jQuery.event.add( dest, type, events[ type ][ i ] ); + } + } + } + + // make the cloned public data object a copy from the original + if ( curData.data ) { + curData.data = jQuery.extend( {}, curData.data ); + } +} + +function fixCloneNodeIssues( src, dest ) { + var nodeName, e, data; + + // We do not need to do anything for non-Elements + if ( dest.nodeType !== 1 ) { + return; + } + + nodeName = dest.nodeName.toLowerCase(); + + // IE6-8 copies events bound via attachEvent when using cloneNode. + if ( !support.noCloneEvent && dest[ jQuery.expando ] ) { + data = jQuery._data( dest ); + + for ( e in data.events ) { + jQuery.removeEvent( dest, e, data.handle ); + } + + // Event data gets referenced instead of copied if the expando gets copied too + dest.removeAttribute( jQuery.expando ); + } + + // IE blanks contents when cloning scripts, and tries to evaluate newly-set text + if ( nodeName === "script" && dest.text !== src.text ) { + disableScript( dest ).text = src.text; + restoreScript( dest ); + + // IE6-10 improperly clones children of object elements using classid. + // IE10 throws NoModificationAllowedError if parent is null, #12132. + } else if ( nodeName === "object" ) { + if ( dest.parentNode ) { + dest.outerHTML = src.outerHTML; + } + + // This path appears unavoidable for IE9. When cloning an object + // element in IE9, the outerHTML strategy above is not sufficient. + // If the src has innerHTML and the destination does not, + // copy the src.innerHTML into the dest.innerHTML. #10324 + if ( support.html5Clone && ( src.innerHTML && !jQuery.trim( dest.innerHTML ) ) ) { + dest.innerHTML = src.innerHTML; + } + + } else if ( nodeName === "input" && rcheckableType.test( src.type ) ) { + + // IE6-8 fails to persist the checked state of a cloned checkbox + // or radio button. Worse, IE6-7 fail to give the cloned element + // a checked appearance if the defaultChecked value isn't also set + + dest.defaultChecked = dest.checked = src.checked; + + // IE6-7 get confused and end up setting the value of a cloned + // checkbox/radio button to an empty string instead of "on" + if ( dest.value !== src.value ) { + dest.value = src.value; + } + + // IE6-8 fails to return the selected option to the default selected + // state when cloning options + } else if ( nodeName === "option" ) { + dest.defaultSelected = dest.selected = src.defaultSelected; + + // IE6-8 fails to set the defaultValue to the correct value when + // cloning other types of input fields + } else if ( nodeName === "input" || nodeName === "textarea" ) { + dest.defaultValue = src.defaultValue; + } +} + +function domManip( collection, args, callback, ignored ) { + + // Flatten any nested arrays + args = concat.apply( [], args ); + + var first, node, hasScripts, + scripts, doc, fragment, + i = 0, + l = collection.length, + iNoClone = l - 1, + value = args[ 0 ], + isFunction = jQuery.isFunction( value ); + + // We can't cloneNode fragments that contain checked, in WebKit + if ( isFunction || + ( l > 1 && typeof value === "string" && + !support.checkClone && rchecked.test( value ) ) ) { + return collection.each( function( index ) { + var self = collection.eq( index ); + if ( isFunction ) { + args[ 0 ] = value.call( this, index, self.html() ); + } + domManip( self, args, callback, ignored ); + } ); + } + + if ( l ) { + fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); + first = fragment.firstChild; + + if ( fragment.childNodes.length === 1 ) { + fragment = first; + } + + // Require either new content or an interest in ignored elements to invoke the callback + if ( first || ignored ) { + scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); + hasScripts = scripts.length; + + // Use the original fragment for the last item + // instead of the first because it can end up + // being emptied incorrectly in certain situations (#8070). + for ( ; i < l; i++ ) { + node = fragment; + + if ( i !== iNoClone ) { + node = jQuery.clone( node, true, true ); + + // Keep references to cloned scripts for later restoration + if ( hasScripts ) { + + // Support: Android<4.1, PhantomJS<2 + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( scripts, getAll( node, "script" ) ); + } + } + + callback.call( collection[ i ], node, i ); + } + + if ( hasScripts ) { + doc = scripts[ scripts.length - 1 ].ownerDocument; + + // Reenable scripts + jQuery.map( scripts, restoreScript ); + + // Evaluate executable scripts on first document insertion + for ( i = 0; i < hasScripts; i++ ) { + node = scripts[ i ]; + if ( rscriptType.test( node.type || "" ) && + !jQuery._data( node, "globalEval" ) && + jQuery.contains( doc, node ) ) { + + if ( node.src ) { + + // Optional AJAX dependency, but won't run scripts if not present + if ( jQuery._evalUrl ) { + jQuery._evalUrl( node.src ); + } + } else { + jQuery.globalEval( + ( node.text || node.textContent || node.innerHTML || "" ) + .replace( rcleanScript, "" ) + ); + } + } + } + } + + // Fix #11809: Avoid leaking memory + fragment = first = null; + } + } + + return collection; +} + +function remove( elem, selector, keepData ) { + var node, + elems = selector ? jQuery.filter( selector, elem ) : elem, + i = 0; + + for ( ; ( node = elems[ i ] ) != null; i++ ) { + + if ( !keepData && node.nodeType === 1 ) { + jQuery.cleanData( getAll( node ) ); + } + + if ( node.parentNode ) { + if ( keepData && jQuery.contains( node.ownerDocument, node ) ) { + setGlobalEval( getAll( node, "script" ) ); + } + node.parentNode.removeChild( node ); + } + } + + return elem; +} + +jQuery.extend( { + htmlPrefilter: function( html ) { + return html.replace( rxhtmlTag, "<$1>" ); + }, + + clone: function( elem, dataAndEvents, deepDataAndEvents ) { + var destElements, node, clone, i, srcElements, + inPage = jQuery.contains( elem.ownerDocument, elem ); + + if ( support.html5Clone || jQuery.isXMLDoc( elem ) || + !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) { + + clone = elem.cloneNode( true ); + + // IE<=8 does not properly clone detached, unknown element nodes + } else { + fragmentDiv.innerHTML = elem.outerHTML; + fragmentDiv.removeChild( clone = fragmentDiv.firstChild ); + } + + if ( ( !support.noCloneEvent || !support.noCloneChecked ) && + ( elem.nodeType === 1 || elem.nodeType === 11 ) && !jQuery.isXMLDoc( elem ) ) { + + // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2 + destElements = getAll( clone ); + srcElements = getAll( elem ); + + // Fix all IE cloning issues + for ( i = 0; ( node = srcElements[ i ] ) != null; ++i ) { + + // Ensure that the destination node is not null; Fixes #9587 + if ( destElements[ i ] ) { + fixCloneNodeIssues( node, destElements[ i ] ); + } + } + } + + // Copy the events from the original to the clone + if ( dataAndEvents ) { + if ( deepDataAndEvents ) { + srcElements = srcElements || getAll( elem ); + destElements = destElements || getAll( clone ); + + for ( i = 0; ( node = srcElements[ i ] ) != null; i++ ) { + cloneCopyEvent( node, destElements[ i ] ); + } + } else { + cloneCopyEvent( elem, clone ); + } + } + + // Preserve script evaluation history + destElements = getAll( clone, "script" ); + if ( destElements.length > 0 ) { + setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); + } + + destElements = srcElements = node = null; + + // Return the cloned set + return clone; + }, + + cleanData: function( elems, /* internal */ forceAcceptData ) { + var elem, type, id, data, + i = 0, + internalKey = jQuery.expando, + cache = jQuery.cache, + attributes = support.attributes, + special = jQuery.event.special; + + for ( ; ( elem = elems[ i ] ) != null; i++ ) { + if ( forceAcceptData || acceptData( elem ) ) { + + id = elem[ internalKey ]; + data = id && cache[ id ]; + + if ( data ) { + if ( data.events ) { + for ( type in data.events ) { + if ( special[ type ] ) { + jQuery.event.remove( elem, type ); + + // This is a shortcut to avoid jQuery.event.remove's overhead + } else { + jQuery.removeEvent( elem, type, data.handle ); + } + } + } + + // Remove cache only if it was not already removed by jQuery.event.remove + if ( cache[ id ] ) { + + delete cache[ id ]; + + // Support: IE<9 + // IE does not allow us to delete expando properties from nodes + // IE creates expando attributes along with the property + // IE does not have a removeAttribute function on Document nodes + if ( !attributes && typeof elem.removeAttribute !== "undefined" ) { + elem.removeAttribute( internalKey ); + + // Webkit & Blink performance suffers when deleting properties + // from DOM nodes, so set to undefined instead + // https://code.google.com/p/chromium/issues/detail?id=378607 + } else { + elem[ internalKey ] = undefined; + } + + deletedIds.push( id ); + } + } + } + } + } +} ); + +jQuery.fn.extend( { + + // Keep domManip exposed until 3.0 (gh-2225) + domManip: domManip, + + detach: function( selector ) { + return remove( this, selector, true ); + }, + + remove: function( selector ) { + return remove( this, selector ); + }, + + text: function( value ) { + return access( this, function( value ) { + return value === undefined ? + jQuery.text( this ) : + this.empty().append( + ( this[ 0 ] && this[ 0 ].ownerDocument || document ).createTextNode( value ) + ); + }, null, value, arguments.length ); + }, + + append: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.appendChild( elem ); + } + } ); + }, + + prepend: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.insertBefore( elem, target.firstChild ); + } + } ); + }, + + before: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this ); + } + } ); + }, + + after: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this.nextSibling ); + } + } ); + }, + + empty: function() { + var elem, + i = 0; + + for ( ; ( elem = this[ i ] ) != null; i++ ) { + + // Remove element nodes and prevent memory leaks + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + } + + // Remove any remaining nodes + while ( elem.firstChild ) { + elem.removeChild( elem.firstChild ); + } + + // If this is a select, ensure that it displays empty (#12336) + // Support: IE<9 + if ( elem.options && jQuery.nodeName( elem, "select" ) ) { + elem.options.length = 0; + } + } + + return this; + }, + + clone: function( dataAndEvents, deepDataAndEvents ) { + dataAndEvents = dataAndEvents == null ? false : dataAndEvents; + deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; + + return this.map( function() { + return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); + } ); + }, + + html: function( value ) { + return access( this, function( value ) { + var elem = this[ 0 ] || {}, + i = 0, + l = this.length; + + if ( value === undefined ) { + return elem.nodeType === 1 ? + elem.innerHTML.replace( rinlinejQuery, "" ) : + undefined; + } + + // See if we can take a shortcut and just use innerHTML + if ( typeof value === "string" && !rnoInnerhtml.test( value ) && + ( support.htmlSerialize || !rnoshimcache.test( value ) ) && + ( support.leadingWhitespace || !rleadingWhitespace.test( value ) ) && + !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { + + value = jQuery.htmlPrefilter( value ); + + try { + for ( ; i < l; i++ ) { + + // Remove element nodes and prevent memory leaks + elem = this[ i ] || {}; + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + elem.innerHTML = value; + } + } + + elem = 0; + + // If using innerHTML throws an exception, use the fallback method + } catch ( e ) {} + } + + if ( elem ) { + this.empty().append( value ); + } + }, null, value, arguments.length ); + }, + + replaceWith: function() { + var ignored = []; + + // Make the changes, replacing each non-ignored context element with the new content + return domManip( this, arguments, function( elem ) { + var parent = this.parentNode; + + if ( jQuery.inArray( this, ignored ) < 0 ) { + jQuery.cleanData( getAll( this ) ); + if ( parent ) { + parent.replaceChild( elem, this ); + } + } + + // Force callback invocation + }, ignored ); + } +} ); + +jQuery.each( { + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after", + replaceAll: "replaceWith" +}, function( name, original ) { + jQuery.fn[ name ] = function( selector ) { + var elems, + i = 0, + ret = [], + insert = jQuery( selector ), + last = insert.length - 1; + + for ( ; i <= last; i++ ) { + elems = i === last ? this : this.clone( true ); + jQuery( insert[ i ] )[ original ]( elems ); + + // Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get() + push.apply( ret, elems.get() ); + } + + return this.pushStack( ret ); + }; +} ); + + +var iframe, + elemdisplay = { + + // Support: Firefox + // We have to pre-define these values for FF (#10227) + HTML: "block", + BODY: "block" + }; + +/** + * Retrieve the actual display of a element + * @param {String} name nodeName of the element + * @param {Object} doc Document object + */ + +// Called only from within defaultDisplay +function actualDisplay( name, doc ) { + var elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ), + + display = jQuery.css( elem[ 0 ], "display" ); + + // We don't have any data stored on the element, + // so use "detach" method as fast way to get rid of the element + elem.detach(); + + return display; +} + +/** + * Try to determine the default display value of an element + * @param {String} nodeName + */ +function defaultDisplay( nodeName ) { + var doc = document, + display = elemdisplay[ nodeName ]; + + if ( !display ) { + display = actualDisplay( nodeName, doc ); + + // If the simple way fails, read from inside an iframe + if ( display === "none" || !display ) { + + // Use the already-created iframe if possible + iframe = ( iframe || jQuery( "'); + $('iframe', modal.tmp) + .css({ + width: currentSettings.width, + height: currentSettings.height + }) + .error(loadingError) + .load(formDataLoaded); + debug('Form Data Load: '+jFrom.attr('action')); + showModal(); + showContentOrLoading(); + } else if (currentSettings.type == 'image') { + debug('Image Load: '+url); + var title = jFrom.attr('title') || currentSettings.defaultImgAlt; + initModal(); + modal.tmp.html('').find('img').attr('alt', title); + modal.tmp.css({lineHeight: 0}); + $('img', modal.tmp) + .error(loadingError) + .load(function() { + debug('Image Loaded: '+this.src); + $(this).unbind('load'); + var w = modal.tmp.width(); + var h = modal.tmp.height(); + modal.tmp.css({lineHeight: ''}); + resized.width = w; + resized.height = h; + setCurrentSettings({ + width: w, + height: h, + imgWidth: w, + imgHeight: h + }); + initSettingsSize.width = w; + initSettingsSize.height = h; + setCurrentSettings({overflow: 'visible'}, 'cssOpt', 'content'); + modal.dataReady = true; + if (modal.loadingShown || modal.transition) + showContentOrLoading(); + }) + .attr('src', url); + showModal(); + } else if (currentSettings.type == 'iframeForm') { + initModal(); + modal.tmp.html(''); + debug('Iframe Form Load: '+url); + $('iframe', modal.tmp).eq(0) + .css({ + width: '100%', + height: $.support.boxModel? '99%' : '100%' + }) + .load(iframeLoaded); + modal.dataReady = true; + showModal(); + } else if (currentSettings.type == 'iframe') { + initModal(); + modal.tmp.html(''); + debug('Iframe Load: '+url); + $('iframe', modal.tmp).eq(0) + .css({ + width: '100%', + height: $.support.boxModel? '99%' : '100%' + }) + .load(iframeLoaded); + modal.dataReady = true; + showModal(); + } else if (currentSettings.type) { + // Could be every other kind of type or a dom selector + debug('Content: '+currentSettings.type); + initModal(); + modal.tmp.html(currentSettings.content); + var w = modal.tmp.width(); + var h = modal.tmp.height(); + var div = $(currentSettings.type); + if (div.length) { + setCurrentSettings({type: 'div'}); + w = div.width(); + h = div.height(); + if (contentElt) + contentEltLast = contentElt; + contentElt = div; + modal.tmp.append(div.contents()); + } + initSettingsSize.width = w; + initSettingsSize.height = h; + setCurrentSettings({ + width: w, + height: h + }); + if (modal.tmp.html()) + modal.dataReady = true; + else + loadingError(); + if (!modal.ready) + showModal(); + else + endHideContent(); + } else { + debug('Ajax Load: '+url); + setCurrentSettings({type: 'ajax'}); + var data = currentSettings.ajax.data || {}; + if (currentSettings.selector) { + if (typeof data == "string") { + data+= '&'+currentSettings.selIndicator+'='+currentSettings.selector.substring(1); + } else { + data[currentSettings.selIndicator] = currentSettings.selector.substring(1); + } + } + showModal(); + $.ajax($.extend(true, currentSettings.ajax, { + url: url, + success: ajaxLoaded, + error: loadingError, + data: data + })); + } + } else if (currentSettings.content) { + // Raw content not from a DOM element + debug('Content: '+currentSettings.type); + setCurrentSettings({type: 'manual'}); + initModal(); + modal.tmp.html($('
').html(currentSettings.content).contents()); + if (modal.tmp.html()) + modal.dataReady = true; + else + loadingError(); + showModal(); + } else { + // What should we show here? nothing happen + } + } + + // Update the current settings + // object settings + // string deep1 first key where overwrite the settings + // string deep2 second key where overwrite the settings + function setDefaultCurrentSettings(settings) { + debug('setDefaultCurrentSettings'); + currentSettings = $.extend(true, {}, $.fn.nyroModal.settings, settings); + setMargin(); + } + + function setCurrentSettings(settings, deep1, deep2) { + if (modal.started) { + if (deep1 && deep2) { + $.extend(true, currentSettings[deep1][deep2], settings); + } else if (deep1) { + $.extend(true, currentSettings[deep1], settings); + } else { + if (modal.animContent) { + if ('width' in settings) { + if (!modal.resizing) { + settings.setWidth = settings.width; + shouldResize = true; + } + delete settings['width']; + } + if ('height' in settings) { + if (!modal.resizing) { + settings.setHeight = settings.height; + shouldResize = true; + } + delete settings['height']; + } + } + $.extend(true, currentSettings, settings); + } + } else { + if (deep1 && deep2) { + $.extend(true, $.fn.nyroModal.settings[deep1][deep2], settings); + } else if (deep1) { + $.extend(true, $.fn.nyroModal.settings[deep1], settings); + } else { + $.extend(true, $.fn.nyroModal.settings, settings); + } + } + } + + // Set the margin for postionning the element. Useful for IE6 + function setMarginScroll() { + if (isIE6 && !modal.blocker) { + if (document.documentElement) { + currentSettings.marginScrollLeft = document.documentElement.scrollLeft; + currentSettings.marginScrollTop = document.documentElement.scrollTop; + } else { + currentSettings.marginScrollLeft = document.body.scrollLeft; + currentSettings.marginScrollTop = document.body.scrollTop; + } + } else { + currentSettings.marginScrollLeft = 0; + currentSettings.marginScrollTop = 0; + } + } + + // Set the margin for the content + function setMargin() { + setMarginScroll(); + currentSettings.marginLeft = -(currentSettings.width+currentSettings.borderW)/2; + currentSettings.marginTop = -(currentSettings.height+currentSettings.borderH)/2; + if (!modal.blocker) { + currentSettings.marginLeft+= currentSettings.marginScrollLeft; + currentSettings.marginTop+= currentSettings.marginScrollTop; + } + } + + // Set the margin for the current loading + function setMarginLoading() { + setMarginScroll(); + var outer = getOuter(modal.loading); + currentSettings.marginTopLoading = -(modal.loading.height() + outer.h.border + outer.h.padding)/2; + currentSettings.marginLeftLoading = -(modal.loading.width() + outer.w.border + outer.w.padding)/2; + if (!modal.blocker) { + currentSettings.marginLeftLoading+= currentSettings.marginScrollLeft; + currentSettings.marginTopLoading+= currentSettings.marginScrollTop; + } + } + + // Set the modal Title + function setTitle() { + var title = $('h1#nyroModalTitle', modal.contentWrapper); + if (title.length) + title.text(currentSettings.title); + else + modal.contentWrapper.prepend('

'+currentSettings.title+'

'); + } + + // Init the nyroModal div by settings the CSS elements and hide needed elements + function initModal() { + debug('initModal'); + if (!modal.full) { + if (currentSettings.debug) + setCurrentSettings({color: 'white'}, 'cssOpt', 'bg'); + + var full = { + zIndex: currentSettings.zIndexStart, + position: 'fixed', + top: 0, + left: 0, + width: '100%', + height: '100%' + }; + + var contain = body; + var iframeHideIE = ''; + if (currentSettings.blocker) { + modal.blocker = contain = $(currentSettings.blocker); + var pos = modal.blocker.offset(); + var w = modal.blocker.outerWidth(); + var h = modal.blocker.outerHeight(); + if (isIE6) { + setCurrentSettings({ + height: '100%', + width: '100%', + top: 0, + left: 0 + }, 'cssOpt', 'bg'); + } + modal.blockerVars = { + top: pos.top, + left: pos.left, + width: w, + height: h + }; + var plusTop = (/msie/.test(userAgent) ?0:getCurCSS(body.get(0), 'borderTopWidth')); + var plusLeft = (/msie/.test(userAgent) ?0:getCurCSS(body.get(0), 'borderLeftWidth')); + full = { + position: 'absolute', + top: pos.top + plusTop, + left: pos.left + plusLeft, + width: w, + height: h + }; + } else if (isIE6) { + body.css({ + marginLeft: 0, + marginRight: 0 + }); + var w = body.width(); + var h = $(window).height()+'px'; + if ($(window).height() >= body.outerHeight()) { + h = body.outerHeight()+'px'; + } else + w+= 20; + w += 'px'; + body.css({ + width: w, + height: h, + position: 'static', + overflow: 'hidden' + }); + $('html').css({overflow: 'hidden'}); + setCurrentSettings({ + cssOpt: { + bg: { + position: 'absolute', + zIndex: currentSettings.zIndexStart+1, + height: '110%', + width: '110%', + top: currentSettings.marginScrollTop+'px', + left: currentSettings.marginScrollLeft+'px' + }, + wrapper: { zIndex: currentSettings.zIndexStart+2 }, + loading: { zIndex: currentSettings.zIndexStart+3 } + } + }); + + iframeHideIE = $('') + .css($.extend({}, + currentSettings.cssOpt.bg, { + opacity: 0, + zIndex: 50, + border: 'none' + })); + } + + contain.append($('
').hide()); + + modal.full = $('#nyroModalFull') + .css(full) + .show(); + modal.bg = $('#nyroModalBg') + .css($.extend({ + backgroundColor: currentSettings.bgColor + }, currentSettings.cssOpt.bg)) + .before(iframeHideIE); + modal.bg.bind('click.nyroModal', clickBg); + modal.loading = $('#nyroModalLoading') + .css(currentSettings.cssOpt.loading) + .hide(); + modal.contentWrapper = $('#nyroModalWrapper') + .css(currentSettings.cssOpt.wrapper) + .hide(); + modal.content = $('#nyroModalContent'); + modal.tmp = $('#nyrModalTmp').hide(); + + // To stop the mousewheel if the the plugin is available + if ($.isFunction($.fn.mousewheel)) { + modal.content.mousewheel(function(e, d) { + var elt = modal.content.get(0); + if ((d > 0 && elt.scrollTop == 0) || + (d < 0 && elt.scrollHeight - elt.scrollTop == elt.clientHeight)) { + e.preventDefault(); + e.stopPropagation(); + } + }); + } + + $(document).bind('keydown.nyroModal', keyHandler); + modal.content.css({width: 'auto', height: 'auto'}); + modal.contentWrapper.css({width: 'auto', height: 'auto'}); + + if (!currentSettings.blocker && currentSettings.windowResize) { + $(window).bind('resize.nyroModal', function() { + window.clearTimeout(windowResizeTimeout); + windowResizeTimeout = window.setTimeout(windowResizeHandler, 200); + }); + } + } + } + + function windowResizeHandler() { + $.nyroModalSettings(initSettingsSize); + } + + // Show the modal (ie: the background and then the loading if needed or the content directly) + function showModal() { + debug('showModal'); + if (!modal.ready) { + initModal(); + modal.anim = true; + currentSettings.showBackground(modal, currentSettings, endBackground); + } else { + modal.anim = true; + modal.transition = true; + currentSettings.showTransition(modal, currentSettings, function(){endHideContent();modal.anim=false;showContentOrLoading();}); + } + } + + // Called when user click on background + function clickBg(e) { + if (!currentSettings.modal) + removeModal(); + } + + // Used for the escape key or the arrow in the gallery type + function keyHandler(e) { + if (e.keyCode == 27) { + if (!currentSettings.modal) + removeModal(); + } else if (currentSettings.gallery && modal.ready && modal.dataReady && !modal.anim && !modal.transition) { + if (e.keyCode == 39 || e.keyCode == 40) { + e.preventDefault(); + $.nyroModalNext(); + return false; + } else if (e.keyCode == 37 || e.keyCode == 38) { + e.preventDefault(); + $.nyroModalPrev(); + return false; + } + } + } + + // Determine the filetype regarding the link DOM element + function fileType() { + var from = currentSettings.from; + + var url; + + if (from && from.nodeName) { + var jFrom = $(from); + + url = jFrom.attr(from.nodeName.toLowerCase() == 'form' ? 'action' : 'href'); + if (!url) + url = location.href.substring(window.location.host.length+7); + currentSettings.url = url; + + if (jFrom.attr('rev') == 'modal') + currentSettings.modal = true; + + currentSettings.title = jFrom.attr('title'); + + if (from && from.rel && from.rel.toLowerCase() != 'nofollow') { + var indexSpace = from.rel.indexOf(' '); + currentSettings.gallery = indexSpace > 0 ? from.rel.substr(0, indexSpace) : from.rel; + } + + var imgType = imageType(url, from); + if (imgType) + return imgType; + + if (isSwf(url)) + return 'swf'; + + var iframe = false; + if (from.target && from.target.toLowerCase() == '_blank' || (from.hostname && from.hostname.replace(/:\d*$/,'') != window.location.hostname.replace(/:\d*$/,''))) { + iframe = true; + } + if (from.nodeName.toLowerCase() == 'form') { + if (iframe) + return 'iframeForm'; + setCurrentSettings(extractUrlSel(url)); + if (jFrom.attr('enctype') == 'multipart/form-data') + return 'formData'; + return 'form'; + } + if (iframe) + return 'iframe'; + } else { + url = currentSettings.url; + if (!currentSettings.content) + currentSettings.from = true; + + if (!url) + return null; + + if (isSwf(url)) + return 'swf'; + + var reg1 = new RegExp("^http://|https://", "g"); + if (url.match(reg1)) + return 'iframe'; + } + + var imgType = imageType(url, from); + if (imgType) + return imgType; + + var tmp = extractUrlSel(url); + setCurrentSettings(tmp); + + if (!tmp.url) + return tmp.selector; + } + + function imageType(url, from) { + var image = new RegExp(currentSettings.regexImg, 'i'); + if (image.test(url)) { + return 'image'; + } + } + + function isSwf(url) { + var swf = new RegExp('[^\.]\.(swf)\s*$', 'i'); + return swf.test(url); + } + + function extractUrlSel(url) { + var ret = { + url: null, + selector: null + }; + + if (url) { + var hash = getHash(url); + var hashLoc = getHash(window.location.href); + var curLoc = window.location.href.substring(0, window.location.href.length - hashLoc.length); + var req = url.substring(0, url.length - hash.length); + + if (req == curLoc || req == $('base').attr('href')) { + ret.selector = hash; + } else { + ret.url = req; + ret.selector = hash; + } + } + return ret; + } + + // Called when the content cannot be loaded or tiemout reached + function loadingError() { + debug('loadingError'); + + modal.error = true; + + if (!modal.ready) + return; + + if ($.isFunction(currentSettings.handleError)) + currentSettings.handleError(modal, currentSettings); + + modal.loading + .addClass(currentSettings.errorClass) + .html(currentSettings.contentError); + $(currentSettings.closeSelector, modal.loading) + .unbind('click.nyroModal') + .bind('click.nyroModal', removeModal); + setMarginLoading(); + modal.loading + .css({ + marginTop: currentSettings.marginTopLoading+'px', + marginLeft: currentSettings.marginLeftLoading+'px' + }); + } + + // Put the content from modal.tmp to modal.content + function fillContent() { + debug('fillContent'); + if (!modal.tmp.html()) + return; + + modal.content.html(modal.tmp.contents()); + modal.tmp.empty(); + wrapContent(); + + if (currentSettings.type == 'iframeForm') { + $(currentSettings.from) + .attr('target', 'nyroModalIframe') + .data('nyroModalprocessing', 1) + .submit() + .attr('target', '_blank') + .removeData('nyroModalprocessing'); + } + + if (!currentSettings.modal) + modal.wrapper.prepend(currentSettings.closeButton); + + if ($.isFunction(currentSettings.endFillContent)) + currentSettings.endFillContent(modal, currentSettings); + + modal.content.append(modal.scripts); + + $(currentSettings.closeSelector, modal.contentWrapper) + .unbind('click.nyroModal') + .bind('click.nyroModal', removeModal); + $(currentSettings.openSelector, modal.contentWrapper).nyroModal(getCurrentSettingsNew()); + } + + // Get the current settings to be used in new links + function getCurrentSettingsNew() { + return callingSettings; + var currentSettingsNew = $.extend(true, {}, currentSettings); + if (resized.width) + currentSettingsNew.width = null; + else + currentSettingsNew.width = initSettingsSize.width; + if (resized.height) + currentSettingsNew.height = null; + else + currentSettingsNew.height = initSettingsSize.height; + currentSettingsNew.cssOpt.content.overflow = 'auto'; + return currentSettingsNew; + } + + // Wrap the content and update the modal size if needed + function wrapContent() { + debug('wrapContent'); + + var wrap = $(currentSettings.wrap[currentSettings.type]); + modal.content.append(wrap.children().remove()); + modal.contentWrapper.wrapInner(wrap); + + if (currentSettings.gallery) { + // Set the action for the next and prev button (or remove them) + modal.content.append(currentSettings.galleryLinks); + + gallery.links = $('[rel="'+currentSettings.gallery+'"], [rel^="'+currentSettings.gallery+' "]'); + gallery.index = gallery.links.index(currentSettings.from); + + if (currentSettings.galleryCounts && $.isFunction(currentSettings.galleryCounts)) + currentSettings.galleryCounts(gallery.index + 1, gallery.links.length, modal, currentSettings); + + var currentSettingsNew = getCurrentSettingsNew(); + + var linkPrev = getGalleryLink(-1); + if (linkPrev) { + var prev = $('.nyroModalPrev', modal.contentWrapper) + .attr('href', linkPrev.attr('href')) + .click(function(e) { + e.preventDefault(); + $.nyroModalPrev(); + return false; + }); + if (isIE6 && currentSettings.type == 'swf') { + prev.before($('').css({ + position: prev.css('position'), + top: prev.css('top'), + left: prev.css('left'), + width: prev.width(), + height: prev.height(), + opacity: 0, + border: 'none' + })); + } + } else { + $('.nyroModalPrev', modal.contentWrapper).remove(); + } + var linkNext = getGalleryLink(1); + if (linkNext) { + var next = $('.nyroModalNext', modal.contentWrapper) + .attr('href', linkNext.attr('href')) + .click(function(e) { + e.preventDefault(); + $.nyroModalNext(); + return false; + }); + if (isIE6 && currentSettings.type == 'swf') { + next.before($('') + .css($.extend({}, { + position: next.css('position'), + top: next.css('top'), + left: next.css('left'), + width: next.width(), + height: next.height(), + opacity: 0, + border: 'none' + }))); + } + } else { + $('.nyroModalNext', modal.contentWrapper).remove(); + } + } + + calculateSize(); + } + + function getGalleryLink(dir) { + if (currentSettings.gallery) { + if (!currentSettings.ltr) + dir *= -1; + var index = gallery.index + dir; + if (index >= 0 && index < gallery.links.length) + return gallery.links.eq(index); + else if (currentSettings.galleryLoop) { + if (index < 0) + return gallery.links.eq(gallery.links.length-1); + else + return gallery.links.eq(0); + } + } + return false; + } + + // Calculate the size for the contentWrapper + function calculateSize(resizing) { + debug('calculateSize'); + + modal.wrapper = modal.contentWrapper.children('div:first'); + + resized.width = false; + resized.height = false; + if (false && !currentSettings.windowResizing) { + initSettingsSize.width = currentSettings.width; + initSettingsSize.height = currentSettings.height; + } + + if (currentSettings.autoSizable && (!currentSettings.width || !currentSettings.height)) { + modal.contentWrapper + .css({ + opacity: 0, + width: 'auto', + height: 'auto' + }) + .show(); + var tmp = { + width: 'auto', + height: 'auto' + }; + if (currentSettings.width) { + tmp.width = currentSettings.width; + } else if (currentSettings.type == 'iframe') { + tmp.width = currentSettings.minWidth; + } + + if (currentSettings.height) { + tmp.height = currentSettings.height; + } else if (currentSettings.type == 'iframe') { + tmp.height = currentSettings.minHeight; + } + + modal.content.css(tmp); + if (!currentSettings.width) { + currentSettings.width = modal.content.outerWidth(true); + resized.width = true; + } + if (!currentSettings.height) { + currentSettings.height = modal.content.outerHeight(true); + resized.height = true; + } + modal.contentWrapper.css({opacity: 1}); + if (!resizing) + modal.contentWrapper.hide(); + } + + if (currentSettings.type != 'image' && currentSettings.type != 'swf') { + currentSettings.width = Math.max(currentSettings.width, currentSettings.minWidth); + currentSettings.height = Math.max(currentSettings.height, currentSettings.minHeight); + } + + var outerWrapper = getOuter(modal.contentWrapper); + var outerWrapper2 = getOuter(modal.wrapper); + var outerContent = getOuter(modal.content); + + var tmp = { + content: { + width: currentSettings.width, + height: currentSettings.height + }, + wrapper2: { + width: currentSettings.width + outerContent.w.total, + height: currentSettings.height + outerContent.h.total + }, + wrapper: { + width: currentSettings.width + outerContent.w.total + outerWrapper2.w.total, + height: currentSettings.height + outerContent.h.total + outerWrapper2.h.total + } + }; + + if (currentSettings.resizable) { + var maxHeight = modal.blockerVars? modal.blockerVars.height : $(window).height() + - outerWrapper.h.border + - (tmp.wrapper.height - currentSettings.height); + var maxWidth = modal.blockerVars? modal.blockerVars.width : $(window).width() + - outerWrapper.w.border + - (tmp.wrapper.width - currentSettings.width); + maxHeight-= currentSettings.padding*2; + maxWidth-= currentSettings.padding*2; + + if (tmp.content.height > maxHeight || tmp.content.width > maxWidth) { + // We're gonna resize the modal as it will goes outside the view port + if (currentSettings.type == 'image' || currentSettings.type == 'swf') { + // An image is resized proportionnaly + var useW = currentSettings.imgWidth?currentSettings.imgWidth : currentSettings.width; + var useH = currentSettings.imgHeight?currentSettings.imgHeight : currentSettings.height; + var diffW = tmp.content.width - useW; + var diffH = tmp.content.height - useH; + if (diffH < 0) diffH = 0; + if (diffW < 0) diffW = 0; + var calcH = maxHeight - diffH; + var calcW = maxWidth - diffW; + var ratio = Math.min(calcH/useH, calcW/useW); + calcW = Math.floor(useW*ratio); + calcH = Math.floor(useH*ratio); + tmp.content.height = calcH + diffH; + tmp.content.width = calcW + diffW; + } else { + // For an HTML content, we simply decrease the size + tmp.content.height = Math.min(tmp.content.height, maxHeight); + tmp.content.width = Math.min(tmp.content.width, maxWidth); + } + tmp.wrapper2 = { + width: tmp.content.width + outerContent.w.total, + height: tmp.content.height + outerContent.h.total + }; + tmp.wrapper = { + width: tmp.content.width + outerContent.w.total + outerWrapper2.w.total, + height: tmp.content.height + outerContent.h.total + outerWrapper2.h.total + }; + } + } + + if (currentSettings.type == 'swf') { + $('object, embed', modal.content) + .attr('width', tmp.content.width) + .attr('height', tmp.content.height); + } else if (currentSettings.type == 'image') { + $('img', modal.content).css({ + width: tmp.content.width, + height: tmp.content.height + }); + } + + modal.content.css($.extend({}, tmp.content, currentSettings.cssOpt.content)); + modal.wrapper.css($.extend({}, tmp.wrapper2, currentSettings.cssOpt.wrapper2)); + + if (!resizing) + modal.contentWrapper.css($.extend({}, tmp.wrapper, currentSettings.cssOpt.wrapper)); + + if (currentSettings.type == 'image' && currentSettings.addImageDivTitle) { + // Adding the title for the image + $('img', modal.content).removeAttr('alt'); + var divTitle = $('div', modal.content); + if (currentSettings.title != currentSettings.defaultImgAlt && currentSettings.title) { + if (divTitle.length == 0) { + divTitle = $('
'+currentSettings.title+'
'); + modal.content.append(divTitle); + } + if (currentSettings.setWidthImgTitle) { + var outerDivTitle = getOuter(divTitle); + divTitle.css({width: (tmp.content.width + outerContent.w.padding - outerDivTitle.w.total)+'px'}); + } + } else if (divTitle.length = 0) { + divTitle.remove(); + } + } + + if (currentSettings.title) + setTitle(); + + tmp.wrapper.borderW = outerWrapper.w.border; + tmp.wrapper.borderH = outerWrapper.h.border; + + setCurrentSettings(tmp.wrapper); + setMargin(); + } + + function removeModal(e) { + debug('removeModal'); + if (e) + e.preventDefault(); + if (modal.full && modal.ready) { + $(document).unbind('keydown.nyroModal'); + if (!currentSettings.blocker) + $(window).unbind('resize.nyroModal'); + modal.ready = false; + modal.anim = true; + modal.closing = true; + if (modal.loadingShown || modal.transition) { + currentSettings.hideLoading(modal, currentSettings, function() { + modal.loading.hide(); + modal.loadingShown = false; + modal.transition = false; + currentSettings.hideBackground(modal, currentSettings, endRemove); + }); + } else { + if (fixFF) + modal.content.css({position: ''}); // Fix Issue #10, remove the attribute + modal.wrapper.css({overflow: 'hidden'}); // Used to fix a visual issue when hiding + modal.content.css({overflow: 'hidden'}); // Used to fix a visual issue when hiding + $('iframe', modal.content).hide(); // Fix issue 359 + if ($.isFunction(currentSettings.beforeHideContent)) { + currentSettings.beforeHideContent(modal, currentSettings, function() { + currentSettings.hideContent(modal, currentSettings, function() { + endHideContent(); + currentSettings.hideBackground(modal, currentSettings, endRemove); + }); + }); + } else { + currentSettings.hideContent(modal, currentSettings, function() { + endHideContent(); + currentSettings.hideBackground(modal, currentSettings, endRemove); + }); + } + } + } + if (e) + return false; + } + + function showContentOrLoading() { + debug('showContentOrLoading'); + if (modal.ready && !modal.anim) { + if (modal.dataReady) { + if (modal.tmp.html()) { + modal.anim = true; + if (modal.transition) { + fillContent(); + modal.animContent = true; + currentSettings.hideTransition(modal, currentSettings, function() { + modal.loading.hide(); + modal.transition = false; + modal.loadingShown = false; + endShowContent(); + }); + } else { + currentSettings.hideLoading(modal, currentSettings, function() { + modal.loading.hide(); + modal.loadingShown = false; + fillContent(); + setMarginLoading(); + setMargin(); + modal.animContent = true; + currentSettings.showContent(modal, currentSettings, endShowContent); + }); + } + } + } else if (!modal.loadingShown && !modal.transition) { + modal.anim = true; + modal.loadingShown = true; + if (modal.error) + loadingError(); + else + modal.loading.html(currentSettings.contentLoading); + $(currentSettings.closeSelector, modal.loading) + .unbind('click.nyroModal') + .bind('click.nyroModal', removeModal); + setMarginLoading(); + currentSettings.showLoading(modal, currentSettings, function(){modal.anim=false;showContentOrLoading();}); + } + } + } + + // ------------------------------------------------------- + // Private Data Loaded callback + // ------------------------------------------------------- + + function ajaxLoaded(data) { + debug('AjaxLoaded: '+this.url); + + if (currentSettings.selector) { + var tmp = {}; + var i = 0; + // Looking for script to store them + data = data + .replace(/\r\n/gi,'nyroModalLN') + .replace(//gi, function(x) { + tmp[i] = x; + return ''; + }); + data = $('
'+data+'
').find(currentSettings.selector).html() + .replace(/
\n"; + html += " \n"; + html += " \n"; + html += " \n"; + html += " \n"; + html += " \n"; + html += " \n"; + html += " \n"; + html += " \n"; + html += " \n"; + html += " \n"; + html += " \n"; + html += " \n"; + html += " \n"; + html += " \n"; + html += " \n"; + html += " \n"; + html += " \n"; + html += " \n"; + html += " \n"; + html += " \n"; + html += " \n"; + html += " \n"; + html += " \n"; + html += " \n"; + html += "
" + genlang(31, false) + "" + genlang(34, true) + "" + genlang(32, false) + "" + genlang(33, true) + "" + genlang(35, true) + "" + genlang(36, true) + "" + genlang(37, true) + "
  " + genlang(38, false) + "
\n"; + + $("#filesystem").append(html); + + filesystemTable = $("#filesystemTable").dataTable({ + "bPaginate": false, + "bLengthChange": false, + "bFilter": false, + "bSort": true, + "bInfo": false, + "bProcessing": true, + "bAutoWidth": false, + "bStateSave": true, + "aoColumns": [{ + "sType": 'span-string', + "sWidth": "100px" + }, { + "sType": 'span-string', + "sWidth": "50px" + }, { + "sType": 'span-string', + "sWidth": "200px" + }, { + "sType": 'span-number' + }, { + "sType": 'span-number', + "sWidth": "80px", + "sClass": "right" + }, { + "sType": 'span-number', + "sWidth": "80px", + "sClass": "right" + }, { + "sType": 'span-number', + "sWidth": "80px", + "sClass": "right" + }] + }); +} + +/** + * fill all errors from the xml in the error div element in the document and show the error icon + * @param {jQuery} xml phpSysInfo-XML + */ +function populateErrors(xml) { + var values = false; + $("Errors Error", xml).each(function getError(id) { +// $("#errorlist").append("" + $(this).attr("Function") + "

" + $(this).text() + "

"); + $("#errorlist").append("" + $(this).attr("Function") + "

" + $(this).attr("Message") + "

"); + values = true; + }); + if (values) { + $("#warn").css("display", "inline"); + $("#loadwarn").css("display", "inline"); + } +} + +/** + * show the page + * @param {jQuery} xml phpSysInfo-XML + */ +function displayPage(xml) { + var versioni = ""; + $("#loader").hide(); + $("#container").fadeIn("slow"); + versioni = $("Generation", xml).attr("version").toString(); + $("#version").html(versioni); +} + +/** + * format seconds to a better readable statement with days, hours and minutes + * @param {Number} sec seconds that should be formatted + * @return {String} html string with no breaking spaces and translation statements + */ +function formatUptime(sec) { + var txt = "", intMin = 0, intHours = 0, intDays = 0; + intMin = sec / 60; + intHours = intMin / 60; + intDays = Math.floor(intHours / 24); + intHours = Math.floor(intHours - (intDays * 24)); + intMin = Math.floor(intMin - (intDays * 60 * 24) - (intHours * 60)); + if (intDays) { + txt += intDays.toString() + " " + genlang(48, false) + " "; + } + if (intHours) { + txt += intHours.toString() + " " + genlang(49, false) + " "; + } + return txt + intMin.toString() + " " + genlang(50, false); +} + +/** + * format a given MHz value to a better readable statement with the right suffix + * @param {Number} mhertz mhertz value that should be formatted + * @return {String} html string with no breaking spaces and translation statements + */ +function formatHertz(mhertz) { + if (mhertz && mhertz < 1000) { + return mhertz.toString() + " " + genlang(92, true); + } + else { + if (mhertz && mhertz >= 1000) { + return round(mhertz / 1000, 2) + " " + genlang(93, true); + } + else { + return ""; + } + } +} + +/** + * format the byte values into a user friendly value with the corespondenting unit expression
support is included + * for binary and decimal output
user can specify a constant format for all byte outputs or the output is formated + * automatically so that every value can be read in a user friendly way + * @param {Number} bytes value that should be converted in the corespondenting format, which is specified in the phpsysinfo.ini + * @param {jQuery} xml phpSysInfo-XML + * @return {String} string of the converted bytes with the translated unit expression + */ +function formatBytes(bytes, xml) { + var byteFormat = "", show = ""; + + $("Options", xml).each(function getByteFormat(id) { + byteFormat = $(this).attr("byteFormat"); + }); + + switch (byteFormat.toLowerCase()) { + case "pib": + show += round(bytes / Math.pow(1024, 5), 2); + show += " " + genlang(90, true); + break; + case "tib": + show += round(bytes / Math.pow(1024, 4), 2); + show += " " + genlang(86, true); + break; + case "gib": + show += round(bytes / Math.pow(1024, 3), 2); + show += " " + genlang(87, true); + break; + case "mib": + show += round(bytes / Math.pow(1024, 2), 2); + show += " " + genlang(88, true); + break; + case "kib": + show += round(bytes / Math.pow(1024, 1), 2); + show += " " + genlang(89, true); + break; + case "pb": + show += round(bytes / Math.pow(1000, 5), 2); + show += " " + genlang(91, true); + break; + case "tb": + show += round(bytes / Math.pow(1000, 4), 2); + show += " " + genlang(85, true); + break; + case "gb": + show += round(bytes / Math.pow(1000, 3), 2); + show += " " + genlang(41, true); + break; + case "mb": + show += round(bytes / Math.pow(1000, 2), 2); + show += " " + genlang(40, true); + break; + case "kb": + show += round(bytes / Math.pow(1000, 1), 2); + show += " " + genlang(39, true); + break; + case "b": + show += bytes; + show += " " + genlang(96, true); + break; + case "auto_decimal": + if (bytes > Math.pow(1000, 5)) { + show += round(bytes / Math.pow(1000, 5), 2); + show += " " + genlang(91, true); + } + else { + if (bytes > Math.pow(1000, 4)) { + show += round(bytes / Math.pow(1000, 4), 2); + show += " " + genlang(85, true); + } + else { + if (bytes > Math.pow(1000, 3)) { + show += round(bytes / Math.pow(1000, 3), 2); + show += " " + genlang(41, true); + } + else { + if (bytes > Math.pow(1000, 2)) { + show += round(bytes / Math.pow(1000, 2), 2); + show += " " + genlang(40, true); + } + else { + if (bytes > Math.pow(1000, 1)) { + show += round(bytes / Math.pow(1000, 1), 2); + show += " " + genlang(39, true); + } + else { + show += bytes; + show += " " + genlang(96, true); + } + } + } + } + } + break; + default: + if (bytes > Math.pow(1024, 5)) { + show += round(bytes / Math.pow(1024, 5), 2); + show += " " + genlang(90, true); + } + else { + if (bytes > Math.pow(1024, 4)) { + show += round(bytes / Math.pow(1024, 4), 2); + show += " " + genlang(86, true); + } + else { + if (bytes > Math.pow(1024, 3)) { + show += round(bytes / Math.pow(1024, 3), 2); + show += " " + genlang(87, true); + } + else { + if (bytes > Math.pow(1024, 2)) { + show += round(bytes / Math.pow(1024, 2), 2); + show += " " + genlang(88, true); + } + else { + if (bytes > Math.pow(1024, 1)) { + show += round(bytes / Math.pow(1024, 1), 2); + show += " " + genlang(89, true); + } + else { + show += bytes; + show += " " + genlang(96, true); + } + } + } + } + } + } + return show; +} + +/** + * format a celcius temperature to fahrenheit and also append the right suffix + * @param {String} degreeC temperature in celvius + * @param {jQuery} xml phpSysInfo-XML + * @return {String} html string with no breaking spaces and translation statements + */ +function formatTemp(degreeC, xml) { + var tempFormat = "", degree = 0; + + $("Options", xml).each(function getOptions(id) { + tempFormat = $(this).attr("tempFormat").toString().toLowerCase(); + }); + + degree = parseFloat(degreeC); + if (isNaN(degreeC)) { + return "---"; + } + else { + switch (tempFormat) { + case "f": + return round((((9 * degree) / 5) + 32), 1) + " " + genlang(61, true); + case "c": + return round(degree, 1) + " " + genlang(60, true); + case "c-f": + return round(degree, 1) + " " + genlang(60, true) + "
(" + round((((9 * degree) / 5) + 32), 1) + " " + genlang(61, true) + ")"; + case "f-c": + return round((((9 * degree) / 5) + 32), 1) + " " + genlang(61, true) + "
(" + round(degree, 1) + " " + genlang(60, true) + ")"; + } + } +} + +/** + * create a visual HTML bar from a given size, the layout of that bar can be costumized through the bar css-class + * @param {Number} size barclass + * @return {String} HTML string which contains the full layout of the bar + */ +function createBar(size, barclass) { + if (barclass === undefined) { + barclass = "bar"; + } + return "
 
 " + size + "%"; +} + +/** + * (re)fill the vitals block with the values from the given xml + * @param {jQuery} xml phpSysInfo-XML + */ +function refreshVitals(xml) { + var hostname = "", ip = "", kernel = "", distro = "", icon = "", uptime = "", users = 0, loadavg = ""; + var processes = 0, prunning = 0, psleeping = 0, pstopped = 0, pzombie = 0, pwaiting = 0, pother = 0; + var syslang = "", codepage = ""; + var lastboot = 0; + var timestamp = parseInt($("Generation", xml).attr("timestamp"), 10)*1000; //server time + var not_first = false; + if (isNaN(timestamp)) timestamp = Number(new Date()); //client time + + $("Vitals", xml).each(function getVitals(id) { + hostname = $(this).attr("Hostname"); + ip = $(this).attr("IPAddr"); + kernel = $(this).attr("Kernel"); + distro = $(this).attr("Distro"); + icon = $(this).attr("Distroicon"); + uptime = formatUptime(parseInt($(this).attr("Uptime"), 10)); + lastboot = new Date(timestamp - (parseInt($(this).attr("Uptime"), 10)*1000)); + users = parseInt($(this).attr("Users"), 10); + loadavg = $(this).attr("LoadAvg"); + if ($(this).attr("CPULoad") !== undefined) { + loadavg = loadavg + "
" + createBar(parseInt($(this).attr("CPULoad"), 10)); + } + if ($(this).attr("SysLang") !== undefined) { + syslang = $(this).attr("SysLang"); + document.getElementById("s_syslang_tr").style.display=''; + } + + if ($(this).attr("CodePage") !== undefined) { + codepage = $(this).attr("CodePage"); + if ($(this).attr("SysLang") !== undefined) { + document.getElementById("s_codepage_tr1").style.display=''; + } else { + document.getElementById("s_codepage_tr2").style.display=''; + } + } + + //processes + if ($(this).attr("Processes") !== undefined) { + processes = parseInt($(this).attr("Processes"), 10); + if ((($(this).attr("CodePage") !== undefined) && ($(this).attr("SysLang") == undefined)) || + (($(this).attr("CodePage") == undefined) && ($(this).attr("SysLang") !== undefined))) { + document.getElementById("s_processes_tr1").style.display=''; + } else { + document.getElementById("s_processes_tr2").style.display=''; + } + } + if ($(this).attr("ProcessesRunning") !== undefined) { + prunning = parseInt($(this).attr("ProcessesRunning"), 10); + } + if ($(this).attr("ProcessesSleeping") !== undefined) { + psleeping = parseInt($(this).attr("ProcessesSleeping"), 10); + } + if ($(this).attr("ProcessesStopped") !== undefined) { + pstopped = parseInt($(this).attr("ProcessesStopped"), 10); + } + if ($(this).attr("ProcessesZombie") !== undefined) { + pzombie = parseInt($(this).attr("ProcessesZombie"), 10); + } + if ($(this).attr("ProcessesWaiting") !== undefined) { + pwaiting = parseInt($(this).attr("ProcessesWaiting"), 10); + } + if ($(this).attr("ProcessesOther") !== undefined) { + pother = parseInt($(this).attr("ProcessesOther"), 10); + } + + document.title = "System information: " + hostname + " (" + ip + ")"; + $("#s_hostname_title").html(hostname); + $("#s_ip_title").html(ip); + $("#s_hostname").html(hostname); + $("#s_ip").html(ip); + $("#s_kernel").html(kernel); + $("#s_distro").html("Icon " + distro); //onload IE6 PNG fix + $("#s_uptime").html(uptime); + if (typeof(lastboot.toUTCString)==="function") { + $("#s_lastboot").html(lastboot.toUTCString()); //toUTCstring() or toLocaleString() + } else { + //deprecated + $("#s_lastboot").html(lastboot.toGMTString()); //toGMTString() or toLocaleString() + } + $("#s_users").html(users); + $("#s_loadavg").html(loadavg); + $("#s_syslang").html(syslang); + $("#s_codepage_1").html(codepage); + $("#s_codepage_2").html(codepage); + $("#s_processes_1").html(processes); + $("#s_processes_2").html(processes); + if (prunning || psleeping || pstopped || pzombie || pwaiting || pother) { + $("#s_processes_1").append(" ("); + $("#s_processes_2").append(" ("); + var typelist = {running:111,sleeping:112,stopped:113,zombie:114,waiting:115,other:116}; + for (var proc_type in typelist) { + if (eval("p" + proc_type)) { + if (not_first) { + $("#s_processes_1").append(", "); + $("#s_processes_2").append(", "); + } + $("#s_processes_1").append(eval("p" + proc_type) + " " + genlang(typelist[proc_type], true)); + $("#s_processes_2").append(eval("p" + proc_type) + " " + genlang(typelist[proc_type], true)); + not_first = true; + } + } + $("#s_processes_1").append(") "); + $("#s_processes_2").append(") "); + } + }); +} + + +/** + * build the cpu information as table rows + * @param {jQuery} xml phpSysInfo-XML + * @param {Array} tree array that holds the positions for treetable plugin + * @param {Number} rootposition position of the parent element + * @param {Array} collapsed array that holds all collapsed elements hwne opening page + */ +function fillCpu(xml, tree, rootposition, collapsed) { + var cpucount = 0, html = ""; + $("Hardware CPU CpuCore", xml).each(function getCpuCore(cpuCoreId) { + var model = "", speed = 0, bus = 0, cache = 0, bogo = 0, temp = 0, load = 0, speedmax = 0, speedmin = 0, cpucoreposition = 0, virt = ""; + cpucount += 1; + model = $(this).attr("Model"); + speed = parseInt($(this).attr("CpuSpeed"), 10); + speedmax = parseInt($(this).attr("CpuSpeedMax"), 10); + speedmin = parseInt($(this).attr("CpuSpeedMin"), 10); + cache = parseInt($(this).attr("Cache"), 10); + virt = $(this).attr("Virt"); + bus = parseInt($(this).attr("BusSpeed"), 10); + temp = parseInt($(this).attr("Cputemp"), 10); + bogo = parseInt($(this).attr("Bogomips"), 10); + load = parseInt($(this).attr("Load"), 10); + + if (!showCPUListExpanded) { + collapsed.push(rootposition); + } + html += "" + model + "\n"; + cpucoreposition = tree.push(rootposition); + if (!showCPUInfoExpanded) { + collapsed.push(cpucoreposition); + } + if (!isNaN(speed)) { + html += "" + genlang(13, true) + ":" + formatHertz(speed) + "\n"; + tree.push(cpucoreposition); + } + if (!isNaN(speedmax)) { + html += "" + genlang(100, true) + ":" + formatHertz(speedmax) + "\n"; + tree.push(cpucoreposition); + } + if (!isNaN(speedmin)) { + html += "" + genlang(101, true) + ":" + formatHertz(speedmin) + "\n"; + tree.push(cpucoreposition); + } + if (!isNaN(cache)) { + html += "" + genlang(15, true) + ":" + formatBytes(cache) + "\n"; + tree.push(cpucoreposition); + } + if (virt != undefined) { + html += "" + genlang(94, true) + ":" + virt + "\n"; + tree.push(cpucoreposition); + } + if (!isNaN(bus)) { + html += "" + genlang(14, true) + ":" + formatHertz(bus) + "\n"; + tree.push(cpucoreposition); + } + if (!isNaN(bogo)) { + html += "" + genlang(16, true) + ":" + bogo.toString() + "\n"; + tree.push(cpucoreposition); + } + if (!isNaN(temp)) { + html += "" + genlang(51, true) + ":" + formatTemp(temp, xml) + "\n"; + tree.push(cpucoreposition); + } + if (!isNaN(load)) { + html += "" + genlang(9, true) + ":" + createBar(load) + "\n"; + tree.push(cpucoreposition); + } + }); + if (cpucount === 0) { + html += "" + genlang(42, true) + "\n"; + tree.push(rootposition); + } + return html; +} + +function countCpu(xml) { + var cpucount = 0; + $("Hardware CPU CpuCore", xml).each(function getCpuCore(cpuCoreId) { + cpucount += 1; + }); + return cpucount; +} + +/** + * build rows for a treetable out of the hardwaredevices + * @param {jQuery} xml phpSysInfo-XML + * @param {String} type type of the hardware device + * @param {Array} tree array that holds the positions for treetable plugin + * @param {Number} rootposition position of the parent element + */ +function fillHWDevice(xml, type, tree, rootposition) { + var devicecount = 0, html = ""; + $("Hardware " + type + " Device", xml).each(function getPciDevice(deviceId) { + var name = "", count = 0; + devicecount += 1; + name = $(this).attr("Name"); + count = parseInt($(this).attr("Count"), 10); + if (!isNaN(count) && count > 1) { + name = "(" + count + "x) " + name; + } + html += "" + name + "\n"; + tree.push(rootposition); + }); + if (devicecount === 0) { + html += "" + genlang(42, true) + "\n"; + tree.push(rootposition); + } + return html; +} + +function countHWDevice(xml, type) { + var devicecount = 0; + $("Hardware " + type + " Device", xml).each(function getPciDevice(deviceId) { + devicecount += 1; + }); + return devicecount; +} + +/** + * (re)fill the hardware block with the values from the given xml + * @param {jQuery} xml phpSysInfo-XML + */ +function refreshHardware(xml) { + var html = "", tree = [], closed = [], index = 0, machine = ""; + $("#hardware").empty(); + html += "

" + genlang(10, false) + "

\n"; + html += " \n"; + html += " \n"; + + $("Hardware", xml).each(function getMachine(id) { + machine = $(this).attr("Name"); + }); + if ((machine !== undefined) && (machine != "")) { + html += " \n"; + html += "\n"; + tree.push(tree.push(0)); + } + + if (countCpu(xml)) { + html += " \n"; + html += fillCpu(xml, tree, tree.push(0), closed); + } + + if (countHWDevice(xml, 'PCI')) { + html += " \n"; + index = tree.push(0); + closed.push(index); + html += fillHWDevice(xml, 'PCI', tree, index); + } + + if (countHWDevice(xml, 'IDE')) { + html += " \n"; + index = tree.push(0); + closed.push(index); + html += fillHWDevice(xml, 'IDE', tree, index); + } + + if (countHWDevice(xml, 'SCSI')) { + html += " \n"; + index = tree.push(0); + closed.push(index); + html += fillHWDevice(xml, 'SCSI', tree, index); + } + + if (countHWDevice(xml, 'USB')) { + html += " \n"; + index = tree.push(0); + closed.push(index); + html += fillHWDevice(xml, 'USB', tree, index); + } + + if (countHWDevice(xml, 'TB')) { + html += " \n"; + index = tree.push(0); + closed.push(index); + html += fillHWDevice(xml, 'TB', tree, index); + } + + if (countHWDevice(xml, 'I2C')) { + html += " \n"; + index = tree.push(0); + closed.push(index); + html += fillHWDevice(xml, 'I2C', tree, index); + } + + html += " \n"; + html += "
" + genlang(107, false) + "
" + machine + "
" + genlang(11, false) + "
" + genlang(17, false) + "
" + genlang(18, false) + "
" + genlang(19, false) + "
" + genlang(20, false) + "
" + genlang(117, false) + "
" + genlang(118, false) + "
\n"; + $("#hardware").append(html); + + $("#HardwareTree").jqTreeTable(tree, { + openImg: "./gfx/treeTable/tv-collapsable.gif", + shutImg: "./gfx/treeTable/tv-expandable.gif", + leafImg: "./gfx/treeTable/tv-item.gif", + lastOpenImg: "./gfx/treeTable/tv-collapsable-last.gif", + lastShutImg: "./gfx/treeTable/tv-expandable-last.gif", + lastLeafImg: "./gfx/treeTable/tv-item-last.gif", + vertLineImg: "./gfx/treeTable/vertline.gif", + blankImg: "./gfx/treeTable/blank.gif", + collapse: closed, + column: 0, + striped: true, + highlight: false, + state: false + }); +} + +/** + *(re)fill the network block with the values from the given xml + * @param {jQuery} xml phpSysInfo-XML + */ +function refreshNetwork(xml) { + var tree = [], closed = [], html0= "", html1= "" ,html = "", isinfo = false; + $("#network").empty(); + + html0 += "

" + genlang(21, false) + "

\n"; + + html1 += " \n"; + html1 += " \n"; + html1 += " " + genlang(22, true) + "\n"; + html1 += " " + genlang(23, true) + "\n"; + html1 += " " + genlang(24, true) + "\n"; + html1 += " " + genlang(25, true) + "\n"; + html1 += " \n"; + html1 += " \n"; + + $("Network NetDevice", xml).each(function getDevice(id) { + var name = "", rx = 0, tx = 0, er = 0, dr = 0, info = "", networkindex = 0; + name = $(this).attr("Name"); + rx = parseInt($(this).attr("RxBytes"), 10); + tx = parseInt($(this).attr("TxBytes"), 10); + er = parseInt($(this).attr("Err"), 10); + dr = parseInt($(this).attr("Drops"), 10); + html +="" + name + "" + formatBytes(rx, xml) + "" + formatBytes(tx, xml) + "" + er.toString() + "/" + dr.toString() + ""; + + networkindex = tree.push(0); + + info = $(this).attr("Info"); + if ( (info !== undefined) && (info != "") ) { + var i = 0, infos = info.replace(/:/g, ":").split(";"); /* split long addresses */ + isinfo = true; + for(i = 0; i < infos.length; i++){ + html +="" + infos[i] + ""; + tree.push(networkindex); + } + if (!showNetworkInfosExpanded) { + closed.push(networkindex); + } + } + }); + html += "\n"; + html += "\n"; + if (isinfo) { + html0 += "\n"; + html1 += " \n"; + } else { + html0 += "
\n"; + html1 += " \n"; + } + $("#network").append(html0+html1+html); + + if (isinfo) $("#NetworkTree").jqTreeTable(tree, { + openImg: "./gfx/treeTable/tv-collapsable.gif", + shutImg: "./gfx/treeTable/tv-expandable.gif", + leafImg: "./gfx/treeTable/tv-item.gif", + lastOpenImg: "./gfx/treeTable/tv-collapsable-last.gif", + lastShutImg: "./gfx/treeTable/tv-expandable-last.gif", + lastLeafImg: "./gfx/treeTable/tv-item-last.gif", + vertLineImg: "./gfx/treeTable/vertline.gif", + blankImg: "./gfx/treeTable/blank.gif", + collapse: closed, + column: 0, + striped: true, + highlight: false, + state: false + }); +} + +/** + * (re)fill the memory block with the values from the given xml + * @param {jQuery} xml phpSysInfo-XML + */ +function refreshMemory(xml) { + var html = "", tree = [], closed = []; + + $("#memory").empty(); + html += "

" + genlang(27, false) + "

\n"; + html += "
\n"; + html += " \n"; + html += " \n"; + html += " \n"; + html += " \n"; + html += " \n"; + html += " \n"; + html += " \n"; + html += " \n"; + html += " \n"; + html += " \n"; + + $("Memory", xml).each(function getMemory(id) { + var free = 0, total = 0, used = 0, percent = 0, memoryindex = 0; + free = parseInt($(this).attr("Free"), 10); + used = parseInt($(this).attr("Used"), 10); + total = parseInt($(this).attr("Total"), 10); + percent = parseInt($(this).attr("Percent"), 10); + html += ""; + memoryindex = tree.push(0); + + $("Memory Details", xml).each(function getMemorydetails(id) { + var app = 0, appp = 0, buff = 0, buffp = 0, cached = 0, cachedp = 0; + app = parseInt($(this).attr("App"), 10); + appp = parseInt($(this).attr("AppPercent"), 10); + buff = parseInt($(this).attr("Buffers"), 10); + buffp = parseInt($(this).attr("BuffersPercent"), 10); + cached = parseInt($(this).attr("Cached"), 10); + cachedp = parseInt($(this).attr("CachedPercent"), 10); + if (!isNaN(app)) { + html += ""; + tree.push(memoryindex); + } + if (!isNaN(cached)) { + html += ""; + tree.push(memoryindex); + } + if (!isNaN(buff)) { + html += ""; + tree.push(memoryindex); + } + if (!isNaN(app) || !isNaN(buff) || !isNaN(cached)) { + if (!showMemoryInfosExpanded) { + closed.push(memoryindex); + } + } + }); + }); + $("Memory Swap", xml).each(function getSwap(id) { + var free = 0, total = 0, used = 0, percent = 0, swapindex = 0; + free = parseInt($(this).attr("Free"), 10); + used = parseInt($(this).attr("Used"), 10); + total = parseInt($(this).attr("Total"), 10); + percent = parseInt($(this).attr("Percent"), 10); + html += ""; + swapindex = tree.push(0); + + $("Memory Swap Mount", xml).each(function getDevices(id) { + var free = 0, total = 0, used = 0, percent = 0, mpoint = "", mpid = 0; + if (!showMemoryInfosExpanded) { + closed.push(swapindex); + } + free = parseInt($(this).attr("Free"), 10); + used = parseInt($(this).attr("Used"), 10); + total = parseInt($(this).attr("Total"), 10); + percent = parseInt($(this).attr("Percent"), 10); + mpid = parseInt($(this).attr("MountPointID"), 10); + mpoint = $(this).attr("MountPoint"); + + if (mpoint === undefined) { + mpoint = mpid; + } + + html += ""; + tree.push(swapindex); + }); + }); + + html += " \n"; + html += "
" + genlang(34, true) + "" + genlang(33, true) + "" + genlang(35, true) + "" + genlang(36, true) + "" + genlang(37, true) + "
" + genlang(28, false) + "" + createBar(percent) + "" + formatBytes(free, xml) + "" + formatBytes(used, xml) + "" + formatBytes(total, xml) + "
" + genlang(64, false) + "" + createBar(appp) + " " + formatBytes(app, xml) + " 
" + genlang(66, false) + "" + createBar(cachedp) + " " + formatBytes(cached, xml) + " 
" + genlang(65, false) + "" + createBar(buffp) + " " + formatBytes(buff, xml) + " 
" + genlang(29, false) + "" + createBar(percent) + "" + formatBytes(free, xml) + "" + formatBytes(used, xml) + "" + formatBytes(total, xml) + "
" + mpoint + "" + createBar(percent) + "" + formatBytes(free, xml) + "" + formatBytes(used, xml) + "" + formatBytes(total, xml) + "
\n"; + $("#memory").append(html); + + $("#MemoryTree").jqTreeTable(tree, { + openImg: "./gfx/treeTable/tv-collapsable.gif", + shutImg: "./gfx/treeTable/tv-expandable.gif", + leafImg: "./gfx/treeTable/tv-item.gif", + lastOpenImg: "./gfx/treeTable/tv-collapsable-last.gif", + lastShutImg: "./gfx/treeTable/tv-expandable-last.gif", + lastLeafImg: "./gfx/treeTable/tv-item-last.gif", + vertLineImg: "./gfx/treeTable/vertline.gif", + blankImg: "./gfx/treeTable/blank.gif", + collapse: closed, + column: 0, + striped: true, + highlight: false, + state: false + }); + +} + +/** + * (re)fill the filesystems block with the values from the given xml

+ * appends the filesystems (each in a row) to the filesystem table in the tbody
before the rows are inserted the entire + * tbody is cleared + * @param {jQuery} xml phpSysInfo-XML + */ +function refreshFilesystems(xml) { + var total_usage = 0, total_used = 0, total_free = 0, total_size = 0, threshold = 0; + + filesystemTable.fnClearTable(); + + $("Options", xml).each(function getThreshold(id) { + threshold = parseInt($(this).attr("threshold"), 10); + }); + + $("FileSystem Mount", xml).each(function getMount(mid) { + var mpoint = "", mpid = 0, type = "", name = "", free = 0, used = 0, size = 0, percent = 0, options = "", inodes = 0, inodes_text = "", options_text = ""; + mpid = parseInt($(this).attr("MountPointID"), 10); + type = $(this).attr("FSType"); + name = $(this).attr("Name"); + free = parseInt($(this).attr("Free"), 10); + used = parseInt($(this).attr("Used"), 10); + size = parseInt($(this).attr("Total"), 10); + percent = parseInt($(this).attr("Percent"), 10); + options = $(this).attr("MountOptions"); + inodes = parseInt($(this).attr("Inodes"), 10); + mpoint = $(this).attr("MountPoint"); + + if (mpoint === undefined) { + mpoint = mpid; + } + if (options !== undefined) { + options_text = "
(" + options + ")"; + } + if (!isNaN(inodes)) { + inodes_text = " (" + inodes.toString() + "%)"; + } + + if (!isNaN(threshold) && (percent >= threshold)) { + filesystemTable.fnAddData(["" + mpoint + "" + mpoint, "" + type + "" + type, "" + name + "" + name + options_text, "" + percent.toString() + "" + createBar(percent, "barwarn") + inodes_text, "" + free.toString() + "" + formatBytes(free, xml), "" + used.toString() + "" + formatBytes(used, xml), "" + size.toString() + "" + formatBytes(size, xml)]); + } else { + filesystemTable.fnAddData(["" + mpoint + "" + mpoint, "" + type + "" + type, "" + name + "" + name + options_text, "" + percent.toString() + "" + createBar(percent) + inodes_text, "" + free.toString() + "" + formatBytes(free, xml), "" + used.toString() + "" + formatBytes(used, xml), "" + size.toString() + "" + formatBytes(size, xml)]); + } + total_used += used; + total_free += free; + total_size += size; + total_usage = round((total_used / total_size) * 100, 2); + }); + + if (!isNaN(threshold) && (total_usage >= threshold)) { + $("#s_fs_total").html(createBar(total_usage, "barwarn")); + } else { + $("#s_fs_total").html(createBar(total_usage)); + } + $("#s_fs_tfree").html(formatBytes(total_free, xml)); + $("#s_fs_tused").html(formatBytes(total_used, xml)); + $("#s_fs_tsize").html(formatBytes(total_size, xml)); +} + +/** + * (re)fill the temperature block with the values from the given xml

+ * build the block content for the temperature block, this includes normal temperature information in the XML + * and also the HDDTemp information, if there are no information the entire table will be removed + * to avoid HTML warnings + * @param {jQuery} xml phpSysInfo-XML + */ +function refreshTemp(xml) { + var values = false; + $("#tempTable tbody").empty(); + $("MBInfo Temperature Item", xml).each(function getTemperatures(id) { + var label = "", value = "", limit = 0, _limit = "", event = ""; + label = $(this).attr("Label"); + value = $(this).attr("Value").replace(/\+/g, ""); + limit = ($(this).attr("Max") !== undefined) ? parseFloat($(this).attr("Max").replace(/\+/g, "")) : 'NaN'; + if (isFinite(limit)) + _limit = formatTemp(limit, xml); + event = $(this).attr("Event"); + if (event !== undefined) + label += " \"!\""; + $("#tempTable tbody").append("" + label + "" + formatTemp(value, xml) + "" + _limit + ""); + values = true; + }); + if (values) { + $("#temp").show(); + } + else { + $("#temp").remove(); + } +} + +/** + * (re)fill the voltage block with the values from the given xml

+ * build the voltage information into a separate block, if there is no voltage information available the + * entire table will be removed to avoid HTML warnings + * @param {jQuery} xml phpSysInfo-XML + */ +function refreshVoltage(xml) { + var values = false; + $("#voltageTable tbody").empty(); + $("MBInfo Voltage Item", xml).each(function getVoltages(id) { + var label = "", value = 0, max = 0, min = 0, _min = "", _max = "", event = ""; + label = $(this).attr("Label"); + value = parseFloat($(this).attr("Value")); + max = parseFloat($(this).attr("Max")); + if (isFinite(max)) + _max = round(max, 2) + " " + genlang(62, true); + min = parseFloat($(this).attr("Min")); + if (isFinite(min)) + _min = round(min, 2) + " " + genlang(62, true); + event = $(this).attr("Event"); + if (event !== undefined) + label += " \"!\""; + $("#voltageTable tbody").append("" + label + "" + round(value, 2) + " " + genlang(62, true) + "" + _min + "" + _max + ""); + values = true; + }); + if (values) { + $("#voltage").show(); + } + else { + $("#voltage").remove(); + } +} + +/** + * (re)fill the fan block with the values from the given xml

+ * build the fan information into a separate block, if there is no fan information available the + * entire table will be removed to avoid HTML warnings + * @param {jQuery} xml phpSysInfo-XML + */ +function refreshFan(xml) { + var values = false; + $("#fanTable tbody").empty(); + $("MBInfo Fans Item", xml).each(function getFans(id) { + var label = "", value = 0, min = 0, _min = "", event = ""; + label = $(this).attr("Label"); + value = parseFloat($(this).attr("Value")); + min = parseFloat($(this).attr("Min")); + if (isFinite(min)) + _min = round(min,0) + " " + genlang(63, true); + event = $(this).attr("Event"); + if (event !== undefined) + label += " \"!\""; + $("#fanTable tbody").append("" + label + "" + round(value,0) + " " + genlang(63, true) + "" + _min + ""); + values = true; + }); + if (values) { + $("#fan").show(); + } + else { + $("#fan").remove(); + } +} + +/** + * (re)fill the power block with the values from the given xml

+ * build the power information into a separate block, if there is no power information available the + * entire table will be removed to avoid HTML warnings + * @param {jQuery} xml phpSysInfo-XML + */ +function refreshPower(xml) { + var values = false; + $("#powerTable tbody").empty(); + $("MBInfo Power Item", xml).each(function getPowers(id) { + var label = "", value = "", limit = 0, _limit = "", event = ""; + label = $(this).attr("Label"); + value = $(this).attr("Value").replace(/\+/g, ""); + limit = ($(this).attr("Max") !== undefined) ? parseFloat($(this).attr("Max").replace(/\+/g, "")) : 'NaN'; + if (isFinite(limit)) + _limit = round(limit, 2) + " " + genlang(103, true); + event = $(this).attr("Event"); + if (event !== undefined) + label += " \"!\""; + $("#powerTable tbody").append("" + label + "" + round(value, 2) + " " + genlang(103, true) + "" + _limit + ""); + values = true; + }); + if (values) { + $("#power").show(); + } + else { + $("#power").remove(); + } +} + +/** + * (re)fill the current block with the values from the given xml

+ * build the current information into a separate block, if there is no current information available the + * entire table will be removed to avoid HTML warnings + * @param {jQuery} xml phpSysInfo-XML + */ +function refreshCurrent(xml) { + var values = false; + $("#currentTable tbody").empty(); + $("MBInfo Current Item", xml).each(function getCurrents(id) { + var label = "", value = "", limit = 0, _limit = "", event = ""; + label = $(this).attr("Label"); + value = $(this).attr("Value").replace(/\+/g, ""); + limit = ($(this).attr("Max") !== undefined) ? parseFloat($(this).attr("Max").replace(/\+/g, "")) : 'NaN'; + if (isFinite(limit)) + _limit = round(limit, 2) + " " + genlang(106, true); + event = $(this).attr("Event"); + if (event !== undefined) + label += " \"!\""; + $("#currentTable tbody").append("" + label + "" + round(value, 2) + " " + genlang(106, true) + "" + _limit + ""); + values = true; + }); + if (values) { + $("#current").show(); + } + else { + $("#current").remove(); + } +} + +/** + * (re)fill the ups block with the values from the given xml

+ * build the ups information into a separate block, if there is no ups information available the + * entire table will be removed to avoid HTML warnings + * @param {jQuery} xml phpSysInfo-XML + */ +function refreshUps(xml) { + var add_apcupsd_cgi_links = ($("[ApcupsdCgiLinks='1']", xml).length > 0); + var html = "", tree = [], closed = [], index = 0, values = false; + html += "

" + genlang(68, false) + "

\n"; + html += " \n"; + html += " \n"; + + $("#ups").empty(); + $("UPSInfo UPS", xml).each(function getUps(id) { + var name = "", model = "", mode = "", start_time = "", upsstatus = "", temperature = "", outages_count = "", last_outage = "", last_outage_finish = "", line_voltage = "", line_frequency = "", load_percent = "", battery_date = "", battery_voltage = "", battery_charge_percent = "", time_left_minutes = ""; + name = $(this).attr("Name"); + model = $(this).attr("Model"); + mode = $(this).attr("Mode"); + start_time = $(this).attr("StartTime"); + upsstatus = $(this).attr("Status"); + + temperature = $(this).attr("Temperature"); + outages_count = $(this).attr("OutagesCount"); + last_outage = $(this).attr("LastOutage"); + last_outage_finish = $(this).attr("LastOutageFinish"); + line_voltage = $(this).attr("LineVoltage"); + line_frequency = $(this).attr("LineFrequency"); + load_percent = parseInt($(this).attr("LoadPercent"), 10); + battery_date = $(this).attr("BatteryDate"); + battery_voltage = $(this).attr("BatteryVoltage"); + battery_charge_percent = parseInt($(this).attr("BatteryChargePercent"), 10); + time_left_minutes = $(this).attr("TimeLeftMinutes"); + + html += "\n"; + index = tree.push(0); + if (model !== undefined) { + html += "\n"; + tree.push(index); + } + if (start_time !== undefined) { + html += "\n"; + tree.push(index); + } + if (upsstatus !== undefined) { + html += "\n"; + tree.push(index); + } + if (temperature !== undefined) { + html += "\n"; + tree.push(index); + } + if (outages_count !== undefined) { + html += "\n"; + tree.push(index); + } + if (last_outage !== undefined) { + html += "\n"; + tree.push(index); + } + if (last_outage_finish !== undefined) { + html += "\n"; + tree.push(index); + } + if (line_voltage !== undefined) { + html += "\n"; + tree.push(index); + } + if (line_frequency !== undefined) { + html += "\n"; + tree.push(index); + } + if (!isNaN(load_percent)) { + html += "\n"; + tree.push(index); + } + if (battery_date !== undefined) { + html += "\n"; + tree.push(index); + } + if (battery_voltage !== undefined) { + html += "\n"; + tree.push(index); + } + if (!isNaN(battery_charge_percent)) { + html += "\n"; + tree.push(index); + } + if (time_left_minutes !== undefined) { + html += "\n"; + tree.push(index); + } + values=true; + }); + html += " \n"; + html += "
" + name + " (" + mode + ")
" + genlang(70, true) + "" + model + "
" + genlang(72, true) + "" + start_time + "
" + genlang(73, true) + "" + upsstatus + "
" + genlang(84, true) + "" + temperature + "
" + genlang(74, true) + "" + outages_count + "
" + genlang(75, true) + "" + last_outage + "
" + genlang(76, true) + "" + last_outage_finish + "
" + genlang(77, true) + "" + line_voltage + " " + genlang(82, true) + "
" + genlang(108, true) + "" + line_frequency + " " + genlang(109, true) + "
" + genlang(78, true) + "" + createBar(load_percent) + "
" + genlang(104, true) + "" + battery_date + "
" + genlang(79, true) + "" + battery_voltage + " " + genlang(82, true) + "
" + genlang(80, true) + "" + createBar(battery_charge_percent) + "
" + genlang(81, true) + "" + time_left_minutes + " " + genlang(83, true) + "
\n"; + if (add_apcupsd_cgi_links){ + html += " (" + genlang(99, false) + ")\n"; + } + + $("#ups").append(html); + + if (values) { + $("#UPSTree").jqTreeTable(tree, { + openImg: "./gfx/treeTable/tv-collapsable.gif", + shutImg: "./gfx/treeTable/tv-expandable.gif", + leafImg: "./gfx/treeTable/tv-item.gif", + lastOpenImg: "./gfx/treeTable/tv-collapsable-last.gif", + lastShutImg: "./gfx/treeTable/tv-expandable-last.gif", + lastLeafImg: "./gfx/treeTable/tv-item-last.gif", + vertLineImg: "./gfx/treeTable/vertline.gif", + blankImg: "./gfx/treeTable/blank.gif", + collapse: closed, + column: 0, + striped: true, + highlight: false, + state: false + }); + $("#ups").show(); + } + else { + $("#ups").remove(); + } +} + +/** + * reload the page, this means all values are refreshed, except the plugins + */ +function reload() { + $.ajax({ + url: 'xml.php', + dataType: 'xml', + error: function error() { + $.jGrowl("Error loading XML document!"); + }, + success: function buildblocks(xml) { + refreshVitals(xml); + refreshNetwork(xml); + refreshHardware(xml); + refreshMemory(xml); + refreshFilesystems(xml); + refreshVoltage(xml); + refreshFan(xml); + refreshTemp(xml); + refreshPower(xml); + refreshCurrent(xml); + refreshUps(xml); + + for (var i = 0; i < plugin_liste.length; i += 1) { + try { + //dynamic call + window[plugin_liste[i].toLowerCase() + '_request'](); + } + catch (err) { + } + } + + $('.stripeMe tr:nth-child(even)').addClass('even'); + langcounter = 1; + } + }); +} + +/** + * set a reload timer for the page + * @param {jQuery} xml phpSysInfo-XML + */ +function settimer(xml) { + $("Options", xml).each(function getRefreshTime(id) { + var options, refresh = ""; + options = $("Options", xml).get(id); + refresh = $(this).attr("refresh"); + if (refresh !== '0') { + $.timer(refresh, reload); + } + }); +} + +$(document).ready(function buildpage() { + var i = 0, cookie_template = null, cookie_language = null; + + showCPUListExpanded = $("#showCPUListExpanded").val().toString()==="true"; + showCPUInfoExpanded = $("#showCPUInfoExpanded").val().toString()==="true"; + showNetworkInfosExpanded = $("#showNetworkInfosExpanded").val().toString()==="true"; + showMemoryInfosExpanded = $("#showMemoryInfosExpanded").val().toString()==="true"; + + if ($("#language option").length < 2) { + current_language = $("#language").val().toString(); + changeLanguage(); + for (i = 0; i < plugin_liste.length; i += 1) { + changeLanguage(plugin_liste[i]); + } + } else { + cookie_language = readCookie("psi_language"); + if (cookie_language !== null) { + current_language = cookie_language; + $("#language").val(current_language); + } else { + current_language = $("#language").val().toString(); + } + changeLanguage(); + for (i = 0; i < plugin_liste.length; i += 1) { + changeLanguage(plugin_liste[i]); + } + $('#language').show(); + $('span[id=lang_045]').show(); + $("#language").change(function changeLang() { + var i = 0; + current_language = $("#language").val().toString(); + createCookie('psi_language', current_language, 365); + changeLanguage(); + for (i = 0; i < plugin_liste.length; i += 1) { + changeLanguage(plugin_liste[i]); + } + return false; + }); + } + if ($("#template option").length < 2) { + switchStyle($("#template").val().toString()); + } else { + cookie_template = readCookie("psi_template"); + if (cookie_template !== null) { + $("#template").val(cookie_template); + } + switchStyle($("#template").val().toString()); + $('#template').show(); + $('span[id=lang_044]').show(); + $("#template").change(function changeTemplate() { + switchStyle($("#template").val().toString()); + createCookie('psi_template', $("#template").val().toString(), 365); + return false; + }); + } + + filesystemtable(); + + $.ajax({ + url: 'xml.php', + dataType: 'xml', + error: function error() { + $.jGrowl("Error loading XML document!", { + sticky: true + }); + }, + success: function buildblocks(xml) { + populateErrors(xml); + + refreshVitals(xml); + refreshHardware(xml); + refreshNetwork(xml); + refreshMemory(xml); + refreshFilesystems(xml); + refreshTemp(xml); + refreshVoltage(xml); + refreshFan(xml); + refreshPower(xml); + refreshCurrent(xml); + refreshUps(xml); + + displayPage(xml); + settimer(xml); + + $('.stripeMe tr:nth-child(even)').addClass('even'); + langcounter = 1; + } + }); + + $("#errors").nyroModal(); +}); + +jQuery.fn.dataTableExt.oSort['span-string-asc'] = function sortStringAsc(a, b) { + var x = "", y = ""; + x = a.substring(a.indexOf(">") + 1, a.indexOf("") + 1, b.indexOf(" y) ? 1 : 0)); +}; + +jQuery.fn.dataTableExt.oSort['span-string-desc'] = function sortStringDesc(a, b) { + var x = "", y = ""; + x = a.substring(a.indexOf(">") + 1, a.indexOf("") + 1, b.indexOf(" y) ? -1 : 0)); +}; + +jQuery.fn.dataTableExt.oSort['span-number-asc'] = function sortNumberAsc(a, b) { + var x = 0, y = 0; + x = parseInt(a.substring(a.indexOf(">") + 1, a.indexOf("") + 1, b.indexOf(" y) ? 1 : 0)); +}; + +jQuery.fn.dataTableExt.oSort['span-number-desc'] = function sortNumberDesc(a, b) { + var x = 0, y = 0; + x = parseInt(a.substring(a.indexOf(">") + 1, a.indexOf("") + 1, b.indexOf(" y) ? -1 : 0)); +}; + +/** + * generate the block element for a specific plugin that is available + * @param {String} plugin name of the plugin + * @param {Number} translationid id of the translated headline in the plugin translation file + * @param {Boolean} reload controls if a reload button should be appended to the headline + * @return {String} HTML string which contains the full layout of the block + */ +function buildBlock(plugin, translationid, reload) { + var block = "", reloadpic = ""; + if (reload) { + reloadpic = "\"reload\" "; + } + block += "
\n"; + block += "

" + reloadpic + genlang(translationid, false, plugin) + "

\n"; + block += "
\n"; + return block; +} + +/** + * translate a plugin and add this plugin to the internal plugin-list, this is only needed once and shouldn't be called more than once + * @param {String} plugin name of the plugin that should be translated + */ +function plugin_translate(plugin) { + plugin_liste.pushIfNotExist(plugin); + changeLanguage(plugin); +} + +/** + * generate a formatted datetime string of the current datetime + * @return {String} formatted datetime string + */ +function datetime() { + var date, day = 0, month = 0, year = 0, hour = 0, minute = 0, days = "", months = "", years = "", hours = "", minutes = ""; + date = new Date(); + day = date.getDate(); + month = date.getMonth() + 1; + year = date.getFullYear(); + hour = date.getHours(); + minute = date.getMinutes(); + + // format values smaller that 10 with a leading 0 + days = (day < 10) ? "0" + day.toString() : day.toString(); + months = (month < 10) ? "0" + month.toString() : month.toString(); + years = (year < 1000) ? year.toString() : year.toString(); + minutes = (minute < 10) ? "0" + minute.toString() : minute.toString(); + hours = (hour < 10) ? "0" + hour.toString() : hour.toString(); + + return days + "." + months + "." + years + " - " + hours + ":" + minutes; +} + +Array.prototype.pushIfNotExist = function(val) { + if (typeof(val) == 'undefined' || val == '') { + return; + } + val = $.trim(val); + if ($.inArray(val, this) == -1) { + this.push(val); + } +}; + +/** + * insert dynamically a js script file into the website + * @param {String} name name of the script that should be included + */ +/* +function appendjs(name) { + var scrptE, hdEl; + scrptE = document.createElement("script"); + hdEl = document.getElementsByTagName("head")[0]; + scrptE.setAttribute("src", name); + scrptE.setAttribute("type", "text/javascript"); + hdEl.appendChild(scrptE); +} +*/ +/** + * insert dynamically a css file into the website + * @param {String} name name of the css file that should be included + */ +/* +function appendcss(name) { + var scrptE, hdEl; + scrptE = document.createElement("link"); + hdEl = document.getElementsByTagName("head")[0]; + scrptE.setAttribute("type", "text/css"); + scrptE.setAttribute("rel", "stylesheet"); + scrptE.setAttribute("href", name); + hdEl.appendChild(scrptE); +} +*/ diff --git a/sources/js/phpSysInfo/phpsysinfo_bootstrap.js b/sources/js/phpSysInfo/phpsysinfo_bootstrap.js new file mode 100644 index 0000000..dd934cf --- /dev/null +++ b/sources/js/phpSysInfo/phpsysinfo_bootstrap.js @@ -0,0 +1,1515 @@ +//var data_dbg; +/** + * load the given translation an translate the entire page

retrieving the translation is done through a + * ajax call + * @private + * @param {String} lang language for which the translation should be loaded + * @param {String} plugin if plugin is given, the plugin translation file will be read instead of the main translation file + * @param {String} plugname internal plugin name + * @return {jQuery} translation jQuery-Object + */ +var langxml = [], langcounter = 1, langarr = [], current_language = "", plugins = [], plugin_liste = [], + showCPUListExpanded, showCPUInfoExpanded, showNetworkInfosExpanded; + +/** + * Fix PNG loading on IE6 or below + */ +function PNGload(png) { + if (typeof(png.ifixpng)==='function') { //IE6 PNG fix + png.ifixpng('./gfx/blank.gif'); + } +} + +/** + * generate a cookie, if not exist, and add an entry to it

+ * inspired by http://www.quirksmode.org/js/cookies.html + * @param {String} name name that holds the value + * @param {String} value value that needs to be stored + * @param {Number} days how many days the entry should be valid in the cookie + */ +function createCookie(name, value, days) { + var date = new Date(), expires = ""; + if (days) { + date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000)); + if (typeof(date.toUTCString)==="function") { + expires = "; expires=" + date.toUTCString(); + } else { + //deprecated + expires = "; expires=" + date.toGMTString(); + } + } + else { + expires = ""; + } + document.cookie = name + "=" + value + expires + "; path=/"; +} + +/** + * read a value out of a cookie and return the value

+ * inspired by http://www.quirksmode.org/js/cookies.html + * @param {String} name name of the value that should be retrieved + * @return {String} + */ +function readCookie(name) { + var nameEQ = "", ca = [], c = ''; + nameEQ = name + "="; + ca = document.cookie.split(';'); + for (var i = 0; i < ca.length; i += 1) { + c = ca[i]; + while (c.charAt(0) === ' ') { + c = c.substring(1, c.length); + } + if (!c.indexOf(nameEQ)) { + return c.substring(nameEQ.length, c.length); + } + } + return null; +} + +/** + * activates a given style and disables the old one in the document + * @param {String} template template that should be activated + */ +function switchStyle(template) { + $('link[rel*=style][title]').each(function getTitle(i) { + if (this.getAttribute('title') === 'PSI_Template') { + this.setAttribute('href', 'templates/' + template + "_bootstrap.css"); + } + }); +} + +/** + * load the given translation an translate the entire page

retrieving the translation is done through a + * ajax call + * @private + * @param {String} plugin if plugin is given, the plugin translation file will be read instead of the main translation file + * @param {String} plugname internal plugin name + * @return {jQuery} translation jQuery-Object + */ +function getLanguage(plugin, plugname) { + var getLangUrl = ""; + if (current_language) { + getLangUrl = 'language/language.php?lang=' + current_language; + if (plugin) { + getLangUrl += "&plugin=" + plugin; + } + } + else { + getLangUrl = 'language/language.php'; + if (plugin) { + getLangUrl += "?plugin=" + plugin; + } + } + $.ajax({ + url: getLangUrl, + type: 'GET', + dataType: 'xml', + timeout: 100000, + async: false, + error: function error() { + $.jGrowl("Error loading language!"); + }, + success: function buildblocks(xml) { + var idexp; + langxml[plugname] = xml; + if (langarr[plugname] === undefined) { + langarr.push(plugname); + langarr[plugname] = []; + } + $("expression", langxml[plugname]).each(function langstore(id) { + idexp = $("expression", xml).get(id); + langarr[plugname][this.getAttribute('id')] = $("exp", idexp).text().toString().replace(/\//g, "/"); + }); + } + }); +} + +/** + * internal function to get a given translation out of the translation file + * @param {Number} langId id of the translation expression + * @param {String} [plugin] name of the plugin + * @return {String} translation string + */ +function getTranslationString(langId, plugin) { + var plugname = current_language + "_"; + if (plugin === undefined) { + plugname += "phpSysInfo"; + } + else { + plugname += plugin; + } + if (langxml[plugname] === undefined) { + langxml.push(plugname); + getLanguage(plugin, plugname); + } + return langarr[plugname][langId.toString()]; +} + +/** + * generate a span tag with an unique identifier to be html valid + * @param {Number} id translation id in the xml file + * @param {Boolean} generate generate lang_id in span tag or use given value + * @param {String} [plugin] name of the plugin for which the tag should be generated + * @return {String} string which contains generated span tag for translation string + */ +function genlang(id, generate, plugin) { + var html = "", idString = "", plugname = ""; + if (plugin === undefined) { + plugname = ""; + } + else { + plugname = plugin.toLowerCase(); + } + if (id < 100) { + if (id < 10) { + idString = "00" + id.toString(); + } + else { + idString = "0" + id.toString(); + } + } + else { + idString = id.toString(); + } + if (plugin) { + idString = "plugin_" + plugname + "_" + idString; + } + if (generate) { + html += ""; + langcounter += 1; + } + else { + html += ""; + } + html += getTranslationString(idString, plugin) + ""; + return html; +} + +/** + * translates all expressions based on the translation xml file
+ * translation expressions must be in the format <span id="lang???"></span>, where ??? is + * the number of the translated expression in the xml file

if a translated expression is not found in the xml + * file nothing would be translated, so the initial value which is inside the span tag is displayed + * @param {String} [plugin] name of the plugin + */ +function changeLanguage(plugin) { + var langId = "", langStr = ""; + $('span[id*=lang_]').each(function translate(i) { + langId = this.getAttribute('id').substring(5); + if (langId.indexOf('-') !== -1) { + langId = langId.substring(0, langId.indexOf('-')); //remove the unique identifier + } + langStr = getTranslationString(langId, plugin); + if (langStr !== undefined) { + if (langStr.length > 0) { + this.innerHTML = langStr; + } + } + }); +} + +function reload(initiate) { + $("#errorbutton").css("visibility", "hidden"); + $("#errors").empty(); + $.ajax({ + dataType: "json", + url: "xml.php?json", + error: function(jqXHR, status, thrownError) {; + if ((status === "parsererror") && (typeof(xmlDoc = $.parseXML(jqXHR.responseText)) === "object")) { + var errs = 0; + try { + $(xmlDoc).find("Error").each(function() { + $("#errors").append("
  • "+$(this)[0]["attributes"]["Function"].nodeValue+" - "+$(this)[0]["attributes"]["Message"].nodeValue.replace(/\n/g, "
    ")+"

  • "); + errs++; + }); + } + catch (err) { + } + if (errs > 0) { + $("#errorbutton").css("visibility", "visible"); + $("#output").show(); + } + } + }, + success: function (data) { +// console.log(data); +// data_dbg = data; + if ((initiate === true) && (data["Options"] !== undefined) && (data["Options"]["@attributes"] !== undefined) + && ((refrtime = data["Options"]["@attributes"]["refresh"]) !== undefined) && (refrtime !== "0")) { + setInterval(reload, refrtime); + } + renderErrors(data); + renderVitals(data); + renderHardware(data); + renderMemory(data); + renderFilesystem(data); + renderNetwork(data); + renderVoltage(data); + renderTemperature(data); + renderFans(data); + renderPower(data); + renderCurrent(data); + renderUPS(data); + changeLanguage(); + $("#select").show(); + $("#output").show(); + } + }); + + for (var i = 0; i < plugins.length; i++) { + plugin_request(plugins[i]); + if ($("#reload_"+plugins[i]).length > 0) { + $("#reload_"+plugins[i]).attr("title", "reload"); + } + + } + if (initiate === true) { + for (var i = 0; i < plugins.length; i++) { + if ($("#reload_"+plugins[i]).length > 0) { + $("#reload_"+plugins[i]).click(function() { + plugin_request(this.id.substring(7)); //cut "reload_" from name + $(this).attr("title", datetime()); + }); + } + } + } +} + +/** + * load the plugin json via ajax + */ +function plugin_request(pluginname) { + + $.ajax({ + dataType: "json", + url: "xml.php?plugin=" + pluginname + "&json", + pluginname: pluginname, + success: function (data) { + try { + // dynamic call + window['renderPlugin_' + this.pluginname](data); + changeLanguage(this.pluginname); + plugin_liste.pushIfNotExist(this.pluginname); + } + catch (err) { + } + renderErrors(data); + } + }); +} + +$(document).ready(function () { + var cookie_template = null, cookie_language = null, plugtmp = ""; + + $(document).ajaxStart(function () { + $("#loader").css("visibility", "visible"); + }); + $(document).ajaxStop(function () { + $("#loader").css("visibility", "hidden"); + }); + + sorttable.init(); + + $.getScript( "./js.php?name=bootstrap", function(data, status, jqxhr) { + + showCPUListExpanded = $("#showCPUListExpanded").val().toString()==="true"; + showCPUInfoExpanded = $("#showCPUInfoExpanded").val().toString()==="true"; + showNetworkInfosExpanded = $("#showNetworkInfosExpanded").val().toString()==="true"; + + plugtmp = $("#plugins").val().toString(); + if (plugtmp.length >0 ){ + plugins = plugtmp.split(','); + } + + if ($("#language option").length < 2) { + current_language = $("#language").val().toString(); +/* not visible any objects + changeLanguage(); +*/ +/* plugin_liste not initialized yet + for (var i = 0; i < plugin_liste.length; i += 1) { + changeLanguage(plugin_liste[i]); + } +*/ + } else { + cookie_language = readCookie("psi_language"); + if (cookie_language !== null) { + current_language = cookie_language; + $("#language").val(current_language); + } else { + current_language = $("#language").val().toString(); + } +/* not visible any objects + changeLanguage(); +*/ +/* plugin_liste not initialized yet + for (var i = 0; i < plugin_liste.length; i += 1) { + changeLanguage(plugin_liste[i]); + } +*/ + $('#language').show(); + $('span[id=lang_045]').show(); + $("#language").change(function changeLang() { + current_language = $("#language").val().toString(); + createCookie('psi_language', current_language, 365); + changeLanguage(); + for (var i = 0; i < plugin_liste.length; i++) { + changeLanguage(plugin_liste[i]); + } + return false; + }); + } + if ($("#template option").length < 2) { + switchStyle($("#template").val().toString()); + } else { + cookie_template = readCookie("psi_bootstrap_template"); + if (cookie_template !== null) { + $("#template").val(cookie_template); + } + switchStyle($("#template").val().toString()); + $('#template').show(); + $('span[id=lang_044]').show(); + $("#template").change(function changeTemplate() { + switchStyle($("#template").val().toString()); + createCookie('psi_bootstrap_template', $("#template").val().toString(), 365); + return false; + }); + } + + reload(true); + + $(".logo").click(function () { + reload(); + }); + }); +}); + +Array.prototype.push_attrs=function(element) { + for (var i = 0; i < element.length ; i++) { + this.push(element[i]["@attributes"]); + } + return i; +}; + +function items(data) { + if (data !== undefined) { + if ((data.length > 0) && (data[0] !== undefined) && (data[0]["@attributes"] !== undefined)) { + return data; + } else if (data["@attributes"] !== undefined ) { + return [data]; + } else { + return []; + } + } else { + return []; + } +} + +function renderVitals(data) { + var directives = { + Uptime: { + html: function () { + return formatUptime(this["Uptime"]); + } + }, + LastBoot: { + text: function () { + var lastboot; + var timestamp = 0; + if ((data["Generation"] !== undefined) && (data["Generation"]["@attributes"] !== undefined) && (data["Generation"]["@attributes"]["timestamp"] !== undefined) ) { + timestamp = parseInt(data["Generation"]["@attributes"]["timestamp"])*1000; //server time + if (isNaN(timestamp)) timestamp = Number(new Date()); //client time + } else { + timestamp = Number(new Date()); //client time + } + lastboot = new Date(timestamp - (parseInt(this["Uptime"])*1000)); + if (typeof(lastboot.toUTCString) === "function") { + return lastboot.toUTCString(); //toUTCstring() or toLocaleString() + } else { + //deprecated + return lastboot.toGMTString(); //toGMTString() or toLocaleString() + } + } + }, + Distro: { + html: function () { + return '' + " " +this["Distro"]; //onload IE6 PNG fix + } + }, + LoadAvg: { + html: function () { + if (this["CPULoad"] !== undefined) { + return '
    '+this["LoadAvg"] + '
    ' + + '
    ' + + '
    ' + round(this["CPULoad"],0) + '%
    '; + } else { + return this["LoadAvg"]; + } + } + }, + Processes: { + html: function () { + var processes = "", p111 = 0, p112 = 0, p113 = 0, p114 = 0, p115 = 0, p116 = 0; + var not_first = false; + processes = parseInt(this["Processes"]); + if (this["ProcessesRunning"] !== undefined) { + p111 = parseInt(this["ProcessesRunning"]); + } + if (this["ProcessesSleeping"] !== undefined) { + p112 = parseInt(this["ProcessesSleeping"]); + } + if (this["ProcessesStopped"] !== undefined) { + p113 = parseInt(this["ProcessesStopped"]); + } + if (this["ProcessesZombie"] !== undefined) { + p114 = parseInt(this["ProcessesZombie"]); + } + if (this["ProcessesWaiting"] !== undefined) { + p115 = parseInt(this["ProcessesWaiting"]); + } + if (this["ProcessesOther"] !== undefined) { + p116 = parseInt(this["ProcessesOther"]); + } + if (p111 || p112 || p113 || p114 || p115 || p116) { + processes += " ("; + for (var proc_type in {111:0,112:1,113:2,114:3,115:4,116:5}) { + if (eval("p" + proc_type)) { + if (not_first) { + processes += ", "; + } + processes += eval("p" + proc_type) + String.fromCharCode(160) + genlang(proc_type, false); + not_first = true; + } + } + processes += ")"; + } + return processes; + } + } + }; + + if (data["Vitals"]["@attributes"]["SysLang"] === undefined) { + $("#tr_SysLang").hide(); + } + if (data["Vitals"]["@attributes"]["CodePage"] === undefined) { + $("#tr_CodePage").hide(); + } + if (data["Vitals"]["@attributes"]["Processes"] === undefined) { + $("#tr_Processes").hide(); + } + $('#vitals').render(data["Vitals"]["@attributes"], directives); + $("#block_vitals").show(); +} + +function renderHardware(data) { + + var directives = { + Model: { + text: function () { + return this["Model"]; + } + }, + CpuSpeed: { + html: function () { + return formatHertz(this["CpuSpeed"]); + } + }, + CpuSpeedMax: { + html: function () { + return formatHertz(this["CpuSpeedMax"]); + } + }, + CpuSpeedMin: { + html: function () { + return formatHertz(this["CpuSpeedMin"]); + } + }, + Cache: { + html: function () { + return formatBytes(this["Cache"], data["Options"]["@attributes"]["byteFormat"]); + } + }, + BusSpeed: { + html: function () { + return formatHertz(this["BusSpeed"]); + } + }, + Cputemp: { + html: function () { + return formatTemp(this["Cputemp"], data["Options"]["@attributes"]["tempFormat"]); + } + }, + Bogomips: { + text: function () { + return parseInt(this["Bogomips"]); + } + }, + Load: { + html: function () { + return '
    ' + + '
    ' + + '
    ' + round(this["Load"],0) + '%
    '; + } + } + }; + + var hw_directives = { + hwName: { + text: function() { + return this["Name"]; + } + }, + hwCount: { + text: function() { + if (this["Count"] == "1") { + return ""; + } + return this["Count"]; + } + } + }; + + var html=""; + + if ((data["Hardware"]["@attributes"] !== undefined) && (data["Hardware"]["@attributes"]["Name"] !== undefined)) { + html+=""; + html+=""+genlang(107, false)+""; //Machine + html+=""; + html+=""; + html+=""; + } + + var paramlist = {CpuSpeed:13,CpuSpeedMax:100,CpuSpeedMin:101,Cache:15,Virt:94,BusSpeed:14,Bogomips:16,Cputemp:51,Load:9}; + try { + var datas = items(data["Hardware"]["CPU"]["CpuCore"]); + for (var i = 0; i < datas.length; i++) { + if (i == 0) { + html+=""; + html+="CPU"; + html+="" + genlang(119, false) + ":"; //Number of processors + html+=""; + html+=""; + } + html+=""; + html+=""; + html+=""; + html+=""; + html+=""; + for (var proc_param in paramlist) { + if (datas[i]["@attributes"][proc_param] !== undefined) { + html+=""; + html+=""; + html+="" + genlang(paramlist[proc_param], true) + ""; + html+=""; + html+=""; + } + } + + } + } + catch (err) { + $("#hardware-CPU").hide(); + } + + for (var hw_type in {PCI:0,IDE:1,SCSI:2,USB:3,TB:4,I2C:5}) { + try { + var datas = items(data["Hardware"][hw_type]["Device"]); + for (var i = 0; i < datas.length; i++) { + if (i == 0) { + html+=""; + html+="" + hw_type + ""; + html+="" + genlang('120', true) + ":"; //Number of devices + html+=""; + html+=""; + } + html+=""; + html+=""; + html+=""; + html+=""; + html+=""; + } + } + catch (err) { + $("#hardware-data"+hw_type).hide(); + } + } + $("#hardware-data").empty().append(html); + + + if ((data["Hardware"]["@attributes"] !== undefined) && (data["Hardware"]["@attributes"]["Name"] !== undefined)) { + $('#hardware-Machine').render(data["Hardware"]["@attributes"]); + } + + try { + var datas = items(data["Hardware"]["CPU"]["CpuCore"]); + for (var i = 0; i < datas.length; i++) { + $('#hardware-CPU-'+ i).render(datas[i]["@attributes"]); + for (var proc_param in paramlist) { + if (datas[i]["@attributes"][proc_param] !== undefined) { + $('#hardware-CPU-'+ i +'-'+proc_param).render(datas[i]["@attributes"], directives); + } + } + } + if (i > 0) { + $("#CPUCount").html(i); + } + } + catch (err) { + $("#hardware-CPU").hide(); + } + + for (var hw_type in {PCI:0,IDE:1,SCSI:2,USB:3,TB:4,I2C:5}) { + try { + var licz = 0; + var datas = items(data["Hardware"][hw_type]["Device"]); + for (var i = 0; i < datas.length; i++) { + $('#hardware-'+hw_type+'-'+ i).render(datas[i]["@attributes"], hw_directives); + if (datas[i]["@attributes"]["Count"] !== undefined) { + licz += parseInt(datas[i]["@attributes"]["Count"]); + } else { + licz++; + } + } + if (i > 0) { + $("#" + hw_type + "Count").html(licz); + } + } + catch (err) { + $("#hardware-"+hw_type).hide(); + } + } + $('#hardware').treegrid({ + initialState: 'collapsed', + expanderExpandedClass: 'normalicon normalicon-down', + expanderCollapsedClass: 'normalicon normalicon-right' + }); + if (showCPUListExpanded) { + try { + $('#hardware-CPU').treegrid('expand'); + } + catch (err) { + } + } + if (showCPUInfoExpanded && showCPUListExpanded) { + try { + var datas = items(data["Hardware"]["CPU"]["CpuCore"]); + for (var i = 0; i < datas.length; i++) { + $('#hardware-CPU-'+i).treegrid('expand'); + } + } + catch (err) { + } + } + $("#block_hardware").show(); +} + +function renderMemory(data) { + var directives = { + Total: { + html: function () { + return formatBytes(this["@attributes"]["Total"], data["Options"]["@attributes"]["byteFormat"]); + } + }, + Free: { + html: function () { + return formatBytes(this["@attributes"]["Free"], data["Options"]["@attributes"]["byteFormat"]); + } + }, + Used: { + html: function () { + return formatBytes(this["@attributes"]["Used"], data["Options"]["@attributes"]["byteFormat"]); + } + }, + Usage: { + html: function () { + if ((this["Details"] === undefined) || (this["Details"]["@attributes"] === undefined)) { + return '
    ' + + '
    ' + + '
    ' + this["@attributes"]["Percent"] + '%
    '; + } + else { + var rest = parseInt(this["@attributes"]["Percent"]); + var html = '
    '; + if ((this["Details"]["@attributes"]["AppPercent"] !== undefined) && (this["Details"]["@attributes"]["AppPercent"] > 0)) { + html += '
    '; + rest -= parseInt(this["Details"]["@attributes"]["AppPercent"]); + } + if ((this["Details"]["@attributes"]["CachedPercent"] !== undefined) && (this["Details"]["@attributes"]["CachedPercent"] > 0)) { + html += '
    '; + rest -= parseInt(this["Details"]["@attributes"]["CachedPercent"]); + } + if ((this["Details"]["@attributes"]["BuffersPercent"] !== undefined) && (this["Details"]["@attributes"]["BuffersPercent"] > 0)) { + html += '
    '; + rest -= parseInt(this["Details"]["@attributes"]["BuffersPercent"]); + } + if (rest > 0) { + html += '
    '; + } + html += '
    '; + html += '
    ' + 'Total: ' + this["@attributes"]["Percent"] + '% ' + '('; + var not_first = false; + if (this["Details"]["@attributes"]["AppPercent"] !== undefined) { + html += genlang(64, false) + ': '+ this["Details"]["@attributes"]["AppPercent"] + '%'; //Kernel + apps + not_first = true; + } + if (this["Details"]["@attributes"]["CachedPercent"] !== undefined) { + if (not_first) html += ' - '; + html += genlang(66, false) + ': ' + this["Details"]["@attributes"]["CachedPercent"] + '%'; //Cache + not_first = true; + } + if (this["Details"]["@attributes"]["BuffersPercent"] !== undefined) { + if (not_first) html += ' - '; + html += genlang(65, false) + ': ' + this["Details"]["@attributes"]["BuffersPercent"] + '%'; //Buffers + } + html += ')
    '; + return html; + } + } + }, + Type: { + html: function () { + return genlang(28, false); //Physical Memory + } + } + }; + + var directive_swap = { + Total: { + html: function () { + return formatBytes(this["Total"], data["Options"]["@attributes"]["byteFormat"]); + } + }, + Free: { + html: function () { + return formatBytes(this["Free"], data["Options"]["@attributes"]["byteFormat"]); + } + }, + Used: { + html: function () { + return formatBytes(this["Used"], data["Options"]["@attributes"]["byteFormat"]); + } + }, + Usage: { + html: function () { + return '
    ' + + '
    ' + + '
    ' + this["Percent"] + '%
    '; + } + }, + Name: { + html: function () { + return this['Name'] + '
    ' + ((this["MountPoint"] !== undefined) ? this["MountPoint"] : this["MountPointID"]); + } + } + }; + + var data_memory = []; + if (data["Memory"]["Swap"] !== undefined) { + var datas = items(data["Memory"]["Swap"]["Mount"]); + data_memory.push_attrs(datas); + $('#swap-data').render(data_memory, directive_swap); + $('#swap-data').show(); + } else { + $('#swap-data').hide(); + } + $('#memory-data').render(data["Memory"], directives); + $("#block_memory").show(); +} + +function renderFilesystem(data) { + var directives = { + Total: { + html: function () { + return formatBytes(this["Total"], data["Options"]["@attributes"]["byteFormat"]); + } + }, + Free: { + html: function () { + return formatBytes(this["Free"], data["Options"]["@attributes"]["byteFormat"]); + } + }, + Used: { + html: function () { + return formatBytes(this["Used"], data["Options"]["@attributes"]["byteFormat"]); + } + }, + MountPoint: { + text: function () { + return ((this["MountPoint"] !== undefined) ? this["MountPoint"] : this["MountPointID"]); + } + }, + Name: { + html: function () { + return this["Name"] + ((this["MountOptions"] !== undefined) ? '
    (' + this["MountOptions"] + ')' : ''); + } + }, + Percent: { + html: function () { + return '
    ' + '
    = parseInt(data["Options"]["@attributes"]["threshold"]))) ? 'progress-bar progress-bar-danger' : 'progress-bar progress-bar-info') + + '" style="width:' + this["Percent"] + '% ;">
    ' + + '
    ' + '
    ' + this["Percent"] + '% ' + ((this["Inodes"] !== undefined) ? '(' + this["Inodes"] + '%)' : '') + '
    '; + } + } + }; + + try { + var fs_data = []; + var datas = items(data["FileSystem"]["Mount"]); + var total = {Total:0,Free:0,Used:0}; + for (var i = 0; i < datas.length; i++) { + fs_data.push(datas[i]["@attributes"]); + total["Total"] += parseInt(datas[i]["@attributes"]["Total"]); + total["Free"] += parseInt(datas[i]["@attributes"]["Free"]); + total["Used"] += parseInt(datas[i]["@attributes"]["Used"]); + total["Percent"] = (total["Total"] !== 0) ? round((total["Used"] / total["Total"]) * 100, 2) : 0; + } + if (i > 0) { + $('#filesystem-data').render(fs_data, directives); + $('#filesystem-foot').render(total, directives); + $('#filesystem_MountPoint').removeClass("sorttable_sorted"); //reset sort order +// sorttable.innerSortFunction.apply(document.getElementById('filesystem_MountPoint'), []); + sorttable.innerSortFunction.apply($('#filesystem_MountPoint')[0], []); + $("#block_filesystem").show(); + } else { + $("#block_filesystem").hide(); + } + } + catch (err) { + $("#block_filesystem").hide(); + } +} + + +function renderNetwork(data) { + var directives = { + RxBytes: { + html: function () { + return formatBytes(this["RxBytes"], data["Options"]["@attributes"]["byteFormat"]); + } + }, + TxBytes: { + html: function () { + return formatBytes(this["TxBytes"], data["Options"]["@attributes"]["byteFormat"]); + } + }, + Drops: { + html: function () { + return this["Err"] + "/" + this["Drops"]; + } + } + }; + + var html = ""; + + try { + var network_data = []; + var datas = items(data["Network"]["NetDevice"]); + for (var i = 0; i < datas.length; i++) { + html+=""; + html+=""; + html+=""; + html+=""; + html+=""; + html+=""; + + var info = datas[i]["@attributes"]["Info"]; + if ( (info !== undefined) && (info !== "") ) { + var infos = info.replace(/:/g, ":").split(";"); /* split long addresses */ + for (var j = 0; j < infos.length; j++){ + html +="" + infos[j] + ""; + } + } + } + $("#network-data").empty().append(html); + if (i > 0) { + for (var i = 0; i < datas.length; i++) { + $('#network-' + i).render(datas[i]["@attributes"], directives); + } + $('#network').treegrid({ + initialState: showNetworkInfosExpanded?'expanded':'collapsed', + expanderExpandedClass: 'normalicon normalicon-down', + expanderCollapsedClass: 'normalicon normalicon-right' + }); + $("#block_network").show(); + } else { + $("#block_network").hide(); + } + } + catch (err) { + $("#block_network").hide(); + } +} + +function renderVoltage(data) { + var directives = { + Value: { + text: function () { + return this["Value"] + String.fromCharCode(160) + "V"; + } + }, + Min: { + text: function () { + if (this["Min"] !== undefined) + return this["Min"] + String.fromCharCode(160) + "V"; + } + }, + Max: { + text: function () { + if (this["Max"] !== undefined) + return this["Max"] + String.fromCharCode(160) + "V"; + } + }, + Label: { + html: function () { + if (this["Event"] === undefined) + return this["Label"]; + else + return this["Label"] + " \"!\""; + } + } + }; + try { + var voltage_data = []; + var datas = items(data["MBInfo"]["Voltage"]["Item"]); + if (voltage_data.push_attrs(datas) > 0) { + $('#voltage-data').render(voltage_data, directives); + $("#block_voltage").show(); + } else { + $("#block_voltage").hide(); + } + } + catch (err) { + $("#block_voltage").hide(); + } +} + +function renderTemperature(data) { + var directives = { + Value: { + html: function () { + return formatTemp(this["Value"], data["Options"]["@attributes"]["tempFormat"]); + } + }, + Max: { + html: function () { + if (this["Max"] !== undefined) + return formatTemp(this["Max"], data["Options"]["@attributes"]["tempFormat"]); + } + }, + Label: { + html: function () { + if (this["Event"] === undefined) + return this["Label"]; + else + return this["Label"] + " \"!\""; + } + } + }; + + try { + var temperature_data = []; + var datas = items(data["MBInfo"]["Temperature"]["Item"]); + if (temperature_data.push_attrs(datas) > 0) { + $('#temperature-data').render(temperature_data, directives); + $("#block_temperature").show(); + } else { + $("#block_temperature").hide(); + } + } + catch (err) { + $("#block_temperature").hide(); + } +} + +function renderFans(data) { + var directives = { + Value: { + html: function () { + return this["Value"] + String.fromCharCode(160) + genlang(63, true); //RPM + } + }, + Min: { + html: function () { + if (this["Min"] !== undefined) + return this["Min"] + String.fromCharCode(160) + genlang(63, true); //RPM + } + }, + Label: { + html: function () { + if (this["Event"] === undefined) + return this["Label"]; + else + return this["Label"] + " \"!\""; + } + } + }; + + try { + var fans_data = []; + var datas = items(data["MBInfo"]["Fans"]["Item"]); + if (fans_data.push_attrs(datas) > 0) { + $('#fans-data').render(fans_data, directives); + $("#block_fans").show(); + } else { + $("#block_fans").hide(); + } + } + catch (err) { + $("#block_fans").hide(); + } +} + +function renderPower(data) { + var directives = { + Value: { + text: function () { + return this["Value"] + String.fromCharCode(160) + "W"; + } + }, + Max: { + text: function () { + if (this["Max"] !== undefined) + return this["Max"] + String.fromCharCode(160) + "W"; + } + }, + Label: { + html: function () { + if (this["Event"] === undefined) + return this["Label"]; + else + return this["Label"] + " \"!\""; + } + } + }; + + try { + var power_data = []; + var datas = items(data["MBInfo"]["Power"]["Item"]); + if (power_data.push_attrs(datas) > 0) { + $('#power-data').render(power_data, directives); + $("#block_power").show(); + } else { + $("#block_power").hide(); + } + } + catch (err) { + $("#block_power").hide(); + } +} + +function renderCurrent(data) { + var directives = { + Value: { + text: function () { + return this["Value"] + String.fromCharCode(160) + "A"; + } + }, + Max: { + text: function () { + if (this["Max"] !== undefined) + return this["Max"] + String.fromCharCode(160) + "A"; + } + }, + Label: { + html: function () { + if (this["Event"] === undefined) + return this["Label"]; + else + return this["Label"] + " \"!\""; + } + } + }; + + try { + var current_data = []; + var datas = items(data["MBInfo"]["Current"]["Item"]); + if (current_data.push_attrs(datas) > 0) { + $('#current-data').render(current_data, directives); + $("#block_current").show(); + } else { + $("#block_current").hide(); + } + } + catch (err) { + $("#block_current").hide(); + } +} + +function renderUPS(data) { + + var directives = { + Name: { + text: function () { + return this["Name"] + ((this["Mode"] !== undefined) ? " (" + this["Mode"] + ")" : ""); + } + }, + LineVoltage: { + html: function () { + return this["LineVoltage"] + String.fromCharCode(160) + genlang(82, true); //V + } + }, + LineFrequency: { + html: function () { + return this["LineFrequency"] + String.fromCharCode(160) + genlang(109, true); //Hz + } + }, + BatteryVoltage: { + html: function () { + return this["BatteryVoltage"] + String.fromCharCode(160) + genlang(82, true);; //V + } + }, + TimeLeftMinutes: { + html: function () { + return this["TimeLeftMinutes"] + String.fromCharCode(160) + genlang(83, true); //minutes + } + }, + LoadPercent: { + html: function () { + return '
    ' + + '
    ' + + '
    ' + round(this["LoadPercent"],0) + '%
    '; + } + }, + BatteryChargePercent: { + html: function () { + return '
    ' + + '
    ' + + '
    ' + round(this["BatteryChargePercent"],0) + '%
    '; + } + } + }; + + if ((data["UPSInfo"] !== undefined) && (items(data["UPSInfo"]["UPS"]).length > 0)) { + var html=""; + var paramlist = {Model:70,StartTime:72,Status:73,Temperature:84,OutagesCount:74,LastOutage:75,LastOutageFinish:76,LineVoltage:77,LineFrequency:108,LoadPercent:78,BatteryDate:104,BatteryVoltage:79,BatteryChargePercent:80,TimeLeftMinutes:81}; + + try { + var datas = items(data["UPSInfo"]["UPS"]); + for (var i = 0; i < datas.length; i++) { + html+=""; + html+=""; + html+=""; + html+=""; + for (var proc_param in paramlist) { + if (datas[i]["@attributes"][proc_param] !== undefined) { + html+=""; + html+="" + genlang(paramlist[proc_param], true) + ""; + html+=""; + html+=""; + } + } + + } + } + catch (err) { + } + + if ((data["UPSInfo"]["@attributes"] !== undefined) && (data["UPSInfo"]["@attributes"]["ApcupsdCgiLinks"] === "1")) { + html+=""; + html+="(Details)"; + html+=""; + html+=""; + } + + $("#ups-data").empty().append(html); + + try { + var datas = items(data["UPSInfo"]["UPS"]); + for (var i = 0; i < datas.length; i++) { + $('#ups-'+ i).render(datas[i]["@attributes"], directives); + for (var proc_param in paramlist) { + if (datas[i]["@attributes"][proc_param] !== undefined) { + $('#ups-'+ i +'-'+proc_param).render(datas[i]["@attributes"], directives); + } + } + } + } + catch (err) { + } + + $('#ups').treegrid({ + initialState: 'expanded', + expanderExpandedClass: 'normalicon normalicon-down', + expanderCollapsedClass: 'normalicon normalicon-right' + }); + + $("#block_ups").show(); + } else { + $("#block_ups").hide(); + } +} + +function renderErrors(data) { + try { + var datas = items(data["Errors"]["Error"]); + for (var i = 0; i < datas.length; i++) { + $("#errors").append("
  • "+datas[i]["@attributes"]["Function"]+" - "+datas[i]["@attributes"]["Message"].replace(/\n/g, "
    ")+"

  • "); + } + if (i > 0) { + $("#errorbutton").css("visibility", "visible"); + } + } + catch (err) { + $("#errorbutton").css("visibility", "hidden"); + } +} + +/** + * format seconds to a better readable statement with days, hours and minutes + * @param {Number} sec seconds that should be formatted + * @return {String} html string with no breaking spaces and translation statemen +*/ +function formatUptime(sec) { + var txt = "", intMin = 0, intHours = 0, intDays = 0; + intMin = sec / 60; + intHours = intMin / 60; + intDays = Math.floor(intHours / 24); + intHours = Math.floor(intHours - (intDays * 24)); + intMin = Math.floor(intMin - (intDays * 60 * 24) - (intHours * 60)); + if (intDays) { + txt += intDays.toString() + String.fromCharCode(160) + genlang(48, false) + String.fromCharCode(160); //days + } + if (intHours) { + txt += intHours.toString() + String.fromCharCode(160) + genlang(49, false) + String.fromCharCode(160); //hours + } + return txt + intMin.toString() + String.fromCharCode(160) + genlang(50, false); //Minutes +} + +/** + * format a celcius temperature to fahrenheit and also append the right suffix + * @param {String} degreeC temperature in celvius + * @param {jQuery} xml phpSysInfo-XML + * @return {String} html string with no breaking spaces and translation statements + */ +function formatTemp(degreeC, tempFormat) { + var degree = 0; + if (tempFormat === undefined) { + tempFormat = "c"; + } + degree = parseFloat(degreeC); + if (isNaN(degreeC)) { + return "---"; + } + else { + switch (tempFormat.toLowerCase()) { + case "f": + return round((((9 * degree) / 5) + 32), 1) + String.fromCharCode(160) + genlang(61, true); + case "c": + return round(degree, 1) + String.fromCharCode(160) + genlang(60, true); + case "c-f": + return round(degree, 1) + String.fromCharCode(160) + genlang(60, true) + "
    (" + round((((9 * degree) / 5) + 32), 1) + String.fromCharCode(160) + genlang(61, true) + ")"; + case "f-c": + return round((((9 * degree) / 5) + 32), 1) + String.fromCharCode(160) + genlang(61, true) + "
    (" + round(degree, 1) + String.fromCharCode(160) + genlang(60, true) + ")"; + } + } +} + +/** + * format a given MHz value to a better readable statement with the right suffix + * @param {Number} mhertz mhertz value that should be formatted + * @return {String} html string with no breaking spaces and translation statements + */ +function formatHertz(mhertz) { + if (mhertz && mhertz < 1000) { + return mhertz.toString() + String.fromCharCode(160) + genlang(92, true); + } + else { + if (mhertz && mhertz >= 1000) { + return round(mhertz / 1000, 2) + String.fromCharCode(160) + genlang(93, true); + } + else { + return ""; + } + } +} + +/** + * format the byte values into a user friendly value with the corespondenting unit expression
    support is included + * for binary and decimal output
    user can specify a constant format for all byte outputs or the output is formated + * automatically so that every value can be read in a user friendly way + * @param {Number} bytes value that should be converted in the corespondenting format, which is specified in the phpsysinfo.ini + * @param {jQuery} xml phpSysInfo-XML + * @return {String} string of the converted bytes with the translated unit expression + */ +function formatBytes(bytes, byteFormat) { + var show = ""; + + if (byteFormat === undefined) { + byteFormat = "auto_binary"; + } + + switch (byteFormat.toLowerCase()) { + case "pib": + show += round(bytes / Math.pow(1024, 5), 2); + show += String.fromCharCode(160) + genlang(90, true); + break; + case "tib": + show += round(bytes / Math.pow(1024, 4), 2); + show += String.fromCharCode(160) + genlang(86, true); + break; + case "gib": + show += round(bytes / Math.pow(1024, 3), 2); + show += String.fromCharCode(160) + genlang(87, true); + break; + case "mib": + show += round(bytes / Math.pow(1024, 2), 2); + show += String.fromCharCode(160) + genlang(88, true); + break; + case "kib": + show += round(bytes / Math.pow(1024, 1), 2); + show += String.fromCharCode(160) + genlang(89, true); + break; + case "pb": + show += round(bytes / Math.pow(1000, 5), 2); + show += String.fromCharCode(160) + genlang(91, true); + break; + case "tb": + show += round(bytes / Math.pow(1000, 4), 2); + show += String.fromCharCode(160) + genlang(85, true); + break; + case "gb": + show += round(bytes / Math.pow(1000, 3), 2); + show += String.fromCharCode(160) + genlang(41, true); + break; + case "mb": + show += round(bytes / Math.pow(1000, 2), 2); + show += String.fromCharCode(160) + genlang(40, true); + break; + case "kb": + show += round(bytes / Math.pow(1000, 1), 2); + show += String.fromCharCode(160) + genlang(39, true); + break; + case "b": + show += bytes; + show += String.fromCharCode(160) + genlang(96, true); + break; + case "auto_decimal": + if (bytes > Math.pow(1000, 5)) { + show += round(bytes / Math.pow(1000, 5), 2); + show += String.fromCharCode(160) + genlang(91, true); + } + else { + if (bytes > Math.pow(1000, 4)) { + show += round(bytes / Math.pow(1000, 4), 2); + show += String.fromCharCode(160) + genlang(85, true); + } + else { + if (bytes > Math.pow(1000, 3)) { + show += round(bytes / Math.pow(1000, 3), 2); + show += String.fromCharCode(160) + genlang(41, true); + } + else { + if (bytes > Math.pow(1000, 2)) { + show += round(bytes / Math.pow(1000, 2), 2); + show += String.fromCharCode(160) + genlang(40, true); + } + else { + if (bytes > Math.pow(1000, 1)) { + show += round(bytes / Math.pow(1000, 1), 2); + show += String.fromCharCode(160) + genlang(39, true); + } + else { + show += bytes; + show += String.fromCharCode(160) + genlang(96, true); + } + } + } + } + } + break; + default: + if (bytes > Math.pow(1024, 5)) { + show += round(bytes / Math.pow(1024, 5), 2); + show += String.fromCharCode(160) + genlang(90, true); + } + else { + if (bytes > Math.pow(1024, 4)) { + show += round(bytes / Math.pow(1024, 4), 2); + show += String.fromCharCode(160) + genlang(86, true); + } + else { + if (bytes > Math.pow(1024, 3)) { + show += round(bytes / Math.pow(1024, 3), 2); + show += String.fromCharCode(160) + genlang(87, true); + } + else { + if (bytes > Math.pow(1024, 2)) { + show += round(bytes / Math.pow(1024, 2), 2); + show += String.fromCharCode(160) + genlang(88, true); + } + else { + if (bytes > Math.pow(1024, 1)) { + show += round(bytes / Math.pow(1024, 1), 2); + show += String.fromCharCode(160) + genlang(89, true); + } + else { + show += bytes; + show += String.fromCharCode(160) + genlang(96, true); + } + } + } + } + } + } + return show; +} + +Array.prototype.pushIfNotExist = function(val) { + if (typeof(val) == 'undefined' || val == '') { + return; + } + val = $.trim(val); + if ($.inArray(val, this) == -1) { + this.push(val); + } +}; + +/** + * generate a formatted datetime string of the current datetime + * @return {String} formatted datetime string + */ +function datetime() { + var date, day = 0, month = 0, year = 0, hour = 0, minute = 0, days = "", months = "", years = "", hours = "", minutes = ""; + date = new Date(); + day = date.getDate(); + month = date.getMonth() + 1; + year = date.getFullYear(); + hour = date.getHours(); + minute = date.getMinutes(); + + // format values smaller that 10 with a leading 0 + days = (day < 10) ? "0" + day.toString() : day.toString(); + months = (month < 10) ? "0" + month.toString() : month.toString(); + years = (year < 1000) ? year.toString() : year.toString(); + minutes = (minute < 10) ? "0" + minute.toString() : minute.toString(); + hours = (hour < 10) ? "0" + hour.toString() : hour.toString(); + + return days + "." + months + "." + years + " - " + hours + ":" + minutes; +} + +/** + * round a given value to the specified precision, difference to Math.round() is that there + * will be appended Zeros to the end if the precision is not reached (0.1 gets rounded to 0.100 when precision is set to 3) + * @param {Number} x value to round + * @param {Number} n precision + * @return {String} + */ +function round(x, n) { + var e = 0, k = ""; + if (n < 0 || n > 14) { + return 0; + } + if (n === 0) { + return Math.round(x); + } else { + e = Math.pow(10, n); + k = (Math.round(x * e) / e).toString(); + if (k.indexOf('.') === -1) { + k += '.'; + } + k += e.toString().substring(1); + return k.substring(0, k.indexOf('.') + n + 1); + } +} diff --git a/sources/js/vendor/README b/sources/js/vendor/README new file mode 100644 index 0000000..e65bc42 --- /dev/null +++ b/sources/js/vendor/README @@ -0,0 +1,44 @@ +versions, links and simple description of used jquery files +=========================================================== + +bootstrap.min.js +--------- +VERSION : 3.3.6 +URL : http://getbootstrap.com/ +DESC : Bootstrap is the most popular HTML, CSS, and JS framework for developing responsive, mobile first projects on the web +USED : used for the entire bootstrap userinterface + +transparency.js +--------- +VERSION : 0.10.0 +URL : http://leonidas.github.io/transparency/ +DESC : Transparency is a minimal template engine for jQuery. It maps JSON objects to DOM elements with zero configuration. Just call .render() +USED : used for the entire bootstrap userinterface + +html5shiv-printshiv.js +--------- +VERSION : 3.7.2 +URL : https://github.com/aFarkas/html5shiv/ +DESC : Enabling HTML5 Shiv Script and Print Support on old IE6-9 Browser Safari 4.x and Firefox 3.x +USED : used for the entire bootstrap userinterface + +console-shim.js +--------- +VERSION : +URL : https://github.com/liamnewmarch/console-shim/ +DESC : Shim to make browsers store console messages without Dev Tools open (e.g. IE9) +USED : used for the entire bootstrap userinterface + +sorttable.js +--------- +VERSION : 2+2014.12.25.12_fix-noinit +URL : http://www.kryogenix.org/code/browser/sorttable/ +DESC : Make all your tables sortable +USED : used for the entire bootstrap userinterface + +html5shiv-printshiv.js +--------- +VERSION : 1.4.2+accesserrorfix +URL : https://github.com/scottjehl/Respond/ +DESC : A fast & lightweight polyfill for min/max-width CSS3 Media Queries (for IE 6-8, and more) +USED : used for the entire bootstrap userinterface diff --git a/sources/js/vendor/bootstrap.min.js b/sources/js/vendor/bootstrap.min.js new file mode 100644 index 0000000..e79c065 --- /dev/null +++ b/sources/js/vendor/bootstrap.min.js @@ -0,0 +1,7 @@ +/*! + * Bootstrap v3.3.6 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under the MIT license + */ +if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1||b[0]>2)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher, but lower than version 3")}(jQuery),+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){return a(b.target).is(this)?b.handleObj.handler.apply(this,arguments):void 0}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.3.6",d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger("closed.bs.alert").remove()}var e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,""));var g=a(f);b&&b.preventDefault(),g.length||(g=e.closest(".alert")),g.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(g.removeClass("in"),a.support.transition&&g.hasClass("fade")?g.one("bsTransitionEnd",c).emulateTransitionEnd(d.TRANSITION_DURATION):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.3.6",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),setTimeout(a.proxy(function(){d[e](null==f[b]?this.options[b]:f[b]),"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")?(c.prop("checked")&&(a=!1),b.find(".active").removeClass("active"),this.$element.addClass("active")):"checkbox"==c.prop("type")&&(c.prop("checked")!==this.$element.hasClass("active")&&(a=!1),this.$element.toggleClass("active")),c.prop("checked",this.$element.hasClass("active")),a&&c.trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active")),this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target);d.hasClass("btn")||(d=d.closest(".btn")),b.call(d,"toggle"),a(c.target).is('input[type="radio"]')||a(c.target).is('input[type="checkbox"]')||c.preventDefault()}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(b){a(b.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(b.type))})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",a.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.3.6",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){if(!/input|textarea/i.test(a.target.tagName)){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()}},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c=this.getItemIndex(b),d="prev"==a&&0===c||"next"==a&&c==this.$items.length-1;if(d&&!this.options.wrap)return b;var e="prev"==a?-1:1,f=(c+e)%this.$items.length;return this.$items.eq(f)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(".item.active"));return a>this.$items.length-1||0>a?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){return this.sliding?void 0:this.slide("next")},c.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i=this;if(f.hasClass("active"))return this.sliding=!1;var j=f[0],k=a.Event("slide.bs.carousel",{relatedTarget:j,direction:h});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=a(this.$indicators.children()[this.getItemIndex(f)]);l&&l.addClass("active")}var m=a.Event("slid.bs.carousel",{relatedTarget:j,direction:h});return a.support.transition&&this.$element.hasClass("slide")?(f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(m)),g&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this};var e=function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}};a(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&/show|hide/.test(b)&&(f.toggle=!1),e||c.data("bs.collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a('[data-toggle="collapse"][href="#'+b.id+'"],[data-toggle="collapse"][data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.3.6",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(e&&e.length&&(b=e.data("bs.collapse"),b&&b.transitioning))){var f=a.Event("show.bs.collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,"hide"),b||e.data("bs.collapse",null));var g=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("collapsing").addClass("collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return h.call(this);var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Constructor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.collapse"),h=g?"toggle":e.data();c.call(f,h)})}(jQuery),+function(a){"use strict";function b(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function c(c){c&&3===c.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=b(d),f={relatedTarget:this};e.hasClass("open")&&(c&&"click"==c.type&&/input|textarea/i.test(c.target.tagName)&&a.contains(e[0],c.target)||(e.trigger(c=a.Event("hide.bs.dropdown",f)),c.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger(a.Event("hidden.bs.dropdown",f)))))}))}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.3.6",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=b(e),g=f.hasClass("open");if(c(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a(document.createElement("div")).addClass("dropdown-backdrop").insertAfter(a(this)).on("click",c);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;e.trigger("focus").attr("aria-expanded","true"),f.toggleClass("open").trigger(a.Event("shown.bs.dropdown",h))}return!1}},g.prototype.keydown=function(c){if(/(38|40|27|32)/.test(c.which)&&!/input|textarea/i.test(c.target.tagName)){var d=a(this);if(c.preventDefault(),c.stopPropagation(),!d.is(".disabled, :disabled")){var e=b(d),g=e.hasClass("open");if(!g&&27!=c.which||g&&27==c.which)return 27==c.which&&e.find(f).trigger("focus"),d.trigger("click");var h=" li:not(.disabled):visible a",i=e.find(".dropdown-menu"+h);if(i.length){var j=i.index(c.target);38==c.which&&j>0&&j--,40==c.which&&jdocument.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&a?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!a?this.scrollbarWidth:""})},c.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},c.prototype.checkScrollbar=function(){var a=window.innerWidth;if(!a){var b=document.documentElement.getBoundingClientRect();a=b.right-Math.abs(b.left)}this.bodyIsOverflowing=document.body.clientWidth
    ',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){if(this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(a.isFunction(this.options.viewport)?this.options.viewport.call(this,this.$element):this.options.viewport.selector||this.options.viewport),this.inState={click:!1,hover:!1,focus:!1},this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusin"==b.type?"focus":"hover"]=!0),c.tip().hasClass("in")||"in"==c.hoverState?void(c.hoverState="in"):(clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show())},c.prototype.isInStateTrue=function(){for(var a in this.inState)if(this.inState[a])return!0;return!1},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusout"==b.type?"focus":"hover"]=!1),c.isInStateTrue()?void 0:(clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide())},c.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var d=a.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!d)return;var e=this,f=this.tip(),g=this.getUID(this.type);this.setContent(),f.attr("id",g),this.$element.attr("aria-describedby",g),this.options.animation&&f.addClass("fade");var h="function"==typeof this.options.placement?this.options.placement.call(this,f[0],this.$element[0]):this.options.placement,i=/\s?auto?\s?/i,j=i.test(h);j&&(h=h.replace(i,"")||"top"),f.detach().css({top:0,left:0,display:"block"}).addClass(h).data("bs."+this.type,this),this.options.container?f.appendTo(this.options.container):f.insertAfter(this.$element),this.$element.trigger("inserted.bs."+this.type);var k=this.getPosition(),l=f[0].offsetWidth,m=f[0].offsetHeight;if(j){var n=h,o=this.getPosition(this.$viewport);h="bottom"==h&&k.bottom+m>o.bottom?"top":"top"==h&&k.top-mo.width?"left":"left"==h&&k.left-lg.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;jg.right&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){if(!this.$tip&&(this.$tip=a(this.options.template),1!=this.$tip.length))throw new Error(this.type+" `template` option must consist of exactly 1 top-level element!");return this.$tip},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data("bs."+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c))),b?(c.inState.click=!c.inState.click,c.isInStateTrue()?c.enter(c):c.leave(c)):c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){var a=this;clearTimeout(this.timeout),this.hide(function(){a.$element.off("."+a.type).removeData("bs."+a.type),a.$tip&&a.$tip.detach(),a.$tip=null,a.$arrow=null,a.$viewport=null})};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof b&&b;(e||!/destroy|hide/.test(b))&&(e||d.data("bs.popover",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");c.VERSION="3.3.6",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:''}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){"use strict";function b(c,d){this.$body=a(document.body),this.$scrollElement=a(a(c).is(document.body)?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",a.proxy(this.process,this)),this.refresh(),this.process()}function c(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})}b.VERSION="3.3.6",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b=this,c="offset",d=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),a.isWindow(this.$scrollElement[0])||(c="position",d=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var b=a(this),e=b.data("target")||b.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[c]().top+d,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){b.offsets.push(this[0]),b.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b=e[a]&&(void 0===e[a+1]||b .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),b.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),h?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu").length&&b.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),e&&e()}var g=d.find("> .active"),h=e&&a.support.transition&&(g.length&&g.hasClass("fade")||!!d.find("> .fade").length);g.length&&h?g.one("bsTransitionEnd",f).emulateTransitionEnd(c.TRANSITION_DURATION):f(),g.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this};var e=function(c){c.preventDefault(),b.call(a(this),"show")};a(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',e).on("click.bs.tab.data-api",'[data-toggle="pill"]',e)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.3.6",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getState=function(a,b,c,d){var e=this.$target.scrollTop(),f=this.$element.offset(),g=this.$target.height();if(null!=c&&"top"==this.affixed)return c>e?"top":!1;if("bottom"==this.affixed)return null!=c?e+this.unpin<=f.top?!1:"bottom":a-d>=e+g?!1:"bottom";var h=null==this.affixed,i=h?e:f.top,j=h?g:b;return null!=c&&c>=e?"top":null!=d&&i+j>=a-d?"bottom":!1},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=this.$element.height(),d=this.options.offset,e=d.top,f=d.bottom,g=Math.max(a(document).height(),a(document.body).height());"object"!=typeof d&&(f=e=d),"function"==typeof e&&(e=d.top(this.$element)),"function"==typeof f&&(f=d.bottom(this.$element));var h=this.getState(g,b,e,f);if(this.affixed!=h){null!=this.unpin&&this.$element.css("top","");var i="affix"+(h?"-"+h:""),j=a.Event(i+".bs.affix");if(this.$element.trigger(j),j.isDefaultPrevented())return;this.affixed=h,this.unpin="bottom"==h?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(i).trigger(i.replace("affix","affixed")+".bs.affix")}"bottom"==h&&this.$element.offset({top:g-b-f})}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},null!=d.offsetBottom&&(d.offset.bottom=d.offsetBottom),null!=d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery); \ No newline at end of file diff --git a/sources/js/vendor/console-shim.js b/sources/js/vendor/console-shim.js new file mode 100644 index 0000000..bd3d135 --- /dev/null +++ b/sources/js/vendor/console-shim.js @@ -0,0 +1,32 @@ +/* https://github.com/liamnewmarch/console-shim 2014 CC-BY @liamnewmarch */ +if (!('console' in window)) { + (function() { + var Console, __console; + Console = function() { + var check, key, log, methods, _i, _len, _ref; + this.__buffer = []; + log = function() { + return this.__buffer.push(arguments); + }; + methods = 'assert count debug dir dirxml error exception info log trace warn'; + _ref = methods.split(' '); + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + key = _ref[_i]; + this[key] = log; + } + check = setInterval(function() { + var data, func, _j, _len1, _ref1, _ref2; + if ((((_ref1 = window.console) != null ? _ref1.log : void 0) != null) && !console.__buffer) { + clearInterval(check); + func = Function.prototype.bind ? Function.prototype.bind.call(console.log, console) : console.log; + _ref2 = __console.__buffer; + for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) { + data = _ref2[_j]; + func.apply(console, data); + } + } + }, 1000); + }; + return __console = window.console = new Console(); + })(); +} diff --git a/sources/js/vendor/html5shiv-printshiv.js b/sources/js/vendor/html5shiv-printshiv.js new file mode 100644 index 0000000..c2913b5 --- /dev/null +++ b/sources/js/vendor/html5shiv-printshiv.js @@ -0,0 +1,520 @@ +/** +* @preserve HTML5 Shiv 3.7.2 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed +*/ +;(function(window, document) { +/*jshint evil:true */ + /** version */ + var version = '3.7.2'; + + /** Preset options */ + var options = window.html5 || {}; + + /** Used to skip problem elements */ + var reSkip = /^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i; + + /** Not all elements can be cloned in IE **/ + var saveClones = /^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i; + + /** Detect whether the browser supports default html5 styles */ + var supportsHtml5Styles; + + /** Name of the expando, to work with multiple documents or to re-shiv one document */ + var expando = '_html5shiv'; + + /** The id for the the documents expando */ + var expanID = 0; + + /** Cached data for each document */ + var expandoData = {}; + + /** Detect whether the browser supports unknown elements */ + var supportsUnknownElements; + + (function() { + try { + var a = document.createElement('a'); + a.innerHTML = ''; + //if the hidden property is implemented we can assume, that the browser supports basic HTML5 Styles + supportsHtml5Styles = ('hidden' in a); + + supportsUnknownElements = a.childNodes.length == 1 || (function() { + // assign a false positive if unable to shiv + (document.createElement)('a'); + var frag = document.createDocumentFragment(); + return ( + typeof frag.cloneNode == 'undefined' || + typeof frag.createDocumentFragment == 'undefined' || + typeof frag.createElement == 'undefined' + ); + }()); + } catch(e) { + // assign a false positive if detection fails => unable to shiv + supportsHtml5Styles = true; + supportsUnknownElements = true; + } + + }()); + + /*--------------------------------------------------------------------------*/ + + /** + * Creates a style sheet with the given CSS text and adds it to the document. + * @private + * @param {Document} ownerDocument The document. + * @param {String} cssText The CSS text. + * @returns {StyleSheet} The style element. + */ + function addStyleSheet(ownerDocument, cssText) { + var p = ownerDocument.createElement('p'), + parent = ownerDocument.getElementsByTagName('head')[0] || ownerDocument.documentElement; + + p.innerHTML = 'x'; + return parent.insertBefore(p.lastChild, parent.firstChild); + } + + /** + * Returns the value of `html5.elements` as an array. + * @private + * @returns {Array} An array of shived element node names. + */ + function getElements() { + var elements = html5.elements; + return typeof elements == 'string' ? elements.split(' ') : elements; + } + + /** + * Extends the built-in list of html5 elements + * @memberOf html5 + * @param {String|Array} newElements whitespace separated list or array of new element names to shiv + * @param {Document} ownerDocument The context document. + */ + function addElements(newElements, ownerDocument) { + var elements = html5.elements; + if(typeof elements != 'string'){ + elements = elements.join(' '); + } + if(typeof newElements != 'string'){ + newElements = newElements.join(' '); + } + html5.elements = elements +' '+ newElements; + shivDocument(ownerDocument); + } + + /** + * Returns the data associated to the given document + * @private + * @param {Document} ownerDocument The document. + * @returns {Object} An object of data. + */ + function getExpandoData(ownerDocument) { + var data = expandoData[ownerDocument[expando]]; + if (!data) { + data = {}; + expanID++; + ownerDocument[expando] = expanID; + expandoData[expanID] = data; + } + return data; + } + + /** + * returns a shived element for the given nodeName and document + * @memberOf html5 + * @param {String} nodeName name of the element + * @param {Document} ownerDocument The context document. + * @returns {Object} The shived element. + */ + function createElement(nodeName, ownerDocument, data){ + if (!ownerDocument) { + ownerDocument = document; + } + if(supportsUnknownElements){ + return ownerDocument.createElement(nodeName); + } + if (!data) { + data = getExpandoData(ownerDocument); + } + var node; + + if (data.cache[nodeName]) { + node = data.cache[nodeName].cloneNode(); + } else if (saveClones.test(nodeName)) { + node = (data.cache[nodeName] = data.createElem(nodeName)).cloneNode(); + } else { + node = data.createElem(nodeName); + } + + // Avoid adding some elements to fragments in IE < 9 because + // * Attributes like `name` or `type` cannot be set/changed once an element + // is inserted into a document/fragment + // * Link elements with `src` attributes that are inaccessible, as with + // a 403 response, will cause the tab/window to crash + // * Script elements appended to fragments will execute when their `src` + // or `text` property is set + return node.canHaveChildren && !reSkip.test(nodeName) && !node.tagUrn ? data.frag.appendChild(node) : node; + } + + /** + * returns a shived DocumentFragment for the given document + * @memberOf html5 + * @param {Document} ownerDocument The context document. + * @returns {Object} The shived DocumentFragment. + */ + function createDocumentFragment(ownerDocument, data){ + if (!ownerDocument) { + ownerDocument = document; + } + if(supportsUnknownElements){ + return ownerDocument.createDocumentFragment(); + } + data = data || getExpandoData(ownerDocument); + var clone = data.frag.cloneNode(), + i = 0, + elems = getElements(), + l = elems.length; + for(;i+~])(' + getElements().join('|') + ')(?=[[\\s,>+~#.:]|$)', 'gi'), + replacement = '$1' + shivNamespace + '\\:$2'; + + while (index--) { + pair = parts[index] = parts[index].split('}'); + pair[pair.length - 1] = pair[pair.length - 1].replace(reElements, replacement); + parts[index] = pair.join('}'); + } + return parts.join('{'); + } + + /** + * Removes the given wrappers, leaving the original elements. + * @private + * @params {Array} wrappers An array of printable wrappers. + */ + function removeWrappers(wrappers) { + var index = wrappers.length; + while (index--) { + wrappers[index].removeNode(); + } + } + + /*--------------------------------------------------------------------------*/ + + /** + * Shivs the given document for print. + * @memberOf html5 + * @param {Document} ownerDocument The document to shiv. + * @returns {Document} The shived document. + */ + function shivPrint(ownerDocument) { + var shivedSheet, + wrappers, + data = getExpandoData(ownerDocument), + namespaces = ownerDocument.namespaces, + ownerWindow = ownerDocument.parentWindow; + + if (!supportsShivableSheets || ownerDocument.printShived) { + return ownerDocument; + } + if (typeof namespaces[shivNamespace] == 'undefined') { + namespaces.add(shivNamespace); + } + + function removeSheet() { + clearTimeout(data._removeSheetTimer); + if (shivedSheet) { + shivedSheet.removeNode(true); + } + shivedSheet= null; + } + + ownerWindow.attachEvent('onbeforeprint', function() { + + removeSheet(); + + var imports, + length, + sheet, + collection = ownerDocument.styleSheets, + cssText = [], + index = collection.length, + sheets = Array(index); + + // convert styleSheets collection to an array + while (index--) { + sheets[index] = collection[index]; + } + // concat all style sheet CSS text + while ((sheet = sheets.pop())) { + // IE does not enforce a same origin policy for external style sheets... + // but has trouble with some dynamically created stylesheets + if (!sheet.disabled && reMedia.test(sheet.media)) { + + try { + imports = sheet.imports; + length = imports.length; + } catch(er){ + length = 0; + } + + for (index = 0; index < length; index++) { + sheets.push(imports[index]); + } + + try { + cssText.push(sheet.cssText); + } catch(er){} + } + } + + // wrap all HTML5 elements with printable elements and add the shived style sheet + cssText = shivCssText(cssText.reverse().join('')); + wrappers = addWrappers(ownerDocument); + shivedSheet = addStyleSheet(ownerDocument, cssText); + + }); + + ownerWindow.attachEvent('onafterprint', function() { + // remove wrappers, leaving the original elements, and remove the shived style sheet + removeWrappers(wrappers); + clearTimeout(data._removeSheetTimer); + data._removeSheetTimer = setTimeout(removeSheet, 500); + }); + + ownerDocument.printShived = true; + return ownerDocument; + } + + /*--------------------------------------------------------------------------*/ + + // expose API + html5.type += ' print'; + html5.shivPrint = shivPrint; + + // shiv for print + shivPrint(document); + +}(this, document)); diff --git a/sources/js/vendor/respond.js b/sources/js/vendor/respond.js new file mode 100644 index 0000000..2e94979 --- /dev/null +++ b/sources/js/vendor/respond.js @@ -0,0 +1,359 @@ +/* Respond.js: min/max-width media query polyfill. (c) Scott Jehl. MIT Lic. j.mp/respondjs */ +(function( w ){ + + "use strict"; + + //exposed namespace + var respond = {}; + w.respond = respond; + + //define update even in native-mq-supporting browsers, to avoid errors + respond.update = function(){}; + + //define ajax obj + var requestQueue = [], + xmlHttp = (function() { + var xmlhttpmethod = false; + try { + xmlhttpmethod = new w.XMLHttpRequest(); + } + catch( e ){ + xmlhttpmethod = new w.ActiveXObject( "Microsoft.XMLHTTP" ); + } + return function(){ + return xmlhttpmethod; + }; + })(), + + //tweaked Ajax functions from Quirksmode + ajax = function( url, callback ) { + var req = xmlHttp(); + if (!req){ + return; + } + + try { + req.open( "GET", url, true ); + + req.onreadystatechange = function () { + if ( req.readyState !== 4 || req.status !== 200 && req.status !== 304 ){ + return; + } + callback( req.responseText ); + }; + if ( req.readyState === 4 ){ + return; + } + req.send( null ); + } + catch ( e ) { + } + }, + isUnsupportedMediaQuery = function( query ) { + return query.replace( respond.regex.minmaxwh, '' ).match( respond.regex.other ); + }; + + //expose for testing + respond.ajax = ajax; + respond.queue = requestQueue; + respond.unsupportedmq = isUnsupportedMediaQuery; + respond.regex = { + media: /@media[^\{]+\{([^\{\}]*\{[^\}\{]*\})+/gi, + keyframes: /@(?:\-(?:o|moz|webkit)\-)?keyframes[^\{]+\{(?:[^\{\}]*\{[^\}\{]*\})+[^\}]*\}/gi, + comments: /\/\*[^*]*\*+([^/][^*]*\*+)*\//gi, + urls: /(url\()['"]?([^\/\)'"][^:\)'"]+)['"]?(\))/g, + findStyles: /@media *([^\{]+)\{([\S\s]+?)$/, + only: /(only\s+)?([a-zA-Z]+)\s?/, + minw: /\(\s*min\-width\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/, + maxw: /\(\s*max\-width\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/, + minmaxwh: /\(\s*m(in|ax)\-(height|width)\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/gi, + other: /\([^\)]*\)/g + }; + + //expose media query support flag for external use + respond.mediaQueriesSupported = w.matchMedia && w.matchMedia( "only all" ) !== null && w.matchMedia( "only all" ).matches; + + //if media queries are supported, exit here + if( respond.mediaQueriesSupported ){ + return; + } + + //define vars + var doc = w.document, + docElem = doc.documentElement, + mediastyles = [], + rules = [], + appendedEls = [], + parsedSheets = {}, + resizeThrottle = 30, + head = doc.getElementsByTagName( "head" )[0] || docElem, + base = doc.getElementsByTagName( "base" )[0], + links = head.getElementsByTagName( "link" ), + + lastCall, + resizeDefer, + + //cached container for 1em value, populated the first time it's needed + eminpx, + + // returns the value of 1em in pixels + getEmValue = function() { + var ret, + div = doc.createElement('div'), + body = doc.body, + originalHTMLFontSize = docElem.style.fontSize, + originalBodyFontSize = body && body.style.fontSize, + fakeUsed = false; + + div.style.cssText = "position:absolute;font-size:1em;width:1em"; + + if( !body ){ + body = fakeUsed = doc.createElement( "body" ); + body.style.background = "none"; + } + + // 1em in a media query is the value of the default font size of the browser + // reset docElem and body to ensure the correct value is returned + docElem.style.fontSize = "100%"; + body.style.fontSize = "100%"; + + body.appendChild( div ); + + if( fakeUsed ){ + docElem.insertBefore( body, docElem.firstChild ); + } + + ret = div.offsetWidth; + + if( fakeUsed ){ + docElem.removeChild( body ); + } + else { + body.removeChild( div ); + } + + // restore the original values + docElem.style.fontSize = originalHTMLFontSize; + if( originalBodyFontSize ) { + body.style.fontSize = originalBodyFontSize; + } + + + //also update eminpx before returning + ret = eminpx = parseFloat(ret); + + return ret; + }, + + //enable/disable styles + applyMedia = function( fromResize ){ + var name = "clientWidth", + docElemProp = docElem[ name ], + currWidth = doc.compatMode === "CSS1Compat" && docElemProp || doc.body[ name ] || docElemProp, + styleBlocks = {}, + lastLink = links[ links.length-1 ], + now = (new Date()).getTime(); + + //throttle resize calls + if( fromResize && lastCall && now - lastCall < resizeThrottle ){ + w.clearTimeout( resizeDefer ); + resizeDefer = w.setTimeout( applyMedia, resizeThrottle ); + return; + } + else { + lastCall = now; + } + + for( var i in mediastyles ){ + if( mediastyles.hasOwnProperty( i ) ){ + var thisstyle = mediastyles[ i ], + min = thisstyle.minw, + max = thisstyle.maxw, + minnull = min === null, + maxnull = max === null, + em = "em"; + + if( !!min ){ + min = parseFloat( min ) * ( min.indexOf( em ) > -1 ? ( eminpx || getEmValue() ) : 1 ); + } + if( !!max ){ + max = parseFloat( max ) * ( max.indexOf( em ) > -1 ? ( eminpx || getEmValue() ) : 1 ); + } + + // if there's no media query at all (the () part), or min or max is not null, and if either is present, they're true + if( !thisstyle.hasquery || ( !minnull || !maxnull ) && ( minnull || currWidth >= min ) && ( maxnull || currWidth <= max ) ){ + if( !styleBlocks[ thisstyle.media ] ){ + styleBlocks[ thisstyle.media ] = []; + } + styleBlocks[ thisstyle.media ].push( rules[ thisstyle.rules ] ); + } + } + } + + //remove any existing respond style element(s) + for( var j in appendedEls ){ + if( appendedEls.hasOwnProperty( j ) ){ + if( appendedEls[ j ] && appendedEls[ j ].parentNode === head ){ + head.removeChild( appendedEls[ j ] ); + } + } + } + appendedEls.length = 0; + + //inject active styles, grouped by media type + for( var k in styleBlocks ){ + if( styleBlocks.hasOwnProperty( k ) ){ + var ss = doc.createElement( "style" ), + css = styleBlocks[ k ].join( "\n" ); + + ss.type = "text/css"; + ss.media = k; + + //originally, ss was appended to a documentFragment and sheets were appended in bulk. + //this caused crashes in IE in a number of circumstances, such as when the HTML element had a bg image set, so appending beforehand seems best. Thanks to @dvelyk for the initial research on this one! + head.insertBefore( ss, lastLink.nextSibling ); + + if ( ss.styleSheet ){ + ss.styleSheet.cssText = css; + } + else { + ss.appendChild( doc.createTextNode( css ) ); + } + + //push to appendedEls to track for later removal + appendedEls.push( ss ); + } + } + }, + //find media blocks in css text, convert to style blocks + translate = function( styles, href, media ){ + var qs = styles.replace( respond.regex.comments, '' ) + .replace( respond.regex.keyframes, '' ) + .match( respond.regex.media ), + ql = qs && qs.length || 0; + + //try to get CSS path + href = href.substring( 0, href.lastIndexOf( "/" ) ); + + var repUrls = function( css ){ + return css.replace( respond.regex.urls, "$1" + href + "$2$3" ); + }, + useMedia = !ql && media; + + //if path exists, tack on trailing slash + if( href.length ){ href += "/"; } + + //if no internal queries exist, but media attr does, use that + //note: this currently lacks support for situations where a media attr is specified on a link AND + //its associated stylesheet has internal CSS media queries. + //In those cases, the media attribute will currently be ignored. + if( useMedia ){ + ql = 1; + } + + for( var i = 0; i < ql; i++ ){ + var fullq, thisq, eachq, eql; + + //media attr + if( useMedia ){ + fullq = media; + rules.push( repUrls( styles ) ); + } + //parse for styles + else{ + fullq = qs[ i ].match( respond.regex.findStyles ) && RegExp.$1; + rules.push( RegExp.$2 && repUrls( RegExp.$2 ) ); + } + + eachq = fullq.split( "," ); + eql = eachq.length; + + for( var j = 0; j < eql; j++ ){ + thisq = eachq[ j ]; + + if( isUnsupportedMediaQuery( thisq ) ) { + continue; + } + + mediastyles.push( { + media : thisq.split( "(" )[ 0 ].match( respond.regex.only ) && RegExp.$2 || "all", + rules : rules.length - 1, + hasquery : thisq.indexOf("(") > -1, + minw : thisq.match( respond.regex.minw ) && parseFloat( RegExp.$1 ) + ( RegExp.$2 || "" ), + maxw : thisq.match( respond.regex.maxw ) && parseFloat( RegExp.$1 ) + ( RegExp.$2 || "" ) + } ); + } + } + + applyMedia(); + }, + + //recurse through request queue, get css text + makeRequests = function(){ + if( requestQueue.length ){ + var thisRequest = requestQueue.shift(); + + ajax( thisRequest.href, function( styles ){ + translate( styles, thisRequest.href, thisRequest.media ); + parsedSheets[ thisRequest.href ] = true; + + // by wrapping recursive function call in setTimeout + // we prevent "Stack overflow" error in IE7 + w.setTimeout(function(){ makeRequests(); },0); + } ); + } + }, + + //loop stylesheets, send text content to translate + ripCSS = function(){ + + for( var i = 0; i < links.length; i++ ){ + var sheet = links[ i ], + href = sheet.href, + media = sheet.media, + isCSS = sheet.rel && sheet.rel.toLowerCase() === "stylesheet"; + + //only links plz and prevent re-parsing + if( !!href && isCSS && !parsedSheets[ href ] ){ + // selectivizr exposes css through the rawCssText expando + if (sheet.styleSheet && sheet.styleSheet.rawCssText) { + translate( sheet.styleSheet.rawCssText, href, media ); + parsedSheets[ href ] = true; + } else { + if( (!/^([a-zA-Z:]*\/\/)/.test( href ) && !base) || + href.replace( RegExp.$1, "" ).split( "/" )[0] === w.location.host ){ + // IE7 doesn't handle urls that start with '//' for ajax request + // manually add in the protocol + if ( href.substring(0,2) === "//" ) { href = w.location.protocol + href; } + requestQueue.push( { + href: href, + media: media + } ); + } + } + } + } + makeRequests(); + }; + + //translate CSS + ripCSS(); + + //expose update for re-running respond later on + respond.update = ripCSS; + + //expose getEmValue + respond.getEmValue = getEmValue; + + //adjust on resize + function callMedia(){ + applyMedia( true ); + } + + if( w.addEventListener ){ + w.addEventListener( "resize", callMedia, false ); + } + else if( w.attachEvent ){ + w.attachEvent( "onresize", callMedia ); + } +})(this); diff --git a/sources/js/vendor/sorttable.js b/sources/js/vendor/sorttable.js new file mode 100644 index 0000000..329bc79 --- /dev/null +++ b/sources/js/vendor/sorttable.js @@ -0,0 +1,466 @@ +/* + SortTable + version 2+2014.12.25_fix-noinit + 7th April 2007 + Stuart Langridge, http://www.kryogenix.org/code/browser/sorttable/ + + 25th December 2014 + Fixed behavior of multiple sortable tables in same page. + Redefinition of sortfwdind and sortrevind icons. + Mieczyslaw Nalewaj (namiltd@users.sourceforge.net) + + 19th November 20145 + Disabled autostart after loading. + You have to run sorttable.init() at the beginning of the code, + or makeSortable for each table. + Mieczyslaw Nalewaj (namiltd@users.sourceforge.net) + + Instructions: + Download this file + Add to your HTML + Add class="sortable" to any table you'd like to make sortable + Click on the headers to sort + + Thanks to many, many people for contributions and suggestions. + Licenced as X11: http://www.kryogenix.org/code/browser/licence.html + This basically means: do what you want with it. +*/ + + +sorttable = { + init: function() { + // quit if this function has already been called + if (arguments.callee.done) return; + // flag this function so we don't do the same thing twice + arguments.callee.done = true; + + if (!document.createElement || !document.getElementsByTagName) return; + + sorttable.DATE_RE = /^(\d\d?)[\/\.-](\d\d?)[\/\.-]((\d\d)?\d\d)$/; + + forEach(document.getElementsByTagName('table'), function(table) { + if (table.className.search(/\bsortable\b/) != -1) { + sorttable.makeSortable(table); + } + }); + + }, + + makeSortable: function(table) { + if (table.getElementsByTagName('thead').length == 0) { + // table doesn't have a tHead. Since it should have, create one and + // put the first table row in it. + the = document.createElement('thead'); + the.appendChild(table.rows[0]); + table.insertBefore(the,table.firstChild); + } + // Safari doesn't support table.tHead, sigh + if (table.tHead == null) table.tHead = table.getElementsByTagName('thead')[0]; + + if (table.tHead.rows.length != 1) return; // can't cope with two header rows + + // Sorttable v1 put rows with a class of "sortbottom" at the bottom (as + // "total" rows, for example). This is B&R, since what you're supposed + // to do is put them in a tfoot. So, if there are sortbottom rows, + // for backwards compatibility, move them to tfoot (creating it if needed). + sortbottomrows = []; + for (var i=0; i 12) { + // definitely dd/mm + return sorttable.sort_ddmm; + } else if (second > 12) { + return sorttable.sort_mmdd; + } else { + // looks like a date, but we can't tell which, so assume + // that it's dd/mm (English imperialism!) and keep looking + sortfn = sorttable.sort_ddmm; + } + } + } + } + return sortfn; + }, + + getInnerText: function(node) { + // gets the text we want to use for sorting for a cell. + // strips leading and trailing whitespace. + // this is *not* a generic getInnerText function; it's special to sorttable. + // for example, you can override the cell text with a customkey attribute. + // it also gets .value for fields. + + if (!node) return ""; + + hasInputs = (typeof node.getElementsByTagName == 'function') && + node.getElementsByTagName('input').length; + + if (node.getAttribute("sorttable_customkey") != null) { + return node.getAttribute("sorttable_customkey"); + } + else if (typeof node.textContent != 'undefined' && !hasInputs) { + return node.textContent.replace(/^\s+|\s+$/g, ''); + } + else if (typeof node.innerText != 'undefined' && !hasInputs) { + return node.innerText.replace(/^\s+|\s+$/g, ''); + } + else if (typeof node.text != 'undefined' && !hasInputs) { + return node.text.replace(/^\s+|\s+$/g, ''); + } + else { + switch (node.nodeType) { + case 3: + if (node.nodeName.toLowerCase() == 'input') { + return node.value.replace(/^\s+|\s+$/g, ''); + } + case 4: + return node.nodeValue.replace(/^\s+|\s+$/g, ''); + break; + case 1: + case 11: + var innerText = ''; + for (var i = 0; i < node.childNodes.length; i++) { + innerText += sorttable.getInnerText(node.childNodes[i]); + } + return innerText.replace(/^\s+|\s+$/g, ''); + break; + default: + return ''; + } + } + }, + + reverse: function(tbody) { + // reverse the rows in a tbody + newrows = []; + for (var i=0; i=0; i--) { + tbody.appendChild(newrows[i]); + } + delete newrows; + }, + + /* sort functions + each sort function takes two parameters, a and b + you are comparing a[0] and b[0] */ + sort_numeric: function(a,b) { + aa = parseFloat(a[0].replace(/[^0-9.-]/g,'')); + if (isNaN(aa)) aa = 0; + bb = parseFloat(b[0].replace(/[^0-9.-]/g,'')); + if (isNaN(bb)) bb = 0; + return aa-bb; + }, + sort_alpha: function(a,b) { + if (a[0]==b[0]) return 0; + if (a[0] 0 ) { + var q = list[i]; list[i] = list[i+1]; list[i+1] = q; + swap = true; + } + } // for + t--; + + if (!swap) break; + + for(var i = t; i > b; --i) { + if ( comp_func(list[i], list[i-1]) < 0 ) { + var q = list[i]; list[i] = list[i-1]; list[i-1] = q; + swap = true; + } + } // for + b++; + + } // while(swap) + } +}; + +// written by Dean Edwards, 2005 +// with input from Tino Zijdel, Matthias Miller, Diego Perini + +// http://dean.edwards.name/weblog/2005/10/add-event/ + +function dean_addEvent(element, type, handler) { + if (element.addEventListener) { + element.addEventListener(type, handler, false); + } else { + // assign each event handler a unique ID + if (!handler.$$guid) handler.$$guid = dean_addEvent.guid++; + // create a hash table of event types for the element + if (!element.events) element.events = {}; + // create a hash table of event handlers for each element/event pair + var handlers = element.events[type]; + if (!handlers) { + handlers = element.events[type] = {}; + // store the existing event handler (if there is one) + if (element["on" + type]) { + handlers[0] = element["on" + type]; + } + } + // store the event handler in the hash table + handlers[handler.$$guid] = handler; + // assign a global event handler to do all the work + element["on" + type] = handleEvent; + } +}; +// a counter used to create unique IDs +dean_addEvent.guid = 1; + +function removeEvent(element, type, handler) { + if (element.removeEventListener) { + element.removeEventListener(type, handler, false); + } else { + // delete the event handler from the hash table + if (element.events && element.events[type]) { + delete element.events[type][handler.$$guid]; + } + } +}; + +function handleEvent(event) { + var returnValue = true; + // grab the event object (IE uses a global event object) + event = event || fixEvent(((this.ownerDocument || this.document || this).parentWindow || window).event); + // get a reference to the hash table of event handlers + var handlers = this.events[event.type]; + // execute each event handler + for (var i in handlers) { + this.$$handleEvent = handlers[i]; + if (this.$$handleEvent(event) === false) { + returnValue = false; + } + } + return returnValue; +}; + +function fixEvent(event) { + // add W3C standard event methods + event.preventDefault = fixEvent.preventDefault; + event.stopPropagation = fixEvent.stopPropagation; + return event; +}; +fixEvent.preventDefault = function() { + this.returnValue = false; +}; +fixEvent.stopPropagation = function() { + this.cancelBubble = true; +}; + +// Dean's forEach: http://dean.edwards.name/base/forEach.js +/* + forEach, version 1.0 + Copyright 2006, Dean Edwards + License: http://www.opensource.org/licenses/mit-license.php +*/ + +// array-like enumeration +if (!Array.forEach) { // mozilla already supports this + Array.forEach = function(array, block, context) { + for (var i = 0; i < array.length; i++) { + block.call(context, array[i], i, array); + } + }; +} + +// generic enumeration +Function.prototype.forEach = function(object, block, context) { + for (var key in object) { + if (typeof this.prototype[key] == "undefined") { + block.call(context, object[key], key, object); + } + } +}; + +// character enumeration +String.forEach = function(string, block, context) { + Array.forEach(string.split(""), function(chr, index) { + block.call(context, chr, index, string); + }); +}; + +// globally resolve forEach enumeration +var forEach = function(object, block, context) { + if (object) { + var resolve = Object; // default + if (object instanceof Function) { + // functions have a "length" property + resolve = Function; + } else if (object.forEach instanceof Function) { + // the object implements a custom forEach method so use that + object.forEach(block, context); + return; + } else if (typeof object == "string") { + // the object is a string + resolve = String; + } else if (typeof object.length == "number") { + // the object is array-like + resolve = Array; + } + resolve.forEach(object, block, context); + } +}; diff --git a/sources/js/vendor/transparency.js b/sources/js/vendor/transparency.js new file mode 100644 index 0000000..476e128 --- /dev/null +++ b/sources/js/vendor/transparency.js @@ -0,0 +1,784 @@ +(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o= 0 || element.el.name === key || element.el.getAttribute('data-bind') === key; +}; + +Transparency.clone = function(node) { + return $(node).clone()[0]; +}; + +Transparency.jQueryPlugin = helpers.chainable(function(models, directives, options) { + var context, _i, _len, _results; + _results = []; + for (_i = 0, _len = this.length; _i < _len; _i++) { + context = this[_i]; + _results.push(Transparency.render(context, models, directives, options)); + } + return _results; +}); + +if ((typeof jQuery !== "undefined" && jQuery !== null) || (typeof Zepto !== "undefined" && Zepto !== null)) { + $ = jQuery || Zepto; + if ($ != null) { + $.fn.render = Transparency.jQueryPlugin; + } +} + +if (typeof module !== "undefined" && module !== null ? module.exports : void 0) { + module.exports = Transparency; +} + +if (typeof window !== "undefined" && window !== null) { + window.Transparency = Transparency; +} + +if (typeof define !== "undefined" && define !== null ? define.amd : void 0) { + define(function() { + return Transparency; + }); +} + +},{"../lib/lodash.js":7,"./context":3,"./helpers":5}],2:[function(require,module,exports){ +var Attribute, AttributeFactory, BooleanAttribute, Class, Html, Text, helpers, _, + __hasProp = {}.hasOwnProperty, + __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; + +_ = require('../lib/lodash'); + +helpers = require('./helpers'); + +module.exports = AttributeFactory = { + Attributes: {}, + createAttribute: function(element, name) { + var Attr; + Attr = AttributeFactory.Attributes[name] || Attribute; + return new Attr(element, name); + } +}; + +Attribute = (function() { + function Attribute(el, name) { + this.el = el; + this.name = name; + this.templateValue = this.el.getAttribute(this.name) || ''; + } + + Attribute.prototype.set = function(value) { + this.el[this.name] = value; + return this.el.setAttribute(this.name, value.toString()); + }; + + return Attribute; + +})(); + +BooleanAttribute = (function(_super) { + var BOOLEAN_ATTRIBUTES, name, _i, _len; + + __extends(BooleanAttribute, _super); + + BOOLEAN_ATTRIBUTES = ['hidden', 'async', 'defer', 'autofocus', 'formnovalidate', 'disabled', 'autofocus', 'formnovalidate', 'multiple', 'readonly', 'required', 'checked', 'scoped', 'reversed', 'selected', 'loop', 'muted', 'autoplay', 'controls', 'seamless', 'default', 'ismap', 'novalidate', 'open', 'typemustmatch', 'truespeed']; + + for (_i = 0, _len = BOOLEAN_ATTRIBUTES.length; _i < _len; _i++) { + name = BOOLEAN_ATTRIBUTES[_i]; + AttributeFactory.Attributes[name] = BooleanAttribute; + } + + function BooleanAttribute(el, name) { + this.el = el; + this.name = name; + this.templateValue = this.el.getAttribute(this.name) || false; + } + + BooleanAttribute.prototype.set = function(value) { + this.el[this.name] = value; + if (value) { + return this.el.setAttribute(this.name, this.name); + } else { + return this.el.removeAttribute(this.name); + } + }; + + return BooleanAttribute; + +})(Attribute); + +Text = (function(_super) { + __extends(Text, _super); + + AttributeFactory.Attributes['text'] = Text; + + function Text(el, name) { + var child; + this.el = el; + this.name = name; + this.templateValue = ((function() { + var _i, _len, _ref, _results; + _ref = this.el.childNodes; + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + child = _ref[_i]; + if (child.nodeType === helpers.TEXT_NODE) { + _results.push(child.nodeValue); + } + } + return _results; + }).call(this)).join(''); + this.children = _.toArray(this.el.children); + if (!(this.textNode = this.el.firstChild)) { + this.el.appendChild(this.textNode = this.el.ownerDocument.createTextNode('')); + } else if (this.textNode.nodeType !== helpers.TEXT_NODE) { + this.textNode = this.el.insertBefore(this.el.ownerDocument.createTextNode(''), this.textNode); + } + } + + Text.prototype.set = function(text) { + var child, _i, _len, _ref, _results; + while (child = this.el.firstChild) { + this.el.removeChild(child); + } + this.textNode.nodeValue = text; + this.el.appendChild(this.textNode); + _ref = this.children; + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + child = _ref[_i]; + _results.push(this.el.appendChild(child)); + } + return _results; + }; + + return Text; + +})(Attribute); + +Html = (function(_super) { + __extends(Html, _super); + + AttributeFactory.Attributes['html'] = Html; + + function Html(el) { + this.el = el; + this.templateValue = ''; + this.children = _.toArray(this.el.children); + } + + Html.prototype.set = function(html) { + var child, _i, _len, _ref, _results; + while (child = this.el.firstChild) { + this.el.removeChild(child); + } + this.el.innerHTML = html + this.templateValue; + _ref = this.children; + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + child = _ref[_i]; + _results.push(this.el.appendChild(child)); + } + return _results; + }; + + return Html; + +})(Attribute); + +Class = (function(_super) { + __extends(Class, _super); + + AttributeFactory.Attributes['class'] = Class; + + function Class(el) { + Class.__super__.constructor.call(this, el, 'class'); + } + + return Class; + +})(Attribute); + +},{"../lib/lodash":7,"./helpers":5}],3:[function(require,module,exports){ +var Context, Instance, after, before, chainable, cloneNode, _ref; + +_ref = require('./helpers'), before = _ref.before, after = _ref.after, chainable = _ref.chainable, cloneNode = _ref.cloneNode; + +Instance = require('./instance'); + +module.exports = Context = (function() { + var attach, detach; + + detach = chainable(function() { + this.parent = this.el.parentNode; + if (this.parent) { + this.nextSibling = this.el.nextSibling; + return this.parent.removeChild(this.el); + } + }); + + attach = chainable(function() { + if (this.parent) { + if (this.nextSibling) { + return this.parent.insertBefore(this.el, this.nextSibling); + } else { + return this.parent.appendChild(this.el); + } + } + }); + + function Context(el, Transparency) { + this.el = el; + this.Transparency = Transparency; + this.template = cloneNode(this.el); + this.instances = [new Instance(this.el, this.Transparency)]; + this.instanceCache = []; + } + + Context.prototype.render = before(detach)(after(attach)(chainable(function(models, directives, options) { + var children, index, instance, model, _i, _len, _results; + while (models.length < this.instances.length) { + this.instanceCache.push(this.instances.pop().remove()); + } + while (models.length > this.instances.length) { + instance = this.instanceCache.pop() || new Instance(cloneNode(this.template), this.Transparency); + this.instances.push(instance.appendTo(this.el)); + } + _results = []; + for (index = _i = 0, _len = models.length; _i < _len; index = ++_i) { + model = models[index]; + instance = this.instances[index]; + children = []; + _results.push(instance.prepare(model, children).renderValues(model, children).renderDirectives(model, index, directives).renderChildren(model, children, directives, options)); + } + return _results; + }))); + + return Context; + +})(); + +},{"./helpers":5,"./instance":6}],4:[function(require,module,exports){ +var AttributeFactory, Checkbox, Element, ElementFactory, Input, Radio, Select, TextArea, VoidElement, helpers, _, + __hasProp = {}.hasOwnProperty, + __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; + +_ = require('../lib/lodash.js'); + +helpers = require('./helpers'); + +AttributeFactory = require('./attributeFactory'); + +module.exports = ElementFactory = { + Elements: { + input: {} + }, + createElement: function(el) { + var El, name; + if ('input' === (name = el.nodeName.toLowerCase())) { + El = ElementFactory.Elements[name][el.type.toLowerCase()] || Input; + } else { + El = ElementFactory.Elements[name] || Element; + } + return new El(el); + } +}; + +Element = (function() { + function Element(el) { + this.el = el; + this.attributes = {}; + this.childNodes = _.toArray(this.el.childNodes); + this.nodeName = this.el.nodeName.toLowerCase(); + this.classNames = this.el.className.split(' '); + this.originalAttributes = {}; + } + + Element.prototype.empty = function() { + var child; + while (child = this.el.firstChild) { + this.el.removeChild(child); + } + return this; + }; + + Element.prototype.reset = function() { + var attribute, name, _ref, _results; + _ref = this.attributes; + _results = []; + for (name in _ref) { + attribute = _ref[name]; + _results.push(attribute.set(attribute.templateValue)); + } + return _results; + }; + + Element.prototype.render = function(value) { + return this.attr('text', value); + }; + + Element.prototype.attr = function(name, value) { + var attribute, _base; + attribute = (_base = this.attributes)[name] || (_base[name] = AttributeFactory.createAttribute(this.el, name, value)); + if (value != null) { + attribute.set(value); + } + return attribute; + }; + + Element.prototype.renderDirectives = function(model, index, attributes) { + var directive, name, value, _results; + _results = []; + for (name in attributes) { + if (!__hasProp.call(attributes, name)) continue; + directive = attributes[name]; + if (!(typeof directive === 'function')) { + continue; + } + value = directive.call(model, { + element: this.el, + index: index, + value: this.attr(name).templateValue + }); + if (value != null) { + _results.push(this.attr(name, value)); + } else { + _results.push(void 0); + } + } + return _results; + }; + + return Element; + +})(); + +Select = (function(_super) { + __extends(Select, _super); + + ElementFactory.Elements['select'] = Select; + + function Select(el) { + Select.__super__.constructor.call(this, el); + this.elements = helpers.getElements(el); + } + + Select.prototype.render = function(value) { + var option, _i, _len, _ref, _results; + value = value.toString(); + _ref = this.elements; + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + option = _ref[_i]; + if (option.nodeName === 'option') { + _results.push(option.attr('selected', option.el.value === value)); + } + } + return _results; + }; + + return Select; + +})(Element); + +VoidElement = (function(_super) { + var VOID_ELEMENTS, nodeName, _i, _len; + + __extends(VoidElement, _super); + + function VoidElement() { + return VoidElement.__super__.constructor.apply(this, arguments); + } + + VOID_ELEMENTS = ['area', 'base', 'br', 'col', 'command', 'embed', 'hr', 'img', 'input', 'keygen', 'link', 'meta', 'param', 'source', 'track', 'wbr']; + + for (_i = 0, _len = VOID_ELEMENTS.length; _i < _len; _i++) { + nodeName = VOID_ELEMENTS[_i]; + ElementFactory.Elements[nodeName] = VoidElement; + } + + VoidElement.prototype.attr = function(name, value) { + if (name !== 'text' && name !== 'html') { + return VoidElement.__super__.attr.call(this, name, value); + } + }; + + return VoidElement; + +})(Element); + +Input = (function(_super) { + __extends(Input, _super); + + function Input() { + return Input.__super__.constructor.apply(this, arguments); + } + + Input.prototype.render = function(value) { + return this.attr('value', value); + }; + + return Input; + +})(VoidElement); + +TextArea = (function(_super) { + __extends(TextArea, _super); + + function TextArea() { + return TextArea.__super__.constructor.apply(this, arguments); + } + + ElementFactory.Elements['textarea'] = TextArea; + + return TextArea; + +})(Input); + +Checkbox = (function(_super) { + __extends(Checkbox, _super); + + function Checkbox() { + return Checkbox.__super__.constructor.apply(this, arguments); + } + + ElementFactory.Elements['input']['checkbox'] = Checkbox; + + Checkbox.prototype.render = function(value) { + return this.attr('checked', Boolean(value)); + }; + + return Checkbox; + +})(Input); + +Radio = (function(_super) { + __extends(Radio, _super); + + function Radio() { + return Radio.__super__.constructor.apply(this, arguments); + } + + ElementFactory.Elements['input']['radio'] = Radio; + + return Radio; + +})(Checkbox); + +},{"../lib/lodash.js":7,"./attributeFactory":2,"./helpers":5}],5:[function(require,module,exports){ +var ElementFactory, expando, html5Clone, _getElements; + +ElementFactory = require('./elementFactory'); + +exports.before = function(decorator) { + return function(method) { + return function() { + decorator.apply(this, arguments); + return method.apply(this, arguments); + }; + }; +}; + +exports.after = function(decorator) { + return function(method) { + return function() { + method.apply(this, arguments); + return decorator.apply(this, arguments); + }; + }; +}; + +exports.chainable = exports.after(function() { + return this; +}); + +exports.onlyWith$ = function(fn) { + if ((typeof jQuery !== "undefined" && jQuery !== null) || (typeof Zepto !== "undefined" && Zepto !== null)) { + return (function($) { + return fn(arguments); + })(jQuery || Zepto); + } +}; + +exports.getElements = function(el) { + var elements; + elements = []; + _getElements(el, elements); + return elements; +}; + +_getElements = function(template, elements) { + var child, _results; + child = template.firstChild; + _results = []; + while (child) { + if (child.nodeType === exports.ELEMENT_NODE) { + elements.push(new ElementFactory.createElement(child)); + _getElements(child, elements); + } + _results.push(child = child.nextSibling); + } + return _results; +}; + +exports.ELEMENT_NODE = 1; + +exports.TEXT_NODE = 3; + +html5Clone = function() { + return document.createElement('nav').cloneNode(true).outerHTML !== '<:nav>'; +}; + +exports.cloneNode = (typeof document === "undefined" || document === null) || html5Clone() ? function(node) { + return node.cloneNode(true); +} : function(node) { + var cloned, element, _i, _len, _ref; + cloned = Transparency.clone(node); + if (cloned.nodeType === exports.ELEMENT_NODE) { + cloned.removeAttribute(expando); + _ref = cloned.getElementsByTagName('*'); + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + element = _ref[_i]; + element.removeAttribute(expando); + } + } + return cloned; +}; + +expando = 'transparency'; + +exports.data = function(element) { + return element[expando] || (element[expando] = {}); +}; + +exports.nullLogger = function() {}; + +exports.consoleLogger = function() { + return console.log(arguments); +}; + +exports.log = exports.nullLogger; + +},{"./elementFactory":4}],6:[function(require,module,exports){ +var Instance, chainable, helpers, _, + __hasProp = {}.hasOwnProperty; + +_ = require('../lib/lodash.js'); + +chainable = (helpers = require('./helpers')).chainable; + +module.exports = Instance = (function() { + function Instance(template, Transparency) { + this.Transparency = Transparency; + this.queryCache = {}; + this.childNodes = _.toArray(template.childNodes); + this.elements = helpers.getElements(template); + } + + Instance.prototype.remove = chainable(function() { + var node, _i, _len, _ref, _results; + _ref = this.childNodes; + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + node = _ref[_i]; + _results.push(node.parentNode.removeChild(node)); + } + return _results; + }); + + Instance.prototype.appendTo = chainable(function(parent) { + var node, _i, _len, _ref, _results; + _ref = this.childNodes; + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + node = _ref[_i]; + _results.push(parent.appendChild(node)); + } + return _results; + }); + + Instance.prototype.prepare = chainable(function(model) { + var element, _i, _len, _ref, _results; + _ref = this.elements; + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + element = _ref[_i]; + element.reset(); + _results.push(helpers.data(element.el).model = model); + } + return _results; + }); + + Instance.prototype.renderValues = chainable(function(model, children) { + var element, key, value, _results; + if (_.isElement(model) && (element = this.elements[0])) { + return element.empty().el.appendChild(model); + } else if (typeof model === 'object') { + _results = []; + for (key in model) { + if (!__hasProp.call(model, key)) continue; + value = model[key]; + if (value != null) { + if (_.isString(value) || _.isNumber(value) || _.isBoolean(value) || _.isDate(value)) { + _results.push((function() { + var _i, _len, _ref, _results1; + _ref = this.matchingElements(key); + _results1 = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + element = _ref[_i]; + _results1.push(element.render(value)); + } + return _results1; + }).call(this)); + } else if (typeof value === 'object') { + _results.push(children.push(key)); + } else { + _results.push(void 0); + } + } + } + return _results; + } + }); + + Instance.prototype.renderDirectives = chainable(function(model, index, directives) { + var attributes, element, key, _results; + _results = []; + for (key in directives) { + if (!__hasProp.call(directives, key)) continue; + attributes = directives[key]; + if (!(typeof attributes === 'object')) { + continue; + } + if (typeof model !== 'object') { + model = { + value: model + }; + } + _results.push((function() { + var _i, _len, _ref, _results1; + _ref = this.matchingElements(key); + _results1 = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + element = _ref[_i]; + _results1.push(element.renderDirectives(model, index, attributes)); + } + return _results1; + }).call(this)); + } + return _results; + }); + + Instance.prototype.renderChildren = chainable(function(model, children, directives, options) { + var element, key, _i, _len, _results; + _results = []; + for (_i = 0, _len = children.length; _i < _len; _i++) { + key = children[_i]; + _results.push((function() { + var _j, _len1, _ref, _results1; + _ref = this.matchingElements(key); + _results1 = []; + for (_j = 0, _len1 = _ref.length; _j < _len1; _j++) { + element = _ref[_j]; + _results1.push(this.Transparency.render(element.el, model[key], directives[key], options)); + } + return _results1; + }).call(this)); + } + return _results; + }); + + Instance.prototype.matchingElements = function(key) { + var el, elements, _base; + elements = (_base = this.queryCache)[key] || (_base[key] = (function() { + var _i, _len, _ref, _results; + _ref = this.elements; + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + el = _ref[_i]; + if (this.Transparency.matcher(el, key)) { + _results.push(el); + } + } + return _results; + }).call(this)); + helpers.log("Matching elements for '" + key + "':", elements); + return elements; + }; + + return Instance; + +})(); + +},{"../lib/lodash.js":7,"./helpers":5}],7:[function(require,module,exports){ + var _ = {}; + +_.toString = Object.prototype.toString; + +_.toArray = function(obj) { + var arr = new Array(obj.length); + for (var i = 0; i < obj.length; i++) { + arr[i] = obj[i]; + } + return arr; +}; + +_.isString = function(obj) { return _.toString.call(obj) == '[object String]'; }; + +_.isNumber = function(obj) { return _.toString.call(obj) == '[object Number]'; }; + +_.isArray = Array.isArray || function(obj) { + return _.toString.call(obj) === '[object Array]'; +}; + +_.isDate = function(obj) { + return _.toString.call(obj) === '[object Date]'; +}; + +_.isElement = function(obj) { + return !!(obj && obj.nodeType === 1); +}; + +_.isPlainValue = function(obj) { + var type; + type = typeof obj; + return (type !== 'object' && type !== 'function') || exports.isDate(obj); +}; + +_.isBoolean = function(obj) { + return obj === true || obj === false; +}; + +module.exports = _; + +},{}]},{},[1]); diff --git a/sources/language/ast.xml b/sources/language/ast.xml new file mode 100644 index 0000000..bad07c1 --- /dev/null +++ b/sources/language/ast.xml @@ -0,0 +1,369 @@ + + + + + + Información del sistema + + + Vitales del sistema + + + Nome del sirvidor + + + Direiciones IP + + + Versión del nucléu + + + Nome de la distribución + + + Tiempu operativu + + + Usuarios anguaño + + + Medies d'usu + + + Información del hardware + + + Procesadores + + + Modelu + + + Velocidá de la CPU + + + Velocidá de BUS + + + Tamamñu de la caché + + + Sistema Bogomips + + + Dispositivos PCI + + + Dispositivos IDE + + + Dispositivos SCSI + + + Dispositivios USB + + + Usu de la rede + + + Dispositivu + + + Recibíos + + + Unvios + + + Fallos/Perdes + + + Conexones de rede feches + + + Usu de la memoria + + + Memoria física + + + Memoria de volcáu + + + Sistemes de ficheros montaos + + + Puntu de monstaxe + + + Partición + + + Usu + + + Tipu + + + Llibre + + + Usáu + + + Tamañu + + + Total + + + kB + + + MB + + + GB + + + nengún + + + Capacidá + + + Plantía + + + Llingua + + + Unviar + + + Fechu con + + + díes + + + hores + + + minutos + + + Temperatura + + + Voltaxe + + + Ventiladoes + + + Valor + + + Min + + + Max + + + Causes + + + Llimite + + + Etiqueta + + + C + + + F + + + V + + + RPM + + + Nucléu y aplicaciones + + + Buffers + + + En caché + + + Saltar a + + + Información UPS + + + Nome + + + Modelu + + + Modu + + + Entamó + + + Estáu + + + Cortes + + + Causa del útlimu corte + + + Fin del últimu corte + + + Voltaxe de la llinia + + + Carga en porcentaxe + + + Voltaxe de la batería + + + Carga de la batería + + + Tiempu restante de les bateríes + + + V + + + minutos + + + Temperatura + + + TB + + + TiB + + + GiB + + + MiB + + + KiB + + + PiB + + + PB + + + MHz + + + GHz + + + Virtualization + + + Last boot + + + B + + + System Language + + + Code Page + + + Details + + + CPU Speed Max + + + CPU Speed Min + + + Power + + + W + + + Battery date + + + Current + + + A + + + Machine + + + Line frequency + + + Hz + + + Processes + + + running + + + sleeping + + + stopped + + + zombie + + + waiting + + + other + + + Dispositivios TB + + + Dispositivios I2C + + + Number of processors + + + Number of devices + + diff --git a/sources/language/bg.xml b/sources/language/bg.xml new file mode 100644 index 0000000..571e4aa --- /dev/null +++ b/sources/language/bg.xml @@ -0,0 +1,369 @@ + + + + + + СиÑтемна Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ + + + Обща Ð¸Ð½Ñ„Ð¾Ñ€Ð°Ð¼Ñ†Ð¸Ñ + + + Име на ÑиÑтемата + + + IP Ð°Ð´Ñ€ÐµÑ + + + ВерÑÐ¸Ñ Ð½Ð° Ñдрото + + + Име на диÑтрибуциÑта + + + Време на работа + + + Ðктивни потребители + + + Средно натоварване + + + УÑтановен хардуер + + + ПроцеÑори + + + Модел + + + ЧеÑтота на CPU + + + ЧеÑтота на BUS + + + Размер на кешa + + + Bogomips за ÑиÑтемата + + + PCI уÑтройÑтва + + + IDE уÑтройÑтва + + + SCSI уÑтройÑтва + + + USB уÑтройÑтва + + + ПолзваемоÑÑ‚ на мрежите + + + УÑтройÑтво + + + Получени + + + Изпратени + + + Грешки/ИзпуÑнати + + + УÑтановени мрежови връзки + + + ПолзваемоÑÑ‚ на оперативната памет + + + ФизичеÑка памет + + + Swap диÑк + + + Монтирани файлови ÑиÑтеми + + + Монтирана + + + ДÑл + + + Процент на използване + + + Тип + + + Свободни + + + Използвани + + + Общ обем + + + Ð’Ñичко + + + kB + + + MB + + + GB + + + нÑма + + + Капацитет + + + Тема + + + Език + + + Изпрати + + + Генерирано от + + + дена + + + чаÑа + + + минути + + + Температура + + + Ðапрежение + + + Вентилатори + + + СтойноÑÑ‚ + + + Мин + + + ÐœÐ°ÐºÑ + + + ХиÑÑ‚ÐµÑ€ÐµÐ·Ð¸Ñ + + + Предел + + + Име + + + C + + + F + + + V + + + Об/мин + + + Ядро + Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ + + + Буфери + + + Кеширани + + + Отиди на + + + Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° UPS + + + Име + + + Модел + + + Режим + + + Време на включване + + + СъÑтоÑние + + + ПрехвърлÑÐ½Ð¸Ñ ÐºÑŠÐ¼ Ð±Ð°Ñ‚ÐµÑ€Ð¸Ñ + + + Причина за поÑледното прехвърлÑне + + + Време на поÑледното прехвърлÑне + + + Ðапрежение на линиÑта + + + Процент на натовареноÑÑ‚ + + + Ðапрежение на батериÑта + + + ЗарÑд на батериÑта + + + ОÑтаващо време на батериÑта + + + V + + + минути + + + Температура + + + TB + + + TiB + + + GiB + + + MiB + + + KiB + + + PiB + + + PB + + + MHz + + + GHz + + + Virtualization + + + Last boot + + + B + + + System Language + + + Code Page + + + Details + + + CPU Speed Max + + + CPU Speed Min + + + Power + + + W + + + Battery date + + + Current + + + A + + + Machine + + + Line frequency + + + Hz + + + Processes + + + running + + + sleeping + + + stopped + + + zombie + + + waiting + + + other + + + TB уÑтройÑтва + + + I2C уÑтройÑтва + + + Number of processors + + + Number of devices + + diff --git a/sources/language/ca.xml b/sources/language/ca.xml new file mode 100644 index 0000000..8152d43 --- /dev/null +++ b/sources/language/ca.xml @@ -0,0 +1,369 @@ + + + + + + Informació del Servidor + + + Vitals + + + Nom del Servidor + + + Direccions IP + + + Versió del Kernel + + + Nom Distribució + + + Temps en actiu + + + Usuaris actuales + + + Mitjana d'ús + + + Informació del Hardware + + + Procesadors + + + Model + + + Velocitat CPU + + + Velocitat BUS + + + Mida memòria CAU + + + Sistema Bogomips + + + Dispositius PCI + + + Dispositius IDE + + + Dispositius SCSI + + + Dispositius USB + + + Ús de la xarxa + + + Dispositius + + + Rebuts + + + Enviats + + + Err/Perduts + + + Connexions de Xarxa Establertes + + + Ús de la memòria + + + Memòria Física + + + Disc Swap + + + Sistema d'arxius Muntats + + + Punt de muntatge + + + Partició + + + Ús + + + Tipus + + + Lliure + + + Usada + + + Mida + + + Total + + + kB + + + MB + + + GB + + + cap + + + Mida + + + Plantilla + + + Llenguatge + + + Enviat + + + Creat per + + + dies + + + hores + + + minuts + + + Temperatura + + + Voltaje + + + Ventiladors + + + Valor + + + Mín + + + Màx + + + Histèresi + + + Límit + + + Etiqueta + + + C + + + F + + + V + + + RPM + + + Kernel + aplicacions + + + Buffers + + + Memòria cau + + + Saltar a + + + Informació UPS + + + Nom + + + Model + + + Mode + + + Iniciat + + + Estat + + + Interrupcions + + + Causa última interrupció + + + Temps última interrupció + + + Voltatge de la línia + + + Percentatge carregat + + + Voltatge bateria + + + Càrrega de la bateria + + + Vida restant de les bateries + + + V + + + minuts + + + Temperatura + + + TB + + + TiB + + + GiB + + + MiB + + + KiB + + + PiB + + + PB + + + MHz + + + GHz + + + Virtualització + + + Darrera arrencada + + + B + + + Idioma del Sistema + + + Pàgina de Codi + + + Detalls + + + CPU Velocitat Màx + + + CPU Velocitat Mín + + + Energia + + + W + + + Data de la bateria + + + Actual + + + A + + + Màquina + + + Línia de freqüència + + + Hz + + + Processos + + + corrent + + + reposant + + + aturat + + + zombi + + + esperant + + + altre + + + Dispositius TB + + + Dispositius I2C + + + Number of processors + + + Number of devices + + diff --git a/sources/language/cz.xml b/sources/language/cz.xml new file mode 100644 index 0000000..446e12f --- /dev/null +++ b/sources/language/cz.xml @@ -0,0 +1,369 @@ + + + + + + Informace o systému + + + Základní informace + + + Kanonické jméno hostitele + + + Poslouchající IP + + + Verze jádra + + + Název distribuce + + + ÄŒas od spuÅ¡tÄ›ní + + + PÅ™ihlášení uživatelé + + + PrůmÄ›rné zatížení + + + Informace o hardware + + + Procesory + + + Model + + + Rychlost procesoru + + + Rychlost sbÄ›rnice + + + Velikost cache + + + Bogomipsy systému + + + PCI zařízení + + + IDE zařízení + + + SCSI zařízení + + + USB zařízení + + + Využití sítÄ› + + + Zařízení + + + PÅ™ijaté + + + Odeslané + + + Chyby/Zahozené + + + Navázaná síťová spojení + + + Využití pamÄ›ti + + + Fyzická paměť + + + Odkládací prostor na disku (Swap) + + + PÅ™ipojené souborové systémy + + + Přípojný bod + + + Oddíl + + + Využití + + + Typ + + + Volné + + + Použité + + + Velikost + + + Celkem + + + kB + + + MB + + + GB + + + nic + + + Kapacita + + + Téma vzhledu + + + Jazyk + + + Odeslat + + + VytvoÅ™eno s + + + dní + + + hodin + + + minut + + + Teplota + + + NapÄ›tí + + + Ventilátory + + + Hodnota + + + Min + + + Max + + + Hystereze + + + Limit + + + Název + + + C + + + F + + + V + + + RPM + + + Jádro + aplikace + + + Zásobníky + + + Mezipaměť + + + SkoÄ na + + + Záložní zdroj + + + Název + + + Model + + + Režim + + + ÄŒas od spuÅ¡tÄ›ní + + + Stav + + + Výpadky + + + Důvod posledního výpadku + + + ÄŒas posledního výpadku + + + Vstupní napÄ›tí + + + Aktuální zátížení + + + NapÄ›tí na baterii + + + Stav nabití + + + Zbývající záložní Äas + + + V + + + minuty + + + Teplota + + + TB + + + TiB + + + GiB + + + MiB + + + KiB + + + PiB + + + PB + + + MHz + + + GHz + + + Virtualizace + + + Poslední spuÅ¡tÄ›ní + + + B + + + System Language + + + Code Page + + + Details + + + CPU Speed Max + + + CPU Speed Min + + + Power + + + W + + + Battery date + + + Current + + + A + + + Machine + + + Line frequency + + + Hz + + + Processes + + + running + + + sleeping + + + stopped + + + zombie + + + waiting + + + other + + + TB zařízení + + + I2C zařízení + + + Number of processors + + + Number of devices + + diff --git a/sources/language/da.xml b/sources/language/da.xml new file mode 100644 index 0000000..098fb1e --- /dev/null +++ b/sources/language/da.xml @@ -0,0 +1,369 @@ + + + + + + Systeminformation + + + Systemdetaljer + + + Værtsnavn + + + IP-adresse + + + Kernelversion + + + Distribution + + + Oppetid + + + Antal brugere + + + Last gennemsnit + + + Hardwareinformation + + + Processorer + + + Model + + + CPU frekvens + + + BUS frekvens + + + Cachestørrelse + + + System Bogomips + + + PCI enheder + + + IDE enheder + + + SCSI enheder + + + USB enheder + + + Netværk + + + Enhed + + + Modtaget + + + Sendt + + + Fejl/Tabt + + + Etablerede netværskforbindelser + + + Hukommelsesforbrug + + + Fysisk hukommelse + + + Disk Swap + + + Filsystemer + + + Sti + + + Partition + + + I brug + + + Type + + + Ledig + + + Brugt + + + Størrelse + + + Totalt + + + kB + + + MB + + + GB + + + ingen + + + Kapasitet + + + Tema + + + Sprog + + + Send + + + Genereret med + + + dage + + + timer + + + minutter + + + Temperatur + + + Spænding + + + Blæsere + + + Værdi + + + Min + + + Maks + + + Hysterese + + + Grænse + + + Mærke + + + C + + + F + + + V + + + RPM + + + Kernel + applikationer + + + Buffere + + + Cached + + + Vis + + + UPS information + + + Navn + + + Model + + + Mode + + + Startet + + + Status + + + Udfald + + + Ã…rsag til sidste udfald + + + Tidspunkt for sidste udfald + + + Forsyningspænding + + + Procent belastet + + + Batteri spænding + + + Batteri ladning + + + Tid tilbage for batteridrift + + + V + + + minutter + + + Temperatur + + + TB + + + TiB + + + GiB + + + MiB + + + KiB + + + PiB + + + PB + + + MHz + + + GHz + + + Virtualisering + + + Last boot + + + B + + + System Language + + + Code Page + + + Details + + + CPU Speed Max + + + CPU Speed Min + + + Power + + + W + + + Battery date + + + Current + + + A + + + Machine + + + Line frequency + + + Hz + + + Processes + + + running + + + sleeping + + + stopped + + + zombie + + + waiting + + + other + + + TB enheder + + + I2C enheder + + + Number of processors + + + Number of devices + + diff --git a/sources/language/de.xml b/sources/language/de.xml new file mode 100644 index 0000000..f72083f --- /dev/null +++ b/sources/language/de.xml @@ -0,0 +1,369 @@ + + + + + + System Information + + + System Übersicht + + + Zugewiesener Hostname + + + Überwachte IP + + + Kernel Version + + + Distributionsname + + + Betriebszeit + + + Eingeloggte Benutzer + + + Auslastung + + + Hardware Übersicht + + + Prozessoren + + + Modell + + + Taktfrequenz + + + BUS Speed + + + Cachegröße + + + System Bogomips + + + PCI Geräte + + + IDE Geräte + + + SCSI Geräte + + + USB Geräte + + + Netzwerk-Auslastung + + + Schnittstellen + + + Empfangen + + + Gesendet + + + Fehler/Verworfen + + + Aktive Netzwerkverbindungen + + + Arbeiteitsspeicher-Auslastung + + + Physikalischer Speicher + + + Auslagerungsdatei + + + Angemeldete Dateisysteme + + + Mount + + + Partition + + + Prozentuale Auslastung + + + Typ + + + Frei + + + Belegt + + + Größe + + + Gesamt + + + kB + + + MB + + + GB + + + keine + + + Kapazität + + + Designvorlage + + + Sprache + + + Ändern + + + Erstellt von + + + Tage + + + Stunden + + + Minuten + + + Temperaturen + + + Spannungen + + + Lüfter + + + Wert + + + Min + + + Max + + + Hysteresis + + + Limit + + + Bezeichnung + + + °C + + + °F + + + V + + + Umin + + + Kernel + Anwendungen + + + Puffer + + + Cache + + + Springe zu + + + USV Information + + + Name + + + Model + + + Modus + + + Startzeit + + + Status + + + Ausfälle + + + Letzter Ausfallgrund + + + Letzter Ausfallzeitpunkt + + + Leitungsspannung + + + Auslastung + + + Batteriespannung + + + Batterieladezustand + + + Batterielaufzeit + + + V + + + Minuten + + + Temperatur + + + TB + + + TiB + + + GiB + + + MiB + + + KiB + + + PiB + + + PB + + + MHz + + + GHz + + + Virtualisierung + + + Letzter Start + + + B + + + System Sprache + + + Codepage + + + Details + + + CPU-Geschwindigkeit Max + + + CPU-Geschwindigkeit Min + + + Leistung + + + W + + + Akku Datum + + + Stromstärke + + + A + + + Maschine + + + Netzfrequenz + + + Hz + + + Prozesse + + + laufend + + + schlafend + + + gestoppt + + + zombie + + + wartend + + + andere + + + TB Geräte + + + I2C Geräte + + + Anzahl Prozessoren + + + Anzahl Geräte + + diff --git a/sources/language/en.xml b/sources/language/en.xml new file mode 100644 index 0000000..98b6359 --- /dev/null +++ b/sources/language/en.xml @@ -0,0 +1,369 @@ + + + + + + System information + + + System Vital + + + Canonical Hostname + + + Listening IP + + + Kernel Version + + + Distro Name + + + Uptime + + + Current Users + + + Load Averages + + + Hardware Information + + + Processors + + + Model + + + CPU Speed + + + BUS Speed + + + Cache Size + + + System Bogomips + + + PCI Devices + + + IDE Devices + + + SCSI Devices + + + USB Devices + + + Network Usage + + + Device + + + Received + + + Sent + + + Err/Drop + + + Established Network Connections + + + Memory Usage + + + Physical Memory + + + Disk Swap + + + Mounted Filesystems + + + Mountpoint + + + Partition + + + Usage + + + Type + + + Free + + + Used + + + Size + + + Totals + + + kB + + + MB + + + GB + + + none + + + Capacity + + + Template + + + Language + + + Submit + + + Created by + + + days + + + hours + + + minutes + + + Temperature + + + Voltage + + + Fans + + + Value + + + Min + + + Max + + + Hysteresis + + + Limit + + + Label + + + C + + + F + + + V + + + RPM + + + Kernel + applications + + + Buffers + + + Cached + + + Jump to + + + UPS information + + + Name + + + Model + + + Mode + + + Started + + + Status + + + Outages + + + Last outage cause + + + Last outage timestamp + + + Line voltage + + + Load percent + + + Battery voltage + + + Battery charge + + + Time left on batteries + + + V + + + minutes + + + Temperature + + + TB + + + TiB + + + GiB + + + MiB + + + KiB + + + PiB + + + PB + + + MHz + + + GHz + + + Virtualization + + + Last boot + + + B + + + System Language + + + Code Page + + + Details + + + CPU Speed Max + + + CPU Speed Min + + + Power + + + W + + + Battery date + + + Current + + + A + + + Machine + + + Line frequency + + + Hz + + + Processes + + + running + + + sleeping + + + stopped + + + zombie + + + waiting + + + other + + + TB Devices + + + I2C Devices + + + Number of processors + + + Number of devices + + diff --git a/sources/language/es.xml b/sources/language/es.xml new file mode 100644 index 0000000..04357ba --- /dev/null +++ b/sources/language/es.xml @@ -0,0 +1,369 @@ + + + + + + Información del Servidor + + + Vitales + + + Nombre del Servidor + + + Direcciones IP + + + Versión del Kernel + + + Nombre Distribución + + + Último arranque + + + Usuarios actuales + + + Promedio de uso + + + Información del Hardware + + + Procesadores + + + Modelo + + + Velocidad CPU + + + Velocidad BUS + + + Tamaño Cache + + + Sistema Bogomips + + + Dispositivos PCI + + + Dispositivos IDE + + + Dispositivos SCSI + + + Dispositivos USB + + + Uso de la red + + + Dispositivo + + + Recibidos + + + Enviados + + + Errores/Perdidos + + + Conexiones de Red Establecidas + + + Uso de la memoria + + + Memoria Física + + + Disco Swap + + + Sistema archivos Montados + + + Punto de montaje + + + Partición + + + Uso + + + Tipo + + + Libre + + + Usada + + + Tamaño + + + Total + + + kB + + + MB + + + GB + + + ninguno + + + Tamaño + + + Template + + + Lenguaje + + + Enviado + + + Creado por + + + días + + + horas + + + minutos + + + Temperatura + + + Voltaje + + + Ventiladores + + + Valor + + + Min + + + Max + + + Histéresis + + + Límite + + + Etiqueta + + + C + + + F + + + V + + + RPM + + + Kernel + aplicaciones + + + Buffers + + + Cache + + + Bifurcación + + + Información UPS + + + Nombre + + + Modelo + + + Modo + + + Iniciado + + + Estado + + + Interrupciones + + + Causa última interrupción + + + Tiempo última interrupción + + + Voltaje de la línea + + + Porcentaje cargado + + + Voltaje batería + + + Carga de la batería + + + Vida restante de las baterías + + + V + + + minutos + + + Temperatura + + + TB + + + TiB + + + GiB + + + MiB + + + KiB + + + PiB + + + PB + + + MHz + + + GHz + + + Virtualization + + + Last boot + + + B + + + System Language + + + Code Page + + + Details + + + CPU Speed Max + + + CPU Speed Min + + + Power + + + W + + + Battery date + + + Current + + + A + + + Machine + + + Line frequency + + + Hz + + + Processes + + + running + + + sleeping + + + stopped + + + zombie + + + waiting + + + other + + + Dispositivos TB + + + Dispositivos I2C + + + Number of processors + + + Number of devices + + diff --git a/sources/language/et.xml b/sources/language/et.xml new file mode 100644 index 0000000..570f0de --- /dev/null +++ b/sources/language/et.xml @@ -0,0 +1,369 @@ + + + + + + Süsteemi informatsioon + + + Süsteemist Lühidalt + + + Kanooniline masinanimi + + + Kuulav IP + + + Kerneli versioon + + + Distributsioon + + + Elusolek + + + Kasutajaid hetkel + + + Koormuse keskmised + + + Riistvara Informatsioon + + + Protsessoreid + + + Mudel + + + CPU Kiirus + + + BUS Kiirus + + + Puhvri Suurus + + + Süsteemi Bogomips + + + PCI Seadmed + + + IDE Seadmed + + + SCSI Seadmed + + + USB Seadmed + + + Võrgukasutus + + + Seade + + + Saadud + + + Saadetud + + + Vigu/Drop + + + Established Network Connections + + + Mälukasutus + + + Füüsiline Mälu + + + Saalemälu kettal + + + Ühendatud Failisüsteemid + + + Ühenduspunkt + + + Kettaosa + + + Kasutus + + + Tüüp + + + Vaba + + + Kasutuses + + + Suurus + + + Kokku + + + kB + + + MB + + + GB + + + pole + + + Mahutavus + + + Väljanägemine + + + Keel + + + Submit + + + Statistika toob teieni + + + päeva + + + tundi + + + minutit + + + Temperatuur + + + Pinge + + + Ventilaatorid + + + Hetkeväärtus + + + Min + + + Max + + + Hüsterees + + + Piirväärtus + + + Sõlmenimi + + + C + + + F + + + V + + + RPM + + + Kernel + rakendused + + + Puhvrid + + + Vahepuhvrid/cache + + + Hüppa + + + UPS informatsioon + + + Nimi + + + Mudel + + + Reshiim + + + Käivitatud + + + Staatus + + + Katkestusi + + + Viimase katkestuse põhjustas + + + Viimase katkestuse ajatempel + + + Liini pinge + + + Koormuse + + + Aku pinge + + + Aku laetus + + + Akudel töötamiseks jäänud aega + + + V + + + minutit + + + Temperatuur + + + TB + + + TiB + + + GiB + + + MiB + + + KiB + + + PiB + + + PB + + + MHz + + + GHz + + + Virtualization + + + Last boot + + + B + + + System Language + + + Code Page + + + Details + + + CPU Speed Max + + + CPU Speed Min + + + Power + + + W + + + Battery date + + + Current + + + A + + + Machine + + + Line frequency + + + Hz + + + Processes + + + running + + + sleeping + + + stopped + + + zombie + + + waiting + + + other + + + TB Seadmed + + + I2C Seadmed + + + Number of processors + + + Number of devices + + diff --git a/sources/language/fi.xml b/sources/language/fi.xml new file mode 100644 index 0000000..ac84991 --- /dev/null +++ b/sources/language/fi.xml @@ -0,0 +1,369 @@ + + + + + + Järjestelmä + + + Tärkeät tiedot + + + Kanoninen isäntänimi + + + IP-osoite + + + Ytimen versio + + + Distron nimi + + + Uptime + + + Nykyiset käyttäjät + + + Keskimääräinen kuorma + + + Laitteisto + + + Prosessorit + + + Malli + + + CPU:n kellotaajuus + + + BUS:n kellotaajuus + + + Välimuistin koko + + + Järjestelmän Bogomipsit + + + PCI laitteet + + + IDE laitteet + + + SCSI laitteet + + + USB laitteet + + + Verkon käyttö + + + Laite + + + Vastaanotettu + + + Lähetetty + + + Err/Drop + + + Vakiintuneet yhteydet + + + Muistin käyttö + + + Fyysinen muisti + + + Levy Swap + + + Kiinnitetyt tiedostojärjestelmät + + + Kiinnitetty + + + Partitiot + + + Käytössä + + + Tyyppi + + + Vapaana + + + Käytetty + + + Koko + + + Yhteensä + + + kB + + + MB + + + GB + + + ei + + + Kapasiteetti + + + Teema + + + Kieli + + + Muokkaa + + + Luonut + + + päivää + + + tuntia + + + minuuttia + + + Lämpö + + + Voltti + + + Tuulettimet + + + Arvo + + + Min + + + Max + + + Hystereesi + + + Rajoitus + + + Leima + + + C + + + F + + + V + + + RPM + + + Ydin + ohjelmistot + + + Puskurit + + + Välimuistissa + + + Hyppää + + + UPS tietoja + + + Nimi + + + Tyyppi + + + Moodi + + + Aloitettu + + + Tila + + + Katkoksia + + + Viimeisen katkoksen syy + + + Viimeisimmän katkoksen aikaleima + + + Linjan jännite + + + Kuorma prosentteina + + + Akun jännite + + + Akun kuorma + + + Aikaa jäljellä akuissa + + + V + + + minuuttia + + + Lämpö + + + TB + + + TiB + + + GiB + + + MiB + + + KiB + + + PiB + + + PB + + + MHz + + + GHz + + + Virtualization + + + Last boot + + + B + + + System Language + + + Code Page + + + Details + + + CPU Speed Max + + + CPU Speed Min + + + Power + + + W + + + Battery date + + + Current + + + A + + + Machine + + + Line frequency + + + Hz + + + Processes + + + running + + + sleeping + + + stopped + + + zombie + + + waiting + + + other + + + TB laitteet + + + I2C laitteet + + + Number of processors + + + Number of devices + + diff --git a/sources/language/fr.xml b/sources/language/fr.xml new file mode 100644 index 0000000..ae92f2d --- /dev/null +++ b/sources/language/fr.xml @@ -0,0 +1,369 @@ + + + + + + Informations système + + + Système + + + Nom d'hôte canonique + + + Adresse IP + + + Version du noyau + + + Distribution + + + Durée d'activité + + + Utilisateurs + + + Charge système + + + Informations matériel + + + Processeurs + + + Modèle + + + Fréquence CPU + + + Fréquence BUS + + + Taille cache + + + Bogomips + + + Périphériques PCI + + + Péripériques IDE + + + Périphériques SCSI + + + Périphériques USB + + + Réseau + + + Périphérique + + + Réception + + + Envoi + + + Err/Drop + + + Connections réseau établies + + + Utilisation mémoire + + + Mémoire physique + + + Swap disque + + + Systèmes de fichiers montés + + + Point de montage + + + Partition + + + Utilisation + + + Type + + + Libre + + + Occupé + + + Taille + + + Totaux + + + ko + + + Mo + + + Go + + + aucun + + + Capacité + + + Modèle + + + Langue + + + Validé + + + Créé par + + + jours + + + heures + + + minutes + + + Température + + + Tension + + + Ventilateurs + + + Valeur + + + Min + + + Max + + + Hystérésis + + + Limite + + + Valeur + + + C + + + F + + + V + + + RPM + + + Noyau + applications + + + Buffers + + + Cached + + + Aller à + + + Informations UPS + + + Nom + + + Modèle + + + Mode + + + Démarré + + + Statut + + + Interruptions + + + Cause dernière interruption + + + Fin dernière interruption + + + Tension + + + Charge + + + Tension Batterie + + + Charge Batterie + + + Autonomie Batterie + + + V + + + minutes + + + Température + + + To + + + Tio + + + Gio + + + Mio + + + Kio + + + Pio + + + Po + + + MHz + + + GHz + + + Virtualisation + + + Dernier démarrage + + + B + + + Langue du système + + + Codage de la page + + + Détails + + + Vitesse CPU Max + + + Vitesse CPU Min + + + Puissance + + + W + + + Battery date + + + Current + + + A + + + Machine + + + Line frequency + + + Hz + + + Processus + + + running + + + sleeping + + + stopped + + + zombie + + + waiting + + + other + + + Périphériques TB + + + Périphériques I2C + + + Number of processors + + + Number of devices + + diff --git a/sources/language/gl.xml b/sources/language/gl.xml new file mode 100644 index 0000000..435452e --- /dev/null +++ b/sources/language/gl.xml @@ -0,0 +1,369 @@ + + + + + + Información do servidor + + + Características principais + + + Nome do servidor + + + Direccións IP + + + Versión do Kernel + + + Nome da distribución + + + Último arranque + + + Usuarios actuais + + + Promedio de uso + + + Información do hardware + + + Procesadores + + + Modelo + + + Velocidade CPU + + + Velocidade BUS + + + Tamaño Caché + + + Sistema Bogomips + + + Dispositivos PCI + + + Dispositivos IDE + + + Dispositivos SCSI + + + Dispositivos USB + + + Uso da rede + + + Dispositivo + + + Recibidos + + + Enviados + + + Erros/Perdidos + + + Conexións de rede establecidas + + + Uso da memoria + + + Memoria Física + + + Disco Swap + + + Sistema archivos Montados + + + Punto de montaxe + + + Partición + + + Uso + + + Tipo + + + Libre + + + Usada + + + Tamaño + + + Total + + + kB + + + MB + + + GB + + + ningÚn + + + Tamaño + + + Tema + + + Linguaxe + + + Enviado + + + Creado por + + + días + + + horas + + + minutos + + + Temperatura + + + Voltaxe + + + Ventiladores + + + Valor + + + Min + + + Max + + + Histéresis + + + Límite + + + Etiqueta + + + C + + + F + + + V + + + RPM + + + Kernel + aplicaciones + + + Buffers + + + Cache + + + Bifurcación + + + UPS information + + + Name + + + Model + + + Mode + + + Started + + + Status + + + Outages + + + Last outage cause + + + Last outage timestamp + + + Line voltage + + + Load percent + + + Battery voltage + + + Battery charge + + + Time left on batteries + + + V + + + minutes + + + Temperature + + + TB + + + TiB + + + GiB + + + MiB + + + KiB + + + PiB + + + PB + + + MHz + + + GHz + + + Virtualization + + + Last boot + + + B + + + System Language + + + Code Page + + + Details + + + CPU Speed Max + + + CPU Speed Min + + + Power + + + W + + + Battery date + + + Current + + + A + + + Machine + + + Line frequency + + + Hz + + + Processes + + + running + + + sleeping + + + stopped + + + zombie + + + waiting + + + other + + + Dispositivos TB + + + Dispositivos I2C + + + Number of processors + + + Number of devices + + diff --git a/sources/language/gr.xml b/sources/language/gr.xml new file mode 100644 index 0000000..f8c6129 --- /dev/null +++ b/sources/language/gr.xml @@ -0,0 +1,369 @@ + + + + + + ΠληÏοφοÏίες Συστήματος + + + Στοιχεία Συστήματος + + + Ονομασία + + + ΔιεÏθυνση IP + + + Έκδοση ΠυÏήνα + + + Διανομή + + + ΕνεÏγό για + + + ΕνεÏγοί χÏήστες + + + ΦόÏτο λειτουÏγίας + + + ΠληÏοφοÏίες Î¥Î»Î¹ÎºÎ¿Ï + + + ΕπεξεÏγαστές + + + Μοντέλο + + + ΤαχÏτητα ΕπεξεÏγαστή + + + ΤαχÏτητα ΔιαÏλου + + + Μέγεθος Cache + + + Bogomips Συστήματος + + + Συσκευές PCI + + + Συσκευές IDE + + + Συσκευές SCSI + + + Συσκευές USB + + + ΧÏήση ΔικτÏου + + + Συσκευή + + + Λήφθησαν + + + Απεστάλησαν + + + Λάθη/ΑποÏÏιπτέα + + + ΕνεÏγές Δικτυακές Συνδέσεις + + + ΧÏήση Μνήμης + + + Φυσική Μνήμη + + + Δίσκος Swap + + + ΕνεÏγές Αποθηκευτικές Μονάδες + + + Mountpoint + + + Partition + + + ΧÏήση + + + ΤÏπος + + + ΕλεÏθεÏο + + + Κατειλημμένο + + + ΣÏνολο + + + ΣÏνολο + + + kB + + + MB + + + GB + + + κανένα + + + ΧωÏητικότητα + + + Εμφάνιση + + + Γλώσσα + + + ΚαταχώÏηση + + + ΠαÏάχθηκε με το + + + ημέÏες + + + ÏŽÏες + + + λεπτά + + + ΘεÏμοκÏασίες + + + Τάσεις + + + ΨÏξη + + + Τιμή + + + Eλάχιστο + + + Μέγιστο + + + ΥστέÏιση + + + ÎŒÏιο + + + ΥποσÏστημα + + + °C + + + °F + + + V + + + RPM + + + ΠυÏήνας + εφαÏμογές + + + Buffers + + + Cached + + + Jump to + + + ΠληÏοφοÏίες UPS + + + Όνομα + + + Μοντέλο + + + Mode + + + ΕνεÏγό από + + + Κατάσταση + + + Διακοπές + + + Λόγος διακοπής + + + Τελευταία διακοπή + + + Τάση γÏαμμής + + + ΦόÏτο + + + Τάση μπαταÏίας + + + ΦόÏτιση μπαταÏίας + + + ΧÏόνος μπαταÏιών + + + V + + + λεπτά + + + ΘεÏμοκÏασία + + + TB + + + TiB + + + GiB + + + MiB + + + KiB + + + PiB + + + PB + + + MHz + + + GHz + + + Virtualization + + + Τελευταία εκκίνηση + + + B + + + System Language + + + Code Page + + + Details + + + CPU Speed Max + + + CPU Speed Min + + + Power + + + W + + + Battery date + + + Current + + + A + + + Machine + + + Line frequency + + + Hz + + + Processes + + + running + + + sleeping + + + stopped + + + zombie + + + waiting + + + other + + + Συσκευές TB + + + Συσκευές I2C + + + Number of processors + + + Number of devices + + diff --git a/sources/language/he.xml b/sources/language/he.xml new file mode 100644 index 0000000..0fed544 --- /dev/null +++ b/sources/language/he.xml @@ -0,0 +1,369 @@ + + + + + + מידע המערכת + + + נתוני מערכת + + + ×©× ×”×©×¨×ª + + + כתובת ×ינטר\×ינרה-נט + + + גרסת הליבה + + + הפצה + + + זמן ריצה + + + ×ž×©×ª×ž×©×™× ×ž×—×•×‘×¨×™× + + + עומס ממוצע + + + מידע על החומרה + + + ×ž×¢×‘×“×™× + + + ×“×’× + + + מהירות מעבד + + + מהירות חריץ הרחבה + + + גודל מטמון + + + System Bogomips + + + התקני PCI + + + התקני IDE + + + שירותי SCSI + + + ×”×ª×§× ×™× ××•× ×™×‘×¨×¡×œ×™×™× (USB) + + + ניצולת רשת + + + התקן + + + התקבל + + + נשלח + + + נפילות\תקלות + + + ×—×™×‘×•×¨×™× ×§×™×™×ž×™× + + + זיכרון בשימוש + + + זיכרון פיזי + + + דיסק החלפה + + + מערכות ×§×‘×¦×™× ×ž×—×•×‘×¨×•×ª + + + נקודת חיבור + + + מחיצה + + + בשימוש + + + סוג + + + פנוי + + + משומש + + + גודל + + + סה"×› + + + kB + + + MB + + + GB + + + none + + + נפח + + + תבנית + + + שפה + + + שליחה + + + נוצר על ידי + + + ×™×ž×™× + + + שעות + + + דקות + + + טמפרטורה + + + מתח + + + מ××•×•×¨×¨×™× + + + ערך + + + מינימ×לי + + + מקסימ×לי + + + Hysteresis + + + גבול + + + תווית + + + C + + + F + + + V + + + RPM + + + ליבה ותוכנה + + + ×וגר + + + Cached + + + קפוץ ל + + + מידע ×ל פסק + + + ×©× + + + ×“×’× + + + מצב + + + זמן הפעלה + + + מצב + + + הפסקות חשבמל + + + הפסקת חשמל ×חרונה + + + חתימת זמן של הפסקת חשמל ×חרונה + + + מתח הקו + + + ×חוזי עומס + + + מתח סוללה + + + ×חות טעינת סוללה + + + זמן שנש×ר לשימוש בסוללה + + + V + + + דקות + + + טמפרטורה + + + TB + + + TiB + + + GiB + + + MiB + + + KiB + + + PiB + + + PB + + + MHz + + + GHz + + + הדמיה (וירטו×ליזציה) + + + עליית מערכת ×חרוה + + + B + + + שפת מערכת ההפעלה + + + קוד שפה + + + ×¤×¨×˜×™× + + + מהירות מעבד הגבוהה ביותר + + + מהירות המעבד הנמוכה ביותר + + + כוח + + + W + + + ת×ריך סוללה + + + Current + + + A + + + Machine + + + Line frequency + + + Hz + + + Processes + + + running + + + sleeping + + + stopped + + + zombie + + + waiting + + + other + + + התקני TB + + + התקני I2C + + + Number of processors + + + Number of devices + + diff --git a/sources/language/hu.xml b/sources/language/hu.xml new file mode 100644 index 0000000..eb4450d --- /dev/null +++ b/sources/language/hu.xml @@ -0,0 +1,369 @@ + + + + + + Rendszer információk + + + AlapvetÅ‘ információk + + + Hosztnév + + + Figyelt IP + + + Kernel Verzió + + + Distro Név + + + Uptime + + + Jelenlegi Felhasználok + + + Terheltség + + + Hardver Információk + + + Processzorok + + + Model + + + CPU Sebesség + + + BUS Sebesség + + + Cache Méret + + + Rendszer Bogomips + + + PCI Eszközök + + + IDE Eszközök + + + SCSI Eszközök + + + USB Eszközök + + + Hálózat Használat + + + Eszköz + + + Fogadott + + + Küldött + + + Hibás/Eldobott + + + Hálózati Csatlakozások + + + Memória Használat + + + Fizikai Memória + + + Lemez Swap + + + Csatlakoztatott File Rendszerek + + + Csatlakozási pont + + + Partíció + + + Használt + + + Típus + + + Szabad + + + Felhasznált + + + Méret + + + Összes + + + kB + + + MB + + + GB + + + nincs + + + Kapacitás + + + Sablon + + + Nyelv + + + Rendben + + + Készítette: + + + nap + + + óra + + + perc + + + HÅ‘mérsékletek + + + Feszültségek + + + Ventilátorok + + + Érték + + + Min + + + Max + + + Hiszterézis + + + Limit + + + Címke + + + C + + + F + + + V + + + RPM + + + Kernel + Alkalmazások + + + Bufferek + + + Cached + + + Ugrás ide: + + + UPS information + + + Name + + + Model + + + Mode + + + Started + + + Status + + + Outages + + + Last outage cause + + + Last outage timestamp + + + Line voltage + + + Load percent + + + Battery voltage + + + Battery charge + + + Time left on batteries + + + V + + + minutes + + + Temperature + + + TB + + + TiB + + + GiB + + + MiB + + + KiB + + + PiB + + + PB + + + MHz + + + GHz + + + Virtualization + + + Last boot + + + B + + + System Language + + + Code Page + + + Details + + + CPU Speed Max + + + CPU Speed Min + + + Power + + + W + + + Battery date + + + Current + + + A + + + Machine + + + Line frequency + + + Hz + + + Processes + + + running + + + sleeping + + + stopped + + + zombie + + + waiting + + + other + + + TB Eszközök + + + I2C Eszközök + + + Number of processors + + + Number of devices + + diff --git a/sources/language/is.xml b/sources/language/is.xml new file mode 100644 index 0000000..49398df --- /dev/null +++ b/sources/language/is.xml @@ -0,0 +1,369 @@ + + + + + + Kerfisupplýsingar + + + Aðalupplýsingar kerfis + + + Vélarnafn + + + IP tala vélar + + + Útgáfa kjarna + + + Nafn stýrikerfis + + + Upptími + + + Tengdir notendur + + + Meðal álag vélar + + + Upplýsingar um vélbúnað + + + Örgjörvar + + + Týpa + + + Klukkuhraði örgjörva + + + Brautarhraði + + + Stærð flýtiminnis + + + Örgjörvakjarni + + + PCI jaðartæki + + + IDE jaðartæki + + + SCSI jaðartæki + + + USB jaðartæki + + + Notkun á neti + + + Jaðartæki + + + Móttekið + + + Sent + + + Villur/Pakkatap + + + Upplýsingar nettengingar + + + Minnisnotkun + + + Vinnsluminni + + + Sýndarminni + + + Tengd skráarkerfi + + + Tengipunktur + + + Disksneið + + + Hlutfall af heildarstærð + + + Tegund + + + Laust + + + Notað + + + Stærð + + + Samtals + + + kB + + + MB + + + GB + + + Ekkert + + + Heildarstærð + + + Sniðmát + + + Tungumál + + + Senda + + + Búið til af + + + dagar + + + klukkustundir + + + mínútur + + + Hitastig + + + Spenna + + + Viftur + + + Gildi + + + Lægst + + + Hæst + + + ðvörun lýkur + + + Aðvörun byrjar + + + Nafn mælis + + + C + + + F + + + V + + + RPM + + + Kjarni + viðbætur + + + Biðminni + + + Skyndiminni + + + Skoða + + + Upplýsingar varaaflgjafa + + + Nafn + + + Týpa + + + Hamur + + + Byrjaði + + + Staða + + + Útsláttur rafmagns + + + Ãstæða síðasta rafmagnsútsláttar + + + Tími síðasta rafmagnsútsláttar + + + Línu spenna + + + Tími notað af rafhlöðu + + + Rafhlöðustraumur + + + Rafhlöðuhleðsla + + + Tími sem er eftir af rafhlöðu + + + V + + + mínútur + + + Hitastig + + + TB + + + TiB + + + GiB + + + MiB + + + KiB + + + PiB + + + PB + + + MHz + + + GHz + + + Virtualization + + + Last boot + + + B + + + System Language + + + Code Page + + + Details + + + CPU Speed Max + + + CPU Speed Min + + + Power + + + W + + + Battery date + + + Current + + + A + + + Machine + + + Line frequency + + + Hz + + + Processes + + + running + + + sleeping + + + stopped + + + zombie + + + waiting + + + other + + + TB jaðartæki + + + I2C jaðartæki + + + Number of processors + + + Number of devices + + diff --git a/sources/language/it.xml b/sources/language/it.xml new file mode 100644 index 0000000..99ec053 --- /dev/null +++ b/sources/language/it.xml @@ -0,0 +1,369 @@ + + + + + + Informazioni sul sistema + + + Informazioni Vitali + + + Nome del Server + + + Indirizzo IP + + + Verisione del Kernel + + + Distribuzione + + + Tempo di Esercizio + + + Utenti Collegati + + + Carico Medio + + + Informazioni Hardware + + + Processori + + + Modello + + + Velocità CPU + + + Velocità BUS + + + Dimensione Cache + + + Bogomips del Sistema + + + Unità PCI + + + Unità IDE + + + Unità SCSI + + + Unità USB + + + Utilizzo della Rete + + + Dispositivo + + + Recevuti + + + Inviati + + + Errori/Perdite + + + Connessioni di Rete Stabilite + + + Utilizzo della Memoria + + + Memoria Fisica + + + Disco di Swap + + + Filesystems Montati + + + Punto di Mount + + + Partizione + + + Uso Percentuale + + + Tipo + + + Libero + + + Usato + + + Dimensione + + + Totali + + + kB + + + MB + + + GB + + + Nessuna presente + + + Capacità + + + Template + + + Lingua + + + Invia + + + Creato da + + + giorni + + + ore + + + minuti + + + Temperatura + + + Voltaggio + + + Ventole + + + Valore + + + Min + + + Max + + + Isteresi + + + Limite + + + Etichetta + + + C + + + F + + + V + + + RPM + + + Kernel + applicazioni + + + Buffer + + + Cache + + + Vai A + + + UPS information + + + Name + + + Model + + + Mode + + + Started + + + Status + + + Outages + + + Last outage cause + + + Last outage timestamp + + + Line voltage + + + Load percent + + + Battery voltage + + + Battery charge + + + Time left on batteries + + + V + + + minutes + + + Temperature + + + TB + + + TiB + + + GiB + + + MiB + + + KiB + + + PiB + + + PB + + + MHz + + + GHz + + + Virtualization + + + Last boot + + + B + + + System Language + + + Code Page + + + Details + + + CPU Speed Max + + + CPU Speed Min + + + Power + + + W + + + Battery date + + + Current + + + A + + + Machine + + + Line frequency + + + Hz + + + Processes + + + running + + + sleeping + + + stopped + + + zombie + + + waiting + + + other + + + Unità TB + + + Unità I2C + + + Number of processors + + + Number of devices + + diff --git a/sources/language/ja.xml b/sources/language/ja.xml new file mode 100644 index 0000000..0f1e0c7 --- /dev/null +++ b/sources/language/ja.xml @@ -0,0 +1,369 @@ + + + + + + システム情報 + + + システム基本情報 + + + ホストå + + + å¾…å—ã‘IPアドレス + + + カーãƒãƒ«ãƒãƒ¼ã‚¸ãƒ§ãƒ³ + + + ディストリビューション / OS + + + 起動時間 + + + ログインユーザー数 + + + ロードアベレージ + + + ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢æƒ…å ± + + + プロセッサー数 + + + モデルå + + + 周波数 + + + ãƒã‚¹ã‚¹ãƒ”ード + + + キャッシュサイズ + + + システムBogomips + + + PCIデãƒã‚¤ã‚¹ + + + IDEデãƒã‚¤ã‚¹ + + + SCSIデãƒã‚¤ã‚¹ + + + USBデãƒã‚¤ã‚¹ + + + ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ä½¿ç”¨çŠ¶æ³ + + + デãƒã‚¤ã‚¹ + + + å—ä¿¡ + + + é€ä¿¡ + + + ï½´ï¾—ï½°/破棄 + + + 接続中ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ + + + ãƒ¡ãƒ¢ãƒªãƒ¼ä½¿ç”¨çŠ¶æ³ + + + 物ç†ãƒ¡ãƒ¢ãƒªãƒ¼ + + + ディスクスワップ + + + マウント済ã¿ãƒ•ァイルシステム + + + マウントãƒã‚¤ãƒ³ãƒˆ + + + パーティション + + + 使用率 + + + タイプ + + + 空ã + + + 使用中 + + + サイズ + + + åˆè¨ˆ + + + kB + + + MB + + + GB + + + ç„¡ã— + + + å®¹é‡ + + + テンプレート + + + 言語 + + + Submit + + + Created by + + + æ—¥ + + + 時間 + + + 分 + + + 温度 + + + 電圧 + + + ファン + + + Value + + + Min + + + Max + + + Hysteresis + + + Limit + + + Label + + + C + + + F + + + V + + + RPM + + + カーãƒãƒ« + アプリケーション + + + ãƒãƒƒãƒ•ァー + + + キャッシュ + + + Jump to + + + UPS情報 + + + UPSå + + + モデルå + + + モード + + + 開始日時 + + + 状態 + + + ä¾›çµ¦åœæ­¢å›žæ•° + + + æœ€çµ‚ä¾›çµ¦åœæ­¢ç†ç”± + + + æœ€çµ‚ä¾›çµ¦åœæ­¢æ—¥æ™‚ + + + Line voltage + + + è² è·çއ + + + ãƒãƒƒãƒ†ãƒªãƒ¼é›»åœ§ + + + ãƒãƒƒãƒ†ãƒªãƒ¼å……電率 + + + ãƒãƒƒãƒ†ãƒªãƒ¼æ®‹ã‚Šæ™‚é–“ + + + V + + + 分 + + + 温度 + + + TB + + + TiB + + + GiB + + + MiB + + + KiB + + + PiB + + + PB + + + MHz + + + GHz + + + Virtualization + + + Last boot + + + B + + + System Language + + + Code Page + + + Details + + + CPU Speed Max + + + CPU Speed Min + + + Power + + + W + + + Battery date + + + Current + + + A + + + Machine + + + Line frequency + + + Hz + + + Processes + + + running + + + sleeping + + + stopped + + + zombie + + + waiting + + + other + + + TBデãƒã‚¤ã‚¹ + + + I2Cデãƒã‚¤ã‚¹ + + + Number of processors + + + Number of devices + + diff --git a/sources/language/ko.xml b/sources/language/ko.xml new file mode 100644 index 0000000..739dce8 --- /dev/null +++ b/sources/language/ko.xml @@ -0,0 +1,369 @@ + + + + + + 시스템 ì •ë³´ + + + 현재 시스템 ìƒí™© + + + Canonical 호스트명 + + + Listening IP + + + ì»¤ë„ ë²„ì „ + + + 제품명 + + + 사용시간 + + + 현재 사용ìžë“¤ + + + í‰ê·  사용현황 + + + 하드웨어 ì •ë³´ + + + 프로세스 + + + ëª¨ë¸ + + + CPU ì†ë„ + + + BUS ì†ë„ + + + ìºì‰¬ í¬ê¸° + + + ìžì²´ 테스트 í´ëŸ­ + + + PCI 장치들 + + + IDE 장치들 + + + SCSI 장치들 + + + USB 장치들 + + + ë„¤íŠ¸ì›Œí¬ ì‚¬ìš©ëŸ‰ + + + 장치 + + + ë°›ìŒ + + + 보냄 + + + ì—러/실패 + + + ì ‘ì†ëœ ë„¤íŠ¸ì›Œí¬ + + + 메모리 사용량 + + + ë¬¼ë¦¬ì  ë©”ëª¨ë¦¬ + + + ë””ìŠ¤í¬ ìŠ¤ì™‘ + + + ë§ˆìš´íŠ¸ëœ ì‹œìŠ¤í…œ + + + ë§ˆìš´íŠ¸ì§€ì  + + + 파티션 + + + 사용량 + + + 타입 + + + ë‚¨ì€ ê³µê°„ + + + 사용 공간 + + + í¬ê¸° + + + 합계 + + + kB + + + MB + + + GB + + + none + + + 용량 + + + 스킨 + + + 언어 + + + Submit + + + 제작소 : + + + ì¼ + + + 시 + + + ë¶„ + + + ì˜¨ë„ + + + Voltage + + + Fans + + + Value + + + 최소 + + + 최대 + + + Hysteresis + + + Limit + + + Label + + + C + + + F + + + V + + + RPM + + + ì»¤ë„ + 어플리케ì´ì…˜ + + + ë²„í¼ + + + ìºì‰¬ + + + Jump to + + + UPS ì •ë³´ + + + ì´ë¦„ + + + ëª¨ë¸ + + + Mode + + + Started + + + ìƒíƒœ + + + Outages + + + Last outage cause + + + Last outage timestamp + + + Line voltage + + + Load percent + + + Battery voltage + + + 배터리 ì¶©ì „ + + + Time left on batteries + + + V + + + ë¶„ + + + ì˜¨ë„ + + + TB + + + TiB + + + GiB + + + MiB + + + KiB + + + PiB + + + PB + + + MHz + + + GHz + + + Virtualization + + + Last boot + + + B + + + System Language + + + Code Page + + + Details + + + CPU Speed Max + + + CPU Speed Min + + + Power + + + W + + + Battery date + + + Current + + + A + + + Machine + + + Line frequency + + + Hz + + + Processes + + + running + + + sleeping + + + stopped + + + zombie + + + waiting + + + other + + + TB 장치들 + + + I2C 장치들 + + + Number of processors + + + Number of devices + + diff --git a/sources/language/language.php b/sources/language/language.php new file mode 100644 index 0000000..7cd1c78 --- /dev/null +++ b/sources/language/language.php @@ -0,0 +1,69 @@ + + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version SVN: $Id: language.php 661 2012-08-27 11:26:39Z namiltd $ + * @link http://phpsysinfo.sourceforge.net + */ + +// Set the correct content-type header. +header("Content-Type: text/xml\n\n"); + +/** + * default language + * + * @var String + */ +$lang = 'en'; + +/** + * default pluginname + * + * @var String + */ +$plugin = ''; + +/** + * application root path + * + * @var string + */ +define('APP_ROOT', realpath(dirname((__FILE__)).'/../')); + +include_once APP_ROOT.'/read_config.php'; + +if (defined('PSI_DEFAULT_LANG')) { + $lang = PSI_DEFAULT_LANG; +} + +if (isset($_GET['lang']) && (trim($_GET['lang'])!=="") + && !preg_match('/[^A-Za-z\-_]/', $_GET['lang']) + && file_exists(APP_ROOT.'/language/'.$_GET['lang'].'.xml')) { + $lang = $_GET['lang']; +} + +if (isset($_GET['plugin'])) { + if ((trim($_GET['plugin'])!=="") && !preg_match('/[^A-Za-z\-_]/', $_GET['plugin'])) { + $plugin = $_GET['plugin']; + if (file_exists(APP_ROOT.'/plugins/'.strtolower($plugin).'/lang/'.$lang.'.xml')) { + echo file_get_contents(APP_ROOT.'/plugins/'.strtolower($plugin).'/lang/'.$lang.'.xml'); + } elseif (file_exists(APP_ROOT.'/plugins/'.strtolower($plugin).'/lang/en.xml')) { + echo file_get_contents(APP_ROOT.'/plugins/'.strtolower($plugin).'/lang/en.xml'); + } + } +} else { + if (file_exists(APP_ROOT.'/language/'.$lang.'.xml')) { + echo file_get_contents(APP_ROOT.'/language/'.$lang.'.xml'); + } else { + echo file_get_contents(APP_ROOT.'/language/en.xml'); + } +} diff --git a/sources/language/nl.xml b/sources/language/nl.xml new file mode 100644 index 0000000..1820b07 --- /dev/null +++ b/sources/language/nl.xml @@ -0,0 +1,369 @@ + + + + + + Systeem Informatie + + + Systeem Overzicht + + + Toegewezen naam + + + IP adres + + + Kernelversie + + + Distributie + + + Uptime + + + Huidige gebruikers + + + Gemiddelde belasting + + + Hardware overzicht + + + Processors + + + Model + + + CPU snelheid + + + BUS snelheid + + + Cache grootte + + + Systeem Bogomips + + + PCI Apparaten + + + IDE Apparaten + + + SCSI Apparaten + + + USB Apparaten + + + Netwerkgebruik + + + Apparaat + + + Ontvangen + + + Verzonden + + + Err/Drop + + + Aktieve Netwerkverbindingen + + + Geheugengebruik + + + Fysiek geheugen + + + Swap geheugen + + + Aangesloten bestandssystemen + + + Mount + + + Partitie + + + Percentage gebruikt + + + Type + + + Vrij + + + Gebruikt + + + Grootte + + + Totaal + + + kB + + + MB + + + GB + + + geen + + + Capaciteit + + + Opmaak + + + Taal + + + Toepassen + + + Gegenereerd door + + + dagen + + + uren + + + minuten + + + Temperatuur + + + Voltage + + + Fans + + + Waarde + + + Min + + + Max + + + Hysteresis + + + Limiet + + + Omschrijving + + + °C + + + °F + + + V + + + RPM + + + Kernel + Aplicaties + + + Buffers + + + Cached + + + Ga naar + + + UPS information + + + Name + + + Model + + + Mode + + + Started + + + Status + + + Outages + + + Last outage cause + + + Last outage timestamp + + + Line voltage + + + Load percent + + + Battery voltage + + + Battery charge + + + Time left on batteries + + + V + + + minutes + + + Temperature + + + TB + + + TiB + + + GiB + + + MiB + + + KiB + + + PiB + + + PB + + + MHz + + + GHz + + + Virtualization + + + Last boot + + + B + + + System Language + + + Code Page + + + Details + + + CPU Speed Max + + + CPU Speed Min + + + Power + + + W + + + Battery date + + + Current + + + A + + + Machine + + + Line frequency + + + Hz + + + Processes + + + running + + + sleeping + + + stopped + + + zombie + + + waiting + + + other + + + TB Apparaten + + + I2C Apparaten + + + Number of processors + + + Number of devices + + diff --git a/sources/language/no.xml b/sources/language/no.xml new file mode 100644 index 0000000..f242d60 --- /dev/null +++ b/sources/language/no.xml @@ -0,0 +1,369 @@ + + + + + + Systeminformasjon + + + Systemdetaljer + + + Vertsnavn + + + IP-adrssse + + + Kernelversjon + + + Distribusjon + + + Oppetid + + + Antall brukere + + + Last gjennomsnitt + + + Hardwareinformasjon + + + Prosessorer + + + Model + + + CPU frekvens + + + BUS frekvens + + + Cachestørrelse + + + System Bogomips + + + PCI enheter + + + IDE enheter + + + SCSI enhenter + + + USB enheter + + + Nettverk + + + Enhet + + + Mottatt + + + Sendt + + + Err/Drop + + + Established Network Connections + + + Minnebruk + + + Fysisk minne + + + Disk Swap + + + Filsystemer + + + Bane + + + Partisjon + + + Bruk + + + Type + + + Ledig + + + Brukt + + + Størrelse + + + Totalt + + + kB + + + MB + + + GB + + + ingen + + + Kapasitet + + + Tema + + + SprÃ¥k + + + Send + + + Generert med + + + dager + + + timer + + + minutter + + + Temperatur + + + Spenning + + + Vifter + + + Verdi + + + Min + + + Maks + + + Hysterese + + + Grense + + + Merke + + + C + + + F + + + V + + + RPM + + + Kernel + applikasjoner + + + Buffere + + + Cached + + + Vis + + + UPS information + + + Name + + + Model + + + Mode + + + Started + + + Status + + + Outages + + + Last outage cause + + + Last outage timestamp + + + Line voltage + + + Load percent + + + Battery voltage + + + Battery charge + + + Time left on batteries + + + V + + + minutes + + + Temperature + + + TB + + + TiB + + + GiB + + + MiB + + + KiB + + + PiB + + + PB + + + MHz + + + GHz + + + Virtualization + + + Last boot + + + B + + + System Language + + + Code Page + + + Details + + + CPU Speed Max + + + CPU Speed Min + + + Power + + + W + + + Battery date + + + Current + + + A + + + Machine + + + Line frequency + + + Hz + + + Processes + + + running + + + sleeping + + + stopped + + + zombie + + + waiting + + + other + + + TB enheter + + + I2C enheter + + + Number of processors + + + Number of devices + + diff --git a/sources/language/pl.xml b/sources/language/pl.xml new file mode 100644 index 0000000..c9b3390 --- /dev/null +++ b/sources/language/pl.xml @@ -0,0 +1,369 @@ + + + + + + Informacja o systemie + + + Stan systemu + + + Nazwa kanoniczna hosta + + + IP nasÅ‚uchujÄ…cy + + + Wersja jÄ…dra + + + Nazwa dystrybucji + + + Czas pracy + + + Zalogowani użytkownicy + + + Obciążenie Å›rednie + + + Informacja o sprzÄ™cie + + + Procesory + + + Model + + + CzÄ™stotliwość + + + Szyna + + + Rozmiar cache + + + Liczba BogoMips + + + UrzÄ…dzenia PCI + + + UrzÄ…dzenia IDE + + + UrzÄ…dzenia SCSI + + + UrzÄ…dzenia USB + + + Sieć + + + UrzÄ…dzenie + + + Odebrano + + + WysÅ‚ano + + + Błędy/Porzucone + + + NawiÄ…zane połączenia sieciowe + + + Wykorzystanie pamiÄ™ci + + + Pamięć fizyczna + + + Pamięć swap + + + Zamontowane systemy plików + + + Punkt montowania + + + Partycja + + + Procentowo zajÄ™te + + + Typ + + + Wolne + + + ZajÄ™te + + + Rozmiar + + + CaÅ‚kowite + + + kB + + + MB + + + GB + + + brak + + + Rozmiar + + + Szablon + + + JÄ™zyk + + + WyÅ›lij + + + Utworzone przez + + + dni + + + godzin + + + minut + + + Temperatura + + + NapiÄ™cie + + + Wentylatory + + + Wartość + + + Min + + + Max + + + Histereza + + + Limit + + + Nazwa + + + °C + + + °F + + + V + + + RPM + + + JÄ…dro i aplikacje + + + Bufory + + + Cache + + + Skocz do + + + Informacja o UPS + + + Nazwa + + + Model + + + Tryb + + + WystartowaÅ‚ + + + Status + + + Zaniki + + + Ostatni zanik + + + Czas ostatniego zaniku + + + NapiÄ™cie linii + + + Procent obciążenia + + + NapiÄ™cie baterii + + + NaÅ‚adowanie baterii + + + Utrzyma na bateriach + + + V + + + minut + + + Temperatura + + + TB + + + TiB + + + GiB + + + MiB + + + KiB + + + PiB + + + PB + + + MHz + + + GHz + + + Wirtualizacja + + + WystartowaÅ‚ + + + B + + + JÄ™zyk systemu + + + Strona kodowa + + + Szczegóły + + + CzÄ™stotliwość Max + + + CzÄ™stotliwość Min + + + Moc + + + W + + + Data baterii + + + PrÄ…d + + + A + + + Maszyna + + + CzÄ™stotliwość linii + + + Hz + + + Procesy + + + uruchomione + + + uÅ›pione + + + zatrzymane + + + zombi + + + oczekujÄ…ce + + + inne + + + UrzÄ…dzenia TB + + + UrzÄ…dzenia I2C + + + Liczba procesorów + + + Liczba urzÄ…dzeÅ„ + + diff --git a/sources/language/pt-br.xml b/sources/language/pt-br.xml new file mode 100644 index 0000000..3f052ef --- /dev/null +++ b/sources/language/pt-br.xml @@ -0,0 +1,369 @@ + + + + + + Informação do Sistema + + + Sistema Vital + + + Nome do Host Canônico + + + Ouvindo o IP + + + Versão do Kernel + + + Distribução + + + Ativo + + + Usuários Ativos + + + Carga Média + + + Informação do Hardware + + + Processadores + + + Modelo + + + CPU velocidade + + + BUS velocidade + + + Tamanho do Cache + + + Bogomips do Sistema + + + Periféricos PCI + + + Periféricos IDE + + + Periféricos SCSI + + + Periféricos USB + + + Uso da Rede + + + Dispositivo + + + Recebido + + + Enviado + + + Erro/Perdido + + + Conexões de Rede Estabilizadas + + + Uso da Memória + + + Memória Física + + + Swap do Disco + + + Sistemas de Arquivos Montados + + + Ponto Montado + + + Partição + + + Percentual + + + Tipo + + + Livre + + + Usado + + + Tamanho + + + Totais + + + kB + + + MB + + + GB + + + nenhum + + + Capacidade + + + Estilo + + + Idioma + + + Submeter + + + Criado por + + + dias + + + horas + + + minutos + + + Temperatura + + + Voltagem + + + Ventiladores + + + Valor + + + Min + + + Max + + + Hysteresis + + + Limite + + + Rótulos + + + C + + + F + + + V + + + RPM + + + Kernel + aplicações + + + Buffers + + + Cached + + + Ir para + + + Informação do UPS + + + Nome + + + Modelo + + + Modo + + + Iniciado + + + Status + + + Queda + + + Causa da Última Queda + + + Último registro de Queda + + + Voltagem de linha + + + Carga porcentual + + + Voltagem da bateria + + + Carga da bateria + + + Tempo restante das baterias + + + V + + + minutos + + + Temperatura + + + TB + + + TiB + + + GiB + + + MiB + + + KiB + + + PiB + + + PB + + + MHz + + + GHz + + + Virtualização + + + Último boot + + + B + + + Idioma do Sistema + + + Página de código + + + Detalhes + + + CPU Speed Max + + + CPU Speed Min + + + Power + + + W + + + Data da bateria + + + Corrente + + + A + + + Máquina + + + Frequência da linha + + + Hz + + + Processos + + + executando + + + dormindo + + + parado + + + zombie + + + esperando + + + outro + + + Periféricos TB + + + Periféricos I2C + + + Number of processors + + + Number of devices + + diff --git a/sources/language/pt-pt.xml b/sources/language/pt-pt.xml new file mode 100644 index 0000000..6694904 --- /dev/null +++ b/sources/language/pt-pt.xml @@ -0,0 +1,369 @@ + + + + + + Informação do Sistema + + + Sistema + + + Hostname + + + IP + + + Versão do Kernel + + + Distribuição + + + Ativo + + + Utilizadores Ativos + + + Carga Média + + + Informação de Hardware + + + Processadores + + + Modelo + + + Velocidade CPU + + + Velocidade BUS + + + Tamanho da Cache + + + Bogomips do Sistema + + + Periféricos PCI + + + Periféricos IDE + + + Periféricos SCSI + + + Periféricos USB + + + Utilização da Rede + + + Dispositivo + + + Recebido + + + Enviado + + + Erro/Perdido + + + Conexões de Rede Estabelecidas + + + Utilização da Memória + + + Memória Física + + + Swap do Disco + + + Sistemas de ficheiros + + + Ponto Montado + + + Partição + + + Percentagem + + + Tipo + + + Livre + + + Usado + + + Tamanho + + + Totais + + + kB + + + MB + + + GB + + + nenhum + + + Capacidade + + + Estilo + + + Idioma + + + Submeter + + + Criado por + + + dias + + + horas + + + minutos + + + Temperatura + + + Tensão + + + Ventiladores + + + Valor + + + Min + + + Max + + + Hysteresis + + + Limite + + + Rótulos + + + C + + + F + + + V + + + RPM + + + Kernel + aplicações + + + Buffers + + + Cached + + + Ir para + + + Informação da UPS + + + Nome + + + Modelo + + + Modo + + + Iniciado + + + Estado + + + Queda + + + Causa da última falha + + + Último registo de falha + + + Tensão da linha + + + Carga percentual + + + Tensão da bateria + + + Carga da bateria + + + Tempo restante da bateria + + + V + + + minutos + + + Temperatura + + + TB + + + TiB + + + GiB + + + MiB + + + KiB + + + PiB + + + PB + + + MHz + + + GHz + + + Virtualização + + + Último arranque + + + B + + + Linguagem do sistema + + + Codificação + + + Detalhes + + + Máx CPU freq + + + Min CPU freq + + + Power + + + W + + + Battery date + + + Current + + + A + + + Machine + + + Line frequency + + + Hz + + + Processes + + + running + + + sleeping + + + stopped + + + zombie + + + waiting + + + other + + + Periféricos TB + + + Periféricos I2C + + + Number of processors + + + Number of devices + + diff --git a/sources/language/ro.xml b/sources/language/ro.xml new file mode 100644 index 0000000..dabd5b3 --- /dev/null +++ b/sources/language/ro.xml @@ -0,0 +1,369 @@ + + + + + + InformaÈ›ii despre sistem + + + InformaÈ›ii vitale + + + Numele canonic + + + Adresă IP + + + Kernel Version + + + Nume DistribuÈ›ie + + + Timp de Viață + + + Utilizatori CurenÈ›i + + + ÃŽncărcarea Sistemului + + + InformaÈ›ii Hardware + + + Procesoare + + + Model + + + Viteza CPU + + + Viteză BUS + + + Marime Cache + + + Bogomips Sistem + + + Dispozitive PCI + + + Dispozitive IDE + + + Dispozitive SCSI + + + Dispozitive USB + + + Utilizarea ReÈ›elei + + + Dispozitiv + + + RecepÈ›ionat + + + Trimis + + + Erori/Drop + + + Conexiuni ReÈ›ea Stabilite + + + Utilizarea Memoriei + + + Memorie Fizică + + + Swap Disc + + + Sisteme de FiÈ™iere Montate + + + Punct Montare + + + PartiÈ›ie + + + Procent Utilizare + + + Tip + + + Liber + + + Utilizat + + + Mărime + + + Total + + + kB + + + MB + + + GB + + + Nici Unul + + + Capacitate + + + Model + + + Limbă + + + Actualizează + + + Creat de + + + zile + + + ore + + + minute + + + Temperatură + + + Tensiune + + + Ventilatoare + + + Valoare + + + Minim + + + Maxim + + + Histeresis + + + Limită + + + Etichetă + + + C + + + F + + + V + + + RPM + + + Kernel + applicaÈ›ii + + + Buffers + + + Cache-uit + + + Sari la + + + InformaÈ›ii UPS + + + Nume + + + Model + + + Mod + + + Pornit la + + + Stare + + + Număr Opriri + + + Ultima cauză a opririi + + + Data ultimei opriri + + + Tensiunea ReÈ›elei + + + Procent ÃŽncărcare + + + Tensiunea Bateriei + + + ÃŽncărcarea Bateriei + + + Timp rămas pe baterie + + + V + + + minute + + + Temperatură + + + TB + + + TiB + + + GiB + + + MiB + + + KiB + + + PiB + + + PB + + + MHz + + + GHz + + + Virtualizare + + + Ultima pornire + + + B + + + Limba Sistenului de Operare + + + Code Page + + + Detalii + + + Viteză Maximă CPU + + + Viteză Minimă CPU + + + Power + + + W + + + Dată baterie + + + Actual + + + A + + + Machine + + + Line frequency + + + Hz + + + Processes + + + running + + + sleeping + + + stopped + + + zombie + + + waiting + + + other + + + Dispozitive TB + + + Dispozitive I2C + + + Number of processors + + + Number of devices + + diff --git a/sources/language/ru.xml b/sources/language/ru.xml new file mode 100644 index 0000000..a21c231 --- /dev/null +++ b/sources/language/ru.xml @@ -0,0 +1,369 @@ + + + + + + СиÑÑ‚ÐµÐ¼Ð½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ + + + ÐžÐ±Ñ‰Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ + + + Ð˜Ð¼Ñ ÑиÑтемы + + + IP-Ð°Ð´Ñ€ÐµÑ + + + ВерÑÐ¸Ñ Ñдра + + + ÐžÐ¿ÐµÑ€Ð°Ñ†Ð¸Ð¾Ð½Ð½Ð°Ñ ÑиÑтема + + + Ð’Ñ€ÐµÐ¼Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ + + + Ðктивных пользователей + + + СреднÑÑ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ° + + + УÑтановленное оборудование + + + КоличеÑтво процеÑÑоров + + + Модель + + + ЧаÑтота процеÑÑора + + + ЧаÑтота ÑиÑтемной шины + + + Размер кÑша + + + ПроизводительноÑть в bogomips + + + PCI уÑтройÑтва + + + IDE уÑтройÑтва + + + SCSI уÑтройÑтва + + + USB уÑтройÑтва + + + ИÑпользование Ñети + + + УÑтройÑтво + + + Получено + + + Отправлено + + + Ошибки/ÐŸÐ°Ð´ÐµÐ½Ð¸Ñ + + + УÑтановлено Ñетевых подключений + + + ИÑпользование памÑти + + + ФизичеÑÐºÐ°Ñ Ð¿Ð°Ð¼Ñть + + + Файл подкачки + + + Смонтированные файловые ÑиÑтемы + + + Точка Ð¼Ð¾Ð½Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ + + + УÑтройÑтво + + + ИÑпользовано + + + Тип + + + Свободно + + + ЗанÑто + + + Общий размер + + + Ð’Ñего + + + кб + + + Мб + + + Гб + + + ОтÑутÑтвуют + + + ВмеÑтимоÑть + + + Шаблон + + + Язык + + + Применить + + + Сгенерировано Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ + + + дней + + + чаÑов + + + минут + + + Температура + + + ÐапрÑжение + + + ВентилÑторы + + + Значение + + + Минимум + + + МакÑимум + + + ГиÑÑ‚ÐµÑ€ÐµÐ·Ð¸Ñ + + + Лимит + + + Значение + + + C + + + F + + + Ð’ + + + Об/мин + + + Ядро + Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ + + + Буферы + + + КÑшировано + + + Перейти к + + + ИБП + + + Ðазвание + + + Модель + + + Режим + + + Ð’Ñ€ÐµÐ¼Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ + + + СоÑтоÑние + + + Переходы на батарею + + + Причина поÑледнего перехода + + + Ð’Ñ€ÐµÐ¼Ñ Ð¿Ð¾Ñледнего перехода + + + ÐапрÑжение Ñети + + + Ðагрузка + + + ÐапрÑжение батареи + + + Уровень зарÑда батареи + + + Ð’Ñ€ÐµÐ¼Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ на батареÑÑ… + + + Ð’ + + + мин. + + + Температура + + + TB + + + TiB + + + GiB + + + MiB + + + KiB + + + PiB + + + PB + + + MHz + + + GHz + + + Ð’Ð¸Ñ€Ñ‚ÑƒÐ°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ + + + СиÑтема загружена + + + B + + + Язык ÑиÑтемы + + + Кодировка Ñтраницы + + + Подробнее + + + МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ ÑкороÑть CPU + + + ÐœÐ¸Ð½Ð¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ ÑкороÑть CPU + + + МощноÑть + + + W + + + Дата батареи + + + Ток + + + A + + + Машина + + + ЧиÑтота Ñети + + + Гц + + + ПроцеÑÑÑ‹ + + + работают + + + ÑпÑÑ‚ + + + оÑтановлены + + + повиÑли + + + ждущие + + + Другое + + + TB уÑтройÑтва + + + I2C уÑтройÑтва + + + Number of processors + + + Number of devices + + diff --git a/sources/language/sk.xml b/sources/language/sk.xml new file mode 100644 index 0000000..372ef54 --- /dev/null +++ b/sources/language/sk.xml @@ -0,0 +1,369 @@ + + + + + + Informácie o systéme + + + Základ Systému + + + Kanonické Meno Hostiteľa + + + NaÄúvajúca IP + + + Verzia Jadra + + + Meno Distribúcie + + + ÄŒas od Spustenia + + + SúÄasný Užívatelia + + + Priemer ZaÅ¥aženia + + + Informácie o Hardware + + + Procesory + + + Model + + + RýchlosÅ¥ procesora + + + RýchlosÅ¥ zbernice + + + VeľkosÅ¥ cache + + + Bogomipy Systému + + + PCI Zariadenia + + + IDE Zariadenia + + + SCSI Zariadenia + + + USB Zariadenia + + + Využitie Siete + + + Zariadenie + + + Prijatých + + + Odoslaných + + + Chyby/Zahodené + + + Vytvorené SieÅ¥ove Spojenia + + + Využitie Pamäte + + + Fyzická Pamäť + + + Odkladací Priestor na Disku (Swap) + + + Pripojené Súborové Systémy + + + Miesto pripojenia + + + Partícia + + + Využitie + + + Typ + + + Voľné + + + Použité + + + VeľkosÅ¥ + + + Spolu + + + kB + + + MB + + + GB + + + niÄ + + + Kapacita + + + Predloha + + + Jazyk + + + OdoslaÅ¥ + + + Vytvorené s + + + dní + + + hodín + + + minút + + + Teplota + + + Voltáž + + + Ventilátory + + + Hodnota + + + Min + + + Max + + + Hysterézia + + + Limit + + + Názov + + + C + + + F + + + V + + + OZM(RPM) + + + Jadro + aplikácie + + + Buffery + + + Cache + + + SkoÄ na + + + UPS information + + + Name + + + Model + + + Mode + + + Started + + + Status + + + Outages + + + Last outage cause + + + Last outage timestamp + + + Line voltage + + + Load percent + + + Battery voltage + + + Battery charge + + + Time left on batteries + + + V + + + minutes + + + Temperature + + + TB + + + TiB + + + GiB + + + MiB + + + KiB + + + PiB + + + PB + + + MHz + + + GHz + + + Virtualization + + + Last boot + + + B + + + System Language + + + Code Page + + + Details + + + CPU Speed Max + + + CPU Speed Min + + + Power + + + W + + + Battery date + + + Current + + + A + + + Machine + + + Line frequency + + + Hz + + + Processes + + + running + + + sleeping + + + stopped + + + zombie + + + waiting + + + other + + + TB Zariadenia + + + I2C Zariadenia + + + Number of processors + + + Number of devices + + diff --git a/sources/language/sl.xml b/sources/language/sl.xml new file mode 100644 index 0000000..9e424ee --- /dev/null +++ b/sources/language/sl.xml @@ -0,0 +1,369 @@ + + + + + + Sistemske informacije + + + Stanje sistema + + + Gostitelj + + + IP naslov strežnika + + + Verzija jedra + + + Ime distribucije + + + ÄŒas neprekinjenega delovanja + + + Trenutni uporabniki + + + PovpreÄna obremenitev + + + Informacije o strojni opremi + + + Procesorji + + + Oznaka + + + Takt CPE + + + Hitrost vodila + + + Velikost predpomnilnika + + + BogoMIPS + + + PCI naprave + + + IDE naprave + + + SCSI naprave + + + USB naprave + + + Stanje omrežja + + + Naprava + + + Prejeto + + + Poslano + + + Napake/Zavrženo + + + Vzpostavljena omrežna povezava + + + Poraba pomnilnika + + + FiziÄni pomnilnik (RAM) + + + Izmenjalni pomnilnik (SWAP) + + + Vpeti datoteÄni sistemi + + + Priklopna toÄka + + + Particija + + + Poraba + + + Tip + + + Prosto + + + Porabljeno + + + Velikost + + + Skupaj + + + kB + + + MB + + + GB + + + brez + + + Kapaciteta + + + Shema + + + Jezik + + + Potrdi + + + Generirano s pomoÄjo + + + dni + + + ur + + + minut + + + Temperatura + + + Napetost + + + Ventilatorji + + + Vrednost + + + Min + + + Max + + + Histereza + + + Omejitev + + + Oznaka + + + C + + + F + + + V + + + RPM + + + Jedro + programje + + + Medpomnilniki + + + Predpomnjeno + + + SkoÄi na + + + UPS informacije + + + Ime + + + Oznaka + + + NaÄin + + + Zagnan + + + Stanje + + + Izpadi + + + Razlog zadnjega izpada + + + ÄŒas zadnjega izpada + + + Omrežna napetost + + + Obremenitev (%) + + + Napetost baterije + + + MoÄ baterije + + + ÄŒas do izpraznitve + + + V + + + min + + + Temparatura + + + TB + + + TiB + + + GiB + + + MiB + + + KiB + + + PiB + + + PB + + + MHz + + + GHz + + + Virtualizacija + + + Zadnji zagon + + + B + + + Sistemski jezik + + + Kodiranje + + + Podrobnosti + + + Takt CPE (max) + + + Takt CPE (min) + + + MoÄ + + + W + + + Battery date + + + Current + + + A + + + Machine + + + Line frequency + + + Hz + + + Processes + + + running + + + sleeping + + + stopped + + + zombie + + + waiting + + + other + + + TB naprave + + + I2C naprave + + + Number of processors + + + Number of devices + + diff --git a/sources/language/sv.xml b/sources/language/sv.xml new file mode 100644 index 0000000..628b63a --- /dev/null +++ b/sources/language/sv.xml @@ -0,0 +1,369 @@ + + + + + + Systeminformation + + + Allmän information + + + Värdnamn + + + IP-adress + + + Kernel Version + + + Dist Namn + + + Drifttid + + + Aktuella användare + + + Medelbelastning + + + HÃ¥rdvaruinformation + + + Processorer + + + Modell + + + Klockfrekvens + + + BUS-frekvens + + + Cachestorlek + + + Bogomips + + + PCI-enheter + + + IDE-enheter + + + SCSI-enheter + + + USB-enheter + + + Nätverksanvändning + + + Enheter + + + Mottaget + + + Skickat + + + Fel/Förlorat + + + Established Network Connections + + + Minnesanvändning + + + Fysiskt minne + + + Växlingsfil + + + Monterade filsystem + + + Monteringspunkt + + + Partition + + + Kapacitetsutnyttjande + + + Typ + + + Ledigt + + + Använt + + + Storlek + + + Totalt + + + kB + + + MB + + + GB + + + inga + + + Kapacitet + + + Mall + + + SprÃ¥k + + + Skicka + + + Skapad av + + + dagar + + + timmar + + + minuter + + + Temperature + + + Voltage + + + Fläktar + + + Värde + + + Min + + + Max + + + Hysteresis + + + Gräns + + + Label + + + C + + + F + + + V + + + RPM + + + Kernel + applications + + + Buffers + + + Cached + + + Hoppa till + + + UPS information + + + Name + + + Model + + + Mode + + + Started + + + Status + + + Outages + + + Last outage cause + + + Last outage timestamp + + + Line voltage + + + Load percent + + + Battery voltage + + + Battery charge + + + Time left on batteries + + + V + + + minutes + + + Temperature + + + TB + + + TiB + + + GiB + + + MiB + + + KiB + + + PiB + + + PB + + + MHz + + + GHz + + + Virtualization + + + Last boot + + + B + + + System Language + + + Code Page + + + Details + + + CPU Speed Max + + + CPU Speed Min + + + Power + + + W + + + Battery date + + + Current + + + A + + + Machine + + + Line frequency + + + Hz + + + Processes + + + running + + + sleeping + + + stopped + + + zombie + + + waiting + + + other + + + TB-enheter + + + I2C-enheter + + + Number of processors + + + Number of devices + + diff --git a/sources/language/th.xml b/sources/language/th.xml new file mode 100644 index 0000000..84e1f96 --- /dev/null +++ b/sources/language/th.xml @@ -0,0 +1,369 @@ + + + + + + รายละเอียดเครื่อง + + + ข้อมูลระบบ + + + ชื่อเครื่อง + + + ไอพี + + + Kernel Version + + + ระบบปà¸à¸´à¸šà¸±à¸•ิà¸à¸²à¸£ + + + เวลารวมใช้งาน + + + จำนวนผู้ใช้งานปัจจุบัน + + + Load Averages + + + ข้อมูลอุปà¸à¸£à¸“์ + + + โพรเซสเซอร์ + + + โมเดล + + + ความเร็ว ซีพียู + + + คาวมเร็ว บัส + + + ขนาดà¹à¸„ช + + + System Bogomips + + + อุปà¸à¸£à¸“์ PCI + + + อุปà¸à¸£à¸“์ IDE + + + อุปà¸à¸£à¸“์ SCSI + + + อุปà¸à¸£à¸“์ USB + + + à¸à¸²à¸£à¹ƒà¸Šà¹‰à¸‡à¸²à¸™ ระบบเน็ตเวิร์ค + + + อุปà¸à¸£à¸“์ + + + รับ + + + ส่ง + + + Err/Drop + + + Established Network Connections + + + à¸à¸²à¸£à¹ƒà¸Šà¹‰à¸‡à¸²à¸™ à¹à¸£à¸¡ + + + Physical Memory + + + Disk Swap + + + ข้อมูลà¸à¸²à¸£à¹ƒà¸Šà¹‰à¸‡à¸²à¸™ ฮาร์ดดิส + + + ไดรว์ + + + ตำà¹à¸«à¸™à¹ˆà¸‡ ดิส + + + à¸à¸²à¸£à¹ƒà¸Šà¹‰à¸‡à¸²à¸™ + + + ชนิด + + + คงเหลือ + + + ใช้งาน + + + ขนาด + + + รวม + + + kB + + + MB + + + GB + + + none + + + Capacity + + + เทมเพลท + + + ภาษา + + + ตà¸à¸¥à¸‡ + + + สร้างโดย + + + วัน + + + ชั่วโมง + + + นาที + + + อุณหภูมิ + + + Voltage + + + Fans + + + Value + + + ต่ำสุด + + + สูงสุด + + + Hysteresis + + + จำà¸à¸±à¸” + + + Label + + + C + + + F + + + V + + + RPM + + + Kernel + applications + + + Buffers + + + à¹à¸„ช + + + Jump to + + + ข้อมูล UPS + + + ชื่อ + + + โมเดล + + + โหมด + + + เริ่ม + + + สถานะ + + + Outages + + + Last outage cause + + + Last outage timestamp + + + Line voltage + + + Load percent + + + Battery voltage + + + Battery charge + + + Time left on batteries + + + V + + + minutes + + + Temperature + + + TB + + + TiB + + + GiB + + + MiB + + + KiB + + + PiB + + + PB + + + MHz + + + GHz + + + Virtualization + + + เวลาà¸à¸²à¸£à¸›à¸´à¸”เครื่องล่าสุด + + + B + + + System Language + + + Code Page + + + Details + + + CPU Speed Max + + + CPU Speed Min + + + Power + + + W + + + Battery date + + + Current + + + A + + + Machine + + + Line frequency + + + Hz + + + Processes + + + running + + + sleeping + + + stopped + + + zombie + + + waiting + + + other + + + อุปà¸à¸£à¸“์ TB + + + อุปà¸à¸£à¸“์ I2C + + + Number of processors + + + Number of devices + + diff --git a/sources/language/tr.xml b/sources/language/tr.xml new file mode 100644 index 0000000..5397fdc --- /dev/null +++ b/sources/language/tr.xml @@ -0,0 +1,369 @@ + + + + + + Sistem Bilgisi + + + System Özeti + + + Sunucu Adı + + + IP + + + Kernel Versiyon + + + Dağıtım Adı + + + Uptime + + + Aktif Kullanıcı + + + Yük Ortalamaları + + + Donanım Bilgisi + + + İşlemciler + + + Model + + + CPU Speed + + + BUS Speed + + + Cache Size + + + Sistem Bogomips + + + PCI Aygıtlar + + + IDE Aygıtlar + + + SCSI Aygıtlar + + + USB Aygıtlar + + + AÄŸ Kullanımı + + + Aygıt + + + Alındı + + + Yollandı + + + Err/Drop + + + Kurulan AÄŸ BaÄŸlantıları + + + Hafıza kullanımı + + + Fiziksel hafıza + + + Takas Alanı + + + BaÄŸlı dosya sistemleri + + + BaÄŸlamanoktası + + + Bölüm + + + Kullanım + + + Tip + + + BoÅŸ + + + Kullanım + + + Boyut + + + Toplam + + + kB + + + MB + + + GB + + + yok + + + Kapasite + + + Åžablon + + + Dil + + + Gönder + + + OluÅŸturan + + + gün + + + saat + + + dakika + + + Sıcaklık + + + Voltaj + + + Fans + + + Value + + + Min + + + Max + + + Hysteresis + + + Limit + + + Label + + + C + + + F + + + V + + + RPM + + + Kernel + applications + + + Buffers + + + Cached + + + Jump to + + + UPS bilgisi + + + Adı + + + Model + + + Mode + + + BaÅŸlangıç + + + Durum + + + Outages + + + Last outage cause + + + Last outage timestamp + + + Hat voltajı + + + Yük oranı + + + Batarya voltajı + + + Batarya ÅŸarj oranı + + + Batarya kalan süre + + + V + + + dakika + + + Sıcaklık + + + TB + + + TiB + + + GiB + + + MiB + + + KiB + + + PiB + + + PB + + + MHz + + + GHz + + + SanallaÅŸtırma + + + Son Açılış + + + B + + + System Language + + + Code Page + + + Details + + + CPU Speed Max + + + CPU Speed Min + + + Power + + + W + + + Battery date + + + Current + + + A + + + Machine + + + Line frequency + + + Hz + + + Processes + + + running + + + sleeping + + + stopped + + + zombie + + + waiting + + + other + + + TB Aygıtlar + + + I2C Aygıtlar + + + Number of processors + + + Number of devices + + diff --git a/sources/language/translation-plugin.xsd b/sources/language/translation-plugin.xsd new file mode 100644 index 0000000..d02773d --- /dev/null +++ b/sources/language/translation-plugin.xsd @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sources/language/translation.xsd b/sources/language/translation.xsd new file mode 100644 index 0000000..5686d31 --- /dev/null +++ b/sources/language/translation.xsd @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sources/language/tw.xml b/sources/language/tw.xml new file mode 100644 index 0000000..6131516 --- /dev/null +++ b/sources/language/tw.xml @@ -0,0 +1,369 @@ + + + + + + 系統資料 + + + 主è¦è³‡æ–™ + + + 主機å稱 + + + 連線 IP (Listen) + + + 核心版本 + + + Linux å稱 + + + é‹ä½œæ™‚é–“ + + + ç›®å‰çš„使用者 + + + å¹³å‡è² è· + + + 硬體資料 + + + 處ç†å™¨ + + + 型號 + + + CPU 速度 + + + BUS 速度 + + + å¿«å–å¤§å° + + + 系統 Bogomips + + + PCI 設備 + + + IDE 設備 + + + SCSI 設備 + + + USB 設備 + + + 網路使用率 + + + 設備 + + + 收到 + + + é€å‡º + + + 錯誤/訊號éºå¤± + + + 連çµç¶²è·¯ + + + 記憶使用率 + + + 實體記憶 + + + 硬碟備存 (Disk Swap) + + + 掛載檔案系統 + + + 掛載ä½ç½® + + + 硬碟分割 + + + 使用率 + + + 類型 + + + å¯ç”¨ + + + 已用 + + + å¤§å° + + + 總共 + + + kB + + + MB + + + GB + + + 沒有 + + + é™åˆ¶ + + + 佈景 + + + 語言 + + + é€å‡º + + + 建立於 + + + 天 + + + å°æ™‚ + + + åˆ†é˜ + + + 溫度 + + + 電壓 + + + 風扇 + + + 數值 + + + æœ€å° + + + 最大 + + + Hysteresis + + + é™åˆ¶ + + + 標籤 + + + C + + + F + + + V + + + RPM + + + 核心跟軟體 + + + ç·©è¡ + + + å¿«å– + + + 跳到 + + + é›»æºè³‡æ–™ + + + å稱 + + + 型號 + + + æ¨¡å¼ + + + 已啟動 + + + 狀態 + + + 中斷 + + + 上次中斷原因 + + + 上次中斷時間 + + + 線路電壓 + + + è² è·ç™¾åˆ†æ¯” + + + 電池電壓 + + + é›»æ± ç¸½é¡ + + + é›»ç£é¤˜é¡æ™‚é–“ + + + V + + + 分 + + + 溫度 + + + TB + + + TiB + + + GiB + + + MiB + + + KiB + + + PiB + + + PB + + + MHz + + + GHz + + + 虛擬化 + + + Last boot + + + B + + + System Language + + + Code Page + + + Details + + + CPU Speed Max + + + CPU Speed Min + + + Power + + + W + + + Battery date + + + Current + + + A + + + Machine + + + Line frequency + + + Hz + + + Processes + + + running + + + sleeping + + + stopped + + + zombie + + + waiting + + + other + + + TB 設備 + + + I2C 設備 + + + Number of processors + + + Number of devices + + diff --git a/sources/language/uk.xml b/sources/language/uk.xml new file mode 100644 index 0000000..fcf0832 --- /dev/null +++ b/sources/language/uk.xml @@ -0,0 +1,369 @@ + + + + + + СиÑтемна Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ + + + Загальна Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ + + + Ім'Ñ ÑиÑтеми + + + IP-адреÑа + + + ВерÑÑ–Ñ Ñдра + + + Ðазва діÑтрибутиву + + + Ð§Ð°Ñ Ñ€Ð¾Ð±Ð¾Ñ‚Ð¸ + + + КориÑтувачі + + + Середне Ð½Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ + + + Ðпаратні заÑоби + + + ПроцеÑори + + + Модель + + + ЧаÑтота + + + ЧаÑтота шини + + + Розмір кешу + + + Продуктивніть у Bogomips + + + PCI приÑтрої + + + IDE приÑтрої + + + SCSI приÑтрої + + + USB приÑтрої + + + ВикориÑÑ‚Ð°Ð½Ð½Ñ Ð¼ÐµÑ€ÐµÐ¶Ñ– + + + ПриÑтрій + + + Отримано + + + Відправлено + + + Err/Drop + + + Ð’Ñтановлені мережеві з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ + + + ВикориÑÑ‚Ð°Ð½Ð½Ñ Ð¿Ð°Ð¼'Ñті + + + Фізична пам'Ñть + + + Файл підкачки + + + Змонтовані файлові ÑиÑтеми + + + Точка Ð¼Ð¾Ð½Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ + + + Розділ диÑку + + + ВикориÑÑ‚Ð°Ð½Ð½Ñ + + + Тип + + + Вільно + + + ВикориÑтано + + + Розмір + + + Загальний розмір + + + Кб + + + Мб + + + Гб + + + ВідÑутні + + + ЄмкіÑть + + + Шаблон + + + Мова + + + Змінити + + + Згенеровано за допомогою + + + дні + + + години + + + хвилини + + + Температура + + + Ðапруга + + + Кулери + + + Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ + + + Мінімум + + + МакÑимум + + + ГіÑÑ‚ÐµÑ€ÐµÐ·Ð¸Ñ + + + Ліміт + + + Ðазва + + + C + + + F + + + Ð’ + + + RPM + + + Ядро + програми + + + Буфери + + + Закешовано + + + Перейти до + + + ДБЖ + + + Ім'Ñ + + + Модель + + + Режим + + + Ð§Ð°Ñ Ð²Ð²Ñ–Ð¼ÐºÐ½ÐµÐ½Ð½Ñ + + + Стан + + + КількіÑть переходів на батарею + + + Причина оÑтаннього переходу + + + ЧаÑÑ‚ оÑтаннього переходу + + + Ðапруга мережі + + + ÐÐ°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ + + + Ðапруга батареї + + + Рівень зарÑду батареї + + + Ð§Ð°Ñ Ñ€Ð¾Ð±Ð¾Ñ‚Ð¸ на батареÑÑ… + + + Ð’ + + + мін. + + + Температура + + + TB + + + TiB + + + GiB + + + MiB + + + KiB + + + PiB + + + PB + + + MHz + + + GHz + + + Virtualization + + + Last boot + + + B + + + System Language + + + Code Page + + + Докладніше + + + CPU Speed Max + + + CPU Speed Min + + + Power + + + W + + + Battery date + + + Current + + + A + + + Machine + + + Line frequency + + + Hz + + + Processes + + + running + + + sleeping + + + stopped + + + zombie + + + waiting + + + other + + + TB приÑтрої + + + I2C приÑтрої + + + Number of processors + + + Number of devices + + diff --git a/sources/language/zh.xml b/sources/language/zh.xml new file mode 100644 index 0000000..8343feb --- /dev/null +++ b/sources/language/zh.xml @@ -0,0 +1,369 @@ + + + + + + ç³»ç»Ÿä¿¡æ¯ + + + 主è¦ä¿¡æ¯ + + + 主机åç§° + + + 监å¬IP + + + 内核版本 + + + å‘行版åç§° + + + è¿è¡Œæ—¶é—´ + + + 当å‰ç”¨æˆ· + + + å¹³å‡è´Ÿè½½ + + + ç¡¬ä»¶ä¿¡æ¯ + + + 处ç†å™¨ + + + åž‹å· + + + CPU 速度 + + + BUS 速度 + + + ç¼“å­˜å¤§å° + + + 系统 Bogomips + + + PCI 设备 + + + IDE 设备 + + + SCSI 设备 + + + USB 设备 + + + 网络使用率 + + + 设备 + + + 已接收 + + + å·²å‘é€ + + + 错误/丢包 + + + 网络链接 + + + 内存使用率 + + + 物ç†å†…å­˜ + + + ç£ç›˜äº¤æ¢åŒº + + + 已挂载文件系统 + + + 挂载ä½ç½® + + + 硬盘分区 + + + 使用率 + + + 类型 + + + å¯ç”¨ + + + 已用 + + + å¤§å° + + + 总共 + + + kB + + + MB + + + GB + + + 没有 + + + é™åˆ¶ + + + 主题 + + + 语言 + + + æäº¤ + + + 创建于 + + + 天 + + + å°æ—¶ + + + 分钟 + + + 温度 + + + 电压 + + + 风扇 + + + 数值 + + + æœ€å° + + + 最大 + + + æ»žåŽ + + + é™åˆ¶ + + + 标签 + + + C + + + F + + + V + + + RPM + + + 内核与应用 + + + 缓冲 + + + 缓存 + + + 跳转到 + + + 电æºä¿¡æ¯ + + + åç§° + + + åž‹å· + + + æ¨¡å¼ + + + å·²å¯åЍ + + + çŠ¶æ€ + + + 中断 + + + 上次中断原因 + + + 上次中断时间 + + + 线路电压 + + + 负载百分比 + + + 电池电压 + + + ç”µæ± ç‚¹äº®æ€»é¢ + + + 电池剩余时间 + + + V + + + 分 + + + 温度 + + + TB + + + TiB + + + GiB + + + MiB + + + KiB + + + PiB + + + PB + + + MHz + + + GHz + + + 虚拟化 + + + 上次å¯åЍ + + + B + + + 系统语言 + + + ç³»ç»Ÿç¼–ç  + + + è¯¦ç»†ä¿¡æ¯ + + + CPU Speed Max + + + CPU Speed Min + + + Power + + + W + + + Battery date + + + Current + + + A + + + Machine + + + Line frequency + + + Hz + + + Processes + + + running + + + sleeping + + + stopped + + + zombie + + + waiting + + + other + + + TB 设备 + + + I2C 设备 + + + Number of processors + + + Number of devices + + diff --git a/sources/phpsysinfo.ini.new b/sources/phpsysinfo.ini.new new file mode 100644 index 0000000..bb52b05 --- /dev/null +++ b/sources/phpsysinfo.ini.new @@ -0,0 +1,641 @@ +; PSI Config File +; +; @category PHP +; @package PSI +; @author Michael Cramer +; @copyright 2009 phpSysInfo +; @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License +; @version SVN: $Id: phpsysinfo.ini.new 705 2012-11-11 00:33:29Z namiltd $ +; @link http://phpsysinfo.sourceforge.net + +[main] +; ******************************** +; MAIN PARAMETERS +; ******************************** + +; Turn on debugging of some functions and include errors and warnings in xml and provide a popup for displaying errors +; - false : no debug information are stored in xml or displayed +; - true : debug information stored in xml and displayed *be careful if set this to true, may include sensitive information from your pc* +; +DEBUG=false + +; Turn on logging/unlogging of functions executeProgram() and rfts() +; example : executeProgram () and rfts () record the results to the "/tmp/phpsysinfo.log" file +; LOG="/tmp/phpsysinfo.log" +; example : executeProgram () and rfts () read the results from the "/tmp/phpsysinfo.log" file +; LOG="-/tmp/phpsysinfo.log" +; example : executeProgram () and rfts () read the results from the "/tmp/phpsysinfo.log" file +; LOG="+/tmp/phpsysinfo.log", if lack in the log file it runs normally +; +LOG=false + +; Turn on/off compression for JavaScript file +; - JS_COMPRESSION=false //no compression (recommended with slow processor) +; - JS_COMPRESSION="None" //code minimizing +; - JS_COMPRESSION="Normal" //code packing +; +JS_COMPRESSION="Normal" + +; Additional paths where to look for installed programs +; Example : ADD_PATHS="/opt/bin,/opt/sbin" +; +ADD_PATHS=false + +; List of IP addresses of clients authorized to run +; Example : ALLOWED="127.0.0.1,192.168.1.48" //allowed IP 127.0.0.1 and 192.168.1.48 +; ALLOWED=false //no IP checking +; +ALLOWED=false + +; Plugins that should be included in xml and output +; List of plugins should look like "plugin,plugin,plugin". See /plugins directory +; - PLUGINS="MDStatus,PS" //list of plugins +; - PLUGINS=false //no plugins +; included plugins: +; - MDStatus - show the raid status and whats currently going on +; - DMRaid - show the software raid status +; - PS - show a process tree of all running processes +; - PSStatus - show a graphical representation if a process is running or not +; - Quotas - show a table with all quotas that are active and there current state +; - SMART - show S.M.A.R.T. information from drives that support it +; - BAT - show battery state on a laptop +; - IPMIInfo - show IPMI status +; - UpdateNotifier - show update notifications (only for Ubuntu server) +; - SNMPPInfo - show printers info via SNMP +; - Uprecords - show uprecords info +; +PLUGINS=false + + +; ******************************** +; DISPLAY PARAMETERS +; ******************************** + + +; Define the default display mode +; auto: let user browser choose the mode +; dynamic: use javascript to refresh data +; static: static page (use metatag to reload page) +; bootstrap: use twitter bootstrap template +; +DEFAULT_DISPLAY_MODE="auto" + + +; Define the default language +; +DEFAULT_LANG="en" + + +; Define the default template +; +DEFAULT_TEMPLATE="phpsysinfo" + + +; Define the default template for frontend "bootstrap" +; +DEFAULT_BOOTSTRAP_TEMPLATE="phpsysinfo" + + +; Show or hide language picklist +; +SHOW_PICKLIST_LANG=true + + +; Show or hide template picklist +; +SHOW_PICKLIST_TEMPLATE=true + + +; Show CPU list expanded +; +SHOW_CPULIST_EXPANDED=true + + +; Show CPU info expanded +; +SHOW_CPUINFO_EXPANDED=false + + +; Show memory infos expanded +; +SHOW_MEMORY_INFOS_EXPANDED=false + + +; Define the interval for refreshing data in ms +; - 0 : disabled +; - 1000 : 1 second +; Default is 60 seconds +; +REFRESH=60000 + + +; Show a graph for current cpuload +; - true : displayed, but it's a performance hit (because we have to wait to get a value, 1 second) +; - false : will not be displayed +; +LOAD_BAR=false + + +; Display the virtual host name and address +; - Default is canonical host name and address +; - Use USE_VHOST=true to display virtual host name. +; +USE_VHOST=false + + +; Controls the units & format for network, memory and filesystem +; - 1 KiB = 2^10 bytes = 1,024 bytes +; - 1 KB = 10^3 bytes = 1,000 bytes +; - "B" everything is in Byte +; - "PiB" everything is in PeBiByte +; - "TiB" everything is in TeBiByte +; - "GiB" everything is in GiBiByte +; - "MiB" everything is in MeBiByte +; - "KiB" everything is in KiBiByte +; - "auto_binary" everything is automatic done if value is to big for, e.g MiB then it will be in GiB +; - "PB" everything is in PetaByte +; - "TB" everything is in TeraByte +; - "GB" everything is in GigaByte +; - "MB" everything is in MegaByte +; - "KB" everything is in KiloByte +; - "auto_decimal" everything is automatic done if value is to big for, e.g MB then it will be in GB +; +BYTE_FORMAT="auto_binary" + + +; Format in which temperature is displayed +; - "c" shown in celsius +; - "f" shown in fahrenheit +; - "c-f" both shown first celsius and fahrenheit in braces +; - "f-c" both shown first fahrenheit and celsius in braces +; +TEMP_FORMAT="c" + + +; ******************************** +; SENSORS PARAMETERS +; ******************************** + + +; Define the motherboard monitoring program +; We support the following programs far +; - HDDtemp http://www.guzu.net/linux/hddtemp.php (Linux) +; - LMSensors http://www.lm-sensors.org/ (Linux) +; - Healthd http://healthd.thehousleys.net/ (FreeBSD) +; - HWSensors http://www.openbsd.org/ (OpenBSD) +; - MBMon http://www.nt.phys.kyushu-u.ac.jp/shimizu/download/download.html (FreeBSD/Linux/NetBSD/OpenBSD) +; - MBM5 http://mbm.livewiredev.com/ (data from file data/MBM5.csv - WinNT) +; - Coretemp No addon tool neded (FreeBSD/Linux) +; - IPMI http://openipmi.sourceforge.net/ (Linux) +; - FreeIPMI http://www.gnu.org/software/freeipmi/ (FreeBSD/Linux/OpenBSD/SunOS) +; - IPMIutil http://ipmiutil.sourceforge.net/ (Darwin/FreeBSD/Linux/SunOS/WinNT) +; - K8Temp http://hur.st/k8temp/ (DragonFly/FreeBSD/NetBSD/OpenBSD) +; - PiTemp No addon tool neded (Raspberry Pi and Banana Pi - Linux) +; - OHM http://openhardwaremonitor.org/ (WinNT) +; - ThermalZone No addon tool neded (WinNT/Linux/Android) +; - QTSsnmp SNMP service enabled and snmp-utils package installed: opkg install snmp-utils (QNAP - QTS Linux) +; - Hwmon No addon tool neded (Linux) +; - SpeedFan http://www.almico.com/speedfan.php (required tool packaged in: tools/speedfan/SpeedFanGet_bin.zip) (WinNT) +; +; Example: If you want to use lmsensors : SENSOR_PROGRAM="LMSensors" +; If you want to use lmsensors and IPMI: SENSOR_PROGRAM="LMSensors,IPMI" +; +SENSOR_PROGRAM=false + +; Show events of sensors +; - true : show events +; - false : do not show events +; +SENSOR_EVENTS=true + +; Some sensors programs contain an additional configuration in the relevant sections [sensor_...] + + +; ******************************** +; FILESYSTEM PARAMETERS +; ******************************** + + +; Show mount point +; - true : show mount point +; - false : do not show mount point +; +SHOW_MOUNT_POINT=true + + +; Show mount option +; - true : show mount option +; - false : do not show mount option +; +SHOW_MOUNT_OPTION=true + + +; Show mount credentials +; - true : show mount credentials +; - false : do not show mount credentials +; +SHOW_MOUNT_CREDENTIALS=false + + +; Show inode usage +; - true : display used inodes in percent +; - false : hide them +; +SHOW_INODES=true + + +; Hide mounts +; Example : HIDE_MOUNTS="/home,/usr" +; +HIDE_MOUNTS="" + + +; Hide filesystem types +; Example : HIDE_FS_TYPES="tmpfs,devtmpfs,usbfs,bstfolder" +; +HIDE_FS_TYPES="" + + +; Hide partitions +; Example : HIDE_DISKS="rootfs,/dev/sda1" +; HIDE_DISKS=true //hide all partitions +; +HIDE_DISKS="" + + +; Filesystem usage warning threshold in percent +; - 0 : disabled +; - 90 : 90% +; Default is 90% +; +FS_USAGE_THRESHOLD=90 + + +; ******************************** +; NETWORK PARAMETERS +; ******************************** + + +; Hide network interfaces +; Example : HIDE_NETWORK_INTERFACE="eth0,sit0" +; HIDE_NETWORK_INTERFACE=true //hide all network interfaces +; +HIDE_NETWORK_INTERFACE="" + + +; Show network interfaces infos for Linux, Android, FreeBSD, NetBSD, OpenBSD, Haiku, Darwin, SunOS, Minix, QNX and WinNT +; Example : SHOW_NETWORK_INFOS=true +; +SHOW_NETWORK_INFOS=true + + +; Show network infos expanded +; +SHOW_NETWORK_INFOS_EXPANDED=false + + +; ******************************** +; UPS PARAMETERS +; ******************************** + + +; Define the ups monitoring program +; We support the following programs so far +; - Apcupsd http://www.apcupsd.com/ +; - Nut http://www.networkupstools.org/ +; - PowerSoftPlus http://ever.eu/ +; - pmset based on the result of the command "pmset -g batt" on Darwin system +; - SNMPups monitoring via Simple Network Management Protocol (SNMP) +; +; Example: If you want to use Apcupsd : UPS_PROGRAM="Apcupsd" +; If you want to use Apcupsd and Nut : UPS_PROGRAM="Apcupsd,Nut" +; +UPS_PROGRAM=false + + +; Apcupsd supports multiple UPSes +; You can specify comma delimited list in the form : or :. The defaults are: 127.0.0.1:3551 +; See the following parameters in apcupsd.conf: NETSERVER, NISIP, NISPORT +; It uses the defaults if not specified. +; +UPS_APCUPSD_LIST=false + + +; Apcupsd has a CGI monitoring utility called apcupsd-cgi +; You can set the parameter below to true if you have it installed - this will add apcupsd-cgi links to the UPS tree +; +UPS_APCUPSD_CGI_ENABLE=false + + +; Nut supports multiple UPSes +; You can specify comma delimited list in the form : or :. The defaults are: 127.0.0.1:3493 +; See the following parameters in upsd.conf: LISTEN +; It uses the defaults if not specified. +; +UPS_NUT_LIST=false + + +; SNMPups supports multiple UPSes +; You can specify comma delimited list in the form : or :. The default port is 161 +; List must be specified. +; +UPS_SNMPUPS_LIST=false + + +; define how to access the SNMP data +; - "php-snmp" execute php snmprealwalk function (php-snmp module must be installed) +; - "command" execute snmpwalk command +; +UPS_SNMPUPS_ACCESS="php-snmp" + + +; ******************************** +; SENSORS PROGRAMS PARAMETERS +; ******************************** + + +[sensor_hddtemp] +; Hddtemp motherboard monitoring program configuration +; +; If the hddtemp program is available we can read the temperature, if hdd is smart capable +; !!ATTENTION!! hddtemp might be a security issue +; - ACCESS="command" //read data from 'hddtemp' command (must be set suid) +; - ACCESS="tcp" //read data from hddtemp deamon (localhost:7634) +; +ACCESS="command" + +[sensor_lmsensors] +; LMSensors motherboard monitoring program configuration +; +; - ACCESS="command" //read data from 'sensors' command +; - ACCESS="data" //read data from file data/lmsensors.txt +; +ACCESS="command" + +[sensor_healthd] +; Healthd motherboard monitoring program configuration +; +; - ACCESS="command" //read data from 'healthdc' command +; - ACCESS="data" //read data from file data/healthd.txt +; +ACCESS="command" + +[sensor_mbmon] +; MBMon motherboard monitoring program configuration +; +; - ACCESS="command" //read data from 'mbmon -c 1 -r' command +; - ACCESS="data" //read data from file data/mbmon.txt +; - ACCESS="tcp" //read data from mbmon deamon (localhost:411) +; +ACCESS="command" + +[sensor_ipmi] +; IPMI motherboard monitoring program configuration +; +; - ACCESS="command" //read data from 'ipmitool sensor' command +; - ACCESS="data" //read data from file data/ipmi.txt +; +ACCESS="command" + +[sensor_freeipmi] +; FreeIPMI motherboard monitoring program configuration +; +; - ACCESS="command" //read data from 'ipmi-sensors --output-sensor-thresholds' program +; - ACCESS="data" //read data from file data/freeipmi.txt +; +ACCESS="command" + +[sensor_ipmiutil] +; IPMIutil motherboard monitoring program configuration +; +; - ACCESS="command" //read data from 'ipmiutil sensor -stw' command +; - ACCESS="data" //read data from file data/ipmiutil.txt +; +ACCESS="command" + +[sensor_k8temp] +; K8Temp motherboard monitoring program configuration +; +; - ACCESS="command" //read data from 'k8temp' command +; - ACCESS="data" //read data from file data/k8temp.txt +; +ACCESS="command" + +[sensor_speedfan] +; SpeedFan motherboard monitoring program configuration +; +; - ACCESS="command" //read data from 'speedfanget' command +; - ACCESS="data" //read data from file data/speedfan.txt +; +ACCESS="command" + + +; ******************************** +; PLUGINS PARAMETERS +; ******************************** + + +[bat] +; BAT Plugin configuration + +; define how to access the battery statistic data +; - "command" read data from /proc/acpi/battery/BAT0/info and /proc/acpi/battery/BAT0/state +; on newer kernel or on Android read files from /sys/class/power_supply/ + on Darwin read data from 'ioreg -w0 -l -n AppleSmartBattery -r' command + on FreeBSD read data from 'acpiconf -i batt' command + on OpenBSD read data from 'sysctl hw.sensors.acpibat0' command +; - "data" (a file must be available in the data directory of the phpsysinfo installation +; with the filename "bat_info.txt" and "bat_state.txt"; content is the output +; from "cat /proc/acpi/battery/BAT0/info" and "cat /proc/acpi/battery/BAT0/state") +; +ACCESS="command" + +; define the battery device (no matter for WinNT, FreeBSD, Darwin and some Android and Linux) +; +DEVICE="BAT0" + + +[ipmiinfo] +; ipmiinfo Plugin configuration + +; define how to access the IPMI statistic data +; - "command" ipmitool command is run everytime the block gets refreshed or build +; if access error execute first: chmod 666 /dev/ipmi0 +; - "data" (a file must be available in the data directory of the phpsysinfo installation +; with the filename "ipmiinfo.txt"; content is the output from "ipmitool sensor") +; +ACCESS="command" + + +[mdstatus] +; MDStatus Plugin configuration + +; define how to access the mdstat statistic data +; - "file" /proc/mdstat is read +; - "data" (a file must be available in the data directory of the phpsysinfo installation +; with the filename "mdstat.txt"; content is the output from "cat /proc/mdstat") +; +ACCESS="file" + +; Hide RAID devices +; Example : HIDE_RAID_DEVICES="md127" +; +HIDE_RAID_DEVICES="" + + +[dmraid] +; DMRaid Plugin configuration + +; define how to access the dmraid statistic data +; - "command" dmraid command is run everytime the block gets refreshed or build +; if access error try execute first: chmod 4755 /sbin/dmraid +; This method is not recommended for safety reasons! +; - "data" (a file must be available in the data directory of the phpsysinfo installation +; with the filename "dmraid.txt"; content is generated by command "dmraid -s -vv >dmraid.txt 2>&1") +; +ACCESS="command" + +; Hide RAID devices +; Example : HIDE_RAID_DEVICES=".ddf1_disks" +; +HIDE_RAID_DEVICES="" + + +[ps] +; PS Plugin configuration + +; define how to access the ps statistic data +; - "command" ps command is run everytime the block gets refreshed or build / on WINNT +; information is retrieved everytime through WMI +; - "data" (a file must be available in the data directory of the phpsysinfo installation +; with the filename "ps.txt"; content is the output from "ps -axo pid,ppid,pmem,args") +; +ACCESS="command" + +; Show kthreadd child list expanded +; +SHOW_KTHREADD_EXPANDED=true + + +[psstatus] +; PSStatus Plugin configuration + +; define how to access the psstatus statistic data +; - "command" pidof command is run everytime the block gets refreshed or build / on WINNT +; information is retrieved everytime through WMI +; - "data" a file must be available in the data directory of the phpsysinfo installation +; with the filename "psstatus.txt"; content is the output from +; for ps in "apache2" "mysqld" "sshd"; do echo $ps "|" `pidof -s $ps`; done +; +ACCESS="command" + +; Regular expression search in the process name (e.g. "ddclient.*") +; - true : Regular expression search (used pgrep command) +; - false : Normal search (used pidof command) +; +USE_REGEX=false + +; controls which processes are checked if they are running +; +; string contains a list of process names that are checked, names are seperated by a comma (on WINNT names must end with '.exe') +; +PROCESSES="mysqld, sshd, explorer.exe" + + +[quotas] +; Quotas Plugin configuration + +; define how to access the repquota statistic data +; - "command" repquota command is run everytime the block gets refreshed or build +; - "data" (a file must be available in the data directory of the phpsysinfo installation with the filename "quotas.txt"; content is the output from "repquota -au") +; +ACCESS="command" + + +[smart] +; SMART Plugin configuration + +; Smartctl program +; If the smartctl program is available we can read S.M.A.R.T informations +; - "command" smartctl command is run everytime the block gets refreshed or build +; if error: Smartctl open device: /dev/sda failed: Permission denied +; Not recommended method: +; execute: chmod 4755 /usr/sbin/smartctl +; - "data" (a file must be available in the data directory of the +; phpsysinfo installation with the filename "smart{disk_number}.txt"; +; content is the output from "smartctl --all device") +; +ACCESS="command" + +; Smartctl devices to monitor +; If the smartctl support is enabled, those disks information will be displayed +; - DEVICES="/dev/hda,/dev/hdb" //Will display those two disks informations +; You also can specify --device option value for smartctl command surrounded by parentheses eg: +; - DEVICES="(marvell)/dev/sda" +; or +; - DEVICES="(megaraid.0)/dev/sda" //comma in --device option value is replaced by a dot +; +DEVICES="/dev/sda, /dev/sdb" + +; Smartctl ID# and column name from "Vendor Specific SMART Attributes with Thresholds" table +; If the smartctl support is enabled, enter the ID#-COLUMN_NAME from "Vendor Specific SMART Attributes with Thresholds" table from smartctl output. +; or for no SCSI devices: ID#-COLUMN_NAME-REPLACEMENT_ID# where REPLACEMENT_ID# is an alternative ID number. +; COLUMN_NAME of this ID# will be displayed in the phpsysinfo S.M.A.R.T table. If you want RAW_VALUE to be displayed for the temperature (ID# 194) enter 194-RAW_VALUE +; - IDS="194-VALUE,4-VALUE,009-RAW_VALUE" //ID#-COLUMN_NAME, ID#-COLUMN_NAME, etc... +; +IDS="005-RAW_VALUE,194-RAW_VALUE,4-RAW_VALUE,009-RAW_VALUE,012-RAW_VALUE,193-RAW_VALUE-225,001-RAW_VALUE,007-RAW_VALUE,200-RAW_VALUE,197-RAW_VALUE,198-RAW_VALUE" + + +[snmppinfo] +; SNMPPInfo Plugin configuration + +; define how to access the SNMP Printer Info statistic data +; - "php-snmp" execute php snmprealwalk function (php-snmp module must be installed) +; - "command" execute snmpwalk command +; - "data" a file must be available in the data directory of the +; phpsysinfo installation with the filename "snmppinfo{printer_number}.txt"; +; content is the output from: +; LANG=C LC_ALL=C snmpwalk -On -c public -v 1 {printer_address} .1.3.6.1.2.1.1.5 > snmppinfo{printer_number}.txt +; LANG=C LC_ALL=C snmpwalk -On -c public -v 1 {printer_address} .1.3.6.1.2.1.43.11.1.1 >> snmppinfo{printer_number}.txt +; LANG=C LC_ALL=C snmpwalk -On -c public -v 1 {printer_address} .1.3.6.1.2.1.43.18.1.1 >> snmppinfo{printer_number}.txt +; +ACCESS="php-snmp" + +;define the Printer devices +; +; string contains a list of printer addresses that are checked +; +DEVICES="192.168.0.5, 192.168.0.9" + + +[updatenotifier] +; Update Notifier Plugin configuration + +; define the update info file format +; - true: Ubuntu Landscape format (file: /var/lib/update-notifier/updates-available) +; - false: universal format (format: A;B) +; A: total packages to update +; B: security packages to update +; +UBUNTU_LANDSCAPE_FORMAT=true + +; define the update info file +; +FILE="/var/lib/update-notifier/updates-available" + +[uprecords] +; Uprecords Plugin configuration + +; define how to access the uprecords statistic data +; - "command" uprecords command is run everytime the block gets refreshed or build +; if access error try execute first: chmod 4755 /usr/bin/uprecords +; This method is not recommended for safety reasons! +; - "data" (a file must be available in the data directory of the phpsysinfo installation +; with the filename "uprecords.txt"; content is the output from "TZ=GMT uprecords -a -w") +; +ACCESS="command" + +; define the maximum number of entries to show (for command access) +; default is 10 +; +MAX_ENTRIES = 10 diff --git a/sources/phpsysinfo.xslt b/sources/phpsysinfo.xslt new file mode 100644 index 0000000..0ae7528 --- /dev/null +++ b/sources/phpsysinfo.xslt @@ -0,0 +1,1206 @@ + + + + + + + + + + + <xsl:text>phpSysInfo</xsl:text> + + + + + + + +
    + +

    + + System information : + + + + ( + + + + ) + +

    +
    +
    + +

    + + System Vital + +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + Canonical Hostname + + + +
    + + Listening IP + + + +
    + + Kernel Version + + + +
    + + Distro Name + + + + + + file:/// + + + + + + + &nbsp; + + + &nbsp; + + +
    + + Uptime + + + + + + + Days + + + + + + Hours + + + + + + Minutes + +
    + + Current Users + + + +
    + + Load Averages + + + + + <br/> +
    + + &nbsp; + +
    +
    + + &nbsp; + + + + % + +
    +
    +
    + + System Language + + + +
    + + Code Page + + + +
    + + Processes + + + +
    +
    +
    +
    + +

    + + Hardware Information + +

    + + + + + + + + +
    + + Machine + + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + Processors + + + +
    + + Model + + + +
    + + CPU Speed + + + + + MHz + +
    + + CPU Speed Max + + + + + MHz + +
    + + CPU Speed Min + + + + + MHz + +
    + + Bus Speed + + + + + MHz + +
    + + Cache Size + + + + + KiB + +
    + + Virtualization + + + +
    + + System Bogomips + + + +
    + +
    + +

    + + PCI Devices + +

    + + + + + + +
    +
      + +
    • + +
    • +
      +
    +
    +
    + +

    + + IDE Devices + +

    + + + + + + +
    +
      + +
    • + + + + ( + + + + KiB) + + +
    • +
      +
    +
    +
    + +

    + + SCSI Devices + +

    + + + + + + +
    +
      + +
    • + + + + ( + + + + KiB) + + +
    • +
      +
    +
    +
    + +

    + + USB Devices + +

    + + + + + + +
    +
      + +
    • + +
    • +
      +
    +
    +
    + +

    + + TB Devices + +

    + + + + + + +
    +
      + +
    • + +
    • +
      +
    +
    +
    + +

    + + I2C Devices + +

    + + + + + + +
    +
      + +
    • + +
    • +
      +
    +
    +
    +
    +
    +
    + +

    + + Memory Usage + +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + Type + + + + Usage + + + + Free + + + + Used + + + + Size + +
    + + Physical Memory + + +
    + + &nbsp; + +
    +
    + + &nbsp; + + + + % + +
    +
    + + + KiB + + + + + KiB + + + + + KiB + +
    + + - Kernel + applications + + +
    + + &nbsp; + +
    +
    + + &nbsp; + + + + % + +
    +
    + + + + KiB + + +
    + + - Cached + + +
    + + &nbsp; + +
    +
    + + &nbsp; + + + + % + +
    +
    + + + + KiB + + +
    + + - Buffers + + +
    + + &nbsp; + +
    +
    + + &nbsp; + + + + % + +
    +
    + + + + KiB + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + Disk Swap + + +
    + + &nbsp; + +
    +
    + + &nbsp; + + + + % + +
    +
    + + + KiB + + + + + KiB + + + + + KiB + +
    + + - + + + +
    + + &nbsp; + +
    +
    + + &nbsp; + + + + % + +
    +
    + + + KiB + + + + + KiB + + + + + KiB + +
    +
    + +
    +
    +
    +

    + + Mounted Filesystems + +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + Mountpoint + + + + Type + + + + Partition + + + + Usage + + + + Free + + + + Used + + + + Size + +
    + + + + + + +
    + + &nbsp; + +
    +
    + + &nbsp; + + + + % + + + + ( + + + + + + %) + + +
    +
    + + + KiB + + + + + KiB + + + + + KiB + +
    +
    +
    +

    + + Network Usage + +

    + + + + + + + + + + + + + + + + + + + + + +
    + + Device + + + + Received + + + + Send + + + + Err/Drop + +
    + + + + + + + KiB + + + + &nbsp; + + + + + + KiB + + + + + / + + +
    +
    + +
    +
    +
    + + +
    +
    diff --git a/sources/phpsysinfo3.xsd b/sources/phpsysinfo3.xsd new file mode 100644 index 0000000..49207e6 --- /dev/null +++ b/sources/phpsysinfo3.xsd @@ -0,0 +1,464 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sources/plugins/bat/bat_bootstrap.html b/sources/plugins/bat/bat_bootstrap.html new file mode 100644 index 0000000..3d9e178 --- /dev/null +++ b/sources/plugins/bat/bat_bootstrap.html @@ -0,0 +1,70 @@ + diff --git a/sources/plugins/bat/class.bat.inc.php b/sources/plugins/bat/class.bat.inc.php new file mode 100644 index 0000000..30a6468 --- /dev/null +++ b/sources/plugins/bat/class.bat.inc.php @@ -0,0 +1,579 @@ +ConnectServer(); + + } else { + $_cim = $objLocatorCIM->ConnectServer($strHostname, 'root\CIMv2', $strHostname.'\\'.$strUser, $strPassword); + } + + // initialize the wmi object + $objLocatorWMI = new COM('WbemScripting.SWbemLocator'); + if ($strHostname == "") { + $_wmi = $objLocatorWMI->ConnectServer($strHostname, 'root\WMI'); + + } else { + $_wmi = $objLocatorWMI->ConnectServer($strHostname, 'root\WMI', $strHostname.'\\'.$strUser, $strPassword); + } + + } catch (Exception $e) { + $this->global_error->addError("WMI connect error", "PhpSysInfo can not connect to the WMI interface for security reasons.\nCheck an authentication mechanism for the directory where phpSysInfo is installed."); + } + $buffer_info = ''; + $buffer_state = ''; + $bufferWB = CommonFunctions::getWMI($_cim, 'Win32_Battery', array('EstimatedChargeRemaining', 'DesignVoltage', 'BatteryStatus', 'Chemistry')); + if (sizeof($bufferWB)>0) { + $capacity = ''; + if (isset($bufferWB[0]['EstimatedChargeRemaining'])) { + $capacity = $bufferWB[0]['EstimatedChargeRemaining']; + } + if (isset($bufferWB[0]['BatteryStatus'])) { + switch ($bufferWB[0]['BatteryStatus']) { + case 1: $batstat = 'Discharging'; break; + case 2: $batstat = 'AC connected'; break; + case 3: $batstat = 'Fully Charged'; break; + case 4: $batstat = 'Low'; break; + case 5: $batstat = 'Critical'; break; + case 6: $batstat = 'Charging'; break; + case 7: $batstat = 'Charging and High'; break; + case 8: $batstat = 'Charging and Low'; break; + case 9: $batstat = 'Charging and Critical'; break; + case 10: $batstat = 'Undefined'; break; + case 11: $batstat = 'Partially Charged'; break; + default: $batstat = ''; + } + if ($batstat != '') $buffer_state .= 'POWER_SUPPLY_STATUS='.$batstat."\n"; + } + $techn = ''; + if (isset($bufferWB[0]['Chemistry'])) { + switch ($bufferWB[0]['Chemistry']) { + case 1: $techn = 'Other'; break; + case 2: $techn = 'Unknown'; break; + case 3: $techn = 'PbAc'; break; + case 4: $techn = 'NiCd'; break; + case 5: $techn = 'NiMH'; break; + case 6: $techn = 'Li-ion'; break; + case 7: $techn = 'Zinc-air'; break; + case 8: $techn = 'Li-poly'; break; + } + } + $bufferWPB = CommonFunctions::getWMI($_cim, 'Win32_PortableBattery', array('DesignVoltage', 'Chemistry', 'DesignCapacity', 'FullChargeCapacity')); + if (isset($bufferWPB[0]['DesignVoltage'])) { + $buffer_info .= 'POWER_SUPPLY_VOLTAGE_MIN_DESIGN='.($bufferWPB[0]['DesignVoltage']*1000)."\n"; + } + // sometimes Chemistry from Win32_Battery returns 2 but Win32_PortableBattery returns e.g. 6 + if ((($techn == '') || ($techn == 'Unknown')) && isset($bufferWPB[0]['Chemistry'])) { + switch ($bufferWPB[0]['Chemistry']) { + case 1: $techn = 'Other'; break; + case 2: $techn = 'Unknown'; break; + case 3: $techn = 'PbAc'; break; + case 4: $techn = 'NiCd'; break; + case 5: $techn = 'NiMH'; break; + case 6: $techn = 'Li-ion'; break; + case 7: $techn = 'Zinc-air'; break; + case 8: $techn = 'Li-poly'; break; + } + } + if ($techn != '') $buffer_info .= 'POWER_SUPPLY_TECHNOLOGY='.$techn."\n"; + + $bufferBS = CommonFunctions::getWMI($_wmi, 'BatteryStatus', array('RemainingCapacity', 'Voltage')); + if (sizeof($bufferBS)>0) { + if (isset($bufferBS[0]['RemainingCapacity']) && ($bufferBS[0]['RemainingCapacity']>0)) { + $buffer_state .= 'POWER_SUPPLY_ENERGY_NOW='.($bufferBS[0]['RemainingCapacity']*1000)."\n"; + $capacity = ''; + } + if (isset($bufferBS[0]['Voltage']) && ($bufferBS[0]['Voltage']>0)) { + $buffer_state .= 'POWER_SUPPLY_VOLTAGE_NOW='.($bufferBS[0]['Voltage']*1000)."\n"; + } elseif (isset($bufferWB[0]['DesignVoltage'])) { + $buffer_state .= 'POWER_SUPPLY_VOLTAGE_NOW='.($bufferWB[0]['DesignVoltage']*1000)."\n"; + } + } + + if (!isset($bufferWPB[0]['FullChargeCapacity'])) { + $bufferBFCC = CommonFunctions::getWMI($_wmi, 'BatteryFullChargedCapacity', array('FullChargedCapacity')); + if ((sizeof($bufferBFCC)>0) && isset($bufferBFCC[0]['FullChargedCapacity'])) { + $bufferWPB[0]['FullChargeCapacity'] = $bufferBFCC[0]['FullChargedCapacity']; + } + } + if (isset($bufferWPB[0]['FullChargeCapacity'])) { + $buffer_info .= 'POWER_SUPPLY_ENERGY_FULL='.($bufferWPB[0]['FullChargeCapacity']*1000)."\n"; + if ($capacity != '') $buffer_state .= 'POWER_SUPPLY_ENERGY_NOW='.(round($capacity*$bufferWPB[0]['FullChargeCapacity']*10)."\n"); + if (isset($bufferWPB[0]['DesignCapacity']) && ($bufferWPB[0]['DesignCapacity']!=0)) + $buffer_info .= 'POWER_SUPPLY_ENERGY_FULL_DESIGN='.($bufferWPB[0]['DesignCapacity']*1000)."\n"; + } elseif (isset($bufferWPB[0]['DesignCapacity'])) { + $buffer_info .= 'POWER_SUPPLY_ENERGY_FULL_DESIGN='.($bufferWPB[0]['DesignCapacity']*1000)."\n"; + if ($capacity != '') $buffer_state .= 'POWER_SUPPLY_ENERGY_NOW='.(round($capacity*$bufferWPB[0]['DesignCapacity']*10)."\n"); + } else { + if ($capacity != '') $buffer_state .= 'POWER_SUPPLY_CAPACITY='.$capacity."\n"; + } + + $bufferBCC = CommonFunctions::getWMI($_wmi, 'BatteryCycleCount', array('CycleCount')); + if ((sizeof($bufferBCC)>0) && isset($bufferBCC[0]['CycleCount']) && ($bufferBCC[0]['CycleCount']>0)) { + $buffer_info .= 'POWER_SUPPLY_CYCLE_COUNT='.$bufferBCC[0]['CycleCount']."\n"; + } + } + } elseif (PSI_OS == 'Darwin') { + $buffer_info = ''; + $buffer_state = ''; + CommonFunctions::executeProgram('ioreg', '-w0 -l -n AppleSmartBattery -r', $buffer_info, false); + } elseif (PSI_OS == 'FreeBSD') { + $buffer_info = ''; + $buffer_state = ''; + CommonFunctions::executeProgram('acpiconf', '-i batt', $buffer_info, false); + } elseif (PSI_OS == 'OpenBSD') { + $buffer_info = ''; + $buffer_state = ''; + CommonFunctions::executeProgram('sysctl', 'hw.sensors.acpibat0', $buffer_info, false); + } else { + $buffer_info = ''; + $buffer_state = ''; + $bat_name = PSI_PLUGIN_BAT_DEVICE; + $rfts_bi = CommonFunctions::rfts('/proc/acpi/battery/'.$bat_name.'/info', $buffer_info, 0, 4096, false); + $rfts_bs = CommonFunctions::rfts('/proc/acpi/battery/'.$bat_name.'/state', $buffer_state, 0, 4096, false); + if (!$rfts_bi && !$rfts_bs) { + $buffer_info = ''; + $buffer_state = ''; + if (!CommonFunctions::rfts('/sys/class/power_supply/'.$bat_name.'/uevent', $buffer_info, 0, 4096, false)) { + if (CommonFunctions::rfts('/sys/class/power_supply/battery/uevent', $buffer_info, 0, 4096, false)) { + $bat_name = 'battery'; + } else { + CommonFunctions::rfts('/sys/class/power_supply/'.$bat_name.'/uevent', $buffer_info, 0, 4096, PSI_DEBUG); // Once again but with debug + } + } + if (CommonFunctions::rfts('/sys/class/power_supply/'.$bat_name.'/voltage_min_design', $buffer1, 1, 4096, false)) { + $buffer_state .= 'POWER_SUPPLY_VOLTAGE_MIN_DESIGN='.$buffer1."\n"; + } + if (CommonFunctions::rfts('/sys/class/power_supply/'.$bat_name.'/voltage_max_design', $buffer1, 1, 4096, false)) { + $buffer_state .= 'POWER_SUPPLY_VOLTAGE_MAX_DESIGN='.$buffer1."\n"; + } + if (CommonFunctions::rfts('/sys/class/power_supply/'.$bat_name.'/voltage_now', $buffer1, 1, 4096, false)) { + $buffer_state .= 'POWER_SUPPLY_VOLTAGE_NOW='.$buffer1."\n"; + } + if (CommonFunctions::rfts('/sys/class/power_supply/'.$bat_name.'/energy_full', $buffer1, 1, 4096, false)) { + $buffer_state .= 'POWER_SUPPLY_ENERGY_FULL='.$buffer1."\n"; + } + if (CommonFunctions::rfts('/sys/class/power_supply/'.$bat_name.'/energy_now', $buffer1, 1, 4096, false)) { + $buffer_state .= 'POWER_SUPPLY_ENERGY_NOW='.$buffer1."\n"; + } + if (CommonFunctions::rfts('/sys/class/power_supply/'.$bat_name.'/charge_full', $buffer1, 1, 4096, false)) { + $buffer_state .= 'POWER_SUPPLY_CHARGE_FULL='.$buffer1."\n"; + } + if (CommonFunctions::rfts('/sys/class/power_supply/'.$bat_name.'/charge_now', $buffer1, 1, 4096, false)) { + $buffer_state .= 'POWER_SUPPLY_CHARGE_NOW='.$buffer1."\n"; + } + if (CommonFunctions::rfts('/sys/class/power_supply/'.$bat_name.'/capacity', $buffer1, 1, 4096, false)) { + $buffer_state .= 'POWER_SUPPLY_CAPACITY='.$buffer1; + } + if (CommonFunctions::rfts('/sys/class/power_supply/'.$bat_name.'/technology', $buffer1, 1, 4096, false)) { + $buffer_state .= 'POWER_SUPPLY_TECHNOLOGY='.$buffer1; + } + if (CommonFunctions::rfts('/sys/class/power_supply/'.$bat_name.'/status', $buffer1, 1, 4096, false)) { + $buffer_state .= 'POWER_SUPPLY_STATUS='.$buffer1; + } + if (CommonFunctions::rfts('/sys/class/power_supply/'.$bat_name.'/batt_temp', $buffer1, 1, 4096, false)) { + $buffer_state .= 'POWER_SUPPLY_TEMP='.$buffer1; + } + if (CommonFunctions::rfts('/sys/class/power_supply/'.$bat_name.'/batt_vol', $buffer1, 1, 4096, false)) { + $buffer_state .= 'POWER_SUPPLY_VOLTAGE_NOW='.$buffer1; + } + if (CommonFunctions::rfts('/sys/class/power_supply/'.$bat_name.'/health', $buffer1, 1, 4096, false)) { + $buffer_state .= 'POWER_SUPPLY_HEALTH='.$buffer1; + } + } + } + break; + case 'data': + CommonFunctions::rfts(APP_ROOT."/data/bat_info.txt", $buffer_info); + CommonFunctions::rfts(APP_ROOT."/data/bat_state.txt", $buffer_state); + break; + default: + $this->global_error->addConfigError("__construct()", "PSI_PLUGIN_BAT_ACCESS"); + break; + } + $this->_filecontent['info'] = preg_split("/\n/", $buffer_info, -1, PREG_SPLIT_NO_EMPTY); + $this->_filecontent['state'] = preg_split("/\n/", $buffer_state, -1, PREG_SPLIT_NO_EMPTY); + } + + /** + * doing all tasks to get the required informations that the plugin needs + * result is stored in an internal array + * + * @return void + */ + public function execute() + { + if (empty($this->_filecontent)) { + return; + } + foreach ($this->_filecontent['info'] as $roworig) { + $roworig = trim($roworig); + if (preg_match('/^[dD]esign capacity:\s*(.*) (.*)$/', $roworig, $data)) { + $bat['design_capacity'] = $data[1]; + if (!isset($bat['capacity_unit'])) { + $bat['capacity_unit'] = trim($data[2]); + } elseif ($bat['capacity_unit'] != trim($data[2])) { + $bat['capacity_unit'] = "???"; + } + } elseif (preg_match('/^[lL]ast full capacity:\s*(.*) (.*)$/', $roworig, $data)) { + $bat['full_capacity'] = $data[1]; + if (!isset($bat['capacity_unit'])) { + $bat['capacity_unit'] = trim($data[2]); + } elseif ($bat['capacity_unit'] != trim($data[2])) { + $bat['capacity_unit'] = "???"; + } + } elseif (preg_match('/^cycle count:\s*(.*)$/', $roworig, $data) && ($data[1]>0)) { + $bat['cycle_count'] = $data[1]; + } elseif (preg_match('/^[dD]esign voltage:\s*(.*) (.*)$/', $roworig, $data)) { + if ($data[2]=="mV") { // uV or mV detection + $bat['design_voltage'] = $data[1]; + } else { + $bat['design_voltage'] = round($data[1]/1000); + } + } elseif (preg_match('/^battery type:\s*(.*)$/', $roworig, $data)) { + $bat['battery_type'] = $data[1]; + + } elseif (preg_match('/^POWER_SUPPLY_CYCLE_COUNT=(.*)$/', $roworig, $data) && ($data[1]>0)) { + $bat['cycle_count'] = $data[1]; + } elseif (preg_match('/^POWER_SUPPLY_VOLTAGE_MIN_DESIGN=(.*)$/', $roworig, $data)) { + if ($data[1]<100000) { // uV or mV detection + $bat['design_voltage'] = $data[1]; + } else { + $bat['design_voltage'] = round($data[1]/1000); + } + } elseif (preg_match('/^POWER_SUPPLY_VOLTAGE_MAX_DESIGN=(.*)$/', $roworig, $data)) { + if ($data[1]<100000) { // uV or mV detection + $bat['design_voltage_max'] = $data[1]; + } else { + $bat['design_voltage_max'] = round($data[1]/1000); + } + } elseif (preg_match('/^POWER_SUPPLY_ENERGY_FULL=(.*)$/', $roworig, $data)) { + $bat['full_capacity'] = ($data[1]/1000); + if (!isset($bat['capacity_unit'])) { + $bat['capacity_unit'] = "mWh"; + } elseif ($bat['capacity_unit'] != "mWh") { + $bat['capacity_unit'] = "???"; + } + } elseif (preg_match('/^POWER_SUPPLY_CHARGE_FULL=(.*)$/', $roworig, $data)) { + $bat['full_capacity'] = ($data[1]/1000); + if (!isset($bat['capacity_unit'])) { + $bat['capacity_unit'] = "mAh"; + } elseif ($bat['capacity_unit'] != "mAh") { + $bat['capacity_unit'] = "???"; + } + } elseif (preg_match('/^POWER_SUPPLY_ENERGY_NOW=(.*)$/', $roworig, $data)) { + if (!isset($bat['capacity_unit']) || ($bat['capacity_unit'] == "mWh")) { + $bat['capacity_unit'] = "mWh"; + $bat['remaining_capacity'] = ($data[1]/1000); + } + } elseif (preg_match('/^POWER_SUPPLY_CHARGE_NOW=(.*)$/', $roworig, $data)) { + if (!isset($bat['capacity_unit']) || ($bat['capacity_unit'] == "mAh")) { + $bat['capacity_unit'] = "mAh"; + $bat['remaining_capacity'] = ($data[1]/1000); + } + + /* auxiary */ + } elseif (preg_match('/^POWER_SUPPLY_ENERGY_FULL_DESIGN=(.*)$/', $roworig, $data)) { + $bat['design_capacity'] = ($data[1]/1000); + if (!isset($bat['capacity_unit'])) { + $bat['capacity_unit'] = "mWh"; + } elseif ($bat['capacity_unit'] != "mWh") { + $bat['capacity_unit'] = "???"; + } + } elseif (preg_match('/^POWER_SUPPLY_CHARGE_FULL_DESIGN=(.*)$/', $roworig, $data)) { + $bat['design_capacity'] = ($data[1]/1000); + if (!isset($bat['capacity_unit'])) { + $bat['capacity_unit'] = "mAh"; + } elseif ($bat['capacity_unit'] != "mAh") { + $bat['capacity_unit'] = "???"; + } + } elseif (preg_match('/^POWER_SUPPLY_VOLTAGE_NOW=(.*)$/', $roworig, $data)) { + if ($data[1]<100000) { // uV or mV detection + $bat['present_voltage'] = $data[1]; + } else { + $bat['present_voltage'] = round($data[1]/1000); + } + + } elseif (preg_match('/^POWER_SUPPLY_CAPACITY=(.*)$/', $roworig, $data)) { + $bat['capacity'] = $data[1]; + } elseif (preg_match('/^POWER_SUPPLY_TEMP=(.*)$/', $roworig, $data)) { + $bat['battery_temperature'] = $data[1]/10; + } elseif (preg_match('/^POWER_SUPPLY_TECHNOLOGY=(.*)$/', $roworig, $data)) { + $bat['battery_type'] = $data[1]; + } elseif (preg_match('/^POWER_SUPPLY_STATUS=(.*)$/', $roworig, $data)) { + $bat['charging_state'] = $data[1]; + } elseif (preg_match('/^POWER_SUPPLY_HEALTH=(.*)$/', $roworig, $data)) { + $bat['battery_condition'] = $data[1]; + + /* Darwin */ + } elseif (preg_match('/^"MaxCapacity"\s*=\s*(.*)$/', $roworig, $data)) { + $bat['full_capacity'] = $data[1]; + } elseif (preg_match('/^"CurrentCapacity"\s*=\s*(.*)$/', $roworig, $data)) { + $bat['remaining_capacity'] = $data[1]; + } elseif (preg_match('/^"Voltage"\s*=\s*(.*)$/', $roworig, $data)) { + $bat['present_voltage'] = $data[1]; + } elseif (preg_match('/^"BatteryType"\s*=\s*"(.*)"$/', $roworig, $data)) { + $bat['battery_type'] = $data[1]; + } elseif (preg_match('/^"Temperature"\s*=\s*(.*)$/', $roworig, $data)) { + if ($data[1]>0) $bat['battery_temperature'] = $data[1]/100; + } elseif (preg_match('/^"DesignCapacity"\s*=\s*(.*)$/', $roworig, $data)) { + $bat['design_capacity'] = $data[1]; + } elseif (preg_match('/^"CycleCount"\s*=\s*(.*)$/', $roworig, $data) && ($data[1]>0)) { + $bat['cycle_count'] = $data[1]; + /* auxiary */ + } elseif (preg_match('/^"FullyCharged"\s*=\s*Yes$/', $roworig, $data)) { + $bat['charging_state_f'] = true; + } elseif (preg_match('/^"IsCharging"\s*=\s*Yes$/', $roworig, $data)) { + $bat['charging_state_i'] = true; + } elseif (preg_match('/^"ExternalConnected"\s*=\s*Yes$/', $roworig, $data)) { + $bat['charging_state_e'] = true; + + /* FreeBSD */ + } elseif (preg_match('/^Type:\s*(.*)$/', $roworig, $data)) { + $bat['battery_type'] = $data[1]; + } elseif (preg_match('/^State:\s*(.*)$/', $roworig, $data)) { + $bat['charging_state'] = $data[1]; + } elseif (preg_match('/^Present voltage:\s*(.*) (.*)$/', $roworig, $data)) { + if ($data[2]=="mV") { // uV or mV detection + $bat['present_voltage'] = $data[1]; + } else { + $bat['present_voltage'] = round($data[1]/1000); + } + } elseif (preg_match('/^Voltage:\s*(.*) (.*)$/', $roworig, $data)) { + if ($data[2]=="mV") { // uV or mV detection + $bat['present_voltage'] = $data[1]; + } else { + $bat['present_voltage'] = round($data[1]/1000); + } + } elseif (preg_match('/^Remaining capacity:\s*(.*)%$/', $roworig, $data)) { + $bat['capacity'] = $data[1]; + + /* OpenBSD */ + } elseif (preg_match('/^hw.sensors.acpibat0.volt0=(.*) VDC \(voltage\)$/', $roworig, $data)) { + $bat['design_voltage'] = 1000*$data[1]; + } elseif (preg_match('/^hw.sensors.acpibat0.volt1=(.*) VDC \(current voltage\)$/', $roworig, $data)) { + $bat['present_voltage'] = 1000*$data[1]; + } elseif (preg_match('/^hw.sensors.acpibat0.watthour0=(.*) Wh \(last full capacity\)$/', $roworig, $data)) { + $bat['full_capacity'] = 1000*$data[1]; + if (!isset($bat['capacity_unit'])) { + $bat['capacity_unit'] = "mWh"; + } elseif ($bat['capacity_unit'] != "mWh") { + $bat['capacity_unit'] = "???"; + } + } elseif (preg_match('/^hw.sensors.acpibat0.watthour4=(.*) Wh \(design capacity\)$/', $roworig, $data)) { + $bat['design_capacity'] = 1000*$data[1]; + if (!isset($bat['capacity_unit'])) { + $bat['capacity_unit'] = "mWh"; + } elseif ($bat['capacity_unit'] != "mWh") { + $bat['capacity_unit'] = "???"; + } + } elseif (preg_match('/^hw.sensors.acpibat0.watthour3=(.*) Wh \(remaining capacity\)/', $roworig, $data)) { + $bat['remaining_capacity'] = 1000*$data[1]; + if (!isset($bat['capacity_unit'])) { + $bat['capacity_unit'] = "mWh"; + } elseif ($bat['capacity_unit'] != "mWh") { + $bat['capacity_unit'] = "???"; + } + } elseif (preg_match('/^hw.sensors.acpibat0.raw0=.* \((.*)\)/', $roworig, $data)) { + $bat['charging_state'] = $data[1]; + } + } + foreach ($this->_filecontent['state'] as $roworig) { + $roworig = trim($roworig); + if (preg_match('/^remaining capacity:\s*(.*) (.*)$/', $roworig, $data)) { + if (!isset($bat['capacity_unit']) || ($bat['capacity_unit'] == trim($data[2]))) { + $bat['capacity_unit'] = trim($data[2]); + $bat['remaining_capacity'] = $data[1]; + } + } elseif (preg_match('/^present voltage:\s*(.*) (.*)$/', $roworig, $data)) { + if ($data[2]=="mV") { // uV or mV detection + $bat['present_voltage'] = $data[1]; + } else { + $bat['present_voltage'] = round($data[1]/1000); + } + } elseif (preg_match('/^charging state:\s*(.*)$/', $roworig, $data)) { + $bat['charging_state'] = $data[1]; + + } elseif (preg_match('/^POWER_SUPPLY_VOLTAGE_MIN_DESIGN=(.*)$/', $roworig, $data)) { + if ($data[1]<100000) { // uV or mV detection + $bat['design_voltage'] = $data[1]; + } else { + $bat['design_voltage'] = round($data[1]/1000); + } + } elseif (preg_match('/^POWER_SUPPLY_VOLTAGE_MAX_DESIGN=(.*)$/', $roworig, $data)) { + if ($data[1]<100000) { // uV or mV detection + $bat['design_voltage_max'] = $data[1]; + } else { + $bat['design_voltage_max'] = round($data[1]/1000); + } + } elseif (preg_match('/^POWER_SUPPLY_ENERGY_FULL=(.*)$/', $roworig, $data)) { + $bat['full_capacity'] = ($data[1]/1000); + if (!isset($bat['capacity_unit'])) { + $bat['capacity_unit'] = "mWh"; + } elseif ($bat['capacity_unit'] != "mWh") { + $bat['capacity_unit'] = "???"; + } + } elseif (preg_match('/^POWER_SUPPLY_CHARGE_FULL=(.*)$/', $roworig, $data)) { + $bat['full_capacity'] = ($data[1]/1000); + if (!isset($bat['capacity_unit'])) { + $bat['capacity_unit'] = "mAh"; + } elseif ($bat['capacity_unit'] != "mAh") { + $bat['capacity_unit'] = "???"; + } + } elseif (preg_match('/^POWER_SUPPLY_ENERGY_NOW=(.*)$/', $roworig, $data)) { + if (!isset($bat['capacity_unit']) || ($bat['capacity_unit'] == "mWh")) { + $bat['capacity_unit'] = "mWh"; + $bat['remaining_capacity'] = ($data[1]/1000); + } + } elseif (preg_match('/^POWER_SUPPLY_CHARGE_NOW=(.*)$/', $roworig, $data)) { + if (!isset($bat['capacity_unit']) || ($bat['capacity_unit'] == "mAh")) { + $bat['capacity_unit'] = "mAh"; + $bat['remaining_capacity'] = ($data[1]/1000); + } + } elseif (preg_match('/^POWER_SUPPLY_VOLTAGE_NOW=(.*)$/', $roworig, $data)) { + if ($data[1]<100000) { // uV or mV detection + $bat['present_voltage'] = $data[1]; + } else { + $bat['present_voltage'] = round($data[1]/1000); + } + + } elseif (preg_match('/^POWER_SUPPLY_CAPACITY=(.*)$/', $roworig, $data)) { + $bat['capacity'] = $data[1]; + } elseif (preg_match('/^POWER_SUPPLY_TEMP=(.*)$/', $roworig, $data)) { + $bat['battery_temperature'] = $data[1]/10; + } elseif (preg_match('/^POWER_SUPPLY_TECHNOLOGY=(.*)$/', $roworig, $data)) { + $bat['battery_type'] = $data[1]; + } elseif (preg_match('/^POWER_SUPPLY_STATUS=(.*)$/', $roworig, $data)) { + $bat['charging_state'] = $data[1]; + } elseif (preg_match('/^POWER_SUPPLY_HEALTH=(.*)$/', $roworig, $data)) { + $bat['battery_condition'] = $data[1]; + } + } + + if (isset($bat)) $this->_result[0] = $bat; + } + + /** + * generates the XML content for the plugin + * + * @return SimpleXMLElement entire XML content for the plugin + */ + public function xml() + { + foreach ($this->_result as $bat_item) { + $xmlbat = $this->xml->addChild("Bat"); + if ((!isset($bat_item['remaining_capacity']) || (isset($bat_item['full_capacity']) && ($bat_item['full_capacity'] == 0))) && + isset($bat_item['capacity']) && ($bat_item['capacity']>=0)) { + if (isset($bat_item['capacity_unit']) && ($bat_item['capacity_unit'] !== "???") + && (isset($bat_item['full_capacity']) && ($bat_item['full_capacity'] > 0))) { + $xmlbat->addAttribute("CapacityUnit", $bat_item['capacity_unit']); + $xmlbat->addAttribute("RemainingCapacity", round($bat_item['capacity']*$bat_item['full_capacity']/100)); + $xmlbat->addAttribute("FullCapacity", $bat_item['full_capacity']); + if (isset($bat_item['design_capacity'])) { + $xmlbat->addAttribute("DesignCapacity", $bat_item['design_capacity']); + } + } else { + $xmlbat->addAttribute("FullCapacity", 100); + $xmlbat->addAttribute("RemainingCapacity", $bat_item['capacity']); + $xmlbat->addAttribute("CapacityUnit", "%"); + } + } else { + if (isset($bat_item['full_capacity'])) { + if (isset($bat_item['design_capacity'])) { + $xmlbat->addAttribute("DesignCapacity", $bat_item['design_capacity']); + } + $xmlbat->addAttribute("FullCapacity", $bat_item['full_capacity']); + } elseif (isset($bat_item['design_capacity'])) { + $xmlbat->addAttribute("FullCapacity", $bat_item['design_capacity']); + } + if (isset($bat_item['remaining_capacity'])) { + $xmlbat->addAttribute("RemainingCapacity", $bat_item['remaining_capacity']); + } + if (isset($bat_item['capacity_unit'])) { + $xmlbat->addAttribute("CapacityUnit", $bat_item['capacity_unit']); + } + } + if (isset($bat_item['design_voltage'])) { + $xmlbat->addAttribute("DesignVoltage", $bat_item['design_voltage']); + if (isset($bat_item['design_voltage_max']) && ($bat_item['design_voltage_max'] != $bat_item['design_voltage'])) { + $xmlbat->addAttribute("DesignVoltageMax", $bat_item['design_voltage_max']); + } + } elseif (isset($bat_item['design_voltage_max'])) { + $xmlbat->addAttribute("DesignVoltage", $bat_item['design_voltage_max']); + } + if (isset($bat_item['present_voltage'])) { + $xmlbat->addAttribute("PresentVoltage", $bat_item['present_voltage']); + } + if (isset($bat_item['charging_state'])) { + $xmlbat->addAttribute("ChargingState", $bat_item['charging_state']); + } else { + if (isset($bat_item['charging_state_i'])) { + $xmlbat->addAttribute("ChargingState", 'Charging'); + } elseif (!isset($bat_item['charging_state_e'])) { + $xmlbat->addAttribute("ChargingState", 'Discharging'); + } elseif (isset($bat_item['charging_state_f'])) { + $xmlbat->addAttribute("ChargingState", 'Fully Charged'); + } else { + $xmlbat->addAttribute("ChargingState", 'Unknown state'); + } + } + if (isset($bat_item['battery_type'])) { + $xmlbat->addAttribute("BatteryType", $bat_item['battery_type']); + } + if (isset($bat_item['battery_temperature'])) { + $xmlbat->addAttribute("BatteryTemperature", $bat_item['battery_temperature']); + } + if (isset($bat_item['battery_condition'])) { + $xmlbat->addAttribute("BatteryCondition", $bat_item['battery_condition']); + } + if (isset($bat_item['cycle_count'])) { + $xmlbat->addAttribute("CycleCount", $bat_item['cycle_count']); + } + } + + return $this->xml->getSimpleXmlElement(); + } +} diff --git a/sources/plugins/bat/js/bat.js b/sources/plugins/bat/js/bat.js new file mode 100644 index 0000000..8a07c52 --- /dev/null +++ b/sources/plugins/bat/js/bat.js @@ -0,0 +1,179 @@ +/*************************************************************************** + * Copyright (C) 2008 by phpSysInfo - A PHP System Information Script * + * http://phpsysinfo.sourceforge.net/ * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +// +// $Id: bat.js 661 2012-08-27 11:26:39Z namiltd $ +// + +/*global $, jQuery, buildBlock, datetime, plugin_translate, genlang, createBar */ + +"use strict"; + +var bat_show = false, bat_table; +/** + * insert content into table + * @param {jQuery} xml plugin-XML + */ +function bat_populate(xml) { + + bat_table.fnClearTable(); + + $("Plugins Plugin_BAT Bat", xml).each(function bat_getitem(idp) { + var DesignCapacity = "", FullCapacity = "", Capacity = "", DesignVoltage = "", BatteryType = "",RemainingCapacity = "", PresentVoltage = "", ChargingState = "", BatteryTemperature = "", BatteryCondition = "", CapacityUnit = "", CycleCount = "", DesignVoltageMax = ""; + DesignCapacity = $(this).attr("DesignCapacity"); + FullCapacity = $(this).attr("FullCapacity"); + DesignVoltage = $(this).attr("DesignVoltage"); + BatteryType = $(this).attr("BatteryType"); + RemainingCapacity = $(this).attr("RemainingCapacity"); + PresentVoltage = $(this).attr("PresentVoltage"); + ChargingState = $(this).attr("ChargingState"); + BatteryTemperature = $(this).attr("BatteryTemperature"); + BatteryCondition = $(this).attr("BatteryCondition"); + CapacityUnit = $(this).attr("CapacityUnit"); + CycleCount = $(this).attr("CycleCount"); + DesignVoltageMax = $(this).attr("DesignVoltageMax"); + + if (CapacityUnit == undefined) { + CapacityUnit = "mWh"; + } + + if ((CapacityUnit == "%") && (RemainingCapacity != undefined)) { + bat_table.fnAddData([genlang(4, false, "BAT"), createBar(round(parseInt(RemainingCapacity, 10),0)), ' ']); + } else { + if (DesignCapacity != undefined) { + bat_table.fnAddData([genlang(3, false, "BAT"), DesignCapacity+' '+CapacityUnit, ' ']); + } + if (FullCapacity == undefined) { + if (RemainingCapacity != undefined) bat_table.fnAddData([genlang(4, false, "BAT"), RemainingCapacity+' '+CapacityUnit, ' ']); + } else { + if (DesignCapacity == undefined) { + bat_table.fnAddData([genlang(14, false, "BAT"), FullCapacity+' '+CapacityUnit, ' ']); + } else { + bat_table.fnAddData([genlang(14, false, "BAT"), FullCapacity+' '+CapacityUnit, createBar(parseInt(DesignCapacity, 10) != 0 ? round(parseInt(FullCapacity, 10) / parseInt(DesignCapacity, 10) * 100, 0) : 0)]); + } + if (RemainingCapacity != undefined) bat_table.fnAddData([genlang(4, false, "BAT"), RemainingCapacity+' '+CapacityUnit, createBar(parseInt(FullCapacity, 10) != 0 ? round(parseInt(RemainingCapacity, 10) / parseInt(FullCapacity, 10) * 100, 0) : 0)]); + } + } + if (ChargingState != undefined) { + bat_table.fnAddData([genlang(9, false, "BAT"), ChargingState, ' ']); + } + if (DesignVoltage != undefined) { + if (DesignVoltageMax != undefined) { + bat_table.fnAddData([genlang(5, false, "BAT"), DesignVoltage+' mV', DesignVoltageMax+' mV']); + } else { + bat_table.fnAddData([genlang(5, false, "BAT"), DesignVoltage+' mV', ' ']); + } + } else if (DesignVoltageMax != undefined) { + bat_table.fnAddData([genlang(5, false, "BAT"), DesignVoltageMax+' mV', ' ']); + } + if (PresentVoltage != undefined) { + bat_table.fnAddData([genlang(6, false, "BAT"), PresentVoltage+' mV', ' ']); + } + if (BatteryType != undefined) { + bat_table.fnAddData([genlang(10, false, "BAT"), BatteryType, ' ']); + } + if (BatteryTemperature != undefined) { + bat_table.fnAddData([genlang(11, false, "BAT"), formatTemp(BatteryTemperature, xml), ' ']); + } + if (BatteryCondition != undefined) { + bat_table.fnAddData([genlang(12, false, "BAT"), BatteryCondition, ' ']); + } + if (CycleCount != undefined) { + bat_table.fnAddData([genlang(13, false, "BAT"), CycleCount, ' ']); + } + + bat_show = true; + }); +} + +/** + * fill the plugin block with table structure + */ +function bat_buildTable() { + var html = ""; + + html += "\n"; + html += " \n"; + html += " \n"; + html += " \n"; + html += " \n"; + html += " \n"; + html += " \n"; + html += " \n"; + html += " \n"; + html += " \n"; + html += "
    " + genlang(7, false, "BAT") + "" + genlang(8, false, "BAT") + " 
    \n"; + + $("#Plugin_BAT").append(html); + +} + +/** + * load the xml via ajax + */ +function bat_request() { + $("#Reload_BATTable").attr("title", "reload"); + $.ajax({ + url: "xml.php?plugin=BAT", + dataType: "xml", + error: function bat_error() { + $.jGrowl("Error loading XML document for Plugin BAT!"); + }, + success: function bat_buildblock(xml) { + populateErrors(xml); + bat_populate(xml); + if (bat_show) { + plugin_translate("BAT"); + $("#Plugin_BAT").show(); + } + } + }); +} + +$(document).ready(function bat_buildpage() { + $("#footer").before(buildBlock("BAT", 1, true)); + $("#Plugin_BAT").css("width", "451px"); + + bat_buildTable(); + + bat_table = $("#Plugin_BATTable").dataTable({ + "bPaginate": false, + "bLengthChange": false, + "bFilter": false, + "bSort": false, + "bInfo": false, + "bProcessing": true, + "bAutoWidth": false, + "bStateSave": true, + "aoColumns": [{ + "sType": 'span-string' + }, { + "sType": 'span-string' + }, { + "sType": 'span-string' + }] + }); + + bat_request(); + + $("#Reload_BATTable").click(function bat_reload(id) { + bat_request(); + $(this).attr("title", datetime()); + }); +}); diff --git a/sources/plugins/bat/js/bat_bootstrap.js b/sources/plugins/bat/js/bat_bootstrap.js new file mode 100644 index 0000000..ad6d457 --- /dev/null +++ b/sources/plugins/bat/js/bat_bootstrap.js @@ -0,0 +1,89 @@ +function renderPlugin_bat(data) { + + var directives = { + DesignCapacity: { + html: function () { + var CapacityUnit = (this["CapacityUnit"] !== undefined) ? this["CapacityUnit"] : 'mWh'; + return this["DesignCapacity"] + String.fromCharCode(160) + CapacityUnit; + } + }, + FullCapacity: { + html: function () { + var CapacityUnit = (this["CapacityUnit"] !== undefined) ? this["CapacityUnit"] : 'mWh'; + return this["FullCapacity"] + String.fromCharCode(160) + CapacityUnit; + } + }, + FullCapacityBar: { + html: function () { + var CapacityUnit = (this["CapacityUnit"] !== undefined) ? this["CapacityUnit"] : 'mWh'; + if (( CapacityUnit !== "%" ) && (this["DesignCapacity"] !== undefined)){ + var percent = (this["DesignCapacity"] != 0) ? round(100*this["FullCapacity"]/this["DesignCapacity"],0) : 0; + return '
    ' + + '
    ' + percent + '%
    '; + } else { + return ''; + } + } + }, + RemainingCapacity: { + html: function () { + var CapacityUnit = (this["CapacityUnit"] !== undefined) ? this["CapacityUnit"] : 'mWh'; + if ( CapacityUnit === "%" ) { + return '
    ' + + '
    ' + round(this["RemainingCapacity"],0) + '%
    '; + } else { + return this["RemainingCapacity"] + String.fromCharCode(160) + CapacityUnit; + } + } + }, + RemainingCapacityBar: { + html: function () { + var CapacityUnit = (this["CapacityUnit"] !== undefined) ? this["CapacityUnit"] : 'mWh'; + if (( CapacityUnit !== "%" ) && (this["FullCapacity"] !== undefined)){ + var percent = (this["FullCapacity"] != 0) ? round(100*this["RemainingCapacity"]/this["FullCapacity"],0) : 0; + return '
    ' + + '
    ' + percent + '%
    '; + } else { + return ''; + } + } + }, + PresentVoltage: { + text: function () { + return this['PresentVoltage'] + String.fromCharCode(160) + 'mV'; + } + }, + BatteryTemperature: { + html: function () { + return formatTemp(this["BatteryTemperature"], data["Options"]["@attributes"]["tempFormat"]); + } + }, + DesignVoltage: { + text: function () { + return this['DesignVoltage']+String.fromCharCode(160) + 'mV'; + } + }, + DesignVoltageMax: { + text: function () { + return (this["DesignVoltageMax"] !== undefined) ? this['DesignVoltageMax']+String.fromCharCode(160) + 'mV' : ''; + } + } + }; + + if ((data['Plugins']['Plugin_BAT'] !== undefined) && (data['Plugins']['Plugin_BAT']["Bat"] !== undefined) && (data['Plugins']['Plugin_BAT']["Bat"]["@attributes"] !== undefined)){ + $('#bat').render(data['Plugins']['Plugin_BAT']["Bat"]["@attributes"], directives); + var attr = data['Plugins']['Plugin_BAT']["Bat"]["@attributes"]; + for (bat_param in {DesignCapacity:0,FullCapacity:1,RemainingCapacity:2,ChargingState:3,DesignVoltage:4,PresentVoltage:5,BatteryType:6,BatteryTemperature:7,BatteryCondition:8,CycleCount:9}) { + if (attr[bat_param] !== undefined) { + $('#bat_' + bat_param).show(); + } + } + if (attr["CapacityUnit"] === "%") { + $('#bat_DesignCapacity').hide(); + $('#bat_FullCapacity').hide(); + } + $('#block_bat').show(); + } else { + $('#block_bat').hide(); + } +} diff --git a/sources/plugins/bat/lang/cz.xml b/sources/plugins/bat/lang/cz.xml new file mode 100644 index 0000000..30c2d42 --- /dev/null +++ b/sources/plugins/bat/lang/cz.xml @@ -0,0 +1,51 @@ + + + + + + Stav baterie + + + Aktualizováno + + + KonstrukÄní kapacita + + + Zbývající kapacita + + + KonstrukÄní napÄ›tí + + + Aktuální napÄ›tí + + + Položky + + + Hodnoty + + + Stav nabíjení + + + Battery Type + + + Battery Temperature + + + Battery Condition + + + Cycle Count + + + Plná kapacita + + diff --git a/sources/plugins/bat/lang/de.xml b/sources/plugins/bat/lang/de.xml new file mode 100644 index 0000000..2d1f0ed --- /dev/null +++ b/sources/plugins/bat/lang/de.xml @@ -0,0 +1,51 @@ + + + + + + Akku-Status + + + Letzte Aktualisierung + + + Bemeskapazität + + + Übrige Kapazität + + + Bemessungsspannung + + + Momentane Spannung + + + Dinge + + + Werte + + + Ladezustand + + + Akku-Typ + + + Akku-Temperatur + + + Akku-Zustand + + + Cycle Count + + + Volle Kapazität + + diff --git a/sources/plugins/bat/lang/en.xml b/sources/plugins/bat/lang/en.xml new file mode 100644 index 0000000..f9c3997 --- /dev/null +++ b/sources/plugins/bat/lang/en.xml @@ -0,0 +1,51 @@ + + + + + + Battery Status + + + Last refresh + + + Design capacity + + + Remaining capacity + + + Design voltage + + + Present voltage + + + Items + + + Values + + + Charging state + + + Battery Type + + + Battery Temperature + + + Battery Condition + + + Cycle Count + + + Full capacity + + diff --git a/sources/plugins/bat/lang/fr.xml b/sources/plugins/bat/lang/fr.xml new file mode 100644 index 0000000..20547fc --- /dev/null +++ b/sources/plugins/bat/lang/fr.xml @@ -0,0 +1,51 @@ + + + + + + Etat des batteries + + + Dernière actualisation + + + Capacité d'origine + + + Capacité restante + + + Tension d'origine + + + Tension actuelle + + + Elements + + + Valeurs + + + Etat + + + Battery Type + + + Battery Temperature + + + Battery Condition + + + Cycle Count + + + Capacité pleine + + diff --git a/sources/plugins/bat/lang/pl.xml b/sources/plugins/bat/lang/pl.xml new file mode 100644 index 0000000..8b5f10c --- /dev/null +++ b/sources/plugins/bat/lang/pl.xml @@ -0,0 +1,51 @@ + + + + + + Status Baterii + + + Ostatnie odÅ›wieżenie + + + Pojemność znamionowa + + + Pojemność aktualna + + + NapiÄ™cie znamionowe + + + NapiÄ™cie aktualne + + + Parametry + + + WartoÅ›ci + + + Stan Å‚adowania + + + Typ ogniw + + + Temperatura ogniw + + + Kondycja ogniw + + + Cykli Å‚adowania + + + Pojemność peÅ‚na + + diff --git a/sources/plugins/bat/lang/ro.xml b/sources/plugins/bat/lang/ro.xml new file mode 100644 index 0000000..651352e --- /dev/null +++ b/sources/plugins/bat/lang/ro.xml @@ -0,0 +1,51 @@ + + + + + + Stare Baterie + + + Ultimul refresh + + + Capacitate Design + + + Capacitate rămasă + + + Voltaj design + + + Voltaj prezent + + + Elemente + + + Valori + + + Stare de ÃŽncărcare + + + Tip Baterie + + + Temperatura Baterie + + + CondiÈ›ii Baterie + + + Cycle Count + + + Capacitate maximă + + diff --git a/sources/plugins/bat/lang/ru.xml b/sources/plugins/bat/lang/ru.xml new file mode 100644 index 0000000..ccbc2f3 --- /dev/null +++ b/sources/plugins/bat/lang/ru.xml @@ -0,0 +1,51 @@ + + + + + + СоÑтоÑние батареи + + + ПоÑледние обновление + + + ÐŸÑ€Ð¾ÐµÐºÑ‚Ð½Ð°Ñ Ð¼Ð¾Ñ‰Ð½Ð¾Ñть + + + ОÑтавшийÑÑ Ð¾Ð±ÑŠÐµÐ¼ + + + Проектное напрÑжение + + + ФактичеÑкое напрÑжение + + + Элементы + + + Значение + + + СоÑтоÑние зарÑдки + + + Тип батареи + + + Температура батареи + + + СоÑтоÑние аккумулÑтора + + + Циклы + + + ÐŸÐ¾Ð»Ð½Ð°Ñ Ð¼Ð¾Ñ‰Ð½Ð¾Ñть + + diff --git a/sources/plugins/dmraid/class.dmraid.inc.php b/sources/plugins/dmraid/class.dmraid.inc.php new file mode 100644 index 0000000..fbfadac --- /dev/null +++ b/sources/plugins/dmraid/class.dmraid.inc.php @@ -0,0 +1,176 @@ + + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version SVN: $Id: class.dmraid.inc.php 661 2012-08-27 11:26:39Z namiltd $ + * @link http://phpsysinfo.sourceforge.net + */ + /** + * dmraid Plugin, which displays software RAID status + * + * @category PHP + * @package PSI_Plugin_DMRaid + * @author Michael Cramer + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version Release: 3.0 + * @link http://phpsysinfo.sourceforge.net + */ +class DMRaid extends PSI_Plugin +{ + /** + * variable, which holds the content of the command + * @var array + */ + private $_filecontent = ""; + + /** + * variable, which holds the result before the xml is generated out of this array + * @var array + */ + private $_result = array(); + + /** + * read the data into an internal array and also call the parent constructor + * + * @param String $enc encoding + */ + public function __construct($enc) + { + $buffer = ""; + parent::__construct(__CLASS__, $enc); + switch (strtolower(PSI_PLUGIN_DMRAID_ACCESS)) { + case 'command': + CommonFunctions::executeProgram("dmraid", "-s -vv 2>&1", $buffer); + break; + case 'data': + CommonFunctions::rfts(APP_ROOT."/data/dmraid.txt", $buffer); + break; + default: + $this->global_error->addConfigError("__construct()", "PSI_PLUGIN_DMRAID_ACCESS"); + break; + } + if (trim($buffer) != "") { + $this->_filecontent = preg_split("/(\r?\n\*\*\* )|(\r?\n--> )/", $buffer, -1, PREG_SPLIT_NO_EMPTY); + } else { + $this->_filecontent = array(); + } + } + + /** + * doing all tasks to get the required informations that the plugin needs + * result is stored in an internal array
    the array is build like a tree, + * so that it is possible to get only a specific process with the childs + * + * @return void + */ + public function execute() + { + if (empty($this->_filecontent)) { + return; + } + $group = ""; + foreach ($this->_filecontent as $block) { + if (preg_match('/^(NOTICE: )|(ERROR: )/m', $block)) { + $group = ""; + $lines = preg_split("/\r?\n/", $block, -1, PREG_SPLIT_NO_EMPTY); + foreach ($lines as $line) { + if (preg_match('/^NOTICE: added\s+\/dev\/(.+)\s+to RAID set\s+\"(.+)\"/', $line, $partition)) { + $this->_result['devices'][$partition[2]]['partitions'][$partition[1]]['status'] = "ok"; + } elseif (preg_match('/^ERROR: .* device\s+\/dev\/(.+)\s+(.+)\s+in RAID set\s+\"(.+)\"/', $line, $partition)) { + if ($partition[2]=="broken") { + $this->_result['devices'][$partition[3]]['partitions'][$partition[1]]['status'] = 'F'; + } else { + $this->_result['devices'][$partition[3]]['partitions'][$partition[1]]['status'] = 'W'; + } + } + } + } else { + if (preg_match('/^Group superset\s+(.+)/m', $block, $arrname)) { + $group = trim($arrname[1]); + } + if (preg_match('/^name\s*:\s*(.*)/m', $block, $arrname)) { + if ($group=="") { + $group = trim($arrname[1]); + } + $this->_result['devices'][$group]['name'] = $arrname[1]; + if (preg_match('/^size\s*:\s*(.*)/m', $block, $size)) { + $this->_result['devices'][$group]['size'] = trim($size[1]); + } + if (preg_match('/^stride\s*:\s*(.*)/m', $block, $stride)) { + $this->_result['devices'][$group]['stride'] = trim($stride[1]); + } + if (preg_match('/^type\s*:\s*(.*)/m', $block, $type)) { + $this->_result['devices'][$group]['type'] = trim($type[1]); + } + if (preg_match('/^status\s*:\s*(.*)/m', $block, $status)) { + $this->_result['devices'][$group]['status'] = trim($status[1]); + } + if (preg_match('/^subsets\s*:\s*(.*)/m', $block, $subsets)) { + $this->_result['devices'][$group]['subsets'] = trim($subsets[1]); + } + if (preg_match('/^devs\s*:\s*(.*)/m', $block, $devs)) { + $this->_result['devices'][$group]['devs'] = trim($devs[1]); + } + if (preg_match('/^spares\s*:\s*(.*)/m', $block, $spares)) { + $this->_result['devices'][$group]['spares'] = trim($spares[1]); + } + $group = ""; + } + } + } + } + + /** + * generates the XML content for the plugin + * + * @return SimpleXMLObject entire XML content for the plugin + */ + public function xml() + { + if (empty($this->_result)) { + return $this->xml->getSimpleXmlElement(); + } + $hideRaids = array(); + if (defined('PSI_PLUGIN_DMRAID_HIDE_RAID_DEVICES') && is_string(PSI_PLUGIN_DMRAID_HIDE_RAID_DEVICES)) { + if (preg_match(ARRAY_EXP, PSI_PLUGIN_DMRAID_HIDE_RAID_DEVICES)) { + $hideRaids = eval(PSI_PLUGIN_DMRAID_HIDE_RAID_DEVICES); + } else { + $hideRaids = array(PSI_PLUGIN_DMRAID_HIDE_RAID_DEVICES); + } + } + foreach ($this->_result['devices'] as $key=>$device) { + if (!in_array($key, $hideRaids, true)) { + $dev = $this->xml->addChild("Raid"); + $dev->addAttribute("Device_Name", $key); + $dev->addAttribute("Type", $device["type"]); + $dev->addAttribute("Disk_Status", $device["status"]); + $dev->addAttribute("Name", $device["name"]); + $dev->addAttribute("Size", $device["size"]); + $dev->addAttribute("Stride", $device["stride"]); + $dev->addAttribute("Subsets", $device["subsets"]); + $dev->addAttribute("Devs", $device["devs"]); + $dev->addAttribute("Spares", $device["spares"]); + $disks = $dev->addChild("Disks"); + if (isset($device['partitions']) && sizeof($device['partitions']>0)) foreach ($device['partitions'] as $diskkey=>$disk) { + $disktemp = $disks->addChild("Disk"); + $disktemp->addAttribute("Name", $diskkey); + if ($device["status"]=='ok') { + $disktemp->addAttribute("Status", $disk['status']); + } else { + $disktemp->addAttribute("Status", 'W'); + } + } + } + } + + return $this->xml->getSimpleXmlElement(); + } +} diff --git a/sources/plugins/dmraid/css/dmraid.css b/sources/plugins/dmraid/css/dmraid.css new file mode 100644 index 0000000..72fa7fc --- /dev/null +++ b/sources/plugins/dmraid/css/dmraid.css @@ -0,0 +1,14 @@ +/* + $Id: dmraid.css 661 2012-08-27 11:26:39Z namiltd $ + */ +.plugin_dmraid_biun { + text-align: center; + margin-bottom: 5px; + margin-right: 20px; + float: left; + width: 64px; +} + +img.plugin_dmraid_biun { + margin: auto; +} diff --git a/sources/plugins/dmraid/dmraid_bootstrap.html b/sources/plugins/dmraid/dmraid_bootstrap.html new file mode 100644 index 0000000..86c926b --- /dev/null +++ b/sources/plugins/dmraid/dmraid_bootstrap.html @@ -0,0 +1,13 @@ + diff --git a/sources/plugins/dmraid/gfx/error.png b/sources/plugins/dmraid/gfx/error.png new file mode 100644 index 0000000000000000000000000000000000000000..56c94f17f11b2ef81f766d69124378d6af1a666a GIT binary patch literal 3617 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 literal 0 HcmV?d00001 diff --git a/sources/plugins/dmraid/gfx/harddrivefail.png b/sources/plugins/dmraid/gfx/harddrivefail.png new file mode 100644 index 0000000000000000000000000000000000000000..02f0170278cf51009bb593fa86f0b2f6900e6185 GIT binary patch literal 3920 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 literal 0 HcmV?d00001 diff --git a/sources/plugins/dmraid/gfx/harddrivespare.png b/sources/plugins/dmraid/gfx/harddrivespare.png new file mode 100644 index 0000000000000000000000000000000000000000..0fa45949c5b279bcf561a8dec89efcecdde576be GIT binary patch literal 1749 zcmV;`1}gc9P)S&0}{gMdGrv+OF=N z-u`{>`l?n5|DTWM0DJ&G0DnxMWb{|hF1D94K|u9=qsF^3_4Y5Wk9xZrRY0Ekk-R*+ zkV^RduxDlDwbI*nc7JT73c&<1knMMFwLf_6d(7K=rk2*&BGNl4vuAmkKm^I4`YUi!qo;EVT8KlORK z6eui~gcO7FFt84;FkW-<0fiG(ks&BrJjjWu?JN6&+h1F5eu`UV=^;gXr1iRr^I(aV zD4wgM#-M=?nscPrUe$Yof1qn?7l1n`5)y~1j+M@#uGX7BOsJ}a7=#vQSy=tc`8~mZ zI(vBaJS~J26L`~lU3=*h8`%1D32dM-v^l~G#Y=mF^KY%P$R-BueMz5zwez|3q2psU zVQ4HnoTqX5s|zE+R}M9weVmL89eK418tptMfqp$>ht)jHY)y+5?pcPuwHIacU2Mp6SEI5V^6P(6;dnDMrc#a9S(HM$ATjgSyNY~h>GGcy)8qnq( zv**6JIu!hc6LU{opp9Tj(Bv+Hb%2#9rTPsVV-*TZ4G`KKl#R2fUk1ee{%7&ME3&jjIZ&-;cSM1kHIDFF}2u)_`&~{>Um|_+E zodK}9_6T#d{R;|i(Pfe;43;9m5n+36LeDl(XP!y6*hIO6v)tw^haUgR$q4-P?4e7a zqfPEpNnvTRiDHHs>MnbWAg@Dcna>tTnPh<(a@L);f+hjBInIe%=YPjM5& zG_y3l1|2?P6U!9y%rQmXPk{uQD-1Q7OtZi|O?LS&A35I&3G>V|LyqMvwQqjC8T4Ee zm(QTNL!AWWZdQSGn>(aTFhPS!7gB{YxpGrMi74o@Lzf&u`@dIcr(v5%`1OhRALBO; z{0iv<_p^hgOAAd#5fwe5O9zD}A;Gv_tkOB7pdcqF3sTE^;k#_0$q+gm=N{fW>A@dN z&`7B{eT0c=6yWYD z#0BAy*{Ld!T{?8xB_}7RaM_ESmHVHr!f=WP1+xeZnh0|gOwzz|4~ctD`j;?a$;){c zOU*}cnPA$dg&OL|f?0AlIK_u7qPfW_{=-pnHd*2}dBg}bwtKYNDw=PHhfp|oRcB$3 zLJ&Qkq6Lv)&7k`*{a5>M%E?|CAs$>PRQOnfBny9{C()9%AG*ISEMOCWL>c7%+ELZ>iDr>5DVm%P9df6=9=awRw1f=Yi|d>< zpmc&k3KN=InDK3oa-}~bC!-(_CdIfXsaksLI}_{Mq9PX20470T*P<+m_v(jz4Ng^1 z?2uNV7YFNDYW$0oTPSM$gE}{Xl)sbv92U0-O~}z7Y<&90JI5a-bxm#Dw2EINhDV9g z#`<6^m~&@2v#y2}4x4g=7W@^+6A@Ji7hnJV&$jraU;9bl28(!eGN9|A73|QG3K`ew z{#5=5(%bd9^wiE;a#9%p@w*FBMpXHf3gScsK_kHyl5@HecLh?8N|dr&`d4#ryww@G z-K6ll4&}PVL_00G>KXSxRWudu*HV;)UW&Wg*;5SJ*opUC`s-!s`XXM*%iV4%GHm}c rH1x1?CNTE<4*nT(06qYJT%Z2|vKFt(ayrMc00000NkvXXu0mjfOpicY literal 0 HcmV?d00001 diff --git a/sources/plugins/dmraid/gfx/harddrivewarn.png b/sources/plugins/dmraid/gfx/harddrivewarn.png new file mode 100644 index 0000000000000000000000000000000000000000..b0e0d53c9afca3efc30448d5bd1707d3de56ac8a GIT binary patch literal 3602 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 YzrXBv9EwB|761SM07*qoM6N<$f-?%v" + devname + ""; + html += "" + genlang(5, true, "DMRaid") + "" + devstatus + ""; + html += "" + genlang(6, true, "DMRaid") + "" + devtype + ""; + html += "" + genlang(7, true, "DMRaid") + "" + devsize + ""; + html += "" + genlang(8, true, "DMRaid") + "" + devstride + ""; + html += "" + genlang(9, true, "DMRaid") + "" + devsubsets + ""; + html += "" + genlang(10, true, "DMRaid") + "" + devdevs + ""; + html += "" + genlang(11, true, "DMRaid") + "" + devspares + ""; + button += "

    \"plus\"" + genlang(3, true, "DMRaid") + "

    "; + button += "

    \"minus\"" + genlang(3, true, "DMRaid") + "

    "; + button += "" + html + "
    "; + return button; +} + +/** + * choose the right diskdrive icon + * @param {jQuery} xml part of the plugin-XML + */ +function dmraid_diskicon(xml) { + var html = ""; + $("Disks Disk", xml).each(function dmraid_getdisk(id) { + var diskstatus = "", diskname = "", img = "", alt = ""; + html += "
    "; + diskstatus = $(this).attr("Status"); + diskname = $(this).attr("Name"); + switch (diskstatus) { + case "ok": + img = "harddriveok.png"; + alt = "ok"; + break; + case "F": + img = "harddrivefail.png"; + alt = "fail"; + break; + case "S": + img = "harddrivespare.png"; + alt = "spare"; + break; + case "W": + img = "harddrivewarn.png"; + alt = "fail"; + break; + default: +// alert("--" + diskstatus + "--"); + img = "error.png"; + alt = "error"; + break; + } + html += "\"""; //onload IE6 PNG fix + html += "" + diskname + ""; + html += "
    "; + }); + return html; +} + +/** + * fill the plugin block + * @param {jQuery} xml plugin-XML + */ +function dmraid_populate(xml) { + var htmltypes = ""; + + $("#Plugin_DMRaidTable").empty(); + $("#Plugin_DMRaidTable").append(""); + + $("Plugins Plugin_DMRaid Raid", xml).each(function dmraid_getdevice(id) { + var htmldisks = "", htmldisklist = "", topic = "", name = "", buildedaction = ""; + name = $(this).attr("Device_Name"); + htmldisklist += dmraid_diskicon(this); + htmldisks += ""; + htmldisks += ""; + htmldisks += ""; + htmldisks += "
    " + htmldisklist + "
    " + dmraid_buildinfos($(this), id) + "
    "; + if (id) { + topic = ""; + } + else { + topic = genlang(2, false, "DMRaid"); + } + $("#Plugin_DMRaidTable").append("" + topic + "
    " + name + "
    " + htmldisks + ""); + $("#sPlugin_DMRaid_Info" + id).click(function dmraid_showinfo() { + $("#Plugin_DMRaid_InfoTable" + id).slideDown("slow"); + $("#sPlugin_DMRaid_Info" + id).hide(); + $("#hPlugin_DMRaid_Info" + id).show(); + }); + $("#hPlugin_DMRaid_Info" + id).click(function dmraid_hideinfo() { + $("#Plugin_DMRaid_InfoTable" + id).slideUp("slow"); + $("#hPlugin_DMRaid_Info" + id).hide(); + $("#sPlugin_DMRaid_Info" + id).show(); + }); + dmraid_show = true; + }); + + $("#Plugin_DMRaidTable").append(""); +} + +/** + * load the xml via ajax + */ +function dmraid_request() { + $("#Reload_DMRaidTable").attr("title", "reload"); + $.ajax({ + url: "xml.php?plugin=DMRaid", + dataType: "xml", + error: function dmraid_error() { + $.jGrowl("Error loading XML document for Plugin DMRaid"); + }, + success: function dmraid_buildblock(xml) { + populateErrors(xml); + dmraid_populate(xml); + if (dmraid_show) { + plugin_translate("DMRaid"); + $("#Plugin_DMRaid").show(); + } + } + }); +} + +$(document).ready(function dmraid_buildpage() { + var html = ""; + + $("#footer").before(buildBlock("DMRaid", 1, true)); + html += " \n"; + html += "
    \n"; + $("#Plugin_DMRaid").append(html); + + $("#Plugin_DMRaid").css("width", "915px"); + + dmraid_request(); + + $("#Reload_DMRaidTable").click(function dmraid_reload(id) { + dmraid_request(); + $(this).attr("title", datetime()); + }); +}); diff --git a/sources/plugins/dmraid/js/dmraid_bootstrap.js b/sources/plugins/dmraid/js/dmraid_bootstrap.js new file mode 100644 index 0000000..cc45125 --- /dev/null +++ b/sources/plugins/dmraid/js/dmraid_bootstrap.js @@ -0,0 +1,94 @@ +function renderPlugin_dmraid(data) { + + function raid_diskicon(data) { + var html = ""; + var img = "", alt = ""; + + html += "
    "; + switch (data["Status"]) { + case "ok": + img = "harddriveok.png"; + alt = "ok"; + break; + case "F": + img = "harddrivefail.png"; + alt = "fail"; + break; + case "S": + img = "harddrivespare.png"; + alt = "spare"; + break; + case "W": + img = "harddrivewarn.png"; + alt = "warning"; + break; + default: +// alert("--" + data["Status"] + "--"); + img = "error.png"; + alt = "error"; + break; + } + html += "\"""; //onload IE6 PNG fix + html += "" + data["Name"] + ""; + html += "
    "; + return html; + } + + if (data['Plugins']['Plugin_DMRaid'] !== undefined) { + var dmitems = items(data['Plugins']['Plugin_DMRaid']['Raid']); + if (dmitems.length > 0) { + var html = ''; + for (var i = 0; i < dmitems.length ; i++) { + if (i) { + html += ""; + } else { + html += ""+genlang(2, false, 'dmraid')+""; + } + + if (dmitems[i]['Disks'] !== undefined) { + html += ""; + html += ""; + html += "
    "; + + var diskitems = items(dmitems[i]['Disks']['Disk']); + for (var j = 0; j < diskitems.length ; j++) { + html += raid_diskicon(diskitems[j]["@attributes"]); + } + + html += "
    "; + html += ""; + html += ""; + html += ""; // Name + html += ""; // Status + html += ""; // RAID-Type + html += "";// Size + html += ""; // Stride + html += ""; // Subsets + html += ""; // Devices + html += ""; // Spares + html += "
    " + dmitems[i]["@attributes"]["Device_Name"] + "
    "+genlang(4, true, 'dmraid')+"" + dmitems[i]["@attributes"]["Name"] + "
    "+genlang(5, true, 'dmraid')+"" + dmitems[i]["@attributes"]["Disk_Status"] + "
    "+genlang(6, true, 'dmraid')+"" + dmitems[i]["@attributes"]["Type"] + "
    "+genlang(7, true, 'dmraid')+"" + parseInt(dmitems[i]["@attributes"]["Size"]) + "
    "+genlang(8, true, 'dmraid')+"" + parseInt(dmitems[i]["@attributes"]["Stride"]) + "
    "+genlang(9, true, 'dmraid')+"" + parseInt(dmitems[i]["@attributes"]["Subsets"]) + "
    "+genlang(10, true, 'dmraid')+"" + parseInt(dmitems[i]["@attributes"]["Devs"]) + "
    "+genlang(11, true, 'dmraid')+"" + parseInt(dmitems[i]["@attributes"]["Spares"]) + "
    "; + html += "
    "; + } + + html +=""; + } + $('#dmraid-data').empty().append(html); + + for (var i = 0; i < dmitems.length ; i++) { + if (dmitems[i]['Disks'] !== undefined) { + $('#dmraid-'+i).treegrid({ + initialState: 'collapsed', + expanderExpandedClass: 'normalicon normalicon-down', + expanderCollapsedClass: 'normalicon normalicon-right' + }); + } + } + + $('#block_dmraid').show(); + } else { + $('#block_dmraid').hide(); + } + } else { + $('#block_dmraid').hide(); + } +} diff --git a/sources/plugins/dmraid/lang/en.xml b/sources/plugins/dmraid/lang/en.xml new file mode 100644 index 0000000..7fadda7 --- /dev/null +++ b/sources/plugins/dmraid/lang/en.xml @@ -0,0 +1,42 @@ + + + + + + RAID Status + + + RAID-Devices + + + Additional Information + + + Name + + + Status + + + RAID-Type + + + Size + + + Stride + + + Subsets + + + Devices + + + Spares + + diff --git a/sources/plugins/dmraid/lang/fr.xml b/sources/plugins/dmraid/lang/fr.xml new file mode 100644 index 0000000..aa5a7e2 --- /dev/null +++ b/sources/plugins/dmraid/lang/fr.xml @@ -0,0 +1,41 @@ + + + + + Statut RAID + + + Périphériques RAID + + + Informations additionnelles + + + Nom + + + Status + + + Type de RAID + + + Taille + + + Granularité + + + Sous-ensembles + + + Périphériques + + + Rechanges + + diff --git a/sources/plugins/dmraid/lang/ro.xml b/sources/plugins/dmraid/lang/ro.xml new file mode 100644 index 0000000..04e0736 --- /dev/null +++ b/sources/plugins/dmraid/lang/ro.xml @@ -0,0 +1,42 @@ + + + + + + Stare RAID + + + Dispozitive RAID + + + InformaÈ›ii Aditionale + + + Nume + + + Stare + + + Tip RAID + + + Dimensiune + + + Pas + + + Subseturi + + + Dispozitive + + + Piese + + diff --git a/sources/plugins/dmraid/lang/ru.xml b/sources/plugins/dmraid/lang/ru.xml new file mode 100644 index 0000000..d3662de --- /dev/null +++ b/sources/plugins/dmraid/lang/ru.xml @@ -0,0 +1,41 @@ + + + + + RAID Ð¡Ñ‚Ð°Ñ‚ÑƒÑ + + + RAID-УÑтройÑтв + + + Ð”Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ + + + Ð˜Ð¼Ñ + + + Ð¡Ñ‚Ð°Ñ‚ÑƒÑ + + + RAID-Тип + + + Размер + + + Шаг + + + ПодмножеÑтво + + + УÑтройÑтво + + + Резервировано + + diff --git a/sources/plugins/ipmiinfo/class.ipmiinfo.inc.php b/sources/plugins/ipmiinfo/class.ipmiinfo.inc.php new file mode 100644 index 0000000..e62f5e9 --- /dev/null +++ b/sources/plugins/ipmiinfo/class.ipmiinfo.inc.php @@ -0,0 +1,269 @@ + + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version SVN: $Id: class.ipmiinfo.inc.php 661 2012-08-27 11:26:39Z namiltd $ + * @link http://phpsysinfo.sourceforge.net + */ +/** + * ipmiinfo plugin, which displays all ipmi informations available + * + * @category PHP + * @package PSI_Plugin_ipmiinfo + * @author Mieczyslaw Nalewaj + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version Release: 3.0 + * @link http://phpsysinfo.sourceforge.net + */ +class ipmiinfo extends PSI_Plugin +{ + private $_lines; + + public function __construct($enc) + { + parent::__construct(__CLASS__, $enc); + + $this->_lines = array(); + } + + /** + * get temperature information + * + * @return array temperatures in array with label + */ + private function temperatures() + { + $result = array(); + $i = 0; + foreach ($this->_lines as $line) { + $buffer = preg_split("/\s*\|\s*/", $line); + if ($buffer[2] == "degrees C" && $buffer[3] != "na") { + $result[$i]['label'] = $buffer[0]; + $result[$i]['value'] = $buffer[1]; + $result[$i]['state'] = $buffer[3]; + if ($buffer[8] != "na") $result[$i]['max'] = $buffer[8]; + $i++; + } + } + + return $result; + } + + /** + * get voltages information + * + * @return array voltage in array with label + */ + private function voltages() + { + $result = array(); + $i = 0; + foreach ($this->_lines as $line) { + $buffer = preg_split("/\s*\|\s*/", $line); + if ($buffer[2] == "Volts" && $buffer[3] != "na") { + $result[$i]['label'] = $buffer[0]; + $result[$i]['value'] = $buffer[1]; + $result[$i]['state'] = $buffer[3]; + if ($buffer[5] != "na") $result[$i]['min'] = $buffer[5]; + if ($buffer[8] != "na") $result[$i]['max'] = $buffer[8]; + $i++; + } + } + + return $result; + } + + /** + * get fans information + * + * @return array fans in array with label + */ + private function fans() + { + $result = array(); + $i = 0; + foreach ($this->_lines as $line) { + $buffer = preg_split("/\s*\|\s*/", $line); + if ($buffer[2] == "RPM" && $buffer[3] != "na") { + $result[$i]['label'] = $buffer[0]; + $result[$i]['value'] = $buffer[1]; + $result[$i]['state'] = $buffer[3]; + if ($buffer[8] != "na") $result[$i]['min'] = $buffer[8]; + $i++; + } + } + + return $result; + } + + /** + * get powers information + * + * @return array misc in array with label + */ + private function powers() + { + $result = array(); + $i = 0; + foreach ($this->_lines as $line) { + $buffer = preg_split("/\s*\|\s*/", $line); + if ($buffer[2] == "Watts" && $buffer[3] != "na") { + $result[$i]['label'] = $buffer[0]; + $result[$i]['value'] = $buffer[1]; + $result[$i]['state'] = $buffer[3]; + if ($buffer[8] != "na") $result[$i]['max'] = $buffer[8]; + $i++; + } + } + + return $result; + } + + /** + * get currents information + * + * @return array misc in array with label + */ + private function currents() + { + $result = array(); + $i = 0; + foreach ($this->_lines as $line) { + $buffer = preg_split("/\s*\|\s*/", $line); + if ($buffer[2] == "Amps" && $buffer[3] != "na") { + $result[$i]['label'] = $buffer[0]; + $result[$i]['value'] = $buffer[1]; + $result[$i]['state'] = $buffer[3]; + if ($buffer[8] != "na") $result[$i]['max'] = $buffer[8]; + $i++; + } + } + + return $result; + } + + /** + * get misc information + * + * @return array misc in array with label + */ + private function misc() + { + $result = array(); + $i = 0; + foreach ($this->_lines as $line) { + $buffer = preg_split("/\s*\|\s*/", $line); + if ($buffer[2] == "discrete" && $buffer[3] != "na") { + $result[$i]['label'] = $buffer[0]; + $result[$i]['value'] = $buffer[1]; + $result[$i]['state'] = $buffer[3]; + $i++; + } + } + + return $result; + } + + public function execute() + { + $this->_lines = array(); + switch (strtolower(PSI_PLUGIN_IPMIINFO_ACCESS)) { + case 'command': + $lines = ""; + if (CommonFunctions::executeProgram('ipmitool', 'sensor', $lines) && !empty($lines)) + $this->_lines = preg_split("/\n/", $lines, -1, PREG_SPLIT_NO_EMPTY); + break; + case 'data': + if (CommonFunctions::rfts(APP_ROOT."/data/ipmiinfo.txt", $lines) && !empty($lines)) + $this->_lines = preg_split("/\n/", $lines, -1, PREG_SPLIT_NO_EMPTY); + break; + default: + $this->error->addConfigError('__construct()', 'PSI_PLUGIN_IPMIINFO_ACCESS'); + break; + } + } + + public function xml() + { + if (empty($this->_lines)) + return $this->xml->getSimpleXmlElement(); + + $arrBuff = $this->temperatures(); + if (sizeof($arrBuff) > 0) { + $temp = $this->xml->addChild("Temperatures"); + foreach ($arrBuff as $arrValue) { + $item = $temp->addChild('Item'); + $item->addAttribute('Label', $arrValue['label']); + $item->addAttribute('Value', $arrValue['value']); + $item->addAttribute('State', $arrValue['state']); + if (isset($arrValue['Max'])) $item->addAttribute('Max', $arrValue['Max']); + } + } + $arrBuff = $this->voltages(); + if (sizeof($arrBuff) > 0) { + $volt = $this->xml->addChild('Voltages'); + foreach ($arrBuff as $arrValue) { + $item = $volt->addChild('Item'); + $item->addAttribute('Label', $arrValue['label']); + $item->addAttribute('Value', $arrValue['value']); + $item->addAttribute('State', $arrValue['state']); + if (isset($arrValue['Min'])) $item->addAttribute('Min', $arrValue['min']); + if (isset($arrValue['Max'])) $item->addAttribute('Max', $arrValue['max']); + } + } + $arrBuff = $this->fans(); + if (sizeof($arrBuff) > 0) { + $fan = $this->xml->addChild('Fans'); + foreach ($arrBuff as $arrValue) { + $item = $fan->addChild('Item'); + $item->addAttribute('Label', $arrValue['label']); + $item->addAttribute('Value', $arrValue['value']); + $item->addAttribute('State', $arrValue['state']); + if (isset($arrValue['Min'])) $item->addAttribute('Min', $arrValue['min']); + } + } + $arrBuff = $this->powers(); + if (sizeof($arrBuff) > 0) { + $misc = $this->xml->addChild('Powers'); + foreach ($arrBuff as $arrValue) { + $item = $misc->addChild('Item'); + $item->addAttribute('Label', $arrValue['label']); + $item->addAttribute('Value', $arrValue['value']); + $item->addAttribute('State', $arrValue['state']); + if (isset($arrValue['Max'])) $item->addAttribute('Max', $arrValue['max']); + } + } + $arrBuff = $this->currents(); + if (sizeof($arrBuff) > 0) { + $misc = $this->xml->addChild('Currents'); + foreach ($arrBuff as $arrValue) { + $item = $misc->addChild('Item'); + $item->addAttribute('Label', $arrValue['label']); + $item->addAttribute('Value', $arrValue['value']); + $item->addAttribute('State', $arrValue['state']); + if (isset($arrValue['Max'])) $item->addAttribute('Max', $arrValue['max']); + } + } + $arrBuff = $this->misc(); + if (sizeof($arrBuff) > 0) { + $misc = $this->xml->addChild('Misc'); + foreach ($arrBuff as $arrValue) { + $item = $misc->addChild('Item'); + $item->addAttribute('Label', $arrValue['label']); + $item->addAttribute('Value', $arrValue['value']); + $item->addAttribute('State', $arrValue['state']); + } + } + + return $this->xml->getSimpleXmlElement(); + } + +} diff --git a/sources/plugins/ipmiinfo/ipmiinfo_bootstrap.html b/sources/plugins/ipmiinfo/ipmiinfo_bootstrap.html new file mode 100644 index 0000000..1b9ebb9 --- /dev/null +++ b/sources/plugins/ipmiinfo/ipmiinfo_bootstrap.html @@ -0,0 +1,17 @@ + diff --git a/sources/plugins/ipmiinfo/js/ipmiinfo.js b/sources/plugins/ipmiinfo/js/ipmiinfo.js new file mode 100644 index 0000000..82ccc11 --- /dev/null +++ b/sources/plugins/ipmiinfo/js/ipmiinfo.js @@ -0,0 +1,154 @@ +/*************************************************************************** + * Copyright (C) 2008 by phpSysInfo - A PHP System Information Script * + * http://phpsysinfo.sourceforge.net/ * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + +//$Id: ipmiinfo.js 661 2012-08-27 11:26:39Z namiltd $ + + +/*global $, jQuery, buildBlock, datetime, plugin_translate, genlang, createBar */ + +"use strict"; + +var ipmiinfo_show = false; +/** + * insert content into table + * @param {jQuery} xml plugin-XML + */ +function ipmiinfo_populate(xml) { + + var html = ""; + $("#Plugin_ipmiinfoTable").html(" "); + + $("Plugins Plugin_ipmiinfo Temperatures Item", xml).each(function ipmiinfo_getitem(idp) { + if(idp==0) { + html += "" + genlang(3, false, "ipmiinfo") + "\n"; + } + html += " \n"; + html += " " + $(this).attr("Label") + "\n"; + html += " " + $(this).attr("Value") + "\n"; + html += " \n"; + ipmiinfo_show = true; + }); + + $("Plugins Plugin_ipmiinfo Fans Item", xml).each(function ipmiinfo_getitem(idp) { + if(idp==0) { + html += "" + genlang(4, false, "ipmiinfo") + "\n"; + } + html += " \n"; + html += " " + $(this).attr("Label") + "\n"; + html += " " + $(this).attr("Value") + "\n"; + html += " \n"; + ipmiinfo_show = true; + }); + + $("Plugins Plugin_ipmiinfo Voltages Item", xml).each(function ipmiinfo_getitem(idp) { + if(idp==0) { + html += "" + genlang(5, false, "ipmiinfo") + "\n"; + } + html += " \n"; + html += " " + $(this).attr("Label") + "\n"; + html += " " + $(this).attr("Value") + "\n"; + html += " \n"; + ipmiinfo_show = true; + }); + + $("Plugins Plugin_ipmiinfo Currents Item", xml).each(function ipmiinfo_getitem(idp) { + if(idp==0) { + html += "" + genlang(7, false, "ipmiinfo") + "\n"; + } + html += " \n"; + html += " " + $(this).attr("Label") + "\n"; + html += " " + $(this).attr("Value") + "\n"; + html += " \n"; + ipmiinfo_show = true; + }); + + $("Plugins Plugin_ipmiinfo Powers Item", xml).each(function ipmiinfo_getitem(idp) { + if(idp==0) { + html += "" + genlang(8, false, "ipmiinfo") + "\n"; + } + html += " \n"; + html += " " + $(this).attr("Label") + "\n"; + html += " " + $(this).attr("Value") + "\n"; + html += " \n"; + ipmiinfo_show = true; + }); + $("Plugins Plugin_ipmiinfo Misc Item", xml).each(function ipmiinfo_getitem(idp) { + if(idp==0) { + html += "" + genlang(6, false, "ipmiinfo") + "\n"; + } + html += " \n"; + html += " " + $(this).attr("Label") + "\n"; + html += " " + $(this).attr("Value") + "\n"; + html += " \n"; + ipmiinfo_show = true; + }); + + $("#Plugin_ipmiinfoTable").append(html); + $('#Plugin_ipmiinfoTable tr:nth-child(even)').addClass('even'); + +} + +function ipmiinfo_buildTable() { + var html = ""; + + html += "\n"; + html += " \n"; + html += " \n"; + html += " \n"; + html += " \n"; + html += "
    \n"; + $("#Plugin_ipmiinfo").append(html); +} + +/** + * load the xml via ajax + */ +function ipmiinfo_request() { + $("#Reload_ipmiinfoTable").attr("title", "reload"); + $.ajax({ + url: "xml.php?plugin=ipmiinfo", + dataType: "xml", + error: function ipmiinfo_error() { + $.jGrowl("Error loading XML document for Plugin ipmiinfo!"); + }, + success: function ipmiinfo_buildblock(xml) { + populateErrors(xml); + ipmiinfo_populate(xml); + if (ipmiinfo_show) { + plugin_translate("ipmiinfo"); + $("#Plugin_ipmiinfo").show(); + } + } + }); +} + +$(document).ready(function ipmiinfo_buildpage() { + $("#footer").before(buildBlock("ipmiinfo", 1, true)); + $("#Plugin_ipmiinfo").css("width", "451px"); + + ipmiinfo_buildTable(); + + ipmiinfo_request(); + + $("#Reload_ipmiinfoTable").click(function ipmiinfo_reload(id) { + ipmiinfo_request(); + $(this).attr("title", datetime()); + }); +}); diff --git a/sources/plugins/ipmiinfo/js/ipmiinfo_bootstrap.js b/sources/plugins/ipmiinfo/js/ipmiinfo_bootstrap.js new file mode 100644 index 0000000..d644b15 --- /dev/null +++ b/sources/plugins/ipmiinfo/js/ipmiinfo_bootstrap.js @@ -0,0 +1,36 @@ +function renderPlugin_ipmiinfo(data) { + + var directives = { + Label: { + html: function () { + if (this["Value"] == undefined) { + return '' + this["Label"] + ''; + } else { + return this["Label"]; + } + } + } + }; + + if (data['Plugins']['Plugin_ipmiinfo'] !== undefined) { + var data_ipmiinfo = []; + var valuelist = {Temperatures:3, Voltages:4, Fans:5, Powers:8, Currents:7, Misc:6}; + for (var ipmiinfo_value in valuelist) { + if (data['Plugins']['Plugin_ipmiinfo'][ipmiinfo_value] !== undefined) { + var datas = items(data['Plugins']['Plugin_ipmiinfo'][ipmiinfo_value]["Item"]); + if (datas.length > 0) { + data_ipmiinfo.push({Label:genlang(valuelist[ipmiinfo_value], false ,'ipmiinfo')}); + data_ipmiinfo.push_attrs(datas); + } + } + } + if (data_ipmiinfo.length > 0) { + $('#ipmiinfo-data').render(data_ipmiinfo, directives); + $('#block_ipmiinfo').show(); + } else { + $('#block_ipmiinfo').hide(); + } + } else { + $('#block_ipmiinfo').hide(); + } +} diff --git a/sources/plugins/ipmiinfo/lang/cz.xml b/sources/plugins/ipmiinfo/lang/cz.xml new file mode 100644 index 0000000..d250764 --- /dev/null +++ b/sources/plugins/ipmiinfo/lang/cz.xml @@ -0,0 +1,33 @@ + + + + + + IPMI informace + + + Aktualizováno + + + Teploty [°C] + + + VÄ›tráky [RPM] + + + NapÄ›tí [V] + + + Různé [0/1] + + + Currents [A] + + + Powers [W] + + diff --git a/sources/plugins/ipmiinfo/lang/de.xml b/sources/plugins/ipmiinfo/lang/de.xml new file mode 100644 index 0000000..d87c4f1 --- /dev/null +++ b/sources/plugins/ipmiinfo/lang/de.xml @@ -0,0 +1,33 @@ + + + + + + IPMI Status + + + Letzte Aktualisierung + + + Temperaturen [°C] + + + Lüfter [RPM] + + + Spannungen [V] + + + Misc [0/1] + + + Currents [A] + + + Powers [W] + + diff --git a/sources/plugins/ipmiinfo/lang/en.xml b/sources/plugins/ipmiinfo/lang/en.xml new file mode 100644 index 0000000..f2a13d1 --- /dev/null +++ b/sources/plugins/ipmiinfo/lang/en.xml @@ -0,0 +1,33 @@ + + + + + + IPMI Status + + + Last refresh + + + Temperatures [°C] + + + Fans [RPM] + + + Voltages [V] + + + Misc [0/1] + + + Currents [A] + + + Powers [W] + + diff --git a/sources/plugins/ipmiinfo/lang/fr.xml b/sources/plugins/ipmiinfo/lang/fr.xml new file mode 100644 index 0000000..64e3ed7 --- /dev/null +++ b/sources/plugins/ipmiinfo/lang/fr.xml @@ -0,0 +1,33 @@ + + + + + + Etat IPMI + + + Dernière actualisation + + + Températures [°c] + + + Ventilateurs [RPM] + + + Tensions [V] + + + Divers [0/1] + + + Currents [A] + + + Powers [W] + + diff --git a/sources/plugins/ipmiinfo/lang/pl.xml b/sources/plugins/ipmiinfo/lang/pl.xml new file mode 100644 index 0000000..4392a48 --- /dev/null +++ b/sources/plugins/ipmiinfo/lang/pl.xml @@ -0,0 +1,33 @@ + + + + + + IPMI Status + + + Ostatnie odÅ›wieżenie + + + Temperatury [°C] + + + Wentylatory [RPM] + + + NapiÄ™cia [V] + + + Różne [0/1] + + + PrÄ…dy [A] + + + Moce [W] + + diff --git a/sources/plugins/ipmiinfo/lang/ro.xml b/sources/plugins/ipmiinfo/lang/ro.xml new file mode 100644 index 0000000..b0e5886 --- /dev/null +++ b/sources/plugins/ipmiinfo/lang/ro.xml @@ -0,0 +1,33 @@ + + + + + + Stare IPMI + + + Ultimul refresh + + + Temperaturi [°C] + + + Ventilatoare [RPM] + + + Tensiuni [V] + + + Diverse [0/1] + + + Amperi [A] + + + WaÈ›i [W] + + diff --git a/sources/plugins/ipmiinfo/lang/ru.xml b/sources/plugins/ipmiinfo/lang/ru.xml new file mode 100644 index 0000000..18d9e3d --- /dev/null +++ b/sources/plugins/ipmiinfo/lang/ru.xml @@ -0,0 +1,33 @@ + + + + + + IPMI Ð¡Ñ‚Ð°Ñ‚ÑƒÑ + + + ПоÑледнее обновление + + + Температура [°C] + + + ВентилÑторы [ОБ/мин] + + + ÐапрÑжение [V] + + + Разное [0/1] + + + Ток [A] + + + ÐапрÑжение [W] + + diff --git a/sources/plugins/mdstatus/class.mdstatus.inc.php b/sources/plugins/mdstatus/class.mdstatus.inc.php new file mode 100644 index 0000000..e40d9e2 --- /dev/null +++ b/sources/plugins/mdstatus/class.mdstatus.inc.php @@ -0,0 +1,236 @@ + + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version SVN: $Id: class.mdstatus.inc.php 661 2012-08-27 11:26:39Z namiltd $ + * @link http://phpsysinfo.sourceforge.net + */ + /** + * mdstatus Plugin, which displays a snapshot of the kernel's RAID/md state + * a simple view which shows supported types and RAID-Devices which are determined by + * parsing the "/proc/mdstat" file, another way is to provide + * a file with the output of the /proc/mdstat file, so there is no need to run a execute by the + * webserver, the format of the command is written down in the phpsysinfo.ini file, where also + * the method of getting the information is configured + * + * @category PHP + * @package PSI_Plugin_MDStatus + * @author Michael Cramer + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version Release: 3.0 + * @link http://phpsysinfo.sourceforge.net + */ +class MDStatus extends PSI_Plugin +{ + /** + * variable, which holds the content of the command + * @var array + */ + private $_filecontent = ""; + + /** + * variable, which holds the result before the xml is generated out of this array + * @var array + */ + private $_result = array(); + + /** + * read the data into an internal array and also call the parent constructor + * + * @param String $enc encoding + */ + public function __construct($enc) + { + $buffer = ""; + parent::__construct(__CLASS__, $enc); + switch (strtolower(PSI_PLUGIN_MDSTATUS_ACCESS)) { + case 'file': + CommonFunctions::rfts("/proc/mdstat", $buffer); + break; + case 'data': + CommonFunctions::rfts(APP_ROOT."/data/mdstat.txt", $buffer); + break; + default: + $this->global_error->addConfigError("__construct()", "PSI_PLUGIN_MDSTATUS_ACCESS"); + break; + } + if (trim($buffer) != "") { + $this->_filecontent = preg_split("/\n/", $buffer, -1, PREG_SPLIT_NO_EMPTY); + } else { + $this->_filecontent = array(); + } + } + + /** + * doing all tasks to get the required informations that the plugin needs + * result is stored in an internal array
    the array is build like a tree, + * so that it is possible to get only a specific process with the childs + * + * @return void + */ + public function execute() + { + if (empty($this->_filecontent)) { + return; + } + // get the supported types + if (preg_match('/[a-zA-Z]* : (\[([a-z0-9])*\]([ \n]))+/', $this->_filecontent[0], $res)) { + $parts = preg_split("/ : /", $res[0]); + $parts = preg_split("/ /", $parts[1]); + $count = 0; + foreach ($parts as $types) { + if (trim($types) != "") { + $this->_result['supported_types'][$count++] = substr(trim($types), 1, -1); + } + } + } + // get disks + if (preg_match("/^read_ahead/", $this->_filecontent[1])) { + $count = 2; + } else { + $count = 1; + } + $cnt_filecontent = count($this->_filecontent); + do { + $parts = preg_split("/ : /", $this->_filecontent[$count]); + $dev = trim($parts[0]); + if (count($parts) == 2) { + $details = preg_split('/ /', $parts[1]); + if (!strstr($details[0], 'inactive')) { + $this->_result['devices'][$dev]['level'] = $details[1]; + } else { + $this->_result['devices'][$dev]['level'] = "none"; + } + $this->_result['devices'][$dev]['status'] = $details[0]; + for ($i = 2, $cnt_details = count($details); $i < $cnt_details; $i++) { + preg_match('/(([a-z0-9])+)(\[([0-9]+)\])(\([SF ]\))?/', trim($details[$i]), $partition); + if (count($partition) == 5 || count($partition) == 6) { + $this->_result['devices'][$dev]['partitions'][$partition[1]]['raid_index'] = substr(trim($partition[3]), 1, -1); + if (isset($partition[5])) { + $search = array("(", ")"); + $replace = array("", ""); + $this->_result['devices'][$dev]['partitions'][$partition[1]]['status'] = str_replace($search, $replace, trim($partition[5])); + } else { + $this->_result['devices'][$dev]['partitions'][$partition[1]]['status'] = "ok"; + } + } + } + $count++; + $optionline = $this->_filecontent[$count - 1].$this->_filecontent[$count]; + if (preg_match('/([^\sk]*)k chunk/', $optionline, $chunksize)) { + $this->_result['devices'][$dev]['chunk_size'] = $chunksize[1]; + } else { + $this->_result['devices'][$dev]['chunk_size'] = -1; + } + if ($pos = strpos($optionline, "super non-persistent")) { + $this->_result['devices'][$dev]['pers_superblock'] = 0; + } else { + $this->_result['devices'][$dev]['pers_superblock'] = 1; + } + if ($pos = strpos($optionline, "algorithm")) { + $this->_result['devices'][$dev]['algorithm'] = trim(substr($optionline, $pos + 9, 2)); + } else { + $this->_result['devices'][$dev]['algorithm'] = -1; + } + if (preg_match('/(\[[0-9]?\/[0-9]\])/', $optionline, $res)) { + $slashpos = strpos($res[0], '/'); + $this->_result['devices'][$dev]['registered'] = substr($res[0], 1, $slashpos - 1); + $this->_result['devices'][$dev]['active'] = substr($res[0], $slashpos + 1, strlen($res[0]) - $slashpos - 2); + } else { + $this->_result['devices'][$dev]['registered'] = -1; + $this->_result['devices'][$dev]['active'] = -1; + } + if (preg_match(('/([a-z]+)( *)=( *)([0-9\.]+)%/'), $this->_filecontent[$count + 1], $res) || (preg_match(('/([a-z]+)( *)=( *)([0-9\.]+)/'), $optionline, $res))) { + list($this->_result['devices'][$dev]['action']['name'], $this->_result['devices'][$dev]['action']['percent']) = preg_split("/=/", str_replace("%", "", $res[0])); + if (preg_match(('/([a-z]*=[0-9\.]+[a-z]+)/'), $this->_filecontent[$count + 1], $res)) { + $time = preg_split("/=/", $res[0]); + list($this->_result['devices'][$dev]['action']['finish_time'], $this->_result['devices'][$dev]['action']['finish_unit']) = sscanf($time[1], '%f%s'); + } else { + $this->_result['devices'][$dev]['action']['finish_time'] = -1; + $this->_result['devices'][$dev]['action']['finish_unit'] = -1; + } + } else { + $this->_result['devices'][$dev]['action']['name'] = -1; + $this->_result['devices'][$dev]['action']['percent'] = -1; + $this->_result['devices'][$dev]['action']['finish_time'] = -1; + $this->_result['devices'][$dev]['action']['finish_unit'] = -1; + } + } else { + $count++; + } + } while ($cnt_filecontent > $count); + $lastline = $this->_filecontent[$cnt_filecontent - 2]; + if (strpos($lastline, "unused devices") !== false) { + $parts = preg_split("/:/", $lastline); + $search = array("<", ">"); + $replace = array("", ""); + $this->_result['unused_devs'] = trim(str_replace($search, $replace, $parts[1])); + } else { + $this->_result['unused_devs'] = -1; + } + } + + /** + * generates the XML content for the plugin + * + * @return SimpleXMLObject entire XML content for the plugin + */ + public function xml() + { + if (empty($this->_result)) { + return $this->xml->getSimpleXmlElement(); + } + $hideRaids = array(); + if (defined('PSI_PLUGIN_MDSTATUS_HIDE_RAID_DEVICES') && is_string(PSI_PLUGIN_MDSTATUS_HIDE_RAID_DEVICES)) { + if (preg_match(ARRAY_EXP, PSI_PLUGIN_MDSTATUS_HIDE_RAID_DEVICES)) { + $hideRaids = eval(PSI_PLUGIN_MDSTATUS_HIDE_RAID_DEVICES); + } else { + $hideRaids = array(PSI_PLUGIN_MDSTATUS_HIDE_RAID_DEVICES); + } + } + $sup = $this->xml->addChild("Supported_Types"); + foreach ($this->_result['supported_types'] as $type) { + $typ = $sup->addChild("Type"); + $typ->addAttribute("Name", $type); + } + if (isset($this->_result['devices'])) foreach ($this->_result['devices'] as $key=>$device) { + if (!in_array($key, $hideRaids, true)) { + $dev = $this->xml->addChild("Raid"); + $dev->addAttribute("Device_Name", $key); + $dev->addAttribute("Level", $device["level"]); + $dev->addAttribute("Disk_Status", $device["status"]); + $dev->addAttribute("Chunk_Size", $device["chunk_size"]); + $dev->addAttribute("Persistend_Superblock", $device["pers_superblock"]); + $dev->addAttribute("Algorithm", $device["algorithm"]); + $dev->addAttribute("Disks_Registered", $device["registered"]); + $dev->addAttribute("Disks_Active", $device["active"]); + $action = $dev->addChild("Action"); + $action->addAttribute("Percent", $device['action']['percent']); + $action->addAttribute("Name", $device['action']['name']); + $action->addAttribute("Time_To_Finish", $device['action']['finish_time']); + $action->addAttribute("Time_Unit", $device['action']['finish_unit']); + $disks = $dev->addChild("Disks"); + foreach ($device['partitions'] as $diskkey=>$disk) { + $disktemp = $disks->addChild("Disk"); + $disktemp->addAttribute("Name", $diskkey); + $disktemp->addAttribute("Status", $disk['status']); + $disktemp->addAttribute("Index", $disk['raid_index']); + } + } + } + if ($this->_result['unused_devs'] !== - 1) { + $unDev = $this->xml->addChild("Unused_Devices"); + $unDev->addAttribute("Devices", $this->_result['unused_devs']); + } + + return $this->xml->getSimpleXmlElement(); + } +} diff --git a/sources/plugins/mdstatus/css/mdstatus.css b/sources/plugins/mdstatus/css/mdstatus.css new file mode 100644 index 0000000..f9cd1b1 --- /dev/null +++ b/sources/plugins/mdstatus/css/mdstatus.css @@ -0,0 +1,14 @@ +/* + $Id: mdstatus.css 661 2012-08-27 11:26:39Z namiltd $ + */ +.plugin_mdstatus_biun { + text-align: center; + margin-bottom: 5px; + margin-right: 20px; + float: left; + width: 64px; +} + +img.plugin_mdstatus_biun { + margin: auto; +} diff --git a/sources/plugins/mdstatus/gfx/error.png b/sources/plugins/mdstatus/gfx/error.png new file mode 100644 index 0000000000000000000000000000000000000000..56c94f17f11b2ef81f766d69124378d6af1a666a GIT binary patch literal 3617 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 literal 0 HcmV?d00001 diff --git a/sources/plugins/mdstatus/gfx/harddrivefail.png b/sources/plugins/mdstatus/gfx/harddrivefail.png new file mode 100644 index 0000000000000000000000000000000000000000..02f0170278cf51009bb593fa86f0b2f6900e6185 GIT binary patch literal 3920 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 literal 0 HcmV?d00001 diff --git a/sources/plugins/mdstatus/gfx/harddrivespare.png b/sources/plugins/mdstatus/gfx/harddrivespare.png new file mode 100644 index 0000000000000000000000000000000000000000..0fa45949c5b279bcf561a8dec89efcecdde576be GIT binary patch literal 1749 zcmV;`1}gc9P)S&0}{gMdGrv+OF=N z-u`{>`l?n5|DTWM0DJ&G0DnxMWb{|hF1D94K|u9=qsF^3_4Y5Wk9xZrRY0Ekk-R*+ zkV^RduxDlDwbI*nc7JT73c&<1knMMFwLf_6d(7K=rk2*&BGNl4vuAmkKm^I4`YUi!qo;EVT8KlORK z6eui~gcO7FFt84;FkW-<0fiG(ks&BrJjjWu?JN6&+h1F5eu`UV=^;gXr1iRr^I(aV zD4wgM#-M=?nscPrUe$Yof1qn?7l1n`5)y~1j+M@#uGX7BOsJ}a7=#vQSy=tc`8~mZ zI(vBaJS~J26L`~lU3=*h8`%1D32dM-v^l~G#Y=mF^KY%P$R-BueMz5zwez|3q2psU zVQ4HnoTqX5s|zE+R}M9weVmL89eK418tptMfqp$>ht)jHY)y+5?pcPuwHIacU2Mp6SEI5V^6P(6;dnDMrc#a9S(HM$ATjgSyNY~h>GGcy)8qnq( zv**6JIu!hc6LU{opp9Tj(Bv+Hb%2#9rTPsVV-*TZ4G`KKl#R2fUk1ee{%7&ME3&jjIZ&-;cSM1kHIDFF}2u)_`&~{>Um|_+E zodK}9_6T#d{R;|i(Pfe;43;9m5n+36LeDl(XP!y6*hIO6v)tw^haUgR$q4-P?4e7a zqfPEpNnvTRiDHHs>MnbWAg@Dcna>tTnPh<(a@L);f+hjBInIe%=YPjM5& zG_y3l1|2?P6U!9y%rQmXPk{uQD-1Q7OtZi|O?LS&A35I&3G>V|LyqMvwQqjC8T4Ee zm(QTNL!AWWZdQSGn>(aTFhPS!7gB{YxpGrMi74o@Lzf&u`@dIcr(v5%`1OhRALBO; z{0iv<_p^hgOAAd#5fwe5O9zD}A;Gv_tkOB7pdcqF3sTE^;k#_0$q+gm=N{fW>A@dN z&`7B{eT0c=6yWYD z#0BAy*{Ld!T{?8xB_}7RaM_ESmHVHr!f=WP1+xeZnh0|gOwzz|4~ctD`j;?a$;){c zOU*}cnPA$dg&OL|f?0AlIK_u7qPfW_{=-pnHd*2}dBg}bwtKYNDw=PHhfp|oRcB$3 zLJ&Qkq6Lv)&7k`*{a5>M%E?|CAs$>PRQOnfBny9{C()9%AG*ISEMOCWL>c7%+ELZ>iDr>5DVm%P9df6=9=awRw1f=Yi|d>< zpmc&k3KN=InDK3oa-}~bC!-(_CdIfXsaksLI}_{Mq9PX20470T*P<+m_v(jz4Ng^1 z?2uNV7YFNDYW$0oTPSM$gE}{Xl)sbv92U0-O~}z7Y<&90JI5a-bxm#Dw2EINhDV9g z#`<6^m~&@2v#y2}4x4g=7W@^+6A@Ji7hnJV&$jraU;9bl28(!eGN9|A73|QG3K`ew z{#5=5(%bd9^wiE;a#9%p@w*FBMpXHf3gScsK_kHyl5@HecLh?8N|dr&`d4#ryww@G z-K6ll4&}PVL_00G>KXSxRWudu*HV;)UW&Wg*;5SJ*opUC`s-!s`XXM*%iV4%GHm}c rH1x1?CNTE<4*nT(06qYJT%Z2|vKFt(ayrMc00000NkvXXu0mjfOpicY literal 0 HcmV?d00001 diff --git a/sources/plugins/mdstatus/js/mdstatus.js b/sources/plugins/mdstatus/js/mdstatus.js new file mode 100644 index 0000000..6257579 --- /dev/null +++ b/sources/plugins/mdstatus/js/mdstatus.js @@ -0,0 +1,228 @@ +/*************************************************************************** + * Copyright (C) 2008 by phpSysInfo - A PHP System Information Script * + * http://phpsysinfo.sourceforge.net/ * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +// +// $Id: mdstatus.js 679 2012-09-04 10:10:11Z namiltd $ +// + +/*global $, jQuery, buildBlock, genlang, createBar, plugin_translate, datetime */ + +"use strict"; + +//appendcss("./plugins/MDStatus/css/MDStatus.css"); + +var mdstatus_show = false; + +/** + * get the details of the raid + * @param {jQuery} xml part of the plugin-XML + * @param {number} id id of the device + */ +function mdstatus_buildinfos(xml, id) { + var html = "", devstatus = "", devlevel = "", devchunk = 0, devsuper = 0, devalgo = 0, devactive = 0, devregis = 0, button = ""; + + devstatus = $(xml).attr("Disk_Status"); + devlevel = $(xml).attr("Level"); + devchunk = parseInt($(xml).attr("Chunk_Size"), 10); + devsuper = parseInt($(xml).attr("Persistent_Superblock"), 10); + devalgo = parseInt($(xml).attr("Algorithm"), 10); + devactive = parseInt($(xml).attr("Disks_Active"), 10); + devregis = parseInt($(xml).attr("Disks_Registered"), 10); + html += "" + genlang(5, true, "MDStatus") + "" + devstatus + ""; + html += "" + genlang(6, true, "MDStatus") + "" + devlevel + ""; + if (devchunk !== -1) { + html += "" + genlang(7, true, "MDStatus") + "" + devchunk + "K"; + } + if (devalgo !== -1) { + html += "" + genlang(8, true, "MDStatus") + "" + devalgo + ""; + } + if (devsuper !== -1) { + html += "" + genlang(9, true, "MDStatus") + "" + genlang(10, true, "MDStatus") + ""; + } + else { + html += "" + genlang(9, true, "MDStatus") + "" + genlang(11, true, "MDStatus") + ""; + } + if (devactive !== -1 && devregis !== -1) { + html += "" + genlang(12, true, "MDStatus") + "" + devregis + "/" + devactive + ""; + } + button += "

    \"plus\"" + genlang(4, true, "MDStatus") + "

    "; + button += "

    \"minus\"" + genlang(4, true, "MDStatus") + "

    "; + button += "" + html + "
    "; + return button; +} + +/** + * generate a html string with the current action on the disks + * @param {jQuery} xml part of the plugin-XML + */ +function mdstatus_buildaction(xml) { + var html = "", name = "", time = "", tunit = "", percent = 0; + $("Action", xml).each(function mdstatus_getaction(id) { + name = $(this).attr("Name"); + if (parseInt(name, 10) !== -1) { + time = $(this).attr("Time_To_Finish"); + tunit = $(this).attr("Time_Unit"); + percent = parseFloat($(this).attr("Percent")); + html += "
    "; + html += genlang(13, true, "MDStatus") + ": " + name + "
    "; + html += createBar(percent); + html += "
    "; + html += genlang(14, true, "MDStatus") + ": " + time + " " + tunit; + html += "
    "; + } + }); + return html; +} + +/** + * choose the right diskdrive icon + * @param {jQuery} xml part of the plugin-XML + */ +function mdstatus_diskicon(xml) { + var html = ""; + $("Disks Disk", xml).each(function mdstatus_getdisk(id) { + var diskstatus = "", diskname = "", img = "", alt = ""; + html += "
    "; + diskstatus = $(this).attr("Status"); + diskname = $(this).attr("Name"); + switch (diskstatus) { + case "ok": + img = "harddriveok.png"; + alt = "ok"; + break; + case "F": + img = "harddrivefail.png"; + alt = "fail"; + break; + case "S": + img = "harddrivespare.png"; + alt = "spare"; + break; + default: +// alert("--" + diskstatus + "--"); + img = "error.png"; + alt = "error"; + break; + } + html += "\"""; //onload IE6 PNG fix + html += "" + diskname + ""; + html += "
    "; + }); + return html; +} + +/** + * fill the plugin block + * @param {jQuery} xml plugin-XML + */ +function mdstatus_populate(xml) { + var htmltypes = ""; + + $("#Plugin_MDStatusTable").empty(); + $("#Plugin_MDStatusTable").append(""); + + $("Plugins Plugin_MDStatus Supported_Types Type", xml).each(function mdstatus_getsupportedtypes(id) { +// htmltypes += "
  • " + $(this).attr("Name") + "
  • "; + htmltypes += "" + $(this).attr("Name") + " "; + }); + if (htmltypes.length > 0) { + htmltypes = "
      " + htmltypes + "
    "; + $("#Plugin_MDStatusTable").append("" + genlang(2, false, "MDStatus") + "" + htmltypes + ""); + mdstatus_show = true; + } + + $("Plugins Plugin_MDStatus Raid", xml).each(function mdstatus_getdevice(id) { + var htmldisks = "", htmldisklist = "", topic = "", name = "", buildedaction = ""; + name = $(this).attr("Device_Name"); + htmldisklist += mdstatus_diskicon(this); + htmldisks += ""; + htmldisks += ""; + buildedaction = mdstatus_buildaction($(this)); + if (buildedaction) { + htmldisks += ""; + } + htmldisks += ""; + htmldisks += "
    " + htmldisklist + "
    " + buildedaction + "
    " + mdstatus_buildinfos($(this), id) + "
    "; + if (id) { + topic = ""; + } + else { + topic = genlang(3, false, "MDStatus"); + } + $("#Plugin_MDStatusTable").append("" + topic + "
    " + name + "
    " + htmldisks + ""); + $("#sPlugin_MDStatus_Info" + id).click(function mdstatus_showinfo() { + $("#Plugin_MDStatus_InfoTable" + id).slideDown("slow"); + $("#sPlugin_MDStatus_Info" + id).hide(); + $("#hPlugin_MDStatus_Info" + id).show(); + }); + $("#hPlugin_MDStatus_Info" + id).click(function mdstatus_hideinfo() { + $("#Plugin_MDStatus_InfoTable" + id).slideUp("slow"); + $("#hPlugin_MDStatus_Info" + id).hide(); + $("#sPlugin_MDStatus_Info" + id).show(); + }); + mdstatus_show = true; + }); + + if ($("Plugins Plugin_MDStatus Unused_Devices", xml).length > 0) { + $("#Plugin_MDStatusTable").append("" + genlang(15, true, "MDStatus") + "" + $(this).attr("Devices") + ""); + mdstatus_show = true; + } + + $("#Plugin_MDStatusTable").append(""); +} + +/** + * load the xml via ajax + */ +function mdstatus_request() { + $("#Reload_MDStatusTable").attr("title", "reload"); + $.ajax({ + url: "xml.php?plugin=MDStatus", + dataType: "xml", + error: function mdstatus_error() { + $.jGrowl("Error loading XML document for Plugin MDStatus"); + }, + success: function mdstatus_buildblock(xml) { + populateErrors(xml); + mdstatus_populate(xml); + if (mdstatus_show) { + plugin_translate("MDStatus"); + $("#Plugin_MDStatus").show(); + } + } + }); +} + +$(document).ready(function mdstatus_buildpage() { + var html = ""; + + $("#footer").before(buildBlock("MDStatus", 1, true)); + html += " \n"; + html += "
    \n"; + $("#Plugin_MDStatus").append(html); + + $("#Plugin_MDStatus").css("width", "915px"); + + mdstatus_request(); + + $("#Reload_MDStatusTable").click(function mdstatus_reload(id) { + mdstatus_request(); + $(this).attr("title", datetime()); + }); +}); diff --git a/sources/plugins/mdstatus/js/mdstatus_bootstrap.js b/sources/plugins/mdstatus/js/mdstatus_bootstrap.js new file mode 100644 index 0000000..d667567 --- /dev/null +++ b/sources/plugins/mdstatus/js/mdstatus_bootstrap.js @@ -0,0 +1,146 @@ +function renderPlugin_mdstatus(data) { + + function raid_buildaction(data) { + var html = "", name = "", percent = 0; + if (data !== undefined) { + name = data['Name']; + if ((name !== undefined) && (parseInt(name) !== -1)) { + percent = Math.round(parseFloat(data['Percent'])); + html += "
    " + genlang(13, true,'mdstatus') + ":" + String.fromCharCode(160) + name + "
    "; + html += '
    ' + + '
    ' + + '
    ' + percent + '%
    '; + html += genlang(14, true,'mdstatus') + ":" + String.fromCharCode(160) + data['Time_To_Finish'] + String.fromCharCode(160) + data['Time_Unit']; + html += "
    "; + } + } + return html; + } + + function raid_diskicon(data) { + var html = ""; + var img = "", alt = ""; + + html += "
    "; + switch (data["Status"]) { + case "ok": + img = "harddriveok.png"; + alt = "ok"; + break; + case "F": + img = "harddrivefail.png"; + alt = "fail"; + break; + case "S": + img = "harddrivespare.png"; + alt = "spare"; + break; + case "W": + img = "harddrivewarn.png"; + alt = "warning"; + break; + default: +// alert("--" + data["Status"] + "--"); + img = "error.png"; + alt = "error"; + break; + } + html += "\"""; //onload IE6 PNG fix + html += "" + data["Name"] + ""; + html += "
    "; + return html; + } + + if (data['Plugins']['Plugin_MDStatus'] !== undefined) { + $('#mdstatus-data').empty(); + if (data['Plugins']['Plugin_MDStatus']['Supported_Types'] !== undefined) { + var stitems = items(data['Plugins']['Plugin_MDStatus']['Supported_Types']['Type']); + if (stitems.length > 0) { + var htmltypes = ""+genlang(2, false, 'mdstatus')+""; + for (var i = 0; i < stitems.length ; i++) { + htmltypes += stitems[i]["@attributes"]["Name"] + " "; + } + htmltypes += ""; + $('#mdstatus-data').append(htmltypes); + $('#block_mdstatus').show(); + } else { + $('#block_mdstatus').hide(); + } + } else { + $('#block_mdstatus').hide(); + } + var mditems = items(data['Plugins']['Plugin_MDStatus']['Raid']); + if (mditems.length > 0) { + var html = ''; + for (var i = 0; i < mditems.length ; i++) { + if (i) { + html += ""; + } else { + html += ""+genlang(3, false, 'mdstatus')+""; + } + + if (mditems[i]['Disks'] !== undefined) { + var devchunk = parseInt(mditems[i]["@attributes"]["Chunk_Size"]); + var devsuper = parseInt(mditems[i]["@attributes"]["Persistent_Superblock"]); + var devalgo = parseInt(mditems[i]["@attributes"]["Algorithm"]); + var devactive = parseInt(mditems[i]["@attributes"]["Disks_Active"]); + var devregis = parseInt(mditems[i]["@attributes"]["Disks_Registered"]); + + html += ""; + html += ""; + if (mditems[i]['Action'] !== undefined) { + var buildedaction = raid_buildaction(mditems[i]['Action']['@attributes']); + if (buildedaction) { + html += ""; + } + } + + html += ""; + html += "
    "; + + var diskitems = items(mditems[i]['Disks']['Disk']); + for (var j = 0; j < diskitems.length ; j++) { + html += raid_diskicon(diskitems[j]["@attributes"]); + } + + html += "
    " + buildedaction + "
    "; + html += ""; + html += ""; + html += ""; + html += ""; + if (devchunk !== -1) { + html += ""; + } + if (devalgo !== -1) { + html += ""; + } + if (devsuper !== -1) { + html += ""; + } else { + html += ""; + } + if (devactive !== -1 && devregis !== -1) { + html += ""; + } + html += "
    " + mditems[i]["@attributes"]["Device_Name"] + "
    "+genlang(5, true,'mdstatus')+"" + mditems[i]["@attributes"]["Disk_Status"] + "
    "+genlang(6, true ,'mdstatus')+"" + mditems[i]["@attributes"]["Level"] + "
    "+genlang(7, true,'mdstatus')+"" + devchunk + "K
    "+genlang(8, true ,'mdstatus')+"" + devalgo + "
    "+genlang(9, true, 'mdstatus')+"available
    "+genlang(9, true, 'mdstatus')+"not available
    "+genlang(12, true, 'mdstatus')+"" + devregis + "/" + devactive + "
    "; + html += "
    "; + } + + html +=""; + } + $('#mdstatus-data').append(html); + + for (var i = 0; i < mditems.length ; i++) { + if (mditems[i]['Disks'] !== undefined) { + $('#mdstatus-'+i).treegrid({ + initialState: 'collapsed', + expanderExpandedClass: 'normalicon normalicon-down', + expanderCollapsedClass: 'normalicon normalicon-right' + }); + } + } + } + } else { + $('#block_mdstatus').hide(); + } +} diff --git a/sources/plugins/mdstatus/lang/cz.xml b/sources/plugins/mdstatus/lang/cz.xml new file mode 100644 index 0000000..949191f --- /dev/null +++ b/sources/plugins/mdstatus/lang/cz.xml @@ -0,0 +1,57 @@ + + + + + + Stav RAIDu + + + Poodporované typy RAID + + + RAID-zařízení + + + DodateÄné informace + + + Stav + + + Úroveň RAIDu + + + Velikost proužku + + + Algoritmus + + + Persistentní Superblock + + + dostupný + + + nedostupný + + + Registrovné/aktivní disky + + + Aktuální Äinnost + + + ÄŒas dokonÄení + + + Nevyužité disky + + + Aktualizováno + + diff --git a/sources/plugins/mdstatus/lang/de.xml b/sources/plugins/mdstatus/lang/de.xml new file mode 100644 index 0000000..8ec702d --- /dev/null +++ b/sources/plugins/mdstatus/lang/de.xml @@ -0,0 +1,57 @@ + + + + + + RAID Status + + + Unterstützte RAID-Typen + + + RAID-Geräte + + + Zusätzliche Informationen + + + Status + + + RAID-Level + + + Blockgröße + + + Algorithmus + + + Persistenter Superblock + + + verfügbar + + + nicht verfügbar + + + Registrierte/Aktive Platten + + + Aktuelle Aktion + + + Fertig in + + + Unbenutzte Platten + + + Zuletzt aktualisiert + + diff --git a/sources/plugins/mdstatus/lang/en.xml b/sources/plugins/mdstatus/lang/en.xml new file mode 100644 index 0000000..b62734b --- /dev/null +++ b/sources/plugins/mdstatus/lang/en.xml @@ -0,0 +1,57 @@ + + + + + + RAID Status + + + Supported RAID-Types + + + RAID-Devices + + + Additional Information + + + Status + + + RAID-Level + + + Chunk Size + + + Algorithm + + + Persistent Superblock + + + available + + + not available + + + Registered/Active Disks + + + Current Action + + + Finishing in + + + Unused Disks + + + Last refresh + + diff --git a/sources/plugins/mdstatus/lang/fr.xml b/sources/plugins/mdstatus/lang/fr.xml new file mode 100644 index 0000000..d7bf07f --- /dev/null +++ b/sources/plugins/mdstatus/lang/fr.xml @@ -0,0 +1,57 @@ + + + + + + Statut RAID + + + Type de RAID supporté + + + Périphériques RAID + + + Informations additionnelles + + + Statut + + + Type de RAID + + + Granularité + + + Algorithme + + + Superblocs persistants + + + disponible + + + non disponible + + + Disques Enregistrés/Actives + + + Action courante + + + Temps restant + + + Disques inutilisés + + + Dernière actualisation + + diff --git a/sources/plugins/mdstatus/lang/gr.xml b/sources/plugins/mdstatus/lang/gr.xml new file mode 100644 index 0000000..454f861 --- /dev/null +++ b/sources/plugins/mdstatus/lang/gr.xml @@ -0,0 +1,57 @@ + + + + + + Κατάσταση RAID + + + ΥποστηÏιζόμενοι Ï„Ïποι RAID + + + Αλυσίδες RAID + + + ΠÏόσθετες πληÏοφοÏίες + + + Κατάσταση + + + ΤÏπος RAID + + + Μέγεθος Chunk + + + ΑλγόÏιθμος + + + Μόνιμο Superblock + + + διαθέσιμο + + + μη διαθέσιμο + + + Δηλωμένοι/ΕνεÏγοί Δίσκοι + + + ΤÏέχουσα ενέÏγεια + + + ΟλοκληÏώνεται σε + + + ΑχÏησιμοποίητοι Δίσκοι + + + ΕνημέÏωση + + diff --git a/sources/plugins/mdstatus/lang/ro.xml b/sources/plugins/mdstatus/lang/ro.xml new file mode 100644 index 0000000..44a9e76 --- /dev/null +++ b/sources/plugins/mdstatus/lang/ro.xml @@ -0,0 +1,57 @@ + + + + + + Stare RAID + + + Tipuri de RAID suportate + + + Dispozitive RAID + + + InformaÈ›ii Aditionale + + + Stare + + + Nivele RAID + + + Chunk Size + + + Algoritm + + + Superblock persistente + + + disponibil + + + indisponibil + + + ÃŽnregistrate/Discuri Active + + + AcÈ›iune curentă + + + finisare în + + + Discuri defolosite + + + Ultimul refresh + + diff --git a/sources/plugins/mdstatus/lang/ru.xml b/sources/plugins/mdstatus/lang/ru.xml new file mode 100644 index 0000000..1e3d54d --- /dev/null +++ b/sources/plugins/mdstatus/lang/ru.xml @@ -0,0 +1,57 @@ + + + + + + RAID Ð¡Ñ‚Ð°Ñ‚ÑƒÑ + + + ПоддерживаютÑÑ Ñ‚Ð¸Ð¿Ñ‹ RAID + + + RAID-УÑтройÑтва + + + Дополнительные ÑÐ²ÐµÐ´ÐµÐ½Ð¸Ñ + + + Ð¡Ñ‚Ð°Ñ‚ÑƒÑ + + + RAID-Уровень + + + Размер блока + + + Ðлгоритм + + + ПоÑтоÑнный Ñуперблок + + + доÑтупен + + + не доÑтупен + + + ЗарегиÑтрировано/Ðктивных ДиÑков + + + Текущее дейÑтвие + + + Окончание в + + + ÐеиÑпользуемые диÑки + + + ПоÑледнее обновление + + diff --git a/sources/plugins/mdstatus/mdstatus_bootstrap.html b/sources/plugins/mdstatus/mdstatus_bootstrap.html new file mode 100644 index 0000000..1e24812 --- /dev/null +++ b/sources/plugins/mdstatus/mdstatus_bootstrap.html @@ -0,0 +1,13 @@ + diff --git a/sources/plugins/ps/class.ps.inc.php b/sources/plugins/ps/class.ps.inc.php new file mode 100644 index 0000000..e58416d --- /dev/null +++ b/sources/plugins/ps/class.ps.inc.php @@ -0,0 +1,255 @@ + + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version SVN: $Id: class.ps.inc.php 692 2012-09-08 17:12:08Z namiltd $ + * @link http://phpsysinfo.sourceforge.net + */ + /** + * process Plugin, which displays all running processes + * a simple tree view which is filled with the running processes which are determined by + * calling the "ps" command line utility, another way is to provide + * a file with the output of the ps utility, so there is no need to run a execute by the + * webserver, the format of the command is written down in the phpsysinfo.ini file, where also + * the method of getting the information is configured + * + * @category PHP + * @package PSI_Plugin_PS + * @author Michael Cramer + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version Release: 3.0 + * @link http://phpsysinfo.sourceforge.net + */ +class PS extends PSI_Plugin +{ + /** + * variable, which holds the content of the command + * @var array + */ + private $_filecontent = array(); + /** + * variable, which holds the result before the xml is generated out of this array + * @var array + */ + private $_result = array(); + /** + * read the data into an internal array and also call the parent constructor + * + * @param String $enc encoding + */ + public function __construct($enc) + { + parent::__construct(__CLASS__, $enc); + switch (strtolower(PSI_PLUGIN_PS_ACCESS)) { + case 'command': + if (PSI_OS == 'WINNT') { + try { + $objLocator = new COM("WbemScripting.SWbemLocator"); + $wmi = $objLocator->ConnectServer(); + $os_wmi = $wmi->InstancesOf('Win32_OperatingSystem'); + foreach ($os_wmi as $os) { + $memtotal = $os->TotalVisibleMemorySize * 1024; + } + $process_wmi = $wmi->InstancesOf('Win32_Process'); + foreach ($process_wmi as $process) { + if (strlen(trim($process->CommandLine)) > 0) { + $ps = trim($process->CommandLine); + } else { + $ps = trim($process->Caption); + } + if (trim($process->ProcessId) != 0) { + $memusage = round(trim($process->WorkingSetSize) * 100 / $memtotal, 1); + //ParentProcessId + //Unique identifier of the process that creates a process. Process identifier numbers are reused, so they + //only identify a process for the lifetime of that process. It is possible that the process identified by + //ParentProcessId is terminated, so ParentProcessId may not refer to a running process. It is also + //possible that ParentProcessId incorrectly refers to a process that reuses a process identifier. You can + //use the CreationDate property to determine whether the specified parent was created after the process + //represented by this Win32_Process instance was created. + //=> subtrees of processes may be missing (WHAT TODO?!?) + $this->_filecontent[] = trim($process->ProcessId)." ".trim($process->ParentProcessId)." ".$memusage." ".$ps; + } + } + } catch (Exception $e) { + } + } else { + CommonFunctions::executeProgram("ps", "axo pid,ppid,pmem,args", $buffer, PSI_DEBUG); + if (((PSI_OS == 'Linux') || (PSI_OS == 'Android')) && (!preg_match("/^[^\n]+\n\s*\d+\s+\d+\s+[\d\.]+\s+.+/", $buffer))) { //alternative method if no data + if (CommonFunctions::rfts('/proc/meminfo', $mbuf)) { + $bufe = preg_split("/\n/", $mbuf, -1, PREG_SPLIT_NO_EMPTY); + $totalmem = 0; + foreach ($bufe as $buf) { + if (preg_match('/^MemTotal:\s+(.*)\s*kB/i', $buf, $ar_buf)) { + $totalmem = $ar_buf[1]; + break; + } + } + $buffer = " PID PPID %MEM COMMAND\n"; + + $processlist = glob('/proc/*/status', GLOB_NOSORT); + if (($total = count($processlist)) > 0) { + natsort($processlist); //first sort + $prosess = array(); + foreach ($processlist as $processitem) { //second sort + $process[] = $processitem; + } + + $buf = ""; + for ($i = 0; $i < $total; $i++) { + if (CommonFunctions::rfts($process[$i], $buf, 0, 4096, false)) { + + if (($totalmem != 0) && (preg_match('/^VmRSS:\s+(\d+)\s+kB/m', $buf, $tmppmem))) { + $pmem = round(100 * $tmppmem[1] / $totalmem, 1); + } else { + $pmem = 0; + } + + $name = null; + if (CommonFunctions::rfts(substr($process[$i], 0, strlen($process[$i])-6)."cmdline", $namebuf, 0, 4096, false)) { + $name = str_replace(chr(0), ' ', trim($namebuf)); + } + if (preg_match('/^Pid:\s+(\d+)/m', $buf, $tmppid) && + preg_match('/^PPid:\s+(\d+)/m', $buf, $tmpppid) && + preg_match('/^Name:\s+(.+)/m', $buf, $tmpargs)) { + $pid = $tmppid[1]; + $ppid = $tmpppid[1]; + $args = $tmpargs[1]; + if ($name !== null) { + if ($name !== "") { + $args = $name; + } else { + $args = "[".$args."]"; + } + } + $buffer .= $pid." ".$ppid." ".$pmem." ".$args."\n"; + } + + } + } + } + } + } + } + break; + case 'data': + CommonFunctions::rfts(APP_ROOT."/data/ps.txt", $buffer); + break; + default: + $this->global_error->addConfigError("__construct()", "PSI_PLUGIN_PS_ACCESS"); + break; + } + if (PSI_OS != 'WINNT') { + if (trim($buffer) != "") { + $this->_filecontent = preg_split("/\n/", $buffer, -1, PREG_SPLIT_NO_EMPTY); + unset($this->_filecontent[0]); + } else { + $this->_filecontent = array(); + } + } + } + /** + * doing all tasks to get the required informations that the plugin needs + * result is stored in an internal array
    the array is build like a tree, + * so that it is possible to get only a specific process with the childs + * + * @return void + */ + public function execute() + { + if (empty($this->_filecontent)) { + return; + } + $items = array(); + foreach ($this->_filecontent as $roworig) { + $row = preg_split("/[\s]+/", trim($roworig), 4); + if (count($row) != 4) { + break; + } + foreach ($row as $key=>$val) { + $items[$row[0]][$key] = $val; + } + if ($row[1] !== $row[0]) { + $items[$row[1]]['childs'][$row[0]] = &$items[$row[0]]; + } + } + foreach ($items as $item) { //find zombie + if (!isset($item[0])) { + foreach ($item["childs"] as $subitem) { + $zombie = $subitem[1]; + if ($zombie != 0) { + $items[$zombie]["0"] = $zombie; + $items[$zombie]["1"] = "0"; + $items[$zombie]["2"] = "0"; + $items[$zombie]["3"] = "unknown"; + $items[0]['childs'][$zombie] = &$items[$zombie]; + } + break; //first is sufficient + } + } + } + if (isset($items[0])) { + $this->_result = $items[0]; + } else { + $_result = array(); + } + } + /** + * generates the XML content for the plugin + * + * @return SimpleXMLElement entire XML content for the plugin + */ + public function xml() + { + if ($this->_result) { + $positions = array(0=>0); + $this->_addchild($this->_result['childs'], $this->xml, $positions); + } + + return $this->xml->getSimpleXmlElement(); + } + /** + * recursive function to allow appending child processes to a parent process + * + * @param Array $child part of the array which should be appended to the XML + * @param SimpleXMLExtended $xml XML-Object to which the array content is appended + * @param Array &$positions array with parent positions in xml structure + * + * @return SimpleXMLExtended Object with the appended array content + */ + private function _addchild($child, SimpleXMLExtended $xml, &$positions) + { + foreach ($child as $key=>$value) { + $xmlnode = $xml->addChild("Process"); + if (isset($value[0])) { + array_push($positions, $value[0]); + $xmlnode->addAttribute('PID', $value[0]); + $parentid = array_search($value[1], $positions); + $xmlnode->addAttribute('ParentID', $parentid); + $xmlnode->addAttribute('PPID', $value[1]); + $xmlnode->addAttribute('MemoryUsage', $value[2]); + $xmlnode->addAttribute('Name', $value[3]); + if (PSI_OS !== 'WINNT') { + if ($parentid === 1) { + $xmlnode->addAttribute('Expanded', 0); + } + if (defined('PSI_PLUGIN_PS_SHOW_KTHREADD_EXPANDED') && (PSI_PLUGIN_PS_SHOW_KTHREADD_EXPANDED === false) && ($value[3] === "[kthreadd]")) { + $xmlnode->addAttribute('Expanded', 0); + } + } + } + if (isset($value['childs'])) { + $this->_addChild($value['childs'], $xml, $positions); + } + } + + return $xml; + } +} diff --git a/sources/plugins/ps/js/ps.js b/sources/plugins/ps/js/ps.js new file mode 100644 index 0000000..b99f9b7 --- /dev/null +++ b/sources/plugins/ps/js/ps.js @@ -0,0 +1,121 @@ +/*************************************************************************** + * Copyright (C) 2008 by phpSysInfo - A PHP System Information Script * + * http://phpsysinfo.sourceforge.net/ * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +// +// $Id: ps.js 661 2012-08-27 11:26:39Z namiltd $ +// + +/*global $, jQuery, buildBlock, datetime, plugin_translate, createBar, genlang */ + +"use strict"; + +var ps_show = false; + +/** + * build the table where content is inserted + * @param {jQuery} xml plugin-XML + */ +function ps_buildTable(xml) { + var html = "", tree = [], closed = [2]; + + $("#Plugin_PS #Plugin_PSTable").remove(); + + html += " \n"; + html += " \n"; + html += " \n"; + html += " \n"; + html += " \n"; + html += " \n"; + html += " \n"; + html += " \n"; + html += " \n"; + html += " \n"; + + $("Plugins Plugin_PS Process", xml).each(function ps_getprocess(id) { + var close = 0, pid = 0, ppid = 0, name = "", percent = 0, parentId = 0, expanded = 0; + name = $(this).attr("Name"); + parentId = parseInt($(this).attr("ParentID"), 10); + pid = parseInt($(this).attr("PID"), 10); + ppid = parseInt($(this).attr("PPID"), 10); + percent = parseInt($(this).attr("MemoryUsage"), 10); + expanded = parseInt($(this).attr("Expanded"), 10); + + html += " \n"; + close = tree.push(parentId); + if (!isNaN(expanded) && (expanded === 0)) { + closed.push(close); + } + ps_show = true; + }); + + html += " \n"; + html += "
    " + genlang(3, false, "PS") + "" + genlang(4, false, "PS") + "" + genlang(5, false, "PS") + "" + genlang(6, false, "PS") + "
    " + name + "" + pid + "" + ppid + "" + createBar(percent) + "
    \n"; + + $("#Plugin_PS").append(html); + + $("#Plugin_PSTable").jqTreeTable(tree, { + openImg: "./gfx/treeTable/tv-collapsable.gif", + shutImg: "./gfx/treeTable/tv-expandable.gif", + leafImg: "./gfx/treeTable/tv-item.gif", + lastOpenImg: "./gfx/treeTable/tv-collapsable-last.gif", + lastShutImg: "./gfx/treeTable/tv-expandable-last.gif", + lastLeafImg: "./gfx/treeTable/tv-item-last.gif", + vertLineImg: "./gfx/treeTable/vertline.gif", + blankImg: "./gfx/treeTable/blank.gif", + collapse: closed, + column: 0, + striped: true, + highlight: false, + state: false + }); +} + +/** + * load the xml via ajax + */ +function ps_request() { + $("#Reload_PSTable").attr("title", "reload"); + $.ajax({ + url: "xml.php?plugin=PS", + dataType: "xml", + error: function ps_error() { + $.jGrowl("Error loading XML document for Plugin PS!"); + }, + success: function ps_buildblock(xml) { + populateErrors(xml); + ps_buildTable(xml); + if (ps_show) { + plugin_translate("PS"); + $("#Plugin_PS").show(); + } + } + }); +} + +$(document).ready(function ps_buildpage() { + $("#footer").before(buildBlock("PS", 1, true)); + $("#Plugin_PS").css("width", "915px"); + + ps_request(); + + $("#Reload_PSTable").click(function ps_reload(id) { + ps_request(); + $(this).attr("title", datetime()); + }); +}); diff --git a/sources/plugins/ps/js/ps_bootstrap.js b/sources/plugins/ps/js/ps_bootstrap.js new file mode 100644 index 0000000..0b01f0f --- /dev/null +++ b/sources/plugins/ps/js/ps_bootstrap.js @@ -0,0 +1,60 @@ +function renderPlugin_ps(data) { + + var directives = { + MemoryUsage: { + html: function () { + return '
    ' + + '
    ' + this["MemoryUsage"] + '%
    '; + } + }, + Name: { + html: function () { + return this["Name"]; + } + } + }; + + if (data['Plugins']['Plugin_PS'] !== undefined) { + var psitems = items(data['Plugins']['Plugin_PS']['Process']); + if (psitems.length > 0) { + + var html = "", ps_item = [], expanded = 1; + for (var i = 0; i < psitems.length ; i++) { + ps_item = psitems[i]["@attributes"]; + + if (ps_item["ParentID"]==="0") { + html+=""; + } else { + html+=""; + } + html+=""; + html+=""; + html+=""; + html+=""; + html+=""; + } + + $("#ps-data").empty().append(html); + + $('#ps').treegrid({ + initialState: 'expanded', + expanderExpandedClass: 'normalicon normalicon-down', + expanderCollapsedClass: 'normalicon normalicon-right' + }); + + for (var i = 0; i < psitems.length ; i++) { + ps_item = psitems[i]["@attributes"]; + $('#ps-'+(i+1)).render(ps_item, directives); + expanded = ps_item["Expanded"]; + if ((expanded !== undefined) && (expanded === "0")) { + $('#ps-'+(i+1)).treegrid('collapse'); + } + } + $('#block_ps').show(); + } else { + $('#block_ps').hide(); + } + } else { + $('#block_ps').hide(); + } +} diff --git a/sources/plugins/ps/lang/cz.xml b/sources/plugins/ps/lang/cz.xml new file mode 100644 index 0000000..b6b3f55 --- /dev/null +++ b/sources/plugins/ps/lang/cz.xml @@ -0,0 +1,27 @@ + + + + + + Procesy + + + Aktualizováno + + + Příkaz + + + PID + + + RodiÄovský PID + + + SpotÅ™eba pamÄ›ti + + diff --git a/sources/plugins/ps/lang/de.xml b/sources/plugins/ps/lang/de.xml new file mode 100644 index 0000000..961132d --- /dev/null +++ b/sources/plugins/ps/lang/de.xml @@ -0,0 +1,27 @@ + + + + + + Prozess Status + + + Letzte Aktualisierung + + + Befehl + + + Prozess ID + + + Eltern ID + + + Speichernutzung + + diff --git a/sources/plugins/ps/lang/en.xml b/sources/plugins/ps/lang/en.xml new file mode 100644 index 0000000..a021789 --- /dev/null +++ b/sources/plugins/ps/lang/en.xml @@ -0,0 +1,27 @@ + + + + + + Process Status + + + Last refresh + + + Command + + + Process ID + + + Parent ID + + + Memory Usage + + diff --git a/sources/plugins/ps/lang/fr.xml b/sources/plugins/ps/lang/fr.xml new file mode 100644 index 0000000..40d2efe --- /dev/null +++ b/sources/plugins/ps/lang/fr.xml @@ -0,0 +1,27 @@ + + + + + + Etat des processus + + + Dernière actualisation + + + Commande + + + ID processus + + + ID processus père + + + Utilisation mémoire + + diff --git a/sources/plugins/ps/lang/gr.xml b/sources/plugins/ps/lang/gr.xml new file mode 100644 index 0000000..1a924e8 --- /dev/null +++ b/sources/plugins/ps/lang/gr.xml @@ -0,0 +1,27 @@ + + + + + + ΔιεÏγασίες Συστήματος + + + ΕνημέÏωση + + + Εντολή + + + ID ΔιεÏγασίας + + + ID ΚÏÏιας ΔιεÏγασίας + + + ΧÏήση Μνήμης + + diff --git a/sources/plugins/ps/lang/pl.xml b/sources/plugins/ps/lang/pl.xml new file mode 100644 index 0000000..4787fa7 --- /dev/null +++ b/sources/plugins/ps/lang/pl.xml @@ -0,0 +1,27 @@ + + + + + + Status Procesów + + + Ostatnie odÅ›wieżenie + + + Polecenie + + + PID + + + PID rodzica + + + Wykorzystanie pamiÄ™ci + + diff --git a/sources/plugins/ps/lang/ro.xml b/sources/plugins/ps/lang/ro.xml new file mode 100644 index 0000000..cd34c72 --- /dev/null +++ b/sources/plugins/ps/lang/ro.xml @@ -0,0 +1,27 @@ + + + + + + Stare proces + + + Ultimul refresh + + + Comanda + + + ID Proces + + + ID Parinte + + + Utilizare Memorie + + diff --git a/sources/plugins/ps/lang/ru.xml b/sources/plugins/ps/lang/ru.xml new file mode 100644 index 0000000..cfe191e --- /dev/null +++ b/sources/plugins/ps/lang/ru.xml @@ -0,0 +1,27 @@ + + + + + + Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð¿Ñ€Ð¾Ñ†ÐµÑÑов + + + ПоÑледнее обновление + + + Команда + + + ID процеÑÑа + + + ID Ñ€Ð¾Ð´Ð¸Ñ‚ÐµÐ»Ñ + + + ИÑпользовано памÑти + + diff --git a/sources/plugins/ps/ps_bootstrap.html b/sources/plugins/ps/ps_bootstrap.html new file mode 100644 index 0000000..aa07d07 --- /dev/null +++ b/sources/plugins/ps/ps_bootstrap.html @@ -0,0 +1,21 @@ + diff --git a/sources/plugins/psstatus/class.psstatus.inc.php b/sources/plugins/psstatus/class.psstatus.inc.php new file mode 100644 index 0000000..500db1a --- /dev/null +++ b/sources/plugins/psstatus/class.psstatus.inc.php @@ -0,0 +1,179 @@ + + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version SVN: $Id: class.psstatus.inc.php 692 2012-09-08 17:12:08Z namiltd $ + * @link http://phpsysinfo.sourceforge.net + */ + /** + * process Plugin, which displays the status of configured processes + * a simple view which shows a process name and the status + * status determined by calling the "pidof" command line utility, another way is to provide + * a file with the output of the pidof utility, so there is no need to run a executeable by the + * webserver, the format of the command is written down in the phpsysinfo.ini file, where also + * the method of getting the information is configured + * processes that should be checked are also defined in phpsysinfo.ini + * + * @category PHP + * @package PSI_Plugin_PSStatus + * @author Michael Cramer + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version Release: 3.0 + * @link http://phpsysinfo.sourceforge.net + */ +class PSStatus extends PSI_Plugin +{ + /** + * variable, which holds the content of the command + * @var array + */ + private $_filecontent = array(); + + /** + * variable, which holds the result before the xml is generated out of this array + * @var array + */ + private $_result = array(); + + /** + * read the data into an internal array and also call the parent constructor + * + * @param String $enc target encoding + */ + public function __construct($enc) + { + parent::__construct(__CLASS__, $enc); + switch (strtolower(PSI_PLUGIN_PSSTATUS_ACCESS)) { + case 'command': + if (PSI_OS == 'WINNT') { + try { + $objLocator = new COM("WbemScripting.SWbemLocator"); + $wmi = $objLocator->ConnectServer(); + $process_wmi = $wmi->InstancesOf('Win32_Process'); + foreach ($process_wmi as $process) { + $this->_filecontent[] = array(strtolower(trim($process->Caption)), trim($process->ProcessId)); + } + } catch (Exception $e) { + } + } else { + if (defined('PSI_PLUGIN_PSSTATUS_PROCESSES') && is_string(PSI_PLUGIN_PSSTATUS_PROCESSES)) { + if (preg_match(ARRAY_EXP, PSI_PLUGIN_PSSTATUS_PROCESSES)) { + $processes = eval(PSI_PLUGIN_PSSTATUS_PROCESSES); + } else { + $processes = array(PSI_PLUGIN_PSSTATUS_PROCESSES); + } + if (defined('PSI_PLUGIN_PSSTATUS_USE_REGEX') && PSI_PLUGIN_PSSTATUS_USE_REGEX === true) { + foreach ($processes as $process) { + CommonFunctions::executeProgram("pgrep", "-n -x ".$process, $buffer, PSI_DEBUG); + if (strlen($buffer) > 0) { + $this->_filecontent[] = array($process, $buffer); + } + } + } else { + foreach ($processes as $process) { + CommonFunctions::executeProgram("pidof", "-s ".$process, $buffer, PSI_DEBUG); + if (strlen($buffer) > 0) { + $this->_filecontent[] = array($process, $buffer); + } + } + } + } + } + break; + case 'data': + CommonFunctions::rfts(APP_ROOT."/data/psstatus.txt", $buffer); + $processes = preg_split("/\n/", $buffer, -1, PREG_SPLIT_NO_EMPTY); + foreach ($processes as $process) { + $ps = preg_split("/[\s]?\|[\s]?/", $process, -1, PREG_SPLIT_NO_EMPTY); + if (count($ps) == 2) { + $this->_filecontent[] = array(trim($ps[0]), trim($ps[1])); + } + } + break; + default: + $this->global_error->addError("switch(PSI_PLUGIN_PSSTATUS_ACCESS)", "Bad psstatus configuration in phpsysinfo.ini"); + break; + } + } + + /** + * doing all tasks to get the required informations that the plugin needs + * result is stored in an internal array
    the array is build like a tree, + * so that it is possible to get only a specific process with the childs + * + * @return void + */ + public function execute() + { + if (empty($this->_filecontent)) { + return; + } + if (defined('PSI_PLUGIN_PSSTATUS_PROCESSES') && is_string(PSI_PLUGIN_PSSTATUS_PROCESSES)) { + if (preg_match(ARRAY_EXP, PSI_PLUGIN_PSSTATUS_PROCESSES)) { + $processes = eval(PSI_PLUGIN_PSSTATUS_PROCESSES); + } else { + $processes = array(PSI_PLUGIN_PSSTATUS_PROCESSES); + } + if ((PSI_OS == 'WINNT') && (strtolower(PSI_PLUGIN_PSSTATUS_ACCESS) == 'command')) { + foreach ($processes as $process) { + if ($this->_recursiveinarray(strtolower($process), $this->_filecontent)) { + $this->_result[] = array($process, true); + } else { + $this->_result[] = array($process, false); + } + } + } else { + foreach ($processes as $process) { + if ($this->_recursiveinarray($process, $this->_filecontent)) { + $this->_result[] = array($process, true); + } else { + $this->_result[] = array($process, false); + } + } + } + } + } + + /** + * generates the XML content for the plugin + * + * @return SimpleXMLElement entire XML content for the plugin + */ + public function xml() + { + foreach ($this->_result as $ps) { + $xmlps = $this->xml->addChild("Process"); + $xmlps->addAttribute("Name", $ps[0]); + $xmlps->addAttribute("Status", $ps[1] ? 1 : 0); + } + + return $this->xml->getSimpleXmlElement(); + } + + /** + * checks an array recursive if an value is in, extended version of in_array() + * + * @param mixed $needle what to find + * @param array $haystack where to find + * + * @return boolean true - found
    false - not found + */ + private function _recursiveinarray($needle, $haystack) + { + foreach ($haystack as $stalk) { + if ($needle == $stalk || (is_array($stalk) && $this->_recursiveinarray($needle, $stalk))) { + return true; + } + } + + return false; + } +} diff --git a/sources/plugins/psstatus/css/psstatus.css b/sources/plugins/psstatus/css/psstatus.css new file mode 100644 index 0000000..239656a --- /dev/null +++ b/sources/plugins/psstatus/css/psstatus.css @@ -0,0 +1,6 @@ +/* + $Id: psstatus.css 661 2012-08-27 11:26:39Z namiltd $ + */ +#plugin_psstatusTable thead tr .header { + cursor: pointer; +} diff --git a/sources/plugins/psstatus/gfx/offline.gif b/sources/plugins/psstatus/gfx/offline.gif new file mode 100644 index 0000000000000000000000000000000000000000..6cb73fb4cb2a09c7a1bdcaabb1976475563d7f4e GIT binary patch literal 992 zcmZ?wbhEHb6k-r!_|CxaL`dXISI-+ipEpJ(Z}M`UD5*Sga(NOL^QNxmiI>k4EuAkw zu9VE1w3IhtA#ch`o~WrjadY|7*3$Ct&l5YFH%TdPnp)oI={%8>c_JqAWzv*4K_PF7 zO5P}`ym4}Q6BqNPuI7!G&l{jQZZ2=Ka^6J6ys4^rqo(o($OUSblVKPIqaiSGA)xq^ zg^__lm_Y~R1W=w}=h(}j&LQKmVZp&h5g|1j4}*oB3{p%A5fu}dIC;h73LbnoaLA=u zgpWnRae)e_kf=w)f`AE4EnK`wW-9_7HZu$92%0H;Soo}+U$x1~Yx+Ou5$Mv(F{wP)N_EmXcFBEthJR+?o@z z&nM?piq9^WmP;jbZcRx!7E*F9C*+Wi&o-Nue}7uemE;_YnRBZrWS>h4P~)|h9-yv! zb4pI7)SSzSIpo7I3PwX<5Ql)`PZmZ71`!4wkQ+gHf}LY0gC>WJ$A$$58<~aFY&;Ae zvhp!n*hEwmI5aWvb7Wj_cyQ3AnOUpgMuEfOMrLUlnIAU-8k<=RlC1;^5*!Y*NNK4Q z9N65{FkhDAhKR)j24-#^n?HYEDmu0EI&1PcFf3qX<6+Y&>1bHM+{_ioUXl^;;MG-r zc?E|b7Zh{YIm1;K{ACb7+_H`Lc#=c*0ft+913Swa0vgueXO*yFQIl#sc$Kxlm?NU6 ZprL&ohe)vAiU~@G&o6N1=iy+m1^}@" + status.toString() + "
    \"online\""; + } + else { + state = "" + status.toString() + "\"offline\""; + } + psstatus_table.fnAddData(["" + name + "" + name, state]); + psstatus_show = true; + }); +} + +/** + * fill the plugin block with table structure + */ +function psstatus_buildTable() { + var html = ""; + + html += "\n"; + html += " \n"; + html += " \n"; + html += " \n"; + html += " \n"; + html += " \n"; + html += " \n"; + html += " \n"; + html += " \n"; + html += "
    " + genlang(3, false, "PSStatus") + "" + genlang(4, false, "PSStatus") + "
    \n"; + + $("#Plugin_PSStatus").append(html); + + psstatus_table = $("#Plugin_PSStatusTable").dataTable({ + "bPaginate": false, + "bLengthChange": false, + "bFilter": false, + "bSort": true, + "bInfo": false, + "bProcessing": true, + "bAutoWidth": false, + "bStateSave": true, + "aoColumns": [{ + "sType": 'span-string' + }, { + "sType": 'span-number' + }] + }); +} + +/** + * load the xml via ajax + */ +function psstatus_request() { + $("#Reload_PSStatusTable").attr("title", "reload"); + $.ajax({ + url: "xml.php?plugin=PSStatus", + dataType: "xml", + error: function psstatus_error() { + $.jGrowl("Error loading XML document for Plugin PSStatus!"); + }, + success: function psstatus_buildblock(xml) { + populateErrors(xml); + psstatus_populate(xml); + if (psstatus_show) { + plugin_translate("PSStatus"); + $("#Plugin_PSStatus").show(); + } + } + }); +} + +$(document).ready(function psstatus_buildpage() { + $("#footer").before(buildBlock("PSStatus", 1, true)); + $("#Plugin_PSStatus").css("width", "451px"); + + psstatus_buildTable(); + + psstatus_request(); + + $("#Reload_PSStatusTable").click(function psstatus_reload(id) { + psstatus_request(); + $(this).attr("title", datetime()); + }); +}); diff --git a/sources/plugins/psstatus/js/psstatus_bootstrap.js b/sources/plugins/psstatus/js/psstatus_bootstrap.js new file mode 100644 index 0000000..ea9f240 --- /dev/null +++ b/sources/plugins/psstatus/js/psstatus_bootstrap.js @@ -0,0 +1,27 @@ +function renderPlugin_psstatus(data) { + + var directives = { + Status: { + text: function () { + return (this['Status'] === "1") ? "ON" : "OFF"; + } + } + }; + + if (data['Plugins']['Plugin_PSStatus'] !== undefined) { + var psitems = items(data['Plugins']['Plugin_PSStatus']['Process']); + if (psitems.length > 0) { + var ps_memory = []; + ps_memory.push_attrs(psitems); + $('#psstatus-data').render(ps_memory, directives); + $('#psstatus_Name').removeClass("sorttable_sorted"); // reset sort order + sorttable.innerSortFunction.apply($('#psstatus_Name')[0], []); + + $('#block_psstatus').show(); + } else { + $('#block_psstatus').hide(); + } + } else { + $('#block_psstatus').hide(); + } +} diff --git a/sources/plugins/psstatus/lang/cz.xml b/sources/plugins/psstatus/lang/cz.xml new file mode 100644 index 0000000..fb8da10 --- /dev/null +++ b/sources/plugins/psstatus/lang/cz.xml @@ -0,0 +1,21 @@ + + + + + + Stav procesů + + + Aktualizováno + + + Název + + + Stav + + diff --git a/sources/plugins/psstatus/lang/de.xml b/sources/plugins/psstatus/lang/de.xml new file mode 100644 index 0000000..13ddde5 --- /dev/null +++ b/sources/plugins/psstatus/lang/de.xml @@ -0,0 +1,21 @@ + + + + + + Prozess Status + + + Letzte Aktualisierung + + + Name + + + Status + + diff --git a/sources/plugins/psstatus/lang/en.xml b/sources/plugins/psstatus/lang/en.xml new file mode 100644 index 0000000..c32fdf5 --- /dev/null +++ b/sources/plugins/psstatus/lang/en.xml @@ -0,0 +1,21 @@ + + + + + + Process Status + + + Last refresh + + + Name + + + Status + + diff --git a/sources/plugins/psstatus/lang/fr.xml b/sources/plugins/psstatus/lang/fr.xml new file mode 100644 index 0000000..a598e06 --- /dev/null +++ b/sources/plugins/psstatus/lang/fr.xml @@ -0,0 +1,21 @@ + + + + + + Etat des processus + + + Dernière actualisation + + + Nom + + + Etat + + diff --git a/sources/plugins/psstatus/lang/gr.xml b/sources/plugins/psstatus/lang/gr.xml new file mode 100644 index 0000000..410f27e --- /dev/null +++ b/sources/plugins/psstatus/lang/gr.xml @@ -0,0 +1,21 @@ + + + + + + Κατάσταση ΚÏίσιμων ΔιεÏγασιών + + + ΕνημέÏωση + + + ΔιεÏγασία + + + Κατάσταση + + diff --git a/sources/plugins/psstatus/lang/pl.xml b/sources/plugins/psstatus/lang/pl.xml new file mode 100644 index 0000000..3a1c79d --- /dev/null +++ b/sources/plugins/psstatus/lang/pl.xml @@ -0,0 +1,21 @@ + + + + + + Status Procesów + + + Ostatnie odÅ›wieżenie + + + Nazwa + + + Status + + diff --git a/sources/plugins/psstatus/lang/ro.xml b/sources/plugins/psstatus/lang/ro.xml new file mode 100644 index 0000000..67c752b --- /dev/null +++ b/sources/plugins/psstatus/lang/ro.xml @@ -0,0 +1,21 @@ + + + + + + Stare proces + + + Ultimul refresh + + + Nume + + + Stare + + diff --git a/sources/plugins/psstatus/lang/ru.xml b/sources/plugins/psstatus/lang/ru.xml new file mode 100644 index 0000000..1afe895 --- /dev/null +++ b/sources/plugins/psstatus/lang/ru.xml @@ -0,0 +1,21 @@ + + + + + + Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ñлужб + + + ПоÑледнее обновление + + + Ð˜Ð¼Ñ Ñлужбы + + + Ð¡Ñ‚Ð°Ñ‚ÑƒÑ + + diff --git a/sources/plugins/psstatus/psstatus_bootstrap.html b/sources/plugins/psstatus/psstatus_bootstrap.html new file mode 100644 index 0000000..704bce1 --- /dev/null +++ b/sources/plugins/psstatus/psstatus_bootstrap.html @@ -0,0 +1,23 @@ + diff --git a/sources/plugins/quotas/class.quotas.inc.php b/sources/plugins/quotas/class.quotas.inc.php new file mode 100644 index 0000000..bde6fa4 --- /dev/null +++ b/sources/plugins/quotas/class.quotas.inc.php @@ -0,0 +1,132 @@ + + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version SVN: $Id: class.quotas.inc.php 661 2012-08-27 11:26:39Z namiltd $ + * @link http://phpsysinfo.sourceforge.net + */ + /** + * Quotas Plugin, which displays all quotas on the machine + * display all quotas in a sortable table with the current values which are determined by + * calling the "repquota" command line utility, another way is to provide + * a file with the output of the repquota utility, so there is no need to run a execute by the + * webserver, the format of the command is written down in the phpsysinfo.ini file, where also + * the method of getting the information is configured + * + * @category PHP + * @package PSI_Plugin_Quotas + * @author Michael Cramer + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version Release: 3.0 + * @link http://phpsysinfo.sourceforge.net + */ +class Quotas extends PSI_Plugin +{ + /** + * variable, which holds the content of the command + * @var array + */ + private $_filecontent = array(); + + /** + * variable, which holds the result before the xml is generated out of this array + * @var array + */ + private $_result = array(); + + /** + * read the data into an internal array and also call the parent constructor + * + * @param String $enc target encoding + */ + public function __construct($enc) + { + parent::__construct(__CLASS__, $enc); + switch (strtolower(PSI_PLUGIN_QUOTAS_ACCESS)) { + case 'command': + CommonFunctions::executeProgram("repquota", "-au", $buffer, PSI_DEBUG); + break; + case 'data': + CommonFunctions::rfts(APP_ROOT."/data/quotas.txt", $buffer); + break; + default: + $this->global_error->addConfigError("__construct()", "PSI_PLUGIN_QUOTAS_ACCESS"); + break; + } + if (trim($buffer) != "") { + $this->_filecontent = preg_split("/\n/", $buffer, -1, PREG_SPLIT_NO_EMPTY); + unset($this->_filecontent[0]); + } else { + $this->_filecontent = array(); + } + } + + /** + * doing all tasks to get the required informations that the plugin needs + * result is stored in an internal array
    the array is build like a tree, + * so that it is possible to get only a specific process with the childs + * + * @return void + */ + public function execute() + { + $i = 0; + $quotas = array(); + foreach ($this->_filecontent as $thisline) { + $thisline = preg_replace("/([\s]--)/", "", $thisline); + $thisline = preg_split("/(\s)/e", $thisline, -1, PREG_SPLIT_NO_EMPTY); + if (count($thisline) == 7) { + $quotas[$i]['user'] = str_replace("--", "", $thisline[0]); + $quotas[$i]['byte_used'] = $thisline[1] * 1024; + $quotas[$i]['byte_soft'] = $thisline[2] * 1024; + $quotas[$i]['byte_hard'] = $thisline[3] * 1024; + if ($thisline[3] != 0) { + $quotas[$i]['byte_percent_used'] = round((($quotas[$i]['byte_used'] / $quotas[$i]['byte_hard']) * 100), 1); + } else { + $quotas[$i]['byte_percent_used'] = 0; + } + $quotas[$i]['file_used'] = $thisline[4]; + $quotas[$i]['file_soft'] = $thisline[5]; + $quotas[$i]['file_hard'] = $thisline[6]; + if ($thisline[6] != 0) { + $quotas[$i]['file_percent_used'] = round((($quotas[$i]['file_used'] / $quotas[$i]['file_hard']) * 100), 1); + } else { + $quotas[$i]['file_percent_used'] = 0; + } + $i++; + } + } + $this->_result = $quotas; + } + + /** + * generates the XML content for the plugin + * + * @return SimpleXMLElement entire XML content for the plugin + */ + public function xml() + { + foreach ($this->_result as $quota) { + $quotaChild = $this->xml->addChild("Quota"); + $quotaChild->addAttribute("User", $quota['user']); + $quotaChild->addAttribute("ByteUsed", $quota['byte_used']); + $quotaChild->addAttribute("ByteSoft", $quota['byte_soft']); + $quotaChild->addAttribute("ByteHard", $quota['byte_hard']); + $quotaChild->addAttribute("BytePercentUsed", $quota['byte_percent_used']); + $quotaChild->addAttribute("FileUsed", $quota['file_used']); + $quotaChild->addAttribute("FileSoft", $quota['file_soft']); + $quotaChild->addAttribute("FileHard", $quota['file_hard']); + $quotaChild->addAttribute("FilePercentUsed", $quota['file_percent_used']); + } + + return $this->xml->getSimpleXmlElement(); + } +} diff --git a/sources/plugins/quotas/css/quotas.css b/sources/plugins/quotas/css/quotas.css new file mode 100644 index 0000000..36efde4 --- /dev/null +++ b/sources/plugins/quotas/css/quotas.css @@ -0,0 +1,7 @@ +/* + $Id: quotas.css 661 2012-08-27 11:26:39Z namiltd $ + */ +#plugin_quotasTable thead tr .header { + cursor: pointer; + text-align: center; +} diff --git a/sources/plugins/quotas/js/quotas.js b/sources/plugins/quotas/js/quotas.js new file mode 100644 index 0000000..820227e --- /dev/null +++ b/sources/plugins/quotas/js/quotas.js @@ -0,0 +1,147 @@ +/*************************************************************************** + * Copyright (C) 2008 by phpSysInfo - A PHP System Information Script * + * http://phpsysinfo.sourceforge.net/ * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +// +// $Id: quotas.js 661 2012-08-27 11:26:39Z namiltd $ +// + +/*global $, jQuery, buildBlock, datetime, plugin_translate, genlang, formatBytes, createBar */ + +"use strict"; + +var quotas_show = false, quotas_table; + +//appendcss("./plugins/Quotas/css/Quotas.css"); + +/** + * insert content into table + * @param {jQuery} xml plugin-XML + */ +function quotas_populate(xml) { + quotas_table.fnClearTable(); + + $("Plugins Plugin_Quotas Quota", xml).each(function quotas_getquota(id) { + var user = "", bused = 0, bsoft = 0, bhard = 0, bpuse = 0, fpuse = 0, fused = 0, fsoft = 0, fhard = 0; + user = $(this).attr("User"); + bused = parseInt($(this).attr("ByteUsed"), 10); + bsoft = parseInt($(this).attr("ByteSoft"), 10); + bhard = parseInt($(this).attr("ByteHard"), 10); + bpuse = parseInt($(this).attr("BytePercentUsed"), 10); + fused = parseInt($(this).attr("FileUsed"), 10); + fsoft = parseInt($(this).attr("FileSoft"), 10); + fhard = parseInt($(this).attr("FileHard"), 10); + fpuse = parseInt($(this).attr("FilePercentUsed"), 10); + + quotas_table.fnAddData(["" + user + "" + user, "" + bused + "" + formatBytes(bused, xml), "" + bsoft + "" + formatBytes(bsoft, xml), "" + bhard + "" + formatBytes(bhard, xml), "" + bpuse + "" + createBar(bpuse), "" + fused + "" + fused, "" + fsoft + "" + fsoft, "" + fhard + "" + fhard, "" + fpuse + "" + createBar(fpuse)]); + quotas_show = true; + }); +} + +/** + * fill the plugin block with table structure + */ +function quotas_buildTable() { + var html = ""; + + html += "\n"; + html += " \n"; + html += " \n"; + html += " \n"; + html += " \n"; + html += " \n"; + html += " \n"; + html += " \n"; + html += " \n"; + html += " \n"; + html += " \n"; + html += " \n"; + html += " \n"; + html += " \n"; + html += " \n"; + html += " \n"; + html += "
    " + genlang(3, false, "Quotas") + "" + genlang(4, false, "Quotas") + "" + genlang(5, false, "Quotas") + "" + genlang(6, false, "Quotas") + "" + genlang(7, false, "Quotas") + "" + genlang(8, false, "Quotas") + "" + genlang(9, false, "Quotas") + "" + genlang(10, false, "Quotas") + "" + genlang(11, false, "Quotas") + "
    \n"; + + $("#Plugin_Quotas").append(html); + + quotas_table = $("#Plugin_QuotasTable").dataTable({ + "bPaginate": false, + "bLengthChange": false, + "bFilter": false, + "bSort": true, + "bInfo": false, + "bProcessing": true, + "bAutoWidth": false, + "bStateSave": true, + "aoColumns": [{ + "sType": 'span-string' + }, { + "sType": 'span-number' + }, { + "sType": 'span-number' + }, { + "sType": 'span-number' + }, { + "sType": 'span-number' + }, { + "sType": 'span-number' + }, { + "sType": 'span-number' + }, { + "sType": 'span-number' + }, { + "sType": 'span-number' + }] + }); +} + +/** + * load the xml via ajax + */ +function quotas_request() { + $("#Reload_QuotasTable").attr("title", "reload"); + $.ajax({ + url: "xml.php?plugin=Quotas", + dataType: "xml", + error: function quotas_error() { + $.jGrowl("Error loading XML document for Plugin quotas!"); + }, + success: function quotas_buildblock(xml) { + populateErrors(xml); + quotas_populate(xml); + if (quotas_show) { + plugin_translate("Quotas"); + $("#Plugin_Quotas").show(); + } + } + }); +} + +$(document).ready(function quotas_buildpage() { + $("#footer").before(buildBlock("Quotas", 1, true)); + $("#Plugin_Quotas").css("width", "915px"); + + quotas_buildTable(); + + quotas_request(); + + $("#Reload_QuotasTable").click(function quotas_reload(id) { + quotas_request(); + $(this).attr("title", datetime()); + }); +}); diff --git a/sources/plugins/quotas/js/quotas_bootstrap.js b/sources/plugins/quotas/js/quotas_bootstrap.js new file mode 100644 index 0000000..00028a6 --- /dev/null +++ b/sources/plugins/quotas/js/quotas_bootstrap.js @@ -0,0 +1,50 @@ +function renderPlugin_quotas(data) { + + var directives = { + + ByteUsed: { + html: function () { + return formatBytes(this["ByteUsed"], data["Options"]["@attributes"]["byteFormat"]); + } + }, + ByteSoft: { + html: function () { + return formatBytes(this["ByteSoft"], data["Options"]["@attributes"]["byteFormat"]); + } + }, + ByteHard: { + html: function () { + return formatBytes(this["ByteHard"], data["Options"]["@attributes"]["byteFormat"]); + } + }, + BytePercentUsed: { + html: function () { + return '
    ' + + '
    ' + this["BytePercentUsed"] + '%
    '; + } + }, + FilePercentUsed: { + html: function () { + return '
    ' + + '
    ' + this["FilePercentUsed"] + '%
    '; + } + } + }; + + if (data['Plugins']['Plugin_Quotas'] !== undefined) { + var qtitems = items(data['Plugins']['Plugin_Quotas']['Quota']); + if (qtitems.length > 0) { + var qt_memory = []; + qt_memory.push_attrs(qtitems); + $('#quotas-data').render(qt_memory, directives); + $('#quotas_User').removeClass("sorttable_sorted"); // reset sort order + sorttable.innerSortFunction.apply($('#quotas_User')[0], []); + + $('#block_quotas').show(); + } else { + $('#block_quotas').hide(); + } + } else { + $('#block_quotas').hide(); + } +} diff --git a/sources/plugins/quotas/lang/cz.xml b/sources/plugins/quotas/lang/cz.xml new file mode 100644 index 0000000..b69afd1 --- /dev/null +++ b/sources/plugins/quotas/lang/cz.xml @@ -0,0 +1,42 @@ + + + + + + Stav kvót + + + aktualizováno + + + Uživatel + + + Využité místo + + + MÄ›kký limit + + + Tvrdý limit + + + Procento využití + + + PoÄet soouborů + + + MÄ›kký souborový limit + + + Tvrdý souborový limit + + + Procento využití souborů + + diff --git a/sources/plugins/quotas/lang/de.xml b/sources/plugins/quotas/lang/de.xml new file mode 100644 index 0000000..528f592 --- /dev/null +++ b/sources/plugins/quotas/lang/de.xml @@ -0,0 +1,42 @@ + + + + + + Quota Status + + + Letze Aktualisierung + + + Benutzer + + + Bytes (Belegt) + + + Bytes (Soft Limit) + + + Bytes (Hard Limit) + + + Bytes (Belegt Prozent) + + + Dateien (Benutzt) + + + Dateien (Soft Limit) + + + Dateien (Hard Limit) + + + Dateien (Benutzt Prozent) + + diff --git a/sources/plugins/quotas/lang/en.xml b/sources/plugins/quotas/lang/en.xml new file mode 100644 index 0000000..e123add --- /dev/null +++ b/sources/plugins/quotas/lang/en.xml @@ -0,0 +1,42 @@ + + + + + + Quota Status + + + Last Refresh + + + User + + + Bytes Used + + + Bytes Soft + + + Bytes Hard + + + Bytes Used Percent + + + Files Used + + + Files Soft + + + Files Hard + + + Files Used Percent + + diff --git a/sources/plugins/quotas/lang/fr.xml b/sources/plugins/quotas/lang/fr.xml new file mode 100644 index 0000000..3aeec9b --- /dev/null +++ b/sources/plugins/quotas/lang/fr.xml @@ -0,0 +1,42 @@ + + + + + + Etat des quotas + + + Dernière actualisation + + + Utilisateurs + + + Espace utilisés + + + Espace limite souple + + + Espace limite stricte + + + Pourcentage espace utilisés + + + Inodes utilisés + + + Inodes limite souple + + + Inodes limite stricte + + + Pourcentage inodes utilisés + + diff --git a/sources/plugins/quotas/lang/pl.xml b/sources/plugins/quotas/lang/pl.xml new file mode 100644 index 0000000..d34ce6c --- /dev/null +++ b/sources/plugins/quotas/lang/pl.xml @@ -0,0 +1,42 @@ + + + + + + Status Quoty + + + Ostatnie odÅ›wieżenie + + + Użytkownik + + + Bajtów wykorzystanych + + + MiÄ™kki limit bajtów + + + Twardy limit bajtów + + + Procentowo bajtów + + + Plików wykorzystanych + + + MiÄ™kki limit plików + + + Twardy limit plików + + + Procentowo plików + + diff --git a/sources/plugins/quotas/lang/ro.xml b/sources/plugins/quotas/lang/ro.xml new file mode 100644 index 0000000..d1809b1 --- /dev/null +++ b/sources/plugins/quotas/lang/ro.xml @@ -0,0 +1,42 @@ + + + + + + Stare Quota + + + Ultimul refresh + + + Utilizator + + + Bytes Folositi + + + Bytes Soft + + + Bytes Hard + + + Bytes Percent FolosiÈ›i + + + FiÈ™iere Folosite + + + FiÈ™iere Soft + + + FiÈ™iere Hard + + + FiÈ™iere Percent Folosite + + diff --git a/sources/plugins/quotas/lang/ru.xml b/sources/plugins/quotas/lang/ru.xml new file mode 100644 index 0000000..f551c38 --- /dev/null +++ b/sources/plugins/quotas/lang/ru.xml @@ -0,0 +1,42 @@ + + + + + + СоÑтоÑние Квоты + + + ПоÑледнее обновление + + + Пользователь + + + ИÑпользуетÑÑ + + + Программы + + + ЖеÑткий диÑк + + + Процентов + + + Файлы ИÑпользуетÑÑ + + + Файлов программ + + + Файлы на жеÑтком диÑке + + + Проценты файлов + + diff --git a/sources/plugins/quotas/quotas_bootstrap.html b/sources/plugins/quotas/quotas_bootstrap.html new file mode 100644 index 0000000..3395889 --- /dev/null +++ b/sources/plugins/quotas/quotas_bootstrap.html @@ -0,0 +1,37 @@ + diff --git a/sources/plugins/smart/class.smart.inc.php b/sources/plugins/smart/class.smart.inc.php new file mode 100644 index 0000000..39a3d68 --- /dev/null +++ b/sources/plugins/smart/class.smart.inc.php @@ -0,0 +1,302 @@ + + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version SVN: $Id: class.smart.inc.php 707 2012-11-28 10:20:49Z namiltd $ + * @link http://phpsysinfo.sourceforge.net + */ +/** + * SMART plugin, which displays all SMART informations available + * + * @category PHP + * @package PSI_Plugin_SMART + * @author Antoine Bertin + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version Release: 3.0 + * @link http://phpsysinfo.sourceforge.net + */ +class SMART extends PSI_Plugin +{ + /** + * variable, which holds the content of the command + * @var array + */ + private $_filecontent = array(); + + /** + * variable, which holds the result before the xml is generated out of this array + * @var array + */ + private $_result = array(); + + /** + * variable, which holds PSI_PLUGIN_SMART_IDS well formated datas + * @var array + */ + private $_ids = array(); + + /** + * read the data into an internal array and also call the parent constructor + * + * @param String $enc target encoding + */ + public function __construct($enc) + { + parent::__construct(__CLASS__, $enc); + switch (strtolower(PSI_PLUGIN_SMART_ACCESS)) { + case 'command': + if (defined('PSI_PLUGIN_SMART_DEVICES') && is_string(PSI_PLUGIN_SMART_DEVICES)) { + if (preg_match(ARRAY_EXP, PSI_PLUGIN_SMART_DEVICES)) { + $disks = eval(PSI_PLUGIN_SMART_DEVICES); + } else { + $disks = array(PSI_PLUGIN_SMART_DEVICES); + } + foreach ($disks as $disk) { + if (trim($disk) != "") { + $diskdev = ""; + if (preg_match("/\s*\(([^\(\(]*)\)\s*(.*)/", $disk, $devdisk)) { + $diskname = trim($devdisk[2]); + if (trim($devdisk[1]) != "") { + $diskdev = "--device ".preg_replace('/\./', ',', trim($devdisk[1])); + } + } else { + $diskname = trim($disk); + } + $buffer = ""; + if (trim($diskname != "") && (CommonFunctions::executeProgram('smartctl', '--all'.' '.$diskdev.' '.$diskname, $buffer, PSI_DEBUG))) { + $this->_filecontent[trim($disk)] = $buffer; + } + } + } + } + if (defined('PSI_PLUGIN_SMART_IDS') && is_string(PSI_PLUGIN_SMART_IDS)) { + if (preg_match(ARRAY_EXP, PSI_PLUGIN_SMART_IDS)) { + $fullIds = eval(PSI_PLUGIN_SMART_IDS); + } else { + $fullIds = array(PSI_PLUGIN_SMART_IDS); + } + foreach ($fullIds as $fullId) { + $arrFullId = preg_split('/-/', $fullId); + $this->_ids[intval($arrFullId[0])] = strtolower($arrFullId[1]); + if (!empty($arrFullId[2])) + $this->_ids[intval($arrFullId[2])] = "#replace-".intval($arrFullId[0]); + } + } + break; + case 'data': + if (defined('PSI_PLUGIN_SMART_DEVICES') && is_string(PSI_PLUGIN_SMART_DEVICES)) { + if (preg_match(ARRAY_EXP, PSI_PLUGIN_SMART_DEVICES)) { + $disks = eval(PSI_PLUGIN_SMART_DEVICES); + } else { + $disks = array(PSI_PLUGIN_SMART_DEVICES); + } + $dn=0; + foreach ($disks as $disk) { + $buffer=""; + if (CommonFunctions::rfts(APP_ROOT."/data/smart{$dn}.txt", $buffer) && !empty($buffer)) { + $this->_filecontent[$disk] = $buffer; + } + $dn++; + } + } + if (defined('PSI_PLUGIN_SMART_IDS') && is_string(PSI_PLUGIN_SMART_IDS)) { + if (preg_match(ARRAY_EXP, PSI_PLUGIN_SMART_IDS)) { + $fullIds = eval(PSI_PLUGIN_SMART_IDS); + } else { + $fullIds = array(PSI_PLUGIN_SMART_IDS); + } + foreach ($fullIds as $fullId) { + $arrFullId = preg_split('/-/', $fullId); + $this->_ids[intval($arrFullId[0])] = strtolower($arrFullId[1]); + if (!empty($arrFullId[2])) + $this->_ids[intval($arrFullId[2])] = "#replace-".intval($arrFullId[0]); + } + } + break; + default: + $this->global_error->addError("switch(PSI_PLUGIN_SMART_ACCESS)", "Bad SMART configuration in phpsysinfo.ini"); + break; + } + } + + /** + * doing all tasks to get the required informations that the plugin needs + * result is stored in an internal array + * + * @return void + */ + public function execute() + { + if (empty($this->_filecontent) || empty($this->_ids)) { + return; + } + foreach ($this->_filecontent as $disk=>$result) { + // set the start and end offset in the result string at the beginning and end respectively + // just in case we don't find the two strings, so that it still works as expected. + $startIndex = 0; + $endIndex = 0; + $vendorInfos = ""; + + // locate the beginning string offset for the attributes + if (preg_match('/(Vendor Specific SMART Attributes with Thresholds)/', $result, $matches, PREG_OFFSET_CAPTURE)) + $startIndex = $matches[0][1]; + + // locate the end string offset for the attributes, this is usually right before string "SMART Error Log Version" or "SMART Error Log not supported" or "Error SMART Error Log Read failed" (hopefully every output has it!) + if (preg_match('/(SMART Error Log Version)|(SMART Error Log not supported)|(Error SMART Error Log Read failed)/', $result, $matches, PREG_OFFSET_CAPTURE)) + $endIndex = $matches[0][1]; + + if ($startIndex && $endIndex && ($endIndex>$startIndex)) + $vendorInfos = preg_split("/\n/", substr($result, $startIndex, $endIndex - $startIndex)); + + if (!empty($vendorInfos)) { + $labels = preg_split('/\s+/', $vendorInfos[1]); + foreach ($labels as $k=>$v) { + $labels[$k] = str_replace('#', '', strtolower($v)); + } + $i = 0; // Line number + foreach ($vendorInfos as $line) { + $line = preg_replace('/^\s+/', '', $line); + $values = preg_split('/\s+/', $line); + if (count($values) > count($labels)) { + $values = array_slice($values, 0, count($labels), true); + } + $j = 0; + $found = false; + foreach ($values as $value) { + if ((in_array($value, array_keys($this->_ids)) && $labels[$j] == 'id')) { + $arrFullVa = preg_split('/-/', $this->_ids[$value]); + if (($arrFullVa[0]=="#replace") && !empty($arrFullVa[1])) + $value=$arrFullVa[1]; + } + if (((in_array($value, array_keys($this->_ids)) && $labels[$j] == 'id') || ($found && (in_array($labels[$j], array_values($this->_ids)))) || ($found && $labels[$j] == 'attribute_name'))) { + $this->_result[$disk][$i][$labels[$j]] = $value; + $found = true; + } + $j++; + } + $i++; + } + } else { + //SCSI devices + if (!empty($this->_ids[1]) && ($this->_ids[1]=="raw_value")) { + preg_match('/read\: (.*)\n/', $result, $lines); + if (!empty($lines) && !empty($lines[0])) { + $values=preg_split('/\s+/', $lines[0]); + if (!empty($values) && ($values[7]!=null)) { + $vals=preg_split('/[,\.]/', $values[7]); + $this->_result[$disk][0]['id'] = 1; + $this->_result[$disk][0]['attribute_name'] = "Raw_Read_Error_Rate"; + $this->_result[$disk][0]['raw_value'] = $vals[0]; + } + } + } + if (!empty($this->_ids[5]) && ($this->_ids[5]=="raw_value")) { + preg_match('/Elements in grown defect list\: (.*)\n/', $result, $lines); + if (!empty($lines) && !empty($lines[0])) { + $values=preg_split('/\s+/', $lines[0]); + if (!empty($values) && ($values[5]!=null)) { + $vals=preg_split('/[,\.]/', $values[5]); + $this->_result[$disk][1]['id'] = 5; + $this->_result[$disk][1]['attribute_name'] = "Reallocated_Sector_Ct"; + $this->_result[$disk][1]['raw_value'] = $vals[0]; + } + } + } + if (!empty($this->_ids[9]) && ($this->_ids[9]=="raw_value")) { + preg_match('/ number of hours powered up = (.*)\n/', $result, $lines); + if (!empty($lines) && !empty($lines[0])) { + $values=preg_split('/\s+/', $lines[0]); + if (!empty($values) && ($values[7]!=null)) { + $vals=preg_split('/[,\.]/', $values[7]); + $this->_result[$disk][2]['id'] = 9; + $this->_result[$disk][2]['attribute_name'] = "Power_On_Hours"; + $this->_result[$disk][2]['raw_value'] = $vals[0]; + } + } + } + if (!empty($this->_ids[194]) && ($this->_ids[194]=="raw_value")) { + preg_match('/Current Drive Temperature\: (.*)\n/', $result, $lines); + if (!empty($lines) && !empty($lines[0])) { + $values=preg_split('/\s+/', $lines[0]); + if (!empty($values) && ($values[3]!=null)) { + $vals=preg_split('/[,\.]/', $values[3]); + $this->_result[$disk][3]['id'] = 194; + $this->_result[$disk][3]['attribute_name'] = "Temperature_Celsius"; + $this->_result[$disk][3]['raw_value'] = $vals[0]; + } + } + } + } + } + //Usage test + $newIds = array(); + foreach ($this->_ids as $id=>$column_name) { + $found = 0; + foreach ($this->_result as $diskName=>$diskInfos) { + if ($found!=2) foreach ($diskInfos as $lineInfos) { + if ($found!=2) { + $found = 0; + foreach ($lineInfos as $label=>$value) { + if (($found==0) && ($label=="id") && ($value==$id)) + $found = 1; + if (($found==1) && ($label==$column_name)) + $found = 2; + } + } + } + } + if ($found==2) $newIds[$id] = $this->_ids[$id]; + } + $this->_ids = $newIds; + } + + /** + * generates the XML content for the plugin + * + * @return SimpleXMLObject entire XML content for the plugin + */ + public function xml() + { + if (empty($this->_result) || empty($this->_ids)) { + return $this->xml->getSimpleXmlElement(); + } + + $columnsChild = $this->xml->addChild('columns'); + // Fill the xml with preferences + foreach ($this->_ids as $id=>$column_name) { + $columnChild = $columnsChild->addChild('column'); + $columnChild->addAttribute('id', $id); + $columnChild->addAttribute('name', $column_name); + } + + $disksChild = $this->xml->addChild('disks'); + // Now fill the xml with S.M.A.R.T datas + foreach ($this->_result as $diskName=>$diskInfos) { + $diskChild = $disksChild->addChild('disk'); + $diskChild->addAttribute('name', $diskName); + foreach ($diskInfos as $lineInfos) { + $lineChild = $diskChild->addChild('attribute'); + + if (($lineInfos['id'] == 9) && ($lineInfos['attribute_name'] == "Power_On_Hours_and_Msec")) { + $lineInfos['attribute_name'] = "Power_On_Hours"; + $raw_value = preg_split("/h/", $lineInfos['raw_value'], -1, PREG_SPLIT_NO_EMPTY); + $lineInfos['raw_value'] = $raw_value[0]; + } + + foreach ($lineInfos as $label=>$value) { + $lineChild->addAttribute($label, $value); + } + } + } + + return $this->xml->getSimpleXmlElement(); + } +} diff --git a/sources/plugins/smart/css/smart.css b/sources/plugins/smart/css/smart.css new file mode 100644 index 0000000..6d2ca65 --- /dev/null +++ b/sources/plugins/smart/css/smart.css @@ -0,0 +1,6 @@ +/* + $Id: smart.css 661 2012-08-27 11:26:39Z namiltd $ + */ +#Plugin_SMARTTable tbody tr td { + text-align: right; +} diff --git a/sources/plugins/smart/js/smart.js b/sources/plugins/smart/js/smart.js new file mode 100644 index 0000000..5d931ef --- /dev/null +++ b/sources/plugins/smart/js/smart.js @@ -0,0 +1,147 @@ +/*************************************************************************** + * Copyright (C) 2008 by phpSysInfo - A PHP System Information Script * + * http://phpsysinfo.sourceforge.net/ * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + +//$Id: smart.js 707 2012-11-28 10:20:49Z namiltd $ + + +/*global $, jQuery, genlang, formatTemp, plugin_translate, buildBlock, datetime */ + +"use strict"; + +var smart_show = false, smart_table; + +//appendcss("./plugins/SMART/css/SMART.css"); + +/** + * fill the plugin block with table structure + */ +function smart_buildTable(xml) { + var html = ""; + + html += "\n"; + html += " \n"; + html += " \n"; + html += " \n"; + $("Plugins Plugin_SMART columns column", xml).each(function smart_table_header() { + html += " \n"; + }); + html += " \n"; + html += " \n"; + html += " \n"; + html += " \n"; + html += "
    " + genlang(3, false, "SMART") + "" + genlang(100 + parseInt($(this).attr("id"), 10), false, "SMART") + "
    \n"; + + $("#Plugin_SMART").append(html); + + smart_table = $("#Plugin_SMARTTable").dataTable({ + "bPaginate": false, + "bLengthChange": false, + "bFilter": false, + "bSort": true, + "bInfo": false, + "bProcessing": true, + "bAutoWidth": false, + "bStateSave": true + }); +} + +/** + * insert content into table + * @param {jQuery} xml plugin-XML + */ +function smart_populate(xml) { + var name = "", columns = []; + smart_table.fnClearTable(); + + // Get datas that the user want to be displayed + $("Plugins Plugin_SMART columns column", xml).each(function smart_find_columns() { + columns[parseInt($(this).attr("id"), 10)] = $(this).attr("name"); + }); + + // Now we add selected datas in the table + $("Plugins Plugin_SMART disks disk", xml).each(function smart_fill_table() { + var values = [], display = [], i; + name = $(this).attr("name"); + $(this).find("attribute").each(function smart_fill_data() { + if (columns[parseInt($(this).attr("id"), 10)] && columns[parseInt($(this).attr("id"), 10)] !== "") { + values[parseInt($(this).attr("id"), 10)] = $(this).attr(columns[parseInt($(this).attr("id"), 10)]); + } + }); + + display.push("" + name + "" + name); + + // On "columns" so we get the right order + // fixed for Firefox (fix wrong order) + $("Plugins Plugin_SMART columns column", xml).each(function smart_find_columns() { + i = parseInt($(this).attr("id"), 10); + if (typeof(values[i])==='undefined') { + display.push(""); + } + else if (i === 194) { + display.push("" + values[i] + "" + formatTemp(values[i], xml)); + } + else { + display.push("" + values[i] + "" + values[i]); + } +// } + }); + smart_table.fnAddData(display); + }); + smart_show = true; +} + +/** + * load the xml via ajax + */ +function smart_request() { + $("#Reload_SMARTTable").attr("title", "reload"); + $.ajax({ + url: "xml.php?plugin=SMART", + dataType: "xml", + error: function smart_error() { + $.jGrowl("Error loading XML document for Plugin SMART"); + }, + success: function smart_buildBlock(xml) { + populateErrors(xml); + if ((smart_table === undefined) || (typeof(smart_table) !== "object")) { + smart_buildTable(xml); + } + smart_populate(xml); + if (smart_show) { + plugin_translate("SMART"); + $("#Plugin_SMART").show(); + } + } + }); +} + +$(document).ready(function smart_buildpage() { + var html = ""; + + $("#footer").before(buildBlock("SMART", 1, true)); + $("#Plugin_SMART").css("width", "915px"); + + smart_request(); + + $("#Reload_SMARTTable").click(function smart_reload(id) { + smart_request(); + $(this).attr("title", datetime()); + }); +}); diff --git a/sources/plugins/smart/js/smart_bootstrap.js b/sources/plugins/smart/js/smart_bootstrap.js new file mode 100644 index 0000000..3eee13e --- /dev/null +++ b/sources/plugins/smart/js/smart_bootstrap.js @@ -0,0 +1,84 @@ +function renderPlugin_smart(data) { + + if ((data['Plugins']['Plugin_SMART'] !== undefined) && (data['Plugins']['Plugin_SMART']["columns"] !== undefined) && (items(data['Plugins']['Plugin_SMART']["columns"]["column"]).length > 0) + && (data['Plugins']['Plugin_SMART']["disks"] !== undefined) && (items(data['Plugins']['Plugin_SMART']["disks"]["disk"]).length > 0)) { + var smartitems = items(data['Plugins']['Plugin_SMART']["columns"]["column"]); + var smartnames = { + 1:"plugin_smart_101", // "Raw Read Error Rate", + 2:"plugin_smart_102", // "Throughput Performance", + 3:"plugin_smart_103", // "Spin Up Time", + 4:"plugin_smart_104", // "Start Stop Count", + 5:"plugin_smart_105", // "Reallocated Sector Ct", + 7:"plugin_smart_106", // "Seek Error Rate", + 8:"plugin_smart_108", // "Seek Time Performance", + 9:"plugin_smart_109", // "Power On Hours", + 10:"plugin_smart_110", // "Spin Retry Count", + 11:"plugin_smart_111", // "Calibration Retry Count", + 12:"plugin_smart_112", // "Power Cycle Count", + 190:"plugin_smart_290", // "Airflow Temperature", + 191:"plugin_smart_291", // "G-sense Error Rate", + 192:"plugin_smart_292", // "Power-Off Retract Count", + 193:"plugin_smart_293", // "Load Cycle Count", + 194:"plugin_smart_294", // "Temperature", + 195:"plugin_smart_295", // "Hardware ECC Recovered", + 196:"plugin_smart_296", // "Reallocated Event Count", + 197:"plugin_smart_297", // "Current Pending Sector", + 198:"plugin_smart_298", // "Offline Uncorr.", + 199:"plugin_smart_299", // "UDMA CRC Error Count", + 200:"plugin_smart_300", // "Multi Zone Error Rate", + 201:"plugin_smart_301", // "Soft Read Error Rate", + 202:"plugin_smart_302", // "Data Address Mark Errors", + 223:"plugin_smart_323", // "Load Retry Count", + 225:"plugin_smart_325", }; // "Load Cycle Count" + + var html = ''; + + html+=""; + html+=""; + html+=""+genlang(3, false, 'smart')+""; // Name + for (var i = 0; i < smartitems.length ; i++) { + smartid = smartitems[i]["@attributes"]["id"]; + if (smartnames[smartid] !== undefined) { + html+=""+ genlang(100+parseInt(smartid), false, 'smart') + ""; + } else { + html+=""+ smartid + ""; + } + } + html+=""; + html+=""; + + var diskitems = items(data['Plugins']['Plugin_SMART']["disks"]["disk"]); + html += ''; + for (var i = 0; i < diskitems.length; i++) { + html += ''; + html += ''+ diskitems[i]["@attributes"]["name"] + ''; + attribitems = items(diskitems[i]["attribute"]); + var valarray = []; + for (var j = 0;j < attribitems.length; j++) { + valarray[attribitems[j]["@attributes"]["id"]] = attribitems[j]["@attributes"]["raw_value"]; + } + for (var j = 0; j < smartitems.length; j++) { + var smartid = smartitems[j]["@attributes"]["id"]; + var itemvalue = valarray[smartid]; + if ((itemvalue !== undefined) && (itemvalue !== '' )) { + if (smartid === "194") { + html += '' + formatTemp(itemvalue, data["Options"]["@attributes"]["tempFormat"]) + ''; + } else { + html += '' + itemvalue + ''; + } + } else { + html += ''; + } + } + html += ''; + } + html += ''; + $('#smart').empty().append(html); + $('#smart').addClass("sortable"); + sorttable.makeSortable($('#smart')[0]); + sorttable.innerSortFunction.apply($('#smart_name')[0], []); + $('#block_smart').show(); + } else { + $('#block_smart').hide(); + } +} diff --git a/sources/plugins/smart/lang/cz.xml b/sources/plugins/smart/lang/cz.xml new file mode 100644 index 0000000..66be4d4 --- /dev/null +++ b/sources/plugins/smart/lang/cz.xml @@ -0,0 +1,97 @@ + + + + + + S.M.A.R.T Informace + + + Aktualizováno + + + Název + + + Raw Read Error Rate + + + Throughput Performance + + + Spin Up Time + + + Start Stop Count + + + Reallocated Sector Ct + + + Seek Error Rate + + + Seek Time Performance + + + Power On Hours + + + Spin Retry Count + + + Calibration Retry Count + + + Power Cycle Count + + + Airflow Temperature + + + G-sense Error Rate + + + Power-Off Retract Count + + + Load Cycle Count + + + Temperature + + + Hardware ECC Recovered + + + Reallocated Event Count + + + Current Pending Sector + + + Offline Uncorr. + + + UDMA CRC Error Count + + + Multi Zone Error Rate + + + Soft Read Error Rate + + + Data Address Mark Errors + + + Load Retry Count + + + Load Cycle Count + + diff --git a/sources/plugins/smart/lang/en.xml b/sources/plugins/smart/lang/en.xml new file mode 100644 index 0000000..338e9e0 --- /dev/null +++ b/sources/plugins/smart/lang/en.xml @@ -0,0 +1,97 @@ + + + + + + S.M.A.R.T Informations + + + Last refresh + + + Name + + + Raw Read Error Rate + + + Throughput Performance + + + Spin Up Time + + + Start Stop Count + + + Reallocated Sector Ct + + + Seek Error Rate + + + Seek Time Performance + + + Power On Hours + + + Spin Retry Count + + + Calibration Retry Count + + + Power Cycle Count + + + Airflow Temperature + + + G-sense Error Rate + + + Power-Off Retract Count + + + Load Cycle Count + + + Temperature + + + Hardware ECC Recovered + + + Reallocated Event Count + + + Current Pending Sector + + + Offline Uncorr. + + + UDMA CRC Error Count + + + Multi Zone Error Rate + + + Soft Read Error Rate + + + Data Address Mark Errors + + + Load Retry Count + + + Load Cycle Count + + diff --git a/sources/plugins/smart/lang/fr.xml b/sources/plugins/smart/lang/fr.xml new file mode 100644 index 0000000..38e6ee6 --- /dev/null +++ b/sources/plugins/smart/lang/fr.xml @@ -0,0 +1,97 @@ + + + + + + Informations S.M.A.R.T + + + Dernière actualisation: + + + Nom + + + Raw Read Error Rate + + + Throughput Performance + + + Spin Up Time + + + Start Stop Count + + + Reallocated Sector Ct + + + Seek Error Rate + + + Seek Time Performance + + + Power On Hours + + + Spin Retry Count + + + Calibration Retry Count + + + Power Cycle Count + + + Airflow Temperature + + + G-sense Error Rate + + + Power-Off Retract Count + + + Load Cycle Count + + + Temperature + + + Hardware ECC Recovered + + + Reallocated Event Count + + + Current Pending Sector + + + Offline Uncorr. + + + UDMA CRC Error Count + + + Multi Zone Error Rate + + + Soft Read Error Rate + + + Data Address Mark Errors + + + Load Retry Count + + + Load Cycle Count + + diff --git a/sources/plugins/smart/lang/gr.xml b/sources/plugins/smart/lang/gr.xml new file mode 100644 index 0000000..2940e87 --- /dev/null +++ b/sources/plugins/smart/lang/gr.xml @@ -0,0 +1,97 @@ + + + + + + ΠληÏοφοÏίες S.M.A.R.T + + + ΕνημέÏωση + + + Συσκευή + + + Raw Read Error Rate + + + Throughput Performance + + + Spin Up Time + + + Start Stop Count + + + Ανακτημένοι Τομείς + + + Seek Error Rate + + + Seek Time Performance + + + ÎÏες λειτουÏγίας + + + Spin Retry Count + + + Calibration Retry Count + + + Power Cycle Count + + + ΘεÏμοκÏασία ΑέÏος + + + G-sense Error Rate + + + Power-Off Retract Count + + + Load Cycle Count + + + ΘεÏμοκÏασία + + + Hardware ECC Recovered + + + Reallocated Event Count + + + Current Pending Sector + + + Offline Uncorr. + + + UDMA CRC Error Count + + + Multi Zone Error Rate + + + Soft Read Error Rate + + + Data Address Mark Errors + + + Load Retry Count + + + Load Cycle Count + + diff --git a/sources/plugins/smart/lang/pl.xml b/sources/plugins/smart/lang/pl.xml new file mode 100644 index 0000000..363d17f --- /dev/null +++ b/sources/plugins/smart/lang/pl.xml @@ -0,0 +1,97 @@ + + + + + + Informacje S.M.A.R.T + + + Ostatnie odÅ›wieżenie + + + Nazwa + + + Raw Read Error Rate + + + Throughput Performance + + + Spin Up Time + + + Start Stop Count + + + Reallocated Sector Ct + + + Seek Error Rate + + + Seek Time Performance + + + Power On Hours + + + Spin Retry Count + + + Calibration Retry Count + + + Power Cycle Count + + + Airflow Temperature + + + G-sense Error Rate + + + Power-Off Retract Count + + + Load Cycle Count + + + Temperature + + + Hardware ECC Recovered + + + Reallocated Event Count + + + Current Pending Sector + + + Offline Uncorr. + + + UDMA CRC Error Count + + + Multi Zone Error Rate + + + Soft Read Error Rate + + + Data Address Mark Errors + + + Load Retry Count + + + Load Cycle Count + + diff --git a/sources/plugins/smart/lang/ro.xml b/sources/plugins/smart/lang/ro.xml new file mode 100644 index 0000000..deb515a --- /dev/null +++ b/sources/plugins/smart/lang/ro.xml @@ -0,0 +1,97 @@ + + + + + + InformaÈ›ii S.M.A.R.T + + + Ultimul refresh + + + Nume + + + Raw Read Error Rate + + + Throughput Performance + + + Spin Up Time + + + Start Stop Count + + + Reallocated Sector Ct + + + Seek Error Rate + + + Seek Time Performance + + + Power On Hours + + + Spin Retry Count + + + Calibration Retry Count + + + Power Cycle Count + + + Airflow Temperature + + + G-sense Error Rate + + + Power-Off Retract Count + + + Load Cycle Count + + + Temperature + + + Hardware ECC Recovered + + + Reallocated Event Count + + + Current Pending Sector + + + Offline Uncorr. + + + UDMA CRC Error Count + + + Multi Zone Error Rate + + + Soft Read Error Rate + + + Data Address Mark Errors + + + Load Retry Count + + + Load Cycle Count + + diff --git a/sources/plugins/smart/lang/ru.xml b/sources/plugins/smart/lang/ru.xml new file mode 100644 index 0000000..14633aa --- /dev/null +++ b/sources/plugins/smart/lang/ru.xml @@ -0,0 +1,42 @@ + + + + + + СоÑтоÑние Квоты + + + ПоÑледнее обновление + + + Пользователь + + + Байт ИÑпользуетÑÑ + + + Байт Программ + + + Байтов ЖеÑткий диÑк + + + Байт ИÑпользуетÑÑ ÐŸÑ€Ð¾Ñ†ÐµÐ½Ñ‚Ñ‹ + + + Файлы ИÑпользуемые + + + Файлы Программ + + + Файлы ЖеÑткий диÑк + + + Файлов ИÑпользуетÑÑ ÐŸÑ€Ð¾Ñ†ÐµÐ½Ñ‚Ñ‹ + + diff --git a/sources/plugins/smart/smart_bootstrap.html b/sources/plugins/smart/smart_bootstrap.html new file mode 100644 index 0000000..75e1ed4 --- /dev/null +++ b/sources/plugins/smart/smart_bootstrap.html @@ -0,0 +1,11 @@ + diff --git a/sources/plugins/snmppinfo/class.snmppinfo.inc.php b/sources/plugins/snmppinfo/class.snmppinfo.inc.php new file mode 100644 index 0000000..b8eb5d6 --- /dev/null +++ b/sources/plugins/snmppinfo/class.snmppinfo.inc.php @@ -0,0 +1,233 @@ + + * @copyright 2011 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version SVN: $Id: class.snmppinfo.inc.php 661 2012-08-27 11:26:39Z namiltd $ + * @link http://phpsysinfo.sourceforge.net + */ + /** + * SNMPPInfo Plugin, which displays battery state + * + * @category PHP + * @package PSI_Plugin_SNMPPInfo + * @author Mieczyslaw Nalewaj + * @copyright 2011 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version $Id: class.snmppinfo.inc.php 661 2012-08-27 11:26:39Z namiltd $ + * @link http://phpsysinfo.sourceforge.net + */ +class SNMPPInfo extends PSI_Plugin +{ + /** + * variable, which holds the content of the command + * @var array + */ + private $_filecontent = array(); + + /** + * variable, which holds the result before the xml is generated out of this array + * @var array + */ + private $_result = array(); + + /** + * read the data into an internal array and also call the parent constructor + * + * @param String $enc encoding + */ + public function __construct($enc) + { + parent::__construct(__CLASS__, $enc); + switch (strtolower(PSI_PLUGIN_SNMPPINFO_ACCESS)) { + case 'command': + if (defined('PSI_PLUGIN_SNMPPINFO_DEVICES') && is_string(PSI_PLUGIN_SNMPPINFO_DEVICES)) { + if (preg_match(ARRAY_EXP, PSI_PLUGIN_SNMPPINFO_DEVICES)) { + $printers = eval(PSI_PLUGIN_SNMPPINFO_DEVICES); + } else { + $printers = array(PSI_PLUGIN_SNMPPINFO_DEVICES); + } + foreach ($printers as $printer) { + CommonFunctions::executeProgram("snmpwalk", "-Ona -c public -v 1 -r 1 ".$printer." .1.3.6.1.2.1.1.5", $buffer, PSI_DEBUG); + if (strlen($buffer) > 0) { + $this->_filecontent[$printer] = $buffer; + + CommonFunctions::executeProgram("snmpwalk", "-Ona -c public -v 1 -r 1 ".$printer." .1.3.6.1.2.1.43.11.1.1", $buffer2, PSI_DEBUG); + if (strlen($buffer2) > 0) { + $this->_filecontent[$printer] .= "\n".$buffer2; + } + CommonFunctions::executeProgram("snmpwalk", "-Ona -c public -v 1 -r 1 ".$printer." .1.3.6.1.2.1.43.18.1.1", $buffer3, PSI_DEBUG); + if (strlen($buffer3) > 0) { + $this->_filecontent[$printer] .= "\n".$buffer3; + } + } + } + } + break; + case 'php-snmp': + if (!extension_loaded("snmp")) { + $this->global_error->addError("Requirements error", "SNMPPInfo plugin requires the snmp extension to php in order to work properly"); + break; + } + snmp_set_valueretrieval(SNMP_VALUE_LIBRARY); + snmp_set_oid_output_format(SNMP_OID_OUTPUT_NUMERIC); + if (defined('PSI_PLUGIN_SNMPPINFO_DEVICES') && is_string(PSI_PLUGIN_SNMPPINFO_DEVICES)) { + if (preg_match(ARRAY_EXP, PSI_PLUGIN_SNMPPINFO_DEVICES)) { + $printers = eval(PSI_PLUGIN_SNMPPINFO_DEVICES); + } else { + $printers = array(PSI_PLUGIN_SNMPPINFO_DEVICES); + } + foreach ($printers as $printer) { + if (! PSI_DEBUG) { + restore_error_handler(); /* default error handler */ + $old_err_rep = error_reporting(); + error_reporting(E_ERROR); /* fatal errors only */ + } + $bufferarr=snmprealwalk($printer, "public", ".1.3.6.1.2.1.1.5", 1000000, 1); + if (! PSI_DEBUG) { + error_reporting($old_err_rep); /* restore error level */ + set_error_handler('errorHandlerPsi'); /* restore error handler */ + } + if (! empty($bufferarr)) { + $buffer=""; + foreach ($bufferarr as $id=>$string) { + $buffer .= $id." = ".$string."\n"; + } + + if (! PSI_DEBUG) { + restore_error_handler(); /* default error handler */ + $old_err_rep = error_reporting(); + error_reporting(E_ERROR); /* fatal errors only */ + } + $bufferarr2=snmprealwalk($printer, "public", ".1.3.6.1.2.1.43.11.1.1", 1000000, 1); + if (! PSI_DEBUG) { + error_reporting($old_err_rep); /* restore error level */ + set_error_handler('errorHandlerPsi'); /* restore error handler */ + } + if (! empty($bufferarr2)) { + foreach ($bufferarr2 as $id=>$string) { + $buffer .= $id." = ".$string."\n"; + } + } + + if (! PSI_DEBUG) { + restore_error_handler(); /* default error handler */ + $old_err_rep = error_reporting(); + error_reporting(E_ERROR); /* fatal errors only */ + } + $bufferarr3=snmprealwalk($printer, "public", ".1.3.6.1.2.1.43.18.1.1", 1000000, 1); + if (! PSI_DEBUG) { + error_reporting($old_err_rep); /* restore error level */ + set_error_handler('errorHandlerPsi'); /* restore error handler */ + } + if (! empty($bufferarr3)) { + foreach ($bufferarr3 as $id=>$string) { + $buffer .= $id." = ".$string."\n"; + } + } + + if (strlen(trim($buffer)) > 0) { + $this->_filecontent[$printer] = $buffer; + } + } + } + } + break; + case 'data': + if (defined('PSI_PLUGIN_SNMPPINFO_DEVICES') && is_string(PSI_PLUGIN_SNMPPINFO_DEVICES)) { + if (preg_match(ARRAY_EXP, PSI_PLUGIN_SNMPPINFO_DEVICES)) { + $printers = eval(PSI_PLUGIN_SNMPPINFO_DEVICES); + } else { + $printers = array(PSI_PLUGIN_SNMPPINFO_DEVICES); + } + $pn=0; + foreach ($printers as $printer) { + $buffer=""; + if (CommonFunctions::rfts(APP_ROOT."/data/snmppinfo{$pn}.txt", $buffer) && !empty($buffer)) { + $this->_filecontent[$printer] = $buffer; + } + $pn++; + } + } + break; + default: + $this->global_error->addError("switch(PSI_PLUGIN_SNMPPINFO_ACCESS)", "Bad SNMPPInfo configuration in phpsysinfo.ini"); + break; + } + } + + /** + * doing all tasks to get the required informations that the plugin needs + * result is stored in an internal array + * + * @return void + */ + public function execute() + { + if (empty($this->_filecontent)) { + return; + } + foreach ($this->_filecontent as $printer=>$result) { + $lines = preg_split('/\r?\n/', $result); + foreach ($lines as $line) { + if (preg_match('/^\.1\.3\.6\.1\.2\.1\.43\.11\.1\.1\.6\.1\.(.*) = STRING:\s(.*)/', $line, $data)) { + $this->_result[$printer][$data[1]]['prtMarkerSuppliesDescription']=trim($data[2], "\""); + } elseif (preg_match('/^\.1\.3\.6\.1\.2\.1\.43\.11\.1\.1\.7\.1\.(.*) = INTEGER:\s(.*)/', $line, $data)) { + $this->_result[$printer][$data[1]]['prtMarkerSuppliesSupplyUnit']=$data[2]; + } elseif (preg_match('/^\.1\.3\.6\.1\.2\.1\.43\.11\.1\.1\.8\.1\.(.*) = INTEGER:\s(.*)/', $line, $data)) { + $this->_result[$printer][$data[1]]['prtMarkerSuppliesMaxCapacity']=$data[2]; + } elseif (preg_match('/^\.1\.3\.6\.1\.2\.1\.43\.11\.1\.1\.9\.1\.(.*) = INTEGER:\s(.*)/', $line, $data)) { + $this->_result[$printer][$data[1]]['prtMarkerSuppliesLevel']=$data[2]; + } elseif (preg_match('/^\.1\.3\.6\.1\.2\.1\.1\.5\.0 = STRING:\s(.*)/', $line, $data)) { + $this->_result[$printer][0]['prtMarkerSuppliesDescription']=trim($data[1], "\"");; + } elseif (preg_match('/^\.1\.3\.6\.1\.2\.1\.43\.18\.1\.1\.8\.1\.(.*) = STRING:\s(.*)/', $line, $data)) { + $this->_result[$printer][99][$data[1]]["message"]=trim($data[2], "\""); + } elseif (preg_match('/^\.1\.3\.6\.1\.2\.1\.43\.18\.1\.1\.2\.1\.(.*) = INTEGER:\s(.*)/', $line, $data)) { + $this->_result[$printer][99][$data[1]]["severity"]=$data[2]; + } + } + } + } + + /** + * generates the XML content for the plugin + * + * @return SimpleXMLElement entire XML content for the plugin + */ + public function xml() + { + foreach ($this->_result as $printer=>$markersupplies_item) { + $xmlsnmppinfo_printer = $this->xml->addChild("Printer"); + $xmlsnmppinfo_printer->addAttribute("Device", $printer); + foreach ($markersupplies_item as $marker=>$snmppinfo_item) { + + if ($marker==0) { + $xmlsnmppinfo_printer->addAttribute("Name", $snmppinfo_item['prtMarkerSuppliesDescription']); + } elseif ($marker==99) { + foreach ($snmppinfo_item as $item=>$iarr) { + if (isset($iarr["message"]) && $iarr["message"] != "") { + $xmlsnmppinfo_errors = $xmlsnmppinfo_printer->addChild("PrinterMessage"); + $xmlsnmppinfo_errors->addAttribute("Message", $iarr["message"]); + $xmlsnmppinfo_errors->addAttribute("Severity", $iarr["severity"]); + } + } + } else { + $xmlsnmppinfo = $xmlsnmppinfo_printer->addChild("MarkerSupplies"); + + $xmlsnmppinfo->addAttribute("Description", isset($snmppinfo_item['prtMarkerSuppliesDescription']) ? $snmppinfo_item['prtMarkerSuppliesDescription'] : ""); + $xmlsnmppinfo->addAttribute("SupplyUnit", isset($snmppinfo_item['prtMarkerSuppliesSupplyUnit']) ? $snmppinfo_item['prtMarkerSuppliesSupplyUnit'] : ""); + $xmlsnmppinfo->addAttribute("MaxCapacity", isset($snmppinfo_item['prtMarkerSuppliesMaxCapacity']) ? $snmppinfo_item['prtMarkerSuppliesMaxCapacity'] : ""); + $xmlsnmppinfo->addAttribute("Level", isset($snmppinfo_item['prtMarkerSuppliesLevel']) ? $snmppinfo_item['prtMarkerSuppliesLevel'] : ""); + } + } + } + + return $this->xml->getSimpleXmlElement(); + } +} diff --git a/sources/plugins/snmppinfo/js/snmppinfo.js b/sources/plugins/snmppinfo/js/snmppinfo.js new file mode 100644 index 0000000..ac0296d --- /dev/null +++ b/sources/plugins/snmppinfo/js/snmppinfo.js @@ -0,0 +1,140 @@ +/*************************************************************************** + * Copyright (C) 2008 by phpSysInfo - A PHP System Information Script * + * http://phpsysinfo.sourceforge.net/ * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +// +// $Id: snmppinfo.js 661 2012-08-27 11:26:39Z namiltd $ +// + +/*global $, jQuery, buildBlock, datetime, plugin_translate, createBar, genlang */ + +"use strict"; + +var snmppinfo_show = false; + +/** + * build the table where content is inserted + * @param {jQuery} xml plugin-XML + */ +function snmppinfo_buildTable(xml) { + var html = "", tree = [], closed = []; + + $("#Plugin_SNMPPInfo #Plugin_SNMPPInfoTable").remove(); + + html += " \n"; + html += " \n"; + html += " \n"; + html += " \n"; + html += " \n"; + html += " \n"; + html += " \n"; + html += " \n"; + html += " \n"; + + var lastdev="", index = 0 ; + $("Plugins Plugin_SNMPPInfo Printer MarkerSupplies", xml).each(function snmppinfo_getprinters(id) { + var close = 0, name = "", device = "", desc = "", unit = 0, max = 0, level = 0, percent = 0, units = ""; + name = $(this).parent().attr("Name"); + device = $(this).parent().attr("Device"); + desc = $(this).attr("Description"); + + unit = parseInt($(this).attr("SupplyUnit"), 10); + max = parseInt($(this).attr("MaxCapacity"), 10); + level = parseInt($(this).attr("Level"), 10); + + if (max>0 && (level>=0) && (level<=max) ) { + percent = Math.round(100*level/max); + units = level+" / "+max; + } else if (max==-2 && (level>=0) && (level<=100) ) { + percent = level; + units = level+" / 100"; + } else if (level==-3) { + percent = 100; + units = genlang(6, false, "SNMPPInfo") + } else { + percent = 0; + units = genlang(7, false, "SNMPPInfo") + } + + if (device!=lastdev) { + html += " \n"; + index = tree.push(0); + lastdev = device; + } + html += " \n"; + + tree.push(index); + snmppinfo_show = true; + }); + + html += " \n"; + html += "
    " + genlang(3, false, "SNMPPInfo") + "" + genlang(4, false, "SNMPPInfo") + "" + genlang(5, false, "SNMPPInfo") + "
    " + device + " (" + name + ")
    " + desc + "" + createBar(percent) +"" + units +"
    \n"; + + $("#Plugin_SNMPPInfo").append(html); + + $("#Plugin_SNMPPInfoTable").jqTreeTable(tree, { + openImg: "./gfx/treeTable/tv-collapsable.gif", + shutImg: "./gfx/treeTable/tv-expandable.gif", + leafImg: "./gfx/treeTable/tv-item.gif", + lastOpenImg: "./gfx/treeTable/tv-collapsable-last.gif", + lastShutImg: "./gfx/treeTable/tv-expandable-last.gif", + lastLeafImg: "./gfx/treeTable/tv-item-last.gif", + vertLineImg: "./gfx/treeTable/vertline.gif", + blankImg: "./gfx/treeTable/blank.gif", + collapse: closed, + column: 0, + striped: true, + highlight: false, + state: false + }); + +} + +/** + * load the xml via ajax + */ +function snmppinfo_request() { + $("#Reload_SNMPPInfoTable").attr("title", "reload"); + $.ajax({ + url: "xml.php?plugin=SNMPPInfo", + dataType: "xml", + error: function snmppinfo_error() { + $.jGrowl("Error loading XML document for Plugin SNMPPInfo!"); + }, + success: function snmppinfo_buildblock(xml) { + populateErrors(xml); + snmppinfo_buildTable(xml); + if (snmppinfo_show) { + plugin_translate("SNMPPInfo"); + $("#Plugin_SNMPPInfo").show(); + } + } + }); +} + +$(document).ready(function snmppinfo_buildpage() { + $("#footer").before(buildBlock("SNMPPInfo", 1, true)); + $("#Plugin_SNMPPInfo").css("width", "451px"); + + snmppinfo_request(); + + $("#Reload_SNMPPInfoTable").click(function snmppinfo_reload(id) { + snmppinfo_request(); + $(this).attr("title", datetime()); + }); +}); diff --git a/sources/plugins/snmppinfo/js/snmppinfo_bootstrap.js b/sources/plugins/snmppinfo/js/snmppinfo_bootstrap.js new file mode 100644 index 0000000..f556557 --- /dev/null +++ b/sources/plugins/snmppinfo/js/snmppinfo_bootstrap.js @@ -0,0 +1,99 @@ +function renderPlugin_snmppinfo(data) { + + var directives = { + Device: { + text: function () { + var Name = (this["Name"] !== undefined) ? (' (' + this["Name"] + ')'): ''; + return this["Device"] + Name; + } + }, + Percent: { + html: function () { + var max = parseInt(this["MaxCapacity"]); + var level = parseInt(this["Level"]); + var percent = 0; + + if (max>0 && (level>=0) && (level<=max) ) { + percent = Math.round(100*level/max); + } else if (max==-2 && (level>=0) && (level<=100) ) { + percent = level; + } else if (level==-3) { + percent = 100; + } + return '
    ' + + '
    ' + percent + '%
    '; + } + }, + Units: { + html: function () { + var max = parseInt(this["MaxCapacity"]); + var level = parseInt(this["Level"]); + + if (max>0 && (level>=0) && (level<=max) ) { + return level+" / "+max; + } else if (max==-2 && (level>=0) && (level<=100) ) { + return level+" / 100"; + } else if (level==-3) { + return genlang(6, false, 'snmppinfo'); // enough + } else { + return getlang(7, false, 'snmppinfo'); // unknown + } + } + } + }; + + if (data['Plugins']['Plugin_SNMPPInfo'] !== undefined) { + var printers = items(data['Plugins']['Plugin_SNMPPInfo']['Printer']); + if (printers.length > 0) { + var html = ""; + for (var i = 0; i < printers.length; i++) { + html+=""; + html+=""; + html+=""; + html+=""; + html+=""; + + try { + var datas = items(printers[i]["MarkerSupplies"]); + for (var j = 0; j < datas.length; j++) { + html+=""; + html+=""; + html+=""; + html+=""; + html+=""; + } + } + catch (err) { + $("#snmppinfo-" + i).hide(); + } + } + + $("#snmppinfo-data").empty().append(html); + + for (var i = 0; i < printers.length; i++) { + $('#snmppinfo-'+ i).render(printers[i]["@attributes"], directives); + try { + var datas = items(printers[i]["MarkerSupplies"]); + for (var j = 0; j < datas.length; j++) { + $('#snmppinfo-'+ i+ "-" + j).render(datas[j]["@attributes"], directives); + } + } + catch (err) { + $("#snmppinfo-" + i).hide(); + } + } + + $('#snmppinfo').treegrid({ + initialState: 'expanded', + expanderExpandedClass: 'normalicon normalicon-down', + expanderCollapsedClass: 'normalicon normalicon-right' + }); + + $('#block_snmppinfo').show(); + } else { + $('#block_snmppinfo').hide(); + } + } else { + $('#block_snmppinfo').hide(); + } +} diff --git a/sources/plugins/snmppinfo/lang/cz.xml b/sources/plugins/snmppinfo/lang/cz.xml new file mode 100644 index 0000000..08723e7 --- /dev/null +++ b/sources/plugins/snmppinfo/lang/cz.xml @@ -0,0 +1,30 @@ + + + + + + Informace o tiskárnách + + + Poslední aktualizace + + + Tiskárna + + + Procenta + + + Jednotky + + + dostatek + + + neznámé + + diff --git a/sources/plugins/snmppinfo/lang/de.xml b/sources/plugins/snmppinfo/lang/de.xml new file mode 100644 index 0000000..487d71e --- /dev/null +++ b/sources/plugins/snmppinfo/lang/de.xml @@ -0,0 +1,30 @@ + + + + + + Drucker Information + + + Letzte Aktualisierung + + + Drucker + + + Prozent + + + Units + + + genug + + + unbekannt + + diff --git a/sources/plugins/snmppinfo/lang/en.xml b/sources/plugins/snmppinfo/lang/en.xml new file mode 100644 index 0000000..8e53c6d --- /dev/null +++ b/sources/plugins/snmppinfo/lang/en.xml @@ -0,0 +1,30 @@ + + + + + + Printer Information + + + Last refresh + + + Printer + + + Percent + + + Units + + + enough + + + unknown + + diff --git a/sources/plugins/snmppinfo/lang/fr.xml b/sources/plugins/snmppinfo/lang/fr.xml new file mode 100644 index 0000000..62b681f --- /dev/null +++ b/sources/plugins/snmppinfo/lang/fr.xml @@ -0,0 +1,29 @@ + + + + + Imprimantes + + + Dernière actualisation + + + Imprimante + + + Pourcent + + + Unité + + + suffisamment + + + inconnu + + diff --git a/sources/plugins/snmppinfo/lang/pl.xml b/sources/plugins/snmppinfo/lang/pl.xml new file mode 100644 index 0000000..c56909d --- /dev/null +++ b/sources/plugins/snmppinfo/lang/pl.xml @@ -0,0 +1,30 @@ + + + + + + Drukarki + + + Ostatnie odÅ›wieżenie + + + Drukarka + + + Procent + + + Jednostek + + + dość + + + nieznany + + diff --git a/sources/plugins/snmppinfo/lang/ro.xml b/sources/plugins/snmppinfo/lang/ro.xml new file mode 100644 index 0000000..3a75175 --- /dev/null +++ b/sources/plugins/snmppinfo/lang/ro.xml @@ -0,0 +1,30 @@ + + + + + + InformaÈ›ii Imprimantă + + + Ultimul refresh + + + Imprimantă + + + Procent + + + Unități + + + suficient + + + necunoscut + + diff --git a/sources/plugins/snmppinfo/lang/ru.xml b/sources/plugins/snmppinfo/lang/ru.xml new file mode 100644 index 0000000..9b072da --- /dev/null +++ b/sources/plugins/snmppinfo/lang/ru.xml @@ -0,0 +1,30 @@ + + + + + + Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ принтерах + + + ПоÑледнее обновление + + + Принтер + + + Процент + + + Еденицы + + + доÑтаточно + + + неизвеÑтный + + diff --git a/sources/plugins/snmppinfo/snmppinfo_bootstrap.html b/sources/plugins/snmppinfo/snmppinfo_bootstrap.html new file mode 100644 index 0000000..a53a97d --- /dev/null +++ b/sources/plugins/snmppinfo/snmppinfo_bootstrap.html @@ -0,0 +1,20 @@ + diff --git a/sources/plugins/updatenotifier/class.updatenotifier.inc.php b/sources/plugins/updatenotifier/class.updatenotifier.inc.php new file mode 100644 index 0000000..d60773e --- /dev/null +++ b/sources/plugins/updatenotifier/class.updatenotifier.inc.php @@ -0,0 +1,109 @@ + + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version SVN: $Id: class.updatenotifier.inc.php 661 2012-08-27 11:26:39Z namiltd $ + * @link http://phpsysinfo.sourceforge.net + */ +/** + * UpdateNotifier Plugin, which displays update notification from Ubuntu Landscape system + * + * @category PHP + * @package PSI_Plugin_UpdateNotifier + * @author Damien ROTH + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version $Id: class.updatenotifier.inc.php 661 2012-08-27 11:26:39Z namiltd $ + * @link http://phpsysinfo.sourceforge.net + */ +class UpdateNotifier extends PSI_Plugin +{ + /** + * variable, which holds the content of the command + * @var array + */ + private $_filecontent = array(); + + /** + * variable, which holds the result before the xml is generated out of this array + * @var array + */ + private $_result = array(); + + /** + * read the data into an internal array and also call the parent constructor + * + * @param String $enc encoding + */ + public function __construct($enc) + { + parent::__construct(__CLASS__, $enc); + + CommonFunctions::rfts(PSI_PLUGIN_UPDATENOTIFIER_FILE, $buffer_info); + // Remove blank lines + $this->_filecontent = preg_split("/\n/", $buffer_info, -1, PREG_SPLIT_NO_EMPTY); + } + + /** + * doing all tasks to get the required informations that the plugin needs + * result is stored in an internal array + * + * @return void + */ + public function execute() + { + if (empty($this->_filecontent)) { + return; + } + + if (PSI_PLUGIN_UPDATENOTIFIER_UBUNTU_LANDSCAPE_FORMAT === true) { + /* + Ubuntu Landscape format: + - line 1: packages to update + - line 2: security packages to update + */ + if (count($this->_filecontent) == 2) { + foreach ($this->_filecontent as $line) { + list($num, $text) = explode(" ", $line, 2); + $this->_result[] = $num; + } + } else { + $this->global_error->addWarning("Unable to parse UpdateNotifier file"); + } + } else { + /* + Universal format: A;B + - A: packages to update + - B: security packages to update + */ + if (count($this->_filecontent) == 1 && strpos($this->_filecontent[0], ";") !== false) { + $this->_result = explode(";", $this->_filecontent[0]); + } else { + $this->global_error->addWarning("Unable to parse UpdateNotifier file"); + } + } + } + + /** + * generates the XML content for the plugin + * + * @return SimpleXMLElement entire XML content for the plugin + */ + public function xml() + { + if (!empty($this->_result)) { + $xmluu = $this->xml->addChild("UpdateNotifier"); + $xmluu->addChild("packages", $this->_result[0]); + $xmluu->addChild("security", $this->_result[1]); + } + + return $this->xml->getSimpleXmlElement(); + } +} diff --git a/sources/plugins/updatenotifier/js/updatenotifier.js b/sources/plugins/updatenotifier/js/updatenotifier.js new file mode 100644 index 0000000..cb271bc --- /dev/null +++ b/sources/plugins/updatenotifier/js/updatenotifier.js @@ -0,0 +1,113 @@ +/*************************************************************************** + * Copyright (C) 2008 by phpSysInfo - A PHP System Information Script * + * http://phpsysinfo.sourceforge.net/ * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + +/*global $, jQuery, buildBlock, datetime, plugin_translate, genlang, createBar */ + +"use strict"; + +var UpdateNotifier_show = false, UpdateNotifier_table; +/** + * insert content into table + * @param {jQuery} xml plugin-XML + */ +function updatenotifier_populate(xml) { + var html = ""; + + $("Plugins Plugin_UpdateNotifier UpdateNotifier", xml).each(function(idp) { + var packages = "", security = ""; + packages = $("packages", this).text(); + security = $("security", this).text(); + + //UpdateNotifier_table.fnAddData([packages]); + //UpdateNotifier_table.fnAddData([security]); + + html = " \n"; + html += " " + packages + " " + genlang(3, false, "UpdateNotifier") + "\n"; + html += " \n"; + html += " \n"; + html += " " + security + " " + genlang(4, false, "UpdateNotifier") + "\n"; + html += " \n"; + + $("#Plugin_UpdateNotifier tbody").empty().append(html); + + if ((packages == 0) && (security == 0)) { + $("#UpdateNotifierTable-info").html(genlang(5, false, "UpdateNotifier")); + } else { + $("#UpdateNotifierTable-info").html(genlang(2, false, "UpdateNotifier")); + } + + UpdateNotifier_show = true; + }); +} + +/** + * fill the plugin block with table structure + */ +function updatenotifier_buildTable() { + var html = ""; + + html += "\n"; + html += " \n"; + html += " \n"; + html += " \n"; + html += " \n"; + html += " \n"; + html += " \n"; + html += " \n"; + html += "
    " + genlang(2, false, "UpdateNotifier") + "
    \n"; + + $("#Plugin_UpdateNotifier").append(html); + +} + +/** + * load the xml via ajax + */ +function updatenotifier_request() { + $("#Reload_UpdateNotifierTable").attr("title", "reload"); + $.ajax({ + url: "xml.php?plugin=UpdateNotifier", + dataType: "xml", + error: function () { + $.jGrowl("Error loading XML document for Plugin UpdateNotifier!"); + }, + success: function updatenotifier_buildblock(xml) { + populateErrors(xml); + updatenotifier_populate(xml); + if (UpdateNotifier_show) { + plugin_translate("UpdateNotifier"); + $("#Plugin_UpdateNotifier").show(); + } + } + }); +} + +$(document).ready(function() { + $("#footer").before(buildBlock("UpdateNotifier", 1, true)); + $("#Plugin_UpdateNotifier").css("width", "451px"); + + updatenotifier_buildTable(); + updatenotifier_request(); + + $("#Reload_UpdateNotifierTable").click(function updatenotifier_reload(id) { + updatenotifier_request(); + $(this).attr("title", datetime()); + }); +}); diff --git a/sources/plugins/updatenotifier/js/updatenotifier_bootstrap.js b/sources/plugins/updatenotifier/js/updatenotifier_bootstrap.js new file mode 100644 index 0000000..c399a5d --- /dev/null +++ b/sources/plugins/updatenotifier/js/updatenotifier_bootstrap.js @@ -0,0 +1,25 @@ +function renderPlugin_updatenotifier(data) { + + var directives = { + updateNotifierNbPackages: { + text: function () { + return this['packages']; + } + }, + updateNotifierNbSecPackages: { + text: function () { + return this['security']; + } + } + }; + if ((data['Plugins']['Plugin_UpdateNotifier'] !== undefined) && (data['Plugins']['Plugin_UpdateNotifier']["UpdateNotifier"] !== undefined)){ + $('#updatenotifier').render(data['Plugins']['Plugin_UpdateNotifier']["UpdateNotifier"], directives); + if ((data['Plugins']['Plugin_UpdateNotifier']["UpdateNotifier"]["packages"] == 0) && + (data['Plugins']['Plugin_UpdateNotifier']["UpdateNotifier"]["security"] == 0) ) { + $("#updatenotifier-info").html(""+genlang(5, false, 'updatenotifier')+""); + } + $('#block_updatenotifier').show(); + } else { + $('#block_updatenotifier').hide(); + } +} diff --git a/sources/plugins/updatenotifier/lang/cz.xml b/sources/plugins/updatenotifier/lang/cz.xml new file mode 100644 index 0000000..4b85473 --- /dev/null +++ b/sources/plugins/updatenotifier/lang/cz.xml @@ -0,0 +1,30 @@ + + + + + + Notifikátor aktualizací + + + Jsou dostupné aktualizace! + + + balíÄků je pÅ™ipraveno k aktualizaci. + + + balíÄků obsahuje bezpeÄnostní aktualizace. + + + Žádné aktualizace jsou dostupné + + + Number of packages + + + Number of security packages + + diff --git a/sources/plugins/updatenotifier/lang/de.xml b/sources/plugins/updatenotifier/lang/de.xml new file mode 100644 index 0000000..0a99ebc --- /dev/null +++ b/sources/plugins/updatenotifier/lang/de.xml @@ -0,0 +1,30 @@ + + + + + + Updates Notifier + + + Updates verfügbar + + + Pakete können aktualisiert werden. + + + Updates sind Sicherheits-Updates. + + + Keine Updates verfügbar + + + Anzahl Pakete + + + Anzahl Sicherheitspakete + + diff --git a/sources/plugins/updatenotifier/lang/en.xml b/sources/plugins/updatenotifier/lang/en.xml new file mode 100644 index 0000000..82ed0c9 --- /dev/null +++ b/sources/plugins/updatenotifier/lang/en.xml @@ -0,0 +1,30 @@ + + + + + + Updates Notifier + + + Updates available + + + packages can be updated. + + + updates are security updates. + + + No updates available + + + Number of packages + + + Number of security packages + + diff --git a/sources/plugins/updatenotifier/lang/fr.xml b/sources/plugins/updatenotifier/lang/fr.xml new file mode 100644 index 0000000..0e71fb9 --- /dev/null +++ b/sources/plugins/updatenotifier/lang/fr.xml @@ -0,0 +1,30 @@ + + + + + + Updates Notifier + + + Mises à jour disponibles + + + paquets peuvent être mit à jour. + + + mises à jour concernent la sécurité. + + + Pas de mises à jour disponibles + + + Number of packages + + + Number of security packages + + diff --git a/sources/plugins/updatenotifier/lang/pl.xml b/sources/plugins/updatenotifier/lang/pl.xml new file mode 100644 index 0000000..a92907f --- /dev/null +++ b/sources/plugins/updatenotifier/lang/pl.xml @@ -0,0 +1,30 @@ + + + + + + Updates Notifier + + + Aktualizacje dostÄ™pne + + + pakietów do aktualizacji. + + + to aktualizacje zabezpieczeÅ„. + + + Brak dostÄ™pnych aktualizacji + + + Liczba pakietów aktualizacyjnych + + + Liczba pakietów aktualizacji zabezpieczeÅ„ + + diff --git a/sources/plugins/updatenotifier/lang/ro.xml b/sources/plugins/updatenotifier/lang/ro.xml new file mode 100644 index 0000000..4d44189 --- /dev/null +++ b/sources/plugins/updatenotifier/lang/ro.xml @@ -0,0 +1,30 @@ + + + + + + Updates Notifier + + + Actualizări Disponibile + + + Pachetele pot fi actualizate. + + + Sunt actualizări de securitate. + + + Nu actualizări disponibile + + + Number of packages + + + Number of security packages + + diff --git a/sources/plugins/updatenotifier/lang/ru.xml b/sources/plugins/updatenotifier/lang/ru.xml new file mode 100644 index 0000000..2a04c76 --- /dev/null +++ b/sources/plugins/updatenotifier/lang/ru.xml @@ -0,0 +1,30 @@ + + + + + + ÐžÐ¿Ð¾Ð²ÐµÑ‰ÐµÐ½Ð¸Ñ Ð¾Ð± обновлениÑÑ… + + + ДоÑтупно обновление + + + Пакеты могут быть обновлены. + + + ÐžÐ±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð±ÐµÐ·Ð¾Ð¿Ð°ÑноÑти. + + + Ðет доÑтупных обновлений + + + Number of packages + + + Number of security packages + + diff --git a/sources/plugins/updatenotifier/updatenotifier_bootstrap.html b/sources/plugins/updatenotifier/updatenotifier_bootstrap.html new file mode 100644 index 0000000..35f1bac --- /dev/null +++ b/sources/plugins/updatenotifier/updatenotifier_bootstrap.html @@ -0,0 +1,14 @@ + diff --git a/sources/plugins/uprecords/class.uprecords.inc.php b/sources/plugins/uprecords/class.uprecords.inc.php new file mode 100644 index 0000000..1753e8c --- /dev/null +++ b/sources/plugins/uprecords/class.uprecords.inc.php @@ -0,0 +1,124 @@ + + * @copyright 2014 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version SVN: $Id: class.uprecords.inc.php 661 2014-01-08 11:26:39Z aolah76 $ + * @link http://phpsysinfo.sourceforge.net + */ +/** + * Uprecords plugin, which displays all uprecords informations available + * + * @category PHP + * @package PSI_Plugin_Uprecords + * @author Ambrus Sandor Olah + * @copyright 2014 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version Release: 1.0 + * @link http://phpsysinfo.sourceforge.net + */ + +class uprecords extends PSI_Plugin +{ + private $_lines; + + public function __construct($enc) + { + parent::__construct(__CLASS__, $enc); + + $this->_lines = array(); + } + + /** + * get uprecords information + * + * @return array uprecords in array with label + */ + + private function uprecords() + { + $result = array(); + $i = 0; + + foreach ($this->_lines as $line) { + if (($i > 1) and (strpos($line, '---') === false)) { + $buffer = preg_split("/\s*[ |]\s+/", ltrim(ltrim($line, '->'), ' ')); + if (strpos($line, '->') !== false) { + $buffer[0] = '-> '.$buffer[0]; + } + + if (count($buffer) > 4) { + $buffer[3] = $buffer[3].' '.$buffer[4]; + } + + $result[$i]['hash'] = $buffer[0]; + $result[$i]['Uptime'] = $buffer[1]; + $result[$i]['System'] = $buffer[2]; + //Date formating + $result[$i]['Bootup'] = preg_replace("/^(\S+)(\s+)/", "$1,$2", preg_replace("/^(\S+\s+\S+\s+)(\d)(\s+)/", "$1 0$2$3", $buffer[3]." GMT")); + } + $i++; + } + + return $result; + } + + public function execute() + { + $this->_lines = array(); + switch (strtolower(PSI_PLUGIN_UPRECORDS_ACCESS)) { + case 'command': + $lines = ""; + $oldtz=getenv("TZ"); + putenv("TZ=GMT"); + $options = ""; + if (defined('PSI_PLUGIN_UPRECORDS_MAX_ENTRIES')) { + if (PSI_PLUGIN_UPRECORDS_MAX_ENTRIES === false) { + $options=" -m 0"; + } elseif (PSI_PLUGIN_UPRECORDS_MAX_ENTRIES === true) { + $options=" -m 1"; + } elseif ((PSI_PLUGIN_UPRECORDS_MAX_ENTRIES > 1) && (PSI_PLUGIN_UPRECORDS_MAX_ENTRIES != 10)) { + $options=" -m ".PSI_PLUGIN_UPRECORDS_MAX_ENTRIES; + } + } + if (CommonFunctions::executeProgram('uprecords', '-a -w'.$options, $lines) && !empty($lines)) + $this->_lines = preg_split("/\n/", $lines, -1, PREG_SPLIT_NO_EMPTY); + putenv("TZ=".$oldtz); + break; + case 'data': + if (CommonFunctions::rfts(APP_ROOT."/data/uprecords.txt", $lines) && !empty($lines)) + $this->_lines = preg_split("/\n/", $lines, -1, PREG_SPLIT_NO_EMPTY); + break; + default: + $this->error->addConfigError('__construct()', 'PSI_PLUGIN_UPRECORDS_ACCESS'); + break; + } + } + + public function xml() + { + if (empty($this->_lines)) + return $this->xml->getSimpleXmlElement(); + + $arrBuff = $this->uprecords(); + if (sizeof($arrBuff) > 0) { + $uprecords = $this->xml->addChild("Uprecords"); + foreach ($arrBuff as $arrValue) { + $item = $uprecords->addChild('Item'); + $item->addAttribute('hash', $arrValue['hash']); + $item->addAttribute('Uptime', $arrValue['Uptime']); + $item->addAttribute('System', $arrValue['System']); + $item->addAttribute('Bootup', $arrValue['Bootup']); + } + } + + return $this->xml->getSimpleXmlElement(); + } +} diff --git a/sources/plugins/uprecords/js/uprecords.js b/sources/plugins/uprecords/js/uprecords.js new file mode 100644 index 0000000..069e4c2 --- /dev/null +++ b/sources/plugins/uprecords/js/uprecords.js @@ -0,0 +1,113 @@ +/*************************************************************************** + * Copyright (C) 2008 by phpSysInfo - A PHP System Information Script * + * http://phpsysinfo.sourceforge.net/ * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + +//$Id: uprecords.js 661 2014-01-08 11:26:39 aolah76 $ + + +/*global $, jQuery, buildBlock, datetime, plugin_translate, genlang, createBar */ + +"use strict"; + +var uprecords_show = false; + +/** + * insert content into table + * @param {jQuery} xml plugin-XML + */ + +function uprecords_populate(xml) { + + var html = ""; + + $("Plugins Plugin_uprecords uprecords Item", xml).each(function uprecords_getitem(idp) { + html += " \n"; + html += " " + $(this).attr("hash") + "\n"; + html += " " + $(this).attr("Uptime") + "\n"; + html += " " + $(this).attr("System") + "\n"; +/* var lastboot = new Date($(this).attr("Bootup")); + if (typeof(lastboot.toUTCString)==="function") { + html += " " + lastboot.toUTCString() + "\n"; + } else { //deprecated + html += " " + lastboot.toGMTString() + "\n"; + } */ + html += " " + $(this).attr("Bootup") + "\n"; + html += " \n"; + uprecords_show = true; + }); + + $("#Plugin_uprecordsTable-tbody").empty().append(html); + $('#Plugin_uprecordsTable tr:nth-child(even)').addClass('even'); + +} + +function uprecords_buildTable() { + var html = ""; + + html += "\n"; + html += " \n"; + html += " \n"; + html += " \n"; + html += " \n"; + html += " \n"; + html += " \n"; + html += " \n"; + html += " \n"; + html += " \n"; + html += " \n"; + html += "
    " + genlang(101, false, "uprecords") + "" + genlang(102, false, "uprecords") + "" + genlang(103, false, "uprecords") + "" + genlang(104, false, "uprecords") + "
    \n"; + $("#Plugin_uprecords").append(html); +} + +/** + * load the xml via ajax + */ + +function uprecords_request() { + $("#Reload_uprecordsTable").attr("title", "reload"); + $.ajax({ + url: "xml.php?plugin=uprecords", + dataType: "xml", + error: function uprecords_error() { + $.jGrowl("Error loading XML document for Plugin uprecords!"); + }, + success: function uprecords_buildblock(xml) { + populateErrors(xml); + uprecords_populate(xml); + if (uprecords_show) { + plugin_translate("uprecords"); + $("#Plugin_uprecords").show(); + } + } + }); +} + +$(document).ready(function uprecords_buildpage() { + $("#footer").before(buildBlock("uprecords", 1, true)); + $("#Plugin_uprecords").css("width", "915px"); + + uprecords_buildTable(); + + uprecords_request(); + + $("#Reload_uprecordsTable").click(function uprecords_reload(id) { + uprecords_request(); + $(this).attr("title", datetime()); + }); +}); diff --git a/sources/plugins/uprecords/js/uprecords_bootstrap.js b/sources/plugins/uprecords/js/uprecords_bootstrap.js new file mode 100644 index 0000000..0cd4a36 --- /dev/null +++ b/sources/plugins/uprecords/js/uprecords_bootstrap.js @@ -0,0 +1,25 @@ +function renderPlugin_uprecords(data) { + + var directives = { + hash: { + html: function () { + return this["hash"]; + } + } + }; + + if ((data['Plugins']['Plugin_uprecords'] !== undefined) && (data['Plugins']['Plugin_uprecords']['Uprecords'] !== undefined)) { + var upitems = items(data['Plugins']['Plugin_uprecords']['Uprecords']['Item']); + if (upitems.length > 0) { + var up_memory = []; + up_memory.push_attrs(upitems); + $('#uprecords-data').render(up_memory, directives); + + $('#block_uprecords').show(); + } else { + $('#block_uprecords').hide(); + } + } else { + $('#block_uprecords').hide(); + } +} diff --git a/sources/plugins/uprecords/lang/en.xml b/sources/plugins/uprecords/lang/en.xml new file mode 100644 index 0000000..8dfa6b6 --- /dev/null +++ b/sources/plugins/uprecords/lang/en.xml @@ -0,0 +1,27 @@ + + + + + + Uprecords + + + Last refresh + + + # + + + Uptime + + + System + + + Boot up + + diff --git a/sources/plugins/uprecords/lang/fr.xml b/sources/plugins/uprecords/lang/fr.xml new file mode 100644 index 0000000..99f8c9b --- /dev/null +++ b/sources/plugins/uprecords/lang/fr.xml @@ -0,0 +1,26 @@ + + + + + Uprecords + + + Dernière actualisation + + + # + + + Uptime + + + Système + + + Démarrage + + diff --git a/sources/plugins/uprecords/lang/hu.xml b/sources/plugins/uprecords/lang/hu.xml new file mode 100644 index 0000000..f06c6ca --- /dev/null +++ b/sources/plugins/uprecords/lang/hu.xml @@ -0,0 +1,27 @@ + + + + + + Uprecords + + + Last refresh + + + # + + + Uptime + + + Rendszer + + + Rendszerindítás idÅ‘pontja + + diff --git a/sources/plugins/uprecords/lang/pl.xml b/sources/plugins/uprecords/lang/pl.xml new file mode 100644 index 0000000..273837e --- /dev/null +++ b/sources/plugins/uprecords/lang/pl.xml @@ -0,0 +1,27 @@ + + + + + + Uprecords + + + Last refresh + + + # + + + Czas pracy + + + System + + + WystartowaÅ‚ + + diff --git a/sources/plugins/uprecords/lang/ro.xml b/sources/plugins/uprecords/lang/ro.xml new file mode 100644 index 0000000..e9f609c --- /dev/null +++ b/sources/plugins/uprecords/lang/ro.xml @@ -0,0 +1,27 @@ + + + + + + Uprecords + + + Ultimul refresh + + + # + + + Uptime + + + System + + + Boot up + + diff --git a/sources/plugins/uprecords/lang/ru.xml b/sources/plugins/uprecords/lang/ru.xml new file mode 100644 index 0000000..5d90677 --- /dev/null +++ b/sources/plugins/uprecords/lang/ru.xml @@ -0,0 +1,27 @@ + + + + + + СоÑтоÑное ÑиÑтемы + + + ПоÑледние обновление + + + # + + + Ðптайм + + + СиÑтема + + + Загружено + + diff --git a/sources/plugins/uprecords/uprecords_bootstrap.html b/sources/plugins/uprecords/uprecords_bootstrap.html new file mode 100644 index 0000000..180b74c --- /dev/null +++ b/sources/plugins/uprecords/uprecords_bootstrap.html @@ -0,0 +1,27 @@ + diff --git a/sources/read_config.php b/sources/read_config.php new file mode 100644 index 0000000..407e6aa --- /dev/null +++ b/sources/read_config.php @@ -0,0 +1,272 @@ +$group) { + if (strtoupper($name)=="MAIN") { + $name_prefix='PSI_'; + } elseif (strtoupper(substr($name, 0, 7))=="SENSOR_") { + $name_prefix='PSI_'.strtoupper($name).'_'; + } else { + $name_prefix='PSI_PLUGIN_'.strtoupper($name).'_'; + } + foreach ($group as $param=>$value) { + if ((trim($value)==="") || (trim($value)==="0")) { + define($name_prefix.strtoupper($param), false); + } elseif (trim($value)==="1") { + define($name_prefix.strtoupper($param), true); + } else { + if (strstr($value, ',')) { + define($name_prefix.strtoupper($param), 'return '.var_export(preg_split('/\s*,\s*/', trim($value), -1, PREG_SPLIT_NO_EMPTY), 1).';'); + } else { + define($name_prefix.strtoupper($param), trim($value)); + } + } + } + } + } + + if (defined('PSI_ALLOWED') && is_string(PSI_ALLOWED)) { + if (preg_match(ARRAY_EXP, PSI_ALLOWED)) { + $allowed = eval(strtolower(PSI_ALLOWED)); + } else { + $allowed = array(strtolower(PSI_ALLOWED)); + } + + if (isset($_SERVER["HTTP_X_FORWARDED_FOR"])) { + $ip = $_SERVER["HTTP_X_FORWARDED_FOR"]; + } else { + if (isset($_SERVER["HTTP_CLIENT_IP"])) { + $ip = $_SERVER["HTTP_CLIENT_IP"]; + } else { + $ip = $_SERVER["REMOTE_ADDR"]; + } + } + $ip = preg_replace("/^::ffff:/", "", strtolower($ip)); + + if (!in_array($ip, $allowed, true)) { + echo "Client IP address not allowed"; + die(); + } + } + + /* default error handler */ + if (function_exists('errorHandlerPsi')) { + restore_error_handler(); + } + + /* fatal errors only */ + $old_err_rep = error_reporting(); + error_reporting(E_ERROR); + + /* get git revision */ + if (file_exists(APP_ROOT.'/.git/HEAD')) { + $contents = @file_get_contents(APP_ROOT.'/.git/HEAD'); + if ($contents && preg_match("/^ref:\s+(.*)\/([^\/\s]*)/m", $contents, $matches)) { + $contents = @file_get_contents(APP_ROOT.'/.git/'.$matches[1]."/".$matches[2]); + if ($contents && preg_match("/^([^\s]*)/m", $contents, $revision)) { + define('PSI_VERSION_STRING', PSI_VERSION ."-".$matches[2]."-".substr($revision[1], 0, 7)); + } else { + define('PSI_VERSION_STRING', PSI_VERSION ."-".$matches[2]); + } + } + } + /* get svn revision */ + if (!defined('PSI_VERSION_STRING') && file_exists(APP_ROOT.'/.svn/entries')) { + $contents = @file_get_contents(APP_ROOT.'/.svn/entries'); + if ($contents && preg_match("/dir\n(.+)/", $contents, $matches)) { + define('PSI_VERSION_STRING', PSI_VERSION."-r".$matches[1]); + } else { + define('PSI_VERSION_STRING', PSI_VERSION); + } + } + if (!defined('PSI_VERSION_STRING')) { + define('PSI_VERSION_STRING', PSI_VERSION); + } + + if (!defined('PSI_OS')) { //if not overloaded in phpsysinfo.ini + /* get Linux code page */ + if (PHP_OS == 'Linux') { + if (file_exists('/etc/sysconfig/i18n')) { + $contents = @file_get_contents('/etc/sysconfig/i18n'); + } elseif (file_exists('/etc/default/locale')) { + $contents = @file_get_contents('/etc/default/locale'); + } elseif (file_exists('/etc/locale.conf')) { + $contents = @file_get_contents('/etc/locale.conf'); + } elseif (file_exists('/etc/sysconfig/language')) { + $contents = @file_get_contents('/etc/sysconfig/language'); + } elseif (file_exists('/etc/profile.d/lang.sh')) { + $contents = @file_get_contents('/etc/profile.d/lang.sh'); + } elseif (file_exists('/etc/profile')) { + $contents = @file_get_contents('/etc/profile'); + } else { + $contents = false; + if (file_exists('/system/build.prop')) { //Android + define('PSI_OS', 'Android'); + if (!defined('PSI_MODE_POPEN')) { //if not overloaded in phpsysinfo.ini + if (!function_exists("proc_open")) { //proc_open function test by executing 'pwd' command + define('PSI_MODE_POPEN', true); //use popen() function - no stderr error handling + } else { + $out = ''; + $err = ''; + $pipes = array(); + $descriptorspec = array(0=>array("pipe", "r"), 1=>array("pipe", "w"), 2=>array("pipe", "w")); + $process = proc_open("pwd 2>/dev/null ", $descriptorspec, $pipes); + if (!is_resource($process)) { + define('PSI_MODE_POPEN', true); + } else { + $w = null; + $e = null; + + while (!(feof($pipes[1]) || feof($pipes[2]))) { + $read = array($pipes[1], $pipes[2]); + + $n = stream_select($read, $w, $e, 5); + + if (($n === false) || ($n === 0)) { + break; + } + + foreach ($read as $r) { + if ($r == $pipes[1]) { + $out .= fread($r, 4096); + } + if ($r == $pipes[2]) { + $err .= fread($r, 4096); + } + } + } + + if (is_null($out) || (trim($out) == "") || (substr(trim($out), 0, 1) != "/")) { + define('PSI_MODE_POPEN', true); + } + fclose($pipes[0]); + fclose($pipes[1]); + fclose($pipes[2]); + // It is important that you close any pipes before calling + // proc_close in order to avoid a deadlock + proc_close($process); + } + } + } + } + } + if (!(defined('PSI_SYSTEM_CODEPAGE') && defined('PSI_SYSTEM_LANG')) //also if both not overloaded in phpsysinfo.ini + && $contents && (preg_match('/^(LANG="?[^"\n]*"?)/m', $contents, $matches) + || preg_match('/^RC_(LANG="?[^"\n]*"?)/m', $contents, $matches) + || preg_match('/^\s*export (LANG="?[^"\n]*"?)/m', $contents, $matches))) { + if (!defined('PSI_SYSTEM_CODEPAGE') && @exec($matches[1].' locale -k LC_CTYPE 2>/dev/null', $lines)) { //if not overloaded in phpsysinfo.ini + foreach ($lines as $line) { + if (preg_match('/^charmap="?([^"]*)/', $line, $matches2)) { + define('PSI_SYSTEM_CODEPAGE', $matches2[1]); + break; + } + } + } + if (!defined('PSI_SYSTEM_LANG') && @exec($matches[1].' locale 2>/dev/null', $lines)) { //also if not overloaded in phpsysinfo.ini + foreach ($lines as $line) { + if (preg_match('/^LC_MESSAGES="?([^\."@]*)/', $line, $matches2)) { + $lang = ""; + if (is_readable(APP_ROOT.'/data/languages.ini') && ($langdata = @parse_ini_file(APP_ROOT.'/data/languages.ini', true))) { + if (isset($langdata['Linux']['_'.$matches2[1]])) { + $lang = $langdata['Linux']['_'.$matches2[1]]; + } + } + if ($lang == "") { + $lang = 'Unknown'; + } + define('PSI_SYSTEM_LANG', $lang.' ('.$matches2[1].')'); + break; + } + } + } + } + } elseif (PHP_OS == 'Haiku') { + if (!(defined('PSI_SYSTEM_CODEPAGE') && defined('PSI_SYSTEM_LANG')) //also if both not overloaded in phpsysinfo.ini + && @exec('locale -m 2>/dev/null', $lines)) { + foreach ($lines as $line) { + if (preg_match('/^"?([^\."]*)\.?([^"]*)/', $line, $matches2)) { + + if (!defined('PSI_SYSTEM_CODEPAGE') && isset($matches2[2]) && !is_null($matches2[2]) && (trim($matches2[2]) != "")) { //also if not overloaded in phpsysinfo.ini + define('PSI_SYSTEM_CODEPAGE', $matches2[2]); + } + + if (!defined('PSI_SYSTEM_LANG')) { //if not overloaded in phpsysinfo.ini + $lang = ""; + if (is_readable(APP_ROOT.'/data/languages.ini') && ($langdata = @parse_ini_file(APP_ROOT.'/data/languages.ini', true))) { + if (isset($langdata['Linux']['_'.$matches2[1]])) { + $lang = $langdata['Linux']['_'.$matches2[1]]; + } + } + if ($lang == "") { + $lang = 'Unknown'; + } + define('PSI_SYSTEM_LANG', $lang.' ('.$matches2[1].')'); + } + break; + } + } + } + } elseif (PHP_OS == 'Darwin') { + if (!defined('PSI_SYSTEM_LANG') //if not overloaded in phpsysinfo.ini + && @exec('defaults read /Library/Preferences/.GlobalPreferences AppleLocale 2>/dev/null', $lines)) { + $lang = ""; + if (is_readable(APP_ROOT.'/data/languages.ini') && ($langdata = @parse_ini_file(APP_ROOT.'/data/languages.ini', true))) { + if (isset($langdata['Linux']['_'.$lines[0]])) { + $lang = $langdata['Linux']['_'.$lines[0]]; + } + } + if ($lang == "") { + $lang = 'Unknown'; + } + define('PSI_SYSTEM_LANG', $lang.' ('.$lines[0].')'); + } + } + } + + if (!defined('PSI_OS')) { + define('PSI_OS', PHP_OS); + } + + if (!defined('PSI_SYSTEM_LANG')) { + define('PSI_SYSTEM_LANG', null); + } + if (!defined('PSI_SYSTEM_CODEPAGE')) { //if not overloaded in phpsysinfo.ini + if ((PSI_OS=='Android') || (PSI_OS=='Darwin')) { + define('PSI_SYSTEM_CODEPAGE', 'UTF-8'); + } elseif (PSI_OS=='Minix') { + define('PSI_SYSTEM_CODEPAGE', 'CP437'); + } else { + define('PSI_SYSTEM_CODEPAGE', null); + } + } + + if (!defined('PSI_JSON_ISSUE')) { //if not overloaded in phpsysinfo.ini + if (simplexml_load_string("\n") !== simplexml_load_string("")) { // json_encode issue test + define('PSI_JSON_ISSUE', true); // Problem must be solved + } + } + + /* restore error level */ + error_reporting($old_err_rep); + + /* restore error handler */ + if (function_exists('errorHandlerPsi')) { + set_error_handler('errorHandlerPsi'); + } +} diff --git a/sources/sample/distrotest/4MLinux/10.0-server.txt b/sources/sample/distrotest/4MLinux/10.0-server.txt new file mode 100644 index 0000000..a3d6e28 --- /dev/null +++ b/sources/sample/distrotest/4MLinux/10.0-server.txt @@ -0,0 +1,2 @@ +----------/etc/4MLinux-version---------- +10.0 diff --git a/sources/sample/distrotest/ALT/6.0.0.txt b/sources/sample/distrotest/ALT/6.0.0.txt new file mode 100644 index 0000000..1ffd513 --- /dev/null +++ b/sources/sample/distrotest/ALT/6.0.0.txt @@ -0,0 +1,14 @@ +----------lsb_release -a---------- +LSB Version: n/a +Distributor ID: ALT +Description: ALT Linux 6.0.0 Centaurus (Cheiron) +Release: 6.0.0 +Codename: Cheiron +----------/etc/altlinux-release---------- +ALT Linux 6.0.0 Centaurus (Cheiron) +----------/etc/fedora-release---------- +ALT Linux 6.0.0 Centaurus (Cheiron) +----------/etc/redhat-release---------- +ALT Linux 6.0.0 Centaurus (Cheiron) +----------/etc/system-release---------- +ALT Linux 6.0.0 Centaurus (Cheiron) diff --git a/sources/sample/distrotest/ALT/7.0.0-Simply.txt b/sources/sample/distrotest/ALT/7.0.0-Simply.txt new file mode 100644 index 0000000..ed7f8cb --- /dev/null +++ b/sources/sample/distrotest/ALT/7.0.0-Simply.txt @@ -0,0 +1,18 @@ +----------/etc/altlinux-release---------- +Simply Linux 7.0.0 (Dory) +----------/etc/fedora-release---------- +Simply Linux 7.0.0 (Dory) +----------/etc/os-release---------- +NAME="Simply Linux" +VERSION="7.0.0 (Dory)" +ID=altlinux +VERSION_ID=7.0.0 +PRETTY_NAME="Simply Linux 7.0.0 (Dory)" +ANSI_COLOR="1;36" +CPE_NAME="cpe:/o:alt linux:slinux:7.0.0" +HOME_URL="http://simplylinux.ru/" +BUG_REPORT_URL="https://bugs.altlinux.org/" +----------/etc/redhat-release---------- +Simply Linux 7.0.0 (Dory) +----------/etc/system-release---------- +Simply Linux 7.0.0 (Dory) diff --git a/sources/sample/distrotest/ALT/7.0.1.txt b/sources/sample/distrotest/ALT/7.0.1.txt new file mode 100644 index 0000000..12e19e8 --- /dev/null +++ b/sources/sample/distrotest/ALT/7.0.1.txt @@ -0,0 +1,18 @@ +----------/etc/altlinux-release---------- +ALT Linux 7.0.1 Centaurus (Pholus) +----------/etc/fedora-release---------- +ALT Linux 7.0.1 Centaurus (Pholus) +----------/etc/os-release---------- +NAME="ALT Linux" +VERSION="7.0.1 (Pholus)" +ID=altlinux +VERSION_ID=6.9.0 +PRETTY_NAME="ALT Linux 7.0.1 Centaurus (Pholus)" +ANSI_COLOR="1;33" +CPE_NAME="cpe:/o:alt linux:centaurus:7.0.1" +HOME_URL="http://altlinux.ru/" +BUG_REPORT_URL="https://bugs.altlinux.org/" +----------/etc/redhat-release---------- +ALT Linux 7.0.1 Centaurus (Pholus) +----------/etc/system-release---------- +ALT Linux 7.0.1 Centaurus (Pholus) diff --git a/sources/sample/distrotest/Alpine/2.6.4.txt b/sources/sample/distrotest/Alpine/2.6.4.txt new file mode 100644 index 0000000..d9d9129 --- /dev/null +++ b/sources/sample/distrotest/Alpine/2.6.4.txt @@ -0,0 +1,2 @@ +----------/etc/alpine-release---------- +2.6.4 diff --git a/sources/sample/distrotest/Amazon/2013.09.txt b/sources/sample/distrotest/Amazon/2013.09.txt new file mode 100644 index 0000000..e1055f4 --- /dev/null +++ b/sources/sample/distrotest/Amazon/2013.09.txt @@ -0,0 +1,8 @@ +----------lsb_release -a---------- +LSB Version: :base-4.0-amd64:base-4.0-noarch:core-4.0-amd64:core-4.0-noarch:printing-4.0-amd64:printing-4.0-noarch +Distributor ID: AmazonAMI +Description: Amazon Linux AMI release 2013.09 +Release: 2013.09 +Codename: n/a +----------/etc/system-release---------- +Amazon Linux AMI release 2013.09 diff --git a/sources/sample/distrotest/Arch/2011.08.19-ISO.txt b/sources/sample/distrotest/Arch/2011.08.19-ISO.txt new file mode 100644 index 0000000..4849963 --- /dev/null +++ b/sources/sample/distrotest/Arch/2011.08.19-ISO.txt @@ -0,0 +1,2 @@ +----------/etc/arch-release---------- +Arch Linux Live ISO diff --git a/sources/sample/distrotest/Arch/2013.11.01.txt b/sources/sample/distrotest/Arch/2013.11.01.txt new file mode 100644 index 0000000..24e2af0 --- /dev/null +++ b/sources/sample/distrotest/Arch/2013.11.01.txt @@ -0,0 +1,10 @@ +----------/etc/arch-release---------- +----------/etc/os-release---------- +NAME="Arch Linux" +ID=arch +PRETTY_NAME="Arch Linux" +ANSI_COLOR="0;36" +HOME_URL="https://www.archlinux.org/" +SUPPORT_URL="https://bbs.archlinux.org/" +BUG_REPORT_URL="https://bugs.archlinux.org/" + diff --git a/sources/sample/distrotest/Arch/2014.01.05.txt b/sources/sample/distrotest/Arch/2014.01.05.txt new file mode 100644 index 0000000..5696148 --- /dev/null +++ b/sources/sample/distrotest/Arch/2014.01.05.txt @@ -0,0 +1,22 @@ +----------lsb_release -a---------- +LSB Version: 1.4 +Distributor ID: Arch +Description: Arch Linux +Release: rolling +Codename: n/a +----------/etc/arch-release---------- +Arch Linux release +----------/etc/lsb-release---------- +LSB_VERSION=1.4 +DISTRIB_ID=Arch +DISTRIB_RELEASE=rolling +DISTRIB_DESCRIPTION="Arch Linux" +----------/etc/os-release---------- +NAME="Arch Linux" +ID=arch +PRETTY_NAME="Arch Linux" +ANSI_COLOR="0;36" +HOME_URL="https://www.archlinux.org/" +SUPPORT_URL="https://bbs.archlinux.org/" +BUG_REPORT_URL="https://bugs.archlinux.org/" + diff --git a/sources/sample/distrotest/BOSS/1.0-server.txt b/sources/sample/distrotest/BOSS/1.0-server.txt new file mode 100644 index 0000000..969bef0 --- /dev/null +++ b/sources/sample/distrotest/BOSS/1.0-server.txt @@ -0,0 +1,10 @@ +----------lsb_release -a---------- +LSB Version: core-2.0-noarch:core-3.0-noarch:core-3.1-noarch:core-2.0-ia32:core-3.0-ia32:core-3.1-ia32 +Distributor ID: BOSS Server Beta +Description: BOSS Server Beta GNU/Linux anant +Release: anant +Codename: 1.0 +----------/etc/boss_version---------- +anant +----------/etc/debian_version---------- +lenny/sid diff --git a/sources/sample/distrotest/BOSS/5.0.txt b/sources/sample/distrotest/BOSS/5.0.txt new file mode 100644 index 0000000..2e88c7f --- /dev/null +++ b/sources/sample/distrotest/BOSS/5.0.txt @@ -0,0 +1,19 @@ +----------lsb_release -a---------- +Distributor ID: BOSS +Description: BOSS GNU/Linux 5.0 (anokha) +Release: 5.0 +Codename: anokha +----------/etc/os-release---------- +PRETTY_NAME="BOSS GNU/Linux 5.0 (anokha)" +NAME="BOSS GNU/Linux" +VERSION_ID="5.0" +VERSION="5.0 (anokha)" +ID=debian +ANSI_COLOR="1;31" +HOME_URL="http://www.bosslinux.in/" +SUPPORT_URL="http://www.bosslinux.in/support-centre" +BUG_REPORT_URL="http://bugzilla.bosslinux.in/" +----------/etc/boss_version---------- +5.0 +----------/etc/debian_version---------- +7.0 diff --git a/sources/sample/distrotest/Calculate/13.11.txt b/sources/sample/distrotest/Calculate/13.11.txt new file mode 100644 index 0000000..9193970 --- /dev/null +++ b/sources/sample/distrotest/Calculate/13.11.txt @@ -0,0 +1,10 @@ +----------/etc/gentoo-release---------- +Calculate Linux Desktop 13.11 XFCE +----------/etc/os-release---------- +NAME=Gentoo +ID=gentoo +PRETTY_NAME="Gentoo/Linux" +ANSI_COLOR="1;32" +HOME_URL="http://www.gentoo.org/" +SUPPORT_URL="http://www.gentoo.org/main/en/support.xml" +BUG_REPORT_URL="https://bugs.gentoo.org/" diff --git a/sources/sample/distrotest/Canaima/4.1.txt b/sources/sample/distrotest/Canaima/4.1.txt new file mode 100644 index 0000000..c78400b --- /dev/null +++ b/sources/sample/distrotest/Canaima/4.1.txt @@ -0,0 +1,19 @@ +----------lsb_release -a---------- +Distributor ID: Canaima +Description: Canaima GNU/Linux 4.1 (kukenan) +Release: 4.1 +Codename: kukenan +----------/etc/os-release---------- +PRETTY_NAME="Canaima GNU/Linux 4.1 (kukenan)" +NAME="Canaima GNU/Linux" +VERSION_ID="4.1" +VERSION="4.1 (kukenan)" +ID=canaima +ANSI_COLOR="1;31" +HOME_URL="http://http://canaima.softwarelibre.gob.ve/" +SUPPORT_URL="http://http://canaima.softwarelibre.gob.ve/Soporte" +BUG_REPORT_URL="http://http://trac.canaima.softwarelibre.gob.ve/canaima/" +----------/etc/canaima_version---------- +4.1 +----------/etc/debian_version---------- +Canaima diff --git a/sources/sample/distrotest/CentOS/5.6.txt b/sources/sample/distrotest/CentOS/5.6.txt new file mode 100644 index 0000000..2460517 --- /dev/null +++ b/sources/sample/distrotest/CentOS/5.6.txt @@ -0,0 +1,8 @@ +----------lsb_release -a---------- +LSB Version: :core-4.0-amd64:core-4.0-ia32:core-4.0-noarch:graphics-4.0-amd64:graphics-4.0-ia32:graphics-4.0-noarch:printing-4.0-amd64:printing-4.0-ia32:printing-4.0-noarch +Distributor ID: CentOS +Description: CentOS release 5.6 (Final) +Release: 5.6 +Codename: Final +----------/etc/redhat-release---------- +CentOS release 5.6 (Final) diff --git a/sources/sample/distrotest/CentOS/6.5-SF.txt b/sources/sample/distrotest/CentOS/6.5-SF.txt new file mode 100644 index 0000000..bd695c0 --- /dev/null +++ b/sources/sample/distrotest/CentOS/6.5-SF.txt @@ -0,0 +1,6 @@ +----------/etc/centos-release---------- +CentOS release 6.5 (Final) +----------/etc/redhat-release---------- +CentOS release 6.5 (Final) +----------/etc/system-release---------- +CentOS release 6.5 (Final) diff --git a/sources/sample/distrotest/CentOS/6.5.txt b/sources/sample/distrotest/CentOS/6.5.txt new file mode 100644 index 0000000..22cf73b --- /dev/null +++ b/sources/sample/distrotest/CentOS/6.5.txt @@ -0,0 +1,14 @@ +----------lsb_release -a---------- +LSB Version: :base-4.0-amd64:base-4.0-noarch:core-4.0-amd64:core-4.0-noarch:graphics-4.0-amd64:graphics-4.0-noarch:printing-4.0-amd64:printing-4.0-noarch +Distributor ID: CentOS +Description: CentOS release 6.5 (Final) +Release: 6.5 +Codename: Final +----------/etc/centos-release---------- +CentOS release 6.5 (Final) +----------/etc/lsb-release---------- +LSB_VERSION=base-4.0-amd64:base-4.0-noarch:core-4.0-amd64:core-4.0-noarch:graphics-4.0-amd64:graphics-4.0-noarch:printing-4.0-amd64:printing-4.0-noarch +----------/etc/redhat-release---------- +CentOS release 6.5 (Final) +----------/etc/system-release---------- +CentOS release 6.5 (Final) diff --git a/sources/sample/distrotest/CentOS/7.1.1503.txt b/sources/sample/distrotest/CentOS/7.1.1503.txt new file mode 100644 index 0000000..0dbdc0c --- /dev/null +++ b/sources/sample/distrotest/CentOS/7.1.1503.txt @@ -0,0 +1,23 @@ +----------/etc/centos-release---------- +CentOS Linux release 7.1.1503 (Core) +----------/etc/os-release---------- +NAME="CentOS Linux" +VERSION="7 (Core)" +ID="centos" +ID_LIKE="rhel fedora" +VERSION_ID="7" +PRETTY_NAME="CentOS Linux 7 (Core)" +ANSI_COLOR="0;31" +CPE_NAME="cpe:/o:centos:centos:7" +HOME_URL="https://www.centos.org/" +BUG_REPORT_URL="https://bugs.centos.org/" + +CENTOS_MANTISBT_PROJECT="CentOS-7" +CENTOS_MANTISBT_PROJECT_VERSION="7" +REDHAT_SUPPORT_PRODUCT="centos" +REDHAT_SUPPORT_PRODUCT_VERSION="7" + +----------/etc/redhat-release---------- +CentOS Linux release 7.1.1503 (Core) +----------/etc/system-release---------- +CentOS Linux release 7.1.1503 (Core) diff --git a/sources/sample/distrotest/Chakra/2013.02.txt b/sources/sample/distrotest/Chakra/2013.02.txt new file mode 100644 index 0000000..9ffe64e --- /dev/null +++ b/sources/sample/distrotest/Chakra/2013.02.txt @@ -0,0 +1,21 @@ +----------lsb_release -a---------- +LSB Version: n/a +Distributor ID: Chakra +Description: Chakra +Release: 2013.02 +Codename: Benz +----------/etc/chakra-release---------- +----------/etc/lsb-release---------- +DISTRIB_ID="Chakra" +DISTRIB_RELEASE="2013.02" +DISTRIB_CODENAME="Benz" +DISTRIB_DESCRIPTION="Chakra" +----------/etc/os-release---------- +NAME="The Chakra-Project" +VERSION="Benz" +ID=chakra +PRETTY_NAME="The Chakra-Project (Benz)" +ANSI_COLOR="0;36" +HOME_URL="http://www.chakra-linux.org/" +BUG_REPORT_URL="http://chakra-linux.org/bugs/" + diff --git a/sources/sample/distrotest/ClearOS/6.4.0-Beta.txt b/sources/sample/distrotest/ClearOS/6.4.0-Beta.txt new file mode 100644 index 0000000..ab0d0f3 --- /dev/null +++ b/sources/sample/distrotest/ClearOS/6.4.0-Beta.txt @@ -0,0 +1,6 @@ +----------/etc/clearos-release---------- +ClearOS Community release 6.4.0 Beta (Beta 2) +----------/etc/redhat-release---------- +ClearOS Community release 6.4.0 Beta (Beta 2) +----------/etc/system-release---------- +ClearOS Community release 6.4.0 Beta (Beta 2) diff --git a/sources/sample/distrotest/Cloud/5.10.txt b/sources/sample/distrotest/Cloud/5.10.txt new file mode 100644 index 0000000..6f63ce6 --- /dev/null +++ b/sources/sample/distrotest/Cloud/5.10.txt @@ -0,0 +1,10 @@ +----------lsb_release -a---------- +LSB Version: :core-4.0-amd64:core-4.0-ia32:core-4.0-noarch:graphics-4.0-amd64:graphics-4.0-ia32:graphics-4.0-noarch:printing-4.0-amd64:printing-4.0-ia32:printing-4.0-noarch +Distributor ID: CloudLinuxServer +Description: CloudLinux Server release 5.10 (Georgy Beregovoy) +Release: 5.10 +Codename: GeorgyBeregovoy +----------/etc/CloudLinux-release---------- +CloudLinux Server release 5.10 (Georgy Beregovoy) +----------/etc/redhat-release---------- +CloudLinux Server release 5.10 (Georgy Beregovoy) diff --git a/sources/sample/distrotest/Cloud/6.4.txt b/sources/sample/distrotest/Cloud/6.4.txt new file mode 100644 index 0000000..bc44eb7 --- /dev/null +++ b/sources/sample/distrotest/Cloud/6.4.txt @@ -0,0 +1,12 @@ +----------lsb_release -a---------- +LSB Version: :base-4.0-amd64:base-4.0-noarch:core-4.0-amd64:core-4.0-noarch:graphics-4.0-amd64:graphics-4.0-noarch:printing-4.0-amd64:printing-4.0-noarch +Distributor ID: CloudLinuxServer +Description: CloudLinux Server release 6.4 +Release: 6.4 +Codename: n/a +----------/etc/lsb-release---------- +LSB_VERSION=base-4.0-amd64:base-4.0-noarch:core-4.0-amd64:core-4.0-noarch:graphics-4.0-amd64:graphics-4.0-noarch:printing-4.0-amd64:printing-4.0-noarch +----------/etc/redhat-release---------- +CloudLinux Server release 6.4 +----------/etc/system-release---------- +CloudLinux Server release 6.4 diff --git a/sources/sample/distrotest/CoreOS/367.1.0.txt b/sources/sample/distrotest/CoreOS/367.1.0.txt new file mode 100644 index 0000000..d1a9275 --- /dev/null +++ b/sources/sample/distrotest/CoreOS/367.1.0.txt @@ -0,0 +1,15 @@ +----------/etc/lsb-release---------- +DISTRIB_ID=CoreOS +DISTRIB_RELEASE=367.1.0 +DISTRIB_CODENAME="Red Dog" +DISTRIB_DESCRIPTION="CoreOS 367.1.0" +----------/etc/os-release---------- +NAME=CoreOS +ID=coreos +VERSION=367.1.0 +VERSION_ID=367.1.0 +BUILD_ID= +PRETTY_NAME="CoreOS 367.1.0" +ANSI_COLOR="1;32" +HOME_URL="https://coreos.com/" +BUG_REPORT_URL="https://github.com/coreos/bugs/issues" diff --git a/sources/sample/distrotest/Crux/2.8.txt b/sources/sample/distrotest/Crux/2.8.txt new file mode 100644 index 0000000..ba63337 --- /dev/null +++ b/sources/sample/distrotest/Crux/2.8.txt @@ -0,0 +1,2 @@ +----------/usr/bin/crux---------- +CRUX version 2.8 diff --git a/sources/sample/distrotest/Debian/5.0.3.txt b/sources/sample/distrotest/Debian/5.0.3.txt new file mode 100644 index 0000000..aa75d5a --- /dev/null +++ b/sources/sample/distrotest/Debian/5.0.3.txt @@ -0,0 +1,2 @@ +----------/etc/debian_version---------- +5.0.3 diff --git a/sources/sample/distrotest/Debian/6.0.6.txt b/sources/sample/distrotest/Debian/6.0.6.txt new file mode 100644 index 0000000..0ecd1fa --- /dev/null +++ b/sources/sample/distrotest/Debian/6.0.6.txt @@ -0,0 +1,7 @@ +----------lsb_release -a---------- +Distributor ID: Debian +Description: Debian GNU/Linux 6.0.6 (squeeze) +Release: 6.0.6 +Codename: squeeze +----------/etc/debian_version---------- +6.0.6 diff --git a/sources/sample/distrotest/Debian/8-20140106-netinstall.txt b/sources/sample/distrotest/Debian/8-20140106-netinstall.txt new file mode 100644 index 0000000..6cebf75 --- /dev/null +++ b/sources/sample/distrotest/Debian/8-20140106-netinstall.txt @@ -0,0 +1,6 @@ +----------/etc/default-release---------- +jessie +----------/etc/lsb-release---------- +DISTRIB_ID=Debian +DISTRIB_DESCRIPTION="Debian GNU/Linux installer" +DISTRIB_RELEASE="8 (jessie) - installer build 20140106-00:05" diff --git a/sources/sample/distrotest/Debian/8-20140106.txt b/sources/sample/distrotest/Debian/8-20140106.txt new file mode 100644 index 0000000..0ac168a --- /dev/null +++ b/sources/sample/distrotest/Debian/8-20140106.txt @@ -0,0 +1,15 @@ +----------lsb_release -a---------- +Distributor ID: Debian +Description: Debian GNU/Linux testing (jessie) +Release: testing +Codename: jessie +----------/etc/os-release---------- +PRETTY_NAME="Debian GNU/Linux jessie/sid" +NAME="Debian GNU/Linux" +ID=debian +ANSI_COLOR="1;31" +HOME_URL="http://www.debian.org/" +SUPPORT_URL="http://www.debian.org/support/" +BUG_REPORT_URL="http://bugs.debian.org/" +----------/etc/debian_version---------- +jessie/sid diff --git a/sources/sample/distrotest/Deepin/2013.txt b/sources/sample/distrotest/Deepin/2013.txt new file mode 100644 index 0000000..97310d9 --- /dev/null +++ b/sources/sample/distrotest/Deepin/2013.txt @@ -0,0 +1,22 @@ +----------lsb_release -a---------- +Distributor ID: LinuxDeepin +Description: LinuxDeepin 2013 +Release: 2013 +Codename: raring +----------/etc/lsb-release---------- +DISTRIB_ID=LinuxDeepin +DISTRIB_RELEASE=2013 +DISTRIB_CODENAME=raring +DISTRIB_DESCRIPTION="LinuxDeepin 2013" +----------/etc/os-release---------- +NAME="Ubuntu" +VERSION="13.04, Raring Ringtail" +ID=ubuntu +ID_LIKE=debian +PRETTY_NAME="Ubuntu 13.04" +VERSION_ID="13.04" +HOME_URL="http://www.ubuntu.com/" +SUPPORT_URL="http://help.ubuntu.com/" +BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/" +----------/etc/debian_version---------- +wheezy/sid diff --git a/sources/sample/distrotest/Eisfair/1-2.6.5.txt b/sources/sample/distrotest/Eisfair/1-2.6.5.txt new file mode 100644 index 0000000..6a4d778 --- /dev/null +++ b/sources/sample/distrotest/Eisfair/1-2.6.5.txt @@ -0,0 +1,10 @@ +----------lsb_release -a---------- +LSB Version: n/a +Distributor ID: eisfair project +Description: eisfair-1 +Release: 2.6.5 +Codename: n/a +----------/etc/version---------- +2.6.5 +----------/etc/eisfair-system---------- +eisfair-1 diff --git a/sources/sample/distrotest/Eisfair/2-1.8.1.txt b/sources/sample/distrotest/Eisfair/2-1.8.1.txt new file mode 100644 index 0000000..41b9c1f --- /dev/null +++ b/sources/sample/distrotest/Eisfair/2-1.8.1.txt @@ -0,0 +1,4 @@ +----------/etc/version---------- +1.8.1 +----------/etc/eisfair-system---------- +eisfair-2 diff --git a/sources/sample/distrotest/Fedora/20-lsb.txt b/sources/sample/distrotest/Fedora/20-lsb.txt new file mode 100644 index 0000000..98f2021 --- /dev/null +++ b/sources/sample/distrotest/Fedora/20-lsb.txt @@ -0,0 +1,26 @@ +----------lsb_release -a---------- +LSB Version: :core-4.1-amd64:core-4.1-noarch:cxx-4.1-amd64:cxx-4.1-noarch:desktop-4.1-amd64:desktop-4.1-noarch:languages-4.1-amd64:languages-4.1-noarch:printing-4.1-amd64:printing-4.1-noarch +Distributor ID: Fedora +Description: Fedora release 20 (Heisenbug) +Release: 20 +Codename: Heisenbug +----------/etc/fedora-release---------- +Fedora release 20 (Heisenbug) +----------/etc/os-release---------- +NAME=Fedora +VERSION="20 (Heisenbug)" +ID=fedora +VERSION_ID=20 +PRETTY_NAME="Fedora 20 (Heisenbug)" +ANSI_COLOR="0;34" +CPE_NAME="cpe:/o:fedoraproject:fedora:20" +HOME_URL="https://fedoraproject.org/" +BUG_REPORT_URL="https://bugzilla.redhat.com/" +REDHAT_BUGZILLA_PRODUCT="Fedora" +REDHAT_BUGZILLA_PRODUCT_VERSION=20 +REDHAT_SUPPORT_PRODUCT="Fedora" +REDHAT_SUPPORT_PRODUCT_VERSION=20 +----------/etc/redhat-release---------- +Fedora release 20 (Heisenbug) +----------/etc/system-release---------- +Fedora release 20 (Heisenbug) diff --git a/sources/sample/distrotest/Fedora/20.txt b/sources/sample/distrotest/Fedora/20.txt new file mode 100644 index 0000000..05d3e5c --- /dev/null +++ b/sources/sample/distrotest/Fedora/20.txt @@ -0,0 +1,20 @@ +----------/etc/fedora-release---------- +Fedora release 20 (Heisenbug) +----------/etc/os-release---------- +NAME=Fedora +VERSION="20 (Heisenbug)" +ID=fedora +VERSION_ID=20 +PRETTY_NAME="Fedora 20 (Heisenbug)" +ANSI_COLOR="0;34" +CPE_NAME="cpe:/o:fedoraproject:fedora:20" +HOME_URL="https://fedoraproject.org/" +BUG_REPORT_URL="https://bugzilla.redhat.com/" +REDHAT_BUGZILLA_PRODUCT="Fedora" +REDHAT_BUGZILLA_PRODUCT_VERSION=20 +REDHAT_SUPPORT_PRODUCT="Fedora" +REDHAT_SUPPORT_PRODUCT_VERSION=20 +----------/etc/redhat-release---------- +Fedora release 20 (Heisenbug) +----------/etc/system-release---------- +Fedora release 20 (Heisenbug) diff --git a/sources/sample/distrotest/Fedora/4.txt b/sources/sample/distrotest/Fedora/4.txt new file mode 100644 index 0000000..aeba173 --- /dev/null +++ b/sources/sample/distrotest/Fedora/4.txt @@ -0,0 +1,12 @@ +----------lsb_release -a---------- +LSB Version: 1.3 +Distributor ID: FedoraCore +Description: Fedora Core release 4 (Stentz) +Release: 4 +Codename: Stentz +----------/etc/fedora-release---------- +Fedora Core release 4 (Stentz) +----------/etc/lsb-release---------- +LSB_VERSION="1.3" +----------/etc/redhat-release---------- +Fedora Core release 4 (Stentz) diff --git a/sources/sample/distrotest/Foresight/2.5.3.txt b/sources/sample/distrotest/Foresight/2.5.3.txt new file mode 100644 index 0000000..f1db333 --- /dev/null +++ b/sources/sample/distrotest/Foresight/2.5.3.txt @@ -0,0 +1,2 @@ +----------/etc/distro-release---------- +Foresight diff --git a/sources/sample/distrotest/Frugalware/1.9.txt b/sources/sample/distrotest/Frugalware/1.9.txt new file mode 100644 index 0000000..a1ec4ce --- /dev/null +++ b/sources/sample/distrotest/Frugalware/1.9.txt @@ -0,0 +1,9 @@ +----------/etc/frugalware-release---------- +Frugalware 1.9 (Arcturus) +----------/etc/os-release---------- +NAME="Frugalware" +VERSION="1.9 (Arcturus)" +ID=frugalware +VERSION_ID="1.9" +PRETTY_NAME="Frugalware 1.9 (Arcturus)" +ANSI_COLOR="1;36" diff --git a/sources/sample/distrotest/Fuduntu/2013.2.txt b/sources/sample/distrotest/Fuduntu/2013.2.txt new file mode 100644 index 0000000..d903419 --- /dev/null +++ b/sources/sample/distrotest/Fuduntu/2013.2.txt @@ -0,0 +1,19 @@ +----------lsb_release -a---------- +LSB Version: :core-4.0-amd64:core-4.0-noarch:graphics-4.0-amd64:graphics-4.0-noarch:printing-4.0-amd64:printing-4.0-noarch +Distributor ID: Fuduntu +Description: n/a +Release: 2013.2 +Codename: Punny Name Serious Distro +----------/etc/fedora-release---------- +Fuduntu 2013.2 (Punny Name Serious Distro) +----------/etc/fuduntu-release---------- +Fuduntu 2013.2 (Punny Name Serious Distro) +----------/etc/lsb-release---------- +DISTRIB_ID=Fuduntu +DISTRIB_RELEASE=2013.2 +DISTRIB_CODENAME=Fuduntu +DISTRIB_DESCRIPTION="Punny Name Serious Distro" +----------/etc/redhat-release---------- +Fuduntu 2013.2 (Punny Name Serious Distro) +----------/etc/system-release---------- +Fuduntu 2013.2 (Punny Name Serious Distro) diff --git a/sources/sample/distrotest/Generations/3.1.txt b/sources/sample/distrotest/Generations/3.1.txt new file mode 100644 index 0000000..85258ec --- /dev/null +++ b/sources/sample/distrotest/Generations/3.1.txt @@ -0,0 +1,22 @@ +----------lsb_release -a---------- +LSB Version: core-3.1-noarch +Distributor ID: generations +Description: Generations Linux +Release: 3.1 +Codename: vortex +----------/etc/lsb-release---------- +DISTRIB_ID="generations" +DISTRIB_DESCRIPTION="Generations Linux" +DISTRIB_RELEASE="3.1" +DISTRIB_CODENAME="vortex" +LSB_VERSION="core-3.1-noarch" +----------/etc/os-release---------- +# http://www.freedesktop.org/software/systemd/man/os-release.html +NAME="Generations Linux" +VERSION="3.1 (vortex)" +ID=generations +VERSION_ID=3.1 +PRETTY_NAME="$NAME $VERSION" +HOME_URL="http://softcraft.org" +BUILD_ID="2013-05-04 1527" +ANSI_COLOR="1;34" diff --git a/sources/sample/distrotest/Gentoo/2.2-NAME.txt b/sources/sample/distrotest/Gentoo/2.2-NAME.txt new file mode 100644 index 0000000..1d2b749 --- /dev/null +++ b/sources/sample/distrotest/Gentoo/2.2-NAME.txt @@ -0,0 +1,18 @@ +----------lsb_release -a---------- +LSB Version: n/a +Distributor ID: Gentoo +Description: NAME=Gentoo +Release: n/a +Codename: n/a +----------/etc/gentoo-release---------- +Gentoo Base System release 2.2 +----------/etc/lsb-release---------- +DISTRIB_ID="Gentoo" +----------/etc/os-release---------- +NAME=Gentoo +ID=gentoo +PRETTY_NAME="Gentoo/Linux" +ANSI_COLOR="1;32" +HOME_URL="http://www.gentoo.org/" +SUPPORT_URL="http://www.gentoo.org/main/en/support.xml" +BUG_REPORT_URL="https://bugs.gentoo.org/" diff --git a/sources/sample/distrotest/Gentoo/2.2.txt b/sources/sample/distrotest/Gentoo/2.2.txt new file mode 100644 index 0000000..e143316 --- /dev/null +++ b/sources/sample/distrotest/Gentoo/2.2.txt @@ -0,0 +1,18 @@ +----------lsb_release -a---------- +LSB Version: n/a +Distributor ID: Gentoo +Description: Gentoo Base System release 2.2 +Release: 2.2 +Codename: n/a +----------/etc/gentoo-release---------- +Gentoo Base System release 2.2 +----------/etc/lsb-release---------- +DISTRIB_ID="Gentoo" +----------/etc/os-release---------- +NAME=Gentoo +ID=gentoo +PRETTY_NAME="Gentoo/Linux" +ANSI_COLOR="1;32" +HOME_URL="http://www.gentoo.org/" +SUPPORT_URL="http://www.gentoo.org/main/en/support.xml" +BUG_REPORT_URL="https://bugs.gentoo.org/" diff --git a/sources/sample/distrotest/Gobo/015.beta2.txt b/sources/sample/distrotest/Gobo/015.beta2.txt new file mode 100644 index 0000000..5ea3450 --- /dev/null +++ b/sources/sample/distrotest/Gobo/015.beta2.txt @@ -0,0 +1,2 @@ +----------/etc/GoboLinuxVersion---------- +015.beta2 diff --git a/sources/sample/distrotest/Handy/2.0.txt b/sources/sample/distrotest/Handy/2.0.txt new file mode 100644 index 0000000..3b10bb9 --- /dev/null +++ b/sources/sample/distrotest/Handy/2.0.txt @@ -0,0 +1,19 @@ +----------lsb_release -a---------- +LSB Version: core-2.0-ia32:core-2.0-noarch:core-3.0-ia32:core-3.0-noarch:core-3.1-ia32:core-3.1-noarch:core-3.2-ia32:core-3.2-noarch:core-4.0-ia32:core-4.0-noarch:core-4.1-ia32:core-4.1-noarch:cxx-3.0-ia32:cxx-3.0-noarch:cxx-3.1-ia32:cxx-3.1-noarch:cxx-3.2-ia32:cxx-3.2-noarch:cxx-4.0-ia32:cxx-4.0-noarch:cxx-4.1-ia32:cxx-4.1-noarch:desktop-3.1-ia32:desktop-3.1-noarch:desktop-3.2-ia32:desktop-3.2-noarch:desktop-4.0-ia32:desktop-4.0-noarch:desktop-4.1-ia32:desktop-4.1-noarch:graphics-2.0-ia32:graphics-2.0-noarch:graphics-3.0-ia32:graphics-3.0-noarch:graphics-3.1-ia32:graphics-3.1-noarch:graphics-3.2-ia32:graphics-3.2-noarch:graphics-4.0-ia32:graphics-4.0-noarch:graphics-4.1-ia32:graphics-4.1-noarch:languages-3.2-ia32:languages-3.2-noarch:languages-4.0-ia32:languages-4.0-noarch:languages-4.1-ia32:languages-4.1-noarch:multimedia-3.2-ia32:multimedia-3.2-noarch:multimedia-4.0-ia32:multimedia-4.0-noarch:multimedia-4.1-ia32:multimedia-4.1-noarch:printing-3.2-ia32:printing-3.2-noarch:printing-4.0-ia32:printing-4.0-noarch:printing-4.1-ia32:printing-4.1-noarch:qt4-3.1-ia32:qt4-3.1-noarch:security-4.0-ia32:security-4.0-noarch:security-4.1-ia32:security-4.1-noarch +Distributor ID: HandyLinux +Description: HandyLinux GNU/Linux 8.0 (jessie) +Release: 8.0 +Codename: jessie +----------/etc/os-release---------- +PRETTY_NAME="Debian GNU/Linux 8 (jessie)" +NAME="Debian GNU/Linux" +VERSION_ID="8" +VERSION="8 (jessie)" +ID=debian +HOME_URL="http://www.debian.org/" +SUPPORT_URL="http://www.debian.org/support/" +BUG_REPORT_URL="https://bugs.debian.org/" +----------/etc/debian_version---------- +8.0 +----------/etc/handylinux_version---------- +HandyLinux-2.0 diff --git a/sources/sample/distrotest/HipServ/2.6.txt b/sources/sample/distrotest/HipServ/2.6.txt new file mode 100644 index 0000000..e6d387f --- /dev/null +++ b/sources/sample/distrotest/HipServ/2.6.txt @@ -0,0 +1,2 @@ +----------/etc/redhat-release---------- +HipServ diff --git a/sources/sample/distrotest/IPFire/2.13.txt b/sources/sample/distrotest/IPFire/2.13.txt new file mode 100644 index 0000000..65d2da8 --- /dev/null +++ b/sources/sample/distrotest/IPFire/2.13.txt @@ -0,0 +1,2 @@ +----------/etc/system-release---------- +IPFire 2.13 (i586) - core74 diff --git a/sources/sample/distrotest/KaOS/2014.0301.txt b/sources/sample/distrotest/KaOS/2014.0301.txt new file mode 100644 index 0000000..4b22806 --- /dev/null +++ b/sources/sample/distrotest/KaOS/2014.0301.txt @@ -0,0 +1,21 @@ +----------lsb_release -a---------- +LSB Version: n/a +Distributor ID: KaOS +Description: KaOS +Release: 2014.0301 +Codename: n/a +----------/etc/KaOS-release---------- +KaOS release 2014.0301 +----------/etc/lsb-release---------- +DISTRIB_ID="KaOS" +DISTRIB_RELEASE="2014.0301" +DISTRIB_DESCRIPTION="KaOS" +----------/etc/os-release---------- +NAME="KaOS" +VERSION="2014" +ID=kaos +PRETTY_NAME="KaOS (2014)" +ANSI_COLOR="0;36" +HOME_URL="http://kaosx.us/" + + diff --git a/sources/sample/distrotest/Korora/20.txt b/sources/sample/distrotest/Korora/20.txt new file mode 100644 index 0000000..e3d036f --- /dev/null +++ b/sources/sample/distrotest/Korora/20.txt @@ -0,0 +1,21 @@ +----------lsb_release -a---------- +LSB Version: :core-4.1-amd64:core-4.1-noarch:cxx-4.1-amd64:cxx-4.1-noarch:desktop-4.1-amd64:desktop-4.1-noarch:languages-4.1-amd64:languages-4.1-noarch:printing-4.1-amd64:printing-4.1-noarch +Distributor ID: Korora +Description: Korora release 20 (Peach) +Release: 20 +Codename: Peach +----------/etc/fedora-release---------- +Korora release 20 (Peach) +----------/etc/os-release---------- +NAME=Korora +VERSION="20 (Peach)" +ID=korora +VERSION_ID=20 +PRETTY_NAME="Korora 20 (Peach)" +ANSI_COLOR="0;34" +CPE_NAME="cpe:/o:kororaproject:korora:20" +HOME_URL="https://kororaproject.org/" +----------/etc/redhat-release---------- +Korora release 20 (Peach) +----------/etc/system-release---------- +Korora release 20 (Peach) diff --git a/sources/sample/distrotest/Linaro/13.12.txt b/sources/sample/distrotest/Linaro/13.12.txt new file mode 100644 index 0000000..d6cf3da --- /dev/null +++ b/sources/sample/distrotest/Linaro/13.12.txt @@ -0,0 +1,22 @@ +----------lsb_release -a---------- +Distributor ID: Linaro +Description: Linaro 13.12 +Release: 13.12 +Codename: saucy +----------/etc/lsb-release---------- +DISTRIB_ID=Linaro +DISTRIB_RELEASE=13.12 +DISTRIB_CODENAME=saucy +DISTRIB_DESCRIPTION="Linaro 13.12" +----------/etc/os-release---------- +NAME="Linaro" +VERSION="13.12" +ID=linaro +ID_LIKE=debian +PRETTY_NAME="Linaro 13.12" +VERSION_ID="13.12" +HOME_URL="http://www.linaro.org/" +SUPPORT_URL="http://linaro.zendesk.com/" +BUG_REPORT_URL="http://bugs.launchpad.net/linaro-ubuntu" +----------/etc/debian_version---------- +wheezy/sid diff --git a/sources/sample/distrotest/Lunar/1.7.0-rc2.txt b/sources/sample/distrotest/Lunar/1.7.0-rc2.txt new file mode 100644 index 0000000..f81bf6e --- /dev/null +++ b/sources/sample/distrotest/Lunar/1.7.0-rc2.txt @@ -0,0 +1,13 @@ +----------/etc/lsb-release---------- +DISTRIB_ID="Lunar Linux" +DISTRIB_RELEASE="1.7.0-rc2-x86_64" +DISTRIB_CODENAME="Sinus Successus" +DISTRIB_DESCRIPTION="Lunar Linux 1.7.0-rc2-x86_64 (Sinus Successus - 20140913)" +----------/etc/os-release---------- +NAME="Lunar Linux" +VERSION="1.7.0-rc2-x86_64 (Sinus Successus)" +ID=lunar +VERSION_ID=1.7.0-rc2-x86_64 +PRETTY_NAME="Lunar Linux 1.7.0-rc2-x86_64 (Sinus Successus - 20140913)" +ANSI_COLOR="1;34" +HOME_URL="http://lunar-linux.org/" diff --git a/sources/sample/distrotest/Mageia/4.txt b/sources/sample/distrotest/Mageia/4.txt new file mode 100644 index 0000000..2ddbde3 --- /dev/null +++ b/sources/sample/distrotest/Mageia/4.txt @@ -0,0 +1,36 @@ +----------lsb_release -a---------- +LSB Version: * +Distributor ID: Mageia +Description: Mageia 4 +Release: 4 +Codename: thornicroft +----------/etc/lsb-release---------- +LSB_VERSION= +DISTRIB_ID="Mageia" +DISTRIB_RELEASE=4 +DISTRIB_CODENAME=thornicroft +DISTRIB_DESCRIPTION="Mageia 4" +----------/etc/mageia-release---------- +Mageia release 4 (Cauldron) for x86_64 +----------/etc/mandrake-release---------- +Mageia release 4 (Cauldron) for x86_64 +----------/etc/mandrakelinux-release---------- +Mageia release 4 (Cauldron) for x86_64 +----------/etc/mandriva-release---------- +Mageia release 4 (Cauldron) for x86_64 +----------/etc/os-release---------- +NAME="Mageia" +VERSION="4" +ID=mageia +ID_LIKE="mandriva fedora" +PRETTY_NAME="Mageia 4" +ANSI_COLOR="1;36" +HOME_URL="http://www.mageia.org/" +SUPPORT_URL="http://www.mageia.org/support/" +BUG_REPORT_URL="https://bugs.mageia.org/" +----------/etc/redhat-release---------- +Mageia release 4 (Cauldron) for x86_64 +----------/etc/version---------- +4 0.5 cauldron +----------/etc/release---------- +Mageia release 4 (Cauldron) for x86_64 diff --git a/sources/sample/distrotest/Mandrake/2011.0.txt b/sources/sample/distrotest/Mandrake/2011.0.txt new file mode 100644 index 0000000..e8023cd --- /dev/null +++ b/sources/sample/distrotest/Mandrake/2011.0.txt @@ -0,0 +1,24 @@ +----------lsb_release -a---------- +LSB Version: * +Distributor ID: MandrivaLinux +Description: Mandriva Linux 2011.0 +Release: 2011.0 +Codename: turtle +----------/etc/lsb-release---------- +LSB_VERSION= +DISTRIB_ID=MandrivaLinux +DISTRIB_RELEASE=2011.0 +DISTRIB_CODENAME=turtle +DISTRIB_DESCRIPTION="Mandriva Linux 2011.0" +----------/etc/mandrake-release---------- +Mandriva Linux release 2011.0 (Official) for x86_64 +----------/etc/mandrakelinux-release---------- +Mandriva Linux release 2011.0 (Official) for x86_64 +----------/etc/mandriva-release---------- +Mandriva Linux release 2011.0 (Official) for x86_64 +----------/etc/redhat-release---------- +Mandriva Linux release 2011.0 (Official) for x86_64 +----------/etc/version---------- +2011.0.0 2 cooker +----------/etc/release---------- +Mandriva Linux release 2011.0 (Official) for x86_64 diff --git a/sources/sample/distrotest/Mandrake/9.2.txt b/sources/sample/distrotest/Mandrake/9.2.txt new file mode 100644 index 0000000..beb9b8e --- /dev/null +++ b/sources/sample/distrotest/Mandrake/9.2.txt @@ -0,0 +1,16 @@ +----------lsb_release -a---------- +LSB Version: 1.3 +Distributor ID: Mandrake +Description: Mandrake Linux +Release: 9.2 +Codename: FiveStar +----------/etc/lsb-release---------- +LSB_VERSION=1.3 +DISTRIB_ID=Mandrake +DISTRIB_RELEASE=9.2 +DISTRIB_CODENAME=FiveStar +DISTRIB_DESCRIPTION="Mandrake Linux" +----------/etc/mandrake-release---------- +Mandrake Linux release 9.2 (FiveStar) for i586 +----------/etc/redhat-release---------- +Mandrake Linux release 9.2 (FiveStar) for i586 diff --git a/sources/sample/distrotest/Manjaro/0.8.8.txt b/sources/sample/distrotest/Manjaro/0.8.8.txt new file mode 100644 index 0000000..1d15028 --- /dev/null +++ b/sources/sample/distrotest/Manjaro/0.8.8.txt @@ -0,0 +1,21 @@ +----------lsb_release -a---------- +LSB Version: n/a +Distributor ID: ManjaroLinux +Description: Manjaro Linux +Release: 0.8.8 +Codename: Ascella +----------/etc/lsb-release---------- +DISTRIB_ID=ManjaroLinux +DISTRIB_RELEASE=0.8.8 +DISTRIB_CODENAME=Ascella +DISTRIB_DESCRIPTION="Manjaro Linux" +----------/etc/manjaro-release---------- +Manjaro Linux +----------/etc/os-release---------- +NAME="Manjaro Linux" +ID=manjaro +PRETTY_NAME="Manjaro Linux" +ANSI_COLOR="1;32" +HOME_URL="http://www.manjaro.org/" +SUPPORT_URL="http://www.manjaro.org/" +BUG_REPORT_URL="http://bugs.manjaro.org/" diff --git a/sources/sample/distrotest/Mer/0.2011.txt b/sources/sample/distrotest/Mer/0.2011.txt new file mode 100644 index 0000000..f04291c --- /dev/null +++ b/sources/sample/distrotest/Mer/0.2011.txt @@ -0,0 +1,18 @@ +----------lsb_release -a---------- +LSB Version: :core-3.1-ia32:core-3.1-noarch:core-3.2-ia32:core-3.2-noarch:core-4.0-ia32:core-4.0-noarch:desktop-3.1-ia32:desktop-3.1-noarch:desktop-3.2-ia32:desktop-3.2-noarch:desktop-4.0-ia32:desktop-4.0-noarch +Distributor ID: Mer +Description: Mer release 0.2011 (Mer) +Release: 0.2011 +Codename: Mer +----------/etc/meego-release---------- +Mer release 0.2011 (Mer) +BUILD: Jolla-1.0.8.19-SDK_Build_Engine-i486 +----------/etc/mer-release---------- +Mer release 0.2011 (Mer) +BUILD: Jolla-1.0.8.19-SDK_Build_Engine-i486 +----------/etc/moblin-release---------- +Mer release 0.2011 (Mer) +BUILD: Jolla-1.0.8.19-SDK_Build_Engine-i486 +----------/etc/system-release---------- +Mer release 0.2011 (Mer) +BUILD: Jolla-1.0.8.19-SDK_Build_Engine-i486 diff --git a/sources/sample/distrotest/Mint/13.txt b/sources/sample/distrotest/Mint/13.txt new file mode 100644 index 0000000..a47db71 --- /dev/null +++ b/sources/sample/distrotest/Mint/13.txt @@ -0,0 +1,12 @@ +----------lsb_release -a---------- +Distributor ID: LinuxMint +Description: Linux Mint 13 Maya +Release: 13 +Codename: maya +----------/etc/lsb-release---------- +DISTRIB_ID=LinuxMint +DISTRIB_RELEASE=13 +DISTRIB_CODENAME=maya +DISTRIB_DESCRIPTION="Linux Mint 13 Maya" +----------/etc/debian_version---------- +wheezy/sid diff --git a/sources/sample/distrotest/Mint/14.txt b/sources/sample/distrotest/Mint/14.txt new file mode 100644 index 0000000..0f50cd3 --- /dev/null +++ b/sources/sample/distrotest/Mint/14.txt @@ -0,0 +1,19 @@ +----------lsb_release -a---------- +Distributor ID: LinuxMint +Description: Linux Mint 14 Nadia +Release: 14 +Codename: nadia +----------/etc/lsb-release---------- +DISTRIB_ID=LinuxMint +DISTRIB_RELEASE=14 +DISTRIB_CODENAME=nadia +DISTRIB_DESCRIPTION="Linux Mint 14 Nadia" +----------/etc/os-release---------- +NAME="Ubuntu" +VERSION="12.10, Quantal Quetzal" +ID=ubuntu +ID_LIKE=debian +PRETTY_NAME="Ubuntu quantal (12.10)" +VERSION_ID="12.10" +----------/etc/debian_version---------- +wheezy/sid diff --git a/sources/sample/distrotest/Mint/15.txt b/sources/sample/distrotest/Mint/15.txt new file mode 100644 index 0000000..a858f58 --- /dev/null +++ b/sources/sample/distrotest/Mint/15.txt @@ -0,0 +1,22 @@ +----------lsb_release -a---------- +Distributor ID: LinuxMint +Description: Linux Mint 15 Olivia +Release: 15 +Codename: olivia +----------/etc/lsb-release---------- +DISTRIB_ID=LinuxMint +DISTRIB_RELEASE=15 +DISTRIB_CODENAME=olivia +DISTRIB_DESCRIPTION="Linux Mint 15 Olivia" +----------/etc/os-release---------- +NAME="Ubuntu" +VERSION="13.04, Raring Ringtail" +ID=ubuntu +ID_LIKE=debian +PRETTY_NAME="Ubuntu 13.04" +VERSION_ID="13.04" +HOME_URL="http://www.ubuntu.com/" +SUPPORT_URL="http://help.ubuntu.com/" +BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/" +----------/etc/debian_version---------- +wheezy/sid diff --git a/sources/sample/distrotest/Netrunner/13.06-SE.txt b/sources/sample/distrotest/Netrunner/13.06-SE.txt new file mode 100644 index 0000000..eab52ae --- /dev/null +++ b/sources/sample/distrotest/Netrunner/13.06-SE.txt @@ -0,0 +1,22 @@ +----------lsb_release -a---------- +Distributor ID: NetrunnerSE +Description: Netrunner 5 SE Enigma (13.06) +Release: 13.06 +Codename: enigma-1306 +----------/etc/lsb-release---------- +DISTRIB_ID=NetrunnerSE +DISTRIB_RELEASE=13.06 +DISTRIB_CODENAME=enigma-1306 +DISTRIB_DESCRIPTION="Netrunner 5 SE Enigma (13.06)" +----------/etc/os-release---------- +NAME="Netrunner" +VERSION="13.06, Enigma" +ID=netrunner +ID_LIKE=debian +PRETTY_NAME="Netrunner 5 Enigma (13.06)" +VERSION_ID="13.06" +HOME_URL="www.netrunner-os.com" +SUPPORT_URL="forums.netrunner-os.com" +BUG_REPORT_URL="https://github.com/netrunner/netrunner-feedback" +----------/etc/debian_version---------- +wheezy/sid diff --git a/sources/sample/distrotest/Netrunner/13.06.txt b/sources/sample/distrotest/Netrunner/13.06.txt new file mode 100644 index 0000000..7f6c714 --- /dev/null +++ b/sources/sample/distrotest/Netrunner/13.06.txt @@ -0,0 +1,22 @@ +----------lsb_release -a---------- +Distributor ID: Netrunner +Description: Netrunner 5 Enigma (13.06) +Release: 13.06 +Codename: enigma-1306 +----------/etc/lsb-release---------- +DISTRIB_ID=Netrunner +DISTRIB_RELEASE=13.06 +DISTRIB_CODENAME=enigma-1306 +DISTRIB_DESCRIPTION="Netrunner 5 Enigma (13.06)" +----------/etc/os-release---------- +NAME="Netrunner" +VERSION="13.06, Enigma" +ID=netrunner +ID_LIKE=debian +PRETTY_NAME="Netrunner 5 Enigma (13.06)" +VERSION_ID="13.06" +HOME_URL="www.netrunner-os.com" +SUPPORT_URL="forums.netrunner-os.com" +BUG_REPORT_URL="https://github.com/netrunner/netrunner-feedback" +----------/etc/debian_version---------- +wheezy/sid diff --git a/sources/sample/distrotest/Netrunner/2014.04.txt b/sources/sample/distrotest/Netrunner/2014.04.txt new file mode 100644 index 0000000..394c828 --- /dev/null +++ b/sources/sample/distrotest/Netrunner/2014.04.txt @@ -0,0 +1,22 @@ +----------lsb_release -a---------- +LSB Version: n/a +Distributor ID: Netrunner +Description: Netrunner Rolling +Release: 2014.04 +Codename: Rolling +----------/etc/lsb-release---------- +DISTRIB_ID=Netrunner +DISTRIB_RELEASE=2014.04 +DISTRIB_CODENAME=Rolling +DISTRIB_DESCRIPTION="Netrunner Rolling" +----------/etc/manjaro-release---------- +Manjaro Linux +----------/etc/os-release---------- +NAME="Netrunner Rolling" +ID=netrunner +PRETTY_NAME="Netrunner Rolling" +ANSI_COLOR="1;32" +HOME_URL="www.netrunner-os.com" +SUPPORT_URL="forums.netrunner-os.com" +BUG_REPORT_URL="https://github.com/netrunner/netrunner-feedback" + diff --git a/sources/sample/distrotest/NixOS/13.10.txt b/sources/sample/distrotest/NixOS/13.10.txt new file mode 100644 index 0000000..b5c88cb --- /dev/null +++ b/sources/sample/distrotest/NixOS/13.10.txt @@ -0,0 +1,7 @@ +----------/etc/os-release---------- +NAME=NixOS +ID=nixos +VERSION="13.10.35686.3bcfa7b (Aardvark)" +VERSION_ID="13.10.35686.3bcfa7b" +PRETTY_NAME="NixOS 13.10.35686.3bcfa7b (Aardvark)" +HOME_URL="http://nixos.org/" diff --git a/sources/sample/distrotest/OpenMamba/3.0.1.txt b/sources/sample/distrotest/OpenMamba/3.0.1.txt new file mode 100644 index 0000000..4076b90 --- /dev/null +++ b/sources/sample/distrotest/OpenMamba/3.0.1.txt @@ -0,0 +1,31 @@ +----------lsb_release -a---------- +LSB Version: core-4.1-noarch:core-4.1-x86-64 +Distributor ID: openmamba +Description: openmamba release 3.0.1 for x86_64 (milestone3) +Release: 3.0.1 +Codename: milestone3 +----------/etc/lsb-release---------- +DISTRIB_ID=openmamba +DISTRIB_RELEASE=2.90.0 +DISTRIB_CODENAME=rolling +DISTRIB_DESCRIPTION="openmamba 2.90.0" +LSB_VERSION=core-4.1-x86-64:core-4.1-noarch +----------/etc/openmamba-release---------- +openmamba release 3.0.1 for x86_64 (milestone3) +----------/etc/os-release---------- +NAME=openmamba +VERSION="3.0.1 (milestone3)" +ID=openmamba +VERSION_ID="3.0.1" +PRETTY_NAME="openmamba GNU/Linux 3.0.1 for x86_64 (milestone3)" +ANSI_COLOR="0;32" +CPE_NAME="cpe:/o:openmamba:openmamba:3.0.1" +HOME_URL="http://www.openmamba.org/" +BUG_REPORT_URL="http://bugs.openmamba.org/" +OPENMAMBA_MILESTONE="milestone3" +OPENMAMBA_CODENAME="milestone3" +OPENMAMBA_FORUM_URL="http://forum.openmamba.org/" +OPENMAMBA_GIT_URL="http://gitlab.mambasoft.it/openmamba/" +OPENMAMBA_WEBBUILD_URL="http://www.openmamba.org/distribution/webbuild.php" +----------/etc/system-release---------- +openmamba release 3.0.1 for x86_64 (milestone3) diff --git a/sources/sample/distrotest/OpenMandriva/2013.0-RC1.txt b/sources/sample/distrotest/OpenMandriva/2013.0-RC1.txt new file mode 100644 index 0000000..a083867 --- /dev/null +++ b/sources/sample/distrotest/OpenMandriva/2013.0-RC1.txt @@ -0,0 +1,41 @@ +----------lsb_release -a---------- +LSB Version: * +Distributor ID: OpenMandrivaLinux +Description: OpenMandriva Lx 2013.0 +Release: 2013.0 +Codename: oxygen +----------/etc/distro-release---------- +OpenMandriva Lx release 2013.0 RC1 (Oxygen) for x86_64 +----------/etc/lsb-release---------- +LSB_VERSION= +DISTRIB_ID=OpenMandrivaLinux +DISTRIB_RELEASE=2013.0 +DISTRIB_CODENAME=oxygen +DISTRIB_DESCRIPTION="OpenMandriva Lx 2013.0" +----------/etc/mandrake-release---------- +OpenMandriva Lx release 2013.0 RC1 (Oxygen) for x86_64 +----------/etc/mandrakelinux-release---------- +OpenMandriva Lx release 2013.0 RC1 (Oxygen) for x86_64 +----------/etc/mandriva-release---------- +OpenMandriva Lx release 2013.0 RC1 (Oxygen) for x86_64 +----------/etc/os-release---------- +NAME="OpenMandriva Lx" +VERSION="2013.0 RC1 (Oxygen)" +ID="openmandriva_association" +VERSION_ID=2013.0 +BUILD_ID=20131104.12 +PRETTY_NAME="OpenMandriva Lx 2013.0 RC1 (Oxygen)" +ANSI_COLOR="1;43" +CPE_NAME="cpe:/o:openmandriva_association:openmandriva_lx:2013.0" +HOME_URL="http://openmandriva.org/" +BUG_REPORT_URL="https://issues.openmandriva.org/" +----------/etc/redhat-release---------- +OpenMandriva Lx release 2013.0 RC1 (Oxygen) for x86_64 +----------/etc/rosa-release---------- +OpenMandriva Lx release 2013.0 RC1 (Oxygen) for x86_64 +----------/etc/system-release---------- +OpenMandriva Lx release 2013.0 RC1 (Oxygen) for x86_64 +----------/etc/version---------- +2013.0.0 4 RC1 (Oxygen) +----------/etc/release---------- +OpenMandriva Lx release 2013.0 RC1 (Oxygen) for x86_64 diff --git a/sources/sample/distrotest/Oracle/5.10-el.txt b/sources/sample/distrotest/Oracle/5.10-el.txt new file mode 100644 index 0000000..f59f006 --- /dev/null +++ b/sources/sample/distrotest/Oracle/5.10-el.txt @@ -0,0 +1,12 @@ +----------lsb_release -a---------- +LSB Version: :core-4.0-ia32:core-4.0-noarch:graphics-4.0-ia32:graphics-4.0-noarch:printing-4.0-ia32:printing-4.0-noarch +Distributor ID: EnterpriseEnterpriseServer +Description: Enterprise Linux Enterprise Linux Server release 5.10 (Carthage) +Release: 5.10 +Codename: Carthage +----------/etc/enterprise-release---------- +Enterprise Linux Enterprise Linux Server release 5.10 (Carthage) +----------/etc/oracle-release---------- +Oracle Linux Server release 5.10 +----------/etc/redhat-release---------- +Red Hat Enterprise Linux Server release 5.10 (Tikanga) diff --git a/sources/sample/distrotest/Oracle/6.3.txt b/sources/sample/distrotest/Oracle/6.3.txt new file mode 100644 index 0000000..51c986b --- /dev/null +++ b/sources/sample/distrotest/Oracle/6.3.txt @@ -0,0 +1,12 @@ +----------lsb_release -a---------- +LSB Version: :core-4.0-amd64:core-4.0-noarch:graphics-4.0-amd64:graphics-4.0-noarch:printing-4.0-amd64:printing-4.0-noarch +Distributor ID: OracleServer +Description: Oracle Linux Server release 6.3 +Release: 6.3 +Codename: n/a +----------/etc/oracle-release---------- +Oracle Linux Server release 6.3 +----------/etc/redhat-release---------- +Red Hat Enterprise Linux Server release 6.3 (Santiago) +----------/etc/system-release---------- +Oracle Linux Server release 6.3 diff --git a/sources/sample/distrotest/PCLinuxOS/2012.06.txt b/sources/sample/distrotest/PCLinuxOS/2012.06.txt new file mode 100644 index 0000000..9449357 --- /dev/null +++ b/sources/sample/distrotest/PCLinuxOS/2012.06.txt @@ -0,0 +1,26 @@ +----------lsb_release -a---------- +LSB Version: lsb-3.1-ia32:lsb-3.1-noarch:* +Distributor ID: PCLinuxOS +Description: PCLinuxOS +Release: 2012 +Codename: PCLinuxOS +----------/etc/lsb-release---------- +LSB_VERSION=lsb-3.1-ia32:lsb-3.1-noarch:* +DISTRIB_ID=PCLinuxOS +DISTRIB_RELEASE= +DISTRIB_CODENAME= +DISTRIB_DESCRIPTION="PCLinuxOS" +----------/etc/version---------- +2012 1 PCLinuxOS +----------/etc/mandrake-release---------- +PCLinuxOS release 2012 (PCLinuxOS) for i586 +----------/etc/mandrakelinux-release---------- +PCLinuxOS release 2012 (PCLinuxOS) for i586 +----------/etc/mandriva-release---------- +PCLinuxOS release 2012 (PCLinuxOS) for i586 +----------/etc/pclinuxos-release---------- +PCLinuxOS release 2012 (PCLinuxOS) for i586 +----------/etc/redhat-release---------- +PCLinuxOS release 2012 (PCLinuxOS) for i586 +----------/etc/release---------- +PCLinuxOS release 2012 (PCLinuxOS) for i586 diff --git a/sources/sample/distrotest/PLD/2.99.txt b/sources/sample/distrotest/PLD/2.99.txt new file mode 100644 index 0000000..771716f --- /dev/null +++ b/sources/sample/distrotest/PLD/2.99.txt @@ -0,0 +1,2 @@ +----------/etc/pld-release---------- +2.99 PLD Linux (Th) diff --git a/sources/sample/distrotest/PLD/3.0.txt b/sources/sample/distrotest/PLD/3.0.txt new file mode 100644 index 0000000..bee6288 --- /dev/null +++ b/sources/sample/distrotest/PLD/3.0.txt @@ -0,0 +1,11 @@ +----------/etc/pld-release---------- +3.0 PLD Linux (Th) +----------/etc/os-release---------- +NAME="PLD Linux" +ID="pld" +VERSION_ID="3.0" +PRETTY_NAME="PLD Linux 3.0 (Th)" +ANSI_COLOR="0;32" +CPE_NAME="cpe:/o:pld-linux:pld:3.0" +HOME_URL="http://www.pld-linux.org/" +BUG_REPORT_URL="https://bugs.pld-linux.org/" diff --git a/sources/sample/distrotest/Parsix/5.0.txt b/sources/sample/distrotest/Parsix/5.0.txt new file mode 100644 index 0000000..0e6dd6b --- /dev/null +++ b/sources/sample/distrotest/Parsix/5.0.txt @@ -0,0 +1,19 @@ +----------lsb_release -a---------- +Distributor ID: Parsix +Description: Parsix GNU/Linux 5.0 (lombardo) +Release: 5.0 +Codename: lombardo +----------/etc/os-release---------- +PRETTY_NAME="Parsix GNU/Linux 4.0 (gloria)" +NAME="Parsix GNU/Linux" +VERSION_ID="4.0" +VERSION="4.0 (gloria)" +ID=parsix +ANSI_COLOR="1;31" +HOME_URL="http://www.parsix.org/" +SUPPORT_URL="http://forums.parsix.org/" +BUG_REPORT_URL="http://bugs.parsix.org/" +----------/etc/parsix-version---------- +Parsix GNU/Linux 5.0r1 +----------/etc/debian_version---------- +7.0 diff --git a/sources/sample/distrotest/Parsix/6.0.txt b/sources/sample/distrotest/Parsix/6.0.txt new file mode 100644 index 0000000..bda1dad --- /dev/null +++ b/sources/sample/distrotest/Parsix/6.0.txt @@ -0,0 +1,19 @@ +----------lsb_release -a---------- +Distributor ID: Parsix +Description: Parsix GNU/Linux 6.0 (trev) +Release: 6.0 +Codename: trev +----------/etc/os-release---------- +PRETTY_NAME="Parsix GNU/Linux 4.0 (gloria)" +NAME="Parsix GNU/Linux" +VERSION_ID="4.0" +VERSION="4.0 (gloria)" +ID=parsix +ANSI_COLOR="1;31" +HOME_URL="http://www.parsix.org/" +SUPPORT_URL="http://forums.parsix.org/" +BUG_REPORT_URL="http://bugs.parsix.org/" +----------/etc/parsix-version---------- +Parsix GNU/Linux 6.0-TEST-1 +----------/etc/debian_version---------- +7.0 diff --git a/sources/sample/distrotest/Pear/5.00.txt b/sources/sample/distrotest/Pear/5.00.txt new file mode 100644 index 0000000..547ec12 --- /dev/null +++ b/sources/sample/distrotest/Pear/5.00.txt @@ -0,0 +1,12 @@ +----------lsb_release -a---------- +Distributor ID: PearLinux +Description: Pear Linux 5 +Release: 5.00 +Codename: sunsprite +----------/etc/lsb-release---------- +DISTRIB_ID=PearLinux +DISTRIB_RELEASE=5.00 +DISTRIB_CODENAME=sunsprite +DISTRIB_DESCRIPTION="Pear Linux 5" +----------/etc/debian_version---------- +wheezy/sid diff --git a/sources/sample/distrotest/Pear/6.1-LTS.txt b/sources/sample/distrotest/Pear/6.1-LTS.txt new file mode 100644 index 0000000..f6b4322 --- /dev/null +++ b/sources/sample/distrotest/Pear/6.1-LTS.txt @@ -0,0 +1,20 @@ +----------lsb_release -a---------- +Distributor ID: PearLinux +Description: Pear Linux 6.1 LTS +Release: 6.1 +Codename: Bartlett +----------/etc/lsb-release---------- +DISTRIB_ID=PearLinux +DISTRIB_RELEASE=6.1 +DISTRIB_CODENAME=Bartlett +DISTRIB_DESCRIPTION="Pear Linux 6.1 LTS" +DISTRIB_EDITION="32 bit PAE" +----------/etc/os-release---------- +NAME="Ubuntu" +VERSION="12.04.1 LTS, Precise Pangolin" +ID=ubuntu +ID_LIKE=debian +PRETTY_NAME="Ubuntu precise (12.04.1 LTS)" +VERSION_ID="12.04" +----------/etc/debian_version---------- +wheezy/sid diff --git a/sources/sample/distrotest/Pear/6.1.txt b/sources/sample/distrotest/Pear/6.1.txt new file mode 100644 index 0000000..50475d2 --- /dev/null +++ b/sources/sample/distrotest/Pear/6.1.txt @@ -0,0 +1,19 @@ +----------lsb_release -a---------- +Distributor ID: Pear Linux +Description: Pear Linux 6.1 +Release: 6.1 +Codename: Bartlett +----------/etc/lsb-release---------- +DISTRIB_ID="Pear Linux" +DISTRIB_RELEASE="6.1" +DISTRIB_CODENAME="Bartlett" +DISTRIB_DESCRIPTION="Pear Linux 6.1" +----------/etc/os-release---------- +NAME="Ubuntu" +VERSION="12.04.1 LTS, Precise Pangolin" +ID=ubuntu +ID_LIKE=debian +PRETTY_NAME="Ubuntu precise (12.04.1 LTS)" +VERSION_ID="12.04" +----------/etc/debian_version---------- +wheezy/sid diff --git a/sources/sample/distrotest/Pear/7.0.txt b/sources/sample/distrotest/Pear/7.0.txt new file mode 100644 index 0000000..aa898f0 --- /dev/null +++ b/sources/sample/distrotest/Pear/7.0.txt @@ -0,0 +1,20 @@ +----------lsb_release -a---------- +Distributor ID: PearOS +Description: Pear OS 7 64 bits +Release: 7.0 +Codename: Corella +----------/etc/lsb-release---------- +DISTRIB_ID="PearOS" +DISTRIB_RELEASE="7.0" +DISTRIB_CODENAME="Corella" +DISTRIB_DESCRIPTION="Pear OS 7 64 bits" + +----------/etc/os-release---------- +NAME="Ubuntu" +VERSION="12.10, Quantal Quetzal" +ID=ubuntu +ID_LIKE=debian +PRETTY_NAME="Ubuntu quantal (12.10)" +VERSION_ID="12.10" +----------/etc/debian_version---------- +wheezy/sid diff --git a/sources/sample/distrotest/Peppermint/3.txt b/sources/sample/distrotest/Peppermint/3.txt new file mode 100644 index 0000000..a53abbf --- /dev/null +++ b/sources/sample/distrotest/Peppermint/3.txt @@ -0,0 +1,12 @@ +----------lsb_release -a---------- +Distributor ID: Peppermint +Description: Peppermint Three +Release: 3 +Codename: precise +----------/etc/lsb-release---------- +DISTRIB_ID=Peppermint +DISTRIB_RELEASE=3 +DISTRIB_CODENAME=precise +DISTRIB_DESCRIPTION="Peppermint Three" +----------/etc/debian_version---------- +wheezy/sid diff --git a/sources/sample/distrotest/Peppermint/4-20131113.txt b/sources/sample/distrotest/Peppermint/4-20131113.txt new file mode 100644 index 0000000..ff125b7 --- /dev/null +++ b/sources/sample/distrotest/Peppermint/4-20131113.txt @@ -0,0 +1,22 @@ +----------lsb_release -a---------- +Distributor ID: Peppermint +Description: Peppermint Four +Release: 4 +Codename: raring +----------/etc/lsb-release---------- +DISTRIB_ID=Peppermint +DISTRIB_RELEASE=4 +DISTRIB_CODENAME=raring +DISTRIB_DESCRIPTION="Peppermint Four" +----------/etc/os-release---------- +NAME="Peppermint" +VERSION="Four" +ID=peppermint +ID_LIKE=debian +PRETTY_NAME="Peppermint Four" +VERSION_ID="4" +HOME_URL="http://peppermintos.com/" +SUPPORT_URL="http://peppermintos.net/" +BUG_REPORT_URL="http://bugs.launchpad.net/peppermint/" +----------/etc/debian_version---------- +wheezy/sid diff --git a/sources/sample/distrotest/Pisi/1.0.txt b/sources/sample/distrotest/Pisi/1.0.txt new file mode 100644 index 0000000..732da6b --- /dev/null +++ b/sources/sample/distrotest/Pisi/1.0.txt @@ -0,0 +1,15 @@ +----------lsb_release -a---------- +LSB Version: n/a +Distributor ID: PisiLinux +Description: Pisi GNU/Linux 1.0 +Release: 1.0 +Codename: n/a +----------/etc/lsb-release---------- +DISTRIB_ID="PisiLinux" +DISTRIB_RELEASE="1.0" +DISTRIB_DESCRIPTION="Pisi GNU/Linux 1.0" +DISTRIB_CODENAME="" +----------/etc/pisilinux-release---------- +Pisi_Linux 1.0 +----------/etc/system-release---------- +Pisi_Linux 1.0 diff --git a/sources/sample/distrotest/Porteus/2.1.txt b/sources/sample/distrotest/Porteus/2.1.txt new file mode 100644 index 0000000..b109dcf --- /dev/null +++ b/sources/sample/distrotest/Porteus/2.1.txt @@ -0,0 +1,15 @@ +----------/etc/os-release---------- +NAME=Slackware +VERSION="14.0" +ID=slackware +VERSION_ID=14.0 +PRETTY_NAME="Slackware 14.0" +ANSI_COLOR="0;34" +CPE_NAME="cpe:/o:slackware:slackware_linux:14.0" +HOME_URL="http://slackware.com/" +SUPPORT_URL="http://www.linuxquestions.org/questions/slackware-14/" +BUG_REPORT_URL="http://www.linuxquestions.org/questions/slackware-14/" +----------/etc/porteus-version---------- +Porteus-v2.1 +----------/etc/slackware-version---------- +Slackware 14.0 diff --git a/sources/sample/distrotest/Puppy/431.txt b/sources/sample/distrotest/Puppy/431.txt new file mode 100644 index 0000000..48e7d63 --- /dev/null +++ b/sources/sample/distrotest/Puppy/431.txt @@ -0,0 +1,11 @@ +----------/etc/DISTRO_SPECS---------- +#One or more words that identify this distribution: +DISTRO_NAME='Puppy' +#A three-digit numeric value, version number of this distribution: +DISTRO_VERSION=431 +#The distro whose binary packages were used to build this distribution: +DISTRO_BINARY_COMPAT='puppy' +#Prefix for some filenames: exs: pupsave.2fs, pup-431.sfs +DISTRO_FILE_PREFIX='pup' +#The version of the distro whose binary packages were used to build this distro: +DISTRO_COMPAT_VERSION='4' diff --git a/sources/sample/distrotest/Puppy/5.3-wary.txt b/sources/sample/distrotest/Puppy/5.3-wary.txt new file mode 100644 index 0000000..d289f23 --- /dev/null +++ b/sources/sample/distrotest/Puppy/5.3-wary.txt @@ -0,0 +1,23 @@ +----------/etc/DISTRO_SPECS---------- +#One or more words that identify this distribution: +DISTRO_NAME='Wary Puppy' +#version number of this distribution: +DISTRO_VERSION=5.3 +#The distro whose binary packages were used to build this distribution: +DISTRO_BINARY_COMPAT='puppy' +#Prefix for some filenames: exs: warysave.2fs, wary-5.1.3.4.sfs +DISTRO_FILE_PREFIX='wary' +#The version of the distro whose binary packages were used to build this distro: +DISTRO_COMPAT_VERSION='wary5' +#the kernel pet package used: +DISTRO_KERNEL_PET='linux_kernel-2.6.32.59-uni-i486-aufs-w5.pet' +DISTRO_TARGETARCH='x86' +#16-byte alpha-numeric ID-string appended to vmlinuz, puppy_wary_5.3.sfs, zdrv_wary_5.3.sfs and devx.sfs: +DISTRO_IDSTRING='w120404071421ZZZZ5.3XXXXXXXXXXXX' +#Puppy default filenames... +#Note, the 'SFS' files below are what the 'init' script in initrd.gz searches for, +#for the partition, path and actual files loaded, see PUPSFS and ZDRV in /etc/rc.d/PUPSTATE +DISTRO_PUPPYSFS='puppy_wary_5.3.sfs' +DISTRO_ZDRVSFS='zdrv_wary_5.3.sfs' +DISTRO_PUPPYDATE='Apr 2012' +DISTRO_XORG_AUTO='no' diff --git a/sources/sample/distrotest/Puppy/5.3.3-slacko.txt b/sources/sample/distrotest/Puppy/5.3.3-slacko.txt new file mode 100644 index 0000000..147f356 --- /dev/null +++ b/sources/sample/distrotest/Puppy/5.3.3-slacko.txt @@ -0,0 +1,22 @@ +----------/etc/DISTRO_SPECS---------- +#One or more words that identify this distribution: +DISTRO_NAME='Slacko Puppy' +#version number of this distribution: +DISTRO_VERSION=5.3.3 +#The distro whose binary packages were used to build this distribution: +DISTRO_BINARY_COMPAT='slackware' +#Prefix for some filenames: exs: slackosave.2fs, slacko-5.3.3.sfs +DISTRO_FILE_PREFIX='slacko' +#The version of the distro whose binary packages were used to build this distro: +DISTRO_COMPAT_VERSION='13.37' +#the kernel pet package used: +DISTRO_KERNEL_PET='linux_kernel-3.1.10-patched_s_4gA.pet' +#16-byte alpha-numeric ID-string appended to vmlinuz, puppy_slacko_5.3.3.sfs, zdrv_slacko_5.3.3.sfs and devx.sfs: +DISTRO_IDSTRING='s120505091759ZZZZ5.3.3XXXXXXXXXX' +#Puppy default filenames... +#Note, the 'SFS' files below are what the 'init' script in initrd.gz searches for, +#for the partition, path and actual files loaded, see PUPSFS and ZDRV in /etc/rc.d/PUPSTATE +DISTRO_PUPPYSFS='puppy_slacko_5.3.3.sfs' +DISTRO_ZDRVSFS='zdrv_slacko_5.3.3.sfs' +DISTRO_PUPPYDATE='May 2012' +DISTRO_XORG_AUTO='yes' diff --git a/sources/sample/distrotest/Puppy/528-lucid.txt b/sources/sample/distrotest/Puppy/528-lucid.txt new file mode 100644 index 0000000..d600f79 --- /dev/null +++ b/sources/sample/distrotest/Puppy/528-lucid.txt @@ -0,0 +1,22 @@ +----------/etc/DISTRO_SPECS---------- +#One or more words that identify this distribution: +DISTRO_NAME='Lucid ' +#A three-digit numeric value, version number of this distribution: +DISTRO_VERSION=528 +#A two-digit numeric value, minor-version number of this distribution: +DISTRO_MINOR_VERSION=00 +#The distro whose binary packages were used to build this distribution: +DISTRO_BINARY_COMPAT='ubuntu' +#Prefix for some filenames: exs: lupusave.2fs, lupu-528.sfs +DISTRO_FILE_PREFIX='lupu' +#The version of the distro whose binary packages were used to build this distro: +DISTRO_COMPAT_VERSION='lucid' +#the kernel pet package used: +DISTRO_KERNEL_PET='linux_kernel-2.6.33.2-tickless_smp_patched-L3.pet' +#16-byte alpha-numeric ID-string appended to vmlinuz, lupu_528.sfs, zl528332.sfs and devx.sfs: +DISTRO_IDSTRING='l528120404231153' +#Puppy default filenames... +#Note, the 'SFS' files below are what the 'init' script in initrd.gz searches for, +#for the partition, path and actual files loaded, see PUPSFS and ZDRV in /etc/rc.d/PUPSTATE +DISTRO_PUPPYSFS='lupu_528.sfs' +DISTRO_ZDRVSFS='zl528332.sfs' diff --git a/sources/sample/distrotest/QTS/3.1.2.txt b/sources/sample/distrotest/QTS/3.1.2.txt new file mode 100644 index 0000000..6fa3cb0 --- /dev/null +++ b/sources/sample/distrotest/QTS/3.1.2.txt @@ -0,0 +1,284 @@ +----------/etc/config/uLinux.conf---------- +[System] +Model = TS-439 +Internal Model = TS-439 +Server comment = american +Version = 3.1.2 +Build Number = 1014T +Time Zone = America/Phoenix +Enable Daylight Saving Time = TRUE +Workgroup = DODOES +Code Page = 437 +System Device = /dev/sdx +Test Mode = FALSE +Auto Create Raid = raid0 +Wan Access = TRUE +Lan Access = TRUE +Web Access Port = 8080 +E2KEY Support = FALSE +Rsync Support = TRUE +Rsync Model = QNAP +FS Type = ext3 +Auto PowerOn = FALSE +Quota Type = vfsv0 +Write Connection Log = 0 + +Booting = 0 +Server Name = american +UPNP_UUID = 76c5f8aa-558a-40f7-a07e-3f4ea6ab79ff +Redundant Power Enable = FALSE +[Test] +Test Program = /sbin/test/Self-test-main + +[NTP] +USE NTP Server = FALSE +NTP Server IP = pool.ntp.org +Enable NTP Server = FALSE +Server1 IP = +Server2 IP = +Sercer3 IP = +Interval = 1 +TimeUnit = DAY + +[Alert] +Alert Level = 0 +SMTP IP = 0.0.0.0 +Alert Mail = +SMS Mode = 0 + +[Network] +Interface Number = 2 +DNS = 0.0.0.0 +WINS IP = 0.0.0.0 +WINS Enable = False +BONDING Support = TRUE +BONDING01 = Interface1 +BONDING02 = Interface2 +Domain Name Server 1 = 0.0.0.0 +Domain Name Server 2 = 0.0.0.0 +[bond0] +Bonding Mode = 4 +Configure = TRUE +Use DHCP = TRUE +Usage = DHCP +IP Address = 169.254.100.100 +Subnet Mask = 255.255.0.0 +Broadcast = 169.254.255.255 +Gateway = 169.254.100.100 +Speed = auto +MTU = 1500 + +[eth0] +Configure = False +Use DHCP = TRUE +Usage = DHCP +IP Address = 169.254.100.100 +Subnet Mask = 255.255.0.0 +Broadcast = 192.168.255.255 +Gateway = 169.254.100.100 +Speed = auto +MTU = 1500 + +[eth1] +Configure = False +Use DHCP = TRUE +Usage = DHCP +IP Address = 169.254.100.100 +Subnet Mask = 255.255.0.0 +Broadcast = 192.168.255.255 +Gateway = 169.254.100.100 +Speed = auto +MTU = 1500 + +[Samba] +Enable = TRUE +[Appletalk] +Enable = TRUE +Default Zone = * +[SNMP] +Server Enable = FALSE + +[WebFS] +Enable = TRUE +Web Root Path = /WWW + +[QWEB] +Enable = 1 +Port = 80 +[QPHOTO] +Enable = TRUE +[BTDownload] +Enable = TRUE +Max_Running = 3 +Qget_Support = TRUE +Download_Folder = /share/Qdownload/ +Total Job = 0 +Run List Job = 0 +Pause List Job = 0 +Finish List Job = 0 +Overwrite List = 0 +Max Download Rate = 0 +Max Upload Rate = 0 +Port Range From = 6881 +Port Range To = 6999 +UPnP Port Forwarding = 0 +encrypt = 0 +DT Time = 1 +S1 Enable = 0 +S2 Enable = 0 +[NVR] +Enable = FALSE +Support = TRUE + +[Storage] +Auto Init = FALSE +Disk Drive Number = 4 +Drive 1 = sda +Drive 2 = sdb +Drive 3 = sdc +Drive 4 = sdd +Disk Check On Boot = Error +Auto Fix Disk Check Errors = TRUE +Support RAID 5 = FALSE +SUPPORT HOTSWAP = TRUE +Support Hot Spare = FALSE +Support LVM = FALSE + +Encrypt_sda3 = FALSE +Encrypt_sdb3 = FALSE +Encrypt_sdc3 = FALSE +Encrypt_md0 = FALSE +[Disk] +Drive 1 EXIST = 1 +Drive 2 EXIST = 1 +Drive 3 EXIST = 1 +Drive 4 EXIST = 0 +Drive 5 EXIST = 0 + +Drive 13 EXIST = 0 +Drive 9 EXIST = 1 +[FTP] +ServerName = ProFTPD +Enable = False +Port = 21 +MaxInstances = 30 +User = guest +Group = guest +DefaultRoot = /share +MaxAnonymous = 30 +AllowAnonymous = False +Unicode = 0 +CharsetRemote = 999 +SSL MODE = 1 +Passive Enabled = 1 +Bandwidth Enabled = 0 +Max connection per account = 10 +EnableUserWanIp = FALSE +WanIp = +[DHCP Server] +Enable = FALSE +Start Range = 169.254.1.100 +End Range = 169.254.1.200 +Max Lease Time = 86400 + +[Printers] +Support = FALSE +Enable = False +Name = +Comment = Printer port on NAS + +Phy exist = 0 +Phy exist2 = 0 +Phy exist3 = 0 +Phy exist4 = 0 +Phy exist5 = 0 +[LOGO] +Show PIC Index = 1 +PIC Counter = 10 +Default LOGO Image Path = /etc/config/logo/default_logo_img.gif +Upload LOGO Image Path = /etc/config/logo/upload_logo_img.gif +PIC1 LOGO Image Path = /etc/config/logo/pic1_logo_img.gif +PIC2 LOGO Image Path = /etc/config/logo/pic2_logo_img.gif +PIC3 LOGO Image Path = /etc/config/logo/pic3_logo_img.gif +PIC4 LOGO Image Path = /etc/config/logo/pic4_logo_img.gif +PIC5 LOGO Image Path = /etc/config/logo/pic5_logo_img.gif +LOGO Image Size Limitation = 20480 + +[UPS] +Support = TRUE +Serial UPS = FALSE +Snmp UPS = TRUE +Daemon Type = 1 +UPS IP = 0.0.0.0 +Enable = FALSE +UPS Type = PhxTec-A1000 +Shutdown System In = 5 +ValidCOM = 1 +AC Power = OK +Battery Power = OK + +[Misc] +Disk StandBy Timeout = 5 +Disk StandBy Timeout Enable = TRUE +Disk Free Size Alert = 3072 +Disk Free Size Alert Enable = TRUE +Buzzer Warning Enable = TRUE +Wake On Lan = FALSE + +System Started = TRUE +Configured = TRUE +Reset Password Switch = TRUE +Custom Temp = 0 +system low temp = 40 +system high temp = 48 +[HWTEST] +mini PCI = Agere Systems + +[MySQL] +Enable = FALSE +DB_Init = FALSE +[LOGIN] +SSH Enable = TRUE +SSH Port = 22 +TELNET Enable = FALSE +TELNET Port = 13131 + +[Index] +Qphoto_LOGO = FALSE +Qdownlod_LOGO = FALSE + +[iSCSI] +Company Info = 2004-04.com.qnap +Model Name = TS-439 +[END_FLAG] +[usb copy] +usb_copy_avail = 1 +lock flag = 0 +usb copying = 0 +copy func old = 0 +copy func = 0 +internal = Qusb +copy type = 0 +[UPnP Service] +Enable = TRUE +[NFS] +Enable = TRUE +[TwonkyMedia] +Enable = TRUE +[iTune] +Enable = TRUE +Password Enabled = 0 +Code Page = CP437 +[Bonjour Service] +Web = 1 +Web Service Name = american +SAMBA = 1 +SAMBA Service Name = american(SAMBA) +AFP = 1 +AFP Service Name = american(AFP) +SSH = 0 +SSH Service Name = american(SSH) +FTP = 0 +FTP Service Name = american(FTP) +[QRAID1] +device name = diff --git a/sources/sample/distrotest/Qubes/3.0.txt b/sources/sample/distrotest/Qubes/3.0.txt new file mode 100644 index 0000000..d3ab4e1 --- /dev/null +++ b/sources/sample/distrotest/Qubes/3.0.txt @@ -0,0 +1,16 @@ +----------/etc/fedora-release---------- +Qubes release 3.0 (R3.0) +----------/etc/os-release---------- +NAME=Qubes +VERSION="3.0 (R3.0)" +ID=qubes +VERSION_ID=3.0 +PRETTY_NAME="Qubes 3.0 (R3.0)" +ANSI_COLOR="0;31" +CPE_NAME="cpe:/o:ITL:qubes:3.0" +----------/etc/qubes-release---------- +Qubes release 3.0 (R3.0) +----------/etc/redhat-release---------- +Qubes release 3.0 (R3.0) +----------/etc/system-release---------- +Qubes release 3.0 (R3.0) diff --git a/sources/sample/distrotest/ROSA/2012.0.0-11-LTS.txt b/sources/sample/distrotest/ROSA/2012.0.0-11-LTS.txt new file mode 100644 index 0000000..663d45c --- /dev/null +++ b/sources/sample/distrotest/ROSA/2012.0.0-11-LTS.txt @@ -0,0 +1,34 @@ +----------lsb_release -a---------- +LSB Version: core-2.0-amd64:core-2.0-noarch:core-3.0-amd64:core-3.0-noarch:core-3.1-amd64:core-3.1-noarch:core-3.2-amd64:core-3.2-noarch:core-4.0-amd64:core-4.0-noarch:core-4.1-amd64:core-4.1-noarch:cxx-3.1-amd64:cxx-3.1-noarch:cxx-3.2-amd64:cxx-3.2-noarch:graphics-3.1-amd64:graphics-3.1-noarch:graphics-3.2-amd64:graphics-3.2-noarch:lsb-2.0-amd64:lsb-2.0-noarch:lsb-3.0-amd64:lsb-3.0-noarch:lsb-3.1-amd64:lsb-3.1-noarch:lsb-3.2-amd64:lsb-3.2-noarch:lsb-4.0-amd64:lsb-4.0-noarch:lsb-4.1-amd64:lsb-4.1-noarch +Distributor ID: RosaDesktop.Marathon +Description: ROSA Linux 2012.0 +Release: 2012.0 +Codename: marathon +----------/etc/lsb-release---------- +LSB_VERSION= +DISTRIB_ID=RosaDesktop.Marathon +DISTRIB_RELEASE=2012.0 +DISTRIB_CODENAME=marathon +DISTRIB_DESCRIPTION="ROSA Linux 2012.0" +----------/etc/version---------- +2012.0.0 11 rosalts +----------/etc/release---------- +ROSA release 2012.0 (LTS) for x86_64 +----------/etc/mandrake-release---------- +ROSA release 2012.0 (LTS) for x86_64 +----------/etc/mandrakelinux-release---------- +ROSA release 2012.0 (LTS) for x86_64 +----------/etc/mandriva-release---------- +ROSA release 2012.0 (LTS) for x86_64 +----------/etc/redhat-release---------- +ROSA release 2012.0 (LTS) for x86_64 +----------/etc/os-release---------- +NAME="ROSA Marathon" +VERSION="Free 2012.0 LTS" +ID=rosa +VERSION_ID=2012lts +PRETTY_NAME="ROSA Marathon Free 2012.0 LTS" +ANSI_COLOR="1;43" +CPE_NAME="cpe:/o:rosa:rosalinux:2012.0" +HOME_URL="http://www.rosalinux.com/" +BUG_REPORT_URL="https://bugs.rosalinux.com/" diff --git a/sources/sample/distrotest/ROSA/2012.0.0-6-LTS.txt b/sources/sample/distrotest/ROSA/2012.0.0-6-LTS.txt new file mode 100644 index 0000000..1337320 --- /dev/null +++ b/sources/sample/distrotest/ROSA/2012.0.0-6-LTS.txt @@ -0,0 +1,25 @@ +----------lsb_release -a---------- +LSB Version: * +Distributor ID: ROSA +Description: ROSA Linux 2012.0 +Release: 2012.0 +Codename: turtle +----------/etc/lsb-release---------- +LSB_VERSION= +DISTRIB_ID=ROSA MarathonLinux +DISTRIB_RELEASE=2012.0 +DISTRIB_CODENAME=turtle +DISTRIB_DESCRIPTION="ROSA Linux 2012.0" +----------/etc/version---------- +2012.0.0 6 rosalts +----------/etc/release---------- +ROSA Linux release 2012.0 (LTS) for x86_64 +----------/etc/mandrake-release---------- +ROSA Linux release 2012.0 (LTS) for x86_64 +----------/etc/mandrakelinux-release---------- +ROSA Linux release 2012.0 (LTS) for x86_64 +----------/etc/mandriva-release---------- +ROSA Linux release 2012.0 (LTS) for x86_64 +----------/etc/redhat-release---------- +ROSA Linux release 2012.0 (LTS) for x86_64 + diff --git a/sources/sample/distrotest/ROSA/2012.1.0-20.txt b/sources/sample/distrotest/ROSA/2012.1.0-20.txt new file mode 100644 index 0000000..184b779 --- /dev/null +++ b/sources/sample/distrotest/ROSA/2012.1.0-20.txt @@ -0,0 +1,34 @@ +----------lsb_release -a---------- +LSB Version: * +Distributor ID: RosaDesktop.Fresh +Description: ROSA RosaDesktop.Fresh 2012.1 +Release: 2012.1 +Codename: belka +----------/etc/lsb-release---------- +LSB_VERSION= +DISTRIB_ID=RosaDesktop.Fresh +DISTRIB_RELEASE=2012.1 +DISTRIB_CODENAME=belka +DISTRIB_DESCRIPTION="ROSA RosaDesktop.Fresh 2012.1" +----------/etc/version---------- +2012.1.0 20 rosa +----------/etc/release---------- +ROSA Desktop Fresh R2 release 2012.1 for x86_64 +----------/etc/mandrake-release---------- +ROSA Desktop Fresh R2 release 2012.1 for x86_64 +----------/etc/mandrakelinux-release---------- +ROSA Desktop Fresh R2 release 2012.1 for x86_64 +----------/etc/mandriva-release---------- +ROSA Desktop Fresh R2 release 2012.1 for x86_64 +----------/etc/redhat-release---------- +ROSA Desktop Fresh R2 release 2012.1 for x86_64 +----------/etc/os-release---------- +NAME="ROSA Desktop Fresh" +VERSION="EE 2012.1 Desktop" +ID=rosa +VERSION_ID=2012.1 +PRETTY_NAME="ROSA Desktop Fresh EE 2012.1 Desktop" +ANSI_COLOR="1;43" +CPE_NAME="cpe:/o:rosa:rosalinux:2012.1" +HOME_URL="http://www.rosalinux.com/" +BUG_REPORT_URL="https://bugs.rosalinux.com/" diff --git a/sources/sample/distrotest/ROSA/6.5-Server.txt b/sources/sample/distrotest/ROSA/6.5-Server.txt new file mode 100644 index 0000000..23f1c93 --- /dev/null +++ b/sources/sample/distrotest/ROSA/6.5-Server.txt @@ -0,0 +1,14 @@ +----------lsb_release -a---------- +LSB Version: :base-4.0-amd64:base-4.0-noarch:core-4.0-amd64:core-4.0-noarch:graphics-4.0-amd64:graphics-4.0-noarch:printing-4.0-amd64:printing-4.0-noarch +Distributor ID: ROSAEnterpriseServer +Description: ROSA Enterprise Linux Server release 6.5 (Helium) +Release: 6.5 +Codename: Helium +----------/etc/lsb-release---------- +LSB_VERSION=base-4.0-amd64:base-4.0-noarch:core-4.0-amd64:core-4.0-noarch:graphics-4.0-amd64:graphics-4.0-noarch:printing-4.0-amd64:printing-4.0-noarch +----------/etc/redhat-release---------- +ROSA Enterprise Linux Server release 6.5 (Helium) +----------/etc/rosa-release---------- +ROSA Enterprise Linux Server release 6.5 (Helium) +----------/etc/system-release---------- +ROSA Enterprise Linux Server release 6.5 (Helium) diff --git a/sources/sample/distrotest/Raspbian/7.txt b/sources/sample/distrotest/Raspbian/7.txt new file mode 100644 index 0000000..8233aa4 --- /dev/null +++ b/sources/sample/distrotest/Raspbian/7.txt @@ -0,0 +1,13 @@ +----------/etc/os-release---------- +PRETTY_NAME="Raspbian GNU/Linux 7 (wheezy)" +NAME="Raspbian GNU/Linux" +VERSION_ID="7" +VERSION="7 (wheezy)" +ID=raspbian +ID_LIKE=debian +ANSI_COLOR="1;31" +HOME_URL="http://www.raspbian.org/" +SUPPORT_URL="http://www.raspbian.org/RaspbianForums" +BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs" +----------/etc/debian_version---------- +7.1 diff --git a/sources/sample/distrotest/Raspbian/8.0.txt b/sources/sample/distrotest/Raspbian/8.0.txt new file mode 100644 index 0000000..ac46f9e --- /dev/null +++ b/sources/sample/distrotest/Raspbian/8.0.txt @@ -0,0 +1,17 @@ +----------lsb_release -a---------- +Distributor ID: Raspbian +Description: Raspbian GNU/Linux 8.0 (jessie) +Release: 8.0 +Codename: jessie +----------/etc/os-release---------- +PRETTY_NAME="Raspbian GNU/Linux 8 (jessie)" +NAME="Raspbian GNU/Linux" +VERSION_ID="8" +VERSION="8 (jessie)" +ID=raspbian +ID_LIKE=debian +HOME_URL="http://www.raspbian.org/" +SUPPORT_URL="http://www.raspbian.org/RaspbianForums" +BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs" +----------/etc/debian_version---------- +8.0 diff --git a/sources/sample/distrotest/RedFlag/8.0.txt b/sources/sample/distrotest/RedFlag/8.0.txt new file mode 100644 index 0000000..8f3307b --- /dev/null +++ b/sources/sample/distrotest/RedFlag/8.0.txt @@ -0,0 +1,23 @@ +----------lsb_release -a---------- +LSB Version: 4.1 +Distributor ID: Red Flag inWise +Description: Red Flag Linux +Release: v8.0 +Codename: zhurong +----------/etc/lsb-release---------- +LSB_VERSION=4.1 +DISTRIB_ID="Red Flag inWise" +DISTRIB_RELEASE=v8.0 +DISTRIB_DESCRIPTION="Red Flag Linux" +DISTRIB_CODENAME=zhurong +----------/etc/os-release---------- +NAME="Red Flag inWise" +ID=redflag +PRETTY_NAME="Red Flag inWise" +ANSI_COLOR="0;36" +HOME_URL="http://www.redflag-linux.com/" +SUPPORT_URL="http://www.redflag-linux.com/" +----------/etc/redflag-release---------- +Red Flag inWise V8.0 (zhurong) +----------/etc/system-release---------- +Red Flag inWise V8.0 (zhurong) v8.0-13.04.01.1305 diff --git a/sources/sample/distrotest/RedHat/6.0.txt b/sources/sample/distrotest/RedHat/6.0.txt new file mode 100644 index 0000000..b01f6ab --- /dev/null +++ b/sources/sample/distrotest/RedHat/6.0.txt @@ -0,0 +1,10 @@ +----------lsb_release -a---------- +LSB Version: :core-4.0-ia32:core-4.0-noarch:graphics-4.0-ia32:graphics-4.0-noarch:printing-4.0-ia32:printing-4.0-noarch +Distributor ID: RedHatEnterpriseServer +Description: Red Hat Enterprise Linux Server release 6.0 (Santiago) +Release: 6.0 +Codename: Santiago +----------/etc/redhat-release---------- +Red Hat Enterprise Linux Server release 6.0 (Santiago) +----------/etc/system-release---------- +Red Hat Enterprise Linux Server release 6.0 (Santiago) diff --git a/sources/sample/distrotest/RedHat/7.0-Beta.txt b/sources/sample/distrotest/RedHat/7.0-Beta.txt new file mode 100644 index 0000000..176982c --- /dev/null +++ b/sources/sample/distrotest/RedHat/7.0-Beta.txt @@ -0,0 +1,17 @@ +----------/etc/os-release---------- +NAME="Red Hat Enterprise Linux Everything" +VERSION="7.0 (Maipo)" +ID="rhel" +VERSION_ID="7.0" +PRETTY_NAME="Red Hat Enterprise Linux Everything 7.0 (Maipo)" +ANSI_COLOR="0;31" +CPE_NAME="cpe:/o:redhat:enterprise_linux:7.0:beta:everything" + +REDHAT_BUGZILLA_PRODUCT="Red Hat Enterprise Linux 7" +REDHAT_BUGZILLA_PRODUCT_VERSION=7.0 +REDHAT_SUPPORT_PRODUCT="Red Hat Enterprise Linux" +REDHAT_SUPPORT_PRODUCT_VERSION=7.0 +----------/etc/redhat-release---------- +Red Hat Enterprise Linux Everything release 7.0 Beta (Maipo) +----------/etc/system-release---------- +Red Hat Enterprise Linux Everything release 7.0 Beta (Maipo) diff --git a/sources/sample/distrotest/SMEServer/8.1beta3.txt b/sources/sample/distrotest/SMEServer/8.1beta3.txt new file mode 100644 index 0000000..405ec83 --- /dev/null +++ b/sources/sample/distrotest/SMEServer/8.1beta3.txt @@ -0,0 +1,11 @@ +----------lsb_release -a---------- +LSB Version: :core-4.0-amd64:core-4.0-ia32:core-4.0-noarch:graphics-4.0-amd64:graphics-4.0-ia32:graphics-4.0-noarch:printing-4.0-amd64:printing-4.0-ia32:printing-4.0-noarch +Distributor ID: SMEServer +Description: SME Server release 8.1beta3 +Release: 8.1beta3 +Codename: n/a +----------/etc/e-smith-release---------- +SME Server release 8.1beta3 +----------/etc/redhat-release---------- +SME Server release 8.1beta3 + diff --git a/sources/sample/distrotest/SMEServer/9.0beta3.txt b/sources/sample/distrotest/SMEServer/9.0beta3.txt new file mode 100644 index 0000000..2e56c06 --- /dev/null +++ b/sources/sample/distrotest/SMEServer/9.0beta3.txt @@ -0,0 +1,8 @@ +----------/etc/centos-release---------- +CentOS release 6.5 (Final) +----------/etc/e-smith-release---------- +SME Server release 9.0beta3 +----------/etc/redhat-release---------- +SME Server release 9.0beta3 +----------/etc/system-release---------- +SME Server release 9.0beta3 diff --git a/sources/sample/distrotest/SMS/2.0.5.txt b/sources/sample/distrotest/SMS/2.0.5.txt new file mode 100644 index 0000000..5fe2381 --- /dev/null +++ b/sources/sample/distrotest/SMS/2.0.5.txt @@ -0,0 +1,15 @@ +----------/etc/os-release---------- +NAME=SMS +VERSION="2.0.5" +ID=sms +VERSION_ID=2.0.5 +PRETTY_NAME="Superb! Mini Server 2.0" +ANSI_COLOR="0;34" +CPE_NAME="cpe:/o:superb_mini_server:sms:2.0" +HOME_URL="http://sms.it-ccs.com/" +SUPPORT_URL="http://sms.it-ccs.com/forum/" +BUG_REPORT_URL="http://sms.it-ccs.com/forum/" +----------/etc/slackware-version---------- +Slackware 14.0 +----------/etc/sms-version---------- +SMS64 2.0.5 diff --git a/sources/sample/distrotest/Sabayon/14.01.txt b/sources/sample/distrotest/Sabayon/14.01.txt new file mode 100644 index 0000000..7aa9b9d --- /dev/null +++ b/sources/sample/distrotest/Sabayon/14.01.txt @@ -0,0 +1,22 @@ +----------lsb_release -a---------- +LSB Version: n/a +Distributor ID: Sabayon +Description: Sabayon Linux amd64 14.01 +Release: n/a +Codename: n/a +----------/etc/gentoo-release---------- +Gentoo Base System release 2.2 +----------/etc/lsb-release---------- +DISTRIB_ID="Sabayon" +----------/etc/os-release---------- +NAME=Sabayon +ID=sabayon +PRETTY_NAME="Sabayon/Linux" +ANSI_COLOR="1;32" +HOME_URL="http://www.sabayon.org/" +SUPPORT_URL="http://forum.sabayon.org/" +BUG_REPORT_URL="https://bugs.sabayon.org/" +----------/etc/sabayon-release---------- +Sabayon Linux amd64 14.01 +----------/etc/system-release---------- +Sabayon Linux amd64 14.01 diff --git a/sources/sample/distrotest/Salix/14.0.txt b/sources/sample/distrotest/Salix/14.0.txt new file mode 100644 index 0000000..e24653a --- /dev/null +++ b/sources/sample/distrotest/Salix/14.0.txt @@ -0,0 +1,15 @@ +----------/etc/os-release---------- +NAME=Slackware +VERSION="14.0" +ID=slackware +VERSION_ID=14.0 +PRETTY_NAME="Slackware 14.0" +ANSI_COLOR="0;34" +CPE_NAME="cpe:/o:slackware:slackware_linux:14.0" +HOME_URL="http://slackware.com/" +SUPPORT_URL="http://www.linuxquestions.org/questions/slackware-14/" +BUG_REPORT_URL="http://www.linuxquestions.org/questions/slackware-14/" +----------/etc/slackware-version---------- +Slackware 14.0 +----------/etc/salix-update-notifier.conf---------- +interval=2h diff --git a/sources/sample/distrotest/Scientific/6.3-lsb.txt b/sources/sample/distrotest/Scientific/6.3-lsb.txt new file mode 100644 index 0000000..d7dec37 --- /dev/null +++ b/sources/sample/distrotest/Scientific/6.3-lsb.txt @@ -0,0 +1,10 @@ +----------lsb_release -a---------- +LSB Version: :core-4.0-amd64:core-4.0-noarch:graphics-4.0-amd64:graphics-4.0-noarch:printing-4.0-amd64:printing-4.0-noarch +Distributor ID: Scientific +Description: Scientific Linux release 6.3 (Carbon) +Release: 6.3 +Codename: Carbon +----------/etc/redhat-release---------- +Scientific Linux release 6.3 (Carbon) +----------/etc/system-release---------- +Scientific Linux release 6.3 (Carbon) diff --git a/sources/sample/distrotest/Scientific/6.3.txt b/sources/sample/distrotest/Scientific/6.3.txt new file mode 100644 index 0000000..ba0e5a8 --- /dev/null +++ b/sources/sample/distrotest/Scientific/6.3.txt @@ -0,0 +1,4 @@ +----------/etc/redhat-release---------- +Scientific Linux release 6.3 (Carbon) +----------/etc/system-release---------- +Scientific Linux release 6.3 (Carbon) diff --git a/sources/sample/distrotest/Scientific/6.4.txt b/sources/sample/distrotest/Scientific/6.4.txt new file mode 100644 index 0000000..61a70d8 --- /dev/null +++ b/sources/sample/distrotest/Scientific/6.4.txt @@ -0,0 +1,12 @@ +----------lsb_release -a---------- +LSB Version: :base-4.0-amd64:base-4.0-noarch:core-4.0-amd64:core-4.0-noarch:graphics-4.0-amd64:graphics-4.0-noarch:printing-4.0-amd64:printing-4.0-noarch +Distributor ID: ScientificFermi +Description: Scientific Linux Fermi release 6.4 (Ramsey) +Release: 6.4 +Codename: Ramsey +----------/etc/lsb-release---------- +LSB_VERSION=base-4.0-amd64:base-4.0-noarch:core-4.0-amd64:core-4.0-noarch:graphics-4.0-amd64:graphics-4.0-noarch:printing-4.0-amd64:printing-4.0-noarch +----------/etc/redhat-release---------- +Scientific Linux Fermi release 6.4 (Ramsey) +----------/etc/system-release---------- +Scientific Linux Fermi release 6.4 (Ramsey) diff --git a/sources/sample/distrotest/Semplice/6.txt b/sources/sample/distrotest/Semplice/6.txt new file mode 100644 index 0000000..ab04bbf --- /dev/null +++ b/sources/sample/distrotest/Semplice/6.txt @@ -0,0 +1,22 @@ +----------lsb_release -a---------- +Distributor ID: Semplice +Description: Semplice 6 +Release: 6 +Codename: heaven +----------/etc/lsb-release---------- +DISTRIB_ID=Semplice +DISTRIB_RELEASE=6 +DISTRIB_CODENAME=heaven +DISTRIB_DESCRIPTION="Semplice 6" +----------/etc/os-release---------- +NAME=Semplice +VERSION="6" +ID=semplice +VERSION_ID=6 +PRETTY_NAME="Semplice 6 (Stairway to Heaven)" +HOME_URL="http://semplice-linux.org" +BUG_REPORT_URL="https://github.com/semplice" +----------/etc/debian_version---------- +jessie/sid +----------/etc/semplice_version---------- +6 diff --git a/sources/sample/distrotest/Slackware/14.0.txt b/sources/sample/distrotest/Slackware/14.0.txt new file mode 100644 index 0000000..08dbe6f --- /dev/null +++ b/sources/sample/distrotest/Slackware/14.0.txt @@ -0,0 +1,13 @@ +----------/etc/os-release---------- +NAME=Slackware +VERSION="14.0" +ID=slackware +VERSION_ID=14.0 +PRETTY_NAME="Slackware 14.0" +ANSI_COLOR="0;34" +CPE_NAME="cpe:/o:slackware:slackware_linux:14.0" +HOME_URL="http://slackware.com/" +SUPPORT_URL="http://www.linuxquestions.org/questions/slackware-14/" +BUG_REPORT_URL="http://www.linuxquestions.org/questions/slackware-14/" +----------/etc/slackware-version---------- +Slackware 14.0 diff --git a/sources/sample/distrotest/Slax/7.0.1.txt b/sources/sample/distrotest/Slax/7.0.1.txt new file mode 100644 index 0000000..6f0f4e2 --- /dev/null +++ b/sources/sample/distrotest/Slax/7.0.1.txt @@ -0,0 +1,15 @@ +----------/etc/os-release---------- +NAME=Slackware +VERSION="14.0" +ID=slackware +VERSION_ID=14.0 +PRETTY_NAME="Slackware 14.0" +ANSI_COLOR="0;34" +CPE_NAME="cpe:/o:slackware:slackware_linux:14.0" +HOME_URL="http://slackware.com/" +SUPPORT_URL="http://www.linuxquestions.org/questions/slackware-14/" +BUG_REPORT_URL="http://www.linuxquestions.org/questions/slackware-14/" +----------/etc/slackware-version---------- +Slackware 14.0 +----------/etc/slax-version---------- +Slax 7.0.1 32bit diff --git a/sources/sample/distrotest/SliTaz/2014.02.16-cooking.txt b/sources/sample/distrotest/SliTaz/2014.02.16-cooking.txt new file mode 100644 index 0000000..4cdc929 --- /dev/null +++ b/sources/sample/distrotest/SliTaz/2014.02.16-cooking.txt @@ -0,0 +1,2 @@ +----------/etc/slitaz-release---------- +cooking diff --git a/sources/sample/distrotest/Solus/1.0-rc1.txt b/sources/sample/distrotest/Solus/1.0-rc1.txt new file mode 100644 index 0000000..f7a1b27 --- /dev/null +++ b/sources/sample/distrotest/Solus/1.0-rc1.txt @@ -0,0 +1,26 @@ +----------lsb_release -a---------- +LSB Version: 1.4 +Distributor ID: Solus +Description: Solus Operating System +Release: 1.0 +Codename: shannon +----------/etc/lsb-release---------- +LSB_VERSION=1.4 +DISTRIB_ID=Solus +DISTRIB_DESCRIPTION="Solus Operating System" +DISTRIB_RELEASE=1.0 +DISTRIB_CODENAME=shannon +----------/etc/os-release---------- +NAME="Solus Operating System" +VERSION=1.0 +ID=solus-project +VERSION_ID=1.0 +PRETTY_NAME="Solus Operating System 1.0" +ANSI_COLOR="1;34" +HOME_URL="https://www.solus-project.com" +SUPPORT_URL="https://www.solus-project.com/forums/" +BUG_REPORT_URL="https://www.solus-project.com/project/core" +----------/etc/solus-release---------- +Solus Operating System 1.0 +----------/etc/image-version---------- +0.201544.4.0 diff --git a/sources/sample/distrotest/SolusOS/1.3.txt b/sources/sample/distrotest/SolusOS/1.3.txt new file mode 100644 index 0000000..7a53baa --- /dev/null +++ b/sources/sample/distrotest/SolusOS/1.3.txt @@ -0,0 +1,12 @@ +----------lsb_release -a---------- +Distributor ID: SolusOS +Description: SolusOS Eveline 64-bit +Release: 1.3 +Codename: Eveline +----------/etc/lsb-release---------- +DISTRIB_ID=SolusOS +DISTRIB_RELEASE=1.3 +DISTRIB_CODENAME=Eveline +DISTRIB_DESCRIPTION="SolusOS Eveline 64-bit" +----------/etc/debian_version---------- +6.0.6 diff --git a/sources/sample/distrotest/SolusOS/2-alpha7.txt b/sources/sample/distrotest/SolusOS/2-alpha7.txt new file mode 100644 index 0000000..be2a484 --- /dev/null +++ b/sources/sample/distrotest/SolusOS/2-alpha7.txt @@ -0,0 +1,24 @@ +----------lsb_release -a---------- +Distributor ID: SolusOS +Description: SolusOS 2 Alpha 7 +Release: Alpha +Codename: Two +----------/etc/lsb-release---------- +DISTRIB_ID=SolusOS +DISTRIB_RELEASE=Alpha +DISTRIB_CODENAME=Two +DISTRIB_DESCRIPTION="SolusOS 2 Alpha 7" +----------/etc/os-release---------- +PRETTY_NAME="Debian GNU/Linux 7.0 (wheezy)" +NAME="Debian GNU/Linux" +VERSION_ID="7.0" +VERSION="7.0 (wheezy)" +ID=ubuntu +ANSI_COLOR="1;31" +HOME_URL="http://www.debian.org/" +SUPPORT_URL="http://www.debian.org/support/" +BUG_REPORT_URL="http://bugs.debian.org/" +----------/etc/debian_version---------- +7.0 +----------/etc/solusos_version---------- +SolusOS 2 Alpha diff --git a/sources/sample/distrotest/SolydXK/2014.01-K.txt b/sources/sample/distrotest/SolydXK/2014.01-K.txt new file mode 100644 index 0000000..7684ff3 --- /dev/null +++ b/sources/sample/distrotest/SolydXK/2014.01-K.txt @@ -0,0 +1,33 @@ +----------lsb_release -a---------- +Distributor ID: SolydXK +Description: SolydXK +Release: 1 +Codename: testing +----------/etc/lsb-release---------- +DISTRIB_ID=SolydXK +DISTRIB_RELEASE=1 +DISTRIB_CODENAME=testing +DISTRIB_DESCRIPTION="SolydXK" +----------/etc/os-release---------- +PRETTY_NAME="Debian GNU/Linux jessie/sid" +NAME="Debian GNU/Linux" +ID=debian +ANSI_COLOR="1;31" +HOME_URL="http://www.debian.org/" +SUPPORT_URL="http://www.debian.org/support/" +BUG_REPORT_URL="http://bugs.debian.org/" +----------/etc/debian_version---------- +jessie/sid +----------/etc/solydxk/info---------- +RELEASE=1 +CODENAME=testing +EDITION=solydx64 +DESCRIPTION="SolydXK" +DESKTOP=KDE +DISTRIB_ID=SolydXK +TOOLKIT=QT +NEW_FEATURES_URL=http://www.solydxk.com +RELEASE_NOTES_URL=http://www.solydxk.com +USER_GUIDE_URL=http://www.solydxk.com +GRUB_TITLE=SolydX 64-bit + diff --git a/sources/sample/distrotest/SolydXK/2014.01-X.txt b/sources/sample/distrotest/SolydXK/2014.01-X.txt new file mode 100644 index 0000000..a77cf3d --- /dev/null +++ b/sources/sample/distrotest/SolydXK/2014.01-X.txt @@ -0,0 +1,25 @@ +----------lsb_release -a---------- +Distributor ID: SolydXK +Description: SolydXK +Release: 1 +Codename: testing +----------/etc/lsb-release---------- +DISTRIB_ID=SolydXK +DISTRIB_RELEASE=1 +DISTRIB_CODENAME=testing +DISTRIB_DESCRIPTION="SolydXK" +----------/etc/debian_version---------- +jessie/sid +----------/etc/solydxk/info---------- +RELEASE=1 +CODENAME=testing +EDITION=solydx64 +DESCRIPTION="SolydXK" +DESKTOP=Xfce +DISTRIB_ID=SolydXK +TOOLKIT=GTK +NEW_FEATURES_URL=http://www.solydxk.com +RELEASE_NOTES_URL=http://www.solydxk.com +USER_GUIDE_URL=http://www.solydxk.com +GRUB_TITLE=SolydX 64-bit + diff --git a/sources/sample/distrotest/StartOS/5.0.txt b/sources/sample/distrotest/StartOS/5.0.txt new file mode 100644 index 0000000..a9a75df --- /dev/null +++ b/sources/sample/distrotest/StartOS/5.0.txt @@ -0,0 +1,4 @@ +----------lsb_release -a---------- +StartOS release 5.0 (Braveheart) +----------/etc/startos-release---------- +StartOS release 5.0 (Braveheart) diff --git a/sources/sample/distrotest/StartOS/6.0.txt b/sources/sample/distrotest/StartOS/6.0.txt new file mode 100644 index 0000000..eb849fb --- /dev/null +++ b/sources/sample/distrotest/StartOS/6.0.txt @@ -0,0 +1,4 @@ +----------lsb_release -a---------- +StartOS release 6.0 (Dark Knight) +----------/etc/startos-release---------- +StartOS release 6.0 (Dark Knight) diff --git a/sources/sample/distrotest/SteamOS/1.0-beta.txt b/sources/sample/distrotest/SteamOS/1.0-beta.txt new file mode 100644 index 0000000..0a8e4eb --- /dev/null +++ b/sources/sample/distrotest/SteamOS/1.0-beta.txt @@ -0,0 +1,23 @@ +----------lsb_release -a---------- +Distributor ID: SteamOS +Description: SteamOS 1.0 +Release: 1.0 +Codename: alchemist +----------/etc/lsb-release---------- +DISTRIB_ID=SteamOS +DISTRIB_RELEASE=1.0 +DISTRIB_CODENAME=alchemist +DISTRIB_DESCRIPTION="SteamOS 1.0" +----------/etc/os-release---------- +PRETTY_NAME="SteamOS GNU/Linux 7 (alchemist)" +NAME="SteamOS GNU/Linux" +VERSION_ID="1" +VERSION="1 (alchemist)" +ID=steamos +ID_LIKE=debian +ANSI_COLOR="1;31" +HOME_URL="http://www.steampowered.com/" +SUPPORT_URL="http://support.steampowered.com/" +BUG_REPORT_URL="http://support.steampowered.com/" +----------/etc/debian_version---------- +7.1 diff --git a/sources/sample/distrotest/Synology/4.1-2668.txt b/sources/sample/distrotest/Synology/4.1-2668.txt new file mode 100644 index 0000000..ff07592 --- /dev/null +++ b/sources/sample/distrotest/Synology/4.1-2668.txt @@ -0,0 +1,264 @@ +----------/etc/synoinfo.conf---------- +unique="synology_bromolow_3612xs" +company_title="Synology" + +# system options +timezone="Sarajevo" +language="def" +maillang="enu" +codepage="plk" +defquota="5" +defshare="public" +defgroup="users" +defright="writeable" +eventsmtp="" +eventmail1="" +eventmail2="" +eventauth="no" +eventuser="" +eventpasscrypted="" +configured="yes" +admin_port="5000" +secure_admin_port="5001" +pswdprotect="no" +supportweb="yes" +supportphoto="yes" +support_download="yes" +supportmysql="yes" +supportquota="yes" +supportitunes="yes" +supportddns="yes" +supportfilestation="yes" +supportssl="yes" +supportssh="yes" +supportHTTPS="yes" +supportNFS="yes" +supportrsrcmon="yes" +supportmemtest="yes" +supportmount="yes" + +# service options +runsamba="yes" +runapple="yes" +runftpd="no" +ftpport="21" +syslogport="514" +ftp_trans_ext_ip="no" +ftpflowcontrol="no" +ftpmaxuploadrate="0" +ftpmaxdownloadrate="0" +ftpanonymouslogin="no" +diskcache="on" +standbytimer="20" +standby_force="yes" +enableguest="no" +usbbkp="yes" +usbcopy="no" +netbkp="yes" +runnetbkp="no" +runmysql="no" +supportmediaservice="yes" +runmediaservice="no" +supportups="yes" +ddns_update="no" +ddns_select="" +ddns_reclaim_interval_mins="3" +portmap_admin="no" +portmap_ftp="no" +portmap_http="no" +portmap_http_add="no" +portmap_netbkp="no" +portmap_netbkp_encrypt="no" +php_openbasedir_customize="no" +ss_sync_event_player="yes" +ss_cms="yes" +ss_vs="yes" +run_bonjour_printer_service="yes" +tunnel_enable="no" +printer_driver_host="http://download.synology.com/airprint/DSM4.1" + +# service limitations +maxaccounts="4096" +maxgroups="512" +maxshares="512" +maxservices="1024" +maxdisks="12" +maxprinters="2" +maxlogsize="64" +maxvhost="30" + +# UI options (limitations) +company="synology" +supplang="enu,cht,chs,krn,ger,fre,ita,spn,jpn,dan,nor,sve,nld,rus,plk,ptb,ptg,hun,trk,csy" +product="DiskStation" +manager="Synology DiskStation" +vender="Synology Inc." +mailfrom="Synology DiskStation" +updateurl="http://www.synology.com/" +win98autodisconnect="yes" + +wins="none" +AppleTalk="eth0" +default_ip="dhcp" +default_mask="" +default_gateway="" + +hostname="DiskStation" +ntpdate_period="daily" +ntpdate_server="" +ntpdate_server_backup="" +run_ntp_client="no" +run_ntp_server="no" + +sdkversion="no" +allowanonymous="yes" + +httpport="80" +defaultfs="ext4" +addport="no" +supportuart2="yes" +runafp="yes" +oplock_disabled="no" + + +# SMS options +smsserver="clickatell" +smsport="80" +smstemplate="https://api.clickatell.com/http/sendmsg?user=@@USER@@&password=@@PASS@@&api_id=3148203&to=@@PHONE@@&text=@@TEXT@@" +smssepchar="+" +smsuser="" +smspass="" +smsphone1="" +smsphone2="" +smsssl="yes" +smstest="no" +smsneedinterval="no" +smsinterval="1" + +# VS60 options +vs_version="1.1" + +# DSM auto update default server +rss_server="http://update.synology.com/autoupdate/genRSS.php" + +# Synology package update default server +package_server="http://update.synology.com/packageupdate/getpackages.php" + +# Push Service Server address +pushservice_server_1="https://sns1.synology.com:8089/api/" +pushservice_server_2="https://sns2.synology.com:8089/api/" + +# Redirect Server address +redirect_server="https://gofile.me/" + +package_update_channel="stable" + +upnpmodelurl="" +upnpmodelname="DS3612xs" +upnpmanufacturerurl="http://www.synology.com/" +runupnp="no" +upnpfriendlyname="DiskStation Device" +upnpdevicetype="DiskStation" +upnpmodeldescription="DiskStation UPnP Device" +esataportcfg="0xff000" +support_wireless="yes" +support_synopkg="yes" +disk_warning_percent="0.01" +vpn_conn_max="20" +eth3_mtu="1500" +eth0_wol_options="d" +supportldap="yes" +supportfileindex="yes" +support_timebkp_server="yes" +support_transcode_mp3="yes" +supportsmart="yes" +supportphotopersonal="yes" +s2s_task_max="16" +supportext4="yes" +support_iscsi_target="yes" +synobios="bromolow" +supportMFP="yes" +eth5_mtu="1500" +pgsql_sys_max_connections="100" +eth2_wol_options="d" +sysctl_kernel.sem="250 32000 32 256" +supportntfswrite="yes" +audio_support_eq="yes" +support_syno_hybrid_raid="yes" +max_volumes="1024" +eth0_mtu="1500" +supportSATA="yes" +supportsystemperature="yes" +eth7_mtu="1500" +timebkp_max_task="16" +supportrcpower="yes" +support_wol="yes" +support_ha="yes" +support_vaai="yes" +support_wimax="yes" +supportsystempwarning="yes" +use_reserved_more_gdt="yes" +eth2_mtu="1500" +supportMTU="yes" +surveillance_camera_max="50" +supportsurveillance="yes" +s2s_watches_max="1024000" +sfmaxworkercount="128" +supportraidcross="yes" +supportVLAN="yes" +support_iscsi_lunbkp="yes" +enableRCPower="no" +support_share_encryption="yes" +usbportcfg="0xf00000" +support_webinstall="yes" +support_s2s="yes" +maxlanport="8" +supportdomain="yes" +supportvideostation="yes" +mfp_manualtimer="300" +eth4_mtu="1500" +supportbootinst="yes" +eth1_wol_options="d" +support_synoacl="yes" +eunitseq="sdm,sdq" +max_iscsitrgs="64" +max_iscsiluns="512" +supportTc="yes" +supportstartupd="yes" +buzzeroffcfg="0x00" +supportsnapshot="yes" +supportdcacheui="yes" +support_iscsi_target_block="yes" +mfp_autotimer="60" +support_auto_poweron="yes" +eth6_mtu="1500" +eth3_wol_options="d" +internalportcfg="0xfff" +max_lunbkp_srv="16" +wol_enabled_options="g" +buzzeroffen="0x1f" +support_fan_adjust_dual_mode="yes" +eth1_mtu="1500" +support_mtd_serial="yes" +sfmaxusercount="16" +php_cache_size="64" +support_audio="yes" +supportraid="yes" +iscsi_target_type="lio" + +# Fixed items +eventtest="off" +codepage_apple="1850" +usb_standbytimer="0" +runweb="no" +runphoto="no" +runaudiostation="no" +runsurveillance="no" +runpgsql="yes" +runssh="yes" +----------/etc/VERSION---------- +majorversion="4" +minorversion="1" +buildphase="0" +buildnumber="2668" +builddate="2012/12/11" diff --git a/sources/sample/distrotest/Tails/0.22.1.txt b/sources/sample/distrotest/Tails/0.22.1.txt new file mode 100644 index 0000000..b4f7b5d --- /dev/null +++ b/sources/sample/distrotest/Tails/0.22.1.txt @@ -0,0 +1,5 @@ +----------/etc/os-release---------- +TAILS_PRODUCT_NAME="Tails" +TAILS_VERSION_ID="0.22.1" +----------/etc/debian_version---------- +6.0.8 diff --git a/sources/sample/distrotest/Tanglu/2.0-beta2.txt b/sources/sample/distrotest/Tanglu/2.0-beta2.txt new file mode 100644 index 0000000..e045e76 --- /dev/null +++ b/sources/sample/distrotest/Tanglu/2.0-beta2.txt @@ -0,0 +1,20 @@ +----------lsb_release -a---------- +Distributor ID: Tanglu +Description: Tanglu GNU/Linux 2 (Bartholomea Annulata) +Release: 2 +Codename: bartholomea +----------/etc/lsb-release---------- +DISTRIB_ID=Tanglu +DISTRIB_RELEASE=2 +DISTRIB_CODENAME=bartholomea +DISTRIB_DESCRIPTION="Tanglu GNU/Linux 2 (Bartholomea Annulata)" +----------/etc/os-release---------- +PRETTY_NAME="Tanglu GNU/Linux 2 (Bartholomea Annulata)" +NAME="Tanglu GNU/Linux" +VERSION_ID="2" +VERSION="2 (bartholomea)" +ID=tanglu +HOME_URL="http://www.tanglu.org/" +BUG_REPORT_URL="http://bugs.tanglu.org/" +----------/etc/debian_version---------- +7.5 diff --git a/sources/sample/distrotest/TinyCore/5.0.alpha4.txt b/sources/sample/distrotest/TinyCore/5.0.alpha4.txt new file mode 100644 index 0000000..3aabce3 --- /dev/null +++ b/sources/sample/distrotest/TinyCore/5.0.alpha4.txt @@ -0,0 +1,2 @@ +----------/usr/share/doc/tc/release.txt---------- +5.0.alpha4 diff --git a/sources/sample/distrotest/Tizen/2.2.0-Magnolia.txt b/sources/sample/distrotest/Tizen/2.2.0-Magnolia.txt new file mode 100644 index 0000000..74d52f0 --- /dev/null +++ b/sources/sample/distrotest/Tizen/2.2.0-Magnolia.txt @@ -0,0 +1,10 @@ +----------/etc/os-release---------- +NAME="Tizen" +VERSION="2.2.0, Magnolia" +ID=tizen +PRETTY_NAME="Tizen Magnolia (2.2.0)" +VERSION_ID="2.2.0" +----------/etc/system-release---------- +Tizen release 2.2.0 (Magnolia) +----------/etc/tizen-release----------- +Tizen release 2.2.0 (Magnolia) diff --git a/sources/sample/distrotest/Tizen/2.2.0-Tizen.txt b/sources/sample/distrotest/Tizen/2.2.0-Tizen.txt new file mode 100644 index 0000000..1754686 --- /dev/null +++ b/sources/sample/distrotest/Tizen/2.2.0-Tizen.txt @@ -0,0 +1,10 @@ +----------/etc/os-release---------- +NAME="Tizen" +VERSION="2.2.0, (Tizen)" +ID=tizen +PRETTY_NAME="Tizen 2.2.0 (Tizen)" +VERSION_ID="2.2.0" +----------/etc/system-release---------- +Tizen release 2.2.0 (Tizen) +----------/etc/tizen-release----------- +Tizen release 2.2.0 (Tizen) diff --git a/sources/sample/distrotest/Trisquel/6.0.txt b/sources/sample/distrotest/Trisquel/6.0.txt new file mode 100644 index 0000000..7655c6e --- /dev/null +++ b/sources/sample/distrotest/Trisquel/6.0.txt @@ -0,0 +1,19 @@ +----------lsb_release -a---------- +Distributor ID: Trisquel +Description: Trisquel 6.0 +Release: 6.0 +Codename: toutatis +----------/etc/lsb-release---------- +DISTRIB_ID=Trisquel +DISTRIB_RELEASE=6.0 +DISTRIB_CODENAME=toutatis +DISTRIB_DESCRIPTION="Trisquel 6.0" +----------/etc/os-release---------- +NAME="Ubuntu" +VERSION="12.04.1 LTS, Precise Pangolin" +ID=ubuntu +ID_LIKE=debian +PRETTY_NAME="Ubuntu precise (12.04.1 LTS)" +VERSION_ID="12.04" +----------/etc/debian_version---------- +wheezy/sid diff --git a/sources/sample/distrotest/Turbo/12.5.txt b/sources/sample/distrotest/Turbo/12.5.txt new file mode 100644 index 0000000..08da4c6 --- /dev/null +++ b/sources/sample/distrotest/Turbo/12.5.txt @@ -0,0 +1,2 @@ +----------/etc/turbolinux-release---------- +Turbolinux Client 12.5 (Magny-cours2) diff --git a/sources/sample/distrotest/Ubuntu/10.04.txt b/sources/sample/distrotest/Ubuntu/10.04.txt new file mode 100644 index 0000000..86d3bde --- /dev/null +++ b/sources/sample/distrotest/Ubuntu/10.04.txt @@ -0,0 +1,7 @@ +----------/etc/lsb-release---------- +DISTRIB_ID=Ubuntu +DISTRIB_RELEASE=10.04 +DISTRIB_CODENAME=lucid +DISTRIB_DESCRIPTION="Ubuntu 10.04.3 LTS" +----------/etc/debian_version---------- +squeeze/sid diff --git a/sources/sample/distrotest/Ubuntu/12.04.txt b/sources/sample/distrotest/Ubuntu/12.04.txt new file mode 100644 index 0000000..c9fbceb --- /dev/null +++ b/sources/sample/distrotest/Ubuntu/12.04.txt @@ -0,0 +1,19 @@ +----------lsb_release -a---------- +Distributor ID: Ubuntu +Description: Ubuntu 12.04.3 LTS +Release: 12.04 +Codename: precise +----------/etc/lsb-release---------- +DISTRIB_ID=Ubuntu +DISTRIB_RELEASE=12.04 +DISTRIB_CODENAME=precise +DISTRIB_DESCRIPTION="Ubuntu 12.04.3 LTS" +----------/etc/os-release---------- +NAME="Ubuntu" +VERSION="12.04.3 LTS, Precise Pangolin" +ID=ubuntu +ID_LIKE=debian +PRETTY_NAME="Ubuntu precise (12.04.3 LTS)" +VERSION_ID="12.04" +----------/etc/debian_version---------- +wheezy/sid diff --git a/sources/sample/distrotest/Ubuntu/13.10.txt b/sources/sample/distrotest/Ubuntu/13.10.txt new file mode 100644 index 0000000..f95f541 --- /dev/null +++ b/sources/sample/distrotest/Ubuntu/13.10.txt @@ -0,0 +1,22 @@ +----------lsb_release -a---------- +Distributor ID: Ubuntu +Description: Ubuntu 13.10 +Release: 13.10 +Codename: saucy +----------/etc/lsb-release---------- +DISTRIB_ID=Ubuntu +DISTRIB_RELEASE=13.10 +DISTRIB_CODENAME=saucy +DISTRIB_DESCRIPTION="Ubuntu 13.10" +----------/etc/os-release---------- +NAME="Ubuntu" +VERSION="13.10, Saucy Salamander" +ID=ubuntu +ID_LIKE=debian +PRETTY_NAME="Ubuntu 13.10" +VERSION_ID="13.10" +HOME_URL="http://www.ubuntu.com/" +SUPPORT_URL="http://help.ubuntu.com/" +BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/" +----------/etc/debian_version---------- +wheezy/sid diff --git a/sources/sample/distrotest/UltimateEdition/3.9.txt b/sources/sample/distrotest/UltimateEdition/3.9.txt new file mode 100644 index 0000000..0b3aa57 --- /dev/null +++ b/sources/sample/distrotest/UltimateEdition/3.9.txt @@ -0,0 +1,19 @@ +----------lsb_release -a---------- +Distributor ID: Ultimate_Edition +Description: Ultimate Edition 3.9 +Release: 3.9 +Codename: raring +----------/etc/lsb-release---------- +DISTRIB_ID=Ultimate_Edition +DISTRIB_RELEASE=3.9 +DISTRIB_CODENAME=raring +DISTRIB_DESCRIPTION="Ultimate Edition 3.9" +----------/etc/os-release---------- +NAME="Ultimate_Edition" +VERSION=ultimate-edition-3.9-x64, "raring" +ID=ultimate +ID_LIKE=debian +PRETTY_NAME="Ultimate_Edition (ultimate-edition-3.9-x64)" +VERSION_ID=ultimate-edition-3.9-x64 +----------/etc/debian_version---------- +wheezy/sid diff --git a/sources/sample/distrotest/Vector/647.0.txt b/sources/sample/distrotest/Vector/647.0.txt new file mode 100644 index 0000000..e38c812 --- /dev/null +++ b/sources/sample/distrotest/Vector/647.0.txt @@ -0,0 +1,4 @@ +----------/etc/slackware-version---------- +Slackware 13.37.0 +----------/etc/vector-version---------- +Vlocity Linux 647.0 STD FINAL built on JUL-12-2012 diff --git a/sources/sample/distrotest/VortexBox/2.2.txt b/sources/sample/distrotest/VortexBox/2.2.txt new file mode 100644 index 0000000..14ea7ef --- /dev/null +++ b/sources/sample/distrotest/VortexBox/2.2.txt @@ -0,0 +1,8 @@ +----------/etc/fedora-release---------- +Fedora release 16 (Verne) +----------/etc/redhat-release---------- +Fedora release 16 (Verne) +----------/etc/system-release---------- +Fedora release 16 (Verne) +----------/etc/vortexbox/vortexbox-version---------- +2.2 diff --git a/sources/sample/distrotest/VortexBox/2.3-beta.txt b/sources/sample/distrotest/VortexBox/2.3-beta.txt new file mode 100644 index 0000000..fa1aa20 --- /dev/null +++ b/sources/sample/distrotest/VortexBox/2.3-beta.txt @@ -0,0 +1,22 @@ +----------/etc/fedora-release---------- +Fedora release 20 (Heisenbug) +----------/etc/os-release---------- +NAME=Fedora +VERSION="20 (Heisenbug)" +ID=fedora +VERSION_ID=20 +PRETTY_NAME="Fedora 20 (Heisenbug)" +ANSI_COLOR="0;34" +CPE_NAME="cpe:/o:fedoraproject:fedora:20" +HOME_URL="https://fedoraproject.org/" +BUG_REPORT_URL="https://bugzilla.redhat.com/" +REDHAT_BUGZILLA_PRODUCT="Fedora" +REDHAT_BUGZILLA_PRODUCT_VERSION=20 +REDHAT_SUPPORT_PRODUCT="Fedora" +REDHAT_SUPPORT_PRODUCT_VERSION=20 +----------/etc/redhat-release---------- +Fedora release 20 (Heisenbug) +----------/etc/system-release---------- +Fedora release 20 (Heisenbug) +----------/etc/vortexbox/vortexbox-version---------- +2.3 diff --git a/sources/sample/distrotest/Zenwalk/7.4.txt b/sources/sample/distrotest/Zenwalk/7.4.txt new file mode 100644 index 0000000..122380d --- /dev/null +++ b/sources/sample/distrotest/Zenwalk/7.4.txt @@ -0,0 +1,11 @@ +----------/etc/os-release---------- +NAME=Zenwalk +VERSION="7.4" +ID=Zenwalk +VERSION_ID="7.4" +PRETTY_NAME="Zenwalk 7.4" +HOME_URL="http://www.zenwalk.org/" +----------/etc/slackware-version---------- +7.4 +----------/etc/zenwalk-version---------- +7.4 diff --git a/sources/sample/distrotest/Zorin/6.txt b/sources/sample/distrotest/Zorin/6.txt new file mode 100644 index 0000000..559e4f4 --- /dev/null +++ b/sources/sample/distrotest/Zorin/6.txt @@ -0,0 +1,19 @@ +----------lsb_release -a---------- +Distributor ID: Zorin +Description: Zorin OS 6 +Release: 6 +Codename: precise +----------/etc/lsb-release---------- +DISTRIB_ID=Zorin +DISTRIB_RELEASE=6 +DISTRIB_CODENAME=precise +DISTRIB_DESCRIPTION="Zorin OS 6" +----------/etc/os-release---------- +NAME="Ubuntu" +VERSION="12.04.1 LTS, Precise Pangolin" +ID=ubuntu +ID_LIKE=debian +PRETTY_NAME="Ubuntu precise (12.04.1 LTS)" +VERSION_ID="12.04" +----------/etc/debian_version---------- +wheezy/sid diff --git a/sources/sample/distrotest/Zorin/7.txt b/sources/sample/distrotest/Zorin/7.txt new file mode 100644 index 0000000..65145f2 --- /dev/null +++ b/sources/sample/distrotest/Zorin/7.txt @@ -0,0 +1,22 @@ +----------lsb_release -a---------- +Distributor ID: Zorin +Description: Zorin OS 7 +Release: 7 +Codename: raring +----------/etc/lsb-release---------- +DISTRIB_ID=Zorin +DISTRIB_RELEASE=7 +DISTRIB_CODENAME=raring +DISTRIB_DESCRIPTION="Zorin OS 7" +----------/etc/os-release---------- +NAME="Ubuntu" +VERSION="13.04, Raring Ringtail" +ID=ubuntu +ID_LIKE=debian +PRETTY_NAME="Ubuntu 13.04" +VERSION_ID="13.04" +HOME_URL="http://www.ubuntu.com/" +SUPPORT_URL="http://help.ubuntu.com/" +BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/" +----------/etc/debian_version---------- +wheezy/sid diff --git a/sources/sample/distrotest/Zorin/8.txt b/sources/sample/distrotest/Zorin/8.txt new file mode 100644 index 0000000..1a515ac --- /dev/null +++ b/sources/sample/distrotest/Zorin/8.txt @@ -0,0 +1,22 @@ +----------lsb_release -a---------- +Distributor ID: Zorin +Description: Zorin OS 8 +Release: 8 +Codename: saucy +----------/etc/lsb-release---------- +DISTRIB_ID=Zorin +DISTRIB_RELEASE=8 +DISTRIB_CODENAME=saucy +DISTRIB_DESCRIPTION="Zorin OS 8" +----------/etc/os-release---------- +NAME="Zorin OS" +VERSION="8" +ID=Zorin OS +ID_LIKE=ubuntu +PRETTY_NAME="Zorin OS 8" +VERSION_ID="8" +HOME_URL="http://www.zorin-os.com/" +SUPPORT_URL="http://www.zorin-os.com/help/" +BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/" +----------/etc/debian_version---------- +wheezy/sid diff --git a/sources/sample/distrotest/antiX/2012.07.06.txt b/sources/sample/distrotest/antiX/2012.07.06.txt new file mode 100644 index 0000000..35e9a64 --- /dev/null +++ b/sources/sample/distrotest/antiX/2012.07.06.txt @@ -0,0 +1,9 @@ +----------/etc/os-release---------- +PRETTY_NAME="Debian GNU/Linux wheezy/sid" +NAME="Debian GNU/Linux" +ID=debian +ANSI_COLOR="1;31" +----------/etc/antix-version---------- +antiX-full Edelweißpiraten 06 August 2012 +----------/etc/debian_version---------- +wheezy/sid diff --git a/sources/sample/distrotest/elementaryOS/0.2.txt b/sources/sample/distrotest/elementaryOS/0.2.txt new file mode 100644 index 0000000..93dec32 --- /dev/null +++ b/sources/sample/distrotest/elementaryOS/0.2.txt @@ -0,0 +1,19 @@ +----------lsb_release -a---------- +Distributor ID: elementary OS +Description: elementary OS Luna +Release: 0.2 +Codename: luna +----------/etc/lsb-release---------- +DISTRIB_ID="elementary OS" +DISTRIB_RELEASE=0.2 +DISTRIB_CODENAME=luna +DISTRIB_DESCRIPTION="elementary OS Luna" +----------/etc/os-release---------- +NAME="elementary OS" +VERSION="0.2 Luna" +ID=elementary OS +ID_LIKE=ubuntu +PRETTY_NAME="elementary OS Luna" +VERSION_ID="0.2" +----------/etc/debian_version---------- +wheezy/sid diff --git a/sources/sample/distrotest/gNewSense/3.0.txt b/sources/sample/distrotest/gNewSense/3.0.txt new file mode 100644 index 0000000..d58ca78 --- /dev/null +++ b/sources/sample/distrotest/gNewSense/3.0.txt @@ -0,0 +1,12 @@ +----------lsb_release -a---------- +Distributor ID: gNewSense +Description: gNewSense GNU/Linux 3.0 (parkes) +Release: 3.0 +Codename: parkes +----------/etc/lsb-release---------- +DISTRIB_ID=gNewSense +DISTRIB_RELEASE=3.0 +DISTRIB_CODENAME=parkes +DISTRIB_DESCRIPTION="gNewSense GNU/Linux 3.0 (parkes)" +----------/etc/debian_version---------- +6.0.6 diff --git a/sources/sample/distrotest/openSUSE/11.3.txt b/sources/sample/distrotest/openSUSE/11.3.txt new file mode 100644 index 0000000..c091c8b --- /dev/null +++ b/sources/sample/distrotest/openSUSE/11.3.txt @@ -0,0 +1,9 @@ +----------lsb_release -a---------- +LSB Version: n/a +Distributor ID: SUSE LINUX +Description: openSUSE 11.3 (x86_64) +Release: 11.3 +Codename: n/a +----------/etc/SuSE-release---------- +openSUSE 11.3 (x86_64) +VERSION = 11.3 diff --git a/sources/sample/distrotest/openSUSE/13.1.txt b/sources/sample/distrotest/openSUSE/13.1.txt new file mode 100644 index 0000000..37002cf --- /dev/null +++ b/sources/sample/distrotest/openSUSE/13.1.txt @@ -0,0 +1,18 @@ +----------lsb_release -a---------- +LSB Version: n/a +Distributor ID: openSUSE project +Description: openSUSE 13.1 Milestone 3 (x86_64) +Release: 13.1 +Codename: Bottle +----------/etc/SuSE-release---------- +openSUSE 13.1 Milestone 3 (x86_64) +VERSION = 13.1 +CODENAME = Bottle +----------/etc/os-release---------- +NAME=openSUSE +VERSION="13.1 Milestone 3 (Bottle)" +VERSION_ID="13.1milstone3" +PRETTY_NAME="openSUSE 13.1 Milestone 3 (Bottle) (x86_64)" +ID=opensuse +ANSI_COLOR="0;32" +CPE_NAME="cpe:/o:opensuse:opensuse:13.1" diff --git a/sources/sample/logs/log_android21.txt b/sources/sample/logs/log_android21.txt new file mode 100644 index 0000000..2c2613c --- /dev/null +++ b/sources/sample/logs/log_android21.txt @@ -0,0 +1,270 @@ +---Sat, 11 May 2013 09:44:40 +0000 GMT--- Reading: /system/build.prop +##### Merging of the /util/data/semc_kernel_time_stamp.prop file ##### +ro.build.date=Fri Dec 17 18:35:45 2010 +ro.build.date.utc=1292582145 +ro.build.user=SEMCUser +ro.build.host=SEMCHost + +##### Final patch of properties ##### +ro.build.product=E15i +ro.build.description=E15i-user 2.1-update1 2.1.1.A.0.16 238 test-keys + +ro.product.brand=SEMC +ro.product.name=E15i_1252-3596 +ro.product.device=E15i +ro.product.board=delta +ro.build.version.incremental=73_d +ro.build.tags=release-keys +ro.build.fingerprint=SEMC/E15i_1252-3596/E15i/delta:2.1-update1/2.1.1.A.0.16/73_d:user/release-keys + + + ######################## Customized property values ######################### + +ro.semc.version.cust=1252-3596 +ro.semc.version.cust_revision=R4B +ro.semc.enable.fast_dormancy=true +ro.config.ringtone=t-mobile_ringtone.ogg +ro.config.notification_sound=t-mobile_message.ogg +ro.camera.sound.forced=1 +ro.voicemail.dialing-number=+48602950000 + ######################################################################### + + +#ro.config.ringtone=sony_ericsson.ogg +#ro.config.notification_sound=notification.ogg +ro.semc.content.number=PA4 + +################# Updating of the SW Version ################# +ro.semc.version.fs_revision=2.1.1.A.0.16 +ro.build.id=2.1.1.A.0.16 +ro.build.display.id=2.1.1.A.0.16 + +##### Values from product package metadata ##### +ro.product.model=E15i +ro.semc.ms_type_id=AAD-3880091-BV +ro.semc.version.fs=ORANGE-1-8 +ro.semc.product.name=Xperia X8 +ro.semc.product.device=E15 + +# begin build properties +# autogenerated by buildinfo.sh +#ro.build.id=2.1.1.A.0.16 +#ro.build.display.id=2.1.1.A.0.16 +#ro.build.version.incremental=238 +ro.build.version.sdk=7 +ro.build.version.codename=REL +ro.build.version.release=2.1-update1 +#ro.build.date=Sun Jan 30 20:24:08 CST 2011 +#ro.build.date.utc=1296390248 +ro.build.type=user +#ro.build.user=hudsonslave +#ro.build.host=cnbjlx3512 +#ro.build.tags=test-keys +#ro.product.model=shakira +#ro.product.brand=Sony-Ericsson +#ro.product.name=shakira +#ro.product.device=shakira +#ro.product.board=delta +ro.product.cpu.abi=armeabi +ro.product.manufacturer=Sony Ericsson +ro.product.locale.language=en +ro.product.locale.region=GB +ro.wifi.channels= +ro.board.platform=msm7k +# ro.build.product is obsolete; use ro.product.device +#ro.build.product=shakira +# Do not try to parse ro.build.description or .fingerprint +#ro.build.description=shakira-user 2.1-update1 2.1.1.A.0.16 238 test-keys +#ro.build.fingerprint=Sony-Ericsson/shakira/shakira/delta:2.1-update1/2.1.1.A.0.16/238:user/test-keys +# end build properties +# +# system.prop for shakira +# + +rild.libpath=/system/lib/libril-qc-1.so +rild.libargs=-d /dev/smd0 +wifi.interface = wlan0 +ro.sf.lcd_density=160 +ro.semc.def_screen_orientation=sensor +ro.semc.timescape_keys=X8_key +ro.semc.timescape_model=1_handed +ro.semc.sound_effects_enabled=false +ro.workaround.noautofocus=1 +persist.rild.nitz_plmn= +persist.rild.nitz_long_ons_0= +persist.rild.nitz_long_ons_1= +persist.rild.nitz_long_ons_2= +persist.rild.nitz_long_ons_3= +persist.rild.nitz_short_ons_0= +persist.rild.nitz_short_ons_1= +persist.rild.nitz_short_ons_2= +persist.rild.nitz_short_ons_3= +persist.ro.ril.sms_sync_sending=1 +DEVICE_PROVISIONED=1 +# Constant values for Battery test in Service menu. +ro.semc.batt.capacity=950 +ro.semc.batt.test.consumption=150 +ro.semc.batt.test.z_threshold=30 +dalvik.vm.heapsize=24m +kernel.log=default +ro.telephony.call_ring.multiple=false +debug.sf.hw=1 +keyguard.no_require_sim=true + +# +# ADDITIONAL_BUILD_PROPERTIES +# +#ro.config.notification_sound=OnTheHunt.ogg +ro.config.alarm_alert=Alarm_Classic.ogg +ro.setupwizard.mode=DISABLED +ro.com.google.gmsversion=2.1_r11 +ro.com.google.clientidbase=android-sonyericsson +net.bt.name=Android +ro.config.sync=yes +dalvik.vm.stack-trace-file=/data/anr/traces.txt +ro.drm.active.num=4 +ro.drm.active.0=semc,1 +ro.drm.active.1=cmla,0 +ro.drm.active.2=viaccess,0 +ro.drm.active.3=marlin,1 +---Sat, 11 May 2013 09:44:40 +0000 GMT--- Reading: /proc/sys/kernel/hostname +localhost +---Sat, 11 May 2013 09:44:40 +0000 GMT--- Reading: /proc/version +Linux version 2.6.29 (SEMCUser@SEMCHost) (gcc version 4.4.0 (GCC) ) #1 PREEMPT Fri Dec 17 18:35:45 2010 +---Sat, 11 May 2013 09:44:40 +0000 GMT--- Reading: /proc/uptime +2003.04 0.00 +---Sat, 11 May 2013 09:44:40 +0000 GMT--- Reading: /proc/cpuinfo +Processor : ARMv6-compatible processor rev 5 (v6l) +BogoMIPS : 599.65 +Features : swp half thumb fastmult vfp edsp java +CPU implementer : 0x41 +CPU architecture: 6TEJ +CPU variant : 0x1 +CPU part : 0xb36 +CPU revision : 5 + +Hardware : SEMC Delta +Revision : 0000 +Serial : 0000000000000000 +---Sat, 11 May 2013 09:44:40 +0000 GMT--- Reading: /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq +600000 +---Sat, 11 May 2013 09:44:40 +0000 GMT--- Reading: /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq +600000 +---Sat, 11 May 2013 09:44:40 +0000 GMT--- Reading: /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_min_freq +245760 +---Sat, 11 May 2013 09:44:40 +0000 GMT--- Reading: /proc/stat +cpu 86055 8531 23906 69411 12010 7 103 0 0 +cpu0 86055 8531 23906 69411 12010 7 103 0 0 +intr 8171919 11514 0 0 0 0 0 0 14363 501285 0 0 4 0 0 0 0 57488 0 0 18127 18154 406183 0 0 6436007 1 175242 142506 0 0 0 0 0 0 176802 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 39658 0 0 0 0 0 0 0 0 26 14 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 167624 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6856 0 0 0 0 0 0 0 0 60 0 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +ctxt 15100441 +btime 1368263477 +processes 3738 +procs_running 1 +procs_blocked 1 +---Sat, 11 May 2013 09:44:41 +0000 GMT--- Reading: /proc/stat +cpu 86101 8531 23914 69419 12048 7 103 0 0 +cpu0 86101 8531 23914 69419 12048 7 103 0 0 +intr 8172501 11517 0 0 0 0 0 0 14368 501580 0 0 4 0 0 0 0 57530 0 0 18141 18168 406207 0 0 6436007 1 175247 142510 0 0 0 0 0 0 176889 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 39660 0 0 0 0 0 0 0 0 26 14 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 167708 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6859 0 0 0 0 0 0 0 0 60 0 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +ctxt 15101320 +btime 1368263477 +processes 3738 +procs_running 1 +procs_blocked 0 +---Sat, 11 May 2013 09:44:41 +0000 GMT--- Reading: /proc/net/dev +Inter-| Receive | Transmit + face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed + lo: 2089060 2577 0 0 0 0 0 0 2089060 2577 0 0 0 0 0 0 +dummy0: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +rmnet0: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +rmnet1: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +rmnet2: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + usb0: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + sit0: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + wlan0:27900154 20327 0 0 0 0 0 0 817017 9503 0 0 0 0 0 0 +---Sat, 11 May 2013 09:44:41 +0000 GMT--- Executing: ifconfig lo 2>/dev/null +lo: ip 127.0.0.1 mask 255.0.0.0 flags [up loopback running] +---Sat, 11 May 2013 09:44:41 +0000 GMT--- Executing: ifconfig dummy0 2>/dev/null + +---Sat, 11 May 2013 09:44:41 +0000 GMT--- Executing: ifconfig rmnet0 2>/dev/null + +---Sat, 11 May 2013 09:44:41 +0000 GMT--- Executing: ifconfig rmnet1 2>/dev/null + +---Sat, 11 May 2013 09:44:41 +0000 GMT--- Executing: ifconfig rmnet2 2>/dev/null + +---Sat, 11 May 2013 09:44:41 +0000 GMT--- Executing: ifconfig usb0 2>/dev/null + +---Sat, 11 May 2013 09:44:41 +0000 GMT--- Executing: ifconfig sit0 2>/dev/null + +---Sat, 11 May 2013 09:44:42 +0000 GMT--- Executing: ifconfig wlan0 2>/dev/null +wlan0: ip 192.168.1.2 mask 255.255.255.0 flags [up broadcast running multicast] +---Sat, 11 May 2013 09:44:42 +0000 GMT--- Reading: /proc/meminfo +MemTotal: 179788 kB +MemFree: 2664 kB +Buffers: 148 kB +Cached: 26572 kB +SwapCached: 0 kB +Active: 75404 kB +Inactive: 78812 kB +Active(anon): 62080 kB +Inactive(anon): 66112 kB +Active(file): 13324 kB +Inactive(file): 12700 kB +Unevictable: 284 kB +Mlocked: 0 kB +SwapTotal: 0 kB +SwapFree: 0 kB +Dirty: 32 kB +Writeback: 0 kB +AnonPages: 127780 kB +Mapped: 24760 kB +Slab: 6744 kB +SReclaimable: 1768 kB +SUnreclaim: 4976 kB +PageTables: 7272 kB +NFS_Unstable: 0 kB +Bounce: 0 kB +WritebackTmp: 0 kB +CommitLimit: 89892 kB +Committed_AS: 2647024 kB +VmallocTotal: 696320 kB +VmallocUsed: 53040 kB +VmallocChunk: 602116 kB +---Sat, 11 May 2013 09:44:42 +0000 GMT--- Executing: df 2>/dev/null +/dev: 89892K total, 12K used, 89880K available (block size 4096) +/sqlite_stmt_journals: 4096K total, 8K used, 4088K available (block size 4096) +/system: 210944K total, 190756K used, 20188K available (block size 4096) +/data: 216832K total, 117836K used, 98996K available (block size 4096) +/cache: 51200K total, 15756K used, 35444K available (block size 4096) +/sdcard: 992860K total, 967764K used, 25096K available (block size 4096) +---Sat, 11 May 2013 09:44:42 +0000 GMT--- Executing: mount +rootfs / rootfs ro 0 0 +tmpfs /dev tmpfs rw,mode=755 0 0 +devpts /dev/pts devpts rw,mode=600 0 0 +proc /proc proc rw 0 0 +sysfs /sys sysfs rw 0 0 +tmpfs /sqlite_stmt_journals tmpfs rw,size=4096k 0 0 +/dev/block/mtdblock0 /system yaffs2 ro 0 0 +/dev/block/mtdblock2 /data yaffs2 rw,nosuid,nodev 0 0 +/dev/block/mtdblock1 /cache yaffs2 rw,nosuid,nodev 0 0 +DxDrmServerIpc /data/DxDrm/fuse fuse.DxDrmServerIpc rw,nosuid,nodev,user_id=0,group_id=0,allow_other 0 0 +/dev/block//vold/179:0 /sdcard vfat rw,dirsync,nosuid,nodev,noexec,uid=1000,gid=1015,fmask=0702,dmask=0702,allow_utime=0020,codepage=cp437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro 0 0 +---Sat, 11 May 2013 09:44:42 +0000 GMT--- Reading: /proc/loadavg +9.64 10.21 9.25 1/368 3761 +---Sat, 11 May 2013 09:44:42 +0000 GMT--- Reading: /proc/stat +cpu 86106 8531 23923 69419 12048 7 103 0 0 +cpu0 86106 8531 23923 69419 12048 7 103 0 0 +intr 8172553 11517 0 0 0 0 0 0 14368 501597 0 0 4 0 0 0 0 57530 0 0 18141 18168 406228 0 0 6436010 1 175247 142510 0 0 0 0 0 0 176889 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 39660 0 0 0 0 0 0 0 0 26 14 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 167719 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6859 0 0 0 0 0 0 0 0 60 0 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +ctxt 15101414 +btime 1368263477 +processes 3758 +procs_running 1 +procs_blocked 0 +---Sat, 11 May 2013 09:44:43 +0000 GMT--- Reading: /proc/stat +cpu 86108 8531 23924 69516 12048 7 103 0 0 +cpu0 86108 8531 23924 69516 12048 7 103 0 0 +intr 8172829 11517 0 0 0 0 0 0 14386 501712 0 0 4 0 0 0 0 57534 0 0 18142 18169 406228 0 0 6436010 1 175250 142513 0 0 0 0 0 0 176934 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 39661 0 0 0 0 0 0 0 0 26 14 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 167804 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6859 0 0 0 0 0 0 0 0 60 0 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +ctxt 15101638 +btime 1368263477 +processes 3758 +procs_running 1 +procs_blocked 0 diff --git a/sources/sample/logs/log_android412.txt b/sources/sample/logs/log_android412.txt new file mode 100644 index 0000000..421ffe5 --- /dev/null +++ b/sources/sample/logs/log_android412.txt @@ -0,0 +1,443 @@ +---Sun, 12 May 2013 18:32:54 +0000 GMT--- Reading: /system/build.prop +# begin build properties +# autogenerated by buildinfo.sh +ro.build.id=JZO54K +ro.build.display.id=Jelly Blur 4.1.2 JZ054K eng.tiestobunio.20130507.120822 shakira test-keys +ro.build.version.incremental=eng.tiestobunio.20130507.120822 +ro.build.version.sdk=16 +ro.build.version.codename=REL +ro.build.version.release=4.1.2 +ro.build.date=Tue May 7 12:08:22 EURO 2013 +ro.build.date.utc=12082214 +ro.build.type=user +ro.build.user=tiestobunio +ro.build.host=toshiba +ro.build.tags=test-keys +ro.product.model=E15i +ro.product.brand=SEMC +ro.product.name=LT30p_1269-0608 +ro.product.device=shakira +ro.product.board=shakira +ro.product.cpu.abi=armeabi-v6l +ro.product.cpu.abi2=armeabi +ro.product.manufacturer=Sony Ericsson +ro.wifi.channels= +ro.board.platform=msm7x27 +# ro.build.product is obsolete; use ro.product.device +ro.build.product=shakira +# Do not try to parse ro.build.description or .fingerprint +ro.build.description=LT30p-user 4.0.4 7.0.A.3.195 PPP_xw test-keys +ro.build.fingerprint=Sony/LT30p_1269-0608/LT30p:4.0.4/7.0.A.3.195/PPP_xw:user/release-keys +ro.build.characteristics=default +ro.cm.device=shakira +# end build properties + +# +# ADDITIONAL_BUILD_PROPERTIES +# +ro.sf.lcd_density=160 +keyguard.no_require_sim=true +ro.url.legal=http://www.google.com/intl/%s/mobile/android/basic/phone-legal.html +ro.url.legal.android_privacy=http://www.google.com/intl/%s/mobile/android/basic/privacy.html +ro.com.google.clientidbase=android-google +ro.com.android.wifi-watchlist=GoogleGuest +ro.setupwizard.enterprise_mode=1 +ro.com.android.dateformat=MM-dd-yyyy +ro.com.android.dataroaming=false +ro.cm.version=Jelly Blur CM10 V4.5 +ro.modversion=Jelly Blur CM10 +ro.min.kernel.version=2.6.32.60-nAa +ro.min.kernel.revision=05 +persist.sys.themeId=sytem +persist.sys.themePackageName=com.system.theme.jellybean +ro.media.dec.jpeg.memcap=10000000 +rild.libpath=/system/lib/libril-qc-1.so +rild.libargs=-d/dev/smd0 +ro.ril.hep=1 +ro.ril.hsdpa.category=10 +ro.ril.enable.dtm=1 +ro.ril.enable.3g.prefix=1 +ro.ril.hsxpa=2 +ro.ril.gprsclass=10 +ro.ril.hsupa.category=6 +ro.ril.disable.power.collapse=1 +ro.telephony.ril_class=SemcRIL +wifi.interface=wlan0 +wifi.softap.interface=wlan0 +wifi.softapconcurrent.interface=wlan0 +wifi.supplicant_scan_interval=45 +ro.ril.def.agps.mode=2 +ro.ril.def.agps.feature=1 +persist.sys.use_16bpp_alpha=1 +persist.sys.use_dithering=0 +persist.sys.force_hw_ui=true +ro.telephony.default_network=0 +ro.telephony.call_ring.delay=1000 +ro.telephony.call_ring.multiple=false +ro.com.google.locationfeatures=1 +ro.com.google.networklocation=1 +ro.ril.enable.a52=1 +ro.ril.enable.a53=1 +ro.telephony.ril.v3=icccardstatus,skipbrokendatacall,signalstrength,datacall +ro.telephony.ril_skip_locked=true +ro.media.enc.file.format=3gp,mp4 +ro.media.enc.vid.codec=m4v,h263 +ro.media.enc.vid.h263.width=176,640 +ro.media.enc.vid.h263.height=144,480 +ro.media.enc.vid.h263.bps=64000,1600000 +ro.media.enc.vid.h263.fps=1,30 +ro.media.enc.vid.m4v.width=176,640 +ro.media.enc.vid.m4v.height=144,480 +ro.media.enc.vid.m4v.bps=64000,1600000 +ro.media.enc.vid.m4v.fps=1,30 +ro.media.dec.aud.wma.enabled=1 +ro.media.dec.vid.wmv.enabled=1 +settings.display.autobacklight=1 +media.stagefright.enable-player=true +media.stagefright.enable-meta=true +media.stagefright.enable-scan=true +media.stagefright.enable-http=true +windowsmgr.max_events_per_sec=200 +debug.camcorder.disablemeta=1 +dalvik.vm.dexopt-flags=v=a,o=v,m=y,u=y +dalvik.vm.checkjni=0 +dalvik.vm.dexopt-data-only=1 +dalvik.vm.lockprof.threshold=500 +dalvik.vm.execution-mode=int:jit +dalvik.vm.verify_bytecode=false +dalvik.vm.heapsize=32m +debug.sf.hw=1 +debug.composition.type=mdp +debug.gr.numframebuffers=1 +ro.max.fling_velocity=4000 +debug.qctwa.statusbar=1 +debug.qctwa.preservebuf=1 +hwui.render_dirty_regions=false +hwui.disable_vsync=true +debug.mdpcomp.logs=0 +debug.sf.no_hw_vsync=1 +hwui.print_config=choice +debug.enabletr=false +debug.hwui.render_dirty_regions=false +debug.hwui.disable_vsync=true +com.qc.hardware=true +persist.service.zram=1 +ro.zram.default=18 +persist.sys.usb.config=mtp,adb +persist.service.adb.enable=1 +ro.opengles.version=131072 +ro.product.locale.language=en +ro.product.locale.region=US +ro.service.swiqi.supported=true +persist.service.swiqi.enable=1 +persist.ro.ril.sms_sync_sending=1 +persist.android.strictmode=0 +debug.performance.tuning=1 +video.accelerate.hw=1 +pm.sleep_mode=1 +persist.pmem.camera=4000000 +ro.config.ringtone=CyanTone.ogg +ro.config.notification_sound=CyanMessage.ogg +ro.config.alarm_alert=CyanAlarm.ogg +net.bt.name=Android +dalvik.vm.stack-trace-file=/data/anr/traces.txt + +# Fast Reboot +persist.sys.purgeable_assets=1 +# Render UI With GPU +debug.sf.hw=1 + +#Perfomance Engine + +persist.rild.nitz_plmn= + +persist.rild.nitz_long_ons_0= + +persist.rild.nitz_long_ons_1= + +persist.rild.nitz_long_ons_2= + +persist.rild.nitz_long_ons_3= + +persist.rild.nitz_short_ons_0= + +persist.rild.nitz_short_ons_1= + +persist.rild.nitz_short_ons_2= + +persist.rild.nitz_short_ons_3= + + +#Disable blur +debug.hwui.render_dirty_regions=false + +# Force use of GPU on 2D rendering +# persist.sys.force_hw_ui=true + +# Proximity Tweaks +ro.lge.proximity.delay=25 +mot.proximity.delay=25 + +# Fast Reboot +persist.sys.shutdown.mode=hibernate +ro.config.hw_quickpoweron=true + +#Disable blur +debug.hwui.render_dirty_regions=false +# Force use of GPU on 2D rendering +# persist.sys.force_hw_ui=true + +# Proximity Tweaks +ro.lge.proximity.delay=25 +mot.proximity.delay=25 + +# Frees More RAM +persist.sys.purgeable_assets=1 + +ro.HOME_APP_ADJ=1 +ro.mot.eri.losalert.delay=1000 +ro.config.hw_fast_dormancy=1 +ro.ril.enable.amr.wideband=1 +ro.config.hw_fast_dormancy=1 +ro.config.hw_quickpoweron=true + + +#Media quality improvements +media.stagefright.enable-player=true +media.stagefright.enable-meta=true +media.stagefright.enable-scan=true +media.stagefright.enable-http=true +media.stagefright.enable-record=true +ro.media.enc.jpeg.quality=100 +ro.media.dec.jpeg.memcap=8000000 +ro.media.enc.hprof.vid.bps=8000000 +ro.media.enc.hprof.vid.fps=75 +video.accelerate.hw=1 + + +#Other Performance Tweaks +ENFORCE_PROCESS_LIMIT=false +persist.android.strictmode=0 +persist.service.lgospd.enable=0 +persist.service.pcsync.enable=0 +ro.min_pointer_dur=1 +ro.telephony.call_ring.delay=0 +ro.sec.proximity.delay=0 +ro.HOME_APP_ADJ=1 +debug.composition.type=gpu +persist.sys.NV_FPSLIMIT=60 +dev.pm.dyn_samplingrate=1---Sun, 12 May 2013 18:32:54 +0000 GMT--- Reading: /proc/sys/kernel/hostname +localhost +---Sun, 12 May 2013 18:32:54 +0000 GMT--- Reading: /proc/version +Linux version 2.6.32.60-nAa-05 (nobodyAtall@palikari) (gcc version 4.7.3 20121106 (prerelease) (Linaro GCC 4.7-2012.11) ) #1096 PREEMPT Sat Mar 16 20:04:00 EET 2013 +---Sun, 12 May 2013 18:32:54 +0000 GMT--- Reading: /proc/uptime +1727.18 325.01 +---Sun, 12 May 2013 18:32:54 +0000 GMT--- Reading: /proc/cpuinfo +Processor : ARMv6-compatible processor rev 5 (v6l) +BogoMIPS : 599.65 +Features : swp half thumb fastmult vfp edsp java +CPU implementer : 0x41 +CPU architecture: 6TEJ +CPU variant : 0x1 +CPU part : 0xb36 +CPU revision : 5 + +Hardware : SEMC Delta +Revision : 0000 +Serial : 0000000000000000 +---Sun, 12 May 2013 18:32:54 +0000 GMT--- Reading: /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq +604800 +---Sun, 12 May 2013 18:32:54 +0000 GMT--- Reading: /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq +864000 +---Sun, 12 May 2013 18:32:54 +0000 GMT--- Reading: /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_min_freq +122880 +---Sun, 12 May 2013 18:32:54 +0000 GMT--- Reading: /sys/class/power_supply/battery/uevent +POWER_SUPPLY_NAME=battery +POWER_SUPPLY_TYPE=Battery +POWER_SUPPLY_STATUS=Charging +POWER_SUPPLY_PRESENT=1 +POWER_SUPPLY_HEALTH=Good +POWER_SUPPLY_TECHNOLOGY=Li-poly +POWER_SUPPLY_CAPACITY=100 +---Sun, 12 May 2013 18:32:54 +0000 GMT--- Reading: /sys/class/power_supply/battery/capacity +100 +---Sun, 12 May 2013 18:32:54 +0000 GMT--- Reading: /sys/class/power_supply/battery/batt_temp +330 +---Sun, 12 May 2013 18:32:54 +0000 GMT--- Reading: /sys/class/power_supply/battery/batt_vol +4181 +---Sun, 12 May 2013 18:32:54 +0000 GMT--- Reading: /sys/class/power_supply/battery/technology +Li-poly +---Sun, 12 May 2013 18:32:54 +0000 GMT--- Reading: /sys/class/power_supply/battery/status +Charging +---Sun, 12 May 2013 18:32:54 +0000 GMT--- Reading: /sys/class/power_supply/battery/health +Good +---Sun, 12 May 2013 18:32:54 +0000 GMT--- Reading: /proc/stat +cpu 67446 9149 43018 32501 20250 9 64 0 0 +cpu0 67446 9149 43018 32501 20250 9 64 0 0 +intr 9106653 10362 0 0 0 0 0 0 0 422747 0 0 11 0 0 0 0 37498 0 0 22911 33276 743963 0 9145 7167599 0 187062 0 0 0 0 0 0 0 431029 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 18635 0 0 0 0 0 0 0 0 33 26 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 13079 0 0 0 0 9266 0 0 0 0 0 0 0 0 5 0 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +ctxt 18521396 +btime 1368381847 +processes 5477 +procs_running 4 +procs_blocked 3 +softirq 271689 0 130976 444 2408 0 0 46075 0 1139 90647 +---Sun, 12 May 2013 18:32:55 +0000 GMT--- Reading: /proc/stat +cpu 67450 9149 43024 32501 20340 9 64 0 0 +cpu0 67450 9149 43024 32501 20340 9 64 0 0 +intr 9116370 10380 0 0 0 0 0 0 0 422818 0 0 11 0 0 0 0 37498 0 0 22911 33276 744057 0 9145 7176941 0 187062 0 0 0 0 0 0 0 431213 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 18635 0 0 0 0 0 0 0 0 33 26 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 13087 0 0 0 0 9266 0 0 0 0 0 0 0 0 5 0 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +ctxt 18540445 +btime 1368381847 +processes 5477 +procs_running 1 +procs_blocked 1 +softirq 271729 0 131004 444 2408 0 0 46078 0 1140 90655 +---Sun, 12 May 2013 18:32:55 +0000 GMT--- Reading: /proc/net/dev +Inter-| Receive | Transmit + face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed + lo: 4906465 3467 0 0 0 0 0 0 4906465 3467 0 0 0 0 0 0 +dummy0: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +rmnet0: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +rmnet1: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +rmnet2: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +rmnet3: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +rmnet4: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +rmnet5: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +rmnet6: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +rmnet7: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + sit0: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +ip6tnl0: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + wlan0:23784505 16344 0 0 0 0 0 0 481451 5463 0 0 0 0 0 0 +---Sun, 12 May 2013 18:32:55 +0000 GMT--- Executing: ifconfig lo 2>/dev/null +lo: ip 127.0.0.1 mask 255.0.0.0 flags [up loopback running] +---Sun, 12 May 2013 18:32:55 +0000 GMT--- Executing: ifconfig dummy0 2>/dev/null + +---Sun, 12 May 2013 18:32:55 +0000 GMT--- Executing: ifconfig rmnet0 2>/dev/null + +---Sun, 12 May 2013 18:32:55 +0000 GMT--- Executing: ifconfig rmnet1 2>/dev/null + +---Sun, 12 May 2013 18:32:55 +0000 GMT--- Executing: ifconfig rmnet2 2>/dev/null + +---Sun, 12 May 2013 18:32:55 +0000 GMT--- Executing: ifconfig rmnet3 2>/dev/null + +---Sun, 12 May 2013 18:32:55 +0000 GMT--- Executing: ifconfig rmnet4 2>/dev/null + +---Sun, 12 May 2013 18:32:55 +0000 GMT--- Executing: ifconfig rmnet5 2>/dev/null + +---Sun, 12 May 2013 18:32:55 +0000 GMT--- Executing: ifconfig rmnet6 2>/dev/null + +---Sun, 12 May 2013 18:32:55 +0000 GMT--- Executing: ifconfig rmnet7 2>/dev/null + +---Sun, 12 May 2013 18:32:55 +0000 GMT--- Executing: ifconfig sit0 2>/dev/null + +---Sun, 12 May 2013 18:32:55 +0000 GMT--- Executing: ifconfig ip6tnl0 2>/dev/null + +---Sun, 12 May 2013 18:32:55 +0000 GMT--- Executing: ifconfig wlan0 2>/dev/null +wlan0: ip 192.168.1.3 mask 255.255.255.0 flags [up broadcast running multicast] +---Sun, 12 May 2013 18:32:55 +0000 GMT--- Reading: /proc/meminfo +MemTotal: 190820 kB +MemFree: 13680 kB +Buffers: 160 kB +Cached: 28056 kB +SwapCached: 8788 kB +Active: 68900 kB +Inactive: 68544 kB +Active(anon): 54804 kB +Inactive(anon): 55032 kB +Active(file): 14096 kB +Inactive(file): 13512 kB +Unevictable: 544 kB +Mlocked: 0 kB +SwapTotal: 34340 kB +SwapFree: 808 kB +Dirty: 60 kB +Writeback: 0 kB +AnonPages: 101708 kB +Mapped: 20516 kB +Shmem: 64 kB +Slab: 11880 kB +SReclaimable: 2900 kB +SUnreclaim: 8980 kB +KernelStack: 3816 kB +PageTables: 3764 kB +NFS_Unstable: 0 kB +Bounce: 0 kB +WritebackTmp: 0 kB +CommitLimit: 129748 kB +Committed_AS: 1438480 kB +VmallocTotal: 565248 kB +VmallocUsed: 34984 kB +VmallocChunk: 472740 kB +---Sun, 12 May 2013 18:32:55 +0000 GMT--- Reading: /proc/swaps +Filename Type Size Used Priority +/dev/block/zram0 partition 34340 33532 -1 +---Sun, 12 May 2013 18:32:56 +0000 GMT--- Executing: df 2>/dev/null +Filesystem Size Used Free Blksize +/cache 5M 996K 4M 4096 +/dev 93.2M 84K 93.1M 4096 +/mnt/asec 93.2M 0K 93.2M 4096 +/mnt/obb 93.2M 0K 93.2M 4096 +/system 261M 211M 50M 4096 +/data 191.8M 141.9M 49.9M 4096 +/storage/sdcard0 969.6M 669.3M 300.3M 4096 +/mnt/asec/com.ghisler.tcplugins.WebDAV-1 2M 588K 1.4M 4096 +/mnt/asec/org.connectbot-1 2M 764K 1.3M 4096 +/mnt/asec/jackpal.androidterm-1 2M 456K 1.6M 4096 +/mnt/asec/com.opera.browser-1 26M 24.7M 1.3M 4096 +/mnt/asec/com.ghisler.tcplugins.LAN-1 2M 352K 1.7M 4096 +/mnt/asec/com.ghisler.tcplugins.FTP-1 2M 408K 1.6M 4096 +/mnt/asec/com.ghisler.android.TotalCommander-1 3M 1.2M 1.8M 4096 +/mnt/asec/ru.zdevs.zarchiver-1 6M 4.3M 1.7M 4096 +/mnt/asec/pl.redefine.ipla-2 14M 12.3M 1.7M 4096 +/mnt/asec/mobi.infolife.appbackup-1 2M 428K 1.6M 4096 +/mnt/asec/com.skype.raider-1 18M 16.7M 1.3M 4096 +/mnt/asec/pl.vod-1 2M 472K 1.5M 4096 +/mnt/asec/org.mozilla.firefox-1 23M 21.3M 1.7M 4096 +---Sun, 12 May 2013 18:32:56 +0000 GMT--- Executing: mount +rootfs / rootfs rw,nodiratime,relatime 0 0 +/dev/block/mtdblock1 /cache yaffs2 rw,nosuid,nodev,nodiratime,relatime 0 0 +tmpfs /dev tmpfs rw,nosuid,noatime,mode=755 0 0 +devpts /dev/pts devpts rw,noatime,mode=600 0 0 +proc /proc proc rw,noatime 0 0 +sysfs /sys sysfs rw,noatime 0 0 +tmpfs /mnt/asec tmpfs rw,noatime,mode=755,gid=1000 0 0 +tmpfs /mnt/obb tmpfs rw,noatime,mode=755,gid=1000 0 0 +/dev/block/mtdblock0 /system yaffs2 ro,relatime 0 0 +/dev/block/mtdblock2 /data yaffs2 rw,nosuid,nodev,nodiratime,relatime 0 0 +/dev/block/vold/179:0 /storage/sdcard0 vfat rw,dirsync,nosuid,nodev,noexec,noatime,uid=1000,gid=1015,fmask=0702,dmask=0702,allow_utime=0020,codepage=cp437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro 0 0 +/dev/block/vold/179:0 /mnt/secure/asec vfat rw,dirsync,nosuid,nodev,noexec,noatime,uid=1000,gid=1015,fmask=0702,dmask=0702,allow_utime=0020,codepage=cp437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro 0 0 +tmpfs /storage/sdcard0/.android_secure tmpfs ro,noatime,size=0k,mode=000 0 0 +/dev/block/dm-0 /mnt/asec/com.ghisler.tcplugins.WebDAV-1 ext4 ro,dirsync,nosuid,nodev,relatime,barrier=1,data=writeback 0 0 +/dev/block/dm-1 /mnt/asec/org.connectbot-1 ext4 ro,dirsync,nosuid,nodev,relatime,barrier=1,data=writeback 0 0 +/dev/block/dm-2 /mnt/asec/jackpal.androidterm-1 ext4 ro,dirsync,nosuid,nodev,relatime,barrier=1,data=writeback 0 0 +/dev/block/dm-3 /mnt/asec/com.opera.browser-1 ext4 ro,dirsync,nosuid,nodev,relatime,barrier=1,data=writeback 0 0 +/dev/block/dm-4 /mnt/asec/com.ghisler.tcplugins.LAN-1 ext4 ro,dirsync,nosuid,nodev,relatime,barrier=1,data=writeback 0 0 +/dev/block/dm-5 /mnt/asec/com.ghisler.tcplugins.FTP-1 ext4 ro,dirsync,nosuid,nodev,relatime,barrier=1,data=writeback 0 0 +/dev/block/dm-6 /mnt/asec/com.ghisler.android.TotalCommander-1 ext4 ro,dirsync,nosuid,nodev,relatime,barrier=1,data=writeback 0 0 +/dev/block/dm-7 /mnt/asec/ru.zdevs.zarchiver-1 ext4 ro,dirsync,nosuid,nodev,relatime,barrier=1,data=writeback 0 0 +/dev/block/dm-8 /mnt/asec/pl.redefine.ipla-2 ext4 ro,dirsync,nosuid,nodev,relatime,barrier=1,data=writeback 0 0 +/dev/block/dm-9 /mnt/asec/mobi.infolife.appbackup-1 ext4 ro,dirsync,nosuid,nodev,relatime,barrier=1,data=writeback 0 0 +/dev/block/dm-10 /mnt/asec/com.skype.raider-1 ext4 ro,dirsync,nosuid,nodev,relatime,barrier=1,data=writeback 0 0 +/dev/block/dm-11 /mnt/asec/pl.vod-1 ext4 ro,dirsync,nosuid,nodev,relatime,barrier=1,data=writeback 0 0 +/dev/block/dm-12 /mnt/asec/org.mozilla.firefox-1 ext4 ro,dirsync,nosuid,nodev,relatime,barrier=1,data=writeback 0 0 +---Sun, 12 May 2013 18:32:56 +0000 GMT--- Reading: /proc/loadavg +11.23 11.98 10.79 1/475 5508 +---Sun, 12 May 2013 18:32:56 +0000 GMT--- Reading: /proc/stat +cpu 67462 9149 43044 32501 20340 9 64 0 0 +cpu0 67462 9149 43044 32501 20340 9 64 0 0 +intr 9116804 10380 0 0 0 0 0 0 0 422857 0 0 11 0 0 0 0 37498 0 0 22911 33276 744135 0 9145 7177210 0 187062 0 0 0 0 0 0 0 431259 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 18635 0 0 0 0 0 0 0 0 33 26 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 13089 0 0 0 0 9266 0 0 0 0 0 0 0 0 5 0 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +ctxt 18541338 +btime 1368381847 +processes 5507 +procs_running 1 +procs_blocked 1 +softirq 271870 0 131036 444 2408 0 0 46083 0 1140 90759 +---Sun, 12 May 2013 18:32:57 +0000 GMT--- Reading: /proc/stat +cpu 67462 9149 43054 32528 20404 9 64 0 0 +cpu0 67462 9149 43054 32528 20404 9 64 0 0 +intr 9126517 10380 0 0 0 0 0 0 0 422931 0 0 11 0 0 0 0 37498 0 0 22911 33276 744138 0 9145 7186654 0 187062 0 0 0 0 0 0 0 431443 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 18635 0 0 0 0 0 0 0 0 33 26 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 13097 0 0 0 0 9266 0 0 0 0 0 0 0 0 5 0 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +ctxt 18560395 +btime 1368381847 +processes 5507 +procs_running 1 +procs_blocked 0 +softirq 271904 0 131064 444 2408 0 0 46086 0 1140 90762 diff --git a/sources/sample/logs/log_bluestacks.txt b/sources/sample/logs/log_bluestacks.txt new file mode 100644 index 0000000..b5b0751 --- /dev/null +++ b/sources/sample/logs/log_bluestacks.txt @@ -0,0 +1,202 @@ +---Mon, 29 Apr 2013 07:33:51 +0000 GMT--- Reading: /system/build.prop +# begin build properties +# autogenerated by buildinfo.sh +ro.build.id=GRJ22 +ro.build.display.id=generic_x86-eng 2.3.4 GRJ22 eng.build.20121017.125534 test-keys +ro.build.version.incremental=eng.build.20121017.125534 +ro.build.version.sdk=10 +ro.build.version.codename=REL +ro.build.version.release=2.3.4 +ro.build.date=Wed Oct 17 14:18:50 IST 2012 +ro.build.date.utc=1350463730 +ro.build.type=eng +ro.build.user=build +ro.build.host=BuildServer +ro.build.tags=test-keys +ro.product.model=BlueStacks +ro.product.brand=BlueStacks +ro.product.name=BlueStacks +ro.product.device=Virtual +ro.product.board= +ro.product.cpu.abi=armeabi-v7a +ro.product.cpu.abi2=armeabi +ro.product.manufacturer=BlueStacks +ro.product.locale.language=en +ro.product.locale.region=US +ro.wifi.channels= +ro.board.platform= +# ro.build.product is obsolete; use ro.product.device +ro.build.product=Virtual +# Do not try to parse ro.build.description or .fingerprint +ro.build.description=generic_x86-eng 2.3.4 GRJ22 eng.build.20121017.125534 test-keys +ro.build.fingerprint=generic_x86/generic_x86/generic_x86:2.3.4/GRJ22/eng.build.20121017.125534:eng/test-keys +# end build properties + +# +# ADDITIONAL_BUILD_PROPERTIES +# +ro.config.notification_sound=OnTheHunt.ogg +ro.config.alarm_alert=Alarm_Classic.ogg +ro.com.android.dataroaming=true +ro.kernel.android.checkjni=1 +ro.setupwizard.mode=OPTIONAL +net.bt.name=Android +dalvik.vm.stack-trace-file=/data/anr/traces.txt +---Mon, 29 Apr 2013 07:33:51 +0000 GMT--- Reading: /proc/sys/kernel/hostname +localhost +---Mon, 29 Apr 2013 07:33:51 +0000 GMT--- Reading: /proc/version +Linux version 2.6.38-android-x86+ (build@BuildServer) (gcc version 4.5.2 (Ubuntu/Linaro 4.5.2-8ubuntu4) ) #1 PREEMPT Thu Oct 25 09:38:01 IST 2012 +---Mon, 29 Apr 2013 07:33:51 +0000 GMT--- Reading: /proc/uptime +59.49 39.40 +---Mon, 29 Apr 2013 07:33:51 +0000 GMT--- Reading: /proc/cpuinfo +processor : 0 +vendor_id : GenuineIntel +cpu family : 6 +model : 58 +model name : Intel(R) Core(TM) i5-3320M CPU @ 2.60GHz +stepping : 9 +cpu MHz : 2594.000 +cache size : 3072 KB +fdiv_bug : no +hlt_bug : no +f00f_bug : no +coma_bug : no +fpu : yes +fpu_exception : yes +cpuid level : 13 +wp : yes +flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe nx rdtscp lm constant_tsc arch_perfmon pebs bts nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm sse4_1 sse4_2 x2apic popcnt aes avx f16c rdrnd lahf_lm ida arat epb pln pts dts tpr_shadow vnmi flexpriority ept vpid +bogomips : 33449.57 +clflush size : 64 +cache_alignment : 64 +address sizes : 36 bits physical, 48 bits virtual +power management: + +---Mon, 29 Apr 2013 07:33:51 +0000 GMT--- Reading: /proc/stat +cpu 1240 219 360 3940 188 0 2 0 0 0 +cpu0 1240 219 360 3940 188 0 2 0 0 0 +intr 23405 5949 0 156 9791 26 627 0 3513 0 10 0 3329 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +ctxt 91556 +btime 1367220772 +processes 1274 +procs_running 5 +procs_blocked 1 +softirq 19636 0 5734 0 1838 0 0 89 0 0 11975 +---Mon, 29 Apr 2013 07:33:52 +0000 GMT--- Reading: /proc/stat +cpu 1318 219 364 3959 188 0 2 0 0 0 +cpu0 1318 219 364 3959 188 0 2 0 0 0 +intr 23660 6050 0 156 9827 26 627 0 3514 0 10 0 3446 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +ctxt 92554 +btime 1367220772 +processes 1276 +procs_running 2 +procs_blocked 0 +softirq 19850 0 5831 0 1839 0 0 89 0 0 12091 +---Mon, 29 Apr 2013 07:33:52 +0000 GMT--- Reading: /proc/net/dev +Inter-| Receive | Transmit + face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed + lo: 642215 258 0 0 0 0 0 0 642215 258 0 0 0 0 0 0 + eth0: 4201926 3512 0 0 0 0 0 0 1127382 2464 0 0 0 0 0 0 +---Mon, 29 Apr 2013 07:33:52 +0000 GMT--- Executing: ifconfig lo 2>/dev/null +lo: ip 127.0.0.1 mask 255.0.0.0 flags [up loopback running] +---Mon, 29 Apr 2013 07:33:52 +0000 GMT--- Executing: ifconfig eth0 2>/dev/null +eth0: ip 10.0.2.15 mask 255.255.255.0 flags [up broadcast running multicast] +---Mon, 29 Apr 2013 07:33:52 +0000 GMT--- Reading: /proc/meminfo +MemTotal: 758548 kB +MemFree: 112792 kB +Buffers: 55744 kB +Cached: 332496 kB +SwapCached: 0 kB +Active: 288288 kB +Inactive: 330996 kB +Active(anon): 235068 kB +Inactive(anon): 32692 kB +Active(file): 53220 kB +Inactive(file): 298304 kB +Unevictable: 0 kB +Mlocked: 0 kB +SwapTotal: 0 kB +SwapFree: 0 kB +Dirty: 3564 kB +Writeback: 0 kB +AnonPages: 231016 kB +Mapped: 83540 kB +Shmem: 36744 kB +Slab: 12632 kB +SReclaimable: 7296 kB +SUnreclaim: 5336 kB +KernelStack: 3232 kB +PageTables: 4624 kB +NFS_Unstable: 0 kB +Bounce: 0 kB +WritebackTmp: 0 kB +CommitLimit: 379272 kB +Committed_AS: 2100224 kB +VmallocTotal: 237564 kB +VmallocUsed: 28128 kB +VmallocChunk: 178684 kB +DirectMap4k: 0 kB +DirectMap4M: 0 kB +---Mon, 29 Apr 2013 07:33:52 +0000 GMT--- Executing: df 2>/dev/null +Filesystem Size Used Free Blksize +/ 370M 436K 369M 4096 +/mnt 370M 436K 369M 4096 +/ 370M 436K 369M 4096 +/system 153M 145M 7M 4096 +/cache 370M 3M 366M 4096 +/data 1G 324M 1G 4096 +/dev 370M 72K 370M 4096 +/mnt/asec 370M 0K 370M 4096 +/mnt/obb 370M 0K 370M 4096 +/mnt/sdcard 1G 163M 1G 4096 +/mnt/sdcard/bstfolder/PublicDocuments 149G 123G 25G 4096 +/mnt/sdcard/bstfolder/Documents 149G 123G 25G 4096 +/mnt/sdcard/bstfolder/Pictures 149G 123G 25G 4096 +/mnt/sdcard/bstfolder/BstSharedFolder 149G 123G 25G 4096 +/mnt/sdcard/bstfolder/PublicPictures 149G 123G 25G 4096 +---Mon, 29 Apr 2013 07:33:52 +0000 GMT--- Executing: mount +rootfs / rootfs rw 0 0 +proc /proc proc rw,relatime 0 0 +sys /sys sysfs rw,relatime 0 0 +/dev/sda1 /mnt ext4 ro,relatime,barrier=1,data=ordered 0 0 +tmpfs / tmpfs ro,relatime 0 0 +/dev/loop0 /sfs squashfs ro,relatime 0 0 +/dev/loop1 /system ext4 ro,relatime,barrier=1,data=ordered 0 0 +tmpfs /cache tmpfs rw,relatime 0 0 +/dev/sdb1 /data ext4 rw,relatime,barrier=1,data=ordered 0 0 +tmpfs /dev tmpfs rw,relatime,mode=755 0 0 +devpts /dev/pts devpts rw,relatime,mode=600 0 0 +proc /proc proc rw,relatime 0 0 +sysfs /sys sysfs rw,relatime 0 0 +tmpfs /mnt/asec tmpfs rw,relatime,mode=755,gid=1000 0 0 +tmpfs /mnt/obb tmpfs rw,relatime,mode=755,gid=1000 0 0 +/dev/block/vold/8:33 /mnt/sdcard vfat rw,dirsync,nosuid,nodev,noexec,relatime,uid=1000,gid=1015,fmask=0702,dmask=0702,allow_utime=0020,codepage=cp437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro 0 0 +/dev/block/vold/8:33 /mnt/secure/asec vfat rw,dirsync,nosuid,nodev,noexec,relatime,uid=1000,gid=1015,fmask=0702,dmask=0702,allow_utime=0020,codepage=cp437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro 0 0 +tmpfs /mnt/sdcard/.android_secure tmpfs ro,relatime,size=0k,mode=000 0 0 +PublicDocuments /mnt/sdcard/bstfolder/PublicDocuments bstfolder rw,nosuid,nodev,relatime,uid=1000,gid=1015,fmask=0702,dmask=0702 0 0 +Documents /mnt/sdcard/bstfolder/Documents bstfolder rw,nosuid,nodev,relatime,uid=1000,gid=1015,fmask=0702,dmask=0702 0 0 +Pictures /mnt/sdcard/bstfolder/Pictures bstfolder rw,nosuid,nodev,relatime,uid=1000,gid=1015,fmask=0702,dmask=0702 0 0 +BstSharedFolder /mnt/sdcard/bstfolder/BstSharedFolder bstfolder rw,nosuid,nodev,relatime,uid=1000,gid=1015,fmask=0702,dmask=0702 0 0 +PublicPictures /mnt/sdcard/bstfolder/PublicPictures bstfolder rw,nosuid,nodev,relatime,uid=1000,gid=1015,fmask=0702,dmask=0702 0 0 +---Mon, 29 Apr 2013 07:33:52 +0000 GMT--- Reading: /proc/loadavg +2.77 0.77 0.26 2/400 1284 +---Mon, 29 Apr 2013 07:33:52 +0000 GMT--- Reading: /proc/stat +cpu 1318 219 364 3960 188 0 2 0 0 0 +cpu0 1318 219 364 3960 188 0 2 0 0 0 +intr 23669 6051 0 156 9829 31 627 0 3514 0 10 0 3447 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +ctxt 92638 +btime 1367220772 +processes 1284 +procs_running 2 +procs_blocked 0 +softirq 19852 0 5832 0 1839 0 0 89 0 0 12092 +---Mon, 29 Apr 2013 07:33:53 +0000 GMT--- Reading: /proc/stat +cpu 1320 219 365 4058 188 0 2 0 0 0 +cpu0 1320 219 365 4058 188 0 2 0 0 0 +intr 23890 6152 0 156 9829 31 627 0 3514 0 10 0 3567 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +ctxt 93138 +btime 1367220772 +processes 1284 +procs_running 2 +procs_blocked 0 +softirq 20059 0 5925 0 1839 0 0 89 0 0 12206 diff --git a/sources/sample/logs/log_debian7.txt b/sources/sample/logs/log_debian7.txt new file mode 100644 index 0000000..31904fa --- /dev/null +++ b/sources/sample/logs/log_debian7.txt @@ -0,0 +1,153 @@ +---Mon, 06 May 2013 12:38:18 +0000 GMT--- Executing: lsb_release -a 2>/dev/null +Distributor ID: Debian +Description: Debian GNU/Linux 7.0 (wheezy) +Release: 7.0 +Codename: wheezy +---Mon, 06 May 2013 12:38:18 +0000 GMT--- Reading: /proc/sys/kernel/hostname +testowy +---Mon, 06 May 2013 12:38:18 +0000 GMT--- Executing: uname -r +3.2.0-4-amd64 +---Mon, 06 May 2013 12:38:18 +0000 GMT--- Executing: uname -v +#1 SMP Debian 3.2.41-2 +---Mon, 06 May 2013 12:38:18 +0000 GMT--- Executing: uname -m +x86_64 +---Mon, 06 May 2013 12:38:18 +0000 GMT--- Reading: /proc/uptime +163.27 99.71 +---Mon, 06 May 2013 12:38:18 +0000 GMT--- Executing: who +mietekn tty7 May 6 14:36 (:0) +mietekn pts/0 May 6 14:36 (:0.0) +---Mon, 06 May 2013 12:38:18 +0000 GMT--- Reading: /proc/cpuinfo +processor : 0 +vendor_id : GenuineIntel +cpu family : 6 +model : 58 +model name : Intel(R) Core(TM) i5-3320M CPU @ 2.60GHz +stepping : 9 +cpu MHz : 2702.529 +cache size : 6144 KB +fpu : yes +fpu_exception : yes +cpuid level : 5 +wp : yes +flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 syscall nx rdtscp lm constant_tsc up rep_good nopl pni monitor ssse3 lahf_lm +bogomips : 5405.05 +clflush size : 64 +cache_alignment : 64 +address sizes : 36 bits physical, 48 bits virtual +power management: + +---Mon, 06 May 2013 12:38:18 +0000 GMT--- Executing: lspci +00:00.0 Host bridge: Intel Corporation 440FX - 82441FX PMC [Natoma] (rev 02) +00:01.0 ISA bridge: Intel Corporation 82371SB PIIX3 ISA [Natoma/Triton II] +00:01.1 IDE interface: Intel Corporation 82371AB/EB/MB PIIX4 IDE (rev 01) +00:02.0 VGA compatible controller: InnoTek Systemberatung GmbH VirtualBox Graphics Adapter +00:03.0 Ethernet controller: Advanced Micro Devices [AMD] 79c970 [PCnet32 LANCE] (rev 40) +00:04.0 System peripheral: InnoTek Systemberatung GmbH VirtualBox Guest Service +00:05.0 Multimedia audio controller: Intel Corporation 82801AA AC'97 Audio Controller (rev 01) +00:06.0 USB controller: Apple Inc. KeyLargo/Intrepid USB +00:07.0 Bridge: Intel Corporation 82371AB/EB/MB PIIX4 ACPI (rev 08) +---Mon, 06 May 2013 12:38:19 +0000 GMT--- Executing: lsusb +Bus 001 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub +Bus 001 Device 002: ID 80ee:0021 VirtualBox USB Tablet +---Mon, 06 May 2013 12:38:19 +0000 GMT--- Reading: /proc/net/dev +Inter-| Receive | Transmit + face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed + lo: 548340 347 0 0 0 0 0 0 548340 347 0 0 0 0 0 0 + eth0: 2710 14 0 0 0 0 0 0 11766 90 0 0 0 0 0 0 +---Mon, 06 May 2013 12:38:19 +0000 GMT--- Executing: ifconfig lo 2>/dev/null +lo Link encap:Local Loopback + inet addr:127.0.0.1 Mask:255.0.0.0 + inet6 addr: ::1/128 Scope:Host + UP LOOPBACK RUNNING MTU:16436 Metric:1 + RX packets:347 errors:0 dropped:0 overruns:0 frame:0 + TX packets:347 errors:0 dropped:0 overruns:0 carrier:0 + collisions:0 txqueuelen:0 + RX bytes:548340 (535.4 KiB) TX bytes:548340 (535.4 KiB) +---Mon, 06 May 2013 12:38:19 +0000 GMT--- Executing: ifconfig eth0 2>/dev/null +eth0 Link encap:Ethernet HWaddr 08:00:27:da:5a:52 + inet addr:10.0.2.15 Bcast:10.0.2.255 Mask:255.255.255.0 + inet6 addr: fe80::a00:27ff:feda:5a52/64 Scope:Link + UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 + RX packets:14 errors:0 dropped:0 overruns:0 frame:0 + TX packets:90 errors:0 dropped:0 overruns:0 carrier:0 + collisions:0 txqueuelen:1000 + RX bytes:2710 (2.6 KiB) TX bytes:11766 (11.4 KiB) + Interrupt:10 Base address:0xd020 +---Mon, 06 May 2013 12:38:19 +0000 GMT--- Reading: /proc/meminfo +MemTotal: 1027016 kB +MemFree: 416792 kB +Buffers: 27908 kB +Cached: 240008 kB +SwapCached: 0 kB +Active: 339608 kB +Inactive: 213396 kB +Active(anon): 285704 kB +Inactive(anon): 312 kB +Active(file): 53904 kB +Inactive(file): 213084 kB +Unevictable: 0 kB +Mlocked: 0 kB +SwapTotal: 392188 kB +SwapFree: 392188 kB +Dirty: 1032 kB +Writeback: 0 kB +AnonPages: 285032 kB +Mapped: 78396 kB +Shmem: 972 kB +Slab: 24632 kB +SReclaimable: 12076 kB +SUnreclaim: 12556 kB +KernelStack: 2272 kB +PageTables: 18520 kB +NFS_Unstable: 0 kB +Bounce: 0 kB +WritebackTmp: 0 kB +CommitLimit: 905696 kB +Committed_AS: 1393264 kB +VmallocTotal: 34359738367 kB +VmallocUsed: 5092 kB +VmallocChunk: 34359733275 kB +HardwareCorrupted: 0 kB +AnonHugePages: 0 kB +HugePages_Total: 0 +HugePages_Free: 0 +HugePages_Rsvd: 0 +HugePages_Surp: 0 +Hugepagesize: 2048 kB +DirectMap4k: 40896 kB +DirectMap2M: 1007616 kB +---Mon, 06 May 2013 12:38:19 +0000 GMT--- Reading: /proc/swaps +Filename Type Size Used Priority +/dev/sda5 partition 392188 0 -1 +---Mon, 06 May 2013 12:38:19 +0000 GMT--- Executing: df -k -P 2>/dev/null +Filesystem 1024-blocks Used Available Capacity Mounted on +rootfs 7867856 3799840 3668352 51% / +udev 10240 0 10240 0% /dev +tmpfs 102704 612 102092 1% /run +/dev/disk/by-uuid/ba660f60-9c33-4be6-b545-4919e9e0cfcd 7867856 3799840 3668352 51% / +tmpfs 5120 0 5120 0% /run/lock +tmpfs 283840 224 283616 1% /run/shm +/dev/sr0 58094 58094 0 100% /media/cdrom0 +---Mon, 06 May 2013 12:38:19 +0000 GMT--- Executing: df -i -P 2>/dev/null +Filesystem Inodes IUsed IFree IUse% Mounted on +rootfs 499712 152037 347675 31% / +udev 126863 358 126505 1% /dev +tmpfs 128377 326 128051 1% /run +/dev/disk/by-uuid/ba660f60-9c33-4be6-b545-4919e9e0cfcd 499712 152037 347675 31% / +tmpfs 128377 2 128375 1% /run/lock +tmpfs 128377 6 128371 1% /run/shm +/dev/sr0 0 0 0 - /media/cdrom0 +---Mon, 06 May 2013 12:38:19 +0000 GMT--- Executing: mount +sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime) +proc on /proc type proc (rw,nosuid,nodev,noexec,relatime) +udev on /dev type devtmpfs (rw,relatime,size=10240k,nr_inodes=126863,mode=755) +devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000) +tmpfs on /run type tmpfs (rw,nosuid,noexec,relatime,size=102704k,mode=755) +/dev/disk/by-uuid/ba660f60-9c33-4be6-b545-4919e9e0cfcd on / type ext4 (rw,relatime,errors=remount-ro,user_xattr,barrier=1,data=ordered) +tmpfs on /run/lock type tmpfs (rw,nosuid,nodev,noexec,relatime,size=5120k) +tmpfs on /run/shm type tmpfs (rw,nosuid,nodev,noexec,relatime,size=283840k) +rpc_pipefs on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw,relatime) +binfmt_misc on /proc/sys/fs/binfmt_misc type binfmt_misc (rw,nosuid,nodev,noexec,relatime) +/dev/sr0 on /media/cdrom0 type iso9660 (ro,nosuid,nodev,noexec,relatime,user=mietekn) +---Mon, 06 May 2013 12:38:19 +0000 GMT--- Reading: /proc/loadavg +0.34 0.36 0.15 1/283 3745 diff --git a/sources/sample/logs/log_sf.txt b/sources/sample/logs/log_sf.txt new file mode 100644 index 0000000..a1f6231 --- /dev/null +++ b/sources/sample/logs/log_sf.txt @@ -0,0 +1,697 @@ +---Mon, 03 Jun 2013 11:37:11 +0000 GMT--- Reading: /etc/centos-release +CentOS release 6.3 (Final) +---Mon, 03 Jun 2013 11:37:11 +0000 GMT--- Reading: /proc/sys/kernel/hostname +sfp-web-6.v30.ch3.sourceforge.com +---Mon, 03 Jun 2013 11:37:11 +0000 GMT--- Executing: uname -r +2.6.32-358.6.1.el6.sog20130514.x86_64 +---Mon, 03 Jun 2013 11:37:11 +0000 GMT--- Executing: uname -v +#1 SMP Tue May 14 17:31:39 UTC 2013 +---Mon, 03 Jun 2013 11:37:12 +0000 GMT--- Executing: uname -m +x86_64 +---Mon, 03 Jun 2013 11:37:12 +0000 GMT--- Reading: /proc/uptime +1694267.18 4577690.73 +---Mon, 03 Jun 2013 11:37:12 +0000 GMT--- Executing: who + +---Mon, 03 Jun 2013 11:37:12 +0000 GMT--- Reading: /proc/cpuinfo +processor : 0 +vendor_id : GenuineIntel +cpu family : 6 +model : 13 +model name : QEMU Virtual CPU version (cpu64-rhel6) +stepping : 3 +cpu MHz : 1994.999 +cache size : 4096 KB +fpu : yes +fpu_exception : yes +cpuid level : 4 +wp : yes +flags : fpu de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pse36 clflush mmx fxsr sse sse2 syscall nx lm unfair_spinlock pni cx16 hypervisor lahf_lm +bogomips : 3989.99 +clflush size : 64 +cache_alignment : 64 +address sizes : 44 bits physical, 48 bits virtual +power management: + +processor : 1 +vendor_id : GenuineIntel +cpu family : 6 +model : 13 +model name : QEMU Virtual CPU version (cpu64-rhel6) +stepping : 3 +cpu MHz : 1994.999 +cache size : 4096 KB +fpu : yes +fpu_exception : yes +cpuid level : 4 +wp : yes +flags : fpu de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pse36 clflush mmx fxsr sse sse2 syscall nx lm unfair_spinlock pni cx16 hypervisor lahf_lm +bogomips : 3989.99 +clflush size : 64 +cache_alignment : 64 +address sizes : 44 bits physical, 48 bits virtual +power management: + +processor : 2 +vendor_id : GenuineIntel +cpu family : 6 +model : 13 +model name : QEMU Virtual CPU version (cpu64-rhel6) +stepping : 3 +cpu MHz : 1994.999 +cache size : 4096 KB +fpu : yes +fpu_exception : yes +cpuid level : 4 +wp : yes +flags : fpu de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pse36 clflush mmx fxsr sse sse2 syscall nx lm unfair_spinlock pni cx16 hypervisor lahf_lm +bogomips : 3989.99 +clflush size : 64 +cache_alignment : 64 +address sizes : 44 bits physical, 48 bits virtual +power management: + +processor : 3 +vendor_id : GenuineIntel +cpu family : 6 +model : 13 +model name : QEMU Virtual CPU version (cpu64-rhel6) +stepping : 3 +cpu MHz : 1994.999 +cache size : 4096 KB +fpu : yes +fpu_exception : yes +cpuid level : 4 +wp : yes +flags : fpu de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pse36 clflush mmx fxsr sse sse2 syscall nx lm unfair_spinlock pni cx16 hypervisor lahf_lm +bogomips : 3989.99 +clflush size : 64 +cache_alignment : 64 +address sizes : 44 bits physical, 48 bits virtual +power management: + +processor : 4 +vendor_id : GenuineIntel +cpu family : 6 +model : 13 +model name : QEMU Virtual CPU version (cpu64-rhel6) +stepping : 3 +cpu MHz : 1994.999 +cache size : 4096 KB +fpu : yes +fpu_exception : yes +cpuid level : 4 +wp : yes +flags : fpu de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pse36 clflush mmx fxsr sse sse2 syscall nx lm unfair_spinlock pni cx16 hypervisor lahf_lm +bogomips : 3989.99 +clflush size : 64 +cache_alignment : 64 +address sizes : 44 bits physical, 48 bits virtual +power management: + +processor : 5 +vendor_id : GenuineIntel +cpu family : 6 +model : 13 +model name : QEMU Virtual CPU version (cpu64-rhel6) +stepping : 3 +cpu MHz : 1994.999 +cache size : 4096 KB +fpu : yes +fpu_exception : yes +cpuid level : 4 +wp : yes +flags : fpu de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pse36 clflush mmx fxsr sse sse2 syscall nx lm unfair_spinlock pni cx16 hypervisor lahf_lm +bogomips : 3989.99 +clflush size : 64 +cache_alignment : 64 +address sizes : 44 bits physical, 48 bits virtual +power management: + +processor : 6 +vendor_id : GenuineIntel +cpu family : 6 +model : 13 +model name : QEMU Virtual CPU version (cpu64-rhel6) +stepping : 3 +cpu MHz : 1994.999 +cache size : 4096 KB +fpu : yes +fpu_exception : yes +cpuid level : 4 +wp : yes +flags : fpu de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pse36 clflush mmx fxsr sse sse2 syscall nx lm unfair_spinlock pni cx16 hypervisor lahf_lm +bogomips : 3989.99 +clflush size : 64 +cache_alignment : 64 +address sizes : 44 bits physical, 48 bits virtual +power management: + +processor : 7 +vendor_id : GenuineIntel +cpu family : 6 +model : 13 +model name : QEMU Virtual CPU version (cpu64-rhel6) +stepping : 3 +cpu MHz : 1994.999 +cache size : 4096 KB +fpu : yes +fpu_exception : yes +cpuid level : 4 +wp : yes +flags : fpu de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pse36 clflush mmx fxsr sse sse2 syscall nx lm unfair_spinlock pni cx16 hypervisor lahf_lm +bogomips : 3989.99 +clflush size : 64 +cache_alignment : 64 +address sizes : 44 bits physical, 48 bits virtual +power management: + +---Mon, 03 Jun 2013 11:37:12 +0000 GMT--- Executing: pidof -s mysqld + +---Mon, 03 Jun 2013 11:37:12 +0000 GMT--- Executing: lspci +00:00.0 Host bridge: Intel Corporation 440FX - 82441FX PMC [Natoma] (rev 02) +00:01.0 ISA bridge: Intel Corporation 82371SB PIIX3 ISA [Natoma/Triton II] +00:01.1 IDE interface: Intel Corporation 82371SB PIIX3 IDE [Natoma/Triton II] +00:01.2 USB controller: Intel Corporation 82371SB PIIX3 USB [Natoma/Triton II] (rev 01) +00:01.3 Bridge: Intel Corporation 82371AB/EB/MB PIIX4 ACPI (rev 03) +00:03.0 Ethernet controller: Red Hat, Inc Virtio network device +00:04.0 RAM memory: Red Hat, Inc Virtio memory balloon +---Mon, 03 Jun 2013 11:37:12 +0000 GMT--- Reading: /proc/scsi/scsi +Attached devices: +Host: scsi0 Channel: 00 Id: 00 Lun: 00 + Vendor: ATA Model: QEMU HARDDISK Rev: 0.12 + Type: Direct-Access ANSI SCSI revision: 05 +---Mon, 03 Jun 2013 11:37:12 +0000 GMT--- Executing: pidof -s explorer.exe + +---Mon, 03 Jun 2013 11:37:12 +0000 GMT--- Reading: /home/project-web/phpsysinfo/htdocs/phpsysinfo/data/quotas.txt +Mon Dec 6 09:00:00 EST 2004 + 1K Block limits File limits +User used soft hard grace used soft hard grace +cherylstaff-- 2755724 0 0 15678 0 0 +brucestaff -- 5738512 0 0 7830 0 0 +---Mon, 03 Jun 2013 11:37:12 +0000 GMT--- Executing: lsusb + +---Mon, 03 Jun 2013 11:37:12 +0000 GMT--- Reading: /proc/net/dev +Inter-| Receive | Transmit + face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed + lo:27320003601847 234655896121 0 0 0 0 0 0 27320003601847 234655896121 0 0 0 0 0 0 + eth0:4165329584450 11931631683 0 0 0 0 0 0 3108966577870 13127032084 0 0 0 0 0 0 +---Mon, 03 Jun 2013 11:37:12 +0000 GMT--- Executing: ifconfig lo 2>/dev/null +lo Link encap:Local Loopback + inet addr:127.0.0.1 Mask:255.0.0.0 + inet6 addr: ::1/128 Scope:Host + UP LOOPBACK RUNNING MTU:16436 Metric:1 + RX packets:234655903698 errors:0 dropped:0 overruns:0 frame:0 + TX packets:234655903698 errors:0 dropped:0 overruns:0 carrier:0 + collisions:0 txqueuelen:0 + RX bytes:27320004466384 (24.8 TiB) TX bytes:27320004466384 (24.8 TiB) +---Mon, 03 Jun 2013 11:37:12 +0000 GMT--- Executing: ifconfig eth0 2>/dev/null +eth0 Link encap:Ethernet HWaddr 02:00:AC:1D:1E:42 + inet addr:172.29.30.66 Bcast:172.29.30.255 Mask:255.255.255.0 + inet6 addr: fe80::acff:fe1d:1e42/64 Scope:Link + UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 + RX packets:11931632533 errors:0 dropped:0 overruns:0 frame:0 + TX packets:13127033096 errors:0 dropped:0 overruns:0 carrier:0 + collisions:0 txqueuelen:1000 + RX bytes:4165329803095 (3.7 TiB) TX bytes:3108966767181 (2.8 TiB) +---Mon, 03 Jun 2013 11:37:12 +0000 GMT--- Reading: /proc/meminfo +MemTotal: 8059140 kB +MemFree: 648372 kB +Buffers: 22880 kB +Cached: 4231260 kB +SwapCached: 2492 kB +Active: 3013816 kB +Inactive: 3212256 kB +Active(anon): 946280 kB +Inactive(anon): 1026516 kB +Active(file): 2067536 kB +Inactive(file): 2185740 kB +Unevictable: 0 kB +Mlocked: 0 kB +SwapTotal: 1015800 kB +SwapFree: 963348 kB +Dirty: 13700 kB +Writeback: 4 kB +AnonPages: 1969672 kB +Mapped: 175844 kB +Shmem: 812 kB +Slab: 1073848 kB +SReclaimable: 711992 kB +SUnreclaim: 361856 kB +KernelStack: 2928 kB +PageTables: 33512 kB +NFS_Unstable: 148 kB +Bounce: 0 kB +WritebackTmp: 0 kB +CommitLimit: 5045368 kB +Committed_AS: 3170052 kB +VmallocTotal: 34359738367 kB +VmallocUsed: 26224 kB +VmallocChunk: 34359683252 kB +HardwareCorrupted: 0 kB +AnonHugePages: 77824 kB +HugePages_Total: 0 +HugePages_Free: 0 +HugePages_Rsvd: 0 +HugePages_Surp: 0 +Hugepagesize: 2048 kB +DirectMap4k: 8180 kB +DirectMap2M: 8380416 kB +---Mon, 03 Jun 2013 11:37:12 +0000 GMT--- Reading: /proc/swaps +Filename Type Size Used Priority +/dev/dm-0 partition 1015800 52452 -1 +---Mon, 03 Jun 2013 11:37:12 +0000 GMT--- Executing: df -k -P 2>/dev/null + +---Mon, 03 Jun 2013 11:37:12 +0000 GMT--- Executing: df -i -P 2>/dev/null + +---Mon, 03 Jun 2013 11:37:12 +0000 GMT--- Reading: /home/project-web/phpsysinfo/htdocs/phpsysinfo/data/smart0.txt +smartctl version 5.38 [x86_64-redhat-linux-gnu] Copyright (C) 2002-8 Bruce Allen +Home page is http://smartmontools.sourceforge.net/ + +Device: SEAGATE ST3146855LW Version: 0003 +Serial number: 3LN1GA[rest of serial number redacted] +Device type: disk +Transport protocol: Parallel SCSI (SPI-4) +Local Time is: Sat Jan 30 21:59:56 2010 CET +Device supports SMART and is Enabled +Temperature Warning Enabled +SMART Health Status: OK + +Current Drive Temperature: 39 C +Drive Trip Temperature: 68 C +Elements in grown defect list: 0 +Vendor (Seagate) cache information + Blocks sent to initiator = 1490558074 + Blocks received from initiator = 624662611 + Blocks read from cache and sent to initiator = 2900209651 + Number of read and write commands whose size <= segment size = 386699414 + Number of read and write commands whose size > segment size = 28 +Vendor (Seagate/Hitachi) factory information + number of hours powered up = 14959.20 + number of minutes until next internal SMART test = 44 + +Error counter log: + Errors Corrected by Total Correction Gigabytes Total + ECC rereads/ errors algorithm processed uncorrected + fast | delayed rewrites corrected invocations [10^9 bytes] errors +read: 6663270 0 0 6663270 6663270 5100.626 0 +write: 0 0 0 0 0 12594895028.099 0 +verify: 22626 0 0 22626 22626 28.314 0 + +Non-medium error count: 3 + +[GLTSD (Global Logging Target Save Disable) set. Enable Save with '-S on'] + +SMART Self-test log +Num Test Status segment LifeTime LBA_first_err [SK ASC ASQ] + Description number (hours) +# 1 Background long Interrupted ('-X' switch) - 14371 - [- - -] + +Long (extended) Self Test duration: 1367 seconds [22.8 minutes] +---Mon, 03 Jun 2013 11:37:12 +0000 GMT--- Executing: mount +proc on /proc type proc (rw) +---Mon, 03 Jun 2013 11:37:12 +0000 GMT--- Reading: /proc/loadavg +14.01 16.10 16.01 18/358 6013 +---Mon, 03 Jun 2013 11:37:12 +0000 GMT--- Reading: /home/project-web/phpsysinfo/htdocs/phpsysinfo/data/mdstat.txt +Personalities : [linear] [raid0] [raid1] [raid5] [hsm] +read_ahead 1024 sectors +md0 : active raid5 sdd1[3] sdc6[2] sdb6[1] sda5[0] 633984 blocks + level 5, 32k chunk, algorithm 2 [4/4] [UUUU] +unused devices: +---Mon, 03 Jun 2013 11:37:13 +0000 GMT--- Reading: /home/project-web/phpsysinfo/htdocs/phpsysinfo/data/bat_info.txt +present: yes +design capacity: 50000 mWh +last full capacity: 50000 mWh +battery technology: rechargeable +design voltage: 10000 mV +design capacity warning: 100 mWh +design capacity low: 50 mWh +capacity granularity 1: 1 mWh +capacity granularity 2: 1 mWh +model number: 1 +serial number: 0 +battery type: VBOX +OEM info: innotek +---Mon, 03 Jun 2013 11:37:13 +0000 GMT--- Reading: /home/project-web/phpsysinfo/htdocs/phpsysinfo/data/bat_state.txt +present: yes +capacity state: ok +charging state: charged +present rate: 0 mW +remaining capacity: 50000 mWh +present voltage: 10000 mV +---Mon, 03 Jun 2013 11:37:14 +0000 GMT--- Reading: /home/project-web/phpsysinfo/htdocs/phpsysinfo/data/ipmiinfo.txt +BB +1.2V Vtt | 1.197 | Volts | ok | na | 1.096 | 1.134 | 1.285 | 1.323 | na +BB +1.5V AUX | 1.490 | Volts | ok | na | 1.334 | 1.373 | 1.622 | 1.669 | na +BB +1.5V | 1.469 | Volts | ok | na | 1.326 | 1.365 | 1.625 | 1.677 | na +BB +1.8V | 1.802 | Volts | ok | na | 1.638 | 1.689 | 1.926 | 1.988 | na +BB +3.3V | 3.320 | Volts | ok | na | 2.941 | 3.027 | 3.578 | 3.681 | na +BB +3.3V STB | 3.337 | Volts | ok | na | 3.027 | 3.113 | 3.509 | 3.612 | na +BB +1.5V ESB | 1.490 | Volts | ok | na | 1.357 | 1.404 | 1.591 | 1.638 | na +BB +5V | 5.122 | Volts | ok | na | 4.446 | 4.576 | 5.408 | 5.564 | na +BB +12V AUX | 12.090 | Volts | ok | na | 10.416 | 10.726 | 13.144 | 13.578 | na +BB 0.9V | 0.902 | Volts | ok | na | 0.811 | 0.835 | 0.950 | 0.979 | na +Baseboard Temp | 29.000 | degrees C | ok | na | 5.000 | 10.000 | 61.000 | 66.000 | na +P1 Therm Margin | -32.000 | degrees C | ok | na | na | na | na | na | na +P1 Therm Ctrl % | 0.000 | unspecified | ok | na | na | na | na | 49.530 | na +Proc 1 Vcc | 1.203 | Volts | ok | na | na | na | na | na | na +Power Unit | 0x0 | discrete | 0x0000| na | na | na | na | na | na +BMC Watchdog | 0x0 | discrete | 0x0000| na | na | na | na | na | na +Scrty Violation | 0x0 | discrete | 0x0000| na | na | na | na | na | na +F-P Diag Int | 0x0 | discrete | 0x0000| na | na | na | na | na | na +System Event Log | 0x0 | discrete | 0x0000| na | na | na | na | na | na +Session Audit | 0x0 | discrete | 0x0000| na | na | na | na | na | na +System Event | 0x0 | discrete | 0x0000| na | na | na | na | na | na +BB Vbat | 0x0 | discrete | 0x0000| na | na | na | na | na | na +SysACPIPowerStat | 0x0 | discrete | 0x0100| na | na | na | na | na | na +Button | 0x0 | discrete | 0x0000| na | na | na | na | na | na +SMI Timeout | 0x0 | discrete | 0x0100| na | na | na | na | na | na +NMI State | 0x0 | discrete | 0x0100| na | na | na | na | na | na +SMI State | 0x0 | discrete | 0x0100| na | na | na | na | na | na +Processor 1 Stat | 0x0 | discrete | 0x8000| na | na | na | na | na | na +Processor 2 Stat | 0x0 | discrete | 0x0000| na | na | na | na | na | na +PCIe Link0 | 0x0 | discrete | 0x0000| na | na | na | na | na | na +PCIe Link1 | 0x0 | discrete | 0x0000| na | na | na | na | na | na +PCIe Link2 | 0x0 | discrete | 0x0000| na | na | na | na | na | na +PCIe Link3 | 0x0 | discrete | 0x0000| na | na | na | na | na | na +PCIe Link4 | 0x0 | discrete | 0x0000| na | na | na | na | na | na +PCIe Link5 | 0x0 | discrete | 0x0000| na | na | na | na | na | na +PCIe Link6 | 0x0 | discrete | 0x0000| na | na | na | na | na | na +PCIe Link7 | 0x0 | discrete | 0x0000| na | na | na | na | na | na +PCIe Link8 | 0x0 | discrete | 0x0000| na | na | na | na | na | na +PCIe Link9 | 0x0 | discrete | 0x0000| na | na | na | na | na | na +PCIe Link10 | 0x0 | discrete | 0x0000| na | na | na | na | na | na +PCIe Link11 | 0x0 | discrete | 0x0000| na | na | na | na | na | na +PCIe Link12 | 0x0 | discrete | 0x0000| na | na | na | na | na | na +PCIe Link13 | 0x0 | discrete | 0x0000| na | na | na | na | na | na +Proc1 VRD Hot | 0x0 | discrete | 0x0000| na | na | na | na | na | na +CPU1 Vcc OOR | 0x0 | discrete | 0x0000| na | na | na | na | na | na +CPU Popula Error | 0x0 | discrete | 0x0000| na | na | na | na | na | na +DIMM A1 | 0x0 | discrete | 0x0400| na | na | na | na | na | na +DIMM A2 | 0x0 | discrete | 0x0000| na | na | na | na | na | na +DIMM B1 | 0x0 | discrete | 0x0400| na | na | na | na | na | na +DIMM B2 | 0x0 | discrete | 0x0000| na | na | na | na | na | na +DIMM C1 | 0x0 | discrete | 0x0000| na | na | na | na | na | na +DIMM C2 | 0x0 | discrete | 0x0000| na | na | na | na | na | na +DIMM D1 | 0x0 | discrete | 0x0000| na | na | na | na | na | na +DIMM D2 | 0x0 | discrete | 0x0000| na | na | na | na | na | na +MemA Error | 0x0 | discrete | 0x0000| na | na | na | na | na | na +MemB Error | 0x0 | discrete | 0x0000| na | na | na | na | na | na +MemC Error | 0x0 | discrete | 0x0000| na | na | na | na | na | na +MemD Error | 0x0 | discrete | 0x0000| na | na | na | na | na | na +B0 Sparing Enb | na | discrete | na | na | na | na | na | na | na +B0 Spare Redun | na | discrete | na | na | na | na | na | na | na +B1 Sparing Enb | na | discrete | na | na | na | na | na | na | na +B1 Spare Redun | na | discrete | na | na | na | na | na | na | na +B01 Mirror Enbl | na | discrete | na | na | na | na | na | na | na +B01 MirrorRedun | na | discrete | na | na | na | na | na | na | na +---Mon, 03 Jun 2013 11:37:14 +0000 GMT--- Executing: ps axo pid,ppid,pmem,args +PID PPID %MEM COMMAND + 1 0 0.0 /sbin/init + 2 0 0.0 [kthreadd] + 3 2 0.0 [migration/0] + 4 2 0.0 [ksoftirqd/0] + 5 2 0.0 [migration/0] + 6 2 0.0 [watchdog/0] + 7 2 0.0 [migration/1] + 8 2 0.0 [migration/1] + 9 2 0.0 [ksoftirqd/1] + 10 2 0.0 [watchdog/1] + 11 2 0.0 [migration/2] + 12 2 0.0 [migration/2] + 13 2 0.0 [ksoftirqd/2] + 14 2 0.0 [watchdog/2] + 15 2 0.0 [migration/3] + 16 2 0.0 [migration/3] + 17 2 0.0 [ksoftirqd/3] + 18 2 0.0 [watchdog/3] + 19 2 0.0 [migration/4] + 20 2 0.0 [migration/4] + 21 2 0.0 [ksoftirqd/4] + 22 2 0.0 [watchdog/4] + 23 2 0.0 [migration/5] + 24 2 0.0 [migration/5] + 25 2 0.0 [ksoftirqd/5] + 26 2 0.0 [watchdog/5] + 27 2 0.0 [migration/6] + 28 2 0.0 [migration/6] + 29 2 0.0 [ksoftirqd/6] + 30 2 0.0 [watchdog/6] + 31 2 0.0 [migration/7] + 32 2 0.0 [migration/7] + 33 2 0.0 [ksoftirqd/7] + 34 2 0.0 [watchdog/7] + 35 2 0.0 [events/0] + 36 2 0.0 [events/1] + 37 2 0.0 [events/2] + 38 2 0.0 [events/3] + 39 2 0.0 [events/4] + 40 2 0.0 [events/5] + 41 2 0.0 [events/6] + 42 2 0.0 [events/7] + 43 2 0.0 [cgroup] + 44 2 0.0 [khelper] + 45 2 0.0 [netns] + 46 2 0.0 [async/mgr] + 47 2 0.0 [pm] + 48 2 0.0 [sync_supers] + 49 2 0.0 [bdi-default] + 50 2 0.0 [kintegrityd/0] + 51 2 0.0 [kintegrityd/1] + 52 2 0.0 [kintegrityd/2] + 53 2 0.0 [kintegrityd/3] + 54 2 0.0 [kintegrityd/4] + 55 2 0.0 [kintegrityd/5] + 56 2 0.0 [kintegrityd/6] + 57 2 0.0 [kintegrityd/7] + 58 2 0.0 [kblockd/0] + 59 2 0.0 [kblockd/1] + 60 2 0.0 [kblockd/2] + 61 2 0.0 [kblockd/3] + 62 2 0.0 [kblockd/4] + 63 2 0.0 [kblockd/5] + 64 2 0.0 [kblockd/6] + 65 2 0.0 [kblockd/7] + 66 2 0.0 [ata/0] + 67 2 0.0 [ata/1] + 68 2 0.0 [ata/2] + 69 2 0.0 [ata/3] + 70 2 0.0 [ata/4] + 71 2 0.0 [ata/5] + 72 2 0.0 [ata/6] + 73 2 0.0 [ata/7] + 74 2 0.0 [ata_aux] + 75 2 0.0 [ksuspend_usbd] + 76 2 0.0 [khubd] + 77 2 0.0 [kseriod] + 78 2 0.0 [md/0] + 79 2 0.0 [md/1] + 80 2 0.0 [md/2] + 81 2 0.0 [md/3] + 82 2 0.0 [md/4] + 83 2 0.0 [md/5] + 84 2 0.0 [md/6] + 85 2 0.0 [md/7] + 86 2 0.0 [md_misc/0] + 87 2 0.0 [md_misc/1] + 88 2 0.0 [md_misc/2] + 89 2 0.0 [md_misc/3] + 90 2 0.0 [md_misc/4] + 91 2 0.0 [md_misc/5] + 92 2 0.0 [md_misc/6] + 93 2 0.0 [md_misc/7] + 94 2 0.0 [khungtaskd] + 95 2 0.0 [kswapd0] + 96 2 0.0 [ksmd] + 97 2 0.0 [khugepaged] + 98 2 0.0 [aio/0] + 99 2 0.0 [aio/1] + 100 2 0.0 [aio/2] + 101 2 0.0 [aio/3] + 102 2 0.0 [aio/4] + 103 2 0.0 [aio/5] + 104 2 0.0 [aio/6] + 105 2 0.0 [aio/7] + 106 2 0.0 [crypto/0] + 107 2 0.0 [crypto/1] + 108 2 0.0 [crypto/2] + 109 2 0.0 [crypto/3] + 110 2 0.0 [crypto/4] + 111 2 0.0 [crypto/5] + 112 2 0.0 [crypto/6] + 113 2 0.0 [crypto/7] + 118 2 0.0 [kthrotld/0] + 119 2 0.0 [kthrotld/1] + 120 2 0.0 [kthrotld/2] + 121 2 0.0 [kthrotld/3] + 122 2 0.0 [kthrotld/4] + 123 2 0.0 [kthrotld/5] + 124 2 0.0 [kthrotld/6] + 125 2 0.0 [kthrotld/7] + 127 2 0.0 [kpsmoused] + 128 2 0.0 [usbhid_resumer] + 159 2 0.0 [kstriped] + 257 2 0.0 [scsi_eh_0] + 258 2 0.0 [scsi_eh_1] + 313 2 0.0 [kdmflush] + 315 2 0.0 [kdmflush] + 330 4796 1.8 /usr/sbin/httpd + 335 2 0.0 [flush-253:1] + 349 2 0.0 [jbd2/dm-1-8] + 350 2 0.0 [ext4-dio-unwrit] + 351 2 0.0 [ext4-dio-unwrit] + 352 2 0.0 [ext4-dio-unwrit] + 353 2 0.0 [ext4-dio-unwrit] + 354 2 0.0 [ext4-dio-unwrit] + 355 2 0.0 [ext4-dio-unwrit] + 356 2 0.0 [ext4-dio-unwrit] + 357 2 0.0 [ext4-dio-unwrit] + 442 1 0.0 /sbin/udevd -d + 610 2 0.0 [virtio-net] + 624 2 0.0 [vballoon] + 726 30335 0.0 ping 10.0.2.2 + 773 2 0.0 [kdmflush] + 776 2 0.0 [kdmflush] + 779 2 0.0 [kdmflush] + 782 442 0.0 /sbin/udevd -d + 784 2 0.0 [kdmflush] + 812 2 0.0 [flush-253:4] + 837 2 0.0 [kjournald] + 838 2 0.0 [jbd2/dm-2-8] + 839 2 0.0 [ext4-dio-unwrit] + 840 2 0.0 [ext4-dio-unwrit] + 841 2 0.0 [ext4-dio-unwrit] + 842 2 0.0 [ext4-dio-unwrit] + 843 2 0.0 [ext4-dio-unwrit] + 844 2 0.0 [ext4-dio-unwrit] + 845 2 0.0 [ext4-dio-unwrit] + 846 2 0.0 [ext4-dio-unwrit] + 847 2 0.0 [jbd2/dm-3-8] + 848 2 0.0 [ext4-dio-unwrit] + 849 2 0.0 [ext4-dio-unwrit] + 850 2 0.0 [ext4-dio-unwrit] + 851 2 0.0 [ext4-dio-unwrit] + 852 2 0.0 [ext4-dio-unwrit] + 853 2 0.0 [ext4-dio-unwrit] + 854 2 0.0 [ext4-dio-unwrit] + 855 2 0.0 [ext4-dio-unwrit] + 856 2 0.0 [jbd2/dm-4-8] + 857 2 0.0 [ext4-dio-unwrit] + 858 2 0.0 [ext4-dio-unwrit] + 859 2 0.0 [ext4-dio-unwrit] + 860 2 0.0 [ext4-dio-unwrit] + 861 2 0.0 [ext4-dio-unwrit] + 862 2 0.0 [ext4-dio-unwrit] + 863 2 0.0 [ext4-dio-unwrit] + 864 2 0.0 [ext4-dio-unwrit] + 865 2 0.0 [jbd2/dm-5-8] + 866 2 0.0 [ext4-dio-unwrit] + 867 2 0.0 [ext4-dio-unwrit] + 868 2 0.0 [ext4-dio-unwrit] + 869 2 0.0 [ext4-dio-unwrit] + 870 2 0.0 [ext4-dio-unwrit] + 871 2 0.0 [ext4-dio-unwrit] + 872 2 0.0 [ext4-dio-unwrit] + 873 2 0.0 [ext4-dio-unwrit] + 934 2 0.0 [kauditd] + 956 330 0.0 ping 10.0.2.2 + 1132 1 0.0 auditd + 1150 1 0.0 /sbin/portreserve + 1158 2 0.0 [rpciod/0] + 1159 2 0.0 [rpciod/1] + 1160 2 0.0 [rpciod/2] + 1161 2 0.0 [rpciod/3] + 1162 2 0.0 [rpciod/4] + 1163 2 0.0 [rpciod/5] + 1164 2 0.0 [rpciod/6] + 1165 2 0.0 [rpciod/7] + 1174 1 0.0 /sbin/rsyslogd -i /var/run/syslogd.pid -c3 + 1186 1 0.0 irqbalance + 1201 1 0.0 rpcbind + 1219 1 0.0 rpc.statd + 1241 1 0.0 rpc.idmapd + 1364 2 0.0 [flush-253:2] + 2117 30665 0.3 python /home/project-web/tmda/cgi-bin/moin.cgi + 2133 4796 0.5 /usr/sbin/httpd + 2246 4796 0.5 /usr/sbin/httpd + 2302 4796 0.4 /usr/sbin/httpd + 2317 4796 0.5 /usr/sbin/httpd + 2318 4796 0.5 /usr/sbin/httpd + 2336 4796 0.5 /usr/sbin/httpd + 2337 4796 0.5 /usr/sbin/httpd + 2338 4796 0.5 /usr/sbin/httpd + 2339 4796 0.4 /usr/sbin/httpd + 2460 4796 0.5 /usr/sbin/httpd + 2669 4796 0.5 /usr/sbin/httpd + 3375 24425 0.3 python /home/project-web/openucf/cgi-bin/moin.cgi + 4372 4796 0.6 /usr/sbin/httpd + 4429 1 0.0 dbus-daemon --system + 4453 2 0.0 [kslowd000] + 4454 2 0.0 [kslowd001] + 4455 2 0.0 [nfsiod] + 4456 2 0.0 [lockd] + 4481 4796 0.5 /usr/sbin/httpd + 4602 1 0.0 hald + 4603 4602 0.0 hald-runner + 4632 4603 0.0 hald-addon-input: Listening on /dev/input/event1 + 4667 1 0.0 /usr/sbin/nscd + 4682 1 0.0 /usr/sbin/snmpd -LSnd -Lf /dev/null -p /var/run/snmpd.pid -a -c /etc/snmp/snmpd.sfinc-utils.conf + 4694 1 0.0 /usr/sbin/sshd + 4702 1 0.0 xinetd -stayalive -pidfile /var/run/xinetd.pid + 4710 1 0.0 ntpd -u ntp:ntp -p /var/run/ntpd.pid -g + 4726 1 1.4 /usr/local/sbin/omnifuse-projects -odev,allow_other --log-info --json-config=/var/local/config/omnifuse-projects.json --log-file=/var/log/omnifuse-projects.log /chroots/prweb/home/project-web + 4741 1 0.0 /usr/local/sbin/omnifuse-users -odev,allow_other --log-info --json-config=/var/local/config/omnifuse-users.json --log-file=/var/log/omnifuse-users.log /chroots/prweb/home/user-web + 4765 1 0.0 /usr/sbin/abrtd + 4769 2302 0.3 python /home/project-web/openucf/cgi-bin/moin.cgi + 4773 1 0.0 abrt-dump-oops -d /var/spool/abrt -rwx /var/log/messages + 4780 4796 0.3 /usr/sbin/httpd + 4796 1 0.4 /usr/sbin/httpd + 4812 1 0.0 crond + 4867 2 0.0 [flush-0:19] + 4870 1 0.0 /usr/sbin/varnishd -P /var/run/varnish.pid -a :6081,:50025,:50026,:50041 -T 127.0.0.1:6082 -f /etc/varnish/default.vcl -t 120 -u varnish -g varnish -S /etc/varnish/secret -s file,/var/lib/varnish/varnish_storage.bin,1G + 4896 1 0.0 sh -c /usr/bin/varnishncsa -P /var/run/varnishncsa.pid -f | /usr/local/sbin/filter-varnish-log + 4898 4896 3.0 /usr/bin/varnishncsa -P /var/run/varnishncsa.pid -f + 4899 4896 0.0 /usr/bin/perl /usr/local/sbin/filter-varnish-log + 4912 1 0.0 /usr/sbin/atd + 4921 1 0.0 /usr/bin/monit + 4928 24370 0.3 python /home/project-web/openucf/cgi-bin/moin.cgi + 4956 1 0.0 /var/ossec/bin/ossec-execd + 4960 1 0.0 /var/ossec/bin/ossec-agentd + 4964 1 0.0 /var/ossec/bin/ossec-logcollector + 4968 1 0.0 /var/ossec/bin/ossec-syscheckd + 5079 4796 0.4 /usr/sbin/httpd + 5161 4796 0.4 /usr/sbin/httpd + 5656 1 0.0 /sbin/mingetty /dev/tty1 + 5658 1 0.0 /sbin/mingetty /dev/tty2 + 5660 1 0.0 /sbin/mingetty /dev/tty3 + 5661 1 0.0 /sbin/agetty /dev/ttyS0 115200 vt100-nav + 5663 1 0.0 /sbin/mingetty /dev/tty4 + 5665 1 0.0 /sbin/mingetty /dev/tty5 + 5667 1 0.0 /sbin/mingetty /dev/tty6 + 5676 4796 0.4 /usr/sbin/httpd + 5883 4796 1.8 /usr/sbin/httpd + 5969 27819 0.3 python /home/project-web/openucf/cgi-bin/moin.cgi + 6026 5161 0.0 /bin/ps axo pid,ppid,pmem,args + 6043 4796 0.0 /usr/sbin/cronolog --symlink=/var/local/log/error_log /var/local/log/%Y/%m/%d/error.log + 6047 4796 0.0 /usr/sbin/cronolog --symlink=/var/local/log/access_log /var/local/log/%Y/%m/%d/access_log + 6799 2 0.0 [flush-253:5] + 7454 5883 0.0 ping 10.0.2.2 + 9254 442 0.0 /sbin/udevd -d + 9403 1 0.2 /usr/bin/perl /var/local/mastertree/host/sfp-web/scripts/split-varnish-log +13285 4796 0.6 /usr/sbin/httpd +13704 4796 0.5 /usr/sbin/httpd +14612 4796 0.2 /usr/sbin/httpd +14835 4796 0.2 /usr/sbin/httpd +16052 4796 0.4 /usr/sbin/httpd +21740 4870 2.4 /usr/sbin/varnishd -P /var/run/varnish.pid -a :6081,:50025,:50026,:50041 -T 127.0.0.1:6082 -f /etc/varnish/default.vcl -t 120 -u varnish -g varnish -S /etc/varnish/secret -s file,/var/lib/varnish/varnish_storage.bin,1G +24370 4796 0.5 /usr/sbin/httpd +24425 4796 0.4 /usr/sbin/httpd +25544 4796 0.4 /usr/sbin/httpd +27739 4796 0.5 /usr/sbin/httpd +27816 4796 0.4 /usr/sbin/httpd +27819 4796 0.5 /usr/sbin/httpd +29216 4796 0.5 /usr/sbin/httpd +30189 4796 1.8 /usr/sbin/httpd +30335 4796 1.8 /usr/sbin/httpd +30645 30189 0.0 ping 10.0.2.2 +30665 4796 0.5 /usr/sbin/httpd +32343 4796 1.8 /usr/sbin/httpd +32414 32343 0.0 ping 10.0.2.2 diff --git a/sources/sample/main/1-cpuinfo.txt b/sources/sample/main/1-cpuinfo.txt new file mode 100644 index 0000000..4b49180 --- /dev/null +++ b/sources/sample/main/1-cpuinfo.txt @@ -0,0 +1,21 @@ +processor : 0 +vendor_id : GenuineIntel +cpu family : 6 +model : 23 +model name : Intel(R) Core(TM)2 Duo CPU P8600 @ 2.40GHz +stepping : 10 +cpu MHz : 2391.032 +cache size : 64 KB +fdiv_bug : no +hlt_bug : no +f00f_bug : no +coma_bug : no +fpu : yes +fpu_exception : yes +cpuid level : 2 +wp : yes +flags : fpu vme de pse tsc msr mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 constant_tsc up pni monitor +bogomips : 4782.06 +clflush size : 64 +power management: + diff --git a/sources/sample/main/1-dfiP.txt b/sources/sample/main/1-dfiP.txt new file mode 100644 index 0000000..d237d93 --- /dev/null +++ b/sources/sample/main/1-dfiP.txt @@ -0,0 +1,6 @@ +Filesystem Inode IUsati ILib. IUso% Montato su +/dev/sda3 3278576 589607 2688969 18% / +udev 218280 1831 216449 1% /dev +/dev/sda4 0 0 0 - /home/erendil +shm 218280 1 218279 1% /dev/shm +/dev/sda1 18072 52 18020 1% /boot diff --git a/sources/sample/main/1-dfkP.txt b/sources/sample/main/1-dfkP.txt new file mode 100644 index 0000000..78279ea --- /dev/null +++ b/sources/sample/main/1-dfkP.txt @@ -0,0 +1,6 @@ +Filesystem 1024-blocks Used Available Capacity Montato su +/dev/sda3 51613048 13387836 35603404 28% / +udev 10240 148 10092 2% /dev +/dev/sda4 2876529360 784104536 2092424824 28% /home/erendil +shm 1685172 0 1685172 0% /dev/shm +/dev/sda1 69972 37071 29288 56% /boot diff --git a/sources/sample/main/1-mount.txt b/sources/sample/main/1-mount.txt new file mode 100644 index 0000000..f75cdbc --- /dev/null +++ b/sources/sample/main/1-mount.txt @@ -0,0 +1,10 @@ +/dev/sda3 on / type ext3 (rw,noatime) +proc on /proc type proc (rw,nosuid,nodev,noexec,relatime) +sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime) +udev on /dev type tmpfs (rw,nosuid,relatime,size=10240k,mode=755) +devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620) +/dev/sda4 on /home/erendil type reiserfs (rw,noatime) +shm on /dev/shm type tmpfs (rw,noexec,nosuid,nodev) +usbfs on /proc/bus/usb type usbfs (rw,noexec,nosuid,devmode=0664,devgid=85) +binfmt_misc on /proc/sys/fs/binfmt_misc type binfmt_misc (rw,noexec,nosuid,nodev) +/dev/sda1 on /boot type ext2 (rw,noatime) diff --git a/sources/sample/main/README b/sources/sample/main/README new file mode 100644 index 0000000..5f98c18 --- /dev/null +++ b/sources/sample/main/README @@ -0,0 +1,6 @@ +FILE CONTENT OF +cpuinfo cat /proc/cpuinfo +df df -P +mount mount +dev cat /proc/net/dev +swaps cat /proc/swaps diff --git a/sources/sample/main/cpuinfo1.txt b/sources/sample/main/cpuinfo1.txt new file mode 100644 index 0000000..4b49180 --- /dev/null +++ b/sources/sample/main/cpuinfo1.txt @@ -0,0 +1,21 @@ +processor : 0 +vendor_id : GenuineIntel +cpu family : 6 +model : 23 +model name : Intel(R) Core(TM)2 Duo CPU P8600 @ 2.40GHz +stepping : 10 +cpu MHz : 2391.032 +cache size : 64 KB +fdiv_bug : no +hlt_bug : no +f00f_bug : no +coma_bug : no +fpu : yes +fpu_exception : yes +cpuid level : 2 +wp : yes +flags : fpu vme de pse tsc msr mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 constant_tsc up pni monitor +bogomips : 4782.06 +clflush size : 64 +power management: + diff --git a/sources/sample/main/cpuinfo2.txt b/sources/sample/main/cpuinfo2.txt new file mode 100644 index 0000000..e2c8f52 --- /dev/null +++ b/sources/sample/main/cpuinfo2.txt @@ -0,0 +1,12 @@ +Processor : ARMv6-compatible processor rev 7 (v6l) +BogoMIPS : 847.05 +Features : swp half thumb fastmult vfp edsp java tls +CPU implementer : 0x41 +CPU architecture: 7 +CPU variant : 0x0 +CPU part : 0xb76 +CPU revision : 7 + +Hardware : BCM2708 +Revision : 0002 +Serial : 000000000abc0ab1 diff --git a/sources/sample/main/cpuinfo3.txt b/sources/sample/main/cpuinfo3.txt new file mode 100644 index 0000000..cde715d --- /dev/null +++ b/sources/sample/main/cpuinfo3.txt @@ -0,0 +1,17 @@ +Processor : ARMv7 Processor rev 10 (v7l) +processor : 0 +BogoMIPS : 597.12 + +processor : 1 +BogoMIPS : 597.12 + +Features : swp half thumb fastmult vfp edsp thumbee neon vfpv3 +CPU implementer : 0x41 +CPU architecture: 7 +CPU variant : 0x2 +CPU part : 0xc09 +CPU revision : 10 + +Hardware : Tuna +Revision : 0009 +Serial : 01298fc30100203f diff --git a/sources/sample/main/cpuinfo4.txt b/sources/sample/main/cpuinfo4.txt new file mode 100644 index 0000000..ef33a0c --- /dev/null +++ b/sources/sample/main/cpuinfo4.txt @@ -0,0 +1,14 @@ +Processor : ARMv7 Processor rev 1 (v7l) +processor : 0 +BogoMIPS : 1592.52 + +Features : swp half thumb fastmult vfp edsp neon vfpv3 +CPU implementer : 0x41 +CPU architecture: 7 +CPU variant : 0x2 +CPU part : 0xc09 +CPU revision : 1 + +Hardware : SMDKC210 +Revision : 000c +Serial : xxxxxxxxxxxxxxxx diff --git a/sources/sample/main/cpuinfo5.txt b/sources/sample/main/cpuinfo5.txt new file mode 100644 index 0000000..78f54a6 --- /dev/null +++ b/sources/sample/main/cpuinfo5.txt @@ -0,0 +1,12 @@ +Processor : ARMv7 Processor rev 0 (v7l) +BogoMIPS : 366.18 +Features : swp half thumb fastmult vfp edsp neon vfpv3 +CPU implementer : 0x41 +CPU architecture: 7 +CPU variant : 0x0 +CPU part : 0xc08 +CPU revision : 0 + +Hardware : Goldfish +Revision : 0000 +Serial : 0000000000000000 diff --git a/sources/sample/main/cpuinfo6.txt b/sources/sample/main/cpuinfo6.txt new file mode 100644 index 0000000..605fff5 --- /dev/null +++ b/sources/sample/main/cpuinfo6.txt @@ -0,0 +1,12 @@ +Processor : Feroceon 88FR131 rev 1 (v5l) +BogoMIPS : 797.90 +Features : swp half thumb fastmult edsp +CPU implementer : 0x56 +CPU architecture: 5TE +CPU variant : 0x2 +CPU part : 0x131 +CPU revision : 1 + +Hardware : LaCie Internet Space v2 +Revision : 0000 +Serial : 0000000000000000 diff --git a/sources/sample/main/cpuinfo7.txt b/sources/sample/main/cpuinfo7.txt new file mode 100644 index 0000000..3c8e28f --- /dev/null +++ b/sources/sample/main/cpuinfo7.txt @@ -0,0 +1,24 @@ +Processor: ARM926EJ-S rev 0 (v5l) +BogoMIPS: 956.82 +Features: swp half thumb fastmult vfp edsp +CPU implementer: 0x41 +CPU architecture: 5TE +CPU variant: 0x1 +CPU part: 0x926 +CPU revision: 0 +Cache type: write-back +Cache clean: cp15 c7 ops +Cache lockdown: format C +Cache format: Harvard +I size: 32768 +I assoc: 4 +I line length: 32 +I sets: 256 +D size: 32768 +D assoc: 4 +D line length: 32 +D sets: 256 + +Hardware: Feroceon-MV78XX0 +Revision: 0000 +Serial: 0000000000000000 diff --git a/sources/sample/main/cpuinfo8.txt b/sources/sample/main/cpuinfo8.txt new file mode 100644 index 0000000..2c14878 --- /dev/null +++ b/sources/sample/main/cpuinfo8.txt @@ -0,0 +1,17 @@ +system type : Sigma Designs TangoX +processor : 0 +cpu model : MIPS 24K V7.12 FPU V0.0 +Initial BogoMIPS : 332.59 +wait instruction : yes +microsecond timers : yes +tlb_entries : 32 +extra interrupt vector : yes +hardware watchpoint : yes +ASEs implemented : mips16 +shadow register sets : 1 +VCED exceptions : not available +VCEI exceptions : not available + +System bus frequency : 333000000 Hz +CPU frequency : 499500000 Hz +DSP frequency : 333000000 Hz diff --git a/sources/sample/main/cpuinfo9.txt b/sources/sample/main/cpuinfo9.txt new file mode 100644 index 0000000..d471a68 --- /dev/null +++ b/sources/sample/main/cpuinfo9.txt @@ -0,0 +1,10 @@ +machine : SH7785LCR +processor : 0 +cpu family : sh4a +cpu type : SH7785 +cut : 7.x +cpu flags : fpu perfctr llsc +cache type : split (harvard) +icache size : 32KiB (4-way) +dcache size : 32KiB (4-way) +bogomips : 599.99 diff --git a/sources/sample/main/dev1.txt b/sources/sample/main/dev1.txt new file mode 100644 index 0000000..47a5d34 --- /dev/null +++ b/sources/sample/main/dev1.txt @@ -0,0 +1,6 @@ +Inter-| Receive | Transmit + face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed + lo: 1106222 765 0 0 0 0 0 0 1106222 765 0 0 0 0 0 0 + eth0: 1697868 1725 0 0 0 0 0 0 196192 1367 0 0 0 0 0 0 + eth1: 479861 421 0 0 0 0 0 0 51152 377 0 0 0 0 0 0 + pan0: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 diff --git a/sources/sample/main/df1.txt b/sources/sample/main/df1.txt new file mode 100644 index 0000000..36f9e4d --- /dev/null +++ b/sources/sample/main/df1.txt @@ -0,0 +1,24 @@ +Filesystem 1K-blocks Used Available Use% Mounted on +/dev/ad0s1a 2 1 1 0% / +/dev/ad0s1f 2 1 1 0% /usr +/dev/ad0s1e 2 1 1 0% /var +/dev/ad4s1e 2 1 1 0% /opt +/dev/ad2s1e 2 1 1 0% /opt/glftpd/site/Games +/dev/ad5s1e 2 1 1 0% /opt/glftpd/site/Movies +/dev/ad1s1c 2 1 1 0% /opt/glftpd/site/Movies2 +/dev/ad6s1e 2 1 1 0% /opt/glftpd/site/xbox +/dev/vinum/opt1 2 1 1 0% /opt1 +procfs 2 1 1 0% /proc +//ADMINISTRATOR@GODFATHER/GODFATHER C 2 1 1 0% /usr/home/username/godfather +/dev/sda1 2 1 1 0% /mount/sda1 +/dev/sda2 2 1 1 0% /mount/sda2 +/dev/sda3 2 1 1 0% /mount/sda3 +/dev/sda4 2 1 1 0% /mount/sda4 +/dev/sda5 2 1 1 0% /mount/sda5 +/dev/sda6 2 1 1 0% /mount/sda6 +/dev/sda7 2 1 1 0% /mount/sda7 +/dev/sda8 2 1 1 0% /mount/sda8 +/dev/sda9 2 1 1 0% /mount/sda9 +/dev/sda10 2 1 1 0% /mount/sda10 +/dev/sda11 2 1 1 0% /mount/sda11 +/dev/sda12 2 1 1 0% /mount/sda12 diff --git a/sources/sample/main/mount1.txt b/sources/sample/main/mount1.txt new file mode 100644 index 0000000..83ead33 --- /dev/null +++ b/sources/sample/main/mount1.txt @@ -0,0 +1,23 @@ +/dev/ad0s1a on / type ext2 (ufs, local) +/dev/ad0s1f on /usr type ext2 (ufs, local, soft-updates) +/dev/ad0s1e on /var type ext2 (ufs, local, soft-updates) +/dev/ad4s1e on /opt type ext2 (ufs, local, soft-updates) +/dev/ad2s1e on /opt/glftpd/site/Games type ext2 (ufs, local, soft-updates) +/dev/ad5s1e on /opt/glftpd/site/Movies type ext2 (ufs, local, soft-updates) +/dev/ad1s1c on /opt/glftpd/site/Movies2 type ext2 (ufs, local, soft-updates) +/dev/ad6s1e on /opt/glftpd/site/xbox type ext2 (ufs, local, soft-updates) +/dev/vinum/opt1 on /opt1 type ext2 (ufs, local, soft-updates) +procfs on /proc type ext2 (procfs, local) +//ADMINISTRATOR@GODFATHER/GODFATHER C on /usr/home/username/godfather type ext2 (smbfs) +/dev/sda1 on /mount/sda1 type ext2 (rw) +/dev/sda2 on /mount/sda2 type ext2 (rw) +/dev/sda3 on /mount/sda3 type ext2 (rw) +/dev/sda4 on /mount/sda4 type ext2 (rw) +/dev/sda5 on /mount/sda5 type ext2 (rw) +/dev/sda6 on /mount/sda6 type ext2 (rw) +/dev/sda7 on /mount/sda7 type ext2 (rw) +/dev/sda8 on /mount/sda8 type ext2 (rw) +/dev/sda9 on /mount/sda9 type ext2 (rw) +/dev/sda10 on /mount/sda10 type ext2 (rw) +/dev/sda11 on /mount/sda11 type ext2 (rw) +/dev/sda12 on /mount/sda12 type ext2 (rw) diff --git a/sources/sample/main/pmset1.txt b/sources/sample/main/pmset1.txt new file mode 100644 index 0000000..6dee80c --- /dev/null +++ b/sources/sample/main/pmset1.txt @@ -0,0 +1,2 @@ +Now drawing from 'AC Power' + -InternalBattery-0 100%; charged; 0:00 remaining diff --git a/sources/sample/main/pmset2.txt b/sources/sample/main/pmset2.txt new file mode 100644 index 0000000..a75ed6c --- /dev/null +++ b/sources/sample/main/pmset2.txt @@ -0,0 +1,2 @@ +Now drawing from 'Battery Power' + -InternalBattery-0 100%; discharging; (no estimate) diff --git a/sources/sample/main/pmset3.txt b/sources/sample/main/pmset3.txt new file mode 100644 index 0000000..577e09d --- /dev/null +++ b/sources/sample/main/pmset3.txt @@ -0,0 +1,2 @@ +Now drawing from 'AC Power' + -Back-UPS XS 900 FW:830.E7 .D USB FW:E7 100%; charging diff --git a/sources/sample/main/pmset4.txt b/sources/sample/main/pmset4.txt new file mode 100644 index 0000000..a01e850 --- /dev/null +++ b/sources/sample/main/pmset4.txt @@ -0,0 +1,2 @@ +Currently drawing from 'UPS Power' + -Back-UPS BR 800 FW:9.o4 .D USB FW:o4 98%; discharging; 0:21 remaining \ No newline at end of file diff --git a/sources/sample/main/swaps1.txt b/sources/sample/main/swaps1.txt new file mode 100644 index 0000000..2bf189a --- /dev/null +++ b/sources/sample/main/swaps1.txt @@ -0,0 +1,2 @@ +Filename Type Size Used Priority +/dev/sda5 partition 3389672 39216 -1 diff --git a/sources/sample/main/vm_stat1.txt b/sources/sample/main/vm_stat1.txt new file mode 100644 index 0000000..7588145 --- /dev/null +++ b/sources/sample/main/vm_stat1.txt @@ -0,0 +1,12 @@ +Mach Virtual Memory Statistics: (page size of 4096 bytes) +Pages free: 33312. +Pages active: 27150. +Pages inactive: 28122. +Pages wired down: 9720. +"Translation faults": 18751279. +Pages copy-on-write: 72642. +Pages zero filled: 17475509. +Pages reactivated: 110441. +Pageins: 23256. +Pageouts: 9390. +Object cache: 21657 hits of 216013 lookups (10% hit rate) diff --git a/sources/sample/main/vm_stat2.txt b/sources/sample/main/vm_stat2.txt new file mode 100644 index 0000000..97d287d --- /dev/null +++ b/sources/sample/main/vm_stat2.txt @@ -0,0 +1,13 @@ +Mach Virtual Memory Statistics: (page size of 4096 bytes) +Pages free: 90518. +Pages active: 205479. +Pages inactive: 32417. +Pages speculative: 134461. +Pages wired down: 61009. +"Translation faults": 26323651. +Pages copy-on-write: 177180. +Pages zero filled: 15230394. +Pages reactivated: 3. +Pageins: 388108. +Pageouts: 0. +Object cache: 14 hits of 797355 lookups (0% hit rate) diff --git a/sources/sample/main/vm_stat3.txt b/sources/sample/main/vm_stat3.txt new file mode 100644 index 0000000..77d7f4a --- /dev/null +++ b/sources/sample/main/vm_stat3.txt @@ -0,0 +1,23 @@ +Mach Virtual Memory Statistics: (page size of 4096 bytes) +Pages free: 10618. +Pages active: 1894043. +Pages inactive: 988141. +Pages speculative: 806200. +Pages throttled: 0. +Pages wired down: 437176. +Pages purgeable: 10356. +"Translation faults": 2938853787. +Pages copy-on-write: 241916814. +Pages zero filled: 971743078. +Pages reactivated: 379509. +Pages purged: 637333. +File-backed pages: 1552166. +Anonymous pages: 2136218. +Pages stored in compressor: 77894. +Pages occupied by compressor: 56429. +Decompressions: 3639. +Compressions: 82391. +Pageins: 1973731. +Pageouts: 23343. +Swapins: 264. +Swapouts: 264. diff --git a/sources/sample/motherboard/hwsensors/hwsensors1.txt b/sources/sample/motherboard/hwsensors/hwsensors1.txt new file mode 100644 index 0000000..5ad6963 --- /dev/null +++ b/sources/sample/motherboard/hwsensors/hwsensors1.txt @@ -0,0 +1,13 @@ +hw.sensors.0=lm0, VCORE_A, volts_dc, 1.73 V +hw.sensors.1=lm0, VCORE_B, volts_dc, 1.74 V +hw.sensors.2=lm0, +3.3V, volts_dc, 3.26 V +hw.sensors.3=lm0, +5V, volts_dc, 4.91 V +hw.sensors.4=lm0, +12V, volts_dc, 12.28 V +hw.sensors.5=lm0, -12V, volts_dc, -11.82 V +hw.sensors.6=lm0, -5V, volts_dc, 3.55 V +hw.sensors.7=lm0, +5VSB, volts_dc, 4.92 V +hw.sensors.8=lm0, VBAT, volts_dc, 3.26 V +hw.sensors.9=lm0, Temp1, temp, 33.00 degC / 91.40 degF +hw.sensors.10=lm0, Temp2, temp, 22.50 degC / 72.50 degF +hw.sensors.11=lm0, Temp3, temp, 127.50 degC / 261.50 degF +hw.sensors.12=lm0, Fan1, fanrpm, 4891 RPM diff --git a/sources/sample/motherboard/hwsensors/hwsensors2.txt b/sources/sample/motherboard/hwsensors/hwsensors2.txt new file mode 100644 index 0000000..38da7d0 --- /dev/null +++ b/sources/sample/motherboard/hwsensors/hwsensors2.txt @@ -0,0 +1,13 @@ +hw.sensors.0=it0, Fan1, 2445 RPM +hw.sensors.3=it0, VCORE_A, 1.62 V DC +hw.sensors.4=it0, VCORE_B, 2.66 V DC +hw.sensors.5=it0, +3.3V, 3.23 V DC +hw.sensors.6=it0, +5V, 4.84 V DC +hw.sensors.7=it0, +12V, 12.42 V DC +hw.sensors.8=it0, Unused, -2.80 V DC +hw.sensors.9=it0, -12V, -6.62 V DC +hw.sensors.10=it0, +5VSB, 4.84 V DC +hw.sensors.11=it0, VBAT, 0.00 V DC +hw.sensors.12=it0, Temp 1, 35.00 degC +hw.sensors.13=it0, Temp 2, 29.00 degC +hw.sensors.14=it0, Temp 3, 45.00 degC diff --git a/sources/sample/motherboard/hwsensors/hwsensors3.txt b/sources/sample/motherboard/hwsensors/hwsensors3.txt new file mode 100644 index 0000000..d76ecd7 --- /dev/null +++ b/sources/sample/motherboard/hwsensors/hwsensors3.txt @@ -0,0 +1,15 @@ +hw.sensors.acpitz0.temp0=21.80 degC (zone temperature) +hw.sensors.it0.temp0=25.00 degC +hw.sensors.it0.temp1=25.00 degC +hw.sensors.it0.temp2=28.00 degC +hw.sensors.it0.fan0=3668 RPM +hw.sensors.it0.fan2=2033 RPM +hw.sensors.it0.volt0=1.52 VDC (VCORE_A) +hw.sensors.it0.volt1=2.54 VDC (VCORE_B) +hw.sensors.it0.volt2=3.25 VDC (+3.3V) +hw.sensors.it0.volt3=4.19 VDC (+5V) +hw.sensors.it0.volt4=12.10 VDC (+12V) +hw.sensors.it0.volt5=-9.42 VDC (-12V) +hw.sensors.it0.volt6=-4.68 VDC (-5V) +hw.sensors.it0.volt7=3.87 VDC (+5VSB) +hw.sensors.it0.volt8=4.08 VDC (VBAT) diff --git a/sources/sample/motherboard/hwsensors/hwsensors4.txt b/sources/sample/motherboard/hwsensors/hwsensors4.txt new file mode 100644 index 0000000..9cc7b58 --- /dev/null +++ b/sources/sample/motherboard/hwsensors/hwsensors4.txt @@ -0,0 +1,17 @@ +hw.sensors.cpu0.temp0=35.00 degC +hw.sensors.cpu1.temp0=35.00 degC +hw.sensors.cpu2.temp0=35.00 degC +hw.sensors.cpu3.temp0=35.00 degC +hw.sensors.acpitz0.temp0=47.00 degC (zone temperature) +hw.sensors.acpibat0.volt0=10.80 VDC (voltage) +hw.sensors.acpibat0.volt1=12.46 VDC (current voltage) +hw.sensors.acpibat0.amphour0=9.39 Ah (last full capacity) +hw.sensors.acpibat0.amphour1=0.47 Ah (warning capacity) +hw.sensors.acpibat0.amphour2=0.02 Ah (low capacity) +hw.sensors.acpibat0.amphour3=9.39 Ah (remaining capacity), OK +hw.sensors.acpibat0.raw0=0 (battery full), OK +hw.sensors.acpibat0.raw1=0 (rate) +hw.sensors.acpiac0.indicator0=On (power supply) +hw.sensors.acpithinkpad0.temp0=47.00 degC +hw.sensors.acpithinkpad0.temp1=47.00 degC +hw.sensors.acpithinkpad0.temp2=47.00 degC diff --git a/sources/sample/motherboard/hwsensors/hwsensors5.txt b/sources/sample/motherboard/hwsensors/hwsensors5.txt new file mode 100644 index 0000000..a20467a --- /dev/null +++ b/sources/sample/motherboard/hwsensors/hwsensors5.txt @@ -0,0 +1,33 @@ +hw.sensors.cpu0.temp0=60.00 degC +hw.sensors.cpu1.temp0=60.00 degC +hw.sensors.cpu2.temp0=60.00 degC +hw.sensors.cpu3.temp0=60.00 degC +hw.sensors.acpitz0.temp0=59.00 degC (zone temperature) +hw.sensors.acpibat0.volt0=11.10 VDC (voltage) +hw.sensors.acpibat0.volt1=12.49 VDC (current voltage) +hw.sensors.acpibat0.power0=0.00 W (rate) +hw.sensors.acpibat0.watthour0=48.90 Wh (last full capacity) +hw.sensors.acpibat0.watthour1=2.44 Wh (warning capacity) +hw.sensors.acpibat0.watthour2=0.20 Wh (low capacity) +hw.sensors.acpibat0.watthour3=47.90 Wh (remaining capacity), OK +hw.sensors.acpibat0.raw0=0 (battery idle), OK +hw.sensors.acpiac0.indicator0=On (power supply) +hw.sensors.acpithinkpad0.temp0=59.00 degC +hw.sensors.acpithinkpad0.temp1=59.00 degC +hw.sensors.acpithinkpad0.temp2=59.00 degC +hw.sensors.acpithinkpad0.temp3=59.00 degC +hw.sensors.acpithinkpad0.temp4=59.00 degC +hw.sensors.acpithinkpad0.temp5=59.00 degC +hw.sensors.acpithinkpad0.temp6=59.00 degC +hw.sensors.acpithinkpad0.temp7=59.00 degC +hw.sensors.acpithinkpad0.fan0=3782 RPM +hw.sensors.acpidock0.indicator0=Off (not docked) +hw.sensors.aps0.temp0=45.00 degC +hw.sensors.aps0.temp1=45.00 degC +hw.sensors.aps0.indicator0=On (Keyboard Active) +hw.sensors.aps0.indicator1=Off (Mouse Active) +hw.sensors.aps0.indicator2=On (Lid Open) +hw.sensors.aps0.raw0=503 (X_ACCEL) +hw.sensors.aps0.raw1=519 (Y_ACCEL) +hw.sensors.aps0.raw2=503 (X_VAR) +hw.sensors.aps0.raw3=519 (Y_VAR) diff --git a/sources/sample/motherboard/ipmi-sensors/ipmi-sensors1.txt b/sources/sample/motherboard/ipmi-sensors/ipmi-sensors1.txt new file mode 100644 index 0000000..e5fa4e8 --- /dev/null +++ b/sources/sample/motherboard/ipmi-sensors/ipmi-sensors1.txt @@ -0,0 +1,30 @@ +ID | Name | Type | Reading | Units | Lower NR | Lower C | Lower NC | Upper NC | Upper C | Upper NR | Event +64 | BIOS | System Firmware Progress | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A +112 | ACPI State | System ACPI Power State | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | 'S0/G0' +160 | System Reset | Module/Board | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | 'OK' +208 | CPU Fan | Fan | 2085.94 | RPM | N/A | N/A | N/A | N/A | 771.96 | N/A | 'OK' +272 | Rear Fan | Fan | 1463.27 | RPM | N/A | N/A | N/A | N/A | 771.96 | N/A | 'OK' +336 | System 12V | Voltage | 11.93 | V | N/A | 10.02 | N/A | N/A | 13.16 | N/A | 'OK' +400 | System 5V | Voltage | 5.05 | V | N/A | 4.75 | N/A | N/A | 5.24 | N/A | 'OK' +464 | System AUX 5V | Voltage | 4.94 | V | N/A | 4.75 | N/A | N/A | 5.24 | N/A | 'OK' +528 | System 3.3V | Voltage | 3.22 | V | N/A | 3.14 | N/A | N/A | 3.47 | N/A | 'OK' +592 | System AUX 3.3V | Voltage | 3.31 | V | N/A | 3.14 | N/A | N/A | 3.47 | N/A | 'OK' +656 | CPU Vcore | Voltage | 1.16 | V | N/A | 0.84 | N/A | N/A | 1.61 | N/A | 'OK' +720 | CPU Vterm | Voltage | 1.21 | V | N/A | 1.15 | N/A | N/A | 1.26 | N/A | 'OK' +784 | Memory Vcore | Voltage | 1.78 | V | N/A | 1.71 | N/A | N/A | 1.91 | N/A | 'OK' +848 | Memory Vterm | Voltage | 0.89 | V | N/A | 0.85 | N/A | N/A | 0.94 | N/A | 'OK' +912 | AMB/MCH Vcore | Voltage | 1.50 | V | N/A | 1.43 | N/A | N/A | 1.58 | N/A | 'OK' +976 | PCI System Err | Module/Board | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A +1024 | Mem Recover Err | Memory | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A +1072 | MemUnrecover Er | Memory | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A +1120 | RCPU Diode 1 | Temperature | N/A | C | N/A | N/A | N/A | N/A | 85.00 | N/A | N/A +1184 | Ambient | Temperature | 27.00 | C | N/A | N/A | N/A | N/A | 51.00 | N/A | 'OK' +1248 | Local VRD0 Temp | Temperature | 28.00 | C | N/A | N/A | N/A | N/A | N/A | N/A | 'OK' +1504 | CPU Dmn 0 Temp | Temperature | 53.00 | C | N/A | N/A | N/A | N/A | 85.00 | N/A | 'OK' +1632 | Slots Amb | Temperature | 33.00 | C | N/A | N/A | N/A | N/A | 85.00 | N/A | 'OK' +1696 | 1.8V Amb | Temperature | 46.00 | C | N/A | N/A | N/A | N/A | 85.00 | N/A | 'OK' +2080 | Therm-Trip | Processor | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | 'State Deasserted' +2128 | CPU Prochot | Temperature | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | 'Limit Not Exceeded' +2176 | LOM Link Status | LAN | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | 'State Asserted' +2224 | LO100 Present | Add In Card | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | 'Device Removed/Device Absent' +5616 | Watchdog | Watchdog 2 | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A diff --git a/sources/sample/motherboard/ipmitool/ipmitool1.txt b/sources/sample/motherboard/ipmitool/ipmitool1.txt new file mode 100644 index 0000000..56e8788 --- /dev/null +++ b/sources/sample/motherboard/ipmitool/ipmitool1.txt @@ -0,0 +1,64 @@ +BB +1.2V Vtt | 1.197 | Volts | ok | na | 1.096 | 1.134 | 1.285 | 1.323 | na +BB +1.5V AUX | 1.490 | Volts | ok | na | 1.334 | 1.373 | 1.622 | 1.669 | na +BB +1.5V | 1.469 | Volts | ok | na | 1.326 | 1.365 | 1.625 | 1.677 | na +BB +1.8V | 1.802 | Volts | ok | na | 1.638 | 1.689 | 1.926 | 1.988 | na +BB +3.3V | 3.320 | Volts | ok | na | 2.941 | 3.027 | 3.578 | 3.681 | na +BB +3.3V STB | 3.337 | Volts | ok | na | 3.027 | 3.113 | 3.509 | 3.612 | na +BB +1.5V ESB | 1.490 | Volts | ok | na | 1.357 | 1.404 | 1.591 | 1.638 | na +BB +5V | 5.122 | Volts | ok | na | 4.446 | 4.576 | 5.408 | 5.564 | na +BB +12V AUX | 12.090 | Volts | ok | na | 10.416 | 10.726 | 13.144 | 13.578 | na +BB 0.9V | 0.902 | Volts | ok | na | 0.811 | 0.835 | 0.950 | 0.979 | na +Baseboard Temp | 29.000 | degrees C | ok | na | 5.000 | 10.000 | 61.000 | 66.000 | na +P1 Therm Margin | -32.000 | degrees C | ok | na | na | na | na | na | na +P1 Therm Ctrl % | 0.000 | unspecified | ok | na | na | na | na | 49.530 | na +Proc 1 Vcc | 1.203 | Volts | ok | na | na | na | na | na | na +Power Unit | 0x0 | discrete | 0x0000| na | na | na | na | na | na +BMC Watchdog | 0x0 | discrete | 0x0000| na | na | na | na | na | na +Scrty Violation | 0x0 | discrete | 0x0000| na | na | na | na | na | na +F-P Diag Int | 0x0 | discrete | 0x0000| na | na | na | na | na | na +System Event Log | 0x0 | discrete | 0x0000| na | na | na | na | na | na +Session Audit | 0x0 | discrete | 0x0000| na | na | na | na | na | na +System Event | 0x0 | discrete | 0x0000| na | na | na | na | na | na +BB Vbat | 0x0 | discrete | 0x0000| na | na | na | na | na | na +SysACPIPowerStat | 0x0 | discrete | 0x0100| na | na | na | na | na | na +Button | 0x0 | discrete | 0x0000| na | na | na | na | na | na +SMI Timeout | 0x0 | discrete | 0x0100| na | na | na | na | na | na +NMI State | 0x0 | discrete | 0x0100| na | na | na | na | na | na +SMI State | 0x0 | discrete | 0x0100| na | na | na | na | na | na +Processor 1 Stat | 0x0 | discrete | 0x8000| na | na | na | na | na | na +Processor 2 Stat | 0x0 | discrete | 0x0000| na | na | na | na | na | na +PCIe Link0 | 0x0 | discrete | 0x0000| na | na | na | na | na | na +PCIe Link1 | 0x0 | discrete | 0x0000| na | na | na | na | na | na +PCIe Link2 | 0x0 | discrete | 0x0000| na | na | na | na | na | na +PCIe Link3 | 0x0 | discrete | 0x0000| na | na | na | na | na | na +PCIe Link4 | 0x0 | discrete | 0x0000| na | na | na | na | na | na +PCIe Link5 | 0x0 | discrete | 0x0000| na | na | na | na | na | na +PCIe Link6 | 0x0 | discrete | 0x0000| na | na | na | na | na | na +PCIe Link7 | 0x0 | discrete | 0x0000| na | na | na | na | na | na +PCIe Link8 | 0x0 | discrete | 0x0000| na | na | na | na | na | na +PCIe Link9 | 0x0 | discrete | 0x0000| na | na | na | na | na | na +PCIe Link10 | 0x0 | discrete | 0x0000| na | na | na | na | na | na +PCIe Link11 | 0x0 | discrete | 0x0000| na | na | na | na | na | na +PCIe Link12 | 0x0 | discrete | 0x0000| na | na | na | na | na | na +PCIe Link13 | 0x0 | discrete | 0x0000| na | na | na | na | na | na +Proc1 VRD Hot | 0x0 | discrete | 0x0000| na | na | na | na | na | na +CPU1 Vcc OOR | 0x0 | discrete | 0x0000| na | na | na | na | na | na +CPU Popula Error | 0x0 | discrete | 0x0000| na | na | na | na | na | na +DIMM A1 | 0x0 | discrete | 0x0400| na | na | na | na | na | na +DIMM A2 | 0x0 | discrete | 0x0000| na | na | na | na | na | na +DIMM B1 | 0x0 | discrete | 0x0400| na | na | na | na | na | na +DIMM B2 | 0x0 | discrete | 0x0000| na | na | na | na | na | na +DIMM C1 | 0x0 | discrete | 0x0000| na | na | na | na | na | na +DIMM C2 | 0x0 | discrete | 0x0000| na | na | na | na | na | na +DIMM D1 | 0x0 | discrete | 0x0000| na | na | na | na | na | na +DIMM D2 | 0x0 | discrete | 0x0000| na | na | na | na | na | na +MemA Error | 0x0 | discrete | 0x0000| na | na | na | na | na | na +MemB Error | 0x0 | discrete | 0x0000| na | na | na | na | na | na +MemC Error | 0x0 | discrete | 0x0000| na | na | na | na | na | na +MemD Error | 0x0 | discrete | 0x0000| na | na | na | na | na | na +B0 Sparing Enb | na | discrete | na | na | na | na | na | na | na +B0 Spare Redun | na | discrete | na | na | na | na | na | na | na +B1 Sparing Enb | na | discrete | na | na | na | na | na | na | na +B1 Spare Redun | na | discrete | na | na | na | na | na | na | na +B01 Mirror Enbl | na | discrete | na | na | na | na | na | na | na +B01 MirrorRedun | na | discrete | na | na | na | na | na | na | na diff --git a/sources/sample/motherboard/ipmiutil/ipmiutil1.txt b/sources/sample/motherboard/ipmiutil/ipmiutil1.txt new file mode 100644 index 0000000..3ffe92b --- /dev/null +++ b/sources/sample/motherboard/ipmiutil/ipmiutil1.txt @@ -0,0 +1,217 @@ +ipmiutil ver 2.93 +isensor: version 2.93 +-- BMC version 1.51, IPMI version 2.0 + ID | SDRType | Type |SNum| Name |Status| Reading +0001 | Compact | Event Log | 72 | SEL | Absent | + | Entity ID 7.1 (System board), Capab: arm=auto thr=none evts=state +0002 | Compact | Platform Securi | 73 | Intrusion | OK | + | Entity ID 7.1 (System board), Capab: arm=auto thr=none evts=state +000b | Full | Fan | 30 | Fan1A RPM | OK | 1680.00 RPM + | Thresholds| lo-noncr 840.00 | lo-crit 720.00 +000c | Full | Fan | 31 | Fan1B RPM | OK | 1560.00 RPM + | Thresholds| lo-noncr 840.00 | lo-crit 720.00 +000d | Full | Fan | 32 | Fan2A RPM | OK | 2880.00 RPM + | Thresholds| lo-noncr 840.00 | lo-crit 720.00 +000e | Full | Fan | 33 | Fan2B RPM | OK | 2760.00 RPM + | Thresholds| lo-noncr 840.00 | lo-crit 720.00 +000f | Full | Fan | 34 | Fan3A RPM | OK | 2880.00 RPM + | Thresholds| lo-noncr 840.00 | lo-crit 720.00 +0010 | Full | Fan | 35 | Fan3B RPM | OK | 2760.00 RPM + | Thresholds| lo-noncr 840.00 | lo-crit 720.00 +0011 | Full | Fan | 36 | Fan4A RPM | OK | 2280.00 RPM + | Thresholds| lo-noncr 840.00 | lo-crit 720.00 +0012 | Full | Fan | 37 | Fan4B RPM | OK | 2160.00 RPM + | Thresholds| lo-noncr 840.00 | lo-crit 720.00 +0013 | Full | Fan | 38 | Fan5A RPM | OK | 2280.00 RPM + | Thresholds| lo-noncr 840.00 | lo-crit 720.00 +0014 | Full | Fan | 39 | Fan5B RPM | OK | 2160.00 RPM + | Thresholds| lo-noncr 840.00 | lo-crit 720.00 +0015 | Full | Temperature | 04 | Inlet Temp | OK | 18.00 C + | Thresholds| hi-crit 47.00 | hi-noncr 42.00 | lo-noncr 3.00 | lo-crit -7.00 +0016 | Compact | Watchdog_2 | 71 | OS Watchdog | OK | + | Entity ID 7.1 (System board), Capab: arm=auto thr=none evts=state +0017 | Compact | Voltage | 23 | VCORE PG | OK | + | Entity ID 3.1 (Processor), Capab: arm=auto thr=none evts=state +0018 | Compact | Voltage | 19 | 3.3V PG | OK | + | Entity ID 7.1 (System board), Capab: arm=auto thr=none evts=state +0019 | Compact | Voltage | 1a | 5V PG | OK | + | Entity ID 7.1 (System board), Capab: arm=auto thr=none evts=state +001a | Compact | Cable/Interconn | 50 | USB Cable Pres | _ | + | Entity ID 7.1 (System board), Capab: arm=auto thr=none evts=state +001b | Compact | Entity Presence | 70 | Dedicated NIC | Present | + | Entity ID 7.1 (System board), Capab: arm=auto thr=none evts=state +001c | Compact | Cable/Interconn | 51 | VGA Cable Pres | _ | + | Entity ID 7.1 (System board), Capab: arm=auto thr=none evts=state +001d | Compact | Entity Presence | 49 | Presence | OK* | + | Entity ID 11.2 (Add-in card), Capab: arm=auto thr=none evts=state +001e | Compact | Entity Presence | 40 | Presence | OK* | + | Entity ID 3.1 (Processor), Capab: arm=auto thr=none evts=state +001f | Compact | Voltage | 25 | PLL PG | OK | + | Entity ID 3.1 (Processor), Capab: arm=auto thr=none evts=state +0020 | Compact | Voltage | 27 | 1.1V PG | OK | + | Entity ID 0.1 (unspecified), Capab: arm=auto thr=none evts=state +0021 | Compact | Voltage | f6 | BP1 5V PG | OK | + | Entity ID 7.1 (System board), Capab: arm=auto thr=none evts=state +0022 | Compact | Entity Presence | 43 | Presence | OK* | + | Entity ID 10.2 (Power supply), Capab: arm=auto thr=none evts=state +0023 | Compact | Voltage | 2b | VSA PG | OK | + | Entity ID 3.1 (Processor), Capab: arm=auto thr=none evts=state +0024 | Compact | Voltage | 1e | MEM VDDQ PG | OK | + | Entity ID 3.1 (Processor), Capab: arm=auto thr=none evts=state +0025 | Compact | Cable/Interconn | 4c | LCD Cable Pres | _ | + | Entity ID 7.1 (System board), Capab: arm=auto thr=none evts=state +0026 | Compact | Voltage | 20 | VTT PG | OK | + | Entity ID 3.1 (Processor), Capab: arm=auto thr=none evts=state +0027 | Compact | Entity Presence | 48 | Presence | Present | + | Entity ID 11.3 (Add-in card), Capab: arm=auto thr=none evts=state +0028 | Compact | Processor | 60 | Status | ProcPresent | + | Entity ID 3.1 (Processor), Capab: arm=auto thr=none evts=state +0029 | Compact | Fan | 75 | Fan Redundancy | Redundant | + | Entity ID 7.1 (System board), Capab: arm=auto thr=none evts=state +002c | Compact | Cable/Interconn | 64 | Riser Config Err | _ | + | Entity ID 7.1 (System board), Capab: arm=auto thr=none evts=state +002d | Compact | Voltage | 28 | 1.5V PG | OK | + | Entity ID 7.1 (System board), Capab: arm=auto thr=none evts=state +002e | Compact | Voltage | 2c | PS2 PG Fail | OK | + | Entity ID 7.1 (System board), Capab: arm=auto thr=none evts=state +002f | Compact | Voltage | 2d | PS1 PG Fail | OK | + | Entity ID 7.1 (System board), Capab: arm=auto thr=none evts=state +0030 | Compact | Voltage | 14 | MEM VTT PG | OK | + | Entity ID 3.1 (Processor), Capab: arm=auto thr=none evts=state +0031 | Compact | Entity Presence | 42 | Presence | OK* | + | Entity ID 10.1 (Power supply), Capab: arm=auto thr=none evts=state +0032 | Compact | Critical Interr | 90 | PCIe Slot1 | OK | + | Entity ID 7.1 (System board), Capab: arm=auto thr=none evts=state +0033 | Compact | Critical Interr | 91 | PCIe Slot2 | OK | + | Entity ID 7.1 (System board), Capab: arm=auto thr=none evts=state +0034 | Compact | Critical Interr | 92 | PCIe Slot3 | OK | + | Entity ID 7.1 (System board), Capab: arm=auto thr=none evts=state +0035 | Compact | Critical Interr | 93 | PCIe Slot4 | OK | + | Entity ID 7.1 (System board), Capab: arm=auto thr=none evts=state +0036 | Compact | Memory | c0 | A | OK | + | Entity ID 32.1 (Memory device ), Capab: arm=auto thr=none evts=state +0039 | Compact | Board | fa | vFlash | OK | + | Entity ID 12.1 (Front panel bd), Capab: arm=auto thr=none evts=state +003a | Compact | Battery | 65 | CMOS Battery | OK | + | Entity ID 7.1 (System board), Capab: arm=auto thr=none evts=state +003b | Compact | Entity Presence | 54 | Presence | OK* | + | Entity ID 26.1 (Disk Drive Bay), Capab: arm=auto thr=none evts=state +003c | Full | Current | 6a | Current 1 | OK | 0.40 A + | Thresholds +003d | Full | Current | 6b | Current 2 | OK | 0.20 A + | Thresholds +003e | Full | Voltage | 6c | Voltage 1 | OK | 228.00 V + | Thresholds +003f | Full | Voltage | 6d | Voltage 2 | OK | 230.00 V + | Thresholds +0040 | Compact | Power Supply | 74 | PS Redundancy | Present | + | Entity ID 7.1 (System board), Capab: arm=auto thr=none evts=state +0041 | Compact | Power Supply | 62 | Status | Present | + | Entity ID 10.1 (Power supply), Capab: arm=auto thr=none evts=state +0042 | Compact | Power Supply | 63 | Status | Present | + | Entity ID 10.2 (Power supply), Capab: arm=auto thr=none evts=state +0043 | Full | Current | 77 | Pwr Consumption | OK | 84.00 W + | Thresholds| hi-crit 728.00 | hi-noncr 658.00 +0044 | Compact | OEM(c0) | 76 | Power Optimized | Asserted | + | Entity ID 7.1 (System board), Capab: arm=auto thr=none evts=state +0045 | Compact | OEM(c9) | f4 | SD1 | _ | + | Entity ID 11.3 (Add-in card), Capab: arm=auto thr=none evts=state +0046 | Compact | OEM(c9) | f5 | SD2 | _ | + | Entity ID 11.3 (Add-in card), Capab: arm=auto thr=none evts=state +0047 | Compact | OEM(c9) | 78 | Redundancy | _ | + | Entity ID 11.3 (Add-in card), Capab: arm=auto thr=none evts=state +0048 | Compact | Memory | 01 | ECC Corr Err | Unknown | + | Entity ID 34.1 (BIOS), Capab: arm=auto thr=none evts=state +0049 | Compact | Memory | 02 | ECC Uncorr Err | Unknown | + | Entity ID 34.1 (BIOS), Capab: arm=auto thr=none evts=state +004a | Compact | Critical Interr | 03 | I/O Channel Chk | Unknown | + | Entity ID 34.1 (BIOS), Capab: arm=auto thr=none evts=state +004b | Compact | Critical Interr | 04 | PCI Parity Err | Unknown | + | Entity ID 34.1 (BIOS), Capab: arm=auto thr=none evts=state +004c | Compact | Critical Interr | 05 | PCI System Err | Unknown | + | Entity ID 34.1 (BIOS), Capab: arm=auto thr=none evts=state +004d | Compact | Event Log | 06 | SBE Log Disabled | Unknown | + | Entity ID 34.1 (BIOS), Capab: arm=auto thr=none evts=state +004e | Compact | Event Log | 07 | Logging Disabled | Unknown | + | Entity ID 34.1 (BIOS), Capab: arm=auto thr=none evts=state +004f | Compact | System Event | 08 | Unknown | Unknown | + | Entity ID 34.1 (BIOS), Capab: arm=auto thr=none evts=state +0050 | Compact | Processor | 0a | CPU Protocol Err | Unknown | + | Entity ID 34.1 (BIOS), Capab: arm=auto thr=none evts=state +0051 | Compact | Processor | 0b | CPU Bus PERR | Unknown | + | Entity ID 34.1 (BIOS), Capab: arm=auto thr=none evts=state +0052 | Compact | Processor | 0c | CPU Init Err | Unknown | + | Entity ID 34.1 (BIOS), Capab: arm=auto thr=none evts=state +0053 | Compact | Processor | 0d | CPU Machine Chk | Unknown | + | Entity ID 34.1 (BIOS), Capab: arm=auto thr=none evts=state +0054 | Compact | Memory | 11 | Memory Spared | Unknown | + | Entity ID 34.1 (BIOS), Capab: arm=auto thr=none evts=state +0055 | Compact | Memory | 12 | Memory Mirrored | Unknown | + | Entity ID 34.1 (BIOS), Capab: arm=auto thr=none evts=state +0056 | Compact | Memory | 13 | Memory RAID | Unknown | + | Entity ID 34.1 (BIOS), Capab: arm=auto thr=none evts=state +0057 | Compact | Memory | 14 | Memory Added | Unknown | + | Entity ID 34.1 (BIOS), Capab: arm=auto thr=none evts=state +0058 | Compact | Memory | 15 | Memory Removed | Unknown | + | Entity ID 34.1 (BIOS), Capab: arm=auto thr=none evts=state +0059 | Compact | Memory | 16 | Memory Cfg Err | Unknown | + | Entity ID 34.1 (BIOS), Capab: arm=auto thr=none evts=state +005a | Compact | Memory | 17 | Mem Redun Gain | Unknown | + | Entity ID 34.1 (BIOS), Capab: arm=auto thr=none evts=state +005b | Compact | Critical Interr | 18 | PCIE Fatal Err | Unknown | + | Entity ID 34.1 (BIOS), Capab: arm=auto thr=none evts=state +005c | Compact | Critical Interr | 19 | Chipset Err | Unknown | + | Entity ID 34.1 (BIOS), Capab: arm=auto thr=none evts=state +005d | Compact | OEM(c1) | 1a | Err Reg Pointer | Unknown | + | Entity ID 34.1 (BIOS), Capab: arm=auto thr=none evts=state +005e | Compact | Memory | 1b | Mem ECC Warning | Unknown | + | Entity ID 34.1 (BIOS), Capab: arm=auto thr=none evts=state +005f | Compact | Memory | 1c | Mem CRC Err | Unknown | + | Entity ID 34.1 (BIOS), Capab: arm=auto thr=none evts=state +0060 | Compact | Memory | 1d | USB Over-current | Unknown | + | Entity ID 34.1 (BIOS), Capab: arm=auto thr=none evts=state +0061 | Compact | System Firmware | 1e | POST Err | Unknown | + | Entity ID 34.1 (BIOS), Capab: arm=auto thr=none evts=state +0062 | Compact | Version Change | 1f | Hdwr version err | Unknown | + | Entity ID 34.1 (BIOS), Capab: arm=auto thr=none evts=state +0063 | Compact | Memory | 20 | Mem Overtemp | Unknown | + | Entity ID 34.1 (BIOS), Capab: arm=auto thr=none evts=state +0064 | Compact | Memory | 21 | Mem Fatal SB CRC | Unknown | + | Entity ID 34.1 (BIOS), Capab: arm=auto thr=none evts=state +0065 | Compact | Memory | 22 | Mem Fatal NB CRC | Unknown | + | Entity ID 34.1 (BIOS), Capab: arm=auto thr=none evts=state +0066 | Compact | Watchdog_1 | 71 | OS Watchdog Time | Unknown | + | Entity ID 34.1 (BIOS), Capab: arm=auto thr=none evts=state +0067 | Compact | Memory | 26 | Non Fatal PCI Er | Unknown | + | Entity ID 34.1 (BIOS), Capab: arm=auto thr=none evts=state +0068 | Compact | Memory | 27 | Fatal IO Error | Unknown | + | Entity ID 34.1 (BIOS), Capab: arm=auto thr=none evts=state +0069 | Compact | Memory | 28 | MSR Info Log | Unknown | + | Entity ID 34.1 (BIOS), Capab: arm=auto thr=none evts=state +006a | Compact | Drive Slot | a0 | Drive 0 | Unused Faulty | + | Entity ID 7.1 (System board), Capab: arm=auto thr=none evts=state +006b | Compact | Cable/Interconn | e0 | Cable SAS A | _ | + | Entity ID 26.1 (Disk Drive Bay), Capab: arm=auto thr=none evts=state +006c | Compact | Cable/Interconn | e1 | Cable SAS B | _ | + | Entity ID 26.1 (Disk Drive Bay), Capab: arm=auto thr=none evts=state +006d | Compact | Cable/Interconn | e2 | Cable SAS C | _ | + | Entity ID 26.1 (Disk Drive Bay), Capab: arm=auto thr=none evts=state +006e | Compact | Cable/Interconn | e3 | Cable SAS D | _ | + | Entity ID 26.1 (Disk Drive Bay), Capab: arm=auto thr=none evts=state +006f | Compact | Cable/Interconn | 58 | Power Cable | _ | + | Entity ID 26.1 (Disk Drive Bay), Capab: arm=auto thr=none evts=state +0070 | Compact | Cable/Interconn | 59 | Signal Cable | _ | + | Entity ID 26.1 (Disk Drive Bay), Capab: arm=auto thr=none evts=state +0071 | Compact | Voltage | 66 | PFault Fail Safe | Absent | + | Entity ID 7.1 (System board), Capab: arm=auto thr=none evts=state +0072 | Compact | Battery | 68 | ROMB Battery | NotAvailable | + | Entity ID 11.2 (Add-in card), Capab: arm=auto thr=none evts=state +0073 | Compact | Battery | 69 | ROMB Battery | NotAvailable | + | Entity ID 11.4 (Add-in card), Capab: arm=auto thr=none evts=state +0074 | Compact | Cable/Interconn | 4d | Riser 1 Presence | _ | + | Entity ID 7.1 (System board), Capab: arm=auto thr=none evts=state +0075 | Compact | Cable/Interconn | 4e | Riser 2 Presence | _ | + | Entity ID 7.1 (System board), Capab: arm=auto thr=none evts=state +0077 | Full | Temperature | 0e | Temp | OK | 66.00 C + | Thresholds| hi-crit 83.00 | hi-noncr 77.00 | lo-noncr 8.00 | lo-crit 3.00 +ipmiutil sensor, completed successfully diff --git a/sources/sample/motherboard/lmsensors/lmsensors1.txt b/sources/sample/motherboard/lmsensors/lmsensors1.txt new file mode 100644 index 0000000..054de5c --- /dev/null +++ b/sources/sample/motherboard/lmsensors/lmsensors1.txt @@ -0,0 +1,13 @@ +via686a-isa-6000 +Adapter: ISA adapter +CPU core: +1.72 V (min = +1.99 V, max = +2.49 V) ALARM ++2.5V: +0.30 V (min = +2.24 V, max = +2.74 V) ALARM +I/O: +3.35 V (min = +2.95 V, max = +3.62 V) ++5V: +4.82 V (min = +4.47 V, max = +5.49 V) ++12V: +11.45 V (min = +10.79 V, max = +13.18 V) +CPU Fan: 0 RPM (min = 3000 RPM, div = 2) ALARM +P/S Fan: 0 RPM (min = 3000 RPM, div = 2) +SYS Temp: +27.9°C (high = +45°C, hyst = +40°C) +CPU Temp: +53.1°C (high = +60°C, hyst = +55°C) +SBr Temp: +24.2°C (high = +65°C, hyst = +60°C) + diff --git a/sources/sample/motherboard/lmsensors/lmsensors10.txt b/sources/sample/motherboard/lmsensors/lmsensors10.txt new file mode 100644 index 0000000..cd514cc --- /dev/null +++ b/sources/sample/motherboard/lmsensors/lmsensors10.txt @@ -0,0 +1,15 @@ +nouveau-pci-0200 +Adapter: PCI adapter +temp1: +73.0°C (high = +100.0°C, crit = +100.0°C) + +applesmc-isa-0300 +Adapter: ISA adapter +Master : 1493 RPM (min = 1500 RPM) +TC0D: +49.5°C +TC0H: +49.2°C +TC0P: +48.2°C +TH0P: +48.8°C +TN0D: +72.8°C +TN0P: +58.5°C +TW0P: +56.8°C +Tm0P: +128.0°C diff --git a/sources/sample/motherboard/lmsensors/lmsensors2.txt b/sources/sample/motherboard/lmsensors/lmsensors2.txt new file mode 100644 index 0000000..f1a6456 --- /dev/null +++ b/sources/sample/motherboard/lmsensors/lmsensors2.txt @@ -0,0 +1,20 @@ +w83781d-i2c-0-2d +Adapter: SMBus PIIX4 adapter at 5f00 +VCore 1: +2.82 V (min = +2.66 V, max = +2.94 V) +VCore 2: +1.49 V (min = +2.66 V, max = +2.94 V) ALARM ++3.3V: +3.50 V (min = +3.14 V, max = +3.46 V) ALARM ++5V: +4.97 V (min = +4.73 V, max = +5.24 V) ++12V: +11.92 V (min = +11.37 V, max = +12.59 V) +-12V: -11.57 V (min = -12.57 V, max = -11.35 V) +-5V: -4.89 V (min = -5.25 V, max = -4.74 V) +fan1: 6026 RPM (min = 2657 RPM, div = 2) +fan2: 0 RPM (min = 2657 RPM, div = 2) ALARM +fan3: 0 RPM (min = 2657 RPM, div = 2) ALARM +temp1: +12°C (high = +127°C, hyst = +0°C) +temp2: +11.5°C (high = +50°C, hyst = +49°C) +temp3: +11.0°C (high = +127°C, hyst = +0°C) +vid: +2.800 V +alarms: +beep_enable: + Sound alarm disabled + diff --git a/sources/sample/motherboard/lmsensors/lmsensors3.txt b/sources/sample/motherboard/lmsensors/lmsensors3.txt new file mode 100644 index 0000000..a283195 --- /dev/null +++ b/sources/sample/motherboard/lmsensors/lmsensors3.txt @@ -0,0 +1,15 @@ +it87-isa-0290 +Adapter: ISA adapter +VCore: +1.68 V (min = +1.64 V, max = +1.69 V) +DDRVtt: +2.56 V (min = +2.42 V, max = +2.58 V) ++3.3V: +3.31 V (min = +3.13 V, max = +3.45 V) ++5V: +4.77 V (min = +4.72 V, max = +5.24 V) ++12V: +12.52 V (min = +11.36 V, max = +12.72 V) ++5VSB: +4.99 V (min = +4.72 V, max = +5.24 V) +CPU: 3515 RPM (min = 1997 RPM, div = 4) +SYS: 2393 RPM (min = 1997 RPM, div = 4) +SYS: +34°C (low = +20°C, high = +40°C) sensor = thermistor + +max1617-i2c-1-4c +Adapter: SMBus Via Pro adapter at 5000 +CPU: +44°C (low = +30°C, high = +70°C) diff --git a/sources/sample/motherboard/lmsensors/lmsensors4.txt b/sources/sample/motherboard/lmsensors/lmsensors4.txt new file mode 100644 index 0000000..22a2d65 --- /dev/null +++ b/sources/sample/motherboard/lmsensors/lmsensors4.txt @@ -0,0 +1,18 @@ +smsc47m1-isa-0680 +Adapter: ISA adapter +CPU fan: 2507 RPM (min = 640 RPM, div = 8) + +adm1025-i2c-0-2d +Adapter: SMBus I801 adapter at e000 +CPU I/O (+1.5V): + +1.51 V (min = +1.35 V, max = +1.65 V) +CPU Core (+1.75V): + +1.72 V (min = +1.66 V, max = +1.84 V) ++3.3V: +3.33 V (min = +2.97 V, max = +3.63 V) ++5V: +5.21 V (min = +4.50 V, max = +5.50 V) ++3.3V standby: + +3.27 V (min = +2.97 V, max = +3.63 V) +CPU Temp: +34.0 C (low = +10 C, high = +60 C) +M/B Temp: +33.0 C (low = +10 C, high = +45 C) +vid: +1.750 V (VRM Version 9.0) + diff --git a/sources/sample/motherboard/lmsensors/lmsensors5.txt b/sources/sample/motherboard/lmsensors/lmsensors5.txt new file mode 100644 index 0000000..87e64f5 --- /dev/null +++ b/sources/sample/motherboard/lmsensors/lmsensors5.txt @@ -0,0 +1,30 @@ +eeprom-i2c-0-50 +Adapter: SMBus PIIX4 adapter at f0b0 +Unknown EEPROM type (54) + +eeprom-i2c-0-54 +Adapter: SMBus PIIX4 adapter at f0b0 +Memory type: SDR SDRAM DIMM +Memory size (MB): 128 + +eeprom-i2c-0-55 +Adapter: SMBus PIIX4 adapter at f0b0 +Memory type: SDR SDRAM DIMM +Memory size (MB): 128 + +eeprom-i2c-0-56 +Adapter: SMBus PIIX4 adapter at f0b0 +Memory type: SDR SDRAM DIMM +Memory size (MB): 128 + +fscpos-i2c-0-73 +Adapter: SMBus PIIX4 adapter at f0b0 +temp1: +38.00 C +temp2: +28.00 C +temp3: failed +fan1: 1440 RPM +fan2: 0 RPM +fan3: 3120 RPM +volt12: +11.91 V +volt5: +5.12 V +voltbatt: +3.15 V diff --git a/sources/sample/motherboard/lmsensors/lmsensors6.txt b/sources/sample/motherboard/lmsensors/lmsensors6.txt new file mode 100644 index 0000000..2b3a188 --- /dev/null +++ b/sources/sample/motherboard/lmsensors/lmsensors6.txt @@ -0,0 +1,29 @@ +it8716-isa-0228 +Adapter: ISA adapter +VCore: +0.99 V (min = +0.00 V, max = +4.08 V) +VDDR: +1.89 V (min = +0.00 V, max = +4.08 V) ++3.3V: +3.38 V (min = +0.00 V, max = +4.08 V) ++5V: +5.08 V (min = +0.00 V, max = +6.85 V) ++12V: +12.16 V (min = +0.00 V, max = +16.32 V) +in5: +3.25 V (min = +0.00 V, max = +4.08 V) +in6: +0.10 V (min = +0.00 V, max = +4.08 V) +5VSB: +4.95 V (min = +0.00 V, max = +6.85 V) +VBat: +3.26 V +fan1: 1374 RPM (min = 0 RPM) +fan2: 0 RPM (min = 0 RPM) +temp1: +42°C (low = +127°C, high = +127°C) sensor = thermistor +temp2: +37°C (low = +127°C, high = +127°C) sensor = thermistor +temp3: +28°C (low = +127°C, high = +127°C) sensor = diode +vid: +1.000 V + +k8temp-pci-00c3 +Adapter: PCI adapter +Core0 Temp: + +31°C +Core0 Temp: + +21°C +Core1 Temp: + +29°C +Core1 Temp: + +21°C + diff --git a/sources/sample/motherboard/lmsensors/lmsensors7.txt b/sources/sample/motherboard/lmsensors/lmsensors7.txt new file mode 100644 index 0000000..c1642ce --- /dev/null +++ b/sources/sample/motherboard/lmsensors/lmsensors7.txt @@ -0,0 +1,24 @@ +asb100-i2c-1-2d +Adapter: SMBus nForce2 adapter at 5500 +VCore 1: +1.60 V (min = +1.25 V, max = +1.87 V) ++3.3V: +3.30 V (min = +2.96 V, max = +3.63 V) ++5V: +5.05 V (min = +4.49 V, max = +5.51 V) ++12V: +11.55 V (min = +9.55 V, max = +14.41 V) +-12V (reserved): + -12.07 V (min = -0.00 V, max = -0.00 V) +-5V (reserved): + -5.06 V (min = -0.00 V, max = -0.00 V) +CPU Fan: 11065 RPM (min = -1 RPM, div = 2) +Chassis Fan: + 2755 RPM (min = -1 RPM, div = 2) +Power Fan: 0 RPM (min = -1 RPM, div = 2) +M/B Temp: +34 C (high = +80 C, hyst = +75 C) +CPU Temp (Intel): + +25 C (high = +80 C, hyst = +75 C) +Power Temp: + -0 C (high = +80 C, hyst = +75 C) +CPU Temp (AMD): + +25 C (high = +80 C, hyst = +75 C) +vid: +1.575 V (VRM Version 9.0) +alarms: + diff --git a/sources/sample/motherboard/lmsensors/lmsensors8.txt b/sources/sample/motherboard/lmsensors/lmsensors8.txt new file mode 100644 index 0000000..880f25f --- /dev/null +++ b/sources/sample/motherboard/lmsensors/lmsensors8.txt @@ -0,0 +1,24 @@ +coretemp-isa-0000 +Adapter: ISA adapter +Core 0: +49.0°C (high = +74.0°C, crit = +100.0°C) +Core 1: +46.0°C (high = +74.0°C, crit = +100.0°C) + + +fam15h_power-pci-00c4 +Adapter: PCI adapter +power1: 85.74 W + + +fam15h_power-pci-00c4 +Adapter: PCI adapter +power1: 71.17 W (crit = 95.04 W) + +mcp3021-i2c-0-4d +Adapter: MPC adapter +in0: +0.19 V (min = +0.19 V, max = +0.21 V) +curr1: +0.99 A (min = +0.93 A, max = +1.05 A) + +mcp3021-i2c-1-4d +Adapter: MPC adapter +in0: +0.40 V (min = +0.40 V, max = +0.41 V) +curr1: +2.01 A (min = +1.98 A, max = +2.02 A) diff --git a/sources/sample/motherboard/lmsensors/lmsensors9.txt b/sources/sample/motherboard/lmsensors/lmsensors9.txt new file mode 100644 index 0000000..f8f646a --- /dev/null +++ b/sources/sample/motherboard/lmsensors/lmsensors9.txt @@ -0,0 +1,14 @@ +power_meter-acpi-0 +Adapter: ACPI interface +power1: 4.29 MW (interval = 2.00 s) + +coretemp-isa-0000 +Adapter: ISA adapter +Physical id 0: +56.0°C (high = +87.0°C, crit = +97.0°C) +Core 0: +54.0°C (high = +87.0°C, crit = +97.0°C) +Core 1: +56.0°C (high = +87.0°C, crit = +97.0°C) +Core 2: +53.0°C (high = +87.0°C, crit = +97.0°C) +Core 3: +53.0°C (high = +87.0°C, crit = +97.0°C) +Core 4: +53.0°C (high = +87.0°C, crit = +97.0°C) +Core 5: +52.0°C (high = +87.0°C, crit = +97.0°C) + diff --git a/sources/sample/motherboard/mbm5/MBM51.csv b/sources/sample/motherboard/mbm5/MBM51.csv new file mode 100644 index 0000000..ee9a2fb --- /dev/null +++ b/sources/sample/motherboard/mbm5/MBM51.csv @@ -0,0 +1,11 @@ +;;;Case;CPU;Sensor 3;Core 0;Core 1;+3.3;+5.00;+12.00;-12.00;-5.00;Fan 1;Fan 2;Fan 3; +23/02/2008;15:45:18;2000 MHz;45 C;53 C;0 C;1,68 V;0,00 V;3,23 V;4,92 V;12,28 V;1,54 V;2,29 V;5037 RPM; +23/02/2008;15:44:48;2000 MHz;45 C;53 C;0 C;1,68 V;0,00 V;3,25 V;4,89 V;12,28 V;1,54 V;2,34 V;5113 RPM; +23/02/2008;15:44:18;2000 MHz;45 C;53 C;0 C;1,66 V;0,00 V;3,25 V;4,89 V;12,28 V;1,63 V;2,34 V;5113 RPM; +23/02/2008;15:43:48;2000 MHz;45 C;53 C;0 C;1,66 V;0,00 V;3,23 V;4,89 V;12,28 V;1,54 V;2,29 V;5037 RPM; +23/02/2008;15:43:18;2000 MHz;45 C;53 C;0 C;1,68 V;0,00 V;3,23 V;4,92 V;12,28 V;1,54 V;2,34 V;5113 RPM; +23/02/2008;15:42:48;2000 MHz;45 C;53 C;0 C;1,68 V;0,00 V;3,25 V;4,89 V;12,28 V;1,54 V;2,34 V;5037 RPM; +23/02/2008;15:42:18;2000 MHz;45 C;53 C;0 C;1,66 V;0,00 V;3,23 V;4,89 V;12,40 V;1,63 V;2,34 V;5037 RPM; +23/02/2008;15:41:48;2000 MHz;45 C;53 C;0 C;1,68 V;0,00 V;3,25 V;4,89 V;12,28 V;1,54 V;2,29 V;5113 RPM; +23/02/2008;15:41:18;2000 MHz;45 C;53 C;0 C;1,68 V;0,00 V;3,23 V;4,87 V;12,34 V;1,63 V;2,34 V;5113 RPM; +23/02/2008;15:40:48;2000 MHz;45 C;53 C;0 C;1,68 V;0,00 V;3,23 V;4,89 V;12,28 V;1,46 V;2,29 V;5037 RPM; diff --git a/sources/sample/plugin_bat/README b/sources/sample/plugin_bat/README new file mode 100644 index 0000000..1e417a3 --- /dev/null +++ b/sources/sample/plugin_bat/README @@ -0,0 +1,4 @@ +FILE CONTENT OF +ac_state cat /proc/acpi/ac_adapter/AC/state +battery_info cat /proc/acpi/battery/BAT0/info +battery_state cat /proc/acpi/battery/BAT0/state diff --git a/sources/sample/plugin_bat/ac_state1.txt b/sources/sample/plugin_bat/ac_state1.txt new file mode 100644 index 0000000..9ad8d30 --- /dev/null +++ b/sources/sample/plugin_bat/ac_state1.txt @@ -0,0 +1 @@ +state: on-line diff --git a/sources/sample/plugin_bat/battery_info1.txt b/sources/sample/plugin_bat/battery_info1.txt new file mode 100644 index 0000000..b3a49a9 --- /dev/null +++ b/sources/sample/plugin_bat/battery_info1.txt @@ -0,0 +1,13 @@ +present: yes +design capacity: 50000 mWh +last full capacity: 50000 mWh +battery technology: rechargeable +design voltage: 10000 mV +design capacity warning: 100 mWh +design capacity low: 50 mWh +capacity granularity 1: 1 mWh +capacity granularity 2: 1 mWh +model number: 1 +serial number: 0 +battery type: VBOX +OEM info: innotek diff --git a/sources/sample/plugin_bat/battery_state1.txt b/sources/sample/plugin_bat/battery_state1.txt new file mode 100644 index 0000000..a9d4759 --- /dev/null +++ b/sources/sample/plugin_bat/battery_state1.txt @@ -0,0 +1,6 @@ +present: yes +capacity state: ok +charging state: charged +present rate: 0 mW +remaining capacity: 50000 mWh +present voltage: 10000 mV diff --git a/sources/sample/plugin_bat/log_LenovoT530.txt b/sources/sample/plugin_bat/log_LenovoT530.txt new file mode 100644 index 0000000..574b245 --- /dev/null +++ b/sources/sample/plugin_bat/log_LenovoT530.txt @@ -0,0 +1,31 @@ +---Sun, 12 May 2013 18:32:54 +0000 GMT--- Reading: /sys/class/power_supply/BAT0/uevent +POWER_SUPPLY_NAME=BAT0 +POWER_SUPPLY_STATUS=Unknown +POWER_SUPPLY_PRESENT=1 +POWER_SUPPLY_TECHNOLOGY=Li-ion +POWER_SUPPLY_CYCLE_COUNT=0 +POWER_SUPPLY_VOLTAGE_MIN_DESIGN=10800000 +POWER_SUPPLY_VOLTAGE_NOW=12365000 +POWER_SUPPLY_POWER_NOW=0 +POWER_SUPPLY_ENERGY_FULL_DESIGN=56160000 +POWER_SUPPLY_ENERGY_FULL=44350000 +POWER_SUPPLY_ENERGY_NOW=43580000 +POWER_SUPPLY_CAPACITY=98 +POWER_SUPPLY_CAPACITY_LEVEL=Normal +POWER_SUPPLY_MODEL_NAME=45N1001 +POWER_SUPPLY_MANUFACTURER=SANYO +POWER_SUPPLY_SERIAL_NUMBER=18990 +---Sun, 12 May 2013 18:32:54 +0000 GMT--- Reading: /sys/class/power_supply/BAT0/voltage_min_design +10800000 +---Sun, 12 May 2013 18:32:54 +0000 GMT--- Reading: /sys/class/power_supply/BAT0/voltage_now +12367000 +---Sun, 12 May 2013 18:32:54 +0000 GMT--- Reading: /sys/class/power_supply/BAT0/energy_full +44350000 +---Sun, 12 May 2013 18:32:54 +0000 GMT--- Reading: /sys/class/power_supply/BAT0/energy_now +43580000 +---Sun, 12 May 2013 18:32:54 +0000 GMT--- Reading: /sys/class/power_supply/BAT0/capacity +98 +---Sun, 12 May 2013 18:32:54 +0000 GMT--- Reading: /sys/class/power_supply/BAT0/technology +Li-ion +---Sun, 12 May 2013 18:32:54 +0000 GMT--- Reading: /sys/class/power_supply/BAT0/status +Unknown diff --git a/sources/sample/plugin_bat/log_android233.txt b/sources/sample/plugin_bat/log_android233.txt new file mode 100644 index 0000000..948cfc5 --- /dev/null +++ b/sources/sample/plugin_bat/log_android233.txt @@ -0,0 +1,37 @@ +---Sun, 12 May 2013 18:32:54 +0000 GMT--- Reading: /sys/class/power_supply/battery/uevent +POWER_SUPPLY_NAME=battery +POWER_SUPPLY_STATUS=Charging +POWER_SUPPLY_HEALTH=Good +POWER_SUPPLY_PRESENT=1 +POWER_SUPPLY_TECHNOLOGY=Li-ion +POWER_SUPPLY_VOLTAGE_MAX_DESIGN=4300 +POWER_SUPPLY_VOLTAGE_MIN_DESIGN=2800 +POWER_SUPPLY_VOLTAGE_NOW=4200 +POWER_SUPPLY_CAPACITY=100 +POWER_SUPPLY_BATT_TEMP=300 +POWER_SUPPLY_BATT_TEMP_ADC=82 +POWER_SUPPLY_BATT_VOL=4200 +POWER_SUPPLY_BATT_VOL_ADC=3707 +POWER_SUPPLY_BATT_VF_ADC=0 +POWER_SUPPLY_BATT_VOL_ADC_AVER=3707 +POWER_SUPPLY_BATT_TEMP_ADC_AVER=82 +POWER_SUPPLY_BATT_VOL_AVER=0 +POWER_SUPPLY_BATT_TEMP_AVER=15 +---Sun, 12 May 2013 18:32:54 +0000 GMT--- Reading: /sys/class/power_supply/battery/capacity +100 +---Sun, 12 May 2013 18:32:54 +0000 GMT--- Reading: /sys/class/power_supply/battery/batt_temp +300 +---Sun, 12 May 2013 18:32:54 +0000 GMT--- Reading: /sys/class/power_supply/battery/batt_temp_adc +82 +---Sun, 12 May 2013 18:32:54 +0000 GMT--- Reading: /sys/class/power_supply/battery/batt_vol +4200 +---Sun, 12 May 2013 18:32:54 +0000 GMT--- Reading: /sys/class/power_supply/battery/voltage_min_design +2800 +---Sun, 12 May 2013 18:32:54 +0000 GMT--- Reading: /sys/class/power_supply/battery/voltage_max_design +4300 +---Sun, 12 May 2013 18:32:54 +0000 GMT--- Reading: /sys/class/power_supply/battery/technology +Li-ion +---Sun, 12 May 2013 18:32:54 +0000 GMT--- Reading: /sys/class/power_supply/battery/status +Charging +---Sun, 12 May 2013 18:32:54 +0000 GMT--- Reading: /sys/class/power_supply/battery/health +Good diff --git a/sources/sample/plugin_bat/log_android412.txt b/sources/sample/plugin_bat/log_android412.txt new file mode 100644 index 0000000..d49a0d6 --- /dev/null +++ b/sources/sample/plugin_bat/log_android412.txt @@ -0,0 +1,20 @@ +---Sun, 12 May 2013 18:32:54 +0000 GMT--- Reading: /sys/class/power_supply/battery/uevent +POWER_SUPPLY_NAME=battery +POWER_SUPPLY_TYPE=Battery +POWER_SUPPLY_STATUS=Charging +POWER_SUPPLY_PRESENT=1 +POWER_SUPPLY_HEALTH=Good +POWER_SUPPLY_TECHNOLOGY=Li-poly +POWER_SUPPLY_CAPACITY=100 +---Sun, 12 May 2013 18:32:54 +0000 GMT--- Reading: /sys/class/power_supply/battery/capacity +100 +---Sun, 12 May 2013 18:32:54 +0000 GMT--- Reading: /sys/class/power_supply/battery/batt_temp +330 +---Sun, 12 May 2013 18:32:54 +0000 GMT--- Reading: /sys/class/power_supply/battery/batt_vol +4181 +---Sun, 12 May 2013 18:32:54 +0000 GMT--- Reading: /sys/class/power_supply/battery/technology +Li-poly +---Sun, 12 May 2013 18:32:54 +0000 GMT--- Reading: /sys/class/power_supply/battery/status +Charging +---Sun, 12 May 2013 18:32:54 +0000 GMT--- Reading: /sys/class/power_supply/battery/health +Good diff --git a/sources/sample/plugin_bat/log_android422.txt b/sources/sample/plugin_bat/log_android422.txt new file mode 100644 index 0000000..3ce6325 --- /dev/null +++ b/sources/sample/plugin_bat/log_android422.txt @@ -0,0 +1,33 @@ +---Sun, 12 May 2013 18:32:54 +0000 GMT--- Reading: /sys/class/power_supply/battery/uevent +POWER_SUPPLY_NAME=battery +POWER_SUPPLY_STATUS=Charging +POWER_SUPPLY_CHARGE_TYPE=Fast +POWER_SUPPLY_HEALTH=Good +POWER_SUPPLY_PRESENT=1 +POWER_SUPPLY_ONLINE=3 +POWER_SUPPLY_TECHNOLOGY=Li-ion +POWER_SUPPLY_VOLTAGE_MAX_DESIGN=4350000 +POWER_SUPPLY_VOLTAGE_MIN_DESIGN=3400000 +POWER_SUPPLY_VOLTAGE_NOW=3926715 +POWER_SUPPLY_CAPACITY=14 +POWER_SUPPLY_CURRENT_MAX=1000000 +POWER_SUPPLY_CURRENT_NOW=736500 +POWER_SUPPLY_TEMP=308 +POWER_SUPPLY_ENERGY_FULL=1940000000 +POWER_SUPPLY_CHARGE_NOW=46573 +---Sun, 12 May 2013 18:32:54 +0000 GMT--- Reading: /sys/class/power_supply/battery/capacity +14 +---Sun, 12 May 2013 18:32:54 +0000 GMT--- Reading: /sys/class/power_supply/battery/batt_temp_adc +308 +---Sun, 12 May 2013 18:32:54 +0000 GMT--- Reading: /sys/class/power_supply/battery/batt_vfocv +3920 +---Sun, 12 May 2013 18:32:54 +0000 GMT--- Reading: /sys/class/power_supply/battery/voltage_min_design +3400000 +---Sun, 12 May 2013 18:32:54 +0000 GMT--- Reading: /sys/class/power_supply/battery/voltage_max_design +4350000 +---Sun, 12 May 2013 18:32:54 +0000 GMT--- Reading: /sys/class/power_supply/battery/technology +Li-ion +---Sun, 12 May 2013 18:32:54 +0000 GMT--- Reading: /sys/class/power_supply/battery/status +Charging +---Sun, 12 May 2013 18:32:54 +0000 GMT--- Reading: /sys/class/power_supply/battery/health +Good diff --git a/sources/sample/plugin_bat/log_darwin_1.txt b/sources/sample/plugin_bat/log_darwin_1.txt new file mode 100644 index 0000000..913eeb3 --- /dev/null +++ b/sources/sample/plugin_bat/log_darwin_1.txt @@ -0,0 +1,41 @@ +---Sat, 11 May 2013 09:44:41 +0000 GMT--- Executing: ioreg -w0 -l -n AppleSmartBattery -r ++-o AppleSmartBattery + { + "TimeRemaining" = 0 + "AvgTimeToEmpty" = 65535 + "InstantTimeToEmpty" = 65535 + "ExternalChargeCapable" = Yes + "CellVoltage" = (4185,4183,4184,0) + "PermanentFailureStatus" = 0 + "BatteryInvalidWakeSeconds" = 30 + "AdapterInfo" = 0 + "MaxCapacity" = 5060 + "Voltage" = 12552 + "DesignCycleCount70" = 65535 + "Manufacturer" = "DP" + "Location" = 0 + "CurrentCapacity" = 5060 + "LegacyBatteryInfo" = {"Amperage"=234,"Flags"=5,"Capacity"=5060,"Current"=5060,"Voltage"=12552,"Cycle Count"=548} + "FirmwareSerialNumber" = 60664 + "BatteryInstalled" = Yes + "PackReserve" = 200 + "CycleCount" = 548 + "DesignCapacity" = 5770 + "OperationStatus" = 58435 + "ManufactureDate" = 15764 + "AvgTimeToFull" = 0 + "BatterySerialNumber" = "9G0520ESBD3MA" + "PostDischargeWaitSeconds" = 120 + "Temperature" = 3062 + "MaxErr" = 1 + "ManufacturerData" = <000000000201000201580000024b3663033030310341544c00170000> + "FullyCharged" = Yes + "InstantAmperage" = 0 + "DeviceName" = "bq20z451" + "IOGeneralInterest" = "IOCommand is not serializable" + "Amperage" = 234 + "IsCharging" = No + "DesignCycleCount9C" = 1000 + "PostChargeWaitSeconds" = 120 + "ExternalConnected" = Yes + } diff --git a/sources/sample/plugin_bat/log_freebsd_1.txt b/sources/sample/plugin_bat/log_freebsd_1.txt new file mode 100644 index 0000000..61582b0 --- /dev/null +++ b/sources/sample/plugin_bat/log_freebsd_1.txt @@ -0,0 +1,18 @@ +---Sat, 11 May 2013 09:44:41 +0000 GMT--- Executing: acpiconf -i batt +Design capacity: 50000 mWh +Last full capacity: 50000 mWh +Technology: secondary (rechargeable) +Design voltage: 10000 mV +Capacity (warn): 100 mWh +Capacity (low): 50 mWh +Low/warn granularity: 1 mWh +Warn/full granularity: 1 mWh +Model number: 1 +Serial number: 0 +Type: VBOX +OEM info: innotek +State: high +Remaining capacity: 100% +Remaining time: unknown +Present rate: 0 mW +Present voltage: 10000 mV diff --git a/sources/sample/plugin_bat/log_freebsd_2.txt b/sources/sample/plugin_bat/log_freebsd_2.txt new file mode 100644 index 0000000..c19ea76 --- /dev/null +++ b/sources/sample/plugin_bat/log_freebsd_2.txt @@ -0,0 +1,18 @@ +---Sat, 11 May 2013 09:44:41 +0000 GMT--- Executing: acpiconf -i batt +Design capacity: 4800 mAh +Last full capacity: 3824 mAh +Technology: secondary (rechargeable) +Design voltage: 14800 mV +Capacity (warn): 240 mAh +Capacity (low): 144 mAh +Low/warn granularity: 264 mAh +Warn/full granularity: 3780 mAh +Model number: Primary +Serial number: +Type: Lion +OEM info: ACER +State: discharging +Remaining capacity: 95% +Remaining time: unknown +Present rate: 0 mA +Voltage: 16391 mV diff --git a/sources/sample/plugin_bat/log_test_1.txt b/sources/sample/plugin_bat/log_test_1.txt new file mode 100644 index 0000000..e758545 --- /dev/null +++ b/sources/sample/plugin_bat/log_test_1.txt @@ -0,0 +1,22 @@ +---Sun, 12 May 2013 18:32:54 +0000 GMT--- Reading: /proc/acpi/battery/BAT0/state +present: yes +capacity state: ok +charging state: charged +present rate: 0 mA +remaining capacity: 1009 mAh +present voltage: 12167 mV +---Sun, 12 May 2013 18:32:54 +0000 GMT--- Reading: /proc/acpi/battery/BAT0/info +present: yes +design capacity: 4400 mAh +last full capacity: 1009 mAh +battery technology: rechargeable +design voltage: 10800 mV +design capacity warning: 220 mAh +design capacity low: 132 mAh +cycle count: 0 +capacity granularity 1: 264 mAh +capacity granularity 2: 3780 mAh +model number: Li_Ion_4000mA +serial number: 0000 +battery type: Lion +OEM info: SANYO diff --git a/sources/sample/plugin_bat/log_test_2.txt b/sources/sample/plugin_bat/log_test_2.txt new file mode 100644 index 0000000..4859889 --- /dev/null +++ b/sources/sample/plugin_bat/log_test_2.txt @@ -0,0 +1,22 @@ +---Sun, 12 May 2013 18:32:54 +0000 GMT--- Reading: /proc/acpi/battery/BAT0/state +present: yes +capacity state: ok +charging state: charged +present rate: 0 mW +remaining capacity: 70380 mWh +present voltage: 12400 mV +---Sun, 12 May 2013 18:32:54 +0000 GMT--- Reading: /proc/acpi/battery/BAT0/info +present: yes +design capacity: 82280 mWh +last full capacity: 72420 mWh +battery technology: rechargeable +design voltage: 10800 mV +design capacity warning: 3621 mWh +design capacity low: 200 mWh +cycle count: 0 +capacity granularity 1: 1 mWh +capacity granularity 2: 1 mWh +model number: 92P1137 +serial number: 999 +battery type: LION +OEM info: SANYO diff --git a/sources/sample/plugin_bat/log_vbox.txt b/sources/sample/plugin_bat/log_vbox.txt new file mode 100644 index 0000000..e9e6c08 --- /dev/null +++ b/sources/sample/plugin_bat/log_vbox.txt @@ -0,0 +1,31 @@ +---Sun, 12 May 2013 18:32:54 +0000 GMT--- Reading: /sys/class/power_supply/BAT0/uevent +POWER_SUPPLY_NAME=BAT0 +POWER_SUPPLY_STATUS=Unknown +POWER_SUPPLY_PRESENT=1 +POWER_SUPPLY_TECHNOLOGY=Unknown +POWER_SUPPLY_CYCLE_COUNT=0 +POWER_SUPPLY_VOLTAGE_MIN_DESIGN=10000000 +POWER_SUPPLY_VOLTAGE_NOW=10000000 +POWER_SUPPLY_POWER_NOW=0 +POWER_SUPPLY_ENERGY_FULL_DESIGN=50000000 +POWER_SUPPLY_ENERGY_FULL=50000000 +POWER_SUPPLY_ENERGY_NOW=49000000 +POWER_SUPPLY_CAPACITY=98 +POWER_SUPPLY_CAPACITY_LEVEL=Normal +POWER_SUPPLY_MODEL_NAME=1 +POWER_SUPPLY_MANUFACTURER=innotek +POWER_SUPPLY_SERIAL_NUMBER=0 +---Sun, 12 May 2013 18:32:54 +0000 GMT--- Reading: /sys/class/power_supply/BAT0/voltage_min_design +10000000 +---Sun, 12 May 2013 18:32:54 +0000 GMT--- Reading: /sys/class/power_supply/BAT0/voltage_now +10000000 +---Sun, 12 May 2013 18:32:54 +0000 GMT--- Reading: /sys/class/power_supply/BAT0/energy_full +50000000 +---Sun, 12 May 2013 18:32:54 +0000 GMT--- Reading: /sys/class/power_supply/BAT0/energy_now +49000000 +---Sun, 12 May 2013 18:32:54 +0000 GMT--- Reading: /sys/class/power_supply/BAT0/capacity +98 +---Sun, 12 May 2013 18:32:54 +0000 GMT--- Reading: /sys/class/power_supply/BAT0/technology +Unknown +---Sun, 12 May 2013 18:32:54 +0000 GMT--- Reading: /sys/class/power_supply/BAT0/status +Unknown diff --git a/sources/sample/plugin_dmraid/dmraid1.txt b/sources/sample/plugin_dmraid/dmraid1.txt new file mode 100644 index 0000000..0abe975 --- /dev/null +++ b/sources/sample/plugin_dmraid/dmraid1.txt @@ -0,0 +1,98 @@ +NOTICE: /dev/sde: asr discovering +NOTICE: /dev/sde: ddf1 discovering +NOTICE: /dev/sde: hpt37x discovering +NOTICE: /dev/sde: hpt45x discovering +NOTICE: /dev/sde: isw discovering +NOTICE: /dev/sde: isw metadata discovered +NOTICE: /dev/sde: jmicron discovering +NOTICE: /dev/sde: lsi discovering +NOTICE: /dev/sde: nvidia discovering +NOTICE: /dev/sde: pdc discovering +NOTICE: /dev/sde: sil discovering +NOTICE: /dev/sde: via discovering +NOTICE: /dev/sdf: asr discovering +NOTICE: /dev/sdf: ddf1 discovering +NOTICE: /dev/sdf: hpt37x discovering +NOTICE: /dev/sdf: hpt45x discovering +NOTICE: /dev/sdf: isw discovering +NOTICE: /dev/sdf: isw metadata discovered +NOTICE: /dev/sdf: jmicron discovering +NOTICE: /dev/sdf: lsi discovering +NOTICE: /dev/sdf: nvidia discovering +NOTICE: /dev/sdf: pdc discovering +NOTICE: /dev/sdf: sil discovering +NOTICE: /dev/sdf: via discovering +NOTICE: /dev/sdb: asr discovering +NOTICE: /dev/sdb: ddf1 discovering +NOTICE: /dev/sdb: hpt37x discovering +NOTICE: /dev/sdb: hpt45x discovering +NOTICE: /dev/sdb: isw discovering +NOTICE: /dev/sdb: isw metadata discovered +NOTICE: /dev/sdb: jmicron discovering +NOTICE: /dev/sdb: lsi discovering +NOTICE: /dev/sdb: nvidia discovering +NOTICE: /dev/sdb: pdc discovering +NOTICE: /dev/sdb: sil discovering +NOTICE: /dev/sdb: via discovering +NOTICE: /dev/sda: asr discovering +NOTICE: /dev/sda: ddf1 discovering +NOTICE: /dev/sda: hpt37x discovering +NOTICE: /dev/sda: hpt45x discovering +NOTICE: /dev/sda: isw discovering +NOTICE: /dev/sda: isw metadata discovered +NOTICE: /dev/sda: jmicron discovering +NOTICE: /dev/sda: lsi discovering +NOTICE: /dev/sda: nvidia discovering +NOTICE: /dev/sda: pdc discovering +NOTICE: /dev/sda: sil discovering +NOTICE: /dev/sda: via discovering +NOTICE: /dev/sdc: asr discovering +NOTICE: /dev/sdc: ddf1 discovering +NOTICE: /dev/sdc: hpt37x discovering +NOTICE: /dev/sdc: hpt45x discovering +NOTICE: /dev/sdc: isw discovering +NOTICE: /dev/sdc: isw metadata discovered +NOTICE: /dev/sdc: jmicron discovering +NOTICE: /dev/sdc: lsi discovering +NOTICE: /dev/sdc: nvidia discovering +NOTICE: /dev/sdc: pdc discovering +NOTICE: /dev/sdc: sil discovering +NOTICE: /dev/sdc: via discovering +NOTICE: /dev/sdd: asr discovering +NOTICE: /dev/sdd: ddf1 discovering +NOTICE: /dev/sdd: hpt37x discovering +NOTICE: /dev/sdd: hpt45x discovering +NOTICE: /dev/sdd: isw discovering +NOTICE: /dev/sdd: isw metadata discovered +NOTICE: /dev/sdd: jmicron discovering +NOTICE: /dev/sdd: lsi discovering +NOTICE: /dev/sdd: nvidia discovering +NOTICE: /dev/sdd: pdc discovering +NOTICE: /dev/sdd: sil discovering +NOTICE: /dev/sdd: via discovering +NOTICE: added /dev/sde to RAID set "isw_jffegbfhc" +NOTICE: added /dev/sdf to RAID set "isw_jffegbfhc" +NOTICE: added /dev/sdb to RAID set "isw_deagibdgda" +NOTICE: added /dev/sda to RAID set "isw_deagibdgda" +NOTICE: added /dev/sdc to RAID set "isw_jffegbfhc" +NOTICE: added /dev/sdd to RAID set "isw_jffegbfhc" +*** Group superset isw_deagibdgda +--> Active Subset +name : isw_deagibdgda_root +size : 125040896 +stride : 128 +type : mirror +status : ok +subsets: 0 +devs : 2 +spares : 0 +*** Group superset isw_jffegbfhc +--> Active Superset +name : isw_jffegbfhc_data +size : 3131113472 +stride : 128 +type : raid01 +status : ok +subsets: 2 +devs : 4 +spares : 0 diff --git a/sources/sample/plugin_dmraid/dmraid2.txt b/sources/sample/plugin_dmraid/dmraid2.txt new file mode 100644 index 0000000..589aa6b --- /dev/null +++ b/sources/sample/plugin_dmraid/dmraid2.txt @@ -0,0 +1,121 @@ +ERROR: ddf1: seeking device "/dev/dm-4" to 18446744073709421056 +ERROR: hpt37x: seeking device "/dev/dm-4" to 4608 +ERROR: hpt45x: seeking device "/dev/dm-4" to 18446744073709547008 +ERROR: pdc: seeking device "/dev/dm-4" to 137438913024 +ERROR: pdc: seeking device "/dev/dm-4" to 137438920192 +ERROR: pdc: seeking device "/dev/dm-4" to 137438927360 +ERROR: pdc: seeking device "/dev/dm-4" to 137438934528 +ERROR: sil: seeking device "/dev/dm-4" to 18446744073709289984 +NOTICE: /dev/dm-5: asr discovering +NOTICE: /dev/dm-5: ddf1 discovering +NOTICE: /dev/dm-5: hpt37x discovering +NOTICE: /dev/dm-5: hpt45x discovering +NOTICE: /dev/dm-5: isw discovering +NOTICE: /dev/dm-5: jmicron discovering +NOTICE: /dev/dm-5: lsi discovering +NOTICE: /dev/dm-5: nvidia discovering +NOTICE: /dev/dm-5: pdc discovering +NOTICE: /dev/dm-5: sil discovering +NOTICE: /dev/dm-5: via discovering +NOTICE: /dev/dm-4: asr discovering +NOTICE: /dev/dm-4: ddf1 discovering +NOTICE: /dev/dm-4: hpt37x discovering +NOTICE: /dev/dm-4: hpt45x discovering +NOTICE: /dev/dm-4: isw discovering +NOTICE: /dev/dm-4: jmicron discovering +NOTICE: /dev/dm-4: lsi discovering +NOTICE: /dev/dm-4: nvidia discovering +NOTICE: /dev/dm-4: pdc discovering +NOTICE: /dev/dm-4: sil discovering +NOTICE: /dev/dm-4: via discovering +NOTICE: /dev/dm-3: asr discovering +NOTICE: /dev/dm-3: ddf1 discovering +NOTICE: /dev/dm-3: hpt37x discovering +NOTICE: /dev/dm-3: hpt45x discovering +NOTICE: /dev/dm-3: isw discovering +NOTICE: /dev/dm-3: jmicron discovering +NOTICE: /dev/dm-3: lsi discovering +NOTICE: /dev/dm-3: nvidia discovering +NOTICE: /dev/dm-3: pdc discovering +NOTICE: /dev/dm-3: sil discovering +NOTICE: /dev/dm-3: via discovering +NOTICE: /dev/dm-2: asr discovering +NOTICE: /dev/dm-2: ddf1 discovering +NOTICE: /dev/dm-2: hpt37x discovering +NOTICE: /dev/dm-2: hpt45x discovering +NOTICE: /dev/dm-2: isw discovering +NOTICE: /dev/dm-2: jmicron discovering +NOTICE: /dev/dm-2: lsi discovering +NOTICE: /dev/dm-2: nvidia discovering +NOTICE: /dev/dm-2: pdc discovering +NOTICE: /dev/dm-2: sil discovering +NOTICE: /dev/dm-2: via discovering +NOTICE: /dev/dm-1: asr discovering +NOTICE: /dev/dm-1: ddf1 discovering +NOTICE: /dev/dm-1: hpt37x discovering +NOTICE: /dev/dm-1: hpt45x discovering +NOTICE: /dev/dm-1: isw discovering +NOTICE: /dev/dm-1: jmicron discovering +NOTICE: /dev/dm-1: lsi discovering +NOTICE: /dev/dm-1: nvidia discovering +NOTICE: /dev/dm-1: pdc discovering +NOTICE: /dev/dm-1: sil discovering +NOTICE: /dev/dm-1: via discovering +NOTICE: /dev/dm-0: asr discovering +NOTICE: /dev/dm-0: ddf1 discovering +NOTICE: /dev/dm-0: hpt37x discovering +NOTICE: /dev/dm-0: hpt45x discovering +NOTICE: /dev/dm-0: isw discovering +NOTICE: /dev/dm-0: jmicron discovering +NOTICE: /dev/dm-0: lsi discovering +NOTICE: /dev/dm-0: nvidia discovering +NOTICE: /dev/dm-0: pdc discovering +NOTICE: /dev/dm-0: sil discovering +NOTICE: /dev/dm-0: via discovering +NOTICE: /dev/sda: asr discovering +NOTICE: /dev/sda: ddf1 discovering +NOTICE: /dev/sda: hpt37x discovering +NOTICE: /dev/sda: hpt45x discovering +NOTICE: /dev/sda: isw discovering +NOTICE: /dev/sda: jmicron discovering +NOTICE: /dev/sda: lsi discovering +NOTICE: /dev/sda: nvidia discovering +NOTICE: /dev/sda: pdc discovering +NOTICE: /dev/sda: sil discovering +NOTICE: /dev/sda: via discovering +NOTICE: /dev/sdc: asr discovering +NOTICE: /dev/sdc: ddf1 discovering +NOTICE: /dev/sdc: ddf1 metadata discovered +NOTICE: /dev/sdc: hpt37x discovering +NOTICE: /dev/sdc: hpt45x discovering +NOTICE: /dev/sdc: isw discovering +NOTICE: /dev/sdc: jmicron discovering +NOTICE: /dev/sdc: lsi discovering +NOTICE: /dev/sdc: nvidia discovering +NOTICE: /dev/sdc: pdc discovering +NOTICE: /dev/sdc: sil discovering +NOTICE: /dev/sdc: via discovering +NOTICE: /dev/sdb: asr discovering +NOTICE: /dev/sdb: ddf1 discovering +NOTICE: /dev/sdb: ddf1 metadata discovered +NOTICE: /dev/sdb: hpt37x discovering +NOTICE: /dev/sdb: hpt45x discovering +NOTICE: /dev/sdb: isw discovering +NOTICE: /dev/sdb: jmicron discovering +NOTICE: /dev/sdb: lsi discovering +NOTICE: /dev/sdb: nvidia discovering +NOTICE: /dev/sdb: pdc discovering +NOTICE: /dev/sdb: sil discovering +NOTICE: /dev/sdb: via discovering +NOTICE: added /dev/sdc to RAID set ".ddf1_disks" +NOTICE: added /dev/sdb to RAID set ".ddf1_disks" +*** Group superset .ddf1_disks +--> Active Subset +name : ddf1_RAID1 +size : 1953253376 +stride : 128 +type : mirror +status : ok +subsets: 0 +devs : 2 +spares : 0 diff --git a/sources/sample/plugin_dmraid/dmraid3.txt b/sources/sample/plugin_dmraid/dmraid3.txt new file mode 100644 index 0000000..632da97 --- /dev/null +++ b/sources/sample/plugin_dmraid/dmraid3.txt @@ -0,0 +1,22 @@ +ERROR: pdc: device /dev/hde broken in RAID set "pdc_bfcgjjgge" [1/2] +ERROR: keeping degraded mirror set "pdc_bfcgjjgge" +ERROR: pdc: device /dev/hdg broken in RAID set "pdc_dibachbhfh" [1/2] +ERROR: keeping degraded mirror set "pdc_dibachbhfh" +*** Set +name : pdc_bfcgjjgge +size : 78150656 +stride : 128 +type : mirror +status : broken +subsets: 0 +devs : 1 +spares : 0 +*** Set +name : pdc_dibachbhfh +size : 78150656 +stride : 128 +type : mirror +status : broken +subsets: 0 +devs : 1 +spares : 0 diff --git a/sources/sample/plugin_dmraid/dmraid4.txt b/sources/sample/plugin_dmraid/dmraid4.txt new file mode 100644 index 0000000..442940d --- /dev/null +++ b/sources/sample/plugin_dmraid/dmraid4.txt @@ -0,0 +1,63 @@ +NOTICE: skipping removable device /dev/sdd +NOTICE: skipping removable device /dev/sde +NOTICE: skipping removable device /dev/sdf +NOTICE: skipping removable device /dev/sdg +NOTICE: /dev/sdc: asr discovering +NOTICE: /dev/sdc: ddf1 discovering +NOTICE: /dev/sdc: hpt37x discovering +NOTICE: /dev/sdc: hpt45x discovering +NOTICE: /dev/sdc: isw discovering +NOTICE: /dev/sdc: isw metadata discovered +NOTICE: /dev/sdc: jmicron discovering +NOTICE: /dev/sdc: lsi discovering +NOTICE: /dev/sdc: nvidia discovering +NOTICE: /dev/sdc: pdc discovering +NOTICE: /dev/sdc: sil discovering +NOTICE: /dev/sdc: via discovering +NOTICE: /dev/sdb: asr discovering +NOTICE: /dev/sdb: ddf1 discovering +NOTICE: /dev/sdb: hpt37x discovering +NOTICE: /dev/sdb: hpt45x discovering +NOTICE: /dev/sdb: isw discovering +NOTICE: /dev/sdb: isw metadata discovered +NOTICE: /dev/sdb: jmicron discovering +NOTICE: /dev/sdb: lsi discovering +NOTICE: /dev/sdb: nvidia discovering +NOTICE: /dev/sdb: pdc discovering +NOTICE: /dev/sdb: sil discovering +NOTICE: /dev/sdb: via discovering +NOTICE: /dev/sda: asr discovering +NOTICE: /dev/sda: ddf1 discovering +NOTICE: /dev/sda: hpt37x discovering +NOTICE: /dev/sda: hpt45x discovering +NOTICE: /dev/sda: isw discovering +NOTICE: /dev/sda: jmicron discovering +NOTICE: /dev/sda: lsi discovering +NOTICE: /dev/sda: nvidia discovering +NOTICE: /dev/sda: pdc discovering +NOTICE: /dev/sda: sil discovering +NOTICE: /dev/sda: via discovering +NOTICE: added /dev/sdc to RAID set "isw_bfdbhjciee" +NOTICE: added /dev/sdb to RAID set "isw_bccajebghh" +ERROR: isw: wrong number of devices in RAID set "isw_bccajebghh_DATA" [1/2] on /dev/sdb +ERROR: isw: wrong number of devices in RAID set "isw_bfdbhjciee_DATA" [1/2] on /dev/sdc +*** Group superset isw_bccajebghh +--> *Inconsistent* Subset +name : isw_bccajebghh_DATA +size : 1953519872 +stride : 128 +type : mirror +status : inconsistent +subsets: 0 +devs : 1 +spares : 0 +*** Group superset isw_bfdbhjciee +--> *Inconsistent* Subset +name : isw_bfdbhjciee_DATA +size : 1953519872 +stride : 128 +type : mirror +status : inconsistent +subsets: 0 +devs : 1 +spares : 0 diff --git a/sources/sample/plugin_dmraid/dmraid5.txt b/sources/sample/plugin_dmraid/dmraid5.txt new file mode 100644 index 0000000..29b7e8b --- /dev/null +++ b/sources/sample/plugin_dmraid/dmraid5.txt @@ -0,0 +1,31 @@ +NOTICE: added /dev/sdd to RAID set "pdc_cifgjhgjdd-1" +NOTICE: added /dev/sde to RAID set "pdc_cifgjhgjdd-1" +NOTICE: added /dev/sdc to RAID set "pdc_cifgjhgjdd-0" +NOTICE: added /dev/sdb to RAID set "pdc_cifgjhgjdd-0" +*** Active Superset +name : pdc_cifgjhgjdd +size : 3517532672 +stride : 128 +type : raid10 +status : ok +subsets: 2 +devs : 4 +spares : 0 +--> Active Subset +name : pdc_cifgjhgjdd-0 +size : 3517532672 +stride : 128 +type : stripe +status : ok +subsets: 0 +devs : 2 +spares : 0 +--> Active Subset +name : pdc_cifgjhgjdd-1 +size : 3517532672 +stride : 128 +type : stripe +status : ok +subsets: 0 +devs : 2 +spares : 0 diff --git a/sources/sample/plugin_mdstat/README b/sources/sample/plugin_mdstat/README new file mode 100644 index 0000000..0e83202 --- /dev/null +++ b/sources/sample/plugin_mdstat/README @@ -0,0 +1,2 @@ +FILE CONTENT OF +raid cat /proc/mdstat diff --git a/sources/sample/plugin_mdstat/raid1.txt b/sources/sample/plugin_mdstat/raid1.txt new file mode 100644 index 0000000..533509d --- /dev/null +++ b/sources/sample/plugin_mdstat/raid1.txt @@ -0,0 +1,5 @@ +Personalities : [linear] [raid0] [raid1] [raid5] [hsm] +read_ahead 1024 sectors +md0 : active raid5 sdd1[3] sdc6[2] sdb6[1] sda5[0] 633984 blocks + level 5, 32k chunk, algorithm 2 [4/4] [UUUU] +unused devices: diff --git a/sources/sample/plugin_mdstat/raid10.txt b/sources/sample/plugin_mdstat/raid10.txt new file mode 100644 index 0000000..053b3e1 --- /dev/null +++ b/sources/sample/plugin_mdstat/raid10.txt @@ -0,0 +1,6 @@ +Personalities : [raid6] [raid5] [raid4] +md0 : active raid5 sdb[5] sda[0] sdd[4] sdc[2] + 2197329408 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/3] [U_UU] + [>....................] recovery = 0.0% (683200/732443136) finish=592.4min speed=20586K/sec + +unused devices: diff --git a/sources/sample/plugin_mdstat/raid11.txt b/sources/sample/plugin_mdstat/raid11.txt new file mode 100644 index 0000000..a88a371 --- /dev/null +++ b/sources/sample/plugin_mdstat/raid11.txt @@ -0,0 +1,6 @@ +Personalities : [raid6] [raid5] [raid4] +md0 : active raid5 sdb[5] sda[0] sdd[4] sdc[2] + 2197329408 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/3] [U_UU] + [>....................] recovery = 2.5% (18700800/732443136) finish=742.1min speed=16028K/sec + +unused devices: diff --git a/sources/sample/plugin_mdstat/raid12.txt b/sources/sample/plugin_mdstat/raid12.txt new file mode 100644 index 0000000..217a9e8 --- /dev/null +++ b/sources/sample/plugin_mdstat/raid12.txt @@ -0,0 +1,6 @@ +Personalities : [raid6] [raid5] [raid4] +md0 : active raid5 sdb[5] sda[0] sdd[4] sdc[2] + 2197329408 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/3] [U_UU] + [===>.................] recovery = 18.9% (138755104/732443136) finish=482.8min speed=20493K/sec + +unused devices: diff --git a/sources/sample/plugin_mdstat/raid2.txt b/sources/sample/plugin_mdstat/raid2.txt new file mode 100644 index 0000000..bbdb233 --- /dev/null +++ b/sources/sample/plugin_mdstat/raid2.txt @@ -0,0 +1,5 @@ +Personalities : [linear] [raid0] [raid1] [raid5] [hsm] +read_ahead 1024 sectors +md0 : active raid5 sdd1[3](F) sdc6[2] sdb6[1] sda5[0] 633984 blocks + level 5, 32k chunk, algorithm 2 [4/3] [UUU_] +unused devices: diff --git a/sources/sample/plugin_mdstat/raid3.txt b/sources/sample/plugin_mdstat/raid3.txt new file mode 100644 index 0000000..ad14f7e --- /dev/null +++ b/sources/sample/plugin_mdstat/raid3.txt @@ -0,0 +1,5 @@ +Personalities : [linear] [raid0] [raid1] [raid5] [hsm] +read_ahead 1024 sectors +md0 : active raid5 sdc6[2] sdb6[1] sda5[0] 633984 blocks level 5, + 32k chunk, algorithm 2 [4/3] [UUU_] +unused devices: diff --git a/sources/sample/plugin_mdstat/raid4.txt b/sources/sample/plugin_mdstat/raid4.txt new file mode 100644 index 0000000..af205e5 --- /dev/null +++ b/sources/sample/plugin_mdstat/raid4.txt @@ -0,0 +1,6 @@ +Personalities : [linear] [raid0] [raid1] [raid5] [hsm] +read_ahead 1024 sectors +md0 : active raid5 sdd1[4] sdc6[2] sdb6[1] sda5[0] 633984 blocks + level 5, 32k chunk, algorithm 2 [4/3] [UUU_] recovery=7% +finish=4.3min +unused devices: diff --git a/sources/sample/plugin_mdstat/raid5.txt b/sources/sample/plugin_mdstat/raid5.txt new file mode 100644 index 0000000..533509d --- /dev/null +++ b/sources/sample/plugin_mdstat/raid5.txt @@ -0,0 +1,5 @@ +Personalities : [linear] [raid0] [raid1] [raid5] [hsm] +read_ahead 1024 sectors +md0 : active raid5 sdd1[3] sdc6[2] sdb6[1] sda5[0] 633984 blocks + level 5, 32k chunk, algorithm 2 [4/4] [UUUU] +unused devices: diff --git a/sources/sample/plugin_mdstat/raid6.txt b/sources/sample/plugin_mdstat/raid6.txt new file mode 100644 index 0000000..8a8480c --- /dev/null +++ b/sources/sample/plugin_mdstat/raid6.txt @@ -0,0 +1,6 @@ +Personalities : [raid6] [raid5] [raid4] +md1 : active raid5 hdc4[3] hdc3[1] hdc2[0] + 3906816 blocks level 5, 64k chunk, algorithm 2 [3/2] [UU_] + [===>.................] recovery = 16.5% (324080/1953408) finish=8.1min speed=3315K/sec + +unused devices: diff --git a/sources/sample/plugin_mdstat/raid7.txt b/sources/sample/plugin_mdstat/raid7.txt new file mode 100644 index 0000000..1df749a --- /dev/null +++ b/sources/sample/plugin_mdstat/raid7.txt @@ -0,0 +1,5 @@ +Personalities : [raid6] [raid5] [raid4] +md0 : active raid5 sdi1[3] sde1[2] sdd1[1] sdc1[0] + 2197715712 blocks level 5, 64k chunk, algorithm 2 [4/4] [UUUU] + +unused devices: diff --git a/sources/sample/plugin_mdstat/raid8.txt b/sources/sample/plugin_mdstat/raid8.txt new file mode 100644 index 0000000..35192da --- /dev/null +++ b/sources/sample/plugin_mdstat/raid8.txt @@ -0,0 +1,11 @@ +Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] +md1 : active raid1 sdb2[2](F) sda2[1] + 155181952 blocks super 1.2 [2/1] [_U] + +md0 : active raid1 sdb1[2] sda1[1] + 975296 blocks super 1.2 [2/2] [UU] + +md2 : active raid5 sdf1[3] sdc1[0] sdd1[1] sde1[2] + 1464758784 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/4] [UUUU] + +unused devices: diff --git a/sources/sample/plugin_mdstat/raid9.txt b/sources/sample/plugin_mdstat/raid9.txt new file mode 100644 index 0000000..8e147f9 --- /dev/null +++ b/sources/sample/plugin_mdstat/raid9.txt @@ -0,0 +1,6 @@ +Personalities : [raid6] [raid5] [raid4] +md0 : active raid6 sda1[0] sdd1[4] sde1[5] sdf1[2] sdb1[1] + 2929683456 blocks super 1.2 level 6, 1024k chunk, algorithm 2 [5/5] [UUUUU] + bitmap: 0/8 pages [0KB], 65536KB chunk, file: /var/md0_intent + +unused devices: diff --git a/sources/sample/plugin_ps/README b/sources/sample/plugin_ps/README new file mode 100644 index 0000000..381b936 --- /dev/null +++ b/sources/sample/plugin_ps/README @@ -0,0 +1,3 @@ +FILE CONTENT OF +ps1 ps -eo pid,ppid,pmem,args +ps2 ps axo pid,ppid,pmem,args diff --git a/sources/sample/plugin_ps/ps1.txt b/sources/sample/plugin_ps/ps1.txt new file mode 100644 index 0000000..119dd9a --- /dev/null +++ b/sources/sample/plugin_ps/ps1.txt @@ -0,0 +1,39 @@ + PID PPID %MEM COMMAND + 1 0 0.0 init [2] +31822 1 0.0 /sbin/syslogd +31847 1 0.0 /sbin/klogd -x +31861 1 0.0 /usr/sbin/sshd + 1357 1 4.3 amavisd (master) + 1918 1 0.3 ddclient - sleeping for 50 seconds + 1923 1 1.0 /usr/bin/memcached -m 64 -p 11211 -u root + 2001 1 0.1 /usr/lib/postfix/master + 2006 1 0.0 /usr/sbin/vsftpd + 2010 2001 0.1 qmgr -l -t fifo -u + 2037 1 0.0 /usr/sbin/cron + 3516 1 0.3 /usr/sbin/munin-node + 3576 1 0.2 /usr/bin/fetchmail -f /etc/fetchmailrc --pidfile /var/run/fetchmail/fetchmail.pid --syslog + 5266 2001 0.1 tlsmgr -l -t unix -u -c +32604 1 0.8 /usr/sbin/apache2 -k start + 3097 1 0.0 /usr/bin/freshclam -d --quiet + 3599 1 8.7 /usr/sbin/clamd +13505 1 0.0 /bin/sh /usr/bin/mysqld_safe +13545 13505 2.6 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --user=mysql --pid-file=/var/run/mysqld/mysqld.pid --skip-external-locking --port=3306 --socket=/var/run/mysqld/mysqld.sock +13546 13505 0.0 logger -p daemon.err -t mysqld_safe -i -t mysqld +13988 1 0.0 /usr/sbin/dovecot +13989 13988 0.1 dovecot-auth +14041 13988 0.1 managesieve-login +14042 13988 0.1 managesieve-login +30094 13988 0.1 managesieve-login +15381 1357 4.5 amavisd (ch19-avail) +16215 13988 0.2 dovecot-auth -w + 6095 2001 0.1 pickup -l -t fifo -u -c + 9846 1357 4.4 amavisd (ch1-avail) +11585 13988 0.1 imap-login +22385 13988 0.1 imap-login +22421 32604 1.9 /usr/sbin/apache2 -k start +22424 32604 1.5 /usr/sbin/apache2 -k start +22425 32604 1.1 /usr/sbin/apache2 -k start +22432 32604 1.1 /usr/sbin/apache2 -k start +22433 32604 0.5 /usr/sbin/apache2 -k start +25851 13988 0.1 imap-login +26454 22424 0.0 ps -eo pid,ppid,pmem,args diff --git a/sources/sample/plugin_ps/ps2.txt b/sources/sample/plugin_ps/ps2.txt new file mode 100644 index 0000000..8ea7815 --- /dev/null +++ b/sources/sample/plugin_ps/ps2.txt @@ -0,0 +1,127 @@ + PID PPID %MEM COMMAND + 1 0 0.0 init [5] + 2 0 0.0 [kthreadd] + 3 2 0.0 [migration/0] + 4 2 0.0 [ksoftirqd/0] + 5 2 0.0 [events/0] + 6 2 0.0 [khelper] + 7 2 0.0 [kintegrityd/0] + 8 2 0.0 [kblockd/0] + 9 2 0.0 [kacpid] + 10 2 0.0 [kacpi_notify] + 11 2 0.0 [cqueue] + 12 2 0.0 [kseriod] + 13 2 0.0 [kondemand/0] + 14 2 0.0 [pdflush] + 15 2 0.0 [pdflush] + 16 2 0.0 [kswapd0] + 17 2 0.0 [aio/0] + 18 2 0.0 [kpsmoused] + 54 2 0.0 [ata/0] + 55 2 0.0 [ata_aux] + 57 2 0.0 [scsi_eh_0] + 58 2 0.0 [scsi_eh_1] + 202 2 0.0 [ksuspend_usbd] + 203 2 0.0 [khubd] + 510 2 0.0 [kjournald] + 592 1 0.0 /sbin/udevd --daemon + 818 2 0.0 [scsi_eh_2] + 819 2 0.0 [usb-storage] + 1303 2 0.0 [kauditd] + 1326 2 0.0 [kstriped] + 1363 2 0.0 [kjournald] + 1385 1 0.0 /sbin/mount.ntfs-3g /dev/sda1 /windows/C -v -o rw,noexec,nosuid,nodev,users,gid=100,fmask=133,dmask=022,locale=de_DE.UTF-8 + 1808 1 0.0 /sbin/acpid + 1827 1 0.0 /sbin/klogd -c 1 -x + 1843 1 0.0 /sbin/syslog-ng + 1853 1 0.0 /bin/dbus-daemon --system + 1982 1 0.2 /usr/sbin/hald --daemon=yes + 1991 1 0.1 /usr/sbin/console-kit-daemon + 2054 1982 0.0 hald-runner + 2129 2054 0.0 hald-addon-input: Listening on /dev/input/event4 /dev/input/event3 /dev/input/event2 /dev/input/event1 + 2223 2054 0.0 hald-addon-storage: no polling on /dev/fd0 because it is explicitly disabled + 2234 2054 0.0 hald-addon-storage: polling /dev/sdb (every 2 sec) + 2235 2054 0.0 hald-addon-storage: polling /dev/sdc (every 2 sec) + 2238 2054 0.0 hald-addon-storage: polling /dev/sr0 (every 2 sec) + 2246 2054 0.0 hald-addon-acpi: listening on acpid socket /var/run/acpid.socket + 2478 1 0.0 /usr/bin/kdm + 2492 2478 3.0 /usr/bin/Xorg -br -nolisten tcp :0 vt7 -auth /var/lib/xdm/authdir/authfiles/A:0-StlX1E + 2873 1 0.0 /sbin/dhcpcd --netconfig -L -E -c /etc/sysconfig/network/scripts/dhcpcd-hook -t 0 -h linux-mcr eth0 + 2911 1 0.0 /sbin/rpcbind + 3381 1 0.2 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf + 3382 3381 0.3 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf + 3383 3381 0.3 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf + 3401 1 0.0 /sbin/auditd -s disable + 3404 3401 0.0 /sbin/audispd + 3422 1 0.0 avahi-daemon: running [linux-mcr.local] + 3482 1 0.1 /usr/sbin/cupsd + 3671 1 0.0 /usr/sbin/nscd + 3701 1 0.0 /usr/sbin/ntpd -p /var/run/ntp/ntpd.pid -g -u ntp:ntp -i /var/lib/ntp -c /etc/ntp.conf + 3761 1 0.0 /usr/sbin/smartd + 3774 1 0.0 /usr/lib/postfix/master + 3800 1 0.0 /usr/sbin/cron + 3823 3774 0.0 pickup -l -t fifo -u + 3824 3774 0.0 qmgr -l -t fifo -u + 3843 1 0.0 /usr/sbin/sshd -o PidFile=/var/run/sshd.init.pid + 3959 1 0.0 /sbin/mingetty --noclear tty1 + 3961 1 0.0 /sbin/mingetty tty2 + 3963 1 0.0 /sbin/mingetty tty3 + 3965 1 0.0 /sbin/mingetty tty4 + 3975 1 0.0 /sbin/mingetty tty5 + 3976 1 0.0 /sbin/mingetty tty6 + 4730 2478 0.1 -:0 + 4752 1 0.0 /bin/dbus-daemon --fork --print-pid 5 --print-address 7 --session + 4753 1 0.0 dbus-launch --autolaunch 9fe5b43331dd16711f578ff44a61a184 --binary-syntax --close-stderr + 4777 4730 0.0 /bin/sh /usr/bin/startkde + 4960 1 0.0 /bin/dbus-daemon --fork --print-pid 5 --print-address 7 --session + 4961 1 0.0 dbus-launch --sh-syntax --exit-with-session + 4966 1 0.2 kdeinit4: kdeinit4 Running... + 4967 4966 0.5 klauncher + 4969 1 1.0 kded4 + 5008 4777 0.0 kwrapper4 ksmserver + 5009 4966 1.4 ksmserver + 5011 5009 1.7 kwin -session 1015110b9fd8000124791360500000100220000_1247938211_215332 + 5017 1 1.7 /usr/bin/knotify4 + 5018 1 1.5 /usr/bin/krunner + 5020 1 2.0 /usr/bin/plasma + 5024 1 0.5 /usr/bin/nepomukserver + 5026 5024 0.6 /usr/bin/nepomukservicestub nepomukstorage + 5027 5024 0.4 /usr/bin/nepomukservicestub nepomukfilewatch + 5028 5024 0.4 /usr/bin/nepomukservicestub nepomukontologyloader + 5030 1 0.4 /usr/bin/kaccess + 5044 4966 0.5 /usr/bin/policykit-kde + 5046 1 0.2 /usr/bin/pulseaudio --start + 5053 1 1.1 beagled /usr/lib/beagle/BeagleDaemon.exe --replace --bg + 5059 1 0.6 /usr/bin/kupdateapplet + 5060 1 0.7 /usr/bin/kmix + 5062 1 0.5 /usr/bin/klipper + 5083 1 0.0 /usr/lib/kde4/libexec/kdesud + 5309 1 2.3 amarokapp + 5312 1 0.2 kdeinit Running... + 5316 1 0.1 dcopserver [kdeinit] --nosid --suicide + 5318 5312 0.3 klauncher [kdeinit] --new-startup + 5320 1 0.5 kded [kdeinit] --new-startup + 5342 5312 0.2 kio_file [kdeinit] file /tmp/ksocket-BigMic + 5346 5309 0.5 yauap -noexit + 5356 5309 0.1 ruby /opt/kde3/share/apps/amarok/scripts/score_default/score_default.rb + 5440 1 0.4 knotify [kdeinit] + 5465 1 0.4 /usr/bin/kwalletd + 5495 1 1.0 beagled-helper /usr/lib/beagle/IndexHelper.exe + 5536 1 0.6 kio_uiserver [kdeinit] + 5621 1 1.1 /usr/bin/konsole + 5623 5621 0.1 /bin/bash + 5648 3381 0.3 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf + 5661 3381 0.3 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf + 5710 5623 0.2 /usr/bin/mc -P /tmp/mc-BigMichi1/mc.pwd.5623 + 5712 5710 0.1 bash -rcfile .bashrc + 6305 4966 0.2 kdeinit4: kio_file [kdeinit] file local:/tmp/ksocket-BigMichi1/klauncherMT4967.slave-socket local:/tmp/ksocket-BigMichi1/konquerordx5442.slave-socket + 6313 4966 0.0 /bin/sh /usr/bin/firefox + 6318 6313 3.5 /usr/lib/firefox/firefox + 6320 1 0.1 /usr/lib/GConf/2/gconfd-2 + 6332 1 0.1 /usr/lib/gvfs/gvfsd + 6338 1 0.1 /usr/lib/gvfs//gvfs-fuse-daemon /home/BigMichi1/.gvfs + 6389 3381 0.3 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf + 6390 3381 0.3 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf + 6395 3381 0.3 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf + 6737 3381 0.3 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf + 7003 5712 0.0 ps axo pid,ppid,pmem,args diff --git a/sources/sample/plugin_psstatus/README b/sources/sample/plugin_psstatus/README new file mode 100644 index 0000000..88a90af --- /dev/null +++ b/sources/sample/plugin_psstatus/README @@ -0,0 +1,2 @@ +FILE CONTENT OF +psstatus ps=("apache2" "mysqld" "sshd"); for((i=0;i<${#ps};i++)); do echo ${ps[$i]} "|" `pidof -s ${ps[$i]}` ;done diff --git a/sources/sample/plugin_psstatus/psstatus1.txt b/sources/sample/plugin_psstatus/psstatus1.txt new file mode 100644 index 0000000..da08b53 --- /dev/null +++ b/sources/sample/plugin_psstatus/psstatus1.txt @@ -0,0 +1,7 @@ +apache2 | 15776 +mysqld | 32349 +sshd | 31861 +bash | +dovecot | 32055 +| +| diff --git a/sources/sample/plugin_quotas/README b/sources/sample/plugin_quotas/README new file mode 100644 index 0000000..0127540 --- /dev/null +++ b/sources/sample/plugin_quotas/README @@ -0,0 +1,2 @@ +FILE CONTENT OF +quotas repquota -au diff --git a/sources/sample/plugin_quotas/quotas1.txt b/sources/sample/plugin_quotas/quotas1.txt new file mode 100644 index 0000000..2f29adc --- /dev/null +++ b/sources/sample/plugin_quotas/quotas1.txt @@ -0,0 +1,5 @@ +Mon Dec 6 09:00:00 EST 2004 + 1K Block limits File limits +User used soft hard grace used soft hard grace +cherylstaff-- 2755724 0 0 15678 0 0 +brucestaff -- 5738512 0 0 7830 0 0 diff --git a/sources/sample/plugin_smart/smart0.txt b/sources/sample/plugin_smart/smart0.txt new file mode 100644 index 0000000..6788e5c --- /dev/null +++ b/sources/sample/plugin_smart/smart0.txt @@ -0,0 +1,43 @@ +smartctl version 5.38 [x86_64-redhat-linux-gnu] Copyright (C) 2002-8 Bruce Allen +Home page is http://smartmontools.sourceforge.net/ + +Device: SEAGATE ST3146855LW Version: 0003 +Serial number: 3LN1GA[rest of serial number redacted] +Device type: disk +Transport protocol: Parallel SCSI (SPI-4) +Local Time is: Sat Jan 30 21:59:56 2010 CET +Device supports SMART and is Enabled +Temperature Warning Enabled +SMART Health Status: OK + +Current Drive Temperature: 39 C +Drive Trip Temperature: 68 C +Elements in grown defect list: 0 +Vendor (Seagate) cache information + Blocks sent to initiator = 1490558074 + Blocks received from initiator = 624662611 + Blocks read from cache and sent to initiator = 2900209651 + Number of read and write commands whose size <= segment size = 386699414 + Number of read and write commands whose size > segment size = 28 +Vendor (Seagate/Hitachi) factory information + number of hours powered up = 14959.20 + number of minutes until next internal SMART test = 44 + +Error counter log: + Errors Corrected by Total Correction Gigabytes Total + ECC rereads/ errors algorithm processed uncorrected + fast | delayed rewrites corrected invocations [10^9 bytes] errors +read: 6663270 0 0 6663270 6663270 5100.626 0 +write: 0 0 0 0 0 12594895028.099 0 +verify: 22626 0 0 22626 22626 28.314 0 + +Non-medium error count: 3 + +[GLTSD (Global Logging Target Save Disable) set. Enable Save with '-S on'] + +SMART Self-test log +Num Test Status segment LifeTime LBA_first_err [SK ASC ASQ] + Description number (hours) +# 1 Background long Interrupted ('-X' switch) - 14371 - [- - -] + +Long (extended) Self Test duration: 1367 seconds [22.8 minutes] diff --git a/sources/sample/plugin_smart/smart1.txt b/sources/sample/plugin_smart/smart1.txt new file mode 100644 index 0000000..02b4b70 --- /dev/null +++ b/sources/sample/plugin_smart/smart1.txt @@ -0,0 +1,86 @@ +smartctl version 5.38 [x86_64-unknown-linux-gnu] Copyright (C) 2002-8 Bruce Allen +Home page is http://smartmontools.sourceforge.net/ + +=== START OF INFORMATION SECTION === +Device Model: Hitachi HDS722020ALA330 +Serial Number: JK1121[rest of serial number redacted] +Firmware Version: JKAOA20N +User Capacity: 2,000,398,934,016 bytes +Device is: Not in smartctl database [for details use: -P showall] +ATA Version is: 8 +ATA Standard is: ATA-8-ACS revision 4 +Local Time is: Tue Dec 1 15:21:30 2009 CST +SMART support is: Available - device has SMART capability. +SMART support is: Enabled + +=== START OF READ SMART DATA SECTION === +SMART overall-health self-assessment test result: PASSED + +General SMART Values: +Offline data collection status: (0x84) Offline data collection activity + was suspended by an interrupting command from host. + Auto Offline Data Collection: Enabled. +Self-test execution status: ( 0) The previous self-test routine completed + without error or no self-test has ever + been run. +Total time to complete Offline +data collection: (21742) seconds. +Offline data collection +capabilities: (0x5b) SMART execute Offline immediate. + Auto Offline data collection on/off support. + Suspend Offline collection upon new + command. + Offline surface scan supported. + Self-test supported. + No Conveyance Self-test supported. + Selective Self-test supported. +SMART capabilities: (0x0003) Saves SMART data before entering + power-saving mode. + Supports SMART auto save timer. +Error logging capability: (0x01) Error logging supported. + General Purpose Logging supported. +Short self-test routine +recommended polling time: ( 1) minutes. +Extended self-test routine +recommended polling time: ( 255) minutes. +SCT capabilities: (0x003d) SCT Status supported. + SCT Feature Control supported. + SCT Data Table supported. + +SMART Attributes Data Structure revision number: 16 +Vendor Specific SMART Attributes with Thresholds: +ID# ATTRIBUTE_NAME FLAG VALUE WORST THRESH TYPE UPDATED WHEN_FAILED RAW_VALUE + 1 Raw_Read_Error_Rate 0x000b 100 100 016 Pre-fail Always - 0 + 2 Throughput_Performance 0x0005 134 134 054 Pre-fail Offline - 98 + 3 Spin_Up_Time 0x0007 123 123 024 Pre-fail Always - 587 (Average 584) + 4 Start_Stop_Count 0x0012 100 100 000 Old_age Always - 16 + 5 Reallocated_Sector_Ct 0x0033 100 100 005 Pre-fail Always - 0 + 7 Seek_Error_Rate 0x000b 100 100 067 Pre-fail Always - 0 + 8 Seek_Time_Performance 0x0005 114 114 020 Pre-fail Offline - 38 + 9 Power_On_Hours 0x0012 100 100 000 Old_age Always - 292 + 10 Spin_Retry_Count 0x0013 100 100 060 Pre-fail Always - 0 + 12 Power_Cycle_Count 0x0032 100 100 000 Old_age Always - 16 +192 Power-Off_Retract_Count 0x0032 100 100 000 Old_age Always - 16 +193 Load_Cycle_Count 0x0012 100 100 000 Old_age Always - 16 +194 Temperature_Celsius 0x0002 230 230 000 Old_age Always - 27 (Lifetime Min/Max 20/45) +196 Reallocated_Event_Count 0x0032 100 100 000 Old_age Always - 0 +197 Current_Pending_Sector 0x0022 100 100 000 Old_age Always - 0 +198 Offline_Uncorrectable 0x0008 100 100 000 Old_age Offline - 0 +199 UDMA_CRC_Error_Count 0x000a 200 200 000 Old_age Always - 0 + +SMART Error Log Version: 0 +No Errors Logged + +SMART Self-test log structure revision number 1 +No self-tests have been logged. [To run self-tests, use: smartctl -t] + +SMART Selective self-test log data structure revision number 1 + SPAN MIN_LBA MAX_LBA CURRENT_TEST_STATUS + 1 0 0 Not_testing + 2 0 0 Not_testing + 3 0 0 Not_testing + 4 0 0 Not_testing + 5 0 0 Not_testing +Selective self-test flags (0x0): + After scanning selected spans, do NOT read-scan remainder of disk. +If Selective self-test is pending on power-up, resume after 0 minute delay. diff --git a/sources/sample/plugin_updatenotifier/ubuntu-landscape b/sources/sample/plugin_updatenotifier/ubuntu-landscape new file mode 100644 index 0000000..35174f6 --- /dev/null +++ b/sources/sample/plugin_updatenotifier/ubuntu-landscape @@ -0,0 +1,4 @@ + +27 packages can be updated. +15 updates are security updates. + diff --git a/sources/sample/plugin_updatenotifier/universal-format b/sources/sample/plugin_updatenotifier/universal-format new file mode 100644 index 0000000..d6c573e --- /dev/null +++ b/sources/sample/plugin_updatenotifier/universal-format @@ -0,0 +1 @@ +17;5 \ No newline at end of file diff --git a/sources/sample/processes/processes.txt b/sources/sample/processes/processes.txt new file mode 100644 index 0000000..cc8f78c --- /dev/null +++ b/sources/sample/processes/processes.txt @@ -0,0 +1,71 @@ +Processes state translation table +-----Linux (Android) +[R] R Running +[S] S Sleeping in an interruptible wait +[D] D Waiting in uninterruptible disk sleep +[Z] Z Zombie +[T] T Stopped (on a signal) or (before Linux 2.6.33) trace stopped + t Tracing stop (Linux 2.6.33 onward) + W Paging (only before Linux 2.6.0) + X Dead (from Linux 2.6.0 onward) + x Dead (Linux 2.6.33 to 3.13 only) + K Wakekill (Linux 2.6.33 to 3.13 only) + W Waking (Linux 2.6.33 to 3.13 only) + P Parked (Linux 3.9 to 3.13 only) +-----FreeBSD +[D] D Marks a process in disk (or other short term, uninterruptible) wait. +[S] I Marks a process that is idle (sleeping for longer than about 20 seconds). +[D] L Marks a process that is waiting to acquire a lock. +[R] R Marks a runnable process. +[S] S Marks a process that is sleeping for less than about 20 seconds. +[T] T Marks a stopped process. + W Marks an idle interrupt thread. +[Z] Z Marks a dead process (a ``zombie''). +-----NetBSD +[D] D Marks a process in disk (or other short term, uninterruptible) wait. +[S] I Marks a process that is idle (sleeping for longer than about 20 seconds). +[R] O Marks a process running on a processor. +[R] R Marks a runnable process, or one that is in the process of creation. +[S] S Marks a process that is sleeping for less than about 20 seconds. +[T] T Marks a stopped process. + U Marks a suspended process. +[Z] Z Marks a dead process (a ``zombie''). +-----OpenBSD +[D] D Marks a process in disk (or other short term, uninterruptible) wait. +[S] I Marks a process that is idle (sleeping for longer than about 20 seconds). +[R] R Marks a runnable process. +[S] S Marks a process that is sleeping for less than about 20 seconds. +[T] T Marks a stopped process. +[Z] Z Marks a dead process (a ``zombie''). +-----Darwin +[S] I Marks a process that is idle (sleeping for longer than about 20 seconds). +[R] R Marks a runnable process. +[S] S Marks a process that is sleeping for less than about 20 seconds. +[T] T Marks a stopped process. +[D] U Marks a process in uninterruptible wait. +[Z] Z Marks a dead process (a ``zombie''). +[d] D [invalid state] +-----Minix +[R] R runnable +[S] S sleeping (i.e.,suspended on PM or VFS) +[T] T stopped +[D] W waiting (on a message) +[Z] Z zombie +[d] D [invalid state] +-----DragonFly + B Marks a blocked kernel thread. +[D] D Marks a process in disk (or other short term, uninterruptible) wait. +[S] I Marks a process that is idle (sleeping for longer than about 20 seconds). + J Marks a process which is in jail(2). The hostname of the prison can be found in /proc//status. +[R] R Marks a runnable process and is followed by the CPU number. +[S] S Marks a process that is sleeping for less than about 20 seconds. +[T] T Marks a stopped process. +[Z] Z Marks a dead process (a ``zombie''). +-----SunOS +[R] O Process is running on a processor. +[S] S Sleeping: process is waiting for an event to complete. +[R] R Runnable: process is on run queue. +[T] T Process is stopped, either by a job control signal or because it is being traced. +[D] W Waiting: process is waiting for CPU usage to drop to the CPU-caps enforced limits +[Z] Z Zombie state: process terminated and parent not waiting. +[d] D [invalid state] diff --git a/sources/sample/ups/1-upscDell2700.txt b/sources/sample/ups/1-upscDell2700.txt new file mode 100644 index 0000000..d3b0b88 --- /dev/null +++ b/sources/sample/ups/1-upscDell2700.txt @@ -0,0 +1,74 @@ +battery.capacity: 9.00 +battery.charge: 96 +battery.charge.low: 30 +battery.charge.restart: 0 +battery.energysave: no +battery.runtime: 4963 +battery.runtime.low: 180 +battery.type: PbAc +device.mfr: DELL +device.model: Dell UPS Rack/Tower 2700W HV - 230V +device.serial: +device.type: ups +driver.name: usbhid-ups +driver.parameter.pollfreq: 30 +driver.parameter.pollinterval: 2 +driver.parameter.port: auto +driver.version: 2.6.3 +driver.version.data: MGE HID 1.27 +driver.version.internal: 0.35 +input.frequency: 50.0 +input.frequency.nominal: 50 +input.transfer.boost.low: 210 +input.transfer.high: 286 +input.transfer.low: 160 +input.transfer.trim.high: 250 +input.voltage: 226.0 +input.voltage.nominal: 230 +outlet.1.autoswitch.charge.low: 0 +outlet.1.delay.shutdown: 2147483647 +outlet.1.delay.start: 0 +outlet.1.desc: PowerShare Outlet 1 +outlet.1.id: 1 +outlet.1.status: on +outlet.1.switchable: yes +outlet.2.autoswitch.charge.low: 0 +outlet.2.delay.shutdown: 2147483647 +outlet.2.delay.start: 1 +outlet.2.desc: PowerShare Outlet 2 +outlet.2.id: 2 +outlet.2.status: on +outlet.2.switchable: yes +outlet.desc: Main Outlet +outlet.id: 0 +outlet.switchable: no +output.current: 1.40 +output.frequency: 50.0 +output.frequency.nominal: 50 +output.voltage: 226.0 +output.voltage.nominal: 230 +ups.beeper.status: enabled +ups.date: 2012/11/24 +ups.delay.shutdown: 20 +ups.delay.start: 30 +ups.firmware: 01.14.0003 +ups.load: 13 +ups.load.high: 110 +ups.mfr: DELL +ups.model: Dell UPS Rack/Tower 2700W HV - 230V +ups.power: 333 +ups.power.nominal: 2700 +ups.productid: ffff +ups.realpower: 306 +ups.realpower.nominal: 2700 +ups.serial: +ups.start.battery: yes +ups.start.reboot: yes +ups.status: OL CHRG +ups.test.interval: 7776000 +ups.test.result: No test initiated +ups.time: 22:45:33 +ups.timer.shutdown: 0 +ups.timer.start: 0 +ups.type: offline / line interactive +ups.vendorid: 047c diff --git a/sources/sample/ups/1-upscPW5110.txt b/sources/sample/ups/1-upscPW5110.txt new file mode 100644 index 0000000..8384161 --- /dev/null +++ b/sources/sample/ups/1-upscPW5110.txt @@ -0,0 +1,19 @@ +battery.voltage: 13.5 +driver.name: bcmxcp_usb +driver.parameter.pollinterval: 2 +driver.parameter.port: auto +driver.version: 2.2.2 +driver.version.internal: 0.14 +input.frequency: 49.9 +input.voltage: 234 +output.current: 0.3 +output.frequency: 49.9 +output.phases: 1 +output.voltage: 234 +output.voltage.nominal: 240 +ups.firmware: Cont:00.50 Inve:01.50 +ups.load: 16.7 +ups.model: POWERWARE UPS 700VA +ups.power.nominal: 700 +ups.serial: +ups.status: OL \ No newline at end of file diff --git a/sources/sample/ups/1-upscl.txt b/sources/sample/ups/1-upscl.txt new file mode 100644 index 0000000..653283f --- /dev/null +++ b/sources/sample/ups/1-upscl.txt @@ -0,0 +1 @@ +PW5110 \ No newline at end of file diff --git a/sources/sample/ups/apcaccess1.txt b/sources/sample/ups/apcaccess1.txt new file mode 100644 index 0000000..8625d9f --- /dev/null +++ b/sources/sample/ups/apcaccess1.txt @@ -0,0 +1,53 @@ +APC : 001,052,1303 +DATE : 2014-06-15 09:53:19 +0200 +HOSTNAME : intranet +VERSION : 3.14.10 (13 September 2011) redhat +UPSNAME : UPS_1 +CABLE : Custom Cable Smart +DRIVER : APC Smart UPS (any) +UPSMODE : Stand Alone +STARTTIME: 2014-05-21 17:17:39 +0200 +MODEL : SMART-UPS 700 +STATUS : ONLINE +LINEV : 231.4 Volts +LOADPCT : 23.9 Percent Load Capacity +BCHARGE : 100.0 Percent +TIMELEFT : 6.0 Minutes +MBATTCHG : 5 Percent +MINTIMEL : 3 Minutes +MAXTIME : 0 Seconds +MAXLINEV : 232.7 Volts +MINLINEV : 230.1 Volts +OUTPUTV : 231.4 Volts +SENSE : High +DWAKE : 000 Seconds +DSHUTD : 020 Seconds +DLOWBATT : 02 Minutes +LOTRANS : 196.0 Volts +HITRANS : 253.0 Volts +RETPCT : 000.0 Percent +ITEMP : 36.9 C Internal +ALARMDEL : 5 seconds +BATTV : 27.7 Volts +LINEFREQ : 50.0 Hz +LASTXFER : Line voltage notch or spike +NUMXFERS : 8 +XONBATT : 2014-06-12 13:25:24 +0200 +TONBATT : 0 seconds +CUMONBATT: 13 seconds +XOFFBATT : 2014-06-12 13:25:26 +0200 +SELFTEST : NO +STESTI : 336 +STATFLAG : 0x07000008 Status Flag +DIPSW : 0x00 Dip Switch +REG1 : 0x00 Register 1 +REG2 : 0x00 Register 2 +REG3 : 0x00 Register 3 +MANDATE : 12/01/98 +SERIALNO : NS9876543210 +BATTDATE : 08/01/14 +NOMOUTV : 230 Volts +NOMBATTV : 24.0 Volts +EXTBATTS : 0 +FIRMWARE : 50.11.I +END APC : 2014-06-15 09:54:07 +0200 diff --git a/sources/sample/ups/powersoftplus1.txt b/sources/sample/ups/powersoftplus1.txt new file mode 100644 index 0000000..93472a7 --- /dev/null +++ b/sources/sample/ups/powersoftplus1.txt @@ -0,0 +1,16 @@ +PowerSoft Plus v.0.1.6 - EVER UPS monitoring software +=========================================================== +Current UPS state : Normal mode +Alert : - +----------------------------------------------------------- +Identifier: UPS Model : SINLINE 1200 +Identifier: UPS Version : Firmware: 1.1 +Battery state : At full capacity +Battery voltage : 27.2 [Volt] +Input voltage : 228 [Volt] +Input frequency : 50.0 [Hz] +Output voltage : 229 [Volt] +Output current : 0.4 [A] +Effective power : 61 [W] +Output load : 0 [%] +=========================================================== diff --git a/sources/templates/aqua.css b/sources/templates/aqua.css new file mode 100644 index 0000000..0ba2879 --- /dev/null +++ b/sources/templates/aqua.css @@ -0,0 +1,181 @@ +/* + $Id* + */ +a { + text-decoration: none; + color: #c03000; +} + +a:hover { + text-decoration: underline; +}* { + margin: 0; + padding: 0; +} + +wbr { + display: inline-block; +} + +html { + height: 100%; + background: url("aqua/aq_background.gif"); +} + +body { + position: relative; + width: 940px; + _width: 945px; /* ie6 */ + min-height: 100%; + overflow: auto; + margin: 0 auto; + padding: 20px 20px 0 20px; + font: 62.5% arial, tahoma, helvetica, sans-serif; + color: #000; +} + +h1 { + margin: 0 10px; + _margin: 0 15px 0 10px; /* ie6 */ + padding: 10px 10px; + border-top: 1px solid #2971a7; + border-bottom: 1px solid #2971a7; + font-size: 2em; + font-weight: normal; + color: #fff; + background: #569FD6; +} + +#select { + text-align: right; + padding: 10px; +} + +#select select { + width: 100px; +} + +#vitals, #network, #memory, #filesystem, #hardware, #temp, #voltage, #fan, #power, #current, #ups { + float: left; + width: 451px; + margin: 10px 0 0 8px; + _margin: 10px 4px 0 4px; /* ie6 */ + padding: 1px; + border: 2px solid #2971a7; + background: #fff; +} + +h2 { + padding: 5px 10px; + font-family: "trebuchet ms"; + font-size: 1.2em; + font-weight: bold; + letter-spacing: 0.0em; + text-transform: uppercase; + color: #fff; +} + +table { + width: 100%; + font-size: 1.2em; + background-color: #fff; +} + +.plugin { + float: left; + margin: 10px 0 0 8px; + _margin: 10px 4px 0 4px; /* ie6 */ + padding: 1px; + border: 2px solid #2971a7; + background: #fff; +} + +.dataTables_wrapper{ + margin: 0 0 0 0 !important; + border: 0px !important; +} + +th, td, h3 { + padding: 4px 10px 2px 10px; + text-align: left; + vertical-align: top; +} + +h3 { + font-size: 120%; +} + + +.even { + background: #E4EBF3; +} + + +#footer { + clear: both; + color: #000; + margin: 12px; + padding: 13px 25px; + line-height: 18px; +} + +h1 { + background: #2971a7; +} + +h2 { + background: #2971a7; + text-align: center; +} + +#memory, #filesystem { + width: 915px; +} + +.bar { + background: #2971a7; +} + +.barwarn { + background: #a72971; +} + +p { + padding: 4px 10px 2px 10px; + line-height: 1.6; + text-align: left; + vertical-align: top; +} + +#filesystemTable thead tr .header { + cursor: pointer; +} + +table tfoot td { + color: #2E2E2E; +} + +.right { + text-align: right; + padding-right: 20px; +} + +#pciTable, #ideTable, #scsiTable, #usbTable, #tbTable, #i2cTable { + padding: 0px 30px; +} + +.treeimg { + display: table-cell; + vertical-align: top; +} + +.treespan { + display: table-cell; + vertical-align: middle; +} + +.treespanbold { + font-weight: bold; + display: table-cell; + vertical-align: middle; +} diff --git a/sources/templates/aqua/aq_background.gif b/sources/templates/aqua/aq_background.gif new file mode 100644 index 0000000000000000000000000000000000000000..c34fa449ee6659e4a74ddd168f8028c4133a4f66 GIT binary patch literal 291 zcmV+;0o?vaNk%w1VR!`u0K@)UP9UUFc&d#~Hxu~e9jg5`-^Ya=S8r|L9&(F`iyu9M#;(&mFK|w)BM@OThqm-1C z=;-MG|Nrmr?*IS*EC2ui0C)ui000H3U?+}bX`X1Ru59bRa4gSsZQppV?|kq7z@TtQ zEE2?)jE#j~uCLUb8pozg4#TbkUzred^^yE>eu)BD0Z8DvCC(rY|pR+bRbfdAMrGcWT z##FzYCVM?uP4#u;-*JDtNVaC&H;zZp6fUR^qMjY_H0#~ff!_A&amS2;kyqsF!VS*7Ew6GPQbj;zvRG?rJ;|4tL>MlpaZwIL zd4>;#W3kv3AaFd#astZ>K|Ush1c~E7`J;(9N1u|?a_vniS#%H)2_-|Zn;dPV63Ow zEYEO$N)@1@{2ywXRkVxK@Fd=U3cHy_8?tHWqIpLnjhkxoUD;B?fhtB$2BFzX6^HW( zBR7w1kQj-8F~ibP!97ANij=ZktXdjO$#I(S8N<+}h}flhHmQ z(i`QYkqB4e%1E0xp@l14{e&B?$@K@pw25aKI>rLjlMXV$QNof@I~KmCUYV=cjzy@+ zWl1os-`2m{T)85%;~%R-ON{E+LyOG1Lx%drO7anT5I2VhGksukvqReg6C0gIk((=Z zP8V6bbSb+P7<~|4c-=a=8Cux6Y!o}P&jPpC!Ng{mnA61E3eWFwb}2Br-jZ2sPOmhl zSJ&GQFA~{-l-!%~zO5gmn(lF@>v{^$;jO2|kH7B>oH?7@-}t`y^XkF-U+($r=K;BA z``oA2<@g(;eb3=LpX}|3gu=s(|7-;n(3`rYL}yiiu1 literal 0 HcmV?d00001 diff --git a/sources/templates/blue/barwarn.png b/sources/templates/blue/barwarn.png new file mode 100644 index 0000000000000000000000000000000000000000..10cf060e54bccc6386bd68de4f0f868dfa93cedb GIT binary patch literal 974 zcmeAS@N?(olHy`uVBq!ia0vp^96-#+!3-o-JJv2?U|?nl@Ck99tPnF>HF=Uk^b+mN zH3o%Cw6oUe7tB^m>Xr%HVp29)F=n%I*%GbHIjTuLGNF?dqBolWxmmMSlQx@_t}!U+ zkqPUR3TcxJYL^7rF$zXQU}%NF8>YV|Ko@skqN1XFK!SmZ ziGhospPzw&on45Lkyl8FfrnX;6$qIbL|E8FMA$@F7zBhlxdns;gc-!3fI%Dz5C+0c a#?3gE%AxmvcJ5VBFnYTBxvXbcI|(2NRJqC45QIb!1iT@Ff^si` zAdmzyQJ@tg76gx_XcfVVgB*ik)uWVc!CH(L5cxK!J+-x`&(p8`AUpe+wPt3mHEX@^ znq;uNJ!j9-n>B6PwAnPO8-jlhPMbD^`r&l^>DHWubMcP_LU(^5M-U;5-w+!<%{ff4 zG2EEO-w+v&gl`DjzV$-*nrYLf8%J^dh5k%0a;SiBwPA9MRRTW-m!39l&Dw;R4WXOE zg~l7hBcq}zCJ&m5TeQB3?u%oWTS*YHhI)Wq0uPNFwAG;wpNeVEBwN8>dKWLyD1 zT)4qFfxjg>j+{U-nbJ$fpC?}vO^m082scwqUM|X?$uf2o#D*J_tX2?0SJnoDh>av#+uPeu>R7pwfR7-=ZI2diNFYSVnZDNG79JNG8x84|CL?!r?QiQz>mRab_5i8&uPi>eS_2+A`{!@Lg zWW)Y^Ei3<2mWVHgIO*2kxcT)fJa#4@e+^pv%dcS{9*xI(EFRPyKX|R4Htn6AEHAEm zV9ECzE3Wz%UtZ{&>2>IWZ9@NhW-aPlwWm9`*z93 zd{%C|P3+N-vaV&}gu!}5Uqad@W9MBm3oBS9loF%MR&TF1 zkNjdy(w8e^E3CJcQxBZ~{74sJOO@Xjox!Ew2bWzTC)9BZI|9U)$ve-|(!ch}YIaJg z4=U-f+g9USaDfLv^wu=;}&$d?LQYJxndJn>3#U3w<%uGmw#QEKv|+l%{GpYRGq0txw< z<0oJB-6XHGv`FFYxZocj{sYG-a3GH8_Uy)ay>KPgN<26__^HWEUE-Iltyh_LZLp;B zgw&gx{IqJ9eSR$KkZdjtHJ`3=qdQRwtUR0JPCTk2wj@c0s`~quad

    TgS-On#aqA z6gs>Ir<2`GKpeWfd3>Y{1R_0<4I=hSyD-M=VoABAdV&yNlfJ)PseimBR&%mA5%b zI-ENr+hB&$CRsPEw$cdO;%vv=A+YjE4wE$98EIPEg>Ppdu$}H=ZwB*GpYbSsk1rtp z(#U`yk)@o}($ps_q9)SUXvRe+OGZIhmDXNlXY}Iw)6)w?N=%v>HTU@< zYip9Dz*C|a{n1FhcpX}nd1T4tPA9EY_u`oQO4-`6U(BvukH&N+cZO{Oe2e3szFMH4 zHF=_{QI--bsi}JL?1D$Ja#Vnw0Rz8mN@@A>+0Uux209e@s6lR;_7(`V#B zCgs`41Nk5R^T7)4i+2@)s)P?&!}Zvo$%pBaX_d6e5JdU4s-KsvQa2@%%rY`r%4+ zo3y)YCf2R3DL=*s+8;as?r(VoL-uW z^U$Md$5PZ{%Bo@*!~oGKXHfrg%h#RTI09ST*SC-kcn)dfuIXLVpCer+^ve{zq1 z+~8czb?xLYr;}>Q>qmcbFj^luHa77&?mh#nobn zIL_ug-0pz6b!ViE(o}2*`Wewg(xjg$xSvI*xbtxwfSZKZ|=kvMKAGF0Hi(#iMb;7oXeU>Th)surw>EH3AoPX-!oB z;Adc(rHB_j<2?{h@E#6WZ{I$0OB)ZAly0EBZ}U8c72I-vl~L*n$JC!|ZHtd3Ca&@t zZ5^;R>Q77T`AAeMjIszeEHZLuwoQfTp%)Zn^p|!9^6al^xwS`c%ZA6UE%5H!@u+}+ zjp^OJSeU;v^T2ZM`ml=ICq)}E{?w`(r2X6UxAlw@Q@LBZlebE4!4A)m;!VKHFD5N5 zbN)I-LQYy{YvY-$PdTX$t3MG{%IW4abe}A|chQwyd!xRy$55}d!_!B_U04c}Q}TK? zVk3KW*k%FB{OIoF7eBc3;VC(N(6_I54jfl*Wu$e59J%*HMUSohsmSCPs-6!9dg=+f z;ik<4#uj7WpRLnnnFT8I`k&4^lA4&O81D7a?%csx(iOswz3j|=tlHC&`kA*xV7~U> zqdmoStan7mapl+io}Oq4(G2eK?WzyCRrhFI*&#bae#*@MVzlIJu>c@gVdj&v_Om|H zgf#t81vesD}XI^)v`Wy7QnQCDkS zOnhJ9JZTHpt!*rF8 zWDJIZ?P#O0Y52~l;?QO4L}8hk9mKbg4i4){uTlBzqq2tJ(TIG-u$?D9KOHPV z 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 literal 0 HcmV?d00001 diff --git a/sources/templates/blue/title.png b/sources/templates/blue/title.png new file mode 100644 index 0000000000000000000000000000000000000000..e46b59879954469e5678220ba6d6dc0b46f245ba GIT binary patch literal 1169 zcmaJ>O=uHY93RvbDe6I%MQgRsF)Fpqd?k~Zp|Q4^W*cZqNTP-OEPHajr$zJ9;o z|MSgws^{wsb@g==MQuoQ$!RivLEi1_R+I0WOTH;GY{8v5oIwM)q}Y&Z*HAwM2}2o# zX{c!B;tSYHQLBNT&EZ_KTT+q1C?1A!4U4cTseFt2xw+AuTPlT}9xYDA;k_JdYeA_4})3UG~MrX#sgdP!Fzb8nla!4d=)qVy-H za>*2kAsYgb;ruEW;y{RJ_&_im4z~b-<2jZSSYGh+VJRR;90!&knpm^70VyrVmu-<% zl+I&pNi16`m6%e1LG~caMOL!VH~B2 zr=LPFtQA?)Sxys480#t)%QKu8QWcm?{y)?(R?rSk!_WTyr?8VPTaZmd2MyaQDcrzL z&y*#_Y^Y#lXAwG9&0;E#Fmm$90r zv34;K3CH3*FUKRnSUAFqVmurY`1rn#DpyA8umMe69u{~Yw9g?wc5T2HMuNthV{z&uQFG+Nbh*lm8K<&m9~c_>2;el_1emsNpc}7 zsqSniW8P>uG_fr=$rW!l<*zX2+-~iBeRe!leh_jW_>{`l%y?t(^p3uB!I66czP*Q> zX2!YVtzF7b4Tru9mgWU~hweMKJvSwm=K12y=AqdgeKSpiSN7&FHyoU3E?jRJy1p$p z)l!%h-CqRfP5|Eqz0-}~Og9&1cPSO$(MnVPGTk?`Tf5NM`$KSKeh)mqC4I&xto1H` ze?o50y1&g&bZ#0uKs~v;@NlMnqd1g0wb-_C^V)`Hh@8)Oe;9+L#VxXsQX6tI<;BId3<`op} z85rdq9OD}r=Mxg^84&6073}00v7sh}W=zwHFb}_IfEKu%y@?%a$ms!s1 zZQeTPjgs&G;C)+jKKQ@_g9uHj{$rg*Cu7{^UC;<|S{t>xc}>}B)r$QO)+hMrO=f(t r#Y#3~_x*QGHGcEe-~F(OJNW+hZ??v!<|dA|_KtS;?w;NrMFwjC#mYx) literal 0 HcmV?d00001 diff --git a/sources/templates/dark_bootstrap.css b/sources/templates/dark_bootstrap.css new file mode 100644 index 0000000..f7558bf --- /dev/null +++ b/sources/templates/dark_bootstrap.css @@ -0,0 +1,189 @@ +body { + font-size: 13px; + padding-top: 80px; + color: #c8c8c8; + background-color: #272b30; +} + +wbr { + display: inline-block; +} + +.progress { + margin-bottom: 0; +} + +.table td.rightCell, .table th.rightCell { + text-align: right; +} + +.percent { + text-align: center; +} + +.panel-primary { + background-color: #2e3338; + border: none; +} + +.navbar { + background-color: #3a3f44; + border-color: #2b2e32; +} + +.navbar-brand, .navbar-brand:hover { + color: #fff; +} + +.treegrid-span { + display: table-cell; + *float: left; +} + +.treegrid-spanbold { + font-weight: bold; + display: table-cell; + *float: left; +} + +.treegrid-indent { + width: 16px; + height: 16px; + display: table-cell; + *float: left; +} + +.treegrid-expander { + width: 0px; + height: 16px; + display: table-cell; + *float: left; + cursor: pointer; +} + +.normalicon { + width: 16px; + height: 16px; + position: relative; + top: 1px; + display: table-cell; + *float: left; + font-style: normal; + font-weight: normal; + line-height: 1; + + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +.normalicon-right:before { + content: "\25ba"; +} +.normalicon-down:before { + content: "\25bc"; +} +/* IE6 fix */ +* html .normalicon-right { + background: url('../gfx/right_gray.gif') no-repeat; + height: 14px; +} +* html .normalicon-down { + background: url('../gfx/down_gray.gif') no-repeat; + height: 14px; +} +/* IE7 fix */ +*+html .normalicon-right { + background: url('../gfx/right_gray.gif') no-repeat; + height: 14px; +} +*+html .normalicon-down { + background: url('../gfx/down_gray.gif') no-repeat; + height: 14px; +} + +table.sortable thead th { + cursor: pointer; + position: relative; + top: 0; + left: 0; +} + +table.sortable thead th:hover { + background: #3e444c; +} + +table.table-hover > tbody > tr:hover { + background-color: #49515a; +} + +table.borderless td,table.borderless th { + border: none!important; +} + +.table .table { + background-color: #2e3338; +} + +.logo { + cursor: pointer; +} + +.errorbutton { + cursor: pointer; +} + +.select { + color: #c8c8c8; +} + +.template { + cursor: pointer; + color: #333; +} + +.language { + cursor: pointer; + color: #333; +} + +.panel-heading { + background-color: #3e444c!important; + border-color: #3e444c!important; +} + +.progress { + background-color: #1c1e22; +} + +.progress-bar-success { + background-color: #62c462; +} + +.progress-bar-info { + background-color: #5bc0de; +} + +.progress-bar-warning { + background-color: #f89406; +} + +.progress-bar-danger { + background-color: #ee5f5b; +} + +.modal-content { + background-color: #2e3338; +} + +.list-group-item { + background-color: #2e3338; +} + +.reload { + background-image: url("../gfx/reload.gif"); + vertical-align: middle; + float: right; + cursor: pointer; + border: 0px; + width: 16px; + height: 16px; +} diff --git a/sources/templates/green_bootstrap.css b/sources/templates/green_bootstrap.css new file mode 100644 index 0000000..2c7a7ed --- /dev/null +++ b/sources/templates/green_bootstrap.css @@ -0,0 +1,189 @@ +body { + font-size: 13px; + padding-top: 80px; + color: #333; + background-color: #fff; +} + +wbr { + display: inline-block; +} + +.progress { + margin-bottom: 0; +} + +.table td.rightCell, .table th.rightCell { + text-align: right; +} + +.percent { + text-align: center; +} + +.panel-primary { + background-color: #fff; + border: none; +} + +.navbar { + background-color: #3bc873; + border-color: #33b667; +} + +.navbar-brand, .navbar-brand:hover { + color: #fff; +} + +.treegrid-span { + display: table-cell; + *float: left; +} + +.treegrid-spanbold { + font-weight: bold; + display: table-cell; + *float: left; +} + +.treegrid-indent { + width: 16px; + height: 16px; + display: table-cell; + *float: left; +} + +.treegrid-expander { + width: 0px; + height: 16px; + display: table-cell; + *float: left; + cursor: pointer; +} + +.normalicon { + width: 16px; + height: 16px; + position: relative; + top: 1px; + display: table-cell; + *float: left; + font-style: normal; + font-weight: normal; + line-height: 1; + + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +.normalicon-right:before { + content: "\25ba"; +} +.normalicon-down:before { + content: "\25bc"; +} +/* IE6 fix */ +* html .normalicon-right { + background: url('../gfx/right_black.gif') no-repeat; + height: 14px; +} +* html .normalicon-down { + background: url('../gfx/down_black.gif') no-repeat; + height: 14px; +} +/* IE7 fix */ +*+html .normalicon-right { + background: url('../gfx/right_black.gif') no-repeat; + height: 14px; +} +*+html .normalicon-down { + background: url('../gfx/down_black.gif') no-repeat; + height: 14px; +} + +table.sortable thead th { + cursor: pointer; + position: relative; + top: 0; + left: 0; +} + +table.sortable thead th:hover { + background: #f0f0f0; +} + +.table-hover > tbody > tr:hover { + background-color: #f5f5f5; +} + +table.borderless td,table.borderless th { + border: none!important; +} + +.table .table { + background-color: #fff; +} + +.logo { + cursor: pointer; +} + +.errorbutton { + cursor: pointer; +} + +.select { + color: #333; +} + +.template { + cursor: pointer; + color: #333; +} + +.language { + cursor: pointer; + color: #333; +} + +.panel-heading { + background-color: #33b770!important; + border-color: #33b770!important; +} + +.progress { + background-color: #f5f5f5; +} + +.progress-bar-success { + background-color: #5bc0de; +} + +.progress-bar-info { + background-color: #5cb85c; +} + +.progress-bar-warning { + background-color: #f0ad4e; +} + +.progress-bar-danger { + background-color: #d9534f; +} + +.modal-content { + background-color: #fff; +} + +.list-group-item { + background-color: #fff; +} + +.reload { + background-image: url("../gfx/reload.gif"); + vertical-align: middle; + float: right; + cursor: pointer; + border: 0px; + width: 16px; + height: 16px; +} diff --git a/sources/templates/html/error_config.html b/sources/templates/html/error_config.html new file mode 100644 index 0000000..5619b1d --- /dev/null +++ b/sources/templates/html/error_config.html @@ -0,0 +1,22 @@ +"; ?> + + + + + + + + + phpSysInfo - Error + + + +

    phpSysInfo - Error

    +
    +

    phpsysinfo.ini does not exist or is not readable by the webserver in the phpsysinfo directory or is misunderstood.

    +

    Generated by phpSysInfo - 

    +
    + + diff --git a/sources/templates/html/index_all.html b/sources/templates/html/index_all.html new file mode 100644 index 0000000..a6dc45e --- /dev/null +++ b/sources/templates/html/index_all.html @@ -0,0 +1,40 @@ +"; ?> + + + + + + + + + phpSysInfo - Redirection + + + + + +

    REDIRECTING ...

    +
    +

    Loading redirection target

    +

    In approx. 2 seconds the redirection target page should load.
    + If it doesn't please select the link above.

    +

    Generated by phpSysInfo - 

    +
    + + diff --git a/sources/templates/html/index_bootstrap.html b/sources/templates/html/index_bootstrap.html new file mode 100644 index 0000000..c51194a --- /dev/null +++ b/sources/templates/html/index_bootstrap.html @@ -0,0 +1,429 @@ + + + + + + + + + phpSysInfo + + + + + + + + + +"/> + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sources/templates/html/index_dynamic.html b/sources/templates/html/index_dynamic.html new file mode 100644 index 0000000..9b45806 --- /dev/null +++ b/sources/templates/html/index_dynamic.html @@ -0,0 +1,254 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + phpSysInfo <?php echo PSI_VERSION_STRING ?> + + + + + + +
    +

    + + + + Loading... please wait!

    +
    + +
    +
    + + + + diff --git a/sources/templates/idash.css b/sources/templates/idash.css new file mode 100644 index 0000000..d08006d --- /dev/null +++ b/sources/templates/idash.css @@ -0,0 +1,172 @@ +/* NextGen Remixed by iDash.pl */ +a { + text-decoration: none; + color: #006; +} + +a:hover { + text-decoration: underline; + color: #5A7000; +} + +* { + margin: 0; + padding: 0; +} + +wbr { + display: inline-block; +} + +html { + height: 100%; + background: url("idash/bg.png") repeat-x scroll center top #111; +} + +body { + position: relative; + width: 940px; + _width: 945px; /* ie6 */ + min-height: 100%; + overflow: auto; + margin: 0 auto; + padding: 20px 20px 0 20px; + font: 0.75em tahoma, arial, sans-serif; + color: #CCC; +} + +div#container { + margin: -20px -10px 0 -10px; + padding: 95px 0 0 0; +} + +h1 { + position: absolute; + top: 35px; + left: 10px; + margin: 0; + padding: 0px 10px; + font-size: 2em; + font-weight: normal; + color: #FFF; +} + +#select { + position: absolute; + top: 75px; + color: #FFF; + right: 30px; + width: 370px; + text-align: right; +} + +#select select { + width: 100px; +} + +#vitals, #network, #memory, #filesystem, #hardware, #temp, #voltage, #fan, #power, #current, #ups { + float: left; + width: 451px; + margin: 10px 0 0 10px; + _margin: 10px 5px 0 5px; /* ie6 */ + padding: 1px; + border: 1px solid #354242; +} + +h2 { + padding: 5px 10px; + font-family: "trebuchet ms"; + font-size: 1.2em; + font-weight: bold; + letter-spacing: 0.0em; + text-transform: uppercase; + color: #FFF; /* #7D9100; */ + background: #354242; +} + +table { + width: 100%; +} + +.plugin { + float: left; + margin: 10px 0 0 10px; + _margin: 10px 5px 0 5px; /* ie6 */ + padding: 1px; + border: 1px solid #354242; +} + +.dataTables_wrapper{ + margin: 0 0 0 0 !important; + border: 0px !important; +} + + +th, td, h3 { + padding: 4px 10px 2px 10px; + text-align: left; + vertical-align: top; +} + +h3 { + font-size: 120%; +} + +.even { + background: #333; +} + +#footer { + color: #777777; + clear: both; + margin: 12px; + padding: 13px 25px; + line-height: 18px; + text-align: right; +} + +#memory, #filesystem { + width: 915px; +} + +.bar { + background: #34DA64 url("idash/html.gif"); +} + +.barwarn { + background: #e69575 url("idash/htmlwarn.gif"); +} + +p { + padding: 4px 10px 2px 10px; + line-height: 1.6; + text-align: left; + vertical-align: top; +} + +.right { + text-align: right; + padding-right: 20px; +} + +#pciTable, #ideTable, #scsiTable, #usbTable, #tbTable, #i2cTable { + padding: 0px 30px; +} + +#lang_047{color:444} + +.treeimg { + display: table-cell; + vertical-align: top; +} + +.treespan { + display: table-cell; + vertical-align: middle; +} + +.treespanbold { + font-weight: bold; + display: table-cell; + vertical-align: middle; +} diff --git a/sources/templates/idash/bg.png b/sources/templates/idash/bg.png new file mode 100644 index 0000000000000000000000000000000000000000..60b8e4cc2b6b23d859df4f3f20a8ffc96488d825 GIT binary patch literal 30344 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 literal 0 HcmV?d00001 diff --git a/sources/templates/idash/html.gif b/sources/templates/idash/html.gif new file mode 100644 index 0000000000000000000000000000000000000000..cc6e2051a29a116d1bb9d1c2c513c05baa54e7fa GIT binary patch literal 120 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 z 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 tbody > tr:hover { + background-color: #f5f5f5; +} + +table.borderless td,table.borderless th { + border: none!important; +} + +.table .table { + background-color: #fff; +} + +.logo { + cursor: pointer; +} + +.errorbutton { + cursor: pointer; +} + +.select { + color: #333; +} + +.template { + cursor: pointer; + color: #333; +} + +.language { + cursor: pointer; + color: #333; +} + +.panel-heading { + background-color: #337ab7!important; + border-color: #337ab7!important; +} + +.progress { + background-color: #f5f5f5; +} + +.progress-bar-success { + background-color: #5cb85c; +} + +.progress-bar-info { + background-color: #5bc0de; +} + +.progress-bar-warning { + background-color: #f0ad4e; +} + +.progress-bar-danger { + background-color: #d9534f; +} + +.modal-content { + background-color: #fff; +} + +.list-group-item { + background-color: #fff; +} + +.reload { + background-image: url("../gfx/reload.gif"); + vertical-align: middle; + float: right; + cursor: pointer; + border: 0px; + width: 16px; + height: 16px; +} diff --git a/sources/templates/plugin/jquery.dataTables.css b/sources/templates/plugin/jquery.dataTables.css new file mode 100644 index 0000000..13a684a --- /dev/null +++ b/sources/templates/plugin/jquery.dataTables.css @@ -0,0 +1,14 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * DataTables sorting + */ +.sorting_asc { + background: url('../../gfx/sort_asc.gif') no-repeat center right; +} + +.sorting_desc { + background: url('../../gfx/sort_desc.gif') no-repeat center right; +} + +.sorting { + background: url('../../gfx/sort_both.gif') no-repeat center right; +} \ No newline at end of file diff --git a/sources/templates/plugin/jquery.jgrowl.css b/sources/templates/plugin/jquery.jgrowl.css new file mode 100644 index 0000000..082a044 --- /dev/null +++ b/sources/templates/plugin/jquery.jgrowl.css @@ -0,0 +1,132 @@ + +div.jGrowl { + padding: 10px; + z-index: 9999; + color: #fff; + font-size: 12px; +} + +/** Special IE6 Style Positioning **/ +div.ie6 { + position: absolute; +} + +div.ie6.top-right { + right: auto; + bottom: auto; + left: expression( ( 0 - jGrowl.offsetWidth + ( document.documentElement.clientWidth ? document.documentElement.clientWidth : document.body.clientWidth ) + ( ignoreMe2 = document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft ) ) + 'px' ); + top: expression( ( 0 + ( ignoreMe = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop ) ) + 'px' ); +} + +div.ie6.top-left { + left: expression( ( 0 + ( ignoreMe2 = document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft ) ) + 'px' ); + top: expression( ( 0 + ( ignoreMe = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop ) ) + 'px' ); +} + +div.ie6.bottom-right { + left: expression( ( 0 - jGrowl.offsetWidth + ( document.documentElement.clientWidth ? document.documentElement.clientWidth : document.body.clientWidth ) + ( ignoreMe2 = document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft ) ) + 'px' ); + top: expression( ( 0 - jGrowl.offsetHeight + ( document.documentElement.clientHeight ? document.documentElement.clientHeight : document.body.clientHeight ) + ( ignoreMe = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop ) ) + 'px' ); +} + +div.ie6.bottom-left { + left: expression( ( 0 + ( ignoreMe2 = document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft ) ) + 'px' ); + top: expression( ( 0 - jGrowl.offsetHeight + ( document.documentElement.clientHeight ? document.documentElement.clientHeight : document.body.clientHeight ) + ( ignoreMe = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop ) ) + 'px' ); +} + +div.ie6.center { + left: expression( ( 0 + ( ignoreMe2 = document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft ) ) + 'px' ); + top: expression( ( 0 + ( ignoreMe = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop ) ) + 'px' ); + width: 100%; +} + +/** Normal Style Positions **/ +div.jGrowl { + position: absolute; +} + +body > div.jGrowl { + position: fixed; +} + +div.jGrowl.top-left { + left: 0px; + top: 0px; +} + +div.jGrowl.top-right { + right: 0px; + top: 0px; +} + +div.jGrowl.bottom-left { + left: 0px; + bottom: 0px; +} + +div.jGrowl.bottom-right { + right: 0px; + bottom: 0px; +} + +div.jGrowl.center { + top: 0px; + width: 50%; + left: 25%; +} + +/** Cross Browser Styling **/ +div.center div.jGrowl-notification, div.center div.jGrowl-closer { + margin-left: auto; + margin-right: auto; +} + +div.jGrowl div.jGrowl-notification, div.jGrowl div.jGrowl-closer { + background-color: #000; + opacity: .85; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=85)"; + filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=85); + zoom: 1; + width: 235px; + padding: 10px; + margin-top: 5px; + margin-bottom: 5px; + font-family: Tahoma, Arial, Helvetica, sans-serif; + font-size: 1em; + text-align: left; + display: none; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; +} + +div.jGrowl div.jGrowl-notification { + min-height: 40px; +} + +div.jGrowl div.jGrowl-notification div.jGrowl-header { + font-weight: bold; + font-size: .85em; +} + +div.jGrowl div.jGrowl-notification div.jGrowl-close { + z-index: 99; + float: right; + font-weight: bold; + font-size: 1em; + cursor: pointer; +} + +div.jGrowl div.jGrowl-closer { + padding-top: 4px; + padding-bottom: 4px; + cursor: pointer; + font-size: .9em; + font-weight: bold; + text-align: center; +} + +/** Hide jGrowl when printing **/ +@media print { + div.jGrowl { + display: none; + } +} \ No newline at end of file diff --git a/sources/templates/plugin/jquery.treeTable.css b/sources/templates/plugin/jquery.treeTable.css new file mode 100644 index 0000000..4e6e853 --- /dev/null +++ b/sources/templates/plugin/jquery.treeTable.css @@ -0,0 +1,37 @@ +/* + Copyright: Paul Hanlon + + Released under the MIT/BSD licence which means you can do anything you want + with it, as long as you keep this copyright notice on the page + */ +.collapsed { + display: none; +} + +.tablemain { + border-collapse: collapse; + padding: 0px; + text-align: left; +} + +.tablemain td { + margin-left: 3px; +} + +.tree td { + padding: 0px 2px 0px 0px; + cursor: pointer; +} + +.adeimg, .ttimage, .parimg, .preimg { + border: none; + margin: 0px; + padding: 0px; + vertical-align: bottom; + width: 16px; + height: 16px; +} + +.adeimg, .parimg { + cursor: pointer; +} diff --git a/sources/templates/plugin/nyroModal.full.css b/sources/templates/plugin/nyroModal.full.css new file mode 100644 index 0000000..a4c59b7 --- /dev/null +++ b/sources/templates/plugin/nyroModal.full.css @@ -0,0 +1,105 @@ +div#nyroModalFull { + font-size: 12px; + color: #777; +} +div#nyroModalFull div#nyroModalLoading { + border: 4px solid #777; + width: 150px; + height: 150px; + text-indent: -9999em; + background: #fff url(../../gfx/ajaxLoader.gif) no-repeat; + background-position: center; +} +div#nyroModalFull div#nyroModalLoading.error { + border: 4px solid #f66; + line-height: 20px; + padding: 20px; + width: 300px; + height: 100px; + text-indent: 0; + background: #fff; +} +div#nyroModalFull div#nyroModalWrapper { + background: #fff; + border: 4px solid #777; +} +div#nyroModalFull div#nyroModalWrapper a#closeBut { + position: absolute; + display: block; + top: -13px; + right: -13px; + width: 12px; + height: 12px; + text-indent: -9999em; + background: url(../../gfx/close.gif) no-repeat; + outline: 0; +} +div#nyroModalFull div#nyroModalWrapper h1#nyroModalTitle { + margin: 0; + padding: 0; + position: absolute; + top: -22px; + left: 5px; + font-size: 12px; + color: #ddd; +} +div#nyroModalFull div#nyroModalWrapper div#nyroModalContent { + overflow: auto; +} +div#nyroModalFull div#nyroModalWrapper div.wrapper div#nyroModalContent { + padding: 5px; +} +div#nyroModalFull div#nyroModalWrapper div.wrapperImg div#nyroModalContent { + position: relative; + overflow: hidden; + text-align: center; +} +div#nyroModalFull div#nyroModalWrapper div.wrapperImg div#nyroModalContent img { + vertical-align: baseline; +} +div#nyroModalFull div#nyroModalWrapper div.wrapperImg div#nyroModalContent div { + position: absolute; + bottom: 0; + left: 0; + background: black; + padding: 10px; + margin: 10px; + border: 1px white dotted; + overflow: hidden; + opacity: 0.2; + filter: alpha(opacity=20); +} +div#nyroModalFull div#nyroModalWrapper div.wrapperImg div#nyroModalContent div:hover { + opacity: 0.5; + filter: alpha(opacity=50); + cursor: help; +} +div#nyroModalFull div#nyroModalWrapper a.nyroModalPrev, div#nyroModalFull div#nyroModalWrapper a.nyroModalNext { + z-index: 105; + outline: none; + position: absolute; + top: 0; + height: 100%; + width: 40%; + cursor: pointer; + text-indent: -9999em; + background: left 20% no-repeat; + background-image: url(data:image/gif;base64,AAAA); /* Trick IE6 */ +} +div#nyroModalFull div#nyroModalWrapper div.wrapperSwf a.nyroModalPrev, div#nyroModalFull div#nyroModalWrapper div.wrapperSwf a.nyroModalNext, div#nyroModalFull div#nyroModalWrapper div.wrapper a.nyroModalPrev, div#nyroModalFull div#nyroModalWrapper div.wrapper a.nyroModalNext { + height: 60%; + width: 20%; +} +div#nyroModalFull div#nyroModalWrapper div#nyroModalContent a.nyroModalPrev { + left: 0; +} +div#nyroModalFull div#nyroModalWrapper div#nyroModalContent a.nyroModalPrev:hover { + background-image: url(../../gfx/prev.gif); +} +div#nyroModalFull div#nyroModalWrapper div#nyroModalContent a.nyroModalNext { + right: 0; + background-position: right 20%; +} +div#nyroModalFull div#nyroModalWrapper div#nyroModalContent a.nyroModalNext:hover { + background-image: url(../../gfx/next.gif); +} \ No newline at end of file diff --git a/sources/templates/two.css b/sources/templates/two.css new file mode 100644 index 0000000..b60559b --- /dev/null +++ b/sources/templates/two.css @@ -0,0 +1,143 @@ +/* + $Id: two.css 518 2011-10-28 08:09:07Z namiltd $ + */ +a { + text-decoration: none; + color: #c03000; +} + +a:hover { + text-decoration: underline; +}* { + margin: 0; + padding: 0; +} + +wbr { + display: inline-block; +} + +html { + font-size: 100%; + height: 100%; + color: #2B2828; + background: url("two/gradient.png") repeat-x #EEF2FE; +} + +body { + font-family: Verdana, "Bitstream Vera Sans"; + font-size: .75em; + position: relative; + width: 940px; + _width: 945px; /* ie6 */ + min-height: 100%; + overflow: auto; + margin: 0 auto; + padding: 20px 20px 0 20px; +} + +h1 { + margin: 0 10px; + _margin: 0 15px 0 10px; /* ie6 */ + padding: 10px 10px; + text-align: center; + color: #fff; + font-weight: normal; + font-size: 170%; + line-height: 1.5em; +} + +#select { + color: #fff; + text-align: right; + margin-bottom: 45px; +} + +#select select { + width: 100px; +} + +h2 { + font-weight: bold; + font-size: 130%; + line-height: 1.5em; + color: #8B272A; + border-bottom: 2px solid #8B272A; +} + +table { + width: 100%; +} + +.plugin { + float: left; + margin: 10px 0 0 10px; + _margin: 10px 5px 0 5px; /* ie6 */ + padding: 1px; +} + +th, td, h3 { + padding: 4px 10px 2px 10px; + text-align: left; + vertical-align: top; + font-size: 100%; +} + +#footer { + clear: both; + color: #5C5C5C; + margin: 12px; + padding: 13px 25px; + line-height: 18px; + font-size: 80%; + text-align: center; +} + +.bar { + background-color: #8B272A; +} + +.barwarn { + background-color: #88278B; +} + +#vitals, #network, #memory, #filesystem, #hardware, #temp, #voltage, #fan, #power, #current, #ups { + float: left; + width: 451px; + margin: 10px 0 0 10px; + _margin: 10px 5px 0 5px; /* ie6 */ + padding: 1px; +} + +#memory, #filesystem { + width: 915px; +} + +#filesystemTable thead tr .header { + cursor: pointer; +} + +.right { + text-align: right; + padding-right: 20px; +} + +#pciTable, #ideTable, #scsiTable, #usbTable, #tbTable, #i2cTable { + padding: 0px 30px; +} + +.treeimg { + display: table-cell; + vertical-align: top; +} + +.treespan { + display: table-cell; + vertical-align: middle; +} + +.treespanbold { + font-weight: bold; + display: table-cell; + vertical-align: middle; +} diff --git a/sources/templates/two/gradient.png b/sources/templates/two/gradient.png new file mode 100644 index 0000000000000000000000000000000000000000..9a7a470075b60f4b46aac13a40ea82802823f84f GIT binary patch literal 525 zcmeAS@N?(olHy`uVBq!ia0vp^i3|*kFF2TitUQ52Qy|4$?Bp53!NGC+q5lIQm$Sel zvY3H^+X{pkQ|iNcfr64Ht`Q}{`DrEPiAAXl<>lpinR(g8$%zH2dih1^v)|cB0TnF@ z@Ck9%*3i&bS5J|U$&i%ImX^HP*AQ`RIO7|YgATmQPt>B)9hB)>eJAf zsHrzyJOM(LWG4 z-R~R%bnRVF7srr_TW_ylUyBK%_B@?y_aj-PqeWfYrqYYFkz|rD&KhvBM zq)Xt>Mq!R+Q-O>(VL<+dXj|2$OjWQM57Z!r9rSHTm^OzQsQAWOs9|6Y94z-UpM#Y& y&2A`Gm;up07pQQ.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\002a"}.glyphicon-plus:before{content:"\002b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control::-ms-expand{background-color:transparent;border:0}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px\9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:11px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled.focus,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled].focus,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled].focus,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled.focus,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled].focus,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled].focus,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px dashed;border-bottom:4px solid\9}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:2;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:3;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{padding-right:15px;padding-left:15px;border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;filter:alpha(opacity=0);opacity:0;line-break:auto}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);line-break:auto}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.active.right,.carousel-inner>.item.next{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);background-color:rgba(0,0,0,0);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-10px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;font-family:serif;line-height:1}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000\9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-10px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-10px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.modal-header:after,.modal-header:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.modal-header:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}} +/*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file diff --git a/sources/tools/MakeRelease.sh b/sources/tools/MakeRelease.sh new file mode 100644 index 0000000..6cbd4af --- /dev/null +++ b/sources/tools/MakeRelease.sh @@ -0,0 +1,32 @@ +#!/bin/sh -x + +if [ $# -ne 1 ] +then + echo "Usage : ./tools/MakeRelease " + exit +fi + +sed -i "s/PSI_VERSION = '.*'/PSI_VERSION = '$1'/g" includes/class.CommonFunctions.inc.php +ARCHIVE_NAME="phpsysinfo-$1.tar.gz" + +#copy to temp dir +rm -rf /tmp/phpsysinfo +mkdir /tmp/phpsysinfo +cp -R . /tmp/phpsysinfo +cd /tmp/phpsysinfo + +# remove the svn directories +find . -type d -name .svn -exec rm -fr {} \; +#or find . -iname ".svn" -print0 | xargs -0 rm -r + +#remove some dirs +rm -rf tools sample + +#remove phpsysinfo.ini +rm -rf phpsysinfo.ini .cvsignore .project + +#create archive +cd .. +tar -czf $ARCHIVE_NAME phpsysinfo + +md5sum $ARCHIVE_NAME diff --git a/sources/tools/README b/sources/tools/README new file mode 100644 index 0000000..71d6c21 --- /dev/null +++ b/sources/tools/README @@ -0,0 +1,4 @@ +check.sh - Script for checking *.php files and reformat them +MakeRelease.sh - Cleanup the code a bit for a release +phpsysinfo.ini - Configuration file for generating documentation with phpDocumentor +lint.bat - run php lint on every php file to check for syntax (windows util) diff --git a/sources/tools/aptana/js.xml b/sources/tools/aptana/js.xml new file mode 100644 index 0000000..ca19006 --- /dev/null +++ b/sources/tools/aptana/js.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sources/tools/aptana/php.xml b/sources/tools/aptana/php.xml new file mode 100644 index 0000000..15fadc4 --- /dev/null +++ b/sources/tools/aptana/php.xml @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sources/tools/check.sh b/sources/tools/check.sh new file mode 100644 index 0000000..62d32cb --- /dev/null +++ b/sources/tools/check.sh @@ -0,0 +1,15 @@ +#!/bin/bash +FILES=`find ../ \( \( -iwholename '*tool*' -o -iwholename '*lang*' \) -prune -o -iname '*.php' \) -a -type f` + +for entry in ${FILES}; do + php -l ${entry} + if [ $? -ne 0 ] + then + exit; + fi +done + +for entry in ${FILES}; do + echo "running phpcs --standard=PEAR on ${entry}" + phpcs --standard=PEAR ${entry} +done diff --git a/sources/tools/checkdistro.php b/sources/tools/checkdistro.php new file mode 100644 index 0000000..0d870e2 --- /dev/null +++ b/sources/tools/checkdistro.php @@ -0,0 +1,212 @@ +"; +echo ""; +echo " "; +echo ""; + +define('APP_ROOT', dirname(__FILE__).'/..'); +require_once APP_ROOT.'/includes/interface/class.PSI_Interface_OS.inc.php'; +require_once APP_ROOT.'/includes/os/class.OS.inc.php'; +require_once APP_ROOT.'/includes/to/class.System.inc.php'; +require_once APP_ROOT.'/includes/os/class.Linux.inc.php'; +define('PSI_USE_VHOST', false); +define('PSI_DEBUG', false); +define('PSI_LOAD_BAR', false); + +$log_file = ""; +$lsb = true; //enable detection lsb_release -a +$lsbfile = true; //enable detection /etc/lsb-release + +class PSI_Error +{ + public static function singleton() + { + } +} + +class Parser +{ + public static function lspci() + { + return array(); + } + public static function df() + { + return array(); + } +} + +class CommonFunctions +{ + private static function _parse_log_file($string) + { + global $log_file; + if (file_exists($log_file)) { + $contents = @file_get_contents($log_file); + $contents = preg_replace("/\r\n/", "\n", $contents); + if ($contents && preg_match("/^\-\-\-\-\-\-\-\-\-\-".preg_quote($string, '/')."\-\-\-\-\-\-\-\-\-\-\n/m", $contents, $matches, PREG_OFFSET_CAPTURE)) { + $findIndex = $matches[0][1]; + if (preg_match("/\n/m", $contents, $matches, PREG_OFFSET_CAPTURE, $findIndex)) { + $startIndex = $matches[0][1]+1; + if (preg_match("/^\-\-\-\-\-\-\-\-\-\-/m", $contents, $matches, PREG_OFFSET_CAPTURE, $startIndex)) { + $stopIndex = $matches[0][1]; + + return substr($contents, $startIndex, $stopIndex-$startIndex); + } else { + return substr($contents, $startIndex); + } + } + } + } + + return false; + } + + public static function rfts($strFileName, &$strRet, $intLines = 0, $intBytes = 4096, $booErrorRep = true) + { + global $lsb; + global $lsbfile; + if ($lsb || $lsbfile || ($strFileName != "/etc/lsb-release")) { + $strRet=self::_parse_log_file($strFileName); + if ($strRet && ($intLines == 1) && (strpos($strRet, "\n") !== false)) { + $strRet=trim(substr($strRet, 0, strpos($strRet, "\n"))); + } + + return $strRet; + } else { + return false; + } + } + + public static function executeProgram($strProgramname, $strArgs, &$strBuffer, $booErrorRep = true) + { + global $lsb; + $strBuffer = ''; + if ($strProgramname=='lsb_release') { + return $lsb && ($strBuffer = self::_parse_log_file('lsb_release -a')); + } else { + return $strBuffer = self::_parse_log_file($strProgramname); + } + } + + public static function fileexists($strFileName) + { + global $log_file; + global $lsb; + global $lsbfile; + if (file_exists($log_file) + && ($lsb || $lsbfile || ($strFileName != "/etc/lsb-release")) + && ($contents = @file_get_contents($log_file)) + && preg_match("/^\-\-\-\-\-\-\-\-\-\-".preg_quote($strFileName, '/')."\-\-\-\-\-\-\-\-\-\-\r?\n/m", $contents)) { + return true; + } + + return false; + } + + public static function gdc() + { + return array(); + } +} + +class _Linux extends Linux +{ + public function build() + { + parent::_distro(); + } +} + +$system = new _Linux(); +if ($handle = opendir(APP_ROOT.'/sample/distrotest')) { + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + while (false !== ($entry = readdir($handle))) { + if (($entry!=".")&&($entry!="..")) { + if ($shandle = opendir(APP_ROOT."/sample/distrotest/$entry")) { + while (false !== ($sentry = readdir($shandle))) { + if (($sentry!=".")&&($sentry!="..")) { + $log_file=APP_ROOT.'/sample/distrotest/'.$entry.'/'.$sentry; + echo ""; + echo ""; + + $lsb = true; + $lsbfile = true; + $sys=$system->getSys(); + $distro=$sys->getDistribution(); + $icon=$sys->getDistributionIcon(); + if ($icon == '') $icon="unknown.png"; + if ($icon != $entry.'.png') + echo ""; + if ($icon != $entry.'.png') + echo ""; + $sys->setDistribution(""); + $sys->setDistributionIcon(""); + + $lsb = false; + $lsbfile = true; + $sys=$system->getSys(); + $distro=$sys->getDistribution(); + $icon=$sys->getDistributionIcon(); + if ($icon == '') $icon="unknown.png"; + if ($icon != $entry.'.png') + echo ""; + if ($icon != $entry.'.png') + echo ""; + $sys->setDistribution(""); + $sys->setDistributionIcon(""); + + $lsb = false; + $lsbfile = false; + $sys=$system->getSys(); + $distro=$sys->getDistribution(); + $icon=$sys->getDistributionIcon(); + if ($icon == '') $icon="unknown.png"; + if ($icon != $entry.'.png') + echo ""; + if ($icon != $entry.'.png') + echo ""; + $sys->setDistribution(""); + $sys->setDistributionIcon(""); + + echo ""; + } + } + closedir($shandle); + } + } + } + echo "
    Distrotest sampleDistro NameDistro IconDistro Name (no lsb_release)Distro Icon (no lsb_release)Distro Name (no lsb_release and no /etc/lsb-release)Distro Icon (no lsb_release and no /etc/lsb-release)
    ".$entry.'/'.$sentry.""; + else + echo ""; + echo $distro.""; + else + echo ""; + echo ""; + echo $icon.""; + else + echo ""; + echo $distro.""; + else + echo ""; + echo ""; + echo $icon.""; + else + echo ""; + echo $distro.""; + else + echo ""; + echo ""; + echo $icon."
    "; + closedir($handle); +} +echo ""; diff --git a/sources/tools/distrotest.php b/sources/tools/distrotest.php new file mode 100644 index 0000000..11bdcdc --- /dev/null +++ b/sources/tools/distrotest.php @@ -0,0 +1,45 @@ +/dev/null", "r"); +if (is_resource($fp)) { + $contents=""; + $start=true; + while (!feof($fp)) { + $contents=fgets($fp, 4096); + if ($start && (strlen($contents)>0)) { + echo "----------lsb_release -a----------\n"; + $start=false; + } + echo $contents; + } + if ((strlen($contents)>0)&&(substr($contents, -1)!="\n")) { + echo "\n"; + } + pclose($fp); +} + +foreach ($filemaskarray as $filemask) { + foreach (glob($filemask) as $filename) { + echo "----------".$filename."----------\n"; + echo $contents=file_get_contents($filename); + if ((strlen($contents)>0)&&(substr($contents, -1)!="\n")) { + echo "\n"; + } + } +} diff --git a/sources/tools/lint.bat b/sources/tools/lint.bat new file mode 100644 index 0000000..b0502ab --- /dev/null +++ b/sources/tools/lint.bat @@ -0,0 +1,10 @@ +@echo off +echo. +echo Starting SVN Stat + PHP Lint +echo ============================ +svn stat |findstr /I /R "\.php$ \.phtml$" >lint.txt +for /F "tokens=2 delims= " %%i in (lint.txt) do q:\php53\php.exe -l %%i |findstr /I /B /V "No syntax errors" +del lint.txt +echo. +echo ============================ +echo Finished SVN Stat + PHP Lint diff --git a/sources/tools/speedfan/SpeedFanGet_bin.zip b/sources/tools/speedfan/SpeedFanGet_bin.zip new file mode 100644 index 0000000000000000000000000000000000000000..485aec9dc9bb208babb8e4828ec416c28c560da8 GIT binary patch literal 2649 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 literal 0 HcmV?d00001 diff --git a/sources/xml.php b/sources/xml.php new file mode 100644 index 0000000..d6f9b00 --- /dev/null +++ b/sources/xml.php @@ -0,0 +1,63 @@ + + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version SVN: $Id: xml.php 614 2012-07-28 09:02:59Z jacky672 $ + * @link http://phpsysinfo.sourceforge.net + */ + + /** + * application root path + * + * @var string + */ +define('APP_ROOT', dirname(__FILE__)); + +/** + * internal xml or external + * external is needed when running in static mode + * + * @var boolean + */ +define('PSI_INTERNAL_XML', true); + +require_once APP_ROOT.'/includes/autoloader.inc.php'; + +// check what xml part should be generated +if (isset($_GET['plugin'])) { + $plugin = basename(htmlspecialchars($_GET['plugin'])); + if ($plugin == "complete") { + $output = new WebpageXML(true, null); + } elseif ($plugin != "") { + $output = new WebpageXML(false, $plugin); + } else { + unset($output); + } +} else { + $output = new WebpageXML(false, null); +} +// if $output is correct generate output in proper type +if (isset($output) && is_object($output)) { + if (isset($_GET['json']) || isset($_GET['jsonp'])) { + if (version_compare("5.2", PHP_VERSION, ">")) { + echo ''; + } else { + if (defined('PSI_JSON_ISSUE') && (PSI_JSON_ISSUE)) { + $json = json_encode(simplexml_load_string(str_replace(">", ">\n", $output->getXMLString()))); // solving json_encode issue + } else { + $json = json_encode(simplexml_load_string($output->getXMLString())); + } + echo isset($_GET['jsonp']) ? (!preg_match('/[^A-Za-z0-9_\?]/', $_GET['callback'])?$_GET['callback']:'') . '('.$json.')' : $json; + } + } else { + $output->run(); + } +}

    0YwHazUo_ zXdK(lC{WQ#H5f{|>fpUC%?C4(K?CHD)VJToS2G{Qgs2@M?$*?O9Uhj}Ip{983!dup zsQPdjXQ^rkbk+o`hpMKEG2h+D-r8Y%IZl7Vtpluq% zxpzuTIX^C1it>q~Qzdj!+e_fACH8PQUO}zeI)oInXN7ReV#GFPWR~Z|NmR&u{>j>Y z!@xXD|2Mvjx5A(C?yA?7BIr8@%lR)X-dY)At}h(FaX)Mc^>Qo@%=8>z=Nhrr{gd)NFu%XOcy(l>i+bXY2l*z z-7>sne6tsZhCo<@;c+3pPVSPSYs%*-UNjjwV)8lYW!+(&><0JTC5oCA5TQwPV9#Io z%JL0CJqq)k6*ze0r_Eu}uw;XhTvDUTiliu?_)9i7J3sBd*)>#lBI6|PHv$Cd>p&!o z27eHKic0f(U@t5zDlaU2YghAhq%*Z9q@|&0@k(q(?1OvW`{>BgS`9~#q9J{FK;-OUB*}PSoH92?Ojb6hFkV9+zq)?Ti zN1ElK!(yUWsT`AIV&dr5y@0c=k?_=;h^!n8v#QJA7mAl#XChUG9L1)}A|)AODYv*8 zecqhK5ycp{TWB-N6y@V{mkp5e;^Dw9!n-n&^zPFitb08zAqhKO?0SVsc{*XdI67OMrrPk(-qc|iCIMnb&$ zS4HV~MuJP+%ijf;jM%qN47k3>sARcOw5)@Xz&LD|Q%ngo>x4@t9JN2&!iqO+j!@Xf<2k7OrK!S~^cw^b2dcE^hM zewlvil(JLKy|OhP$*vfY){Psj{CxI|c)w+4&iJNnOE>>xKKdjiz%8dq|H|-_;PPIM zamRAplzwOU>Q$%V|6&tIG#lkriK-EPKrmB-91*zBtqWtaVZ<-0H4|5pPp8NuF3+EoO`d3^e+ ze16~gCyrlVYsbvK7Bstp*+0JZ{)67a0wkrTj{geyC`=bgVEGmN{~2(}Qpv`}d+9b= vR%I_g-(`yxDKO@;2=hKJ%Krr%U&WuZfv0CVewgZ&|MPDfK6u@rd*}Td{Zfpm literal 0 HcmV?d00001 diff --git a/sources/gfx/images/QNX.png b/sources/gfx/images/QNX.png new file mode 100644 index 0000000000000000000000000000000000000000..cb0f559fd253689b5808b77bf690844ddb10cc97 GIT binary patch literal 4217 zcmeH}&ud&&6vxkfZ)WmyVyuMv12v^l#B5yn16;KdF$q#cO~6eRAu5Vm>_W*ZaaWLn zNWuR=A<|9Jg`2wQMi2$NE0XvlRHI_rCeu!m$$Ngj_q{v5WMVQ|b<;C^@3}wDJ-_a` z_syy2jy+TDzPsDZs$-)g&%+0W&I;|x>FHHi*NM@WPMY;y5ZsyJzI)92hsQ>azWBi< zH`u?h?9wzv?&eW+^Gs)!Z#l4Y2IgFBIo=s}9lqakR*tqW4D#dOM_B(JIi_*l^VI3I1KfyP4?s>(wAHhE;xCW9OT9;AX>3QG@ zN24gUTAZ2#NdSvwkZ=-9Pujhmne^`Mb_e9KqS%S<#IRRNCK4Q2BF`0I0fkLThn4n> zUh+)`P_9&JTp`_-qXzE+6^vFvU2;%A`R@dE;Lie{lJ+%F2Sex6g}MrH&P~QyY0gIG zW}}DPKs6iZElPb6VptArfK4Fp16~d?fwOj?upZ=eY$t$T;w~?n7bBK`1($RD0$AEVq(KKg0?D?&? zYLAn@1zfQsHrPQ_f0kPU;!Zku1NnnZJLEobX}FH65mBfyzRWh{O&vdOH4KEu$4lkS zb@@#@}$?&%TZNV=zojyH{flNcOZ^!4Qqelz(($X zB9sFBM5`t_^cgOs>9j-pQsGWA<5o>p-`ydX2@QH?D%@4?~6iw zPkPt}q`X<_`3B8(fm%ZJ7*z2JO~dp(<<7Ls7mF##?#QR?+U>8dg}_VlrlvroP9;lIl&q&ffq literal 0 HcmV?d00001 diff --git a/sources/gfx/images/QTS.png b/sources/gfx/images/QTS.png new file mode 100644 index 0000000000000000000000000000000000000000..0d4406b8260efae4b4205c5e3b73ebb6f8e7b57d GIT binary patch literal 1769 zcmVN2bPDNB8 zb~7$DE-^7j^FlWO00w1AL_t(oN6lCHZXQ| z)3>|8O`=nmeDZzX=jikK-p@>#Oa^29nE(@ajJ;{hUl?am2>h2A=W=SF`8yb2xj!Yq z1rxfEhnQ|b6y~xh$CQXceJeS9{IEGWo5`5RvhV{0P}Y@)W$*Y<7^;O9d=2(s2i$cX z&}!a-y=tT!Z_ZWuCIYK;JhO8iB8R3hlxWeBRv9E9i*Rq83wP}vUUU`q`nzz2l5mFl zC<#3QM`JHEN~bR0Sqz_(H9>Apq@(^moU3j_TYUtsRpp}Ka1x3DqER!JMxTOnZ5Q03 z6ttE;xFbn;2%pFeNw^8mh7>#-2}=3S!L!Mj=bD=18FgOH$bR__CrRKoW``q)$E`UM z%n@F`t-k=Cn*Gptxw=Hb_yI$D)#bxT$Yt`w#=5p4kv(IO_O&M9&CPK>u(2QBrZns; ze?&=VQ8u`<*=@$tI~TyQriTZN%Om|G35YhWDR^5s-$GDoE!4<>8n-6ZoTr%=HK*Wf zk~2d}$Zr?54$viBYpySo0M{9$D$4zOo${4$l-BM@f*Mj2YU9>_fT!*RTx*Wer^jI* z2IuOpk%N2nad;cLp{-AnNFRJ8A#M}|NZuLlgQtF{WLQ)(3mLk=9}GfkObq%vcR&sc z0e5o(v$t$REHN3Ue$7YprVTLzopGzm9FcwUJ;-&p3rUy!fXsYB7rC`7`wF6q7z3zw~W_0rS>C07fh4|#w8$i#ZyxOXMGy} zO;S%-KNw5iCI<9GxIlUc15gFC6qYjj)mvY#2>3Rp|8W9CS)krYrZ=$A7lU`n?Rr**wkF0Vy65 zKw6|PTZq=*;hr0Cth$crbvIyN^Yb8l`Yq1iD8h5^or3+X^Le<{GZpDe1?WF(M$ZvA zKiPyABA8NsnD2r#gR-M5M?jUs#jh5_5xmAiWSCs_bT%Q?a@h+w@8?*$p*PHLsgUe= z3bc~1ja{zgJ_}X~*5!vj!n~JH=i%a&d?c<;LjRQlq|e*%%VA7=y9iJ0fMZEj^d@Y| z0@9b!-kuNF>bIP~Tp~VG0_z}j*fLKNP(e8Ue=ifc zXA}XLMC+JnLrH4cM+O^A4r-0xB6DMEqV|bY=N>_+|CPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BKeVQFr3E>1;MAa*k@Gd8K`;w1n814KzgK~z{r?U&n66G0Tl`=|9U(GZmIq6S}# z3B*ZEP=n!C1i2%Xi*x~7?zJ#2SSqEKHi8y;PzWJ{BDC9fyS?mjPTkVdPN5g|!Ell< zX|vP$e*5j&nW?6n^6s6G#jPMwzy7aJyC*t@T&k!mHC2S8qR`l2>a{&=qN%DTMB2@Jm}_;r+3F_=C)O!_dx|FkATC zQM_xJLXZ)5GoHO;s@m{tb;nN%dCq9sP8AqhlVQRwLl1ik3IV}1O&gK?5X}pTOP_Tc zYqDX74Azf6tnh}5-1Nd3aO+j!;Nq}0zZ;?s%!vzMyCc`^panqf{qkom}**w7LIX+iZ@*P1U$$0G%b8JGj6y ztcyv*vH+e_xnzJTkN*nb3gABgXqb(a4A8bDl@EYwG{-3}Eb7pLs&!GK*^AJH0I%KQ zya1?rqXNba@#5{2Ro6<0+!Ycz#wk@W03Az49iA?{LtOuP=4WDSy3QPf8BcmAOqGRg zW^9v58t{x$!UXP(EBpEMV6&S3Ivz%$NNm7Z^yDU4n32*Q#7 zptxNXBkr`uxW*|J0)VOo^q)l^)vH(!mSQ58~6VSaJrZ{g= ziM-!E*6JM+eP}!nk^;a6!>B9S_siad>OOYxwMYb|PG5Lo6OB3|XZ=wP!2=3g)OQX?fegUdd&%8HjIFkSX002ovPDHLkV1i{c Bzc~N^ literal 0 HcmV?d00001 diff --git a/sources/gfx/images/ROSA.png b/sources/gfx/images/ROSA.png new file mode 100644 index 0000000000000000000000000000000000000000..de0a0b5753fb684f1e1314c5c0c5e50282419c21 GIT binary patch literal 4217 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 L>5l9F`mz55IF5n5 literal 0 HcmV?d00001 diff --git a/sources/gfx/images/Raspbian.png b/sources/gfx/images/Raspbian.png new file mode 100644 index 0000000000000000000000000000000000000000..8c2ced53003ca1954e04b7f947127ce23a88ca2a GIT binary patch literal 1911 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 N002ovPDHLkV1h2FubBV< literal 0 HcmV?d00001 diff --git a/sources/gfx/images/RedFlag.png b/sources/gfx/images/RedFlag.png new file mode 100644 index 0000000000000000000000000000000000000000..c2911213e401261814382537b0ec5405fbcd9901 GIT binary patch literal 2193 zcmd_q{Wny390&04G~w6(wyLeRXZf#D4tc+I^m#kZ9wtYFy${MyITCe$>XlLg@ zwZ*Sl<={*qQ_18|6C+P2XV-PEFpZpIh-a<;!qe5qgYM?PQG>C`^((}rS`S}kpj)kH z&SWwQ&5YQd_7y7)%8YHA_3;%1lM)Mk9)ZwcvZB<=rp3rYxWaV1&zC1WHg_5s6++}} zGP%u+&}V4cZebuYT^_XEZNS)Y)WERYoDks0X8U{hSgv>q;X7=M>&W(*VpP$(M`blX}8VHKY=IBhPdt*$9$tde0rp$h3}bXL58~YGQwuQ-4xoU#5TWwF}}R{f^w7MFn>s=ZEK%XOHDs^UGcS{q2(E z`gK9EZ%bZAX=(oKJy2GDZ{Sw4EIpl9Tsf4THB{xIs4$V_-5jrkW%pNCS8}JS>__v{ zA3mt-c@Qb9*fLU(tE@K|uihrA{C&LQ@MQhk8eWa8fjC!BoG83KQdB(KXe?{SPc++( zl;sZ8q&7Wl9Bv31Y1%n*zkIS~!^;}(^TyJ#%906g?f|cBuIY%h?MQ3eWBHR1X+yo@ z@%gFtvr|pguiCf+{6{aI3k5F(VnOFPpEuG`Jk{DN<+sjsWh=UG%ys>x=u4UD6wVA} z_794c-L2DoJn`W8Oi$Oeq-6Z>UPZ5PTHG%k6pRjvW&J|MEAG(H$oycde7J4)wNyGe zJ|iEHPtQ)s=VbENvvYEc24J;`69K@06Fa*h znE;@%iiK?S3+=>MYP?ja%%U;6sPd*Dymk5VofaW4e3wV&BEbtn5ITcFN8BM2iDd8m z0qEY1ydBOY5(RP$T_}8*Z*znOK_m!bJzF3;-QEENc7RkpyoMKuOb>U2fxwV64MC`| zss{}FEdbyrgwAq@NhAnH7*uD70+H6P?N~r|Gd&PBfM|3Cp}`P^V($|Bz8G_%Gu>1> zB*9cS#2tCl&5@M#9;s%~=`enP;^V=&%}Q&lDRgcN{fUEY{=SUf72Tv7~f z9*lTsJDEd71v&F!AUI%U<8@QMKPrg81g8-X-KZ_g(2GC?2^f4}n5-l&E@fE^DiEnY zQjSC-otF8dFB0J9@v<1nq#_B6%|UI!$3`d>8cXq*`T0Op0D}2SWiS?t!C)omfFn{W zm7-r`(hSjakj7B~rMw{T+@p^OW2I7|6maXfWqs%(X6rw*ioCMgy1R|&pg&TVV4Kga z&Cjnu1N}|4b+z@NG&{d^3M~gsRaJF$wEzsErs`sO(cPzlkES09JjaUGhwaq#Qpc># L-pCz~z^MNKIObx+ literal 0 HcmV?d00001 diff --git a/sources/gfx/images/RedHat.png b/sources/gfx/images/RedHat.png new file mode 100644 index 0000000000000000000000000000000000000000..2092015736d4abb53fc3c39f3547c4163338d283 GIT binary patch literal 469 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvg8-ipS0PbxOE0fTd3hf{zo6vg z{QUfiwzkEJYHwvlCQh8VWy_We7cTt!_YbHX0)ir?b^}?wB|(0{|B(QL?F*$gpaf%* zx4R3!#4d)LKn`btM`SUO_5fqIli7Aa1*)Ddjv*3~u?H3XqXQY*9&X>hW&4366NN?9 z6}t9tCb1p-$H?ZaW>755dRdvV*sgP?6w~fCi$06SdQAKB?RVhry(Zbo9Q{dn4w&hlk?3 zm$>!GY~0m_nDu~;m7mMK^|GakYn(4^>bP0l+XkKil4&K literal 0 HcmV?d00001 diff --git a/sources/gfx/images/Rubix.png b/sources/gfx/images/Rubix.png new file mode 100644 index 0000000000000000000000000000000000000000..ace28b084f12797967894df700e0557d3d241f7f GIT binary patch literal 1403 zcmV->1%&#EP)y{D4^00iGjL_t(o!|j(_OjCCp z$ITujdsxrug`Sg$QlJIea?=6Z5+cbK^vNw_5-vJSl#8XP;6O!}z*^C<$ynGXbtBSJ z3Mw)}9Ee=T6xovM9=2rBEd!KGhMUW>VdyAr&wl^IIe2>Lu`TXl4?D^Cq3LNqpa1vw zYtyb<_x}~ZRU^%L2BHr3bt%O)+J8mBB;WtBL7LYI651f(38^KV-#$+AU|=mLqj0N{zKIzwMZt;#F|OvCd5OQ4hU;V5=S0>*)wxC|1SRkicrTnVO$dcQMAwe#WJpmDU4Wlm-> zV*wry@ZOBt_9b8Nl^}_xL9`RT7qeQLQ_>{YO~dIuLU5F^ji)IaS?)5*a=)lc-~RIJ zl|>mZlo&@c-o5C4!}5)=fQ@d!v$g8%BuMA``n-pLM5T#XmazMP-voF&dDwYUp4;D$ zm$uh@UfB!jEUeDj`=Z`>eOuk7rA+hJzE5u&c5gl2Gy!luWW7)eAs}+}9HE;63AddG z?;zj$8{h)~FKlm9^^6Q_sG$KhWwR`~2L$0fiDQg} zhYPPIXn1jlP1QX%s-=E=kWBqLmrULGN=t!I$BG0rL65^5e$X$RI}X$YjALeS!#iy4 zEc|l>N8tHCQ|UbT#an_IhkM7_f#BghiHgS1f*EG!h3v_>aJ~dH4%ms4BWab5XyHnO zhI>hbW|!9QOwY4fRXsv*HtaZB&C1UF6T7kiT(o95dxd8!!<#>iN`uqS{&*)z5YFb# z4~dl3qMU9vMJ1XDBJ8Q)SZ;VcmZz{P_bK+ln;ss#rk=S!xkV5@Ilh_d?^91%T9i6V z7*^Pdi&`wWNV8UWBDO1{S6ZQViHlX=#}q{9+FDg*NaEhaYKe)TY50Apzu2t6^}S;3 zr%{>MX~jjCK|&iWJPF`^(n`$|@xk+yyf(=t*{}L8wlJcUmEbnP!l9)ib0mHU;CIL6 zQqL?QqsC-n2S{{*L|icNtI{KyMFb~5N}JVcKaDSD+7!>s&@yMqH4d3jR=%dHs zzET8V`606`aTFw`Kw?!Bb8vD7{ukU=?Pn1c4InY^CE*P}$c6JHjxiD*F8o`7Ul3z| z!1IOxKZ>-(N)!IzKAMV9kx3HEu20OI8UOY4Hr%Lop}Hf`N6{sVNoN#Q7JEOh_?002ov JPDHLkV1kq*l70XH literal 0 HcmV?d00001 diff --git a/sources/gfx/images/SMEServer.png b/sources/gfx/images/SMEServer.png new file mode 100644 index 0000000000000000000000000000000000000000..75712f6f8304118e9a2c1159770e6607a9189dc9 GIT binary patch literal 3211 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 literal 0 HcmV?d00001 diff --git a/sources/gfx/images/Semplice.png b/sources/gfx/images/Semplice.png new file mode 100644 index 0000000000000000000000000000000000000000..9875c7e065c4858febad764eb5aebd4468452b74 GIT binary patch literal 1925 zcmZ9M3sjSJ7{(uiOe+lSP>CU^5!ldHw4nzol1tFp;44?42b(~dLz0UKNSJYvsT*=p zQq%}=%0^#5sdEWod`L>hs`OxfH z%Vzt4UYWb?A^@8~eUt92+?V{K1ZS5D^y}?=R zu+)M3_M2}xavk4!`yIX`--+k6oWE?j({kr!F7GcZm#YgZk}Eq9|^p%`bVtE z^q;UHB69_4p z`^DiIAw|z`C|(_~3L8}~gdUr{L5c7)h&Vgv>*I)2W0Mk_$}BdXz~)j!RlOWmViHw8 zcjM``L1IMLScacOOvN*sD-e5bdd!(uBb3-u8T@6?^U>$#N1j4l72+E4O|@C9+B~Kb z@io|5i*M`a#FbfWsm8X3^&wy3yGA6`y!1^463)+!KZm5+>4_TCf0)$ zG(*}jb9+6cE!c71EV&6gTCr1uoo(hRjo5V&vI~%DBQ}LY-htE>q;|fvLxbHqq_-pE z0@8JxW1>vcx-54!A+s5o`g!t3D_Qf?ncAoJw#3H8Agjk_x5jKw=W|(Y*mni{yXWlH z;lO1a?AW?3e)hh09O}iP0UR1dP8V_v^Y-bHdue*k5b`dYdCm`<{4qwIL>$7vO z;mDYD$95FlMA20g{$zf{fa2>oHu#ES2*<~8{EjSj7f#$l$w+FN9LiCff>E5h57q4j z#X~bxW3!aEar$?hxr?*6_GD#3ec$}_O_bk8#V@EBw=BJj%3t?oe~-!uRNX`MYN z+B?%~$1N+ytjq48?l;umJ(P2BM&0iwjrSH-{`C5}U!i&MV_puL#?2chI92z}G{2#B zB43ebabXx7#c+vce z>bl%}$R{i<=wq*3UQTUFdrBV1$mD;a;mY0kay}XId6#);z$J zBBKmlc!x7vMR$xRK)HLrFnv{txh++}u0` zq`1V*i7esu-vpk~W*9%eRP0h~!fuvTeOHZCG%nu9Hv$Km}|4g7+AGg`%awh!jdB;s7=R zlL5hz2WUR8pg>tyS5w1=NF)^D>q!7@Kml8_vyUkXlqyxTMq?zx!X(BmjDTNoU?@9J zzN$yp%o3#$(UL$hM>jReh0VlFxT#8(3hnqpg!A1_sJo$yQY;ojoXkLx7i;mw*wAC5n>5 z;*%tKdb(Vmks)=aJ6hY>*uculYQf^S-gK0Nh9@N@Nu~a){r!bPKFvEU;@C_AMuMus z!o#DY=z2oxH~JJ{OfY6p3n39<9(=wx?Z-Ong?NuyQ@2w_AbTYG!kMb=OJCka+7edyKnWf(gS$8Ktxjlk{4 gy8BpD->1%}bY-jFDE)pd{g=So!^gd3#oEMw0F!z{bpQYW literal 0 HcmV?d00001 diff --git a/sources/gfx/images/Slackware.png b/sources/gfx/images/Slackware.png new file mode 100644 index 0000000000000000000000000000000000000000..b711e48665059d3711c551a54aec40241eea17d4 GIT binary patch literal 2551 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 N002ovPDHLkV1h4I!`c7< literal 0 HcmV?d00001 diff --git a/sources/gfx/images/Slax.png b/sources/gfx/images/Slax.png new file mode 100644 index 0000000000000000000000000000000000000000..6f01c94704cd1ef18527c1b96e58f687124fa625 GIT binary patch literal 4217 zcmbtX32YSC8UEhP&g|iHeJmIoOvs_CZkx7{Ac&xLVk<_i+%_U^QLCs@rM4hdqM#I- zCW;a%k&sZ;q?g(vB}hp{L5iv>hpR?$nnZ}SsUjMa6cR#FFc_Tp+VzfSc4l6`f9$2Z zUIUBze_7LilhDhP~^cLYqTJhjuJJs*$4 zg@_h#ZqTx+pfE?_d_n5~c?Lsc%gwZ!hImGR16jw=47e|$O{A?xbje(4t018DN6z#Z zh8SRhsSqOoWKoeoF=#|NLE@w5vY4vxz@}IN4YFR`!&lU7x_~TeLXI(QD*~~Cfb9Cm zvpA5wh?l5EWcqng^S|O3af=X&e8hfs6mIQGd_k#*EBpm`28q%kTImvg!Kz<_A9n9o z8Lz>?itNVX&kHWMYnM-#LiA<0IJXOyCp+xeP`L2T@;H zfNjyYG)D{;n5{@qEyX}JM02{Yj+ST^>J?Q6Xe}lq}x7^J5&-D2?VUfls)fjL7+tx0hIvKLX9+g2Q8EokkUq( z$Y*gjcN||F`jMU}#uRSm8^5V-#+{7ZIL)USOaTKZuiN4I0cKcwB@2|NqU@mI z=d}|83mPgGrWS&?5j;@}T>4Fa*mljl^&=NZ9bd5lJ8N4pK#-(3jJ^(;%UT$7%w$oq zm}-J0=TMw+k+MjXa~26(tQ!fAwbMGQXpJSoqs`p!Oye)-|A}dl6+MI4xT6HmUePoFPaRMLrJK>Bm<;;=K0=eaj3 zJ}xD(&YOIjG`pFn>x&P^Vq|l9Z;8Cf?BWL7Mss>4_N?f`^Iv{StuI|u`hD2~GPv&?YC|m6}+CcLMl%e0csC242~tPb^+rw*BZ& z^(b;U#C&F^E!|{8ZVacr0`j8i)tY!wV#7$`hV*B#huOvuD{o~4WXfP|yOLb-ZBW3B zdjTiy6q>HIt{fuD2o+0W{o3zEx2Ce`3IfM@eF_|$S$qmbU_2pbM{$U0F-jLnxu~j% zC8$-%G+r#WGLX)`pr@us@dS@LS2Cga@MaS@7jQVp;!iFKumDwsFIHo5(uGO9IC21& z7BjA}0K-_nbe}#r^&Yn8bF@Z?+58MnWlvz&=pXQ1YM)UK-sW*QyI7d?1(5f^aDlk? zedI2k#*=@43J>vr5HUtsE6aki8Fn^qRLOtMpy9SwObrifW}{MHJ&4`jMI5SIi)Rz{ z*j$<^QbMJ)PP~ub6?~kH@iKdI1VbnH>whnnUF=7txY$|zK6;eN#?oCJ-*ALAK8Co} zg6WwL@cY=UxQ&;9q>zwwqk}_d6352h!lOrj#*C_>Rl49Ro8sfd33*Or5DfhQedk~ zaN+gg>-#_Px(Fm|sl5Z`X6K2MgrwEEg$LMCLHU{k*X4p2w`iAH@HcV6H6>TM;Hp_r drHub;+1kme?H{Z=(JVr?^bPbrcjtE={V&u;1}p#o literal 0 HcmV?d00001 diff --git a/sources/gfx/images/SliTaz.png b/sources/gfx/images/SliTaz.png new file mode 100644 index 0000000000000000000000000000000000000000..8dd42935bbebec3d2cbe2ea820bcde6c5bba8765 GIT binary patch literal 2193 zcmd^<30D(W7>4g{L^h2mMjH?V%ApjrP^2ow4GT)@+MrnFxK)F7q2LycOBGRyg0cuf z!r+2ziXaFHi$r1q!K4fU3B*K61Qdax14bfR)OLa#6zxCgd(NFZ@Ao}(=kBLhE?+#_ z%*qS^Fq-b`%^+%9Lop!{Pw%ud5&%eG<tSn@c_ zv6PA9sa9W3vazPwPM%_K_m!iA^E9XFF4J7yT-;~Qm^FK*hv)3M^XGUiT;RRvhef`N z=s)@{UA|-`W5vdwX8EmVtohkLVEwv{n>YNjb@Pd>lbGAKZr}Oqsi5gW!MjfG_T9ZV zgtceyKGxm?Y*rGRdioGO>o7QS^iblFnK8fnq#p-i$M=MuIL1BsZCaRpX1LMiaO;!d zVFeK&ClcgFOgVMtY{Z#AvZF!v+3~TF2QQuV=bqcaJ7;?~Iw~)olo7jx6MHl^F1jQE zB*jMFjR%Dn01|(=Fp-uUzq*`5OGu1QNaXUku7z9=4i_o8WFk%hbx9zd%T7wZa5H%w zpSxO!*jFMB;^dj)i`IN(i|8tlq`0PBLXt0~3Nyj&E6eIrjnh&u)MNl<8c0pMQhn9+ zT3XEI^sGBsbBi+9^D=^kIaFy5$jD4nUIXY2+pO!Es_d~(u9@U!r-<@qNUv|m%E>Fv z3Cqs8o_ixtm2V>Fk@Ie5;sobQvwCGWp=fkqaMYr#?i$HVvjN5`ztzfmbY~y2*olJ0{U9jLuC1|an zXe5?`^0FFHu(&)=AQY>s-0Q`Mg`zthl`}9Iz$8wsvPsPqn?)6OMHN-|#G*Fo>;_3p zg+$!(=XAN`MrSS1N_VPdA#F7-RZ>Z{wDgI5o~&Bh*=SZ*Et6N*$>en%^(z`s2`aC~ z>WEQot=jJP*r#ps)~C(7&Zxew(9ZUT zw)Urb4C%n|&aU=Xe--!Pw{+dbT{x!e>DBk(Jv#jF7qV9`YWsSX-Mue+^%`C8^L~Bv z%U8W``t-zEi1w7H0^$(tV=VUr|NOsYme@Oom=eka(DoC|2O*ZuEQZz84}sxtim{k(K&;8b6N8RzQ?D45(EL9LsWF0ZkU`POpA$y* zJ`T=~w4nDQg?>uJK}TzQ9Y!(puyb~w>TYWEDPRFDZL%>vZf-h`8933#2x6ZQBuI`! zHJFBN$5*_5Jr6?GCjf-T`3kk#B#0cR(dq;w=#OtRw$xLaKdl^g%Bb_ z6pePWza^FNeIPVk+#kt<0LBaWr{z7b-dxY75stXFKbAQWA<=`ba7#LRN;w7`8t(id zF-H@54CQ#`mfWo@(7#P50H>iW0Gucz2-R=<^^NNaxjXQ8Z{NB=XcI6*FhXr1r1cYe z!4E!yDqi>Z>y04EgIV<+abjB#En<4To~1~Vp(slbqSprzp~+DLv*pAj5r&N8comz1 zqEb|9L&b3o5rd;b1pwsJjchm&x?>nd39v?K=F)HrD>bGa1$p<)OzBWLXJkG zrIM{FL}w_Lltzu31}y+Uh%z7($XBR^K30aGK_gqHLXEl)8|PGb3q>7Rwi5`#-ZXqn z6)JQ$Qw)A>sGdGS_WQq`|0alZV>SZciv1P~;Z3uN^)254iHeGrtWE zRD*0h5Ed2@9}yO|{TnOl_XZO|m|ZKQ-V?Y&lofsKSV&-?zrP=Y;pgY?9~csHEINsg lKKsxO0Ep$pi4_|Vjt^yYOjqVRL_DxH=swH6a~Ezp@h^rh1~dQw literal 0 HcmV?d00001 diff --git a/sources/gfx/images/Solus.png b/sources/gfx/images/Solus.png new file mode 100644 index 0000000000000000000000000000000000000000..93f4aaeb2821445e9cf8600ff30cfd858737d1e6 GIT binary patch literal 892 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 Iv~54*FKa{${{R30 literal 0 HcmV?d00001 diff --git a/sources/gfx/images/StartOS.png b/sources/gfx/images/StartOS.png new file mode 100644 index 0000000000000000000000000000000000000000..a133f42291c83fb6a7b3c6bd99f5a251a9f8ca58 GIT binary patch literal 1510 zcmVzsEhg z*FU_)Nww`ZzRg0q-cGmNJ-@xQ?sOvt`kz~*Pb#%R6kf4sC# z%D-H~=T^zOTEyc^&Ahd*u7tj?W5M;Uvb27|v0%p7Yr*eb$kSxS-h;ucX2j%F&bMgB z(rUx%q`9kT#pQ0q-dxVIh{LB`%+Qa)r(?<6Q_{3%$l+YizhuhXS<|7& z)_&Q)y2r;mOa@&cM{+)zHqP z-RQO2)xOu<*U`|O;oYU*-Nx44($vwQ{?Wp7KspR6S<<_y{ z;;rN8+}GBr=+eO9*RtdAyyD%@-qE$<_pRvJ-`d!{;`rFz;NjcawC3}(>EY1e=i=Pk zyyf)8=+MOF_2k~&&*bC3==R^?-qYmj%jwz0>gDF)-^A_i$L`$6?Dfv-_2K5}>g40k z?CHtw>dfxr#_;6j=j7e$>&x)$-s|kr?)mQM=jiI^(DC%w@ATd7^y=*C@ayU4@ayC8 z@$>EM?eFX1^7-!Z?e*{OiGEd_Verc`S1Dk z{Py+q`TXwt{Pp_%^8EMq`~LX-|NH&=|NZ;?|NH*`{1#x;tN;K20d!JMQvg8b*k%9# z0+&fdK~yNuV_*P+$ESAeMg{w?GC;ty9di~eSiWF63Rp1bFi7tC{{6e=PoFSh(xizK zdqJQb2zqDl-+c@ydEwTPiiqH_us|;t7c(2n}|4t{RCV}+U z{zHJT;gSw7{xCfLb14NZYk%k8zn?eHojrT*9Z+@~ufvPq4EMjBOaaR}zWw)WRiG!( zRqp5h{X4|#aPK3-)dySha#A3YUmKk)fG*bR{PpiBukrC)42Sp6E66Ke)RW}<0Vrwj zRNCUA)$;S-Q4!Ccb9^zUs|C{VK79_XqS${Ma>M$yC9O2qk)objx+xKTg8$Alw{;8 z>H^sbk&OTF?^~5b+rNLSL6S$Axqx;a-mwfM`FUE<^?%>9K$7cOV}JeI%q+fm2QX4L zfhC(<FKKmPQ7#{E5S`rfzlU80{ zo}HN)7YA~cj*hIfaQdzt3=Ffn>XOr9z#uXtB*4`YEURWz(+o_04-%|A{Cpt5+1bw8 z+Qh^}S6AQGsveYZZ(DJI0VgL1GN^~9`6X70GV(wm0|h{40w_rX00#h>m$v$w`Tzg` M07*qoM6N<$f`3+~{r~^~ literal 0 HcmV?d00001 diff --git a/sources/gfx/images/SteamOS.png b/sources/gfx/images/SteamOS.png new file mode 100644 index 0000000000000000000000000000000000000000..ed61bc38d84396f159cffcd079c148f9f6bdabac GIT binary patch literal 2225 zcmd_reNYo;9tZG6auE~4$k8eEV5qiocQZmezIATq4mmZvNkkG*B%!=0P+F;qAV@v+ zDi-jCE5jUxXo15D>IFeeLd2vAfgmpd6Cs51mKWZVU|t}sAtBk_+W_jdfA#-U*NG1(X4-O}mV9`a8pou?4xfmX zCdR+GaCqQE{6G$6^idQp# z=WBYtG(OIK`Jb;@vMi+fpOYQA2JzW>?m4L9I(zu6V=^0=IgQY-57re=+%0Wp6dB|N zpsZl!;Z1JurR9Ok^UCw^TprT)jd}QzslHsgln)!ff*DmUk`m4QCFDt&@!3t|tBZ~Y z^zIfq@26s@wX*9;#ni-gaH$X(F10k>*34XU{PZuQsTk?1(zMp7E!SaXg|WFo#<|CC zYv3<^i->-Z7|M~Rrbo!Pu&o@Lq1$I~fy!!&u?pco(8%j-mP$ljw|3ctz&cpS`H|bk?_kbyIdaoogu~-MV^1P=jvobFfuI#?KnB^MnE~4# zAo_=}f@PRyE)2JsIz&RG(IM*WHavDHIV(E0eW0_)@dzGj*Z1}aI{O4x79tVN_KLZK zy&ZbqidftWbD%MiRwaBjD>Uf@wxOOWkO$ehh+M23lu98XG&Iz!cs@TaSr{McpXpz= zbsb>N zIdvv2A%Q}n9701m^!n=CzBaocEj=j-H8HE^(DAo(tE04%g1o%+bkxMhua+V1-TO0= zb>l{1VP0N#c1HSo8RFi3pZp)We50bIu(0qSdFQe-GLn*Ff`f_CL}JKWa=WO!?1r-n zYVxv^-o@bY_}~8}n)u0UVkxy;F z+O&a2qmiA0$K$;~)AyoJBx+~)cwgQBXB-aeTI7m7c``Ls0{}LDk5np^$z)O|qx$)N z%y9Q7xJF*a;&O6wQfmRAi}U>XxHDsD*xLfUJ~=d!4BFBD)>dZ? zKs+*{7Gt(=3JUZOwfjP_Gj_Y#pjC_xtO7tHm#ftmcjRI>2Q7?*qI(4FtYbE76^i~f z0d&dbO5Kjn%r@JIztss)ff9pabRD4YM6On9qPA`i3ug9oVD|LE3 z2s&2Qh1Ck07trteCMZ$sbRcN8TA>wWWd#MGUjJr#b%3q}6(ERC+H4?b1ogI`19UBF z{VH)XG`}dYrU!LvWppO9>X-MwIX9|QI-}{$>8~4%9ch+jxncJ?b!2EXv1xzGmHz<` C_wYIZ literal 0 HcmV?d00001 diff --git a/sources/gfx/images/SunOS.png b/sources/gfx/images/SunOS.png new file mode 100644 index 0000000000000000000000000000000000000000..e7de00fb1053e642563ed57082f7f32d4ff7cf5f GIT binary patch literal 2754 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 NS7xU^x%}=2e*n(g#~lCw literal 0 HcmV?d00001 diff --git a/sources/gfx/images/Tails.png b/sources/gfx/images/Tails.png new file mode 100644 index 0000000000000000000000000000000000000000..4058145ef3f0283d83302af6d7da12e735f5f6ab GIT binary patch literal 2193 zcmd^;_fwNe7{^~nf4I}b@rRo^Cz)A1@AT&MJU#V554)6LK?D>5yCO<2p(wow2%&dS zKw2mQIf@b_KthvZKtK(lgd#0~2vQT++`frKgUsC@aL>%{v%BBVJkRq!yYB-{4K=y7 zgtZuk$*Gf+wUFP0k8f6^Svke88pBp&nx}MBj{Ih#xY!b=E}P)RCZaa{$ZuI+nTh;hP0Qg{-^B;1v_;`E0ukACl&2a?6X$gZ?CCn zb8^4U*?r_wf00is*=iiHJ9E%p^N_>Y!*{g~-_t(gsB_fm+%f0#$6a)lT`#D(>8d&D zsk-Z{c^Htq^iQ}NoOHW*%Kg%5kINdKSI&4{)x3Z0toL;-pBq}fH?iFF{=WleL za$7gR?7{v~Ax|l{en#H@CMZ1~DxLd?}Sj0J5#W`C) z^s~%NA`(CP#W16oM)!*qc#W~5(B_qHk+21uY z&^0y4EiKrc8sd>2>X{Mdl^K3NE667+!uv_2Pj-}VPN-i_n160Kg%%l@7ZsEr9b6C> zoEsBT_%MVP8~QXZtSCM#FCjcXF`^(j`dLa$QCcjW8dseDuq5LVBQw44T#=p1prusir<7(T1%7Q0Vh1u0l zb84RDz9^#A((~$y^Xs1%G%yO;rB55no;6hz)ideMmGlNyaZ6S4%j)Osat6Dmq>)+L z$SP~9D{HA@HrJQ8R+d{bNXwyv5}U(?o5%Y9kb&aUrhZ0Krk;JkXtYi4)9 zW^-E_d)_p*w>I^@ZR+5>>TGN7YH#iCc-_O{^mV@N<8j_~xAk+|`+K+p?HvQX?Sp+C zL!Dhi?>dLOc*Ff&d|o$yfH&IRGt%2T*4Ov`UH^Fhz=z?1k%7U9!J$e1(CEnU*eL(~ z*vRgokACik?MSQme{MhwDCEuL> z86bRGE&)&x?4cV<0TtM~9N7A12jhCNCz+PShfYbd743HKA;Lj33(kf}A`hP}0J<0ecmydxfak>kAk6A60f6=e0ElB5k{F1Zaia3y(YKe~21x1t;Nd#iW_=vKE^<{$s0f8usKxC1n0*avE z0+h|Lm>`N+5i3dp0v2in!MHQZrc7IHXIi!NzJw}_GyZ{|nRn0fedpYB?tSm2GhG}F z^%v;_fT6P!4MW{+wt z8qJ$O*LcBvlZ6WwnSQ=_$zsw{3o>~LdD+sHE69|UmavXJ-P+yC>MQ*Xp0LS#&1%Xl z8#dVau3Niu8r5(8dMjOf92{_Z*t$f>!Yrs(eP639F_-rRGmAW3b3+6cU<}vuw znL!Q?wgy;;vy=UtU11B{BAi|5E-qV5y!L$I5sG09h=65Y;bwj!9g()%ZWo9GhyjR& zrQ8@#kDag|Jl(y%*?$7>+7~UFh>7?j-L+> z$ul5D&oEKf+n)=m26K}1d^kMokT^*H4Cng$@dR8RhtCc0=Lgt?iFLl8%j0wT0^WB5 zPkta<5Wo)z6c}V0Z;nU~4E6~O3b5ao8XW2uEDSQqF%^b|2*WwsVpGE+d3z&x;gNeN zN6mI5WJE>E;w?pM@XXxQgYjERHXlrnNlz2=bMm*Af0L0FpOu-ykT~p=YzxjWVpYRQ@L?v6(D~rOLLJrl|9F^6?HVLb$j~%{Hd;I*lYFSZ2bGTG?qE1?zc0E#7S5kOU zda|Lu?tEdoBEIBu-Gxh%hD#+CS1%sxNNTz&sk+g4yeqS*xwiRwjkNWr;_k!E@(XfB zZGFd;@}Atbo9EB=9&7Dr{IRR~Y+q56Qr^{l`P}`I234uzPV2Sa*4xS}&3!i;A60br z$$NUQ$)8m9^d`os=4~IM6IN}gs~z2u zK`&MNW)@{r85qW7XoQK;5%h*c>72}}2D<|GphAr!&PP-L@%a3p+z z6M!8+vjvHwCcGs!pd!|MR)~3oF>a|jm+ z(FDK`sDK&Lw^*7M6&$=6xrAs4w22-hr~)xVKL;17VE}JjfGlG)g$y7X;p!eoywp1* zM5L~8e>oxm>?Lr9E0Kz(zzJQ9j)DzfhIUv8pt2+G3El57v=O(GsiJK+M9X`- bQwYJtFE%ccDqQ_$B@ero%NH literal 0 HcmV?d00001 diff --git a/sources/gfx/images/TinyCore.png b/sources/gfx/images/TinyCore.png new file mode 100644 index 0000000000000000000000000000000000000000..cf72da44b4429b7554e47040dc9158286effa3f9 GIT binary patch literal 3943 zcmeH}U2GIp6vzK}?wyaF>9Sil#igatKwH5mL`zJG8jzsUgw!uk6CdOO6MZs1$qOj@ zqKSq#jSqgr7@`pClL-$dBAS>GjG-8UP(xdxZ779ym)-feU!KLZ;jJM+YGQA8=FZHW zd;aJA&OLYb{ipk%%!jQZfPCM!tD6mdeDlNZVp3b|;ux3_tYWTn?-U&F(j7w#~5?KFZ ztKzS2#St+(nT1{NL9^%R{%$Z_hQ+7wuO1dDK36uXfEOifP*sX|`d1QB$AIa6?| zM}4<;iW$_UMhi5V&Co->u2rhI0^TwYRspV{4~71j2wbCRH^JB2++pYjSf;Q(-PYwdPK}6<0dUqU}KybDOIdah4?uYi(8@^TW6av;^v zxII7F$Oq*;&ux}5AD1*iV;PFZV7V7!n6At9m_WMi>%l9Rpv7s5xEV%I0i(z1ODSm$ z4U^p|aJLAfnuuT?j&JF@Lh0#3E>{xZjzE2SH~b|A+#I9wO`??WkA?QGl@SnDaYwj6RRFd$x%wxDAHIF1wll{5UW$d zt5-kFfZfQ5PcAyhqV5-9SP0wJ>xzrN%ghm8WU5)_F6EB2HbFD}S9qAv`H)jr5v(L~ z-d<>4AVRnwD%+_50N*#*f7;?L zGF|`k8|HVdqs9Ct;`n|bp@TF*6~*uy0@HfE)ShRIAI6G}@WdnJRSV@x(xizfwm;T# zBQH}KZuV*Mq_%Ju9HzLMmf9%~Lxux6gePM++X6xJVl})I=f68-E!6|iMRbNl`zAPU zF9{Z@moRby%1l6e$4JZ09rQj&XI~4@+0uiaaCQuZ_6=|dtrH!9Q+gMC)l2XmTsJqq zb0>crn+2$!eRgAyj*b9L5452CDA{hEvpeth+KAxB#t0e}GyQJ8H5SKBwc91!5WQ*f uoAPv?mlwt70d!}E7qQN2bPDNB8 zb~7$BHmT?0B>(^i3rR#lR9Hv7R(nvCRTMw$E-WCvP~^>iz{0Yy?6MCOR1kSYK4^w& ztf_2jvi`^(_OSPqHVrmekxixLE0TO=QNF@7Q-nxV)+jU!%OdTem9Pf1!k&Kj?w3s^ zBlHKqnKR$+{qA?px##gam;N_eIe?CFw)$^~(c~RNhkM_pR^M;x$`InC-wUXryB$t2 zxqFAsfe9s7XsG(jCuxVL7fvwMcQftx4xIzqmzt`m<~OFT9ZWkqnRdg8eceOj!0>xl zUP*8Kz_jrUQ_Zh`JMrPUp>ZI1{-!mwyq#&yPfQ!-_e%UPz{&Y^KYcljOd^ujTw z72o@vSby5@#OAaAa6qHcgal|bv0AOxqS0#eLo+9rhd;RfrjQ3-FGURns@nz!C^C*P z+L@kcVyc7_uYSu^^`mq`Q+=XoTzuju5pl}Nh*(1xgvZ7ta70`phZfD@fQmybBlqUd z98lHvjb_>YX{y?RBTyeaCpOv4qi=YQX~99JXOA$w{B<9#K2>2Yn{9Lz&EV|98SE^W z#*QhaoHeB(lX&+n{A+q)>>?VUc<&GRT;y{i7w2putMO^R(iJ4(tq=#Cmh z;=oCIrnOMK%bZxKSSJ;6R$d7^3QE~oIGs&pw=q3b?{{k4GtS|OFB;HLXI;h6|y*O zqQ&8hOU;-mK8;Q^DKSZD9BWMHc#~y?)b|%ww9lk3w*+wc||C!nbRj1(zSp$}jPykI%y?vpFFxlcN(;PmePs$3PSa zM;elkVr`hJQNo^II?_06?mdC?S1p4Bk?QhA(9j)%(0FJU@>44fGrfn3eH)%{IOCx; zKZa!H79=3w_aWT%G0ACt!YJeghz>Fvk|9*ZrkKOA=VnA|vu$!wk8|pD(UxC<8v>-Q zeo@=Gj<&(L$dw40pxm{nUQtBLPF$t#l897{;^enOE`$=lqaZt?lT2PE-Nq(IE?bc@ zQMiUQE9-*vMe5dzBjClo<#N!7f?0>E6~(jiB-2aBnHINJtJ^L>HF$y9@Y@9OA`NUX z+c?#c!)Q@iyrPDNjSSzQZoN1_lRC}vqerCS)u;SyC#bjLQ>MrEpQU^E=##9jMCAWI z7-@ttA7p{}7SC`k2i79UGH(k^-ptJ-t;!qfam~52XK^=>bWlN(D>4Os40*;0v<2m9-CS<1kn0boqWD&>(3+ zA))ie#u_>^#^gXX_g(6;sdJ@l-7~`*f z$GWF>Z&W`WICO#f_>p5HYm6Wv6xDU=vP7C|l41ryS#pssIgqA_srVe)xJgbxF$Y9f zt%YDD2fgz7QT5ZoBcO6mCEC;tZg6AJxG`?s0ds3w?MRIaQ&6;=XuT-Kco?I%L5^P` zVh{;#0kLVS+V-jH28r6vNwlToyd105Xw{|P_&eq9tvnt@D((TvnJykVHmY717&MNy zccg&MJ(AM5gITvhz_6ON$17BggFs!^XwdWtsYIMaFr>KUEIz`Td0QmW#GngsZ+HV` z^Y=w#_qiM8&3QK{UW{Qu^&fb0)VG5`L(fL3NX&B)Qju3dR^W@^TUYUz=y)HB_2NC= z&{GXzDf_y=#jv}?O!zkroxcs^(?7?>pb|q$6qlG0xNzu;=KKzxFIRW}7fs&b(9uQ* zG42m|E7jEj;s~2@S2#!e;lN&8qdvfx7Q;%+3*7SpE9%?zMw>(3-9J9_W#jVU#WPP` z86dvk`>Dm}#wpwgpBwiCw|3L1W~yqd)i17FIBM412zBSBag1HiH!v0)S`hsS&@QCn T{s|0c00000NkvXXu0mjfG-a_w literal 0 HcmV?d00001 diff --git a/sources/gfx/images/Trisquel.png b/sources/gfx/images/Trisquel.png new file mode 100644 index 0000000000000000000000000000000000000000..d63210898a18a59cc5825bb7ccd18fd12307be40 GIT binary patch literal 4217 zcmdUy>2F-+6~=#e_IqcsXR*g??BKN72r?3(rJ#^NC`1C{Z>>V)oLrXAWB=>KoD&qVJXc)81p;v*YJa zL+|cG2M;{@^!vtm?}eh~{BN7_Ups!v^^?T6y8jRkM~v=9XZ_~^e8-K_B^d}XCI|_` zz%?9l?HU)^P3c-7fsIgozA@L}AxwXO2ZI*d10jY5B5L?>-8M_@F#oKb=P0-zg5j>8 zaeWIMaRdAV|LWuzF4MHHUcA1^YX6vrv)|#~+zg9ayX>vM27t^s%W%lg-awk2!5||( zgQy-un>oHNwT{IpyN`DpTiny!Bq&~R1&Jn1b_9J`g=PNOLZ%jEE5bhYZoRy|gKlz6lB z0WZp@IXNa^Mu_=46kBCp=eI_Q@4G>#gHJc#)2VTxQRR%!WuFzLKM`f3(Z?AXpnL_u zVbbvgk0kp!pcmangHsKg`Bs}|z(+6|XD}XRn{L(XGnq)l=nIGFS@;IOphLGS>x83( zLNU^@n%X>_;Z~X5S1$8+1b!341tQZ6S5Xr~@w>vf7Un=sNUFUQ*#VwhB?yM}(HGf1WoM3O* zk6UXK98R#k$0RLFx)OwjT%&ET#DEzJF%q-rt2db~miUXmL8X6)J7Y1$fe*83vzX6w zaw*SWV-XGt@Q`lP-x=lZMu)j#g%9E--snp(In>LDCqb<))_jiR5kH|VgX~e9#B7_Q z*s!4Jsb2vQAYz3{nIS^u0+%Hk#ojD?O$An=z=FWFvq^Tyht~W8&nJ5sN_s8`Vh$>@ z+YSe2X8CpT174_RshJj|p6tnj@2pg~xN|G}hLY?y1B8n=DSyFY-n`ps5uiQnLeFhdFdPM^+o0(5y)v6pbpnWr_PkK9U0ahfFW86pHvI zHHnDHA+T498r*A1xZd$a926Y7hRXR(JWoL%~Dz%kqGs-q!=qJEM8pT zl}mCV(}tHRSKAtZ8tsP3vQV!KC)rsU;men1d4-Q8IHHq6CMi0ND|*^?i=3E05DpXa zEVfEb>8Ug`AqvOr4rBEePE}8-LAP3@x>94QtoSHYc%EljT0h+D*8of#PV-yt`Aa!Y z?3v(!TPAog6=ifT%_&)?nI2<&w2z(hdHJqIUUa%67A7t$_-sdq*f?dIj-GZ!y{PN9 zyEt0gs8pG)R(VS-IVRznlj%Q|6|c$#5~3+G+i&90?c?04h|P*BbR9Z1o5F=f-kX`{ z&yGQPe1ISJr@37>^_3emy~u6~m=4T4ZER_Rqo>_%ak=irOH0x_ZL9{})wlP4Uj@MX zcNIjkKgDQVk!~u=+qzw`!Qx_@bD~Z$66ZiF%eTWOgIeI!r2{L=ye2B1Q~sEjyE>AX zwQN_#=0&6F?YvoAbHOKX6$R527IBM|eclVF*7~gZ_8*Q~dc4GiyWK`vZ0+K29UGcvf z2&>re6R8w9)*0hf$L6KdGQSrSW~7q4Ot@L_HnB9GV&6dP&=l_-<$WXQX{DNKgpk0X zZ0CtfSJCb?>wIKO?P4ZzWzF66$z_|g8v|fdQjTBo4wME&+AaegEnP{ua>=9wc8tSr zR$h180_%b7iK(JOA-YMsF#w`nwL)HtnsJL%UoT&hxn~!P99L`%ZW&-oOxUj*rM@8p*mR~Ag@w%Hxq_-cHfSgFDpQL>sDV0=rKyJVf+ zwFV2-vP!RKB~P2Q8w3EQaaQaPSBuWbwh<0wl5A6LFeoWrcDmSRm`pH0TnQ+5ZkA*9 z1@v7g;G4AT`e&0h8dm8(r3g=P$BuFCO7*ZM5>%b1){+J&Cf+}PiN6(dyvy&5%I5og zCKp_9>IU!hJwTjHI>2beBIA7p)!Te1rp%X5tBkq&+hK#{-q7c?z%{#hA2TPF+LIFK gpLqq$|558ZnK=7g?ki7vkPqGW@WJ2Q^WC5P8@{_F+yDRo literal 0 HcmV?d00001 diff --git a/sources/gfx/images/Trustix.png b/sources/gfx/images/Trustix.png new file mode 100644 index 0000000000000000000000000000000000000000..6b2dd70be7005eecb37447557b793ee855001050 GIT binary patch literal 2155 zcmV-x2$c7UP)WdJcUFEThUFgWx_1!@2Q z2f#^0K~z}7wU-N2ljj-7Lm=D)suR!-sGDciiFjacg7YX+wUx>gMJS`%h@EV!R}k35 z8>c7~lpul>Fo=Kpsgm8z%Ac&opO@$6TLy>{V(Er}=Q|UOeI#$Rz&q==I zd*A=>dEV#$zF!ys7*mgKi=6C)qGQLtz`+B4NaJ##)72M|-z=s&*ObLOI+`|yh6en7 z;X)gjm>AJvWi=Z<-kXqk{>!G3r@gy_BNZE8j+EV@vyKkhmX%Eu($si&cuY> zAop3#2tZ>~h1Z7lD<_CkVQ9#Lg}E91*~Qrrb#=0Y83D-2KFeOZbP+AYGSD9fFf%j5 zoH?_>WHQN;un-e-ta(NNPDdVOdw6VwNGQVU)vIZ7Z*MPjbX*7bV#+vBP>_H7i~xj% z`Lm-U!x3@nG$PL=(P9FT9NV`0B0oPD>({NLzuUWa$CH7_eXFJ&;2h^LJ2E;Fi{4+1 zK0b9L%XaHYd_gmzCyJ-hVNsDLi3-Cr=>M{(97#M4xhvywX z$0O}KxLxxbEMD-k5kKGUOK!)CX$L5fsMwr9XMB5wfuTlo40kOd@gDA18sI?=18eN{ z$c!w~AIs6+E?YP40IE76JK*zAkaf}?9a#+A$kT@+ih-)LcF>4p;OOXt70%9Bv&IDh z0oz5>4iNp-q1dfnTT!i0BPYrOg(nt4kmLtdtqOO$2T&#`$At?Qz~!bQB;*TZXP@<$ zHh_Eg)Gn^BPD5FlnRq%f0h4RIF8v3HSe*!1yQ)TzbCrwq{F|0v}2=|8>N-Tp|6E0s!=m6aepJ)LCfH{npy z)6;{Ciwjaxli}v(O2p42H#eW06BdYw2);R0fLS_SOONN44`69&g}%OC(p1fejXjI2 zCB@+L`S|R!ov^jFedBbbV(r?s#0kL&3_L_%Z`=AIdV4!vrvhM^pU-_Zcdj`O9}dFs z@G$A}IPmlHASLCmZ)iYyc^T=0c-Yz5y#b)FuMb;0Tl$2gt`{%<3Cc<{Zms^Wx$nWMo`|NF+p!vW6^04I~l~aluu@#c^P5Z8d2nUWc(Ui|i4R z)G`>p6+owJ|A@mm*<)yEK(ezXYhFrh^);QbLLrBkKvYUA$qC3Kot}k?igILK$s$?4 z|Gf}#aS>D-IlL91t4rs(fBzroLCc(+iIpy*h}cU?M5)XvkW8{6@%edV(EtTC}yb;rjIs0#Soi&P(0^c=yLP#FokO@9lw(8`_Q9`drW2(vz`|6plc% zA$m%gSo=#$B&B5G+BGfdfeNx5$)o}qC@9Fs)vHAWBpHp34Fp1iuA4Ve!~Fp7T1*7^ z(1nGe+y2x8tHGoI>c*xWJuQ339!i(tq3}HnNenS8H3igWXuWIzQzL!&`t78%&&%V{ z5L_-7CB%|c)*4MK`EQ_uxKe>YzeNb%%z&#s3)bdLxGvF0a}ooix()bi_npamK%poN z=$5X+h=hR==}U1sDhY(v4ABRS=}a6PmeOlaHC|p`E&(b-S62tLS}ht#6+(`L!^_PY zZOQuRUqL^TU8qOl6@NuK<$n$tK4vkZG>ksQw+&wVL(LQrL*vqTn|eOFr-?D!Oq{8 z^!GJ5ooRfQKyLtM|B2VQnI#1biK#wt`*$bk#-fqc$3 zDC^syYrjs5Yqi&iL+aq}?oNvvF!fM$+!&*Bv+=P{Wn?}n6T^zR=&kj@HDzQ|VTtO~ z2>|WN*cZ118(;jbcmcZkrsyj+z>^9+jL3{IsxZa#8dD5bm>|lRfnTp&Nj9D<#CGlI z>}aI!ayl`TBgeWuNtZfMtD@Nk9(D?(V_mTRaLLqHfaxZ^}Lv0Tc_St zQyv>rTNtdVPWS9la@U}Ry8t&c%oW1QI2@buh- zBY!@4KRP(G2+|Lr@VG51Bj-VO hnGK0t?*HF({teF$j4h*uG=l&D002ovPDHLkV1mqV`fvaM literal 0 HcmV?d00001 diff --git a/sources/gfx/images/Turbo.png b/sources/gfx/images/Turbo.png new file mode 100644 index 0000000000000000000000000000000000000000..4d040d9ec59f24915686de517d11a8dd4d950014 GIT binary patch literal 4217 zcmb_eU1%It6#mZ4W;fZoNopXCg_dA!i?u%aR7JEJYXh=Pf~nXCX&y`rLQ(P}trAjE z@IeI;B~^onpmZTg>rd^2m{!o*Hu@s|1ZrtwsI|69HAz=z<{r(9*+GmGEKLfgh8*f@U+4o*xm52%$r%X?E4fDTK&BfUVR2@VhQ@XqP- zQsw{3%5ToKdPhOnf-37Z>KWTZy&r4duZx&5AS9r7>`9Q_0cJf7Q&9iBi>v$*wOu{i#_)jQx1nGE+ z-`lhXF&iuGG96CXU)z+yHY=6b@UX-x zG!(n2aVP)#F8`=t4dnkMW2L^)El~CgvOaGJ{a791p`AnF*gz?56=Vl&TK$v!?U`(o z=$mLz$S*;RovAz3M30R&(%_)~4G-Mw$`l-yT+5peQ6r{P^(Ev-(HaPY)xmJ{asTL}#m+h7CyCRA?fa=9FScp9$1m7tMrST$Gc{5T2 zO7_S=;)v3E8T=3!iuJ}*z^`;&1F2DeL(W8v!?HGjX;YX)Z_Ugb!?A&448V`&Sf>DW zu5etdC8(3aewnu=0pNF%f5DRj3G(!XrT3;pO=rgXDTR1`v)lpAq$B`-$OL~WM4$I{ zO}XuU0Lyt^YGOic0z@TX$8Iu9FV$q~82It4?fO!ZVS(jx;>FhS8=WV?zwHOB15yLu z3oB~^|6+Z~05SpTc*uejot|@j>d7wn4d~)?U{|wYB;{|#PmFfTUeE_c7vQA(dARG6 zQN|pnG8vF45geE2lq|~zM6AY~xW>b>0r2Y`m*KKp*EtFmx!E{lj$_#X{5Y09E(Q6k zFt9l%uJN!U06g^2AF}K|leV7r9*r4i&2p>=fFFm{7gC507O&|;sAQ=a0KeJsyR7}M zK~=_^Pd3Vm0c3*FxE$4W*?~><>jHq^N?wGUo-$3E?f3YLTkk%m#{5f6+XKngk^A-> F_!lX9O;Z2> literal 0 HcmV?d00001 diff --git a/sources/gfx/images/Ubuntu.png b/sources/gfx/images/Ubuntu.png new file mode 100644 index 0000000000000000000000000000000000000000..a0ea4a4e868e7959179e3995ef9c8d8af9995342 GIT binary patch literal 1164 zcmZ{ido+}J7{_1PBYV*=f9Lr!SV&G zjrh-`2?wMx2W1K7avlYWHHV_jWLz^jhXzKQf;>|wngVf6WjuFXDFKm<+wt*Zcv^FblnpwI0Y53p&MS%O&|CcVZLyoA6)1U7oCQS ze}HcX!KG*6yJ1Lq1X6w;xfh94Mj_Q)q=tvo#v^r!XmdK+d<|{MKwAW8YbN?28*R@; z+w;(le6-`b;?WJoliP}(5=C#RqPI-ZCsaHuSM*mX21LriO6A~h%AqRdaE)@LR{6Y6 zIohb4c%Tw@s{ZI!{rN;S-J^QduYNPCemka~A6H8z)e^CKVM@I?tzLSiUVV$L&10KO zm~;h`uVLUi25n%l6hq_~0^%r$D_~rS;3@^KR^b>%EKA=koW+w zG@D1}cV4`(X$fB#-CxWp+!O6;ZT&p6VyJx8KHB~6+|@GW72*4as>%GW5ZYho9S4HO zI!i4A?!BwD>ML4LJGWArs%J$%aA~#*zUAqCj55%iGH-2ZVDgw(PT{xh)SJ3$MuXN| zsKY)$bJEFY%xU+P69FpD;^(+A^R$2=c*?l^j%C{yB5bhJYO86SE@Gl{HXEyvk!o8k zaS}M!Z0MH2ZXBYBGor$_i;d{N|C)DGnEX}V(H0BSLjmH8)dnKdyxOqiVneSS{_;Aw zpvu-3_7Af4UFrow$;@jfR$;J?t$2^Pr>(Z;#oz^%53+Hk*M%MU?5zYZg6&X-lacMaGxgpbZ_X`#QU&7x;V6HG>zlH zMRwf@oSC~^uRCDbWD%L_#VuQ2T+5G(GrL&G3VXU}pHSPh>9lh=6tLCu5ZkpIw;~UL zp7_7V2Q`ahPJOZMmxGtOn#X5e9?hc1+6UP=OB^`*{*vCIG6!a75yLupM8xS!@_4A& Y!O)ePMK}eEhz$YUTs&C~%rj~K0<776CjbBd literal 0 HcmV?d00001 diff --git a/sources/gfx/images/UltimateEdition.png b/sources/gfx/images/UltimateEdition.png new file mode 100644 index 0000000000000000000000000000000000000000..9eb8f0bbbe5e8d16476567b70d36d0173b0dc9aa GIT binary patch literal 2193 zcmd^8X;4#F6uwrcQ=QSy^jG&fj?;mPw7{ezGfWJa5P~%DFiDL@jD`m>c|afuAqfEj z4_Q z)WjqjospQtpfi$_lJ_!Fn0uLNKczy0jjFgrU9KtCloqSYDoV;UXlY5Y7A@75RF;*Nm6uj& z%StM$v=wDoxwaI=%291aWjR_^fmQ0uF+(MW8mlTRbjB)Or5-byuqsq2>3^Zl}YGyS*+?joat-)Zm`_8ZTbwt@Yt`^|b+C z1MY9|`Rf|$8*2lN^#Na9LzBOuz9rxfH2NEw0*%cLO)ZVhtxYW_np@jiPPDgnv~{(0 zoM`WC>*#9l?C$6~+1Y)n>(rU<(>*88^q%hNJJWl%r|(?v+5WzB=g;;JoI8J^f8gTz z3xfj}FI^bCeDTuN!7JA;T^+i7ZTRZY$hG0op^>rS(eaV7>!ag0#;)HSzj5pO&50Yg z@7$c2yme=4V)E{t`%{xs_a^U7Pu-ijJ3V`E=Kl2TgP8|&vkxELpPPU9=<(eAlShvi z=AS%$yzuPF(_a>zy?FZk<+B%y&tJZJvH1Gst2c|U-@bbD>+83_y&)#^zn6C#<7EJ> z1G04HKJe%NTQ<4h#StCYC`sZ<0oXDeTWr*jOmMYSR-TeuMzwahPnmw6t>-Ue%hN;SeK%B;v6l4h7M|V$Et~S%-fY!HA9d zk;Y^vuy|P<9vf9ydO|2<(huR05JXAfWuP(+pTUDUMi*Yc#)yui#YWO8WR6gxgg+Tv z!Ee=1uUPEuQDiuh%i?|;HnNr!YQWTNGLs)2$z21zsM+Q6w@t196I><-5`MGl2GJ26 z>au9;X!kOO!HeD%JGDYzR<{dLom{Mi2@f3yT8U7C{4EXu9zZ?rT-yTx4#faK)_(O~ z8~_2X&?_}WUM3#^NJt}c_yeHJ>jIu=pN}{%u9Sg}m&;(bZi4)Xa+PY5Q&KL zH2@KqFxTo2Ch=Pb*&;CG5!K=~6QD$?1HL&>Y2PFi2a1sMD!-;uatA0-=I3$gvEzWeM_IT75bX z7r(MbAUZ%}(W9Ubmy!Ni@uSr?%FLh?Q!VmY;$m z#P4F0NR%+*l~yDmS7NADDuNIV#1#;U?UB^j=+F_cq82fxi&2TW2!s$PAd%v>$F8O? z=_ad2j3{VvDSXza#4E;;KMVagOB5?llnW=Y(>4+}*tv}ufq#lS3?Zj}008zeF*g5N W=KB|u|H$i03nnmVOlo%mzx*%s`*kG% literal 0 HcmV?d00001 diff --git a/sources/gfx/images/Vector.png b/sources/gfx/images/Vector.png new file mode 100644 index 0000000000000000000000000000000000000000..b4695049b2ccc8767eed4832bc3d5de8fca5dd7f GIT binary patch literal 3599 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 XyKU^&-KVtLckKGL!-L1yjJ)zc=CagX literal 0 HcmV?d00001 diff --git a/sources/gfx/images/Win2000.png b/sources/gfx/images/Win2000.png new file mode 100644 index 0000000000000000000000000000000000000000..3147daa15d1640ad4e8abd2f4407263ff9c0b616 GIT binary patch literal 4196 zcmeHJO=w(I6h2Q&Nvf$YRm!Mc^r;j}4Rizz85gCG6q78f*1B-wLYXXt5WAQZO4G%& z&PGfimWm6L>cY@fYBwF-%z!Rt{LK`p8K{`SRYO5$w3X>5JiqV0dtYAW53vc|c;U>s z_q==W`OZ1ty?5S!`RI#1J09C1B0a-HgU6uvQo6R|H+}l_Z4vvx@ZjO&r>HJH-_)VXc;v6`eNAwkRIVLYI zVeCS)5lBq+)_+#ftzaG3v~QTunggET40|@eqdC4SIe$`E5@(Od2=p9;ADNA1-Cxq0 zb|d^o!0}eTS~?Gi=hoM3o@d{hh^o@0Xa_)qq`)HjY&{~P(b!Op<@Fe zs>!7dK$-w()&p@EeSGCLnevB(e25W*0y2Q52c!U7W?#3gKo@@Qmm5Cp^>`o=Fa&3S zupgeNCIC9+tS8fq2tAt-(zOj>eqrV!u`890N~~0Pwbje6E39ZbtV!R6FCV)HXn=qCV9&By6~u#kMzhY zol@Aca8X9wkG~`}?Nr%Uz7XE36gC9sRX1=z&i$ck9`FEH@Q1aGv0(u-!_=EPnj=R7 znq%m@UE&+^A?3@gzY)w+e9`mOY1jZD>R9y&=&A7m`OGiKg`=D^=w>4PR%i$_kEC5`r_Zq(mzT7%)pYo z{z*>eu*qB<0^L8RqBL2cQgFpVGhkA-xc(WvEF=X0+_Kt@L8)>>IE&Mv|^L6s!oA=-%ZBD}$Qihsn=Tu0;z3TDQE zRgq8A6&90^59dyDt%*!P1Uj*q@L;55>Kfb=jO0&Ze0Mt)L!iw z^|cL~wQ6Tz?1k{?QD@}iHx}i)1=g3Rp)9+fN2>4W=UQi>G+#sQZAKn#1(REqeh-C- zv?!X!KBn>YBjFUWph-NYpTc(_=reMj1Y~A9y&gHUu#gF(=UlhRN28%}tWH626Y}_( z^b?Q)WzwrO*&hYr;(Z`62+JC4+P~4zX^ah+T$X^`;A6!M0oVfs#t4lwbs0sXryZFL z&VJNKOAUvwV(;XQywo7S)~A2job zao)O*leLlzx N4Ieo=c*%Y9>_0?K6D$A# literal 0 HcmV?d00001 diff --git a/sources/gfx/images/Win8.png b/sources/gfx/images/Win8.png new file mode 100644 index 0000000000000000000000000000000000000000..c7afe5407ea8e3aa4f6c982d7f6f7f22b974c0ac GIT binary patch literal 810 zcmV+_1J(SAP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BKeVQFr3E>1;MAa*k@Gd8K`;w1n80-H%hK~zXf?U&0-RZ$eiS4k9Q51K^ufF44F znnYPqVsEHOrLL7^MNNWe6g{v>M9`pVK~y#fdVo_0Gh)y$Y;Do2*l-*wGSe z)?FOdG5#L?EeP_=2g!s6J@!!|lGH5wsRaaBL4aaw*GYDA1Ge`G&;2^{WcY%iqt(BFl_9gHofJqM>nV2i!dKKi8;qY~@UZr1O#H`;D* zwH00Dv61mYidG>$R{E$BY1O^ph|LxkzMkt^u&R}k8bKI-)P;eJ>RU9lSE z4LtNwBQlXk=&mYFAa4F&sE;ehxz8|1AV;7@H<@(5`NE%L&M>V)@ZbBVrXbN~PV literal 0 HcmV?d00001 diff --git a/sources/gfx/images/WinVista.png b/sources/gfx/images/WinVista.png new file mode 100644 index 0000000000000000000000000000000000000000..6cbed9e60d3ed08fc7179aed85b669469364a238 GIT binary patch literal 2691 zcmV-}3Vij6P)WdJcUFEThUFgWx_1!@2Q z3D`+QK~z}7t(R+zoyB>_e{*@~ec$t*b9UEziFbY5wT%fE=R%3-1tOI+7eoj#a@{r* z8X!u8TD2dLDojvCZ*fE~YWk%}Nr@Gbv}zrkh!6->RS`o}1qcD`V&k>FzN~F_ea`OL zb9t{b(+>+Y6+v;;&Zm*)_M2y(nfd>P_nwO_LI_FY@|&n7JBVx7f|y=yV2;7y8M48C zItL%~-n)yQ^I`zR<_~TIdF#lUu^Xl)CN3FUv!>as*JWr70C`cc((Abk?e@yK#f78o zR_h6*`-Y!=`nCTPz~r^NCeJUl|9oQ2*rzYwvQ=*0xRGYPjt~Op9B+;lLLjBYd(TR* z$MI9Ac=gzLcNTf|(7UHMk6yNQD}mM&MS*ia9bNIZ zaZ(D5F_dM+tH)+Ja`Jd94E5(aFMMa;MFTW{;gh?o(tY8*mt4x&@CaF+zp-17_Z|Uw z1VX$4v08Zx#{*IbLSwkFw8TrZM=*iBZ~299@AjN9-W?8 zOKc34tq|UkS&Mg$^^s@Fcn$oL^&JEYTZ`=OA|BD3x{bq+}ethUbZ{1KB3Hs>(yu&-o za$a!TM8efcKwk&wFhH9Cr4^wN+&->2)LEouYV^-7Q38p5VM8_%Pn?vT$ z#I#ytbkc-QAqZCleuqr3A6E20AlzTPeaAEZ~Kt z+fQ!<{!|@o$r}$JKl2$YR4AoFC<9XCg}{2aGdat)(VTcDpt(^HPYKkRKs5y_2>8oy z4e{aMm|=3fiL(mt70#Cwl_kv!3NDbHDOs9tprQyT6dv%dN`Ca?mtN6xXU^}etgEXa z#H#?W0+f(gXW3{nu1i)R^qgF@EVn$(Vb2xs6Ri8iikDxGS<*vXb;Vk$DkCukh0PgM zJ?iliaVSWtgwEm+%0!^eYC=kl&3pB^vx__RAj_|FNEzr5sWe&zym_0~kn_#%Fi*E9 zSqj&p;|4D6WA@K-*EJ`pl9)?Bu#WZPW6UqKh;&A%V;&57d&dG^V9cD(o$yFR&&nN5b& zdRiUNk>fRvygJI@#1uh2K^cP=65%YR5R}Rwq(;Y4d|K=NjFtgLYLoz5<(S$KB8ahR zpDe1ARhF!@^zw?VbUbt5WiA~*%ig^^`KyOsVc(Yz)2k|U009A;k`aD=tYV*7LlGqi ztq~rytpGu#143g?>yc*jK&V$X1yW0;G~n>w5;xz4bpooAep%7WD>{Rcb~k4%b3FUQ zAMw%4YedZO4N{?$B1%T7vJ8rnG%Hygl(c#|uXi$DJGI2=<1cdk)nmB!83wIW zSi8j3WXAN&3XOUf+qXP*Y?_{{VZsPyB4l6?Isl=Ff}po$a(JKo(*2)#vRR8~ofoSB zLK4*)2oXV=BJvWS7qkWiXL|+byCu&bnqxG4oy(>zMgJ(GJcTdkDYG-=-35wvMz5oJ zeqlW(43Q>A=m@DpqzZ6eP>aIZul?6Qb0(L<*>&RZ&_X_cC5wT+gCg!*EhVDuc5Y@4=M?aTvJmGtIBQ^%?EC=QmG0d+=`_ zIre)0cXZsKn^^)W2;(MJD}10p3al>~wC5Ra6l@LV;oJp$QKKxtw8S)T81 z#l=lz7@|Y~qQrZLv!3zc_>r$Xc+Uv{^}quU0MJjSx;3X>)(Y9MNLM6HQP zh9GI;>O-h{LKY13?Gq_;@#kzNuwP?g7~1)|qwLz3?P*T1{- zi$7PE-~9RgyN@opFBDOXuE$h?K}QB1g{zV*&?r_v74Iz0IV$fdt)nU}wy^lJLX{Rb zC{TkQo5J+Ir~dj=doJ3T?Ar6h&cki{(29yiRT5LHMd-+&qL9F7v{==1-g~TflnzSg zsPc+3FUZq^YLL<_`mJfx|J>t$w(Dma6ZuY->7RGsu&8 z1Yy_=w30>$JWx1K;heKYxk8a1tyhC5-Wx1`x%j7K&f90lgRk))^ xaBYd0_8tP2`~1EP)WdJcUFEThUFgWx_1!@2Q z2_;EHK~z}7#g~1I9o2bHN~nQCN~$Oo zY1%(Zno4PvDk4c05Ng$=F(GL|Z6Rt!keXDuHl>y+2?iUCMPy85usPU*o);J( zD?E*f$@4QGhQIUdU7NnM?TbtPuj;=zc6S;rw3Bc7W=)&sC8}Bjof0C2$a8|pktWBP z66*rS2{IE<>Efeu-2Kl_-h11j| zAaw=e6ez*=z~lsL$V3KQO03lju*Na#qbP90-&Vb3mW(4afEEEokEZ|i&fA9Uj zKiWP$ePbY?(m-4V9hZbCqmUC6@hBm#V@iWHU|JA5!-pUJ^RNG89zguW=2dwAUJ+Lb zaRMp^W5E^(Tj0z&`MsbpAgJwo{x_ap+^Nr|X$52)5E@i0iQ|YQPN?V#galUvoPlgw z;+l(h^HKbKfP-7F7G)ucE1+Wtfsl6ywg6+!B_9|Y$WhevdD~uiZu_Nqw+NN0Kxu)B z1xiDtnOkc?CsJB(mPcDxV2tHRgh^wY2Nn8DBxX*F9byodX2QVqH^snfVU^%zU>v^8drNA(e8P& zv01Fwg%m4LQld(m*s_hu3pzb0%XmWEyQY~x^bZ@O2vi*AfD?$cKxu`J1ww)CdAxya zR*>XNkN@R2J~cBBVEUPFt?tc6%ex`j%hb_FvwHKDiyWhi*8puWeGHzo%dQip`jVWU zSP>`7U*2Q>eOag3PLs+xxnodDpdyKi<`f77ybU-P$Yx?_4{U!+@t+4+(%pIZ)sZ`{ zd2;agn(Eg+cFEF3)j!_Zrf;SJri7V{XY`%<_wWB!<$Lz>i|?xpT($qZyY~HV-Z2a> z1sQ`p=lz`jb9R)z#F-LjCA~)E8>ecIF9`5QiM=ED(Vr}J{(Y+usrIDGB6S&Pb)cBa ze&_6i-M{^mp8U64ZhHBvpRT{rY#iPB6(IvEne$)9ptPLxKNg5cV2cuKp~y;XV{rC* z_sF4nz2K!+ifF81zvisHx}xQ9MT?p*gK{2WOCh`o!WAy9|Hd^{9k>~{CRFI?sS$gu!huQI{nEda77PCvgd)E`I@_7n8`GUAi zt7xRZs;DG_NX?a+wctEh6EK;_S&KDJw6bv0Ow0GL?SK8g^OkS?^3#*e;j_J;++23r z8w=S>J5K4mE`6sf^45vIQKl|Bw6V72*t*}k?9sPX-OpZ*jLG!^DJqGingpbT!h&^R zEg0i4g~j9!O2?9w7jAp)$Jwo;qo=OPI;VHtapC#*e_-`(|9X7tiog45tFiL<(R#X~ z5)X_Nr%qpWrCZI72R9tq_so~K?rWd?;wHAt0|Q5NJzFx6f1(j%KcKQRyBhp)wJtdo^m3TX^V zfw2OA&H`gSHg{O#DRPGtOLpXqhu)L5+A>W7aa58-5G4sZ?nB3YL|OupfIw=PYH6CS z<+~P~h?-q>gHTY7ne$(WbN&mg2U}QN;jy`gGO(z2!4og->fCCJf=UXp7Q|X0BY{$q zD2kB6gUAtO00oovN~jlWo?Z~3SA-3z79=`QsR|I_0mIKKz+;Ug?>VBVEWY_5N5;?C zTZ4c^OA;xFBq*tfR79jS1P9�xV3l2RrxdzJKpLfWO~jE-#5L85~md4@k5s>1K{1 z^O)R`8&8p!*vwL74usx&-MSl9yIouqMW9t6*5R#_N0CBFIfoxCLPDzzXJ-dq47+jj zn&19I>TVJIP-u0S%nG_^{CJ*=Jd#M1slLn3?vnrxu#NB4(Rwi}Bgr9ohO%qwW4PJvF^&>#5U2 zHCul8w=b-U{{9uQkFQF!`0S#A=>024hIbr0Tzu6S!(g8zIR`Lz`g8INPbhOj03iaC ztwDPF`sWt}NNjIYapFkhdwW0nbLFw-t@{Zu0lad<9VfRB{bucx_uTjW=E1Gqk0&CK zMiLzbloUuMkWwP0f>01jgA@uxNqsgs-W>Rg*A@i$r*DrOf{|Z1#Q)&&Ri}V&{Pg5w z=~%XMYhOj&9!Cup#gOO-9V?Pp5hnsvjuaN(gI8a#aJn({Uk`i*zpw@GF8s5P{IENv zNA6UE7e6*p9{5bf&umbl9M)ctJIGpwdb?zNW^m@{#NgrMv&(j@T(#-3cYQbfMX?UJ z?SYRZqVMV}hvOG+8c1uOu|8T+Z#VWH9WS4IeRl0rBkbA#AE&OhlUx7B|H=V=RU!F* aj{gA`C&7nb_5FLFdtpVBs+{hOaV(;0W!wb5lv3VQG?bLZT%-~GOG&Ye5E zttG`p7V{P}LdfE<+m6CLRk@5bjAGJUH{A5+juw|9S^4B1vo=D+RA(=*M<}*mxu~0& zu~vj)G99-3vJ0Q6)R-?UCCf74{+%i5{Zm^P&}{F2&?3*M>utv!%}k>Kv@57B<5V1B15*SwM@T_*148a*!aB zvfdx?5J4o0+(C=Cwy}CS>C(sw0t5FSz7VzsLBI-*L?pLF@f;VF(Fr0e@>m&#M1H~9 zUb~c0<*Nmrbw2uF+$J*EAjv*iVW&7AMpoc;0`Vh><&;u5o>NL9gy#5UnQd#UQSpYS zzX?F@Z_svzVdzBz5VS~=2q=LJ(0N3G4FtC$qycq^f{;nGO|2_yL>^N(P~px1KggJL zvc-sXI>t<4*`UW5Lwu9KW(c!s+{_lqZ$dOrQ@oCTFIyHqe+*~6)QMEk*3#{XPZ2O3 z%NPL>tOFcLF_OlPmQ*W0Ld(rJJ@cfy_wE=~ks_BjoK^uM0%vZ#j-w>#zL|zxv7Rw- zv}}+lV_?pa!lc^^R4Y}}=baC(k8sO1LIUpLp@x^!n8s!X1zQ0!Y1~))uGECRdsJM} zrf_tso{a62#?uow>@Trdv$Fsh+Ji~gHy%t7ct1&+pFBXu*zyK@X3Z@QOaKCHa~&Brrb1 z%0697S^DZwA5A)`G}I@?qUL1=qNPhUu2*yX-gf5fycEsS1+lNFEqy{NJ@ zv}YT$b1r7*Ao$zzx6JKw9jdvdVv9VcYe;!DOCl$EHRv^9)&(@1w%#Jm7UiSi-sXkl P^9s;WSZsS-aI*Oqlj-bA literal 0 HcmV?d00001 diff --git a/sources/gfx/images/Zorin.png b/sources/gfx/images/Zorin.png new file mode 100644 index 0000000000000000000000000000000000000000..215ea8af00685fbd17f5bacc35cd4267210dff87 GIT binary patch literal 4217 zcmc&$T}V_>5dMz;Nt*phX4Do0kzs`q^dcD>x?yWYB~cGX^j0D$R2H#R7J^U+J*fnd zPy|^fN)LiX^pN->{b3IY6@?TM; zJ zrB2dP2kl2rc>x*mI-q({4y~_4siJtkChG^Z8{H=MpeZH?)J#xq`;*Vm zDAhH1Z50xG3$k&PforLWfD7gv>IIotiDd^=4+@cn=Y*ci;6w`$TpzW9Tk$|1qQ#m6 znb-g?+S$Tn$OXbF)l2y$$39LH6|I;jdXZ)HQpMDjZuvt6K`;s zIh&{sOh7Q(gX_k}NcCYA>mH$#eBR=TfP1Mu?AR#+zl;vxC6>->td{wjxmH4z7{%X@ zENPA2hW8Q^;(!mWHo<-L8{p~Q$g^E*3Vs*W1b;-oYs6SBKotL7qA-u8xA;voN(ayayQE#h`=K@E`+tn7uly zx1%qRIAS1q*RkO(Y;P48LS2pUig@VdOVo%ZR6su#;U}IDem?E~{Q{nHcAo6LVan`2 ztmIalqyJ8-kSn}+KAMQeHx^sQt$QJ>!2RL{H z-}z3}onL?J`D3m6t~!9$iQ`AU&2leoPaN{^%inqR&n#*`J^sC)0ex?H6E8pBHv$a( z;lzIUzX%w&+ zKuyl#>@3_I~I2YRZYNB_T!1q8<>3=beh5BfUycnuq*}euZBiK-eP@(6O zfj*PCGoMuR-ZpSU!=|9Bfn(xOJdL?SDe{_8whQ=ZJ6U3>oU>uFTdE$f@?q69Cqg6Z zHOR}0?!9-a`ETjJ;bl`${<{#PwH8{(SCq?PM9P4z!niLMZdjpY6v0J-Me5=f^xU#L zclvI?HeKRH@uDK2V=E|fh%g~U-)}WmBm)@L15)y!EA3NVvJ%&;+HxAmxc-l_C^s9V_C5g0=$iwvA1CyPFq$z{4P zLO9&WvtSSizE5Bt)CGe3SLK+}b=8Xy{X?8(jDl#PB`t7wv=WoJ{d>?P4?A0tO?3h} zbrG&Nh}!Ub2wFLG{TZc_0@-vo$K(MCy#tV2In`cb7-kvxX{&gaB{k(C2dA0y?60VQ zios*%7=rY53Olutbz0c$vaKlF%J06N-@Rn0cnPXLl;`>gOlKeRrR|iftB?cl8qqog zbms-qGYat+nAMZS(WZG&e0A`6!oqLE1IZ!Sv z+yZlSJ16E^pRRL#Rgu2()Lu^G z-S{x$MKGoj_qYEFyAmN^ei}+TWcjGh7cZbQ@kJyTkY3=wShD2kO` z3vk8bdK%YLhhn>PV3iOm8`bpf-hY z>ka5=nN*~d6*bt@am@t+VmS07bpJUtw_irsH-~uJ9NW5Jw8%3CL45N1}O+sePIG%FrthXg8e{cz5;6p%gHd%mn*Btl7;vA36)X!)d)L14^i zVG1JlW9=})U=F%APXy!+Wue>S0xqWNZ~`wC7=TUY8BWRy9^<4dqy#}(#rxM=j1s3Z zZ?pYtw1x-OM|+y~0*$-Q-k>Mg=ChNWVKVs`z+Z}l>~fYCD=EV@%9T?R{46)I1yLhq zb`@w(?SV*|Oa|U~ytgg2xZ4lYeT|%ZiaEfUzERHEz?71H8JAcu@bK`43)W=pH@B zjEk7v&+^^DijUwJbwM6Pt&SD$b8Mc63O+?R1k+x4j*jdQ5Jgkx6x+98k|BgK)x{kp zAZ|9;mZbVu^y&~#flJouUVxDMOFrNl9+2nBtF*7sm`kg1y3UfW#w=fdD_!Hq)`O4? zPZ-VdDo$R}Q}M_p&OqT$2M{-=5%w=}=Lxbdbz+$Mg66-_A;})G?Zr}y;4xg$uUJaW1D2QDUw_1Hi_Ow zN(s_bb*YF?hpKkc$61d)ch}ym z<>7hsGNv=h?T-lN;`-yW(E}rK5Cnn)Z(1o(YdtmjSkQRDhepL3@>JJdy0Ye>bwKO$ zvaj&vwLHYHnUHKB&zf)5(3SG3AZSX7gxse*#qv{;bN|vhTB6=t1Uv>Et(l^o#T2q#twQ N=<`SZc=(4e{THBBVe9|^ literal 0 HcmV?d00001 diff --git a/sources/gfx/images/elementaryOS.png b/sources/gfx/images/elementaryOS.png new file mode 100644 index 0000000000000000000000000000000000000000..263d4de4a4c427914a88d9bfff56ece26ddab399 GIT binary patch literal 987 zcmV<110?*3P)=retv!l2?<6!O zUpzcKPft%478W%%H5C;VNl8g)XlPqoTP7wZZ*OlnI5;vgG6n_)2L}gZV`CW^8B0q` zM@L6pU0qUAQVR~1YHDg$R#uppm}X{X1qB6o zcz8fSKsh-%N=iy2BO@m#Cw6vr4Gj$p3=AqNDpyxmNJvQfq1fU80004WQchC2sW@hgHS7VPJ3YdzK!3=C<21f+##HBZbq5JbXj%ltoh2c>C1v@N{MOQ~+^zcE7OsLUS z)R@zbXE80cNZsvOzP50yDgw5IY#W2^!jqhx;!^m2w1uJ|eh%ZTiTi5^mBUuQuPAek z?!o0mUB{$MaO&ZqB&v*1CkYjn8cg{FVbY5j81c2VUVC71#XBprZiF0c%w*DVIyzr(_M2$iPtw785n|YcEw%H+T?Ps%P6==Q-@+X zYGoKdQi)|y=h4FTH@yV-*rCFBAT31(4L3C{JSU1sq+$l<~gd_rI2 zH%o9f)iYrZv>T^yEg_APi_@p2;(!j&Ur5_$6M&rbF#?VN|injJb$Uy#aAbb$B}!oSPXtB6o1`j**}@`KSUs z!Qvd=qw>M0TnqXU8y+)5v|mlcOr`Jh7XbKL?f({5%Rtr-2$6fqunZIUk@ZG?B8mOb zB$CDExQVP`OG!#u|F6lT^F!A+@5)21wYaPdyTx2Hp#q+4Im)7AY1^zoWieUW_O;&& zHKV3U%CxtLyumw+bCOS$q6t2~d1j3BFY6sy>s@W$zP=9g{s93RHNzyC9_au8002ov JPDHLkV1iS*jtu|+ literal 0 HcmV?d00001 diff --git a/sources/gfx/images/free-eos.png b/sources/gfx/images/free-eos.png new file mode 100644 index 0000000000000000000000000000000000000000..0cee49009ab81c13a6d5e7064b861861aa295ef5 GIT binary patch literal 1676 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 literal 0 HcmV?d00001 diff --git a/sources/gfx/images/iycc.png b/sources/gfx/images/iycc.png new file mode 100644 index 0000000000000000000000000000000000000000..4a92f700df78dba33d63313b46a64d8752ca0138 GIT binary patch literal 1636 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 literal 0 HcmV?d00001 diff --git a/sources/gfx/images/unknown.png b/sources/gfx/images/unknown.png new file mode 100644 index 0000000000000000000000000000000000000000..63e5e3c86e19da2eaecf07738f122bd2604bdeb2 GIT binary patch literal 31826 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 z z(atl!;}@`?LgY0VXApO0=)Vr?r7R7bo7UW?6Zm>`;V##8i z(?|FCk8~2|=9$|3szr9r2x$)UfRqUA28N>eOfxjBPKu!nw(GUzR{=W* z7OTRaSI@a8)@`%66+TDAX7^oMt>6Ft zDRvMDb~774%ag9`84L{Oo2-QB53PZr40%VQ5$y0D-%4MD5?;TQhDRhShKAo6}A-iKFo8 zs~fmIJ4GDKieL>wBeBI9Z}LBHxH@d&TnhmX)B<*}OAKwAvVU-MOK*E0ZyE;PPd#v< ze{V`cHlS#R9po$LcIi7>(lB< zF4Qw{7FbV;8kILc`Bh57cRPJ<(srO=;rcpwy7%$C4cgHhGO3>*t#I+# z-)?_64KkRnu5Q-lWkrL^mnWwouF3sJ_>UqAF)Zz(cB&NQlS`KQ)vN(uE&bI3Jp)MC zRl6vHxFiSzsJ`N&0~ha3+@qr-`bC?jN=e8+XH}0oM8;C8nABNt2EE$yg_I+eBQU)0 zYtHfc1Z9B*gtkm97DrjXe(j#_TQ4nFdZF4VAQ0a~(QbL8C9r`{w`rgclR>fl{Ieqn zpX(f(>mva&N^05ao{ZDQ1&=y&S1`ikbB$dGboGw}cF%Opbemb%i*ctwTHi!Q1%*&& z%QazNVAcdh6}@a)l3_yGY1njTY8#mrkH5S?DU$&9SE4mro$nQ0UWqhox~BjAw$@1J ziL#TRj@5pUb(wBZ{=oz$QF6Qbo?uM!m{Jo8xf2Uiv(^pnkhjomt3+23>g{TNH z;YebhVbq7bBf*M(`k<8xK}H4P{v|iDPL%>k#wOqm*-UftLQ5|+P=#l=Ly5uRgP z7*2j)-zrRGBBP*1aDH{BFNjP9gTn5sFzMo^V)wCr9w8s7X z`3aqpkiSnciqi;xIA)-lO-Z5`5(XtffRYGFP!*LpVczEb4sk54ykE6{df+PjdO~8$ zpx)m8#%7ajfwipr0}b}Ai$Xzb#nFZOM$KmsXduN;{ zq#l|G$MWD6=syVEn~L_T>PmUS2)%>*<$^EAyqiPd@ow1g3W+5cE!#(}B&){|o5v6) zl~IFKsx6z$Z$QRKG*V#9@i zB^=+s8{QTt8Ot@wBRz~1eV_NgKqmaY{q5?B;)m?Xe2H4f%jO?wYMkYRWe&j{AEi>A z!h4w{GC0%pY#&$yf?jp3T4$g*f$H}OJF{edzOq@J$Ujc6Q_FaK&-AXYh=P8sLvn2) z@UFMFryA0jK`YP=BhdC&5TQ}Fg$BtQL{JfZg(MC={#k{)2GbhKb&dMRTb8K7jA+Xw zEKCS7*U)@=kjZ5BslD&t2o;YReqdqJ4qc&u@$=tBN!i(}k6I#T_Hv$jw}cMgW%%b_ z_7=KoHm&Vx$M$Kvu3USP zgJBKs(-|=o2ErPgS5? zNrT){J#RN~wuz%}N~~!eV9=oO$786LmNLe|@Ow~uzs4Y8vE^GgN#N+pasK@3T<}Pf z^@t*}+*8BB`i067t|gyGLxO;3fb(A!+65i3jdpk2q955^=PTYklZ)@{qNAX@>N!67 z=UxWj3$X3+eA)4{yQ9Om`*4a@KW%*2_a5=S=U0AyhDXSoqb6QNnDNoRdB literal 0 HcmV?d00001 diff --git a/sources/gfx/logo_32.gif b/sources/gfx/logo_32.gif new file mode 100644 index 0000000000000000000000000000000000000000..86c1b5e92796fe4eba2137c2c6f9fae8e6d99d0d GIT binary patch literal 1285 zcmZ?wbhEHbRA5kG_|54JY79JeLXF0Ej?X5J$*e>CQX?#ZOWWkbLPyO zvt-edHLKQa*|cTPu02PN9XWIA%$aj%u3Wlu<=T}yx9;4zcjw8YCr_R|dGqScn|E)% zeERa`+m}DT{(!wcN{sXnQ2fcl$iVQQK?f8Npgh6A@t@&;poGVU1qYis*#E6ISh(x3A{zd4940Ecp5R)_WcK7l;Gz~@88ZQv4+|6>8U;AE-1__Q z5G#+I_aYHN0fmFT($WGv9tDZaj7*Ab8ebb6H%*cBW)8?uQgvfEsFrm6-3CVoMnUG7 z!+o|cUHuHQMHLtJe%ap0s_}wtgLTczCkzrrH+CGD`ICcLVjB0Oe%ZuM5h+HVjuVB4 zU6|f;+jOkgPCd>grkf@)aS=;X5R=*sgBctWCE^Fl#m|_}74cPB$RZr*QP{%0k+Z>p zo$1j5#xQoN2@6Wf6djKUIKKGM)VPbajG0eT!?cO%Q=^6}FaLrQcY>HICODVK)>+)^ zb%>k5%&AwkLZQ@wt#uKD%oB#DZUecWQIphf9AIPr}?# U5<4!<3H*PIS1$O^!opw;09hF!X#fBK literal 0 HcmV?d00001 diff --git a/sources/gfx/next.gif b/sources/gfx/next.gif new file mode 100644 index 0000000000000000000000000000000000000000..97df05a6966873e2cdc1db5fd251c07757124439 GIT binary patch literal 893 zcmZ?wbhEHbYFD*?iXHK12 zvTVtlcW(C(llPkA5%{QyU6fm{;DSOjGmC__n8Jev4o6w|1Y}OEU}$3O;^bH{ o=f}hb&u#@xxdelTMNJHx8hkHi1}3?5xvOifu`qafsDZ&605hLRw*UYD literal 0 HcmV?d00001 diff --git a/sources/gfx/prev.gif b/sources/gfx/prev.gif new file mode 100644 index 0000000000000000000000000000000000000000..b55211ea4a0df77ab856a3bbc4ccb63697183b08 GIT binary patch literal 893 zcmZ?wbhEHbYFD*?iXHK12 zvTVtlcWpSC@^<=-ETEEU%- z+t!2iLG!%wHl*bpOko%WqaiSiLO}5+3nK#qCxZ^iPoO-(&e6gk%ptO3LBhdC4o)qO z0}~z|Y~hj+NpP6B=r9YrvL3?$L5F5$J_(kH6%5MmEpm=gIvffM4@^;X-&XST6T^v# zY{mO>4s32b(0r5dH3``O|{VPwu;JpI{*9FW*4h83tp3T&|M&O*^Ys7w`~Q)c z{+givq^kamlm7qz{{R30A^8LW000gEEC2ui022Tc00RUt(8)=wz3FNR*x8rS2w;UM l%@CB6(7Xlf1jG9hY+=6(01`W!K}IYZkI1BQ$y7!F06Vd#K{x;a literal 0 HcmV?d00001 diff --git a/sources/gfx/sort_both.gif b/sources/gfx/sort_both.gif new file mode 100644 index 0000000000000000000000000000000000000000..46bee9cf26f00455e24c877632b5c5fc5736f0f6 GIT binary patch literal 150 zcmZ?wbhEHb6lM@+*v!E2@87>CPoBJg|Nh61AD=&ee)a0r@87@w{{8#l!GnAE?md3| z_|Ba>|NsAIfC0syEQ|~cJPbM@0gxHYEY1^7damC4AdBi!88%+tGsK<6ecEZZ9+&b2J1Q^Q9S_#I^rsY2WEqS*$C>w#eJVMx)BbKv0B{!5RSG3qm;n literal 0 HcmV?d00001 diff --git a/sources/gfx/sort_desc.gif b/sources/gfx/sort_desc.gif new file mode 100644 index 0000000000000000000000000000000000000000..00e76f437482b02251233dbee9d05152d64b3fc9 GIT binary patch literal 129 zcmV-{0Dk{RNk%w1VG{ro0J8u9{QUpv>;JpI{*9FW*4h83tp3T&|M&O*^Ys7w`~Q)c z{+givq^kamlm7qz{{R30A^8LW000gEEC2ui022Tc00RUr(8)=wy*TU5yZ>M)j+N1z jXhUegk~RfLq(jgZsNe-dqaYta!vH!k0HFj469E7_EayIx literal 0 HcmV?d00001 diff --git a/sources/gfx/treeTable/blank.gif b/sources/gfx/treeTable/blank.gif new file mode 100644 index 0000000000000000000000000000000000000000..2c93354263bc8868d3bc4c32b5d050cec9b12e5d GIT binary patch literal 55 zcmZ?wbhEHb6krfwXkcV$XlVHV|G(l-7DfgJMg|=QAOOiQF!A;DuRQ&hfAO3xx4Jjm Iu`*Z#0HVwgR{#J2 literal 0 HcmV?d00001 diff --git a/sources/gfx/treeTable/tv-collapsable-last.gif b/sources/gfx/treeTable/tv-collapsable-last.gif new file mode 100644 index 0000000000000000000000000000000000000000..7b4f2bc8047a3efbc445f1f94c5f7ee114a4e2f7 GIT binary patch literal 129 zcmZ?wbhEHb6krfw*v!Dt(9poZ!0;aofDD2_@h1x-0|PUI4oD@)3}zO+f)kbudv837 v{drAJq3^N!oD~c~4qfYlU$06_xUD65zU0_pp_$wfiZ5+WEV(4i$Y2cs7!M)} literal 0 HcmV?d00001 diff --git a/sources/gfx/treeTable/tv-collapsable.gif b/sources/gfx/treeTable/tv-collapsable.gif new file mode 100644 index 0000000000000000000000000000000000000000..512da857dd764d95833e1af57c0f3e107a3a71b1 GIT binary patch literal 90 zcmZ?wbhEHb6krfwSjfQe|Nnmm28M=)1|UQ6CkrD312cmTPy{F|z`($yJ;%Q3^r`s| sii2)ctKX0bP${`n-m+*p>#A3YPdm*FGG{2wO;{)Lal!v;5e5cp09-R6H2?qr literal 0 HcmV?d00001 diff --git a/sources/gfx/treeTable/tv-expandable-last.gif b/sources/gfx/treeTable/tv-expandable-last.gif new file mode 100644 index 0000000000000000000000000000000000000000..f1eb592ff5c44ea408f0913b228f1a396dbdb208 GIT binary patch literal 131 zcmZ?wbhEHb6krfw*vtR||NsAQXlMYEU>*TN@h1x-0|O(24oDry3}zMsgAQaIWHK3n79_azB2E*TN@h1x-0|O(24oDry3}zN1gAQaIWHK3n79_azB2ELkUSy! literal 0 HcmV?d00001 diff --git a/sources/gfx/treeTable/tv-item-last.gif b/sources/gfx/treeTable/tv-item-last.gif new file mode 100644 index 0000000000000000000000000000000000000000..39aaeb5e10cd923bcf6455036d6597b30c7184e6 GIT binary patch literal 66 zcmZ?wbhEHb6krfwXkcV$XlVHV|G(l-7DfgJMg|=QAOOiQFiG~vH=I5-|3R_P#VoyR TQ@t756y2sh>s*$`$Y2csYU31Z literal 0 HcmV?d00001 diff --git a/sources/gfx/treeTable/tv-item.gif b/sources/gfx/treeTable/tv-item.gif new file mode 100644 index 0000000000000000000000000000000000000000..93050d7554990ee91f1d15b9b90bec6a9c403d31 GIT binary patch literal 70 zcmZ?wbhEHb6krfwXkcV$XlVHV|G(l-7DfgJMg|=QAOOiQFv<4FH=I5-|3R_P#VoyR XQ@t759=1e2edwrJ>6RPCz+epk%~BR> literal 0 HcmV?d00001 diff --git a/sources/gfx/treeTable/vertline.gif b/sources/gfx/treeTable/vertline.gif new file mode 100644 index 0000000000000000000000000000000000000000..0fbc5aa8e1d54f3504f38bca076f0a52b42c58c4 GIT binary patch literal 68 zcmZ?wbhEHb6krfwXkcV$XlVHV|G(l-7DfgJMg|=QAOOiQFiH2wH=I5-|3R_P#VoyR VQ@!~ch0`Xs- + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version SVN: $Id: autoloader.inc.php 660 2012-08-27 11:08:40Z namiltd $ + * @link http://phpsysinfo.sourceforge.net + */ + +error_reporting(E_ALL | E_STRICT); + +/** + * automatic loading classes when using them + * + * @param string $class_name name of the class which must be loaded + * + * @return void + */ +function __autoload($class_name) +{ + //$class_name = str_replace('-', '', $class_name); + + /* case-insensitive folders */ + $dirs = array('/plugins/'.strtolower($class_name).'/', '/includes/mb/', '/includes/ups/'); + + foreach ($dirs as $dir) { + if (file_exists(APP_ROOT.$dir.'class.'.strtolower($class_name).'.inc.php')) { + include_once APP_ROOT.$dir.'class.'.strtolower($class_name).'.inc.php'; + + return; + } + } + + /* case-sensitive folders */ + $dirs = array('/includes/', '/includes/interface/', '/includes/to/', '/includes/to/device/', '/includes/os/', '/includes/plugin/', '/includes/xml/', '/includes/web/', '/includes/error/', '/includes/js/', '/includes/output/'); + + foreach ($dirs as $dir) { + if (file_exists(APP_ROOT.$dir.'class.'.$class_name.'.inc.php')) { + include_once APP_ROOT.$dir.'class.'.$class_name.'.inc.php'; + + return; + } + } + + $error = PSI_Error::singleton(); + + $error->addError("_autoload(\"".$class_name."\")", "autoloading of class file (class.".$class_name.".inc.php) failed!"); + $error->errorsAsXML(); +} + +/** + * sets a user-defined error handler function + * + * @param integer $level contains the level of the error raised, as an integer. + * @param string $message contains the error message, as a string. + * @param string $file which contains the filename that the error was raised in, as a string. + * @param integer $line which contains the line number the error was raised at, as an integer. + * + * @return void + */ +function errorHandlerPsi($level, $message, $file, $line) +{ + $error = PSI_Error::singleton(); + $error->addPhpError("errorHandlerPsi : ", "Level : ".$level." Message : ".$message." File : ".$file." Line : ".$line); +} + +set_error_handler('errorHandlerPsi'); diff --git a/sources/includes/class.CommonFunctions.inc.php b/sources/includes/class.CommonFunctions.inc.php new file mode 100644 index 0000000..500c050 --- /dev/null +++ b/sources/includes/class.CommonFunctions.inc.php @@ -0,0 +1,563 @@ + + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version SVN: $Id: class.CommonFunctions.inc.php 699 2012-09-15 11:57:13Z namiltd $ + * @link http://phpsysinfo.sourceforge.net + */ + /** + * class with common functions used in all places + * + * @category PHP + * @package PSI + * @author Michael Cramer + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version Release: 3.0 + * @link http://phpsysinfo.sourceforge.net + */ +class CommonFunctions +{ + private static function _parse_log_file($string) + { + if (defined('PSI_LOG') && is_string(PSI_LOG) && (strlen(PSI_LOG)>0) && ((substr(PSI_LOG, 0, 1)=="-") || (substr(PSI_LOG, 0, 1)=="+"))) { + $log_file = substr(PSI_LOG, 1); + if (file_exists($log_file)) { + $contents = @file_get_contents($log_file); + if ($contents && preg_match("/^\-\-\-[^-\r\n]+\-\-\- ".preg_quote($string, '/')."\r?\n/m", $contents, $matches, PREG_OFFSET_CAPTURE)) { + $findIndex = $matches[0][1]; + if (preg_match("/\r?\n/m", $contents, $matches, PREG_OFFSET_CAPTURE, $findIndex)) { + $startIndex = $matches[0][1]+1; + if (preg_match("/^\-\-\-[^-\r\n]+\-\-\- /m", $contents, $matches, PREG_OFFSET_CAPTURE, $startIndex)) { + $stopIndex = $matches[0][1]; + + return substr($contents, $startIndex, $stopIndex-$startIndex); + } else { + return substr($contents, $startIndex); + } + } + } + } + } + + return false; + } + + /** + * Find a system program, do also path checking when not running on WINNT + * on WINNT we simply return the name with the exe extension to the program name + * + * @param string $strProgram name of the program + * + * @return string complete path and name of the program + */ + private static function _findProgram($strProgram) + { + $path_parts = pathinfo($strProgram); + if (empty($path_parts['basename'])) { + return; + } + $arrPath = array(); + if ((PSI_OS == 'WINNT') && empty($path_parts['extension'])) { + $strProgram .= '.exe'; + $path_parts = pathinfo($strProgram); + } + if (empty($path_parts['dirname']) || ($path_parts['dirname'] == '.')) { + if (PSI_OS == 'WINNT') { + $arrPath = preg_split('/;/', getenv("Path"), -1, PREG_SPLIT_NO_EMPTY); + } else { + $arrPath = preg_split('/:/', getenv("PATH"), -1, PREG_SPLIT_NO_EMPTY); + } + if (defined('PSI_ADD_PATHS') && is_string(PSI_ADD_PATHS)) { + if (preg_match(ARRAY_EXP, PSI_ADD_PATHS)) { + $arrPath = array_merge(eval(PSI_ADD_PATHS), $arrPath); // In this order so $addpaths is before $arrPath when looking for a program + } else { + $arrPath = array_merge(array(PSI_ADD_PATHS), $arrPath); // In this order so $addpaths is before $arrPath when looking for a program + } + } + } else { + array_push($arrPath, $path_parts['dirname']); + $strProgram = $path_parts['basename']; + } + + //add some default paths if we still have no paths here + if (empty($arrPath) && PSI_OS != 'WINNT') { + if (PSI_OS == 'Android') { + array_push($arrPath, '/system/bin'); + } else { + array_push($arrPath, '/bin', '/sbin', '/usr/bin', '/usr/sbin', '/usr/local/bin', '/usr/local/sbin'); + } + } + + $exceptPath = ""; + if ((PSI_OS == 'WINNT') && (($windir = getenv("WinDir")) !== false)) { + $windir = strtolower($windir); + foreach ($arrPath as $strPath) { + if ((strtolower($strPath) == $windir."\\system32") && is_dir($windir."\\SysWOW64")) { + $exceptPath = $windir."\\sysnative"; + array_push($arrPath, $exceptPath); + break; + } + } + } elseif (PSI_OS == 'Android') { + $exceptPath = '/system/bin'; + } + + // If open_basedir defined, fill the $open_basedir array with authorized paths,. (Not tested when no open_basedir restriction) + if ((bool) ini_get('open_basedir')) { + if (PSI_OS == 'WINNT') { + $open_basedir = preg_split('/;/', ini_get('open_basedir'), -1, PREG_SPLIT_NO_EMPTY); + } else { + $open_basedir = preg_split('/:/', ini_get('open_basedir'), -1, PREG_SPLIT_NO_EMPTY); + } + } + foreach ($arrPath as $strPath) { + // Path with trailing slash + if (PSI_OS == 'WINNT') { + $strPathS = rtrim($strPath, "\\")."\\"; + } else { + $strPathS = rtrim($strPath, "/")."/"; + } + // To avoid "open_basedir restriction in effect" error when testing paths if restriction is enabled + if (isset($open_basedir)) { + $inBaseDir = false; + if (PSI_OS == 'WINNT') { + foreach ($open_basedir as $openbasedir) { + if (substr($openbasedir, -1)=="\\") { + $str_Path = $strPathS; + } else { + $str_Path = $strPath; + } + if (stripos($str_Path, $openbasedir) === 0) { + $inBaseDir = true; + break; + } + } + } else { + foreach ($open_basedir as $openbasedir) { + if (substr($openbasedir, -1)=="/") { + $str_Path = $strPathS; + } else { + $str_Path = $strPath; + } + if (strpos($str_Path, $openbasedir) === 0) { + $inBaseDir = true; + break; + } + } + } + if ($inBaseDir == false) { + continue; + } + } + if (($strPath !== $exceptPath) && !is_dir($strPath)) { + continue; + } + if (PSI_OS == 'WINNT') { + $strProgrammpath = rtrim($strPath, "\\")."\\".$strProgram; + } else { + $strProgrammpath = rtrim($strPath, "/")."/".$strProgram; + } + if (is_executable($strProgrammpath)) { + return $strProgrammpath; + } + } + } + + /** + * Execute a system program. return a trim()'d result. + * does very crude pipe checking. you need ' | ' for it to work + * ie $program = CommonFunctions::executeProgram('netstat', '-anp | grep LIST'); + * NOT $program = CommonFunctions::executeProgram('netstat', '-anp|grep LIST'); + * + * @param string $strProgramname name of the program + * @param string $strArgs arguments to the program + * @param string &$strBuffer output of the command + * @param boolean $booErrorRep en- or disables the reporting of errors which should be logged + * + * @return boolean command successfull or not + */ + public static function executeProgram($strProgramname, $strArgs, &$strBuffer, $booErrorRep = true) + { + if (defined('PSI_LOG') && is_string(PSI_LOG) && (strlen(PSI_LOG)>0) && ((substr(PSI_LOG, 0, 1)=="-") || (substr(PSI_LOG, 0, 1)=="+"))) { + $out = self::_parse_log_file("Executing: ".trim($strProgramname.' '.$strArgs)); + if ($out == false) { + if (substr(PSI_LOG, 0, 1)=="-") { + $strBuffer = ''; + + return false; + } + } else { + $strBuffer = $out; + + return true; + } + } + + $strBuffer = ''; + $strError = ''; + $pipes = array(); + $strProgram = self::_findProgram($strProgramname); + $error = PSI_Error::singleton(); + if (!$strProgram) { + if ($booErrorRep) { + $error->addError('find_program('.$strProgramname.')', 'program not found on the machine'); + } + + return false; + } + // see if we've gotten a |, if we have we need to do path checking on the cmd + if ($strArgs) { + $arrArgs = preg_split('/ /', $strArgs, -1, PREG_SPLIT_NO_EMPTY); + for ($i = 0, $cnt_args = count($arrArgs); $i < $cnt_args; $i++) { + if ($arrArgs[$i] == '|') { + $strCmd = $arrArgs[$i + 1]; + $strNewcmd = self::_findProgram($strCmd); + $strArgs = preg_replace("/\| ".$strCmd.'/', '| "'.$strNewcmd.'"', $strArgs); + } + } + } + $descriptorspec = array(0=>array("pipe", "r"), 1=>array("pipe", "w"), 2=>array("pipe", "w")); + if (defined("PSI_MODE_POPEN") && PSI_MODE_POPEN === true) { + if (PSI_OS == 'WINNT') { + $process = $pipes[1] = popen('"'.$strProgram.'" '.$strArgs." 2>nul", "r"); + } else { + $process = $pipes[1] = popen('"'.$strProgram.'" '.$strArgs." 2>/dev/null", "r"); + } + } else { + $process = proc_open('"'.$strProgram.'" '.$strArgs, $descriptorspec, $pipes); + } + if (is_resource($process)) { + self::_timeoutfgets($pipes, $strBuffer, $strError); + if (defined("PSI_MODE_POPEN") && PSI_MODE_POPEN === true) { + $return_value = pclose($pipes[1]); + } else { + fclose($pipes[0]); + fclose($pipes[1]); + fclose($pipes[2]); + // It is important that you close any pipes before calling + // proc_close in order to avoid a deadlock + $return_value = proc_close($process); + } + } else { + if ($booErrorRep) { + $error->addError($strProgram, "\nOpen process error"); + } + + return false; + } + $strError = trim($strError); + $strBuffer = trim($strBuffer); + if (defined('PSI_LOG') && is_string(PSI_LOG) && (strlen(PSI_LOG)>0) && (substr(PSI_LOG, 0, 1)!="-") && (substr(PSI_LOG, 0, 1)!="+")) { + error_log("---".gmdate('r T')."--- Executing: ".trim($strProgramname.' '.$strArgs)."\n".$strBuffer."\n", 3, PSI_LOG); + } + if (! empty($strError)) { + if ($booErrorRep) { + $error->addError($strProgram, $strError."\nReturn value: ".$return_value); + } + + return $return_value == 0; + } + + return true; + } + + /** + * read a file and return the content as a string + * + * @param string $strFileName name of the file which should be read + * @param string &$strRet content of the file (reference) + * @param integer $intLines control how many lines should be read + * @param integer $intBytes control how many bytes of each line should be read + * @param boolean $booErrorRep en- or disables the reporting of errors which should be logged + * + * @return boolean command successfull or not + */ + public static function rfts($strFileName, &$strRet, $intLines = 0, $intBytes = 4096, $booErrorRep = true) + { + if (defined('PSI_LOG') && is_string(PSI_LOG) && (strlen(PSI_LOG)>0) && ((substr(PSI_LOG, 0, 1)=="-") || (substr(PSI_LOG, 0, 1)=="+"))) { + $out = self::_parse_log_file("Reading: ".$strFileName); + if ($out == false) { + if (substr(PSI_LOG, 0, 1)=="-") { + $strRet = ''; + + return false; + } + } else { + $strRet = $out; + + return true; + } + } + + $strFile = ""; + $intCurLine = 1; + $error = PSI_Error::singleton(); + if (file_exists($strFileName)) { + if (is_readable($strFileName)) { + if ($fd = fopen($strFileName, 'r')) { + while (!feof($fd)) { + $strFile .= fgets($fd, $intBytes); + if ($intLines <= $intCurLine && $intLines != 0) { + break; + } else { + $intCurLine++; + } + } + fclose($fd); + $strRet = $strFile; + if (defined('PSI_LOG') && is_string(PSI_LOG) && (strlen(PSI_LOG)>0) && (substr(PSI_LOG, 0, 1)!="-") && (substr(PSI_LOG, 0, 1)!="+")) { + if ((strlen($strRet)>0)&&(substr($strRet, -1)!="\n")) { + error_log("---".gmdate('r T')."--- Reading: ".$strFileName."\n".$strRet."\n", 3, PSI_LOG); + } else { + error_log("---".gmdate('r T')."--- Reading: ".$strFileName."\n".$strRet, 3, PSI_LOG); + } + } + } else { + if ($booErrorRep) { + $error->addError('fopen('.$strFileName.')', 'file can not read by phpsysinfo'); + } + + return false; + } + } else { + if ($booErrorRep) { + $error->addError('fopen('.$strFileName.')', 'file permission error'); + } + + return false; + } + } else { + if ($booErrorRep) { + $error->addError('file_exists('.$strFileName.')', 'the file does not exist on your machine'); + } + + return false; + } + + return true; + } + + /** + * file exists + * + * @param string $strFileName name of the file which should be check + * + * @return boolean command successfull or not + */ + public static function fileexists($strFileName) + { + if (defined('PSI_LOG') && is_string(PSI_LOG) && (strlen(PSI_LOG)>0) && ((substr(PSI_LOG, 0, 1)=="-") || (substr(PSI_LOG, 0, 1)=="+"))) { + $log_file = substr(PSI_LOG, 1); + if (file_exists($log_file) + && ($contents = @file_get_contents($log_file)) + && preg_match("/^\-\-\-[^-\n]+\-\-\- ".preg_quote("Reading: ".$strFileName, '/')."\n/m", $contents)) { + return true; + } else { + if (substr(PSI_LOG, 0, 1)=="-") { + return false; + } + } + } + + return file_exists($strFileName); + } + + /** + * reads a directory and return the name of the files and directorys in it + * + * @param string $strPath path of the directory which should be read + * @param boolean $booErrorRep en- or disables the reporting of errors which should be logged + * + * @return array content of the directory excluding . and .. + */ + public static function gdc($strPath, $booErrorRep = true) + { + $arrDirectoryContent = array(); + $error = PSI_Error::singleton(); + if (is_dir($strPath)) { + if ($handle = opendir($strPath)) { + while (($strFile = readdir($handle)) !== false) { + if ($strFile != "." && $strFile != "..") { + $arrDirectoryContent[] = $strFile; + } + } + closedir($handle); + } else { + if ($booErrorRep) { + $error->addError('opendir('.$strPath.')', 'directory can not be read by phpsysinfo'); + } + } + } else { + if ($booErrorRep) { + $error->addError('is_dir('.$strPath.')', 'directory does not exist on your machine'); + } + } + + return $arrDirectoryContent; + } + + /** + * Check for needed php extensions + * + * We need that extensions for almost everything + * This function will return a hard coded + * XML string (with headers) if the SimpleXML extension isn't loaded. + * Then it will terminate the script. + * See bug #1787137 + * + * @param array $arrExt additional extensions for which a check should run + * + * @return void + */ + public static function checkForExtensions($arrExt = array()) + { + if ((strcasecmp(PSI_SYSTEM_CODEPAGE, "UTF-8") == 0) || (strcasecmp(PSI_SYSTEM_CODEPAGE, "CP437") == 0)) + $arrReq = array('simplexml', 'pcre', 'xml', 'dom'); + elseif (PSI_OS == "WINNT") + $arrReq = array('simplexml', 'pcre', 'xml', 'mbstring', 'dom', 'com_dotnet'); + else + $arrReq = array('simplexml', 'pcre', 'xml', 'mbstring', 'dom'); + $extensions = array_merge($arrExt, $arrReq); + $text = ""; + $error = false; + $text .= "\n"; + $text .= "\n"; + $text .= " \n"; + foreach ($extensions as $extension) { + if (!extension_loaded($extension)) { + $text .= " checkForExtensions\n"; + $text .= " phpSysInfo requires the ".$extension." extension to php in order to work properly.\n"; + $error = true; + } + } + $text .= " \n"; + $text .= ""; + if ($error) { + header("Content-Type: text/xml\n\n"); + echo $text; + die(); + } + } + + /** + * get the content of stdout/stderr with the option to set a timeout for reading + * + * @param array $pipes array of file pointers for stdin, stdout, stderr (proc_open()) + * @param string &$out target string for the output message (reference) + * @param string &$err target string for the error message (reference) + * @param integer $timeout timeout value in seconds (default value is 30) + * + * @return void + */ + private static function _timeoutfgets($pipes, &$out, &$err, $timeout = 30) + { + $w = null; + $e = null; + + if (defined("PSI_MODE_POPEN") && PSI_MODE_POPEN === true) { + $pipe2 = false; + } else { + $pipe2 = true; + } + while (!(feof($pipes[1]) && (!$pipe2 || feof($pipes[2])))) { + if ($pipe2) { + $read = array($pipes[1], $pipes[2]); + } else { + $read = array($pipes[1]); + } + + $n = stream_select($read, $w, $e, $timeout); + + if ($n === false) { + error_log('stream_select: failed !'); + break; + } elseif ($n === 0) { + error_log('stream_select: timeout expired !'); + break; + } + + foreach ($read as $r) { + if ($r == $pipes[1]) { + $out .= fread($r, 4096); + } elseif (feof($pipes[1]) && $pipe2 && ($r == $pipes[2])) {//read STDERR after STDOUT + $err .= fread($r, 4096); + } + } + } + } + + /** + * function for getting a list of values in the specified context + * optionally filter this list, based on the list from third parameter + * + * @param $wmi holds the COM object that we pull the WMI data from + * @param string $strClass name of the class where the values are stored + * @param array $strValue filter out only needed values, if not set all values of the class are returned + * + * @return array content of the class stored in an array + */ + public static function getWMI($wmi, $strClass, $strValue = array()) + { + $arrData = array(); + if ($wmi) { + $value = ""; + try { + $objWEBM = $wmi->Get($strClass); + $arrProp = $objWEBM->Properties_; + $arrWEBMCol = $objWEBM->Instances_(); + foreach ($arrWEBMCol as $objItem) { + if (is_array($arrProp)) { + reset($arrProp); + } + $arrInstance = array(); + foreach ($arrProp as $propItem) { + $value = $objItem->{$propItem->Name}; //instead exploitable eval("\$value = \$objItem->".$propItem->Name.";"); + if (empty($strValue)) { + if (is_string($value)) $arrInstance[$propItem->Name] = trim($value); + else $arrInstance[$propItem->Name] = $value; + } else { + if (in_array($propItem->Name, $strValue)) { + if (is_string($value)) $arrInstance[$propItem->Name] = trim($value); + else $arrInstance[$propItem->Name] = $value; + } + } + } + $arrData[] = $arrInstance; + } + } catch (Exception $e) { + if (PSI_DEBUG) { + $error = PSI_Error::singleton(); + $error->addError($e->getCode(), $e->getMessage()); + } + } + } + + return $arrData; + } + + /** + * get all configured plugins from phpsysinfo.ini (file must be included and processed before calling this function) + * + * @return array + */ + public static function getPlugins() + { + if (defined('PSI_PLUGINS') && is_string(PSI_PLUGINS)) { + if (preg_match(ARRAY_EXP, PSI_PLUGINS)) { + return eval(strtolower(PSI_PLUGINS)); + } else { + return array(strtolower(PSI_PLUGINS)); + } + } else { + return array(); + } + } +} diff --git a/sources/includes/class.Parser.inc.php b/sources/includes/class.Parser.inc.php new file mode 100644 index 0000000..f1e1811 --- /dev/null +++ b/sources/includes/class.Parser.inc.php @@ -0,0 +1,271 @@ + + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version SVN: $Id: class.Parser.inc.php 604 2012-07-10 07:31:34Z namiltd $ + * @link http://phpsysinfo.sourceforge.net + */ + /** + * parser class with common used parsing metods + * + * @category PHP + * @package PSI + * @author Michael Cramer + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version Release: 3.0 + * @link http://phpsysinfo.sourceforge.net + */ +class Parser +{ + /** + * parsing the output of lspci command + * + * @return Array + */ + public static function lspci($debug = PSI_DEBUG) + { + $arrResults = array(); + if (CommonFunctions::executeProgram("lspci", "", $strBuf, $debug)) { + $arrLines = preg_split("/\n/", $strBuf, -1, PREG_SPLIT_NO_EMPTY); + foreach ($arrLines as $strLine) { + $arrParams = preg_split('/ /', trim($strLine), 2); + if (count($arrParams) == 2) + $strName = $arrParams[1]; + else + $strName = "unknown"; + $strName = preg_replace('/\(.*\)/', '', $strName); + $dev = new HWDevice(); + $dev->setName($strName); + $arrResults[] = $dev; + } + } + + return $arrResults; + } + + /** + * parsing the output of df command + * + * @param string $df_param additional parameter for df command + * + * @return array + */ + public static function df($df_param = "") + { + $arrResult = array(); + if (CommonFunctions::executeProgram('mount', '', $mount, PSI_DEBUG)) { + $mount = preg_split("/\n/", $mount, -1, PREG_SPLIT_NO_EMPTY); + foreach ($mount as $mount_line) { + if (preg_match("/(\S+) on ([\S ]+) type (.*) \((.*)\)/", $mount_line, $mount_buf)) { + $parm = array(); + $parm['mountpoint'] = trim($mount_buf[2]); + $parm['fstype'] = $mount_buf[3]; + $parm['name'] = $mount_buf[1]; + if (PSI_SHOW_MOUNT_OPTION) $parm['options'] = $mount_buf[4]; + $mount_parm[] = $parm; + } elseif (preg_match("/(\S+) is (.*) mounted on (\S+) \(type (.*)\)/", $mount_line, $mount_buf)) { + $parm = array(); + $parm['mountpoint'] = trim($mount_buf[3]); + $parm['fstype'] = $mount_buf[4]; + $parm['name'] = $mount_buf[1]; + if (PSI_SHOW_MOUNT_OPTION) $parm['options'] = $mount_buf[2]; + $mount_parm[] = $parm; + } elseif (preg_match("/(\S+) (.*) on (\S+) \((.*)\)/", $mount_line, $mount_buf)) { + $parm = array(); + $parm['mountpoint'] = trim($mount_buf[3]); + $parm['fstype'] = $mount_buf[2]; + $parm['name'] = $mount_buf[1]; + if (PSI_SHOW_MOUNT_OPTION) $parm['options'] = $mount_buf[4]; + $mount_parm[] = $parm; + } elseif (preg_match("/(\S+) on ([\S ]+) \((\S+)(,\s(.*))?\)/", $mount_line, $mount_buf)) { + $parm = array(); + $parm['mountpoint'] = trim($mount_buf[2]); + $parm['fstype'] = $mount_buf[3]; + $parm['name'] = $mount_buf[1]; + if (PSI_SHOW_MOUNT_OPTION) $parm['options'] = isset($mount_buf[5]) ? $mount_buf[5] : ''; + $mount_parm[] = $parm; + } + } + } elseif (CommonFunctions::rfts("/etc/mtab", $mount)) { + $mount = preg_split("/\n/", $mount, -1, PREG_SPLIT_NO_EMPTY); + foreach ($mount as $mount_line) { + if (preg_match("/(\S+) (\S+) (\S+) (\S+) ([0-9]+) ([0-9]+)/", $mount_line, $mount_buf)) { + $parm = array(); + $mount_point = preg_replace("/\\\\040/i", ' ', $mount_buf[2]); //space as \040 + $parm['mountpoint'] = $mount_point; + $parm['fstype'] = $mount_buf[3]; + $parm['name'] = $mount_buf[1]; + if (PSI_SHOW_MOUNT_OPTION) $parm['options'] = $mount_buf[4]; + $mount_parm[] = $parm; + } + } + } + if (CommonFunctions::executeProgram('df', '-k '.$df_param, $df, PSI_DEBUG) && ($df!=="")) { + $df = preg_split("/\n/", $df, -1, PREG_SPLIT_NO_EMPTY); + if (PSI_SHOW_INODES) { + if (CommonFunctions::executeProgram('df', '-i '.$df_param, $df2, PSI_DEBUG)) { + $df2 = preg_split("/\n/", $df2, -1, PREG_SPLIT_NO_EMPTY); + // Store inode use% in an associative array (df_inodes) for later use + foreach ($df2 as $df2_line) { + if (preg_match("/^(\S+).*\s([0-9]+)%/", $df2_line, $inode_buf)) { + $df_inodes[$inode_buf[1]] = $inode_buf[2]; + } + } + } + } + foreach ($df as $df_line) { + $df_buf1 = preg_split("/(\%\s)/", $df_line, 3); + if (count($df_buf1) < 2) { + continue; + } + if (preg_match("/(.*)(\s+)(([0-9]+)(\s+)([0-9]+)(\s+)([\-0-9]+)(\s+)([0-9]+)$)/", $df_buf1[0], $df_buf2)) { + if (count($df_buf1) == 3) { + $df_buf = array($df_buf2[1], $df_buf2[4], $df_buf2[6], $df_buf2[8], $df_buf2[10], $df_buf1[2]); + } else { + $df_buf = array($df_buf2[1], $df_buf2[4], $df_buf2[6], $df_buf2[8], $df_buf2[10], $df_buf1[1]); + } + if (count($df_buf) == 6) { + $df_buf[5] = trim($df_buf[5]); + $dev = new DiskDevice(); + $dev->setName(trim($df_buf[0])); + if ($df_buf[2] < 0) { + $dev->setTotal($df_buf[3] * 1024); + $dev->setUsed($df_buf[3] * 1024); + } else { + $dev->setTotal($df_buf[1] * 1024); + $dev->setUsed($df_buf[2] * 1024); + if ($df_buf[3]>0) { + $dev->setFree($df_buf[3] * 1024); + } + } + if (PSI_SHOW_MOUNT_POINT) $dev->setMountPoint($df_buf[5]); + + $notwas = true; + if (isset($mount_parm)) { + foreach ($mount_parm as $mount_param) { //name and mountpoint find + if (($mount_param['name']===trim($df_buf[0])) && ($mount_param['mountpoint']===$df_buf[5])) { + $dev->setFsType($mount_param['fstype']); + if (PSI_SHOW_MOUNT_OPTION) { + if (PSI_SHOW_MOUNT_CREDENTIALS) { + $dev->setOptions($mount_param['options']); + } else { + $mpo=$mount_param['options']; + + $mpo=preg_replace('/(^guest,)|(^guest$)|(,guest$)/i', '', $mpo); + $mpo=preg_replace('/,guest,/i', ',', $mpo); + + $mpo=preg_replace('/(^user=[^,]*,)|(^user=[^,]*$)|(,user=[^,]*$)/i', '', $mpo); + $mpo=preg_replace('/,user=[^,]*,/i', ',', $mpo); + + $mpo=preg_replace('/(^username=[^,]*,)|(^username=[^,]*$)|(,username=[^,]*$)/i', '', $mpo); + $mpo=preg_replace('/,username=[^,]*,/i', ',', $mpo); + + $mpo=preg_replace('/(^password=[^,]*,)|(^password=[^,]*$)|(,password=[^,]*$)/i', '', $mpo); + $mpo=preg_replace('/,password=[^,]*,/i', ',', $mpo); + + $dev->setOptions($mpo); + } + } + $notwas = false; + break; + } + } + if ($notwas) foreach ($mount_parm as $mount_param) { //mountpoint find + if ($mount_param['mountpoint']===$df_buf[5]) { + $dev->setFsType($mount_param['fstype']); + if (PSI_SHOW_MOUNT_OPTION) { + if (PSI_SHOW_MOUNT_CREDENTIALS) { + $dev->setOptions($mount_param['options']); + } else { + $mpo=$mount_param['options']; + + $mpo=preg_replace('/(^guest,)|(^guest$)|(,guest$)/i', '', $mpo); + $mpo=preg_replace('/,guest,/i', ',', $mpo); + + $mpo=preg_replace('/(^user=[^,]*,)|(^user=[^,]*$)|(,user=[^,]*$)/i', '', $mpo); + $mpo=preg_replace('/,user=[^,]*,/i', ',', $mpo); + + $mpo=preg_replace('/(^username=[^,]*,)|(^username=[^,]*$)|(,username=[^,]*$)/i', '', $mpo); + $mpo=preg_replace('/,username=[^,]*,/i', ',', $mpo); + + $mpo=preg_replace('/(^password=[^,]*,)|(^password=[^,]*$)|(,password=[^,]*$)/i', '', $mpo); + $mpo=preg_replace('/,password=[^,]*,/i', ',', $mpo); + + $dev->setOptions($mpo); + } + } + $notwas = false; + break; + } + } + } + + if ($notwas) { + $dev->setFsType('unknown'); + } + + if (PSI_SHOW_INODES && isset($df_inodes[trim($df_buf[0])])) { + $dev->setPercentInodesUsed($df_inodes[trim($df_buf[0])]); + } + $arrResult[] = $dev; + } + } + } + } else { + if (isset($mount_parm)) { + foreach ($mount_parm as $mount_param) { + $total = disk_total_space($mount_param['mountpoint']); + if (($mount_param['fstype'] != 'none') && ($total > 0)) { + $dev = new DiskDevice(); + $dev->setName($mount_param['name']); + $dev->setFsType($mount_param['fstype']); + + if (PSI_SHOW_MOUNT_POINT) $dev->setMountPoint($mount_param['mountpoint']); + + $dev->setTotal($total); + $free = disk_free_space($mount_param['mountpoint']); + if ($free > 0) { + $dev->setFree($free); + } else { + $free = 0; + } + if ($total > $free) $dev->setUsed($total - $free); + + if (PSI_SHOW_MOUNT_OPTION) { + if (PSI_SHOW_MOUNT_CREDENTIALS) { + $dev->setOptions($mount_param['options']); + } else { + $mpo=$mount_param['options']; + + $mpo=preg_replace('/(^guest,)|(^guest$)|(,guest$)/i', '', $mpo); + $mpo=preg_replace('/,guest,/i', ',', $mpo); + + $mpo=preg_replace('/(^user=[^,]*,)|(^user=[^,]*$)|(,user=[^,]*$)/i', '', $mpo); + $mpo=preg_replace('/,user=[^,]*,/i', ',', $mpo); + + $mpo=preg_replace('/(^username=[^,]*,)|(^username=[^,]*$)|(,username=[^,]*$)/i', '', $mpo); + $mpo=preg_replace('/,username=[^,]*,/i', ',', $mpo); + + $mpo=preg_replace('/(^password=[^,]*,)|(^password=[^,]*$)|(,password=[^,]*$)/i', '', $mpo); + $mpo=preg_replace('/,password=[^,]*,/i', ',', $mpo); + + $dev->setOptions($mpo); + } + } + $arrResult[] = $dev; + } + } + } + } + + return $arrResult; + } +} diff --git a/sources/includes/error/class.PSI_Error.inc.php b/sources/includes/error/class.PSI_Error.inc.php new file mode 100644 index 0000000..2af2e12 --- /dev/null +++ b/sources/includes/error/class.PSI_Error.inc.php @@ -0,0 +1,290 @@ + + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version SVN: $Id: class.Error.inc.php 569 2012-04-16 06:08:18Z namiltd $ + * @link http://phpsysinfo.sourceforge.net + */ + /** + * class for the error handling in phpsysinfo + * + * @category PHP + * @package PSI_Error + * @author Michael Cramer + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version Release: 3.0 + * @link http://phpsysinfo.sourceforge.net + */ +class PSI_Error +{ + /** + * holds the instance of this class + * + * @static + * @var object + */ + private static $_instance; + + /** + * holds the error messages + * + * @var array + */ + private $_arrErrorList = array(); + + /** + * current number ob errors + * + * @var integer + */ + private $_errors = 0; + + /** + * initalize some used vars + */ + private function __construct() + { + $this->_errors = 0; + $this->_arrErrorList = array(); + } + + /** + * Singleton function + * + * @return Error instance of the class + */ + public static function singleton() + { + if (!isset(self::$_instance)) { + $c = __CLASS__; + self::$_instance = new $c; + } + + return self::$_instance; + } + + /** + * triggers an error when somebody tries to clone the object + * + * @return void + */ + public function __clone() + { + trigger_error("Can't be cloned", E_USER_ERROR); + } + + /** + * adds an phpsysinfo error to the internal list + * + * @param string $strCommand Command, which cause the Error + * @param string $strMessage additional Message, to describe the Error + * + * @return void + */ + public function addError($strCommand, $strMessage) + { + $this->_addError($strCommand, $this->_trace($strMessage)); + } + + /** + * adds an error to the internal list + * + * @param string $strCommand Command, which cause the Error + * @param string $strMessage message, that describe the Error + * + * @return void + */ + private function _addError($strCommand, $strMessage) + { + $index = count($this->_arrErrorList) + 1; + $this->_arrErrorList[$index]['command'] = $strCommand; + $this->_arrErrorList[$index]['message'] = $strMessage; + $this->_errors++; + } + + /** + * add a config error to the internal list + * + * @param object $strCommand Command, which cause the Error + * @param object $strMessage additional Message, to describe the Error + * + * @return void + */ + public function addConfigError($strCommand, $strMessage) + { + $this->_addError($strCommand, "Wrong Value in phpsysinfo.ini for ".$strMessage); + } + + /** + * add a php error to the internal list + * + * @param object $strCommand Command, which cause the Error + * @param object $strMessage additional Message, to describe the Error + * + * @return void + */ + public function addPhpError($strCommand, $strMessage) + { + $this->_addError($strCommand, "PHP throws a error\n".$strMessage); + } + + /** + * adds a waraning to the internal list + * + * @param string $strMessage Warning message to display + * + * @return void + */ + public function addWarning($strMessage) + { + $index = count($this->_arrErrorList) + 1; + $this->_arrErrorList[$index]['command'] = "WARN"; + $this->_arrErrorList[$index]['message'] = $strMessage; + } + + /** + * converts the internal error and warning list to a XML file + * + * @return void + */ + public function errorsAsXML() + { + $dom = new DOMDocument('1.0', 'UTF-8'); + $root = $dom->createElement("phpsysinfo"); + $dom->appendChild($root); + $xml = new SimpleXMLExtended(simplexml_import_dom($dom), 'UTF-8'); + $generation = $xml->addChild('Generation'); + $generation->addAttribute('version', PSI_VERSION_STRING); + $generation->addAttribute('timestamp', time()); + $xmlerr = $xml->addChild("Errors"); + foreach ($this->_arrErrorList as $arrLine) { +// $error = $xmlerr->addCData('Error', $arrLine['message']); + $error = $xmlerr->addChild('Error'); + $error->addAttribute('Message', $arrLine['message']); + $error->addAttribute('Function', $arrLine['command']); + } + header("Cache-Control: no-cache, must-revalidate\n"); + header("Content-Type: text/xml\n\n"); + echo $xml->getSimpleXmlElement()->asXML(); + exit(); + } + /** + * add the errors to an existing xml document + * + * @param String $encoding encoding + * + * @return SimpleXmlElement + */ + public function errorsAddToXML($encoding) + { + $dom = new DOMDocument('1.0', 'UTF-8'); + $root = $dom->createElement("Errors"); + $dom->appendChild($root); + $xml = simplexml_import_dom($dom); + $xmlerr = new SimpleXMLExtended($xml, $encoding); + foreach ($this->_arrErrorList as $arrLine) { +// $error = $xmlerr->addCData('Error', $arrLine['message']); + $error = $xmlerr->addChild('Error'); + $error->addAttribute('Message', $arrLine['message']); + $error->addAttribute('Function', $arrLine['command']); + } + + return $xmlerr->getSimpleXmlElement(); + } + /** + * check if errors exists + * + * @return boolean true if are errors logged, false if not + */ + public function errorsExist() + { + if ($this->_errors > 0) { + return true; + } else { + return false; + } + } + /** + * generate a function backtrace for error diagnostic, function is genearally based on code submitted in the php reference page + * + * @param string $strMessage additional message to display + * + * @return string formatted string of the backtrace + */ + private function _trace($strMessage) + { + $arrTrace = array_reverse(debug_backtrace()); + $strFunc = ''; + $strBacktrace = htmlspecialchars($strMessage)."\n\n"; + foreach ($arrTrace as $val) { + // avoid the last line, which says the error is from the error class + if ($val == $arrTrace[count($arrTrace) - 1]) { + break; + } + $strBacktrace .= str_replace(APP_ROOT, ".", $val['file']).' on line '.$val['line']; + if ($strFunc) { + $strBacktrace .= ' in function '.$strFunc; + } + if ($val['function'] == 'include' || $val['function'] == 'require' || $val['function'] == 'include_once' || $val['function'] == 'require_once') { + $strFunc = ''; + } else { + $strFunc = $val['function'].'('; + if (isset($val['args'][0])) { + $strFunc .= ' '; + $strComma = ''; + foreach ($val['args'] as $val) { + $strFunc .= $strComma.$this->_printVar($val); + $strComma = ', '; + } + $strFunc .= ' '; + } + $strFunc .= ')'; + } + $strBacktrace .= "\n"; + } + + return $strBacktrace; + } + /** + * convert some special vars into better readable output + * + * @param mixed $var value, which should be formatted + * + * @return string formatted string + */ + private function _printVar($var) + { + if (is_string($var)) { + $search = array("\x00", "\x0a", "\x0d", "\x1a", "\x09"); + $replace = array('\0', '\n', '\r', '\Z', '\t'); + + return ('"'.str_replace($search, $replace, $var).'"'); + } elseif (is_bool($var)) { + if ($var) { + return ('true'); + } else { + return ('false'); + } + } elseif (is_array($var)) { + $strResult = 'array( '; + $strComma = ''; + foreach ($var as $key=>$val) { + $strResult .= $strComma.$this->_printVar($key).' => '.$this->_printVar($val); + $strComma = ', '; + } + $strResult .= ' )'; + + return ($strResult); + } + // anything else, just let php try to print it + return (var_export($var, true)); + } +} diff --git a/sources/includes/interface/class.PSI_Interface_OS.inc.php b/sources/includes/interface/class.PSI_Interface_OS.inc.php new file mode 100644 index 0000000..7fca97d --- /dev/null +++ b/sources/includes/interface/class.PSI_Interface_OS.inc.php @@ -0,0 +1,50 @@ + + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version SVN: $Id: class.PSI_Interface_OS.inc.php 263 2009-06-22 13:01:52Z bigmichi1 $ + * @link http://phpsysinfo.sourceforge.net + */ + /** + * define which methods a os class for phpsysinfo must implement + * to be recognized and fully work without errors, these are the methods which + * are called from outside to include the information in the main application + * + * @category PHP + * @package PSI_Interfaces + * @author Michael Cramer + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version Release: 3.0 + * @link http://phpsysinfo.sourceforge.net + */ +interface PSI_Interface_OS +{ + /** + * get a special encoding from os where phpsysinfo is running + * + * @return string + */ + public function getEncoding(); + + /** + * build the os information + * + * @return void + */ + public function build(); + + /** + * get the filled or unfilled (with default values) system object + * + * @return System + */ + public function getSys(); +} diff --git a/sources/includes/interface/class.PSI_Interface_Output.inc.php b/sources/includes/interface/class.PSI_Interface_Output.inc.php new file mode 100644 index 0000000..7582403 --- /dev/null +++ b/sources/includes/interface/class.PSI_Interface_Output.inc.php @@ -0,0 +1,35 @@ + + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version SVN: $Id: class.PSI_Interface_Output.inc.php 214 2009-05-25 08:32:40Z bigmichi1 $ + * @link http://phpsysinfo.sourceforge.net + */ + /** + * define which methods a output class for phpsysinfo must implement + * to be recognized and fully work without errors + * + * @category PHP + * @package PSI_Interfaces + * @author Michael Cramer + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version Release: 3.0 + * @link http://phpsysinfo.sourceforge.net + */ +interface PSI_Interface_Output +{ + /** + * generate the output + * + * @return void + */ + public function run(); +} diff --git a/sources/includes/interface/class.PSI_Interface_Plugin.inc.php b/sources/includes/interface/class.PSI_Interface_Plugin.inc.php new file mode 100644 index 0000000..138169c --- /dev/null +++ b/sources/includes/interface/class.PSI_Interface_Plugin.inc.php @@ -0,0 +1,43 @@ + + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version SVN: $Id: class.PSI_Interface_Plugin.inc.php 273 2009-06-24 11:40:09Z bigmichi1 $ + * @link http://phpsysinfo.sourceforge.net + */ + /** + * define which methods a plugin class for phpsysinfo must implement + * to be recognized and fully work without errors, these are the methods which + * are called from outside to include the information in the main application + * + * @category PHP + * @package PSI_Interfaces + * @author Michael Cramer + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version Release: 3.0 + * @link http://phpsysinfo.sourceforge.net + */ +interface PSI_Interface_Plugin +{ + /** + * doing all tasks before the xml can be build + * + * @return void + */ + public function execute(); + + /** + * build the xml + * + * @return SimpleXMLObject entire XML content for the plugin which than can be appended to the main XML + */ + public function xml(); +} diff --git a/sources/includes/interface/class.PSI_Interface_Sensor.inc.php b/sources/includes/interface/class.PSI_Interface_Sensor.inc.php new file mode 100644 index 0000000..3113d37 --- /dev/null +++ b/sources/includes/interface/class.PSI_Interface_Sensor.inc.php @@ -0,0 +1,43 @@ + + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version SVN: $Id: class.PSI_Interface_Sensor.inc.php 263 2009-06-22 13:01:52Z bigmichi1 $ + * @link http://phpsysinfo.sourceforge.net + */ + /** + * define which methods every sensor class for phpsysinfo must implement + * to be recognized and fully work without errors, these are the methods which + * are called from outside to include the information in the main application + * + * @category PHP + * @package PSI_Interfaces + * @author Michael Cramer + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version Release: 3.0 + * @link http://phpsysinfo.sourceforge.net + */ +interface PSI_Interface_Sensor +{ + /** + * build the mbinfo information + * + * @return void + */ + public function build(); + + /** + * get the filled or unfilled (with default values) MBInfo object + * + * @return MBInfo + */ + public function getMBInfo(); +} diff --git a/sources/includes/interface/class.PSI_Interface_UPS.inc.php b/sources/includes/interface/class.PSI_Interface_UPS.inc.php new file mode 100644 index 0000000..73dd1f5 --- /dev/null +++ b/sources/includes/interface/class.PSI_Interface_UPS.inc.php @@ -0,0 +1,42 @@ + + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version SVN: $Id: class.PSI_Interface_UPS.inc.php 263 2009-06-22 13:01:52Z bigmichi1 $ + * @link http://phpsysinfo.sourceforge.net + */ + /** + * define which methods a ups class for phpsysinfo must implement + * to be recognized and fully work without errors + * + * @category PHP + * @package PSI_Interfaces + * @author Michael Cramer + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version Release: 3.0 + * @link http://phpsysinfo.sourceforge.net + */ +interface PSI_Interface_UPS +{ + /** + * build the ups information + * + * @return void + */ + public function build(); + + /** + * get the filled or unfilled (with default values) UPSInfo object + * + * @return UPSInfo + */ + public function getUPSInfo(); +} diff --git a/sources/includes/js/README b/sources/includes/js/README new file mode 100644 index 0000000..d01efd4 --- /dev/null +++ b/sources/includes/js/README @@ -0,0 +1,10 @@ +versions, links and simple description of used files +=========================================================== + +class.JavaScriptPacker.inc.php +--------- +VERSION : 1.1+FF4 +URL : http://dean.edwards.name +DESC : Downloaded from http://dean.edwards.name/download/ http://joliclic.free.fr/php/javascript-packer/en/ + Firefox 4 fix +LICENSE : LGPL 2.1 (http://creativecommons.org/licenses/LGPL/2.1/) +USED : define('PSI_JS_COMPRESSION', 'None'); or define('PSI_JS_COMPRESSION', 'Normal'); diff --git a/sources/includes/js/class.JavaScriptPacker.inc.php b/sources/includes/js/class.JavaScriptPacker.inc.php new file mode 100644 index 0000000..48e3ccd --- /dev/null +++ b/sources/includes/js/class.JavaScriptPacker.inc.php @@ -0,0 +1,788 @@ +pack(); + * + * or + * + * $myPacker = new JavaScriptPacker($script, 'Normal', true, false); + * $packed = $myPacker->pack(); + * + * or (default values) + * + * $myPacker = new JavaScriptPacker($script); + * $packed = $myPacker->pack(); + * + * + * params of the constructor : + * $script: the JavaScript to pack, string. + * $encoding: level of encoding, int or string : + * 0,10,62,95 or 'None', 'Numeric', 'Normal', 'High ASCII'. + * default: 62. + * $fastDecode: include the fast decoder in the packed result, boolean. + * default : true. + * $specialChars: if you are flagged your private and local variables + * in the script, boolean. + * default: false. + * + * The pack() method return the compressed JavasScript, as a string. + * + * see http://dean.edwards.name/packer/usage/ for more information. + * + * Notes : + * # need PHP 5 . Tested with PHP 5.1.2, 5.1.3, 5.1.4, 5.2.3 + * + * # The packed result may be different than with the Dean Edwards + * version, but with the same length. The reason is that the PHP + * function usort to sort array don't necessarily preserve the + * original order of two equal member. The Javascript sort function + * in fact preserve this order (but that's not require by the + * ECMAScript standard). So the encoded keywords order can be + * different in the two results. + * + * # Be careful with the 'High ASCII' Level encoding if you use + * UTF-8 in your files... + */ + + +class JavaScriptPacker +{ + // constants + const IGNORE = '$1'; + + // validate parameters + private $_script = ''; + private $_encoding = 62; + private $_fastDecode = true; + private $_specialChars = false; + + private $LITERAL_ENCODING = array( + 'None' => 0, + 'Numeric' => 10, + 'Normal' => 62, + 'High ASCII' => 95 + ); + + public function __construct($_script, $_encoding = 62, $_fastDecode = true, $_specialChars = false) + { + $this->_script = $_script . "\n"; + if (array_key_exists($_encoding, $this->LITERAL_ENCODING)) + $_encoding = $this->LITERAL_ENCODING[$_encoding]; + $this->_encoding = min((int) $_encoding, 95); + $this->_fastDecode = $_fastDecode; + $this->_specialChars = $_specialChars; + } + + public function pack() + { + $this->_addParser('_basicCompression'); + if ($this->_specialChars) + $this->_addParser('_encodeSpecialChars'); + if ($this->_encoding) + $this->_addParser('_encodeKeywords'); + + // go! + return $this->_pack($this->_script); + } + + // apply all parsing routines + private function _pack($script) + { + for ($i = 0; isset($this->_parsers[$i]); $i++) { + $script = call_user_func(array(&$this, $this->_parsers[$i]), $script); + } + + return $script; + } + + // keep a list of parsing functions, they'll be executed all at once + private $_parsers = array(); + private function _addParser($parser) + { + $this->_parsers[] = $parser; + } + + // zero encoding - just removal of white space and comments + private function _basicCompression($script) + { + $parser = new ParseMaster(); + // make safe + $parser->escapeChar = '\\'; + // protect strings + $parser->add('/\'[^\'\\n\\r]*\'/', self::IGNORE); + $parser->add('/"[^"\\n\\r]*"/', self::IGNORE); + // remove comments + $parser->add('/\\/\\/[^\\n\\r]*[\\n\\r]/', ' '); + $parser->add('/\\/\\*[^*]*\\*+([^\\/][^*]*\\*+)*\\//', ' '); + // protect regular expressions + $parser->add('/\\s+(\\/[^\\/\\n\\r\\*][^\\/\\n\\r]*\\/g?i?)/', '$2'); // IGNORE + $parser->add('/[^\\w\\x24\\/\'"*)\\?:]\\/[^\\/\\n\\r\\*][^\\/\\n\\r]*\\/g?i?/', self::IGNORE); + // remove: ;;; doSomething(); + if ($this->_specialChars) $parser->add('/;;;[^\\n\\r]+[\\n\\r]/'); + // remove redundant semi-colons + $parser->add('/\\(;;\\)/', self::IGNORE); // protect for (;;) loops + $parser->add('/;+\\s*([};])/', '$2'); + // apply the above + $script = $parser->exec($script); + + // remove white-space + $parser->add('/(\\b|\\x24)\\s+(\\b|\\x24)/', '$2 $3'); + $parser->add('/([+\\-])\\s+([+\\-])/', '$2 $3'); + $parser->add('/\\s+/', ''); + // done + return $parser->exec($script); + } + + private function _encodeSpecialChars($script) + { + $parser = new ParseMaster(); + // replace: $name -> n, $$name -> na + $parser->add('/((\\x24+)([a-zA-Z$_]+))(\\d*)/', + array('fn' => '_replace_name') + ); + // replace: _name -> _0, double-underscore (__name) is ignored + $regexp = '/\\b_[A-Za-z\\d]\\w*/'; + // build the word list + $keywords = $this->_analyze($script, $regexp, '_encodePrivate'); + // quick ref + $encoded = $keywords['encoded']; + + $parser->add($regexp, + array( + 'fn' => '_replace_encoded', + 'data' => $encoded + ) + ); + + return $parser->exec($script); + } + + private function _encodeKeywords($script) + { + // escape high-ascii values already in the script (i.e. in strings) + if ($this->_encoding > 62) + $script = $this->_escape95($script); + // create the parser + $parser = new ParseMaster(); + $encode = $this->_getEncoder($this->_encoding); + // for high-ascii, don't encode single character low-ascii + $regexp = ($this->_encoding > 62) ? '/\\w\\w+/' : '/\\w+/'; + // build the word list + $keywords = $this->_analyze($script, $regexp, $encode); + $encoded = $keywords['encoded']; + + // encode + $parser->add($regexp, + array( + 'fn' => '_replace_encoded', + 'data' => $encoded + ) + ); + if (empty($script)) return $script; + else { + //$res = $parser->exec($script); + //$res = $this->_bootStrap($res, $keywords); + //return $res; + return $this->_bootStrap($parser->exec($script), $keywords); + } + } + + private function _analyze($script, $regexp, $encode) + { + // analyse + // retreive all words in the script + $all = array(); + preg_match_all($regexp, $script, $all); + $_sorted = array(); // list of words sorted by frequency + $_encoded = array(); // dictionary of word->encoding + $_protected = array(); // instances of "protected" words + $all = $all[0]; // simulate the javascript comportement of global match + if (!empty($all)) { + $unsorted = array(); // same list, not sorted + $protected = array(); // "protected" words (dictionary of word->"word") + $value = array(); // dictionary of charCode->encoding (eg. 256->ff) + $this->_count = array(); // word->count + $i = count($all); $j = 0; //$word = null; + // count the occurrences - used for sorting later + do { + --$i; + $word = '$' . $all[$i]; + if (!isset($this->_count[$word])) { + $this->_count[$word] = 0; + $unsorted[$j] = $word; + // make a dictionary of all of the protected words in this script + // these are words that might be mistaken for encoding + //if (is_string($encode) && method_exists($this, $encode)) + $values[$j] = call_user_func(array(&$this, $encode), $j); + $protected['$' . $values[$j]] = $j++; + } + // increment the word counter + $this->_count[$word]++; + } while ($i > 0); + // prepare to sort the word list, first we must protect + // words that are also used as codes. we assign them a code + // equivalent to the word itself. + // e.g. if "do" falls within our encoding range + // then we store keywords["do"] = "do"; + // this avoids problems when decoding + $i = count($unsorted); + do { + $word = $unsorted[--$i]; + if (isset($protected[$word]) /*!= null*/) { + $_sorted[$protected[$word]] = substr($word, 1); + $_protected[$protected[$word]] = true; + $this->_count[$word] = 0; + } + } while ($i); + + // sort the words by frequency + // Note: the javascript and php version of sort can be different : + // in php manual, usort : + // " If two members compare as equal, + // their order in the sorted array is undefined." + // so the final packed script is different of the Dean's javascript version + // but equivalent. + // the ECMAscript standard does not guarantee this behaviour, + // and thus not all browsers (e.g. Mozilla versions dating back to at + // least 2003) respect this. + usort($unsorted, array(&$this, '_sortWords')); + $j = 0; + // because there are "protected" words in the list + // we must add the sorted words around them + do { + if (!isset($_sorted[$i])) + $_sorted[$i] = substr($unsorted[$j++], 1); + $_encoded[$_sorted[$i]] = $values[$i]; + } while (++$i < count($unsorted)); + } + + return array( + 'sorted' => $_sorted, + 'encoded' => $_encoded, + 'protected' => $_protected); + } + + private $_count = array(); + private function _sortWords($match1, $match2) + { + return $this->_count[$match2] - $this->_count[$match1]; + } + + // build the boot function used for loading and decoding + private function _bootStrap($packed, $keywords) + { + $ENCODE = $this->_safeRegExp('$encode\\($count\\)'); + + // $packed: the packed script + $packed = "'" . $this->_escape($packed) . "'"; + + // $ascii: base for encoding + $ascii = min(count($keywords['sorted']), $this->_encoding); + if ($ascii == 0) $ascii = 1; + + // $count: number of words contained in the script + $count = count($keywords['sorted']); + + // $keywords: list of words contained in the script + foreach ($keywords['protected'] as $i=>$value) { + $keywords['sorted'][$i] = ''; + } + // convert from a string to an array + ksort($keywords['sorted']); + $keywords = "'" . implode('|', $keywords['sorted']) . "'.split('|')"; + + $encode = ($this->_encoding > 62) ? '_encode95' : $this->_getEncoder($ascii); + $encode = $this->_getJSFunction($encode); + $encode = preg_replace('/_encoding/', '$ascii', $encode); + $encode = preg_replace('/arguments\\.callee/', '$encode', $encode); + $inline = '\\$count' . ($ascii > 10 ? '.toString(\\$ascii)' : ''); + + // $decode: code snippet to speed up decoding + if ($this->_fastDecode) { + // create the decoder + $decode = $this->_getJSFunction('_decodeBody'); + if ($this->_encoding > 62) + $decode = preg_replace('/\\\\w/', '[\\xa1-\\xff]', $decode); + // perform the encoding inline for lower ascii values + elseif ($ascii < 36) + $decode = preg_replace($ENCODE, $inline, $decode); + // special case: when $count==0 there are no keywords. I want to keep + // the basic shape of the unpacking funcion so i'll frig the code... + if ($count == 0) + $decode = preg_replace($this->_safeRegExp('($count)\\s*=\\s*1'), '$1=0', $decode, 1); + } + + // boot function + $unpack = $this->_getJSFunction('_unpack'); + if ($this->_fastDecode) { + // insert the decoder + $this->buffer = $decode; + $unpack = preg_replace_callback('/\\{/', array(&$this, '_insertFastDecode'), $unpack, 1); + } + $unpack = preg_replace('/"/', "'", $unpack); + if ($this->_encoding > 62) { // high-ascii + // get rid of the word-boundaries for regexp matches + $unpack = preg_replace('/\'\\\\\\\\b\'\s*\\+|\\+\s*\'\\\\\\\\b\'/', '', $unpack); + } + if ($ascii > 36 || $this->_encoding > 62 || $this->_fastDecode) { + // insert the encode function + $this->buffer = $encode; + $unpack = preg_replace_callback('/\\{/', array(&$this, '_insertFastEncode'), $unpack, 1); + } else { + // perform the encoding inline + $unpack = preg_replace($ENCODE, $inline, $unpack); + } + // pack the boot function too + $unpackPacker = new JavaScriptPacker($unpack, 0, false, true); + $unpack = $unpackPacker->pack(); + + // arguments + $params = array($packed, $ascii, $count, $keywords); + if ($this->_fastDecode) { + $params[] = 0; + $params[] = '{}'; + } + $params = implode(',', $params); + + // the whole thing + //Firefox 4 fix, old: return 'eval(' . $unpack . '(' . $params . "))\n"; + return "(typeof setTimeout=='function'?setTimeout:eval)(" . $unpack . "(" . $params . "));\n"; + } + + private $buffer; + private function _insertFastDecode($match) + { + return '{' . $this->buffer . ';'; + } + private function _insertFastEncode($match) + { + return '{$encode=' . $this->buffer . ';'; + } + + // mmm.. ..which one do i need ?? + private function _getEncoder($ascii) + { + return $ascii > 10 ? $ascii > 36 ? $ascii > 62 ? + '_encode95' : '_encode62' : '_encode36' : '_encode10'; + } + + // zero encoding + // characters: 0123456789 + private function _encode10($charCode) + { + return $charCode; + } + + // inherent base36 support + // characters: 0123456789abcdefghijklmnopqrstuvwxyz + private function _encode36($charCode) + { + return base_convert($charCode, 10, 36); + } + + // hitch a ride on base36 and add the upper case alpha characters + // characters: 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ + private function _encode62($charCode) + { + $res = ''; + if ($charCode >= $this->_encoding) { + $res = $this->_encode62((int) ($charCode / $this->_encoding)); + } + $charCode = $charCode % $this->_encoding; + + if ($charCode > 35) + return $res . chr($charCode + 29); + else + return $res . base_convert($charCode, 10, 36); + } + + // use high-ascii values + // characters: ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÃÂÃÄÅÆÇÈÉÊËÌÃÃŽÃÃÑÒÓÔÕÖרÙÚÛÜÃÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþ + private function _encode95($charCode) + { + $res = ''; + if ($charCode >= $this->_encoding) + $res = $this->_encode95($charCode / $this->_encoding); + + return $res . chr(($charCode % $this->_encoding) + 161); + } + + private function _safeRegExp($string) + { + return '/'.preg_replace('/\$/', '\\\$', $string).'/'; + } + + private function _encodePrivate($charCode) + { + return "_" . $charCode; + } + + // protect characters used by the parser + private function _escape($script) + { + return preg_replace('/([\\\\\'])/', '\\\$1', $script); + } + + // protect high-ascii characters already in the script + private function _escape95($script) + { + return preg_replace_callback( + '/[\\xa1-\\xff]/', + array(&$this, '_escape95Bis'), + $script + ); + } + private function _escape95Bis($match) + { + return '\x'.((string) dechex(ord($match))); + } + + private function _getJSFunction($aName) + { + if (defined('self::JSFUNCTION'.$aName)) + return constant('self::JSFUNCTION'.$aName); + else + return ''; + } + + // JavaScript Functions used. + // Note : In Dean's version, these functions are converted + // with 'String(aFunctionName);'. + // This internal conversion complete the original code, ex : + // 'while (aBool) anAction();' is converted to + // 'while (aBool) { anAction(); }'. + // The JavaScript functions below are corrected. + + // unpacking function - this is the boot strap function + // data extracted from this packing routine is passed to + // this function when decoded in the target + // NOTE ! : without the ';' final. + const JSFUNCTION_unpack = + +'function ($packed, $ascii, $count, $keywords, $encode, $decode) { + while ($count--) { + if ($keywords[$count]) { + $packed = $packed.replace(new RegExp(\'\\\\b\' + $encode($count) + \'\\\\b\', \'g\'), $keywords[$count]); + } + } + + return $packed; +}'; +/* +'function ($packed, $ascii, $count, $keywords, $encode, $decode) { + while ($count--) + if ($keywords[$count]) + $packed = $packed.replace(new RegExp(\'\\\\b\' + $encode($count) + \'\\\\b\', \'g\'), $keywords[$count]); + + return $packed; +}'; +*/ + + // code-snippet inserted into the unpacker to speed up decoding + const JSFUNCTION_decodeBody = +//_decode = function () { +// does the browser support String.replace where the +// replacement value is a function? + +' if (!\'\'.replace(/^/, String)) { + // decode all the values we need + while ($count--) { + $decode[$encode($count)] = $keywords[$count] || $encode($count); + } + // global replacement function + $keywords = [function ($encoded) {return $decode[$encoded]}]; + // generic match + $encode = function () {return \'\\\\w+\'}; + // reset the loop counter - we are now doing a global replace + $count = 1; + } +'; +//}; +/* +' if (!\'\'.replace(/^/, String)) { + // decode all the values we need + while ($count--) $decode[$encode($count)] = $keywords[$count] || $encode($count); + // global replacement function + $keywords = [function ($encoded) {return $decode[$encoded]}]; + // generic match + $encode = function () {return\'\\\\w+\'}; + // reset the loop counter - we are now doing a global replace + $count = 1; + }'; +*/ + + // zero encoding + // characters: 0123456789 + const JSFUNCTION_encode10 = +'function ($charCode) { + return $charCode; +}';//;'; + + // inherent base36 support + // characters: 0123456789abcdefghijklmnopqrstuvwxyz + const JSFUNCTION_encode36 = +'function ($charCode) { + return $charCode.toString(36); +}';//;'; + + // hitch a ride on base36 and add the upper case alpha characters + // characters: 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ + const JSFUNCTION_encode62 = +'function ($charCode) { + return ($charCode < _encoding ? \'\' : arguments.callee(parseInt($charCode / _encoding))) + + (($charCode = $charCode % _encoding) > 35 ? String.fromCharCode($charCode + 29) : $charCode.toString(36)); +}'; + + // use high-ascii values + // characters: ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÃÂÃÄÅÆÇÈÉÊËÌÃÃŽÃÃÑÒÓÔÕÖרÙÚÛÜÃÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþ + const JSFUNCTION_encode95 = +'function ($charCode) { + return ($charCode < _encoding ? \'\' : arguments.callee($charCode / _encoding)) + + String.fromCharCode($charCode % _encoding + 161); +}'; + +} + +class ParseMaster +{ + public $ignoreCase = false; + public $escapeChar = ''; + + // constants + const EXPRESSION = 0; + const REPLACEMENT = 1; + const LENGTH = 2; + + // used to determine nesting levels + private $GROUPS = '/\\(/';//g + private $SUB_REPLACE = '/\\$\\d/'; + private $INDEXED = '/^\\$\\d+$/'; + private $TRIM = '/([\'"])\\1\\.(.*)\\.\\1\\1$/'; + private $ESCAPE = '/\\\./';//g + private $QUOTE = '/\'/'; + private $DELETED = '/\\x01[^\\x01]*\\x01/';//g + + public function add($expression, $replacement = '') + { + // count the number of sub-expressions + // - add one because each pattern is itself a sub-expression + $length = 1 + preg_match_all($this->GROUPS, $this->_internalEscape((string) $expression), $out); + + // treat only strings $replacement + if (is_string($replacement)) { + // does the pattern deal with sub-expressions? + if (preg_match($this->SUB_REPLACE, $replacement)) { + // a simple lookup? (e.g. "$2") + if (preg_match($this->INDEXED, $replacement)) { + // store the index (used for fast retrieval of matched strings) + $replacement = (int) (substr($replacement, 1)) - 1; + } else { // a complicated lookup (e.g. "Hello $2 $1") + // build a function to do the lookup + $quote = preg_match($this->QUOTE, $this->_internalEscape($replacement)) + ? '"' : "'"; + $replacement = array( + 'fn' => '_backReferences', + 'data' => array( + 'replacement' => $replacement, + 'length' => $length, + 'quote' => $quote + ) + ); + } + } + } + // pass the modified arguments + if (!empty($expression)) $this->_add($expression, $replacement, $length); + else $this->_add('/^$/', $replacement, $length); + } + + public function exec($string) + { + // execute the global replacement + $this->_escaped = array(); + + // simulate the _patterns.toSTring of Dean + $regexp = '/'; + foreach ($this->_patterns as $reg) { + $regexp .= '(' . substr($reg[self::EXPRESSION], 1, -1) . ')|'; + } + $regexp = substr($regexp, 0, -1) . '/'; + $regexp .= ($this->ignoreCase) ? 'i' : ''; + + $string = $this->_escape($string, $this->escapeChar); + $string = preg_replace_callback( + $regexp, + array( + &$this, + '_replacement' + ), + $string + ); + $string = $this->_unescape($string, $this->escapeChar); + + return preg_replace($this->DELETED, '', $string); + } + + public function reset() + { + // clear the patterns collection so that this object may be re-used + $this->_patterns = array(); + } + + // private + private $_escaped = array(); // escaped characters + private $_patterns = array(); // patterns stored by index + + // create and add a new pattern to the patterns collection + private function _add() + { + $arguments = func_get_args(); + $this->_patterns[] = $arguments; + } + + // this is the global replace function (it's quite complicated) + private function _replacement($arguments) + { + if (empty($arguments)) return ''; + + $i = 1; $j = 0; + // loop through the patterns + while (isset($this->_patterns[$j])) { + $pattern = $this->_patterns[$j++]; + // do we have a result? + if (isset($arguments[$i]) && ($arguments[$i] != '')) { + $replacement = $pattern[self::REPLACEMENT]; + + if (is_array($replacement) && isset($replacement['fn'])) { + + if (isset($replacement['data'])) $this->buffer = $replacement['data']; + return call_user_func(array(&$this, $replacement['fn']), $arguments, $i); + + } elseif (is_int($replacement)) { + return $arguments[$replacement + $i]; + + } + $delete = ($this->escapeChar == '' || + strpos($arguments[$i], $this->escapeChar) === false) + ? '' : "\x01" . $arguments[$i] . "\x01"; + + return $delete . $replacement; + + // skip over references to sub-expressions + } else { + $i += $pattern[self::LENGTH]; + } + } + } + + private function _backReferences($match, $offset) + { + $replacement = $this->buffer['replacement']; + $quote = $this->buffer['quote']; + $i = $this->buffer['length']; + while ($i) { + $replacement = str_replace('$'.$i--, $match[$offset + $i], $replacement); + } + + return $replacement; + } + + private function _replace_name($match, $offset) + { + $length = strlen($match[$offset + 2]); + $start = $length - max($length - strlen($match[$offset + 3]), 0); + + return substr($match[$offset + 1], $start, $length) . $match[$offset + 4]; + } + + private function _replace_encoded($match, $offset) + { + return $this->buffer[$match[$offset]]; + } + + + // php : we cannot pass additional data to preg_replace_callback, + // and we cannot use &$this in create_function, so let's go to lower level + private $buffer; + + // encode escaped characters + private function _escape($string, $escapeChar) + { + if ($escapeChar) { + $this->buffer = $escapeChar; + + return preg_replace_callback( + '/\\' . $escapeChar . '(.)' .'/', + array(&$this, '_escapeBis'), + $string + ); + + } else { + return $string; + } + } + private function _escapeBis($match) + { + $this->_escaped[] = $match[1]; + + return $this->buffer; + } + + // decode escaped characters + private function _unescape($string, $escapeChar) + { + if ($escapeChar) { + $regexp = '/'.'\\'.$escapeChar.'/'; + $this->buffer = array('escapeChar'=> $escapeChar, 'i' => 0); + + return preg_replace_callback( + $regexp, + array(&$this, '_unescapeBis'), + $string + ); + + } else { + return $string; + } + } + private function _unescapeBis() + { + if (isset($this->_escaped[$this->buffer['i']]) + && $this->_escaped[$this->buffer['i']] != '') + { + $temp = $this->_escaped[$this->buffer['i']]; + } else { + $temp = ''; + } + $this->buffer['i']++; + + return $this->buffer['escapeChar'] . $temp; + } + + private function _internalEscape($string) + { + return preg_replace($this->ESCAPE, '', $string); + } +} diff --git a/sources/includes/mb/class.coretemp.inc.php b/sources/includes/mb/class.coretemp.inc.php new file mode 100644 index 0000000..df76ea6 --- /dev/null +++ b/sources/includes/mb/class.coretemp.inc.php @@ -0,0 +1,102 @@ + + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version SVN: $Id: class.coretemp.inc.php 661 2012-08-27 11:26:39Z namiltd $ + * @link http://phpsysinfo.sourceforge.net + */ + /** + * getting hardware temperature information through sysctl + * + * @category PHP + * @package PSI_Sensor + * @author Michael Cramer + * @author William Johansson + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version Release: 3.0 + * @link http://phpsysinfo.sourceforge.net + */ +class Coretemp extends Sensors +{ + /** + * get temperature information + * + * @return void + */ + private function _temperature() + { + if (PSI_OS == 'Linux') { + $hwpaths = glob("/sys/devices/platform/coretemp.*/", GLOB_NOSORT); + if (($totalh = count($hwpaths)) > 0) { + $buf = ""; + for ($h = 0; $h < $totalh; $h++) { + $tempsensor = glob($hwpaths[$h]."temp*_input", GLOB_NOSORT); + if (($total = count($tempsensor)) > 0) { + $buf = ""; + for ($i = 0; $i < $total; $i++) if (CommonFunctions::rfts($tempsensor[$i], $buf, 1, 4096, false) && (trim($buf) != "")) { + $dev = new SensorDevice(); + $dev->setValue(trim($buf)/1000); + $label = preg_replace("/_input$/", "_label", $tempsensor[$i]); + $crit = preg_replace("/_input$/", "_crit", $tempsensor[$i]); + $max = preg_replace("/_input$/", "_max", $tempsensor[$i]); + $crit_alarm = preg_replace("/_input$/", "_crit_alarm", $tempsensor[$i]); + if (CommonFunctions::fileexists($label) && CommonFunctions::rfts($label, $buf, 1, 4096, false) && (trim($buf) != "")) { + $dev->setName(trim($buf)); + } else { + $labelname = trim(preg_replace("/_input$/", "", pathinfo($tempsensor[$i], PATHINFO_BASENAME))); + if ($labelname !== "") { + $dev->setName($labelname); + } else { + $dev->setName('unknown'); + } + } + if (CommonFunctions::fileexists($crit) && CommonFunctions::rfts($crit, $buf, 1, 4096, false) && (trim($buf) != "")) { + $dev->setMax(trim($buf)/1000); + if (CommonFunctions::fileexists($crit_alarm) && CommonFunctions::rfts($crit_alarm, $buf, 1, 4096, false) && (trim($buf) === "1")) { + $dev->setEvent("Critical Alarm"); + } + } elseif (CommonFunctions::fileexists($max) && CommonFunctions::rfts($max, $buf, 1, 4096, false) && (trim($buf) != "")) { + $dev->setMax(trim($buf)/1000); + } + $this->mbinfo->setMbTemp($dev); + } + } + } + } + } else { + $smp = 1; + CommonFunctions::executeProgram('sysctl', '-n kern.smp.cpus', $smp); + for ($i = 0; $i < $smp; $i++) { + $temp = 0; + if (CommonFunctions::executeProgram('sysctl', '-n dev.cpu.'.$i.'.temperature', $temp)) { + $temp = preg_replace('/C/', '', $temp); + $dev = new SensorDevice(); + $dev->setName("CPU ".($i + 1)); + $dev->setValue($temp); +// $dev->setMax(70); + $this->mbinfo->setMbTemp($dev); + } + } + } + } + + /** + * get the information + * + * @see PSI_Interface_Sensor::build() + * + * @return Void + */ + public function build() + { + $this->_temperature(); + } +} diff --git a/sources/includes/mb/class.freeipmi.inc.php b/sources/includes/mb/class.freeipmi.inc.php new file mode 100644 index 0000000..7aec7dc --- /dev/null +++ b/sources/includes/mb/class.freeipmi.inc.php @@ -0,0 +1,177 @@ + + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version SVN: $Id: class.freeipmi.inc.php 661 2012-08-27 11:26:39Z namiltd $ + * @link http://phpsysinfo.sourceforge.net + */ + /** + * getting information from ipmi-sensors + * + * @category PHP + * @package PSI_Sensor + * @author Michael Cramer + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version Release: 3.0 + * @link http://phpsysinfo.sourceforge.net + */ +class FreeIPMI extends Sensors +{ + /** + * content to parse + * + * @var array + */ + private $_lines = array(); + + /** + * fill the private content var through command or data access + */ + public function __construct() + { + parent::__construct(); + switch (defined('PSI_SENSOR_FREEIPMI_ACCESS')?strtolower(PSI_SENSOR_FREEIPMI_ACCESS):'command') { + case 'command': + CommonFunctions::executeProgram('ipmi-sensors', '--output-sensor-thresholds', $lines); + $this->_lines = preg_split("/\n/", $lines, -1, PREG_SPLIT_NO_EMPTY); + break; + case 'data': + if (CommonFunctions::rfts(APP_ROOT.'/data/freeipmi.txt', $lines)) { + $this->_lines = preg_split("/\n/", $lines, -1, PREG_SPLIT_NO_EMPTY); + } + break; + default: + $this->error->addConfigError('__construct()', 'PSI_SENSOR_FREEIPMI_ACCESS'); + break; + } + } + + /** + * get temperature information + * + * @return void + */ + private function _temperature() + { + foreach ($this->_lines as $line) { + $buffer = preg_split("/\s*\|\s*/", $line); + if ($buffer[2] == "Temperature" && $buffer[11] != "N/A" && $buffer[4] == "C") { + $dev = new SensorDevice(); + $dev->setName($buffer[1]); + $dev->setValue($buffer[3]); + if ($buffer[9] != "N/A") $dev->setMax($buffer[9]); + if ($buffer[11] != "'OK'") $dev->setEvent(trim($buffer[11], "'")); + $this->mbinfo->setMbTemp($dev); + } + } + } + + /** + * get voltage information + * + * @return void + */ + private function _voltage() + { + foreach ($this->_lines as $line) { + $buffer = preg_split("/\s*\|\s*/", $line); + if ($buffer[2] == "Voltage" && $buffer[11] != "N/A" && $buffer[4] == "V") { + $dev = new SensorDevice(); + $dev->setName($buffer[1]); + $dev->setValue($buffer[3]); + if ($buffer[6] != "N/A") $dev->setMin($buffer[6]); + if ($buffer[9] != "N/A") $dev->setMax($buffer[9]); + if ($buffer[11] != "'OK'") $dev->setEvent(trim($buffer[11], "'")); + $this->mbinfo->setMbVolt($dev); + } + } + } + + /** + * get fan information + * + * @return void + */ + private function _fans() + { + foreach ($this->_lines as $line) { + $buffer = preg_split("/\s*\|\s*/", $line); + if ($buffer[2] == "Fan" && $buffer[11] != "N/A" && $buffer[4] == "RPM") { + $dev = new SensorDevice(); + $dev->setName($buffer[1]); + $dev->setValue($buffer[3]); + if ($buffer[6] != "N/A") { + $dev->setMin($buffer[6]); + } elseif (($buffer[9] != "N/A") && ($buffer[9]<$buffer[3])) { //max instead min issue + $dev->setMin($buffer[9]); + } + if ($buffer[11] != "'OK'") $dev->setEvent(trim($buffer[11], "'")); + $this->mbinfo->setMbFan($dev); + } + } + } + + /** + * get power information + * + * @return void + */ + private function _power() + { + foreach ($this->_lines as $line) { + $buffer = preg_split("/\s*\|\s*/", $line); + if ($buffer[2] == "Current" && $buffer[11] != "N/A" && $buffer[4] == "W") { + $dev = new SensorDevice(); + $dev->setName($buffer[1]); + $dev->setValue($buffer[3]); + if ($buffer[9] != "N/A") $dev->setMax($buffer[9]); + if ($buffer[11] != "'OK'") $dev->setEvent(trim($buffer[11], "'")); + $this->mbinfo->setMbPower($dev); + } + } + } + + /** + * get current information + * + * @return void + */ + private function _current() + { + foreach ($this->_lines as $line) { + $buffer = preg_split("/\s*\|\s*/", $line); + if ($buffer[2] == "Current" && $buffer[11] != "N/A" && $buffer[4] == "A") { + $dev = new SensorDevice(); + $dev->setName($buffer[1]); + $dev->setValue($buffer[3]); + if ($buffer[9] != "N/A") $dev->setMax($buffer[9]); + if ($buffer[11] != "'OK'") $dev->setEvent(trim($buffer[11], "'")); + $this->mbinfo->setMbCurrent($dev); + } + } + } + + /** + * get the information + * + * @see PSI_Interface_Sensor::build() + * + * @return Void + */ + public function build() + { + $this->_temperature(); + $this->_voltage(); + $this->_fans(); + $this->_power(); + $this->_current(); + } +} diff --git a/sources/includes/mb/class.hddtemp.inc.php b/sources/includes/mb/class.hddtemp.inc.php new file mode 100644 index 0000000..1eef5b2 --- /dev/null +++ b/sources/includes/mb/class.hddtemp.inc.php @@ -0,0 +1,135 @@ + + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version SVN: $Id: class.hddtemp.inc.php 661 2012-08-27 11:26:39Z namiltd $ + * @link http://phpsysinfo.sourceforge.net + */ + /** + * getting information from hddtemp + * + * @category PHP + * @package PSI_Sensor + * @author Michael Cramer + * @author T.A. van Roermund + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version Release: 3.0 + * @link http://phpsysinfo.sourceforge.net + */ +class HDDTemp extends Sensors +{ + /** + * get the temperature information from hddtemp + * access is available through tcp or command + * + * @return array temperatures in array + */ + private function _temperature() + { + $ar_buf = array(); + switch (defined('PSI_SENSOR_HDDTEMP_ACCESS')?strtolower(PSI_SENSOR_HDDTEMP_ACCESS):'command') { + case 'tcp': + $lines = ''; + // Timo van Roermund: connect to the hddtemp daemon, use a 5 second timeout. + $fp = @fsockopen('localhost', 7634, $errno, $errstr, 5); + // if connected, read the output of the hddtemp daemon + if ($fp) { + while (!feof($fp)) { + $lines .= fread($fp, 1024); + } + fclose($fp); + } else { + $this->error->addError("HDDTemp error", $errno.", ".$errstr); + } + $lines = str_replace("||", "|\n|", $lines); + $ar_buf = preg_split("/\n/", $lines, -1, PREG_SPLIT_NO_EMPTY); + break; + case 'command': + $strDrives = ""; + $strContent = ""; + $hddtemp_value = ""; + if (CommonFunctions::rfts("/proc/diskstats", $strContent, 0, 4096, false)) { + $arrContent = preg_split("/\n/", $strContent, -1, PREG_SPLIT_NO_EMPTY); + foreach ($arrContent as $strLine) { + preg_match("/^\s(.*)\s([a-z]*)\s(.*)/", $strLine, $arrSplit); + if (! empty($arrSplit[2])) { + $strDrive = '/dev/'.$arrSplit[2]; + if (file_exists($strDrive)) { + $strDrives = $strDrives.$strDrive.' '; + } + } + } + } else { + if (CommonFunctions::rfts("/proc/partitions", $strContent, 0, 4096, false)) { + $arrContent = preg_split("/\n/", $strContent, -1, PREG_SPLIT_NO_EMPTY); + foreach ($arrContent as $strLine) { + if (!preg_match("/^\s(.*)\s([\/a-z0-9]*(\/disc))\s(.*)/", $strLine, $arrSplit)) { + preg_match("/^\s(.*)\s([a-z]*)\s(.*)/", $strLine, $arrSplit); + } + if (! empty($arrSplit[2])) { + $strDrive = '/dev/'.$arrSplit[2]; + if (file_exists($strDrive)) { + $strDrives = $strDrives.$strDrive.' '; + } + } + } + } + } + if (trim($strDrives) == "") { + break; + } + if (CommonFunctions::executeProgram("hddtemp", $strDrives, $hddtemp_value, PSI_DEBUG)) { + $hddtemp_value = preg_split("/\n/", $hddtemp_value, -1, PREG_SPLIT_NO_EMPTY); + foreach ($hddtemp_value as $line) { + $temp = preg_split("/:\s/", $line, 3); + if (count($temp) == 3 && preg_match("/^[0-9]/", $temp[2])) { + preg_match("/^([0-9]*)(.*)/", $temp[2], $ar_temp); + $temp[2] = trim($ar_temp[1]); + $temp[3] = trim($ar_temp[2]); + array_push($ar_buf, "|".implode("|", $temp)."|"); + } + } + } + break; + default: + $this->error->addConfigError("temperature()", "PSI_HDD_TEMP"); + break; + } + // Timo van Roermund: parse the info from the hddtemp daemon. + foreach ($ar_buf as $line) { + $data = array(); + if (preg_match("/\|(.*)\|(.*)\|(.*)\|(.*)\|/", $line, $data)) { + if (trim($data[3]) != "ERR") { + // get the info we need + $dev = new SensorDevice(); + $dev->setName($data[1] . ' (' . (strpos($data[2], " ")?substr($data[2], 0, strpos($data[2], " ")):$data[2]) . ')'); + if (is_numeric($data[3])) { + $dev->setValue($data[3]); + } +// $dev->setMax(60); + $this->mbinfo->setMbTemp($dev); + } + } + } + } + + /** + * get the information + * + * @see PSI_Interface_Sensor::build() + * + * @return Void + */ + public function build() + { + $this->_temperature(); + } +} diff --git a/sources/includes/mb/class.healthd.inc.php b/sources/includes/mb/class.healthd.inc.php new file mode 100644 index 0000000..1d864aa --- /dev/null +++ b/sources/includes/mb/class.healthd.inc.php @@ -0,0 +1,159 @@ + + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version SVN: $Id: class.healthd.inc.php 661 2012-08-27 11:26:39Z namiltd $ + * @link http://phpsysinfo.sourceforge.net + */ + /** + * getting information from healthd + * + * @category PHP + * @package PSI_Sensor + * @author Michael Cramer + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version Release: 3.0 + * @link http://phpsysinfo.sourceforge.net + */ +class Healthd extends Sensors +{ + /** + * content to parse + * + * @var array + */ + private $_lines = array(); + + /** + * fill the private content var through command or data access + */ + public function __construct() + { + parent::__construct(); + switch (defined('PSI_SENSOR_HEALTHD_ACCESS')?strtolower(PSI_SENSOR_HEALTHD_ACCESS):'command') { + case 'command': + $lines = ""; + CommonFunctions::executeProgram('healthdc', '-t', $lines); + $this->_lines = preg_split("/\n/", $lines, -1, PREG_SPLIT_NO_EMPTY); + break; + case 'data': + if (CommonFunctions::rfts(APP_ROOT.'/data/healthd.txt', $lines)) { + $this->_lines = preg_split("/\n/", $lines, -1, PREG_SPLIT_NO_EMPTY); + } + break; + default: + $this->error->addConfigError('__construct()', 'PSI_SENSOR_HEALTHD_ACCESS'); + break; + } + } + + /** + * get temperature information + * + * @return void + */ + private function _temperature() + { + $ar_buf = preg_split("/\t+/", $this->_lines); + $dev1 = new SensorDevice(); + $dev1->setName('temp1'); + $dev1->setValue($ar_buf[1]); +// $dev1->setMax(70); + $this->mbinfo->setMbTemp($dev1); + $dev2 = new SensorDevice(); + $dev2->setName('temp1'); + $dev2->setValue($ar_buf[2]); +// $dev2->setMax(70); + $this->mbinfo->setMbTemp($dev2); + $dev3 = new SensorDevice(); + $dev3->setName('temp1'); + $dev3->setValue($ar_buf[3]); +// $dev3->setMax(70); + $this->mbinfo->setMbTemp($dev3); + } + + /** + * get fan information + * + * @return void + */ + private function _fans() + { + $ar_buf = preg_split("/\t+/", $this->_lines); + $dev1 = new SensorDevice(); + $dev1->setName('fan1'); + $dev1->setValue($ar_buf[4]); +// $dev1->setMin(3000); + $this->mbinfo->setMbFan($dev1); + $dev2 = new SensorDevice(); + $dev2->setName('fan2'); + $dev2->setValue($ar_buf[5]); +// $dev2->setMin(3000); + $this->mbinfo->setMbFan($dev2); + $dev3 = new SensorDevice(); + $dev3->setName('fan3'); + $dev3->setValue($ar_buf[6]); +// $dev3->setMin(3000); + $this->mbinfo->setMbFan($dev3); + } + + /** + * get voltage information + * + * @return array voltage in array with lable + */ + private function _voltage() + { + $ar_buf = preg_split("/\t+/", $this->_lines); + $dev1 = new SensorDevice(); + $dev1->setName('Vcore1'); + $dev1->setValue($ar_buf[7]); + $this->mbinfo->setMbVolt($dev1); + $dev2 = new SensorDevice(); + $dev2->setName('Vcore2'); + $dev2->setValue($ar_buf[8]); + $this->mbinfo->setMbVolt($dev2); + $dev3 = new SensorDevice(); + $dev3->setName('3volt'); + $dev3->setValue($ar_buf[9]); + $this->mbinfo->setMbVolt($dev3); + $dev4 = new SensorDevice(); + $dev4->setName('+5Volt'); + $dev4->setValue($ar_buf[10]); + $this->mbinfo->setMbVolt($dev4); + $dev5 = new SensorDevice(); + $dev5->setName('+12Volt'); + $dev5->setValue($ar_buf[11]); + $this->mbinfo->setMbVolt($dev5); + $dev6 = new SensorDevice(); + $dev6->setName('-12Volt'); + $dev6->setValue($ar_buf[12]); + $this->mbinfo->setMbVolt($dev6); + $dev7 = new SensorDevice(); + $dev7->setName('-5Volt'); + $dev7->setValue($ar_buf[13]); + $this->mbinfo->setMbVolt($dev7); + } + + /** + * get the information + * + * @see PSI_Interface_Sensor::build() + * + * @return Void + */ + public function build() + { + $this->_temperature(); + $this->_fans(); + $this->_voltage(); + } +} diff --git a/sources/includes/mb/class.hwmon.inc.php b/sources/includes/mb/class.hwmon.inc.php new file mode 100644 index 0000000..07648f4 --- /dev/null +++ b/sources/includes/mb/class.hwmon.inc.php @@ -0,0 +1,256 @@ + + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version SVN: $Id: class.hwmon.inc.php 661 2012-08-27 11:26:39Z namiltd $ + * @link http://phpsysinfo.sourceforge.net + */ + /** + * getting hardware temperature information through sysctl + * + * @category PHP + * @package PSI_Sensor + * @author Michael Cramer + * @author William Johansson + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version Release: 3.0 + * @link http://phpsysinfo.sourceforge.net + */ +class Hwmon extends Sensors +{ + /** + * get temperature information + * + * @return void + */ + private function _temperature($hwpath) + { + $sensor = glob($hwpath."temp*_input", GLOB_NOSORT); + if (($total = count($sensor)) > 0) { + $buf = ""; + for ($i = 0; $i < $total; $i++) if (CommonFunctions::rfts($sensor[$i], $buf, 1, 4096, false) && (trim($buf) != "")) { + $dev = new SensorDevice(); + $dev->setValue(trim($buf)/1000); + $label = preg_replace("/_input$/", "_label", $sensor[$i]); + $crit = preg_replace("/_input$/", "_crit", $sensor[$i]); + $max = preg_replace("/_input$/", "_max", $sensor[$i]); + $crit_alarm = preg_replace("/_input$/", "_crit_alarm", $sensor[$i]); + if (CommonFunctions::fileexists($label) && CommonFunctions::rfts($label, $buf, 1, 4096, false) && (trim($buf) != "")) { + $dev->setName(trim($buf)); + } else { + $labelname = trim(preg_replace("/_input$/", "", pathinfo($sensor[$i], PATHINFO_BASENAME))); + if ($labelname !== "") { + $dev->setName($labelname); + } else { + $dev->setName('unknown'); + } + } + if (CommonFunctions::fileexists($crit) && CommonFunctions::rfts($crit, $buf, 1, 4096, false) && (trim($buf) != "")) { + $dev->setMax(trim($buf)/1000); + if (CommonFunctions::fileexists($crit_alarm) && CommonFunctions::rfts($crit_alarm, $buf, 1, 4096, false) && (trim($buf) === "1")) { + $dev->setEvent("Critical Alarm"); + } + } elseif (CommonFunctions::fileexists($max) && CommonFunctions::rfts($max, $buf, 1, 4096, false) && (trim($buf) != "")) { + $dev->setMax(trim($buf)/1000); + } + $this->mbinfo->setMbTemp($dev); + } + } + } + + /** + * get voltage information + * + * @return void + */ + private function _voltage($hwpath) + { + $sensor = glob($hwpath."in*_input", GLOB_NOSORT); + if (($total = count($sensor)) > 0) { + $buf = ""; + for ($i = 0; $i < $total; $i++) if (CommonFunctions::rfts($sensor[$i], $buf, 1, 4096, false) && (trim($buf) != "")) { + $dev = new SensorDevice(); + $dev->setValue(trim($buf)/1000); + $label = preg_replace("/_input$/", "_label", $sensor[$i]); + $alarm = preg_replace("/_input$/", "_alarm", $sensor[$i]); + $max = preg_replace("/_input$/", "_max", $sensor[$i]); + $min = preg_replace("/_input$/", "_min", $sensor[$i]); + if (CommonFunctions::fileexists($label) && CommonFunctions::rfts($label, $buf, 1, 4096, false) && (trim($buf) != "")) { + $dev->setName(trim($buf)); + } else { + $labelname = trim(preg_replace("/_input$/", "", pathinfo($sensor[$i], PATHINFO_BASENAME))); + if ($labelname !== "") { + $dev->setName($labelname); + } else { + $dev->setName('unknown'); + } + } + if (CommonFunctions::fileexists($max) && CommonFunctions::rfts($max, $buf, 1, 4096, false) && (trim($buf) != "")) { + $dev->setMax(trim($buf)/1000); + } + if (CommonFunctions::fileexists($min) && CommonFunctions::rfts($min, $buf, 1, 4096, false) && (trim($buf) != "")) { + $dev->setMin(trim($buf)/1000); + } + if (CommonFunctions::fileexists($alarm) && CommonFunctions::rfts($alarm, $buf, 1, 4096, false) && (trim($buf) === "1")) { + $dev->setEvent("Alarm"); + } + $this->mbinfo->setMbVolt($dev); + } + } + } + + /** + * get fan information + * + * @return void + */ + private function _fans($hwpath) + { + $sensor = glob($hwpath."fan*_input", GLOB_NOSORT); + if (($total = count($sensor)) > 0) { + $buf = ""; + for ($i = 0; $i < $total; $i++) if (CommonFunctions::rfts($sensor[$i], $buf, 1, 4096, false) && (trim($buf) != "")) { + $dev = new SensorDevice(); + $dev->setValue(trim($buf)); + $label = preg_replace("/_input$/", "_label", $sensor[$i]); + $alarm = preg_replace("/_input$/", "_alarm", $sensor[$i]); + $fullmax = preg_replace("/_input$/", "_full_speed", $sensor[$i]); + $max = preg_replace("/_input$/", "_max", $sensor[$i]); + $min = preg_replace("/_input$/", "_min", $sensor[$i]); + if (CommonFunctions::fileexists($label) && CommonFunctions::rfts($label, $buf, 1, 4096, false) && (trim($buf) != "")) { + $dev->setName(trim($buf)); + } else { + $labelname = trim(preg_replace("/_input$/", "", pathinfo($sensor[$i], PATHINFO_BASENAME))); + if ($labelname !== "") { + $dev->setName($labelname); + } else { + $dev->setName('unknown'); + } + } + if (CommonFunctions::fileexists($fullmax) && CommonFunctions::rfts($fullmax, $buf, 1, 4096, false) && (trim($buf) != "")) { + $dev->setMax(trim($buf)); + } elseif (CommonFunctions::fileexists($max) && CommonFunctions::rfts($max, $buf, 1, 4096, false) && (trim($buf) != "")) { + $dev->setMax(trim($buf)); + } + if (CommonFunctions::fileexists($min) && CommonFunctions::rfts($min, $buf, 1, 4096, false) && (trim($buf) != "")) { + $dev->setMin(trim($buf)); + } + if (CommonFunctions::fileexists($alarm) && CommonFunctions::rfts($alarm, $buf, 1, 4096, false) && (trim($buf) === "1")) { + $dev->setEvent("Alarm"); + } + $this->mbinfo->setMbFan($dev); + } + } + } + + /** + * get power information + * + * @return void + */ + private function _power($hwpath) + { + $sensor = glob($hwpath."power*_input", GLOB_NOSORT); + if (($total = count($sensor)) > 0) { + $buf = ""; + for ($i = 0; $i < $total; $i++) if (CommonFunctions::rfts($sensor[$i], $buf, 1, 4096, false) && (trim($buf) != "")) { + $dev = new SensorDevice(); + $dev->setValue(trim($buf)); + $label = preg_replace("/_input$/", "_label", $sensor[$i]); + $alarm = preg_replace("/_input$/", "_alarm", $sensor[$i]); + $max = preg_replace("/_input$/", "_max", $sensor[$i]); + $min = preg_replace("/_input$/", "_min", $sensor[$i]); + if (CommonFunctions::fileexists($label) && CommonFunctions::rfts($label, $buf, 1, 4096, false) && (trim($buf) != "")) { + $dev->setName(trim($buf)); + } else { + $labelname = trim(preg_replace("/_input$/", "", pathinfo($sensor[$i], PATHINFO_BASENAME))); + if ($labelname !== "") { + $dev->setName($labelname); + } else { + $dev->setName('unknown'); + } + } + if (CommonFunctions::fileexists($max) && CommonFunctions::rfts($max, $buf, 1, 4096, false) && (trim($buf) != "")) { + $dev->setMax(trim($buf)); + } + if (CommonFunctions::fileexists($min) && CommonFunctions::rfts($min, $buf, 1, 4096, false) && (trim($buf) != "")) { + $dev->setMin(trim($buf)); + } + if (CommonFunctions::fileexists($alarm) && CommonFunctions::rfts($alarm, $buf, 1, 4096, false) && (trim($buf) === "1")) { + $dev->setEvent("Alarm"); + } + $this->mbinfo->setMbPower($dev); + } + } + } + + /** + * get current information + * + * @return void + */ + private function _current($hwpath) + { + $sensor = glob($hwpath."curr*_input", GLOB_NOSORT); + if (($total = count($sensor)) > 0) { + $buf = ""; + for ($i = 0; $i < $total; $i++) if (CommonFunctions::rfts($sensor[$i], $buf, 1, 4096, false) && (trim($buf) != "")) { + $dev = new SensorDevice(); + $dev->setValue(trim($buf)/1000); + $label = preg_replace("/_input$/", "_label", $sensor[$i]); + $alarm = preg_replace("/_input$/", "_alarm", $sensor[$i]); + $max = preg_replace("/_input$/", "_max", $sensor[$i]); + $min = preg_replace("/_input$/", "_min", $sensor[$i]); + if (CommonFunctions::fileexists($label) && CommonFunctions::rfts($label, $buf, 1, 4096, false) && (trim($buf) != "")) { + $dev->setName(trim($buf)); + } else { + $labelname = trim(preg_replace("/_input$/", "", pathinfo($sensor[$i], PATHINFO_BASENAME))); + if ($labelname !== "") { + $dev->setName($labelname); + } else { + $dev->setName('unknown'); + } + } + if (CommonFunctions::fileexists($max) && CommonFunctions::rfts($max, $buf, 1, 4096, false) && (trim($buf) != "")) { + $dev->setMax(trim($buf)/1000); + } + if (CommonFunctions::fileexists($min) && CommonFunctions::rfts($min, $buf, 1, 4096, false) && (trim($buf) != "")) { + $dev->setMin(trim($buf)/1000); + } + if (CommonFunctions::fileexists($alarm) && CommonFunctions::rfts($alarm, $buf, 1, 4096, false) && (trim($buf) === "1")) { + $dev->setEvent("Alarm"); + } + $this->mbinfo->setMbCurrent($dev); + } + } + } + + /** + * get the information + * + * @see PSI_Interface_Sensor::build() + * + * @return Void + */ + public function build() + { + $hwpaths = glob("/sys/class/hwmon/hwmon*/device/", GLOB_NOSORT); + if (($totalh = count($hwpaths)) > 0) { + for ($h = 0; $h < $totalh; $h++) { + $this->_temperature($hwpaths[$h]); + $this->_voltage($hwpaths[$h]); + $this->_fans($hwpaths[$h]); + $this->_power($hwpaths[$h]); + $this->_current($hwpaths[$h]); + } + } + } +} diff --git a/sources/includes/mb/class.hwsensors.inc.php b/sources/includes/mb/class.hwsensors.inc.php new file mode 100644 index 0000000..14382bd --- /dev/null +++ b/sources/includes/mb/class.hwsensors.inc.php @@ -0,0 +1,156 @@ + + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version SVN: $Id: class.hwsensors.inc.php 661 2012-08-27 11:26:39Z namiltd $ + * @link http://phpsysinfo.sourceforge.net + */ + /** + * getting information from hwsensors + * + * @category PHP + * @package PSI_Sensor + * @author Michael Cramer + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version Release: 3.0 + * @link http://phpsysinfo.sourceforge.net + */ +class HWSensors extends Sensors +{ + /** + * content to parse + * + * @var array + */ + private $_lines = array(); + + /** + * fill the private content var through command + */ + public function __construct() + { + parent::__construct(); + $lines = ""; +// CommonFunctions::executeProgram('sysctl', '-w hw.sensors', $lines); + CommonFunctions::executeProgram('sysctl', 'hw.sensors', $lines); + $this->_lines = preg_split("/\n/", $lines, -1, PREG_SPLIT_NO_EMPTY); + } + + /** + * get temperature information + * + * @return void + */ + private function _temperature() + { + foreach ($this->_lines as $line) { + if (preg_match('/^hw\.sensors\.[0-9]+=[^\s,]+,\s+([^,]+),\s+temp,\s+([0-9\.]+)\s+degC.*$/', $line, $ar_buf)) { + $dev = new SensorDevice(); + $dev->setName($ar_buf[1]); + $dev->setValue($ar_buf[2]); + $this->mbinfo->setMbTemp($dev); + } elseif (preg_match('/^hw\.sensors\.[0-9]+=[^\s,]+,\s+([^,]+),\s+([0-9\.]+)\s+degC$/', $line, $ar_buf)) { + $dev = new SensorDevice(); + $dev->setName($ar_buf[1]); + $dev->setValue($ar_buf[2]); + $this->mbinfo->setMbTemp($dev); + } elseif (preg_match('/^hw\.sensors\.[^\.]+\.(.*)=([0-9\.]+)\s+degC\s+\((.*)\)$/', $line, $ar_buf)) { + $dev = new SensorDevice(); + $dev->setName($ar_buf[3]); + $dev->setValue($ar_buf[2]); + $this->mbinfo->setMbTemp($dev); + } elseif (preg_match('/^hw\.sensors\.[^\.]+\.(.*)=([0-9\.]+)\s+degC$/', $line, $ar_buf)) { + $dev = new SensorDevice(); + $dev->setName($ar_buf[1]); + $dev->setValue($ar_buf[2]); + $this->mbinfo->setMbTemp($dev); + } + } + } + + /** + * get fan information + * + * @return void + */ + private function _fans() + { + foreach ($this->_lines as $line) { + if (preg_match('/^hw\.sensors\.[0-9]+=[^\s,]+,\s+([^,]+),\s+fanrpm,\s+([0-9\.]+)\s+RPM.*$/', $line, $ar_buf)) { + $dev = new SensorDevice(); + $dev->setName($ar_buf[1]); + $dev->setValue($ar_buf[2]); + $this->mbinfo->setMbFan($dev); + } elseif (preg_match('/^hw\.sensors\.[0-9]+=[^\s,]+,\s+([^,]+),\s+([0-9\.]+)\s+RPM$/', $line, $ar_buf)) { + $dev = new SensorDevice(); + $dev->setName($ar_buf[1]); + $dev->setValue($ar_buf[2]); + $this->mbinfo->setMbFan($dev); + } elseif (preg_match('/^hw\.sensors\.[^\.]+\.(.*)=([0-9\.]+)\s+RPM\s+\((.*)\)$/', $line, $ar_buf)) { + $dev = new SensorDevice(); + $dev->setName($ar_buf[3]); + $dev->setValue($ar_buf[2]); + $this->mbinfo->setMbFan($dev); + } elseif (preg_match('/^hw\.sensors\.[^\.]+\.(.*)=([0-9\.]+)\s+RPM$/', $line, $ar_buf)) { + $dev = new SensorDevice(); + $dev->setName($ar_buf[1]); + $dev->setValue($ar_buf[2]); + $this->mbinfo->setMbFan($dev); + } + } + } + + /** + * get voltage information + * + * @return void + */ + private function _voltage() + { + foreach ($this->_lines as $line) { + if (preg_match('/^hw\.sensors\.[0-9]+=[^\s,]+,\s+([^,]+),\s+volts_dc,\s+([0-9\.]+)\s+V.*$/', $line, $ar_buf)) { + $dev = new SensorDevice(); + $dev->setName($ar_buf[1]); + $dev->setValue($ar_buf[2]); + $this->mbinfo->setMbVolt($dev); + } elseif (preg_match('/^hw\.sensors\.[0-9]+=[^\s,]+,\s+([^,]+),\s+([0-9\.]+)\s+V\sDC$/', $line, $ar_buf)) { + $dev = new SensorDevice(); + $dev->setName($ar_buf[1]); + $dev->setValue($ar_buf[2]); + $this->mbinfo->setMbVolt($dev); + } elseif (preg_match('/^hw\.sensors\.[^\.]+\.(.*)=([0-9\.]+)\s+VDC\s+\((.*)\)$/', $line, $ar_buf)) { + $dev = new SensorDevice(); + $dev->setName($ar_buf[3]); + $dev->setValue($ar_buf[2]); + $this->mbinfo->setMbVolt($dev); + } elseif (preg_match('/^hw\.sensors\.[^\.]+\.(.*)=([0-9\.]+)\s+VDC$/', $line, $ar_buf)) { + $dev = new SensorDevice(); + $dev->setName($ar_buf[1]); + $dev->setValue($ar_buf[2]); + $this->mbinfo->setMbVolt($dev); + } + } + } + + /** + * get the information + * + * @see PSI_Interface_Sensor::build() + * + * @return Void + */ + public function build() + { + $this->_temperature(); + $this->_voltage(); + $this->_fans(); + } +} diff --git a/sources/includes/mb/class.ipmi.inc.php b/sources/includes/mb/class.ipmi.inc.php new file mode 100644 index 0000000..98985c8 --- /dev/null +++ b/sources/includes/mb/class.ipmi.inc.php @@ -0,0 +1,197 @@ + + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version SVN: $Id: class.ipmi.inc.php 661 2012-08-27 11:26:39Z namiltd $ + * @link http://phpsysinfo.sourceforge.net + */ + /** + * getting information from ipmitool + * + * @category PHP + * @package PSI_Sensor + * @author Michael Cramer + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version Release: 3.0 + * @link http://phpsysinfo.sourceforge.net + */ +class IPMI extends Sensors +{ + /** + * content to parse + * + * @var array + */ + private $_lines = array(); + + /** + * fill the private content var through command or data access + */ + public function __construct() + { + parent::__construct(); + switch (defined('PSI_SENSOR_IPMI_ACCESS')?strtolower(PSI_SENSOR_IPMI_ACCESS):'command') { + case 'command': + CommonFunctions::executeProgram('ipmitool', 'sensor', $lines); + $this->_lines = preg_split("/\n/", $lines, -1, PREG_SPLIT_NO_EMPTY); + break; + case 'data': + if (CommonFunctions::rfts(APP_ROOT.'/data/ipmi.txt', $lines)) { + $this->_lines = preg_split("/\n/", $lines, -1, PREG_SPLIT_NO_EMPTY); + } + break; + default: + $this->error->addConfigError('__construct()', 'PSI_SENSOR_IPMI_ACCESS'); + break; + } + } + + /** + * get temperature information + * + * @return void + */ + private function _temperature() + { + foreach ($this->_lines as $line) { + $buffer = preg_split("/\s*\|\s*/", $line); + if ($buffer[2] == "degrees C" && $buffer[3] != "na") { + $dev = new SensorDevice(); + $dev->setName($buffer[0]); + $dev->setValue($buffer[1]); + if ($buffer[8] != "na") $dev->setMax($buffer[8]); + switch ($buffer[3]) { + case "nr": $dev->setEvent("Non-Recoverable"); break; + case "cr": $dev->setEvent("Critical"); break; + case "nc": $dev->setEvent("Non-Critical"); break; + } + $this->mbinfo->setMbTemp($dev); + } + } + } + + /** + * get voltage information + * + * @return void + */ + private function _voltage() + { + foreach ($this->_lines as $line) { + $buffer = preg_split("/\s*\|\s*/", $line); + if ($buffer[2] == "Volts" && $buffer[3] != "na") { + $dev = new SensorDevice(); + $dev->setName($buffer[0]); + $dev->setValue($buffer[1]); + if ($buffer[5] != "na") $dev->setMin($buffer[5]); + if ($buffer[8] != "na") $dev->setMax($buffer[8]); + switch ($buffer[3]) { + case "nr": $dev->setEvent("Non-Recoverable"); break; + case "cr": $dev->setEvent("Critical"); break; + case "nc": $dev->setEvent("Non-Critical"); break; + } + $this->mbinfo->setMbVolt($dev); + } + } + } + + /** + * get fan information + * + * @return void + */ + private function _fans() + { + foreach ($this->_lines as $line) { + $buffer = preg_split("/\s*\|\s*/", $line); + if ($buffer[2] == "RPM" && $buffer[3] != "na") { + $dev = new SensorDevice(); + $dev->setName($buffer[0]); + $dev->setValue($buffer[1]); + if ($buffer[8] != "na") { + $dev->setMin($buffer[8]); + } elseif (($buffer[5] != "na") && ($buffer[5]<$buffer[1])) { //max instead min issue + $dev->setMin($buffer[5]); + } + switch ($buffer[3]) { + case "nr": $dev->setEvent("Non-Recoverable"); break; + case "cr": $dev->setEvent("Critical"); break; + case "nc": $dev->setEvent("Non-Critical"); break; + } + $this->mbinfo->setMbFan($dev); + } + } + } + + /** + * get power information + * + * @return void + */ + private function _power() + { + foreach ($this->_lines as $line) { + $buffer = preg_split("/\s*\|\s*/", $line); + if ($buffer[2] == "Watts" && $buffer[3] != "na") { + $dev = new SensorDevice(); + $dev->setName($buffer[0]); + $dev->setValue($buffer[1]); + if ($buffer[8] != "na") $dev->setMax($buffer[8]); + switch ($buffer[3]) { + case "nr": $dev->setEvent("Non-Recoverable"); break; + case "cr": $dev->setEvent("Critical"); break; + case "nc": $dev->setEvent("Non-Critical"); break; + } + $this->mbinfo->setMbPower($dev); + } + } + } + + /** + * get current information + * + * @return void + */ + private function _current() + { + foreach ($this->_lines as $line) { + $buffer = preg_split("/\s*\|\s*/", $line); + if ($buffer[2] == "Amps" && $buffer[3] != "na") { + $dev = new SensorDevice(); + $dev->setName($buffer[0]); + $dev->setValue($buffer[1]); + if ($buffer[8] != "na") $dev->setMax($buffer[8]); + switch ($buffer[3]) { + case "nr": $dev->setEvent("Non-Recoverable"); break; + case "cr": $dev->setEvent("Critical"); break; + case "nc": $dev->setEvent("Non-Critical"); break; + } + $this->mbinfo->setMbCurrent($dev); + } + } + } + + /** + * get the information + * + * @see PSI_Interface_Sensor::build() + * + * @return Void + */ + public function build() + { + $this->_temperature(); + $this->_voltage(); + $this->_fans(); + $this->_power(); + $this->_current(); + } +} diff --git a/sources/includes/mb/class.ipmiutil.inc.php b/sources/includes/mb/class.ipmiutil.inc.php new file mode 100644 index 0000000..58ab553 --- /dev/null +++ b/sources/includes/mb/class.ipmiutil.inc.php @@ -0,0 +1,220 @@ + + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version SVN: $Id: class.ipmiutil.inc.php 661 2012-08-27 11:26:39Z namiltd $ + * @link http://phpsysinfo.sourceforge.net + */ + /** + * getting information from ipmi-sensors + * + * @category PHP + * @package PSI_Sensor + * @author Michael Cramer + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version Release: 3.0 + * @link http://phpsysinfo.sourceforge.net + */ +class IPMIutil extends Sensors +{ + /** + * content to parse + * + * @var array + */ + private $_lines = array(); + + /** + * fill the private content var through command or data access + */ + public function __construct() + { + parent::__construct(); + switch (defined('PSI_SENSOR_IPMIUTIL_ACCESS')?strtolower(PSI_SENSOR_IPMIUTIL_ACCESS):'command') { + case 'command': + CommonFunctions::executeProgram('ipmiutil', 'sensor -stw', $lines); + $this->_lines = preg_split("/\r?\n/", $lines, -1, PREG_SPLIT_NO_EMPTY); + break; + case 'data': + if (CommonFunctions::rfts(APP_ROOT.'/data/ipmiutil.txt', $lines)) { + $this->_lines = preg_split("/\r?\n/", $lines, -1, PREG_SPLIT_NO_EMPTY); + } + break; + default: + $this->error->addConfigError('__construct()', 'PSI_SENSOR_IPMIUTIL_ACCESS'); + break; + } + } + + /** + * get temperature information + * + * @return void + */ + private function _temperature() + { + foreach ($this->_lines as $line) { + $buffer = preg_split("/\s*\|\s*/", $line); + if (isset($buffer[2]) && $buffer[2] == "Temperature" && $buffer[1] == "Full" && isset($buffer[6]) && preg_match("/^(\S+)\sC$/", $buffer[6], $value)) { + $dev = new SensorDevice(); + $dev->setName($buffer[4]); + $dev->setValue($value[1]); + if (isset($buffer[7]) && $buffer[7] == "Thresholds") { + if ((isset($buffer[8]) && preg_match("/^hi-crit\s(\S+)\s*$/", $buffer[8], $limits)) + ||(isset($buffer[9]) && preg_match("/^hi-crit\s(\S+)\s*$/", $buffer[9], $limits)) + ||(isset($buffer[10]) && preg_match("/^hi-crit\s(\S+)\s*$/", $buffer[10], $limits)) + ||(isset($buffer[11]) && preg_match("/^hi-crit\s(\S+)\s*$/", $buffer[11], $limits))) { + $dev->setMax($limits[1]); + } + } + if ($buffer[5] != "OK") $dev->setEvent($buffer[5]); + $this->mbinfo->setMbTemp($dev); + } + } + } + + /** + * get voltage information + * + * @return void + */ + private function _voltage() + { + foreach ($this->_lines as $line) { + $buffer = preg_split("/\s*\|\s*/", $line); + if (isset($buffer[2]) && $buffer[2] == "Voltage" && $buffer[1] == "Full" && isset($buffer[6]) && preg_match("/^(\S+)\sV$/", $buffer[6], $value)) { + $dev = new SensorDevice(); + $dev->setName($buffer[4]); + $dev->setValue($value[1]); + if (isset($buffer[7]) && $buffer[7] == "Thresholds") { + if ((isset($buffer[8]) && preg_match("/^lo-crit\s(\S+)\s*$/", $buffer[8], $limits)) + ||(isset($buffer[9]) && preg_match("/^lo-crit\s(\S+)\s*$/", $buffer[9], $limits)) + ||(isset($buffer[10]) && preg_match("/^lo-crit\s(\S+)\s*$/", $buffer[10], $limits)) + ||(isset($buffer[11]) && preg_match("/^lo-crit\s(\S+)\s*$/", $buffer[11], $limits))) { + $dev->setMin($limits[1]); + } + if ((isset($buffer[8]) && preg_match("/^hi-crit\s(\S+)\s*$/", $buffer[8], $limits)) + ||(isset($buffer[9]) && preg_match("/^hi-crit\s(\S+)\s*$/", $buffer[9], $limits)) + ||(isset($buffer[10]) && preg_match("/^hi-crit\s(\S+)\s*$/", $buffer[10], $limits)) + ||(isset($buffer[11]) && preg_match("/^hi-crit\s(\S+)\s*$/", $buffer[11], $limits))) { + $dev->setMax($limits[1]); + } + } + if ($buffer[5] != "OK") $dev->setEvent($buffer[5]); + $this->mbinfo->setMbVolt($dev); + } + } + } + + /** + * get fan information + * + * @return void + */ + private function _fans() + { + foreach ($this->_lines as $line) { + $buffer = preg_split("/\s*\|\s*/", $line); + if (isset($buffer[2]) && $buffer[2] == "Fan" && $buffer[1] == "Full" && isset($buffer[6]) && preg_match("/^(\S+)\sRPM$/", $buffer[6], $value)) { + $dev = new SensorDevice(); + $dev->setName($buffer[4]); + $dev->setValue($value[1]); + if (isset($buffer[7]) && $buffer[7] == "Thresholds") { + if ((isset($buffer[8]) && preg_match("/^lo-crit\s(\S+)\s*$/", $buffer[8], $limits)) + ||(isset($buffer[9]) && preg_match("/^lo-crit\s(\S+)\s*$/", $buffer[9], $limits)) + ||(isset($buffer[10]) && preg_match("/^lo-crit\s(\S+)\s*$/", $buffer[10], $limits)) + ||(isset($buffer[11]) && preg_match("/^lo-crit\s(\S+)\s*$/", $buffer[11], $limits))) { + $dev->setMin($limits[1]); + } elseif ((isset($buffer[8]) && preg_match("/^hi-crit\s(\S+)\s*$/", $buffer[8], $limits)) + ||(isset($buffer[9]) && preg_match("/^hi-crit\s(\S+)\s*$/", $buffer[9], $limits)) + ||(isset($buffer[10]) && preg_match("/^hi-crit\s(\S+)\s*$/", $buffer[10], $limits)) + ||(isset($buffer[11]) && preg_match("/^hi-crit\s(\S+)\s*$/", $buffer[11], $limits))) { + if ($limits[1]<$value[1]) {//max instead min issue + $dev->setMin($limits[1]); + } + } + } + if ($buffer[5] != "OK") $dev->setEvent($buffer[5]); + $this->mbinfo->setMbFan($dev); + } + } + } + + /** + * get power information + * + * @return void + */ + private function _power() + { + foreach ($this->_lines as $line) { + $buffer = preg_split("/\s*\|\s*/", $line); + if (isset($buffer[2]) && $buffer[2] == "Current" && $buffer[1] == "Full" && isset($buffer[6]) && preg_match("/^(\S+)\sW$/", $buffer[6], $value)) { + $dev = new SensorDevice(); + $dev->setName($buffer[4]); + $dev->setValue($value[1]); + if (isset($buffer[7]) && $buffer[7] == "Thresholds") { + if ((isset($buffer[8]) && preg_match("/^hi-crit\s(\S+)\s*$/", $buffer[8], $limits)) + ||(isset($buffer[9]) && preg_match("/^hi-crit\s(\S+)\s*$/", $buffer[9], $limits)) + ||(isset($buffer[10]) && preg_match("/^hi-crit\s(\S+)\s*$/", $buffer[10], $limits)) + ||(isset($buffer[11]) && preg_match("/^hi-crit\s(\S+)\s*$/", $buffer[11], $limits))) { + $dev->setMax($limits[1]); + } + } + if ($buffer[5] != "OK") $dev->setEvent($buffer[5]); + $this->mbinfo->setMbPower($dev); + } + } + } + + /** + * get current information + * + * @return void + */ + private function _current() + { + foreach ($this->_lines as $line) { + $buffer = preg_split("/\s*\|\s*/", $line); + if (isset($buffer[2]) && $buffer[2] == "Current" && $buffer[1] == "Full" && isset($buffer[6]) && preg_match("/^(\S+)\sA$/", $buffer[6], $value)) { + $dev = new SensorDevice(); + $dev->setName($buffer[4]); + $dev->setValue($value[1]); + if (isset($buffer[7]) && $buffer[7] == "Thresholds") { + if ((isset($buffer[8]) && preg_match("/^hi-crit\s(\S+)\s*$/", $buffer[8], $limits)) + ||(isset($buffer[9]) && preg_match("/^hi-crit\s(\S+)\s*$/", $buffer[9], $limits)) + ||(isset($buffer[10]) && preg_match("/^hi-crit\s(\S+)\s*$/", $buffer[10], $limits)) + ||(isset($buffer[11]) && preg_match("/^hi-crit\s(\S+)\s*$/", $buffer[11], $limits))) { + $dev->setMax($limits[1]); + } + } + if ($buffer[5] != "OK") $dev->setEvent($buffer[5]); + $this->mbinfo->setMbCurrent($dev); + } + } + } + + /** + * get the information + * + * @see PSI_Interface_Sensor::build() + * + * @return Void + */ + public function build() + { + $this->_temperature(); + $this->_voltage(); + $this->_fans(); + $this->_power(); + $this->_current(); + } +} diff --git a/sources/includes/mb/class.k8temp.inc.php b/sources/includes/mb/class.k8temp.inc.php new file mode 100644 index 0000000..75623f3 --- /dev/null +++ b/sources/includes/mb/class.k8temp.inc.php @@ -0,0 +1,91 @@ + + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version SVN: $Id: class.k8temp.inc.php 661 2012-08-27 11:26:39Z namiltd $ + * @link http://phpsysinfo.sourceforge.net + */ + /** + * getting information from k8temp + * + * @category PHP + * @package PSI_Sensor + * @author Michael Cramer + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version Release: 3.0 + * @link http://phpsysinfo.sourceforge.net + */ +class K8Temp extends Sensors +{ + /** + * content to parse + * + * @var array + */ + private $_lines = array(); + + /** + * fill the private array + */ + public function __construct() + { + parent::__construct(); + switch (defined('PSI_SENSOR_K8TEMP_ACCESS')?strtolower(PSI_SENSOR_K8TEMP_ACCESS):'command') { + case 'command': + $lines = ""; + CommonFunctions::executeProgram('k8temp', '', $lines); + $this->_lines = preg_split("/\n/", $lines, -1, PREG_SPLIT_NO_EMPTY); + break; + case 'data': + if (CommonFunctions::rfts(APP_ROOT.'/data/k8temp.txt', $lines)) { + $this->_lines = preg_split("/\n/", $lines, -1, PREG_SPLIT_NO_EMPTY); + } + break; + default: + $this->error->addConfigError('__construct()', 'PSI_SENSOR_K8TEMP_ACCESS'); + break; + } + } + + /** + * get temperature information + * + * @return void + */ + private function _temperature() + { + foreach ($this->_lines as $line) { + if (preg_match('/(.*):\s*(\d*)/', $line, $data)) { + if ($data[2] > 0) { + $dev = new SensorDevice(); + $dev->setName($data[1]); +// $dev->setMax('70.0'); + if ($data[2] < 250) { + $dev->setValue($data[2]); + } + $this->mbinfo->setMbTemp($dev); + } + } + } + } + + /** + * get the information + * + * @see PSI_Interface_Sensor::build() + * + * @return Void + */ + public function build() + { + $this->_temperature(); + } +} diff --git a/sources/includes/mb/class.lmsensors.inc.php b/sources/includes/mb/class.lmsensors.inc.php new file mode 100644 index 0000000..0c831eb --- /dev/null +++ b/sources/includes/mb/class.lmsensors.inc.php @@ -0,0 +1,411 @@ + + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version SVN: $Id: class.lmsensors.inc.php 661 2012-08-27 11:26:39Z namiltd $ + * @link http://phpsysinfo.sourceforge.net + */ + /** + * getting information from lmsensor + * + * @category PHP + * @package PSI_Sensor + * @author Michael Cramer + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version Release: 3.0 + * @link http://phpsysinfo.sourceforge.net + */ +class LMSensors extends Sensors +{ + /** + * content to parse + * + * @var array + */ + private $_lines = array(); + + /** + * fill the private content var through command or data access + */ + public function __construct() + { + parent::__construct(); + switch (defined('PSI_SENSOR_LMSENSORS_ACCESS')?strtolower(PSI_SENSOR_LMSENSORS_ACCESS):'command') { + case 'command': + if (CommonFunctions::executeProgram("sensors", "", $lines)) { + // Martijn Stolk: Dirty fix for misinterpreted output of sensors, + // where info could come on next line when the label is too long. + $lines = str_replace(":\n", ":", $lines); + $lines = str_replace("\n\n", "\n", $lines); + $this->_lines = preg_split("/\n/", $lines, -1, PREG_SPLIT_NO_EMPTY); + } + break; + case 'data': + if (CommonFunctions::rfts(APP_ROOT.'/data/lmsensors.txt', $lines)) { + $lines = str_replace(":\n", ":", $lines); + $lines = str_replace("\n\n", "\n", $lines); + $this->_lines = preg_split("/\n/", $lines, -1, PREG_SPLIT_NO_EMPTY); + } + break; + default: + $this->error->addConfigError('__construct()', 'PSI_SENSOR_LMSENSORS_ACCESS'); + break; + } + } + + /** + * get temperature information + * + * @return void + */ + private function _temperature() + { + $ar_buf = array(); + foreach ($this->_lines as $line) { + $data = array(); + if (preg_match("/(.*):(.*)\((.*)=(.*),(.*)=(.*)\)(.*)/", $line, $data)) { + ; + } elseif (preg_match("/(.*):(.*)\((.*)=(.*)\)(.*)/", $line, $data)) { + ; + } else { + preg_match("/(.*):(.*)/", $line, $data); + } + if (count($data) > 1) { + $temp = substr(trim($data[2]), -1); + switch ($temp) { + case "C": +// case "F": + array_push($ar_buf, $line); + } + } + } + foreach ($ar_buf as $line) { + $data = array(); + if (preg_match("/(.*):(.*).C[ ]*\((.*)=(.*).C,(.*)=(.*).C\)(.*)\)/", $line, $data)) { + ; + } elseif (preg_match("/(.*):(.*).C[ ]*\((.*)=(.*).C,(.*)=(.*).C\)(.*)/", $line, $data)) { + ; + } elseif (preg_match("/(.*):(.*).C[ ]*\((.*)=(.*).C\)(.*)/", $line, $data)) { + ; + } elseif (preg_match("/(.*):(.*).C[ \t]+/", $line, $data)) { + ; + } else { + preg_match("/(.*):(.*).C$/", $line, $data); + } + foreach ($data as $key=>$value) { + if (preg_match("/^\+?(-?[0-9\.]+).?$/", trim($value), $newvalue)) { + $data[$key] = 0+trim($newvalue[1]); + } else { + $data[$key] = trim($value); + } + } + $dev = new SensorDevice(); + + if (strlen($data[1]) == 4) { + if ($data[1][0] == "T") { + + if ($data[1][1] == "A") { + $data[1] = $data[1] . " Ambient"; + } elseif ($data[1][1] == "C") { + $data[1] = $data[1] . " CPU"; + } elseif ($data[1][1] == "G") { + $data[1] = $data[1] . " GPU"; + } elseif ($data[1][1] == "H") { + $data[1] = $data[1] . " Harddisk"; + } elseif ($data[1][1] == "L") { + $data[1] = $data[1] . " LCD"; + } elseif ($data[1][1] == "O") { + $data[1] = $data[1] . " ODD"; + } elseif ($data[1][1] == "B") { + $data[1] = $data[1] . " Battery"; + } + + if ($data[1][3] == "H") { + $data[1] = $data[1] . " Heatsink"; + } elseif ($data[1][3] == "P") { + $data[1] = $data[1] . " Proximity"; + } elseif ($data[1][3] == "D") { + $data[1] = $data[1] . " Die"; + } + } + } + + $dev->setName($data[1]); + $dev->setValue($data[2]); + + if (isset($data[6]) && $data[2] <= $data[6]) { + $dev->setMax(max($data[4], $data[6])); + } elseif (isset($data[4]) && $data[2] <= $data[4]) { + $dev->setMax($data[4]); + } + if (preg_match("/\sALARM(\s*)$/", $line)) { + $dev->setEvent("Alarm"); + } + $this->mbinfo->setMbTemp($dev); + } + } + + /** + * get fan information + * + * @return void + */ + private function _fans() + { + $ar_buf = array(); + foreach ($this->_lines as $line) { + $data = array(); + if (preg_match("/(.*):(.*)\((.*)=(.*),(.*)=(.*)\)(.*)/", $line, $data)) { + ; + } elseif (preg_match("/(.*):(.*)\((.*)=(.*)\)(.*)/", $line, $data)) { + ; + } else { + preg_match("/(.*):(.*)/", $line, $data); + } + if (count($data) > 1) { + $temp = substr(trim($data[2]), -4); + switch ($temp) { + case " RPM": + array_push($ar_buf, $line); + } + } + } + foreach ($ar_buf as $line) { + $data = array(); + if (preg_match("/(.*):(.*) RPM[ ]*\((.*)=(.*) RPM,(.*)=(.*)\)(.*)\)/", $line, $data)) { + ; + } elseif (preg_match("/(.*):(.*) RPM[ ]*\((.*)=(.*) RPM,(.*)=(.*)\)(.*)/", $line, $data)) { + ; + } elseif (preg_match("/(.*):(.*) RPM[ ]*\((.*)=(.*) RPM\)(.*)/", $line, $data)) { + ; + } elseif (preg_match("/(.*):(.*) RPM[ \t]+/", $line, $data)) { + ; + } else { + preg_match("/(.*):(.*) RPM$/", $line, $data); + } + $dev = new SensorDevice(); + $dev->setName(trim($data[1])); + $dev->setValue(trim($data[2])); + if (isset($data[4])) { + $dev->setMin(trim($data[4])); + } + if (preg_match("/\sALARM(\s*)$/", $line)) { + $dev->setEvent("Alarm"); + } + $this->mbinfo->setMbFan($dev); + } + } + + /** + * get voltage information + * + * @return void + */ + private function _voltage() + { + $ar_buf = array(); + foreach ($this->_lines as $line) { + $data = array(); + if (preg_match("/(.*):(.*)\((.*)=(.*),(.*)=(.*)\)(.*)/", $line, $data)) { + ; + } elseif (preg_match("/(.*):(.*)\(/", $line, $data)) { + ; + } else { + preg_match("/(.*):(.*)/", $line, $data); + } + if (count($data) > 1) { + $temp = substr(trim($data[2]), -2); + switch ($temp) { + case " V": + array_push($ar_buf, $line); + } + } + } + foreach ($ar_buf as $line) { + $data = array(); + if (preg_match("/(.*):(.*) V[ ]*\((.*)=(.*) V,(.*)=(.*) V\)(.*)\)/", $line, $data)) { + ; + } elseif (preg_match("/(.*):(.*) V[ ]*\((.*)=(.*) V,(.*)=(.*) V\)(.*)/", $line, $data)) { + ; + } elseif (preg_match("/(.*):(.*) V[ \t]+/", $line, $data)) { + ; + } else { + preg_match("/(.*):(.*) V$/", $line, $data); + } + foreach ($data as $key=>$value) { + if (preg_match("/^\+?(-?[0-9\.]+)$/", trim($value), $newvalue)) { + $data[$key] = 0+trim($newvalue[1]); + } else { + $data[$key] = trim($value); + } + } + if (isset($data[1])) { + $dev = new SensorDevice(); + $dev->setName($data[1]); + $dev->setValue($data[2]); + if (isset($data[4])) { + $dev->setMin($data[4]); + } + if (isset($data[6])) { + $dev->setMax($data[6]); + } + if (preg_match("/\sALARM(\s*)$/", $line)) { + $dev->setEvent("Alarm"); + } + $this->mbinfo->setMbVolt($dev); + } + } + } + + /** + * get power information + * + * @return void + */ + private function _power() + { + $ar_buf = array(); + foreach ($this->_lines as $line) { + $data = array(); + if (preg_match("/(.*):(.*)\((.*)=(.*),(.*)=(.*)\)(.*)/", $line, $data)) { + ; + } elseif (preg_match("/(.*):(.*)\((.*)=(.*)\)(.*)/", $line, $data)) { + ; + } else { + preg_match("/(.*):(.*)/", $line, $data); + } + if (count($data) > 1) { + $temp = substr(trim($data[2]), -2); + switch ($temp) { + case " W": + array_push($ar_buf, $line); + } + } + } + foreach ($ar_buf as $line) { + $data = array(); +/* not tested yet + if (preg_match("/(.*):(.*) W[ ]*\((.*)=(.*) W,(.*)=(.*) W\)(.*)\)/", $line, $data)) { + ; + } elseif (preg_match("/(.*):(.*) W[ ]*\((.*)=(.*) W,(.*)=(.*) W\)(.*)/", $line, $data)) { + ; + } else +*/ + if (preg_match("/(.*):(.*) W[ ]*\((.*)=(.*) W\)(.*)/", $line, $data)) { + ; + } elseif (preg_match("/(.*):(.*) W[ \t]+/", $line, $data)) { + ; + } else { + preg_match("/(.*):(.*) W$/", $line, $data); + } + foreach ($data as $key=>$value) { + if (preg_match("/^\+?([0-9\.]+).?$/", trim($value), $newvalue)) { + $data[$key] = trim($newvalue[1]); + } else { + $data[$key] = trim($value); + } + } + $dev = new SensorDevice(); + $dev->setName($data[1]); + $dev->setValue($data[2]); + + if (isset($data[6]) && $data[2] <= $data[6]) { + $dev->setMax(max($data[4], $data[6])); + } elseif (isset($data[4]) && $data[2] <= $data[4]) { + $dev->setMax($data[4]); + } + if (preg_match("/\sALARM(\s*)$/", $line)) { + $dev->setEvent("Alarm"); + } + $this->mbinfo->setMbPower($dev); + } + } + + /** + * get current information + * + * @return void + */ + private function _current() + { + $ar_buf = array(); + foreach ($this->_lines as $line) { + $data = array(); + if (preg_match("/(.*):(.*)\((.*)=(.*),(.*)=(.*)\)(.*)/", $line, $data)) { + ; + } elseif (preg_match("/(.*):(.*)\((.*)=(.*)\)(.*)/", $line, $data)) { + ; + } else { + preg_match("/(.*):(.*)/", $line, $data); + } + if (count($data) > 1) { + $temp = substr(trim($data[2]), -2); + switch ($temp) { + case " A": + array_push($ar_buf, $line); + } + } + } + foreach ($ar_buf as $line) { + $data = array(); +/* not tested yet + if (preg_match("/(.*):(.*) A[ ]*\((.*)=(.*) A,(.*)=(.*) A\)(.*)\)/", $line, $data)) { + ; + } elseif (preg_match("/(.*):(.*) A[ ]*\((.*)=(.*) A,(.*)=(.*) A\)(.*)/", $line, $data)) { + ; + } else +*/ + if (preg_match("/(.*):(.*) A[ ]*\((.*)=(.*) A\)(.*)/", $line, $data)) { + ; + } elseif (preg_match("/(.*):(.*) A[ \t]+/", $line, $data)) { + ; + } else { + preg_match("/(.*):(.*) A$/", $line, $data); + } + foreach ($data as $key=>$value) { + if (preg_match("/^\+?([0-9\.]+).?$/", trim($value), $newvalue)) { + $data[$key] = trim($newvalue[1]); + } else { + $data[$key] = trim($value); + } + } + $dev = new SensorDevice(); + $dev->setName($data[1]); + $dev->setValue($data[2]); + + if (isset($data[6]) && $data[2] <= $data[6]) { + $dev->setMax(max($data[4], $data[6])); + } elseif (isset($data[4]) && $data[2] <= $data[4]) { + $dev->setMax($data[4]); + } + if (preg_match("/\sALARM(\s*)$/", $line)) { + $dev->setEvent("Alarm"); + } + $this->mbinfo->setMbCurrent($dev); + } + } + + /** + * get the information + * + * @see PSI_Interface_Sensor::build() + * + * @return Void + */ + public function build() + { + $this->_temperature(); + $this->_voltage(); + $this->_fans(); + $this->_power(); + $this->_current(); + } +} diff --git a/sources/includes/mb/class.mbm5.inc.php b/sources/includes/mb/class.mbm5.inc.php new file mode 100644 index 0000000..711b266 --- /dev/null +++ b/sources/includes/mb/class.mbm5.inc.php @@ -0,0 +1,131 @@ + + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version SVN: $Id: class.mbm5.inc.php 661 2012-08-27 11:26:39Z namiltd $ + * @link http://phpsysinfo.sourceforge.net + */ + /** + * getting information from Motherboard Monitor 5 + * information retrival through csv file + * + * @category PHP + * @package PSI_Sensor + * @author Michael Cramer + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version Release: 3.0 + * @link http://phpsysinfo.sourceforge.net + */ +class MBM5 extends Sensors +{ + /** + * array with the names of the labels + * + * @var array + */ + private $_buf_label = array(); + + /** + * array withe the values + * + * @var array + */ + private $_buf_value = array(); + + /** + * read the MBM5.csv file and fill the private arrays + */ + public function __construct() + { + parent::__construct(); + $delim = "/;/"; + CommonFunctions::rfts(APP_ROOT."/data/MBM5.csv", $buffer); + if (strpos($buffer, ";") === false) { + $delim = "/,/"; + } + $buffer = preg_split("/\n/", $buffer, -1, PREG_SPLIT_NO_EMPTY); + $this->_buf_label = preg_split($delim, substr($buffer[0], 0, -2), -1, PREG_SPLIT_NO_EMPTY); + $this->_buf_value = preg_split($delim, substr($buffer[1], 0, -2), -1, PREG_SPLIT_NO_EMPTY); + } + + /** + * get temperature information + * + * @return void + */ + private function _temperature() + { + for ($intPosi = 3; $intPosi < 6; $intPosi++) { + if ($this->_buf_value[$intPosi] == 0) { + continue; + } + preg_match("/([0-9\.])*/", str_replace(",", ".", $this->_buf_value[$intPosi]), $hits); + $dev = new SensorDevice(); + $dev->setName($this->_buf_label[$intPosi]); + $dev->setValue($hits[0]); +// $dev->setMax(70); + $this->mbinfo->setMbTemp($dev); + } + } + + /** + * get fan information + * + * @return void + */ + private function _fans() + { + for ($intPosi = 13; $intPosi < 16; $intPosi++) { + if (!isset($this->_buf_value[$intPosi])) { + continue; + } + preg_match("/([0-9\.])*/", str_replace(",", ".", $this->_buf_value[$intPosi]), $hits); + $dev = new SensorDevice(); + $dev->setName($this->_buf_label[$intPosi]); + $dev->setValue($hits[0]); +// $dev->setMin(3000); + $this->mbinfo->setMbFan($dev); + } + } + + /** + * get voltage information + * + * @return void + */ + private function _voltage() + { + for ($intPosi = 6; $intPosi < 13; $intPosi++) { + if ($this->_buf_value[$intPosi] == 0) { + continue; + } + preg_match("/([0-9\.])*/", str_replace(",", ".", $this->_buf_value[$intPosi]), $hits); + $dev = new SensorDevice(); + $dev->setName($this->_buf_label[$intPosi]); + $dev->setValue($hits[0]); + $this->mbinfo->setMbVolt($dev); + } + } + + /** + * get the information + * + * @see PSI_Interface_Sensor::build() + * + * @return Void + */ + public function build() + { + $this->_fans(); + $this->_temperature(); + $this->_voltage(); + } +} diff --git a/sources/includes/mb/class.mbmon.inc.php b/sources/includes/mb/class.mbmon.inc.php new file mode 100644 index 0000000..e32dfbf --- /dev/null +++ b/sources/includes/mb/class.mbmon.inc.php @@ -0,0 +1,143 @@ + + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version SVN: $Id: class.mbmon.inc.php 661 2012-08-27 11:26:39Z namiltd $ + * @link http://phpsysinfo.sourceforge.net + */ + /** + * getting information from mbmon + * + * @category PHP + * @package PSI_Sensor + * @author Michael Cramer + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version Release: 3.0 + * @link http://phpsysinfo.sourceforge.net + */ +class MBMon extends Sensors +{ + /** + * content to parse + * + * @var array + */ + private $_lines = array(); + + /** + * fill the private content var through tcp, command or data access + */ + public function __construct() + { + parent::__construct(); + switch (defined('PSI_SENSOR_MBMON_ACCESS')?strtolower(PSI_SENSOR_MBMON_ACCESS):'command') { + case 'tcp': + $fp = fsockopen("localhost", 411, $errno, $errstr, 5); + if ($fp) { + $lines = ""; + while (!feof($fp)) { + $lines .= fread($fp, 1024); + } + $this->_lines = preg_split("/\n/", $lines, -1, PREG_SPLIT_NO_EMPTY); + } else { + $this->error->addError("fsockopen()", $errno." ".$errstr); + } + break; + case 'command': + CommonFunctions::executeProgram('mbmon', '-c 1 -r', $lines, PSI_DEBUG); + $this->_lines = preg_split("/\n/", $lines, -1, PREG_SPLIT_NO_EMPTY); + break; + case 'data': + if (CommonFunctions::rfts(APP_ROOT.'/data/mbmon.txt', $lines)) { + $this->_lines = preg_split("/\n/", $lines, -1, PREG_SPLIT_NO_EMPTY); + } + break; + default: + $this->error->addConfigError('__construct()', 'PSI_SENSOR_MBMON_ACCESS'); + break; + } + } + + /** + * get temperature information + * + * @return void + */ + private function _temperature() + { + foreach ($this->_lines as $line) { + if (preg_match('/^(TEMP\d*)\s*:\s*(.*)$/D', $line, $data)) { + if ($data[2] <> '0') { + $dev = new SensorDevice(); + $dev->setName($data[1]); +// $dev->setMax(70); + if ($data[2] < 250) { + $dev->setValue($data[2]); + } + $this->mbinfo->setMbTemp($dev); + } + } + } + } + + /** + * get fan information + * + * @return void + */ + private function _fans() + { + foreach ($this->_lines as $line) { + if (preg_match('/^(FAN\d*)\s*:\s*(.*)$/D', $line, $data)) { + if ($data[2] <> '0') { + $dev = new SensorDevice(); + $dev->setName($data[1]); + $dev->setValue($data[2]); +// $dev->setMax(3000); + $this->mbinfo->setMbFan($dev); + } + } + } + } + + /** + * get voltage information + * + * @return void + */ + private function _voltage() + { + foreach ($this->_lines as $line) { + if (preg_match('/^(V.*)\s*:\s*(.*)$/D', $line, $data)) { + if ($data[2] <> '+0.00') { + $dev = new SensorDevice(); + $dev->setName($data[1]); + $dev->setValue($data[2]); + $this->mbinfo->setMbVolt($dev); + } + } + } + } + + /** + * get the information + * + * @see PSI_Interface_Sensor::build() + * + * @return void + */ + public function build() + { + $this->_temperature(); + $this->_voltage(); + $this->_fans(); + } +} diff --git a/sources/includes/mb/class.ohm.inc.php b/sources/includes/mb/class.ohm.inc.php new file mode 100644 index 0000000..baed9bb --- /dev/null +++ b/sources/includes/mb/class.ohm.inc.php @@ -0,0 +1,145 @@ + + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version SVN: $Id: class.ohm.inc.php 661 2012-08-27 11:26:39Z namiltd $ + * @link http://phpsysinfo.sourceforge.net + */ + /** + * getting information from Open Hardware Monitor + * + * @category PHP + * @package PSI_Sensor + * @author Michael Cramer + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version Release: 3.0 + * @link http://phpsysinfo.sourceforge.net + */ +class OHM extends Sensors +{ +/** + * holds the COM object that we pull all the WMI data from + * + * @var Object + */ + private $_buf = array(); + + /** + * fill the private content var + */ + public function __construct() + { + parent::__construct(); + $_wmi = null; + // don't set this params for local connection, it will not work + $strHostname = ''; + $strUser = ''; + $strPassword = ''; + try { + // initialize the wmi object + $objLocator = new COM('WbemScripting.SWbemLocator'); + if ($strHostname == "") { + $_wmi = $objLocator->ConnectServer($strHostname, 'root\OpenHardwareMonitor'); + + } else { + $_wmi = $objLocator->ConnectServer($strHostname, 'root\OpenHardwareMonitor', $strHostname.'\\'.$strUser, $strPassword); + } + } catch (Exception $e) { + $this->error->addError("WMI connect error", "PhpSysInfo can not connect to the WMI interface for OpenHardwareMonitor data."); + } + if ($_wmi) { + $this->_buf = CommonFunctions::getWMI($_wmi, 'Sensor', array('Parent', 'Name', 'SensorType', 'Value')); + } + } + + /** + * get temperature information + * + * @return void + */ + private function _temperature() + { + if ($this->_buf) foreach ($this->_buf as $buffer) { + if ($buffer['SensorType'] == "Temperature") { + $dev = new SensorDevice(); + $dev->setName($buffer['Parent'].' '.$buffer['Name']); + $dev->setValue($buffer['Value']); + $this->mbinfo->setMbTemp($dev); + } + } + } + + /** + * get voltage information + * + * @return void + */ + private function _voltage() + { + if ($this->_buf) foreach ($this->_buf as $buffer) { + if ($buffer['SensorType'] == "Voltage") { + $dev = new SensorDevice(); + $dev->setName($buffer['Parent'].' '.$buffer['Name']); + $dev->setValue($buffer['Value']); + $this->mbinfo->setMbVolt($dev); + } + } + } + + /** + * get fan information + * + * @return void + */ + private function _fans() + { + if ($this->_buf) foreach ($this->_buf as $buffer) { + if ($buffer['SensorType'] == "Fan") { + $dev = new SensorDevice(); + $dev->setName($buffer['Parent'].' '.$buffer['Name']); + $dev->setValue($buffer['Value']); + $this->mbinfo->setMbFan($dev); + } + } + } + + /** + * get power information + * + * @return void + */ + private function _power() + { + if ($this->_buf) foreach ($this->_buf as $buffer) { + if ($buffer['SensorType'] == "Power") { + $dev = new SensorDevice(); + $dev->setName($buffer['Parent'].' '.$buffer['Name']); + $dev->setValue($buffer['Value']); + $this->mbinfo->setMbPower($dev); + } + } + } + + /** + * get the information + * + * @see PSI_Interface_Sensor::build() + * + * @return Void + */ + public function build() + { + $this->_temperature(); + $this->_voltage(); + $this->_fans(); + $this->_power(); + } +} diff --git a/sources/includes/mb/class.pitemp.inc.php b/sources/includes/mb/class.pitemp.inc.php new file mode 100644 index 0000000..1455ad5 --- /dev/null +++ b/sources/includes/mb/class.pitemp.inc.php @@ -0,0 +1,62 @@ + + * @copyright 2012 Marc Hillesheim + * @link http://pi.no-ip.biz + */ +class PiTemp extends Sensors +{ + private function _temperature() + { + $temp = null; + $temp_max = null; + if (!CommonFunctions::rfts('/sys/devices/platform/sunxi-i2c.0/i2c-0/0-0034/temp1_input', $temp, 0, 4096, false)) { // Not Banana Pi + CommonFunctions::rfts('/sys/class/thermal/thermal_zone0/temp', $temp); + CommonFunctions::rfts('/sys/class/thermal/thermal_zone0/trip_point_0_temp', $temp_max, 0, 4096, PSI_DEBUG); + } + if (!is_null($temp) && (trim($temp) != "")) { + $dev = new SensorDevice(); + $dev->setName("CPU 1"); + $dev->setValue($temp / 1000); + if (!is_null($temp_max) && (trim($temp_max) != "") && ($temp_max > 0)) { + $dev->setMax($temp_max / 1000); + } + $this->mbinfo->setMbTemp($dev); + } + } + + private function _voltage() + { + $volt = null; + if (CommonFunctions::rfts('/sys/devices/platform/sunxi-i2c.0/i2c-0/0-0034/axp20-supplyer.28/power_supply/ac/voltage_now', $volt, 0, 4096, false) && !is_null($volt) && (trim($volt) != "")) { // Banana Pi + $dev = new SensorDevice(); + $dev->setName("Voltage 1"); + $dev->setValue($volt / 1000000); + $this->mbinfo->setMbVolt($dev); + } + } + + private function _current() + { + $current = null; + if (CommonFunctions::rfts('/sys/devices/platform/sunxi-i2c.0/i2c-0/0-0034/axp20-supplyer.28/power_supply/ac/current_now', $current, 0, 4096, false) && !is_null($current) && (trim($current) != "")) { // Banana Pi + $dev = new SensorDevice(); + $dev->setName("Current 1"); + $dev->setValue($current / 1000000); + $this->mbinfo->setMbCurrent($dev); + } + } + + public function build() + { + $this->_temperature(); + $this->_voltage(); + $this->_current(); + } +} diff --git a/sources/includes/mb/class.qtssnmp.inc.php b/sources/includes/mb/class.qtssnmp.inc.php new file mode 100644 index 0000000..2e4f2db --- /dev/null +++ b/sources/includes/mb/class.qtssnmp.inc.php @@ -0,0 +1,93 @@ + + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version SVN: $Id: class.qtssnmp.inc.php 661 2012-08-27 11:26:39Z namiltd $ + * @link http://phpsysinfo.sourceforge.net + */ + /** + * getting hardware temperature information through snmpwalk + * + * @category PHP + * @package PSI_Sensor + * @author Michael Cramer + * @author William Johansson + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version Release: 3.0 + * @link http://phpsysinfo.sourceforge.net + */ +class QTSsnmp extends Sensors +{ + /** + * get temperature information + * + * @return void + */ + private function _temperature() + { + if (CommonFunctions::executeProgram("/Apps/opt/bin/snmpwalk", "-Ona -c public -v 1 -r 1 127.0.0.1 .1.3.6.1.4.1.24681.1.2.5.0", $buffer, PSI_DEBUG) + && preg_match('/^[\.\d]+ = STRING:\s\"?(\d+)\sC/', $buffer, $data)) { + $dev = new SensorDevice(); + $dev->setName("CPU"); + $dev->setValue($data[1]); + $this->mbinfo->setMbTemp($dev); + } + + if (CommonFunctions::executeProgram("/Apps/opt/bin/snmpwalk", "-Ona -c public -v 1 -r 1 127.0.0.1 .1.3.6.1.4.1.24681.1.2.6.0", $buffer, PSI_DEBUG) + && preg_match('/^[\.\d]+ = STRING:\s\"?(\d+)\sC/', $buffer, $data)) { + $dev = new SensorDevice(); + $dev->setName("System"); + $dev->setValue($data[1]); + $this->mbinfo->setMbTemp($dev); + } + + if (CommonFunctions::executeProgram("/Apps/opt/bin/snmpwalk", "-Ona -c public -v 1 -r 1 127.0.0.1 .1.3.6.1.4.1.24681.1.2.11.1.3", $buffer, PSI_DEBUG)) { + $lines = preg_split('/\r?\n/', $buffer); + foreach ($lines as $line) if (preg_match('/^[\.\d]+\.(\d+) = STRING:\s\"?(\d+)\sC/', $line, $data)) { + $dev = new SensorDevice(); + $dev->setName("HDD ".$data[1]); + $dev->setValue($data[2]); + $this->mbinfo->setMbTemp($dev); + } + } + } + + /** + * get fan information + * + * @return void + */ + private function _fans() + { + if (CommonFunctions::executeProgram("/Apps/opt/bin/snmpwalk", "-Ona -c public -v 1 -r 1 127.0.0.1 .1.3.6.1.4.1.24681.1.2.15.1.3", $buffer, PSI_DEBUG)) { + $lines = preg_split('/\r?\n/', $buffer); + foreach ($lines as $line) if (preg_match('/^[\.\d]+\.(\d+) = STRING:\s\"?(\d+)\sRPM/', $line, $data)) { + $dev = new SensorDevice(); + $dev->setName("Fan ".$data[1]); + $dev->setValue($data[2]); + $this->mbinfo->setMbFan($dev); + } + } + } + + /** + * get the information + * + * @see PSI_Interface_Sensor::build() + * + * @return Void + */ + public function build() + { + $this->_temperature(); + $this->_fans(); + } +} diff --git a/sources/includes/mb/class.sensors.inc.php b/sources/includes/mb/class.sensors.inc.php new file mode 100644 index 0000000..bd90ce4 --- /dev/null +++ b/sources/includes/mb/class.sensors.inc.php @@ -0,0 +1,64 @@ + + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version SVN: $Id: class.sensors.inc.php 661 2012-08-27 11:26:39Z namiltd $ + * @link http://phpsysinfo.sourceforge.net + */ + /** + * Basic OS functions for all OS classes + * + * @category PHP + * @package PSI sensors class + * @author Michael Cramer + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version Release: 3.0 + * @link http://phpsysinfo.sourceforge.net + */ +abstract class Sensors implements PSI_Interface_Sensor +{ + /** + * object for error handling + * + * @var Error + */ + protected $error; + + /** + * object for the information + * + * @var MBInfo + */ + protected $mbinfo; + + /** + * build the global Error object + */ + public function __construct() + { + $this->error = PSI_Error::singleton(); + $this->mbinfo = new MBInfo(); + } + + /** + * get the filled or unfilled (with default values) MBInfo object + * + * @see PSI_Interface_Sensor::getMBInfo() + * + * @return MBInfo + */ + final public function getMBInfo() + { + $this->build(); + + return $this->mbinfo; + } +} diff --git a/sources/includes/mb/class.speedfan.inc.php b/sources/includes/mb/class.speedfan.inc.php new file mode 100644 index 0000000..6f9460f --- /dev/null +++ b/sources/includes/mb/class.speedfan.inc.php @@ -0,0 +1,138 @@ + + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version SVN: $Id: class.qtssnmp.inc.php 661 2012-08-27 11:26:39Z namiltd $ + * @link http://phpsysinfo.sourceforge.net + */ + /** + * getting hardware temperature information through snmpwalk + * + * @category PHP + * @package PSI_Sensor + * @author Michael Cramer + * @author William Johansson + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version Release: 3.0 + * @link http://phpsysinfo.sourceforge.net + */ +class SpeedFan extends Sensors +{ + /* + * variable, which holds the content of the command + * @var array + */ + private $_filecontent = array(); + + public function __construct() + { + parent::__construct(); + switch (defined('PSI_SENSOR_SPEEDFAN_ACCESS')?strtolower(PSI_SENSOR_SPEEDFAN_ACCESS):'command') { + case 'command': + if (CommonFunctions::executeProgram("SpeedFanGet.exe", "", $buffer, PSI_DEBUG) && (strlen($buffer) > 0)) { + if (preg_match("/^Temperatures:\s+(.+)$/m", $buffer, $out)) { + $this->_filecontent["temp"] = $out[1]; + } + if (preg_match("/^Fans:\s+(.+)$/m", $buffer, $out)) { + $this->_filecontent["fans"] = $out[1]; + } + if (preg_match("/^Voltages:\s+(.+)$/m", $buffer, $out)) { + $this->_filecontent["volt"] = $out[1]; + } + } + break; + case 'data': + if (CommonFunctions::rfts(APP_ROOT.'/data/speedfan.txt', $buffer) && (strlen($buffer) > 0)) { + if (preg_match("/^Temperatures:\s+(.+)$/m", $buffer, $out)) { + $this->_filecontent["temp"] = $out[1]; + } + if (preg_match("/^Fans:\s+(.+)$/m", $buffer, $out)) { + $this->_filecontent["fans"] = $out[1]; + } + if (preg_match("/^Voltages:\s+(.+)$/m", $buffer, $out)) { + $this->_filecontent["volt"] = $out[1]; + } + } + break; + default: + $this->error->addConfigError('__construct()', 'PSI_SENSOR_SPEEDFAN_ACCESS'); + break; + } + } + + /** + * get temperature information + * + * @return void + */ + private function _temperature() + { + if (isset($this->_filecontent["temp"]) && (trim($this->_filecontent["temp"]) !== "")) { + $values = preg_split("/ /", trim($this->_filecontent["temp"])); + foreach ($values as $id=>$value) { + $dev = new SensorDevice(); + $dev->setName("temp".$id); + $dev->setValue($value); + $this->mbinfo->setMbTemp($dev); + } + } + } + + /** + * get fan information + * + * @return void + */ + private function _fans() + { + if (isset($this->_filecontent["fans"]) && (trim($this->_filecontent["fans"]) !== "")) { + $values = preg_split("/ /", trim($this->_filecontent["fans"])); + foreach ($values as $id=>$value) { + $dev = new SensorDevice(); + $dev->setName("fan".$id); + $dev->setValue($value); + $this->mbinfo->setMbFan($dev); + } + } + } + + /** + * get voltage information + * + * @return void + */ + private function _voltage() + { + if (isset($this->_filecontent["volt"]) && (trim($this->_filecontent["volt"]) !== "")) { + $values = preg_split("/ /", trim($this->_filecontent["volt"])); + foreach ($values as $id=>$value) { + $dev = new SensorDevice(); + $dev->setName("in".$id); + $dev->setValue($value); + $this->mbinfo->setMbVolt($dev); + } + } + } + + /** + * get the information + * + * @see PSI_Interface_Sensor::build() + * + * @return Void + */ + public function build() + { + $this->_temperature(); + $this->_fans(); + $this->_voltage(); + } +} diff --git a/sources/includes/mb/class.thermalzone.inc.php b/sources/includes/mb/class.thermalzone.inc.php new file mode 100644 index 0000000..27b6370 --- /dev/null +++ b/sources/includes/mb/class.thermalzone.inc.php @@ -0,0 +1,151 @@ + + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version SVN: $Id: class.ohm.inc.php 661 2012-08-27 11:26:39Z namiltd $ + * @link http://phpsysinfo.sourceforge.net + */ + /** + * getting information from Thermal Zone WMI class + * + * @category PHP + * @package PSI_Sensor + * @author Michael Cramer + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version Release: 3.0 + * @link http://phpsysinfo.sourceforge.net + */ +class ThermalZone extends Sensors +{ +/** + * holds the COM object that we pull all the WMI data from + * + * @var Object + */ + private $_buf = array(); + + /** + * fill the private content var + */ + public function __construct() + { + parent::__construct(); + if (PSI_OS == 'WINNT') { + $_wmi = null; + // don't set this params for local connection, it will not work + $strHostname = ''; + $strUser = ''; + $strPassword = ''; + try { + // initialize the wmi object + $objLocator = new COM('WbemScripting.SWbemLocator'); + if ($strHostname == "") { + $_wmi = $objLocator->ConnectServer($strHostname, 'root\WMI'); + + } else { + $_wmi = $objLocator->ConnectServer($strHostname, 'root\WMI', $strHostname.'\\'.$strUser, $strPassword); + } + } catch (Exception $e) { + $this->error->addError("WMI connect error", "PhpSysInfo can not connect to the WMI interface for ThermalZone data."); + } + if ($_wmi) { + $this->_buf = CommonFunctions::getWMI($_wmi, 'MSAcpi_ThermalZoneTemperature', array('InstanceName', 'CriticalTripPoint', 'CurrentTemperature')); + } + } + } + + /** + * get temperature information + * + * @return void + */ + private function _temperature() + { + if (PSI_OS == 'WINNT') { + if ($this->_buf) foreach ($this->_buf as $buffer) { + if (isset($buffer['CurrentTemperature']) && (($value = ($buffer['CurrentTemperature'] - 2732)/10) > -100)) { + $dev = new SensorDevice(); + if (isset($buffer['InstanceName']) && preg_match("/([^\\\\ ]+)$/", $buffer['InstanceName'], $outbuf)) { + $dev->setName('ThermalZone '.$outbuf[1]); + } else { + $dev->setName('ThermalZone THM0_0'); + } + $dev->setValue($value); + if (isset($buffer['CriticalTripPoint']) && (($maxvalue = ($buffer['CriticalTripPoint'] - 2732)/10) > 0)) { + $dev->setMax($maxvalue); + } + $this->mbinfo->setMbTemp($dev); + } + } + } else { + $notwas = true; + foreach (glob('/sys/class/thermal/thermal_zone*/') as $thermalzone) { + $thermalzonetemp = $thermalzone.'temp'; + $temp = null; + if (CommonFunctions::rfts($thermalzonetemp, $temp, 0, 4096, false) && !is_null($temp) && (trim($temp) != "")) { + if ($temp >= 1000) { + $temp = $temp / 1000; + } + + if ($temp > -40) { + $dev = new SensorDevice(); + $dev->setValue($temp); + + $temp_type = null; + if (CommonFunctions::rfts($thermalzone.'type', $temp_type, 0, 4096, false) && !is_null($temp_type) && (trim($temp_type) != "")) { + $dev->setName($temp_type); + } else { + $dev->setName("ThermalZone"); + } + + $temp_max = null; + if (CommonFunctions::rfts($thermalzone.'trip_point_0_temp', $temp_max, 0, 4096, false) && !is_null($temp_max) && (trim($temp_max) != "") && ($temp_max > 0)) { + if ($temp_max >= 1000) { + $temp_max = $temp_max / 1000; + } + $dev->setMax($temp_max); + } + + $notwas = false; + $this->mbinfo->setMbTemp($dev); + } + } + } + if ($notwas) { + foreach (glob('/proc/acpi/thermal_zone/TH*/temperature') as $thermalzone) { + $temp = null; + if (CommonFunctions::rfts($thermalzone, $temp, 1, 4096, false) && !is_null($temp) && (trim($temp) != "")) { + $dev = new SensorDevice(); + if (preg_match("/^\/proc\/acpi\/thermal_zone\/(.+)\/temperature$/", $thermalzone, $name)) { + $dev->setName("ThermalZone ".$name[1]); + } else { + $dev->setName("ThermalZone"); + } + $dev->setValue(trim(substr($temp, 23, 4))); + $this->mbinfo->setMbTemp($dev); + } + } + } + } + } + + /** + * get the information + * + * @see PSI_Interface_Sensor::build() + * + * @return Void + */ + public function build() + { + $this->_temperature(); + } +} diff --git a/sources/includes/os/class.AIX.inc.php b/sources/includes/os/class.AIX.inc.php new file mode 100644 index 0000000..af3b2fb --- /dev/null +++ b/sources/includes/os/class.AIX.inc.php @@ -0,0 +1,352 @@ + + * @copyright 2011 Krzysztof Paz + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version SVN: $Id: class.AIX.inc.php 287 2009-06-26 12:11:59Z Krzysztof Paz, IBM POLSKA + * @link http://phpsysinfo.sourceforge.net + */ +/** +* IBM AIX sysinfo class +* get all the required information from IBM AIX system +* +* @category PHP +* @package PSI AIX OS class +* @author Krzysztof Paz (kpaz@gazeta.pl) based on Michael Cramer +* @copyright 2011 Krzysztof Paz +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License +* @version Release: 3.0 +* @link http://phpsysinfo.sourceforge.net +*/ +class AIX extends OS +{ + + private $_aixdata = array(); + + /** + * Virtual Host Name + * @return void + */ + private function _hostname() + { + /* if (PSI_USE_VHOST === true) { + $this->sys->setHostname(getenv('SERVER_NAME')); + } else { + if (CommonFunctions::executeProgram('hostname', '', $ret)) { + $this->sys->setHostname($ret); + } + } */ + $this->sys->setHostname(getenv('SERVER_NAME')); + + } + + /** + * IBM AIX Version + * @return void + */ + private function _kernel() + { + if (CommonFunctions::executeProgram('oslevel', '', $ret1) && CommonFunctions::executeProgram('oslevel', '-s', $ret2)) { + $this->sys->setKernel($ret1 . ' (' . $ret2 . ')'); + } + } + + /** + * UpTime + * time the system is running + * @return void + */ + private function _uptime() + { + if (CommonFunctions::executeProgram('uptime', '', $buf)) { + if (preg_match("/up (\d+) days,\s*(\d+):(\d+),/", $buf, $ar_buf) || preg_match("/up (\d+) day,\s*(\d+):(\d+),/", $buf, $ar_buf)) { + $min = $ar_buf[3]; + $hours = $ar_buf[2]; + $days = $ar_buf[1]; + $this->sys->setUptime($days * 86400 + $hours * 3600 + $min * 60); + } + } + } + + /** + * Processor Load + * optionally create a loadbar + * @return void + */ + private function _loadavg() + { + if (CommonFunctions::executeProgram('uptime', '', $buf)) { + if (preg_match("/average: (.*), (.*), (.*)$/", $buf, $ar_buf)) { + $this->sys->setLoad($ar_buf[1].' '.$ar_buf[2].' '.$ar_buf[3]); + } + } + } + + /** + * CPU information + * All of the tags here are highly architecture dependant + * @return void + */ + private function _cpuinfo() + { + $ncpu = 0; + $tcpu = ""; + $vcpu = ""; + $ccpu = ""; + $scpu = ""; + foreach ($this->readaixdata() as $line) { + if (preg_match("/^Number Of Processors:\s+(\d+)/", $line, $ar_buf)) { + $ncpu = $ar_buf[1]; + } + if (preg_match("/^Processor Type:\s+(.+)/", $line, $ar_buf)) { + $tcpu = $ar_buf[1]; + } + if (preg_match("/^Processor Version:\s+(.+)/", $line, $ar_buf)) { + $vcpu = $ar_buf[1]; + } + if (preg_match("/^CPU Type:\s+(.+)/", $line, $ar_buf)) { + $ccpu = $ar_buf[1]; + } + if (preg_match("/^Processor Clock Speed:\s+(\d+)\s/", $line, $ar_buf)) { + $scpu = $ar_buf[1]; + } + } + for ($i = 0; $i < $ncpu; $i++) { + $dev = new CpuDevice(); + if (trim($tcpu) != "") { + $cpu = trim($tcpu); + if (trim($vcpu) != "") $cpu .= " ".trim($vcpu); + if (trim($ccpu) != "") $cpu .= " ".trim($ccpu); + $dev->setModel($cpu); + } + if (trim($scpu) != "") { + $dev->setCpuSpeed(trim($scpu)); + } + $this->sys->setCpus($dev); + } + } + + /** + * PCI devices + * @return void + */ + private function _pci() + { + foreach ($this->readaixdata() as $line) { + if (preg_match("/^[\*\+]\s\S+\s+\S+\s+(.*PCI.*)/", $line, $ar_buf)) { + $dev = new HWDevice(); + $dev->setName(trim($ar_buf[1])); + $this->sys->setPciDevices($dev); + } + } + } + + /** + * IDE devices + * @return void + */ + private function _ide() + { + foreach ($this->readaixdata() as $line) { + if (preg_match("/^[\*\+]\s\S+\s+\S+\s+(.*IDE.*)/", $line, $ar_buf)) { + $dev = new HWDevice(); + $dev->setName(trim($ar_buf[1])); + $this->sys->setIdeDevices($dev); + } + } + } + + /** + * SCSI devices + * @return void + */ + private function _scsi() + { + foreach ($this->readaixdata() as $line) { + if (preg_match("/^[\*\+]\s\S+\s+\S+\s+(.*SCSI.*)/", $line, $ar_buf)) { + $dev = new HWDevice(); + $dev->setName(trim($ar_buf[1])); + $this->sys->setScsiDevices($dev); + } + } + } + + /** + * USB devices + * @return void + */ + private function _usb() + { + foreach ($this->readaixdata() as $line) { + if (preg_match("/^[\*\+]\s\S+\s+\S+\s+(.*USB.*)/", $line, $ar_buf)) { + $dev = new HWDevice(); + $dev->setName(trim($ar_buf[1])); + $this->sys->setUsbDevices($dev); + } + } + } + + /** + * Network devices + * includes also rx/tx bytes + * @return void + */ + private function _network() + { + if (CommonFunctions::executeProgram('netstat', '-ni | tail -n +2', $netstat)) { + $lines = preg_split("/\n/", $netstat, -1, PREG_SPLIT_NO_EMPTY); + foreach ($lines as $line) { + $ar_buf = preg_split("/\s+/", $line); + if (! empty($ar_buf[0]) && ! empty($ar_buf[3])) { + $dev = new NetDevice(); + $dev->setName($ar_buf[0]); + $dev->setRxBytes($ar_buf[4]); + $dev->setTxBytes($ar_buf[6]); + $dev->setErrors($ar_buf[5] + $ar_buf[7]); + //$dev->setDrops($ar_buf[8]); + $this->sys->setNetDevices($dev); + } + } + } + } + + /** + * Physical memory information and Swap Space information + * @return void + */ + private function _memory() + { + $mems = ""; + $tswap = ""; + $pswap = ""; + foreach ($this->readaixdata() as $line) { + if (preg_match("/^Good Memory Size:\s+(\d+)\s+MB/", $line, $ar_buf)) { + $mems = $ar_buf[1]; + } + if (preg_match("/^\s*Total Paging Space:\s+(\d+)MB/", $line, $ar_buf)) { + $tswap = $ar_buf[1]; + } + if (preg_match("/^\s*Percent Used:\s+(\d+)%/", $line, $ar_buf)) { + $pswap = $ar_buf[1]; + } + } + if (trim($mems) != "") { + $mems = $mems*1024*1024; + $this->sys->setMemTotal($mems); + $memu = 0; + $memf = 0; + if (CommonFunctions::executeProgram('svmon', '-G', $buf)) { + if (preg_match("/^memory\s+\d+\s+(\d+)\s+/", $buf, $ar_buf)) { + $memu = $ar_buf[1]*1024*4; + $memf = $mems - $memu; + } + } + $this->sys->setMemUsed($memu); + $this->sys->setMemFree($memf); +// $this->sys->setMemApplication($mems); +// $this->sys->setMemBuffer($mems); +// $this->sys->setMemCache($mems); + } + if (trim($tswap) != "") { + $dev = new DiskDevice(); + $dev->setName("SWAP"); + $dev->setFsType('swap'); + $dev->setTotal($tswap * 1024 * 1024); + if (trim($pswap) != "") { + $dev->setUsed($dev->getTotal() * $pswap / 100); + } + $dev->setFree($dev->getTotal() - $dev->getUsed()); + $this->sys->setSwapDevices($dev); + } + } + + /** + * filesystem information + * + * @return void + */ + private function _filesystems() + { + if (CommonFunctions::executeProgram('df', '-kP', $df, PSI_DEBUG)) { + $mounts = preg_split("/\n/", $df, -1, PREG_SPLIT_NO_EMPTY); + if (CommonFunctions::executeProgram('mount', '-v', $s, PSI_DEBUG)) { + $lines = preg_split("/\n/", $s, -1, PREG_SPLIT_NO_EMPTY); + while (list(, $line) = each($lines)) { + $a = preg_split('/ /', $line, -1, PREG_SPLIT_NO_EMPTY); + $fsdev[$a[0]] = $a[4]; + } + } + foreach ($mounts as $mount) { + $ar_buf = preg_split("/\s+/", $mount, 6); + $dev = new DiskDevice(); + $dev->setName($ar_buf[0]); + $dev->setTotal($ar_buf[1] * 1024); + $dev->setUsed($ar_buf[2] * 1024); + $dev->setFree($ar_buf[3] * 1024); + $dev->setMountPoint($ar_buf[5]); + if (isset($fsdev[$ar_buf[0]])) { + $dev->setFsType($fsdev[$ar_buf[0]]); + } + $this->sys->setDiskDevices($dev); + } + } + } + + /** + * Distribution + * + * @return void + */ + private function _distro() + { + $this->sys->setDistribution('IBM AIX'); + $this->sys->setDistributionIcon('AIX.png'); + } + + /** + * IBM AIX informations by K.PAZ + * @return void + */ + private function readaixdata() + { + if (count($this->_aixdata) === 0) { + if (CommonFunctions::executeProgram('prtconf', '', $bufr)) { + $this->_aixdata = preg_split("/\n/", $bufr, -1, PREG_SPLIT_NO_EMPTY); + } + } + + return $this->_aixdata; + } + + /** + * get the information + * + * @see PSI_Interface_OS::build() + * + * @return Void + */ + public function build() + { + $this->error->addError("WARN", "The AIX version of phpSysInfo is a work in progress, some things currently don't work"); + $this->_distro(); + $this->_hostname(); + $this->_kernel(); + $this->_uptime(); + $this->_users(); + $this->_loadavg(); + $this->_cpuinfo(); + $this->_pci(); + $this->_ide(); + $this->_scsi(); + $this->_usb(); + $this->_network(); + $this->_memory(); + $this->_filesystems(); + } +} diff --git a/sources/includes/os/class.Android.inc.php b/sources/includes/os/class.Android.inc.php new file mode 100644 index 0000000..63c1ed1 --- /dev/null +++ b/sources/includes/os/class.Android.inc.php @@ -0,0 +1,253 @@ + + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version SVN: $Id: class.Linux.inc.php 712 2012-12-05 14:09:18Z namiltd $ + * @link http://phpsysinfo.sourceforge.net + */ + /** + * Android sysinfo class + * get all the required information from Android system + * + * @category PHP + * @package PSI Android OS class + * @author Michael Cramer + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version Release: 3.0 + * @link http://phpsysinfo.sourceforge.net + */ +class Android extends Linux +{ + /** + * call parent constructor + */ + public function __construct() + { + parent::__construct(); + } + + /** + * Kernel Version + * + * @return void + */ + private function _kernel() + { + if (CommonFunctions::rfts('/proc/version', $strBuf, 1)) { + if (preg_match('/version (.*?) /', $strBuf, $ar_buf)) { + $result = $ar_buf[1]; + if (preg_match('/SMP/', $strBuf)) { + $result .= ' (SMP)'; + } + $this->sys->setKernel($result); + } + } + } + + /** + * Number of Users + * + * @return void + */ + protected function _users() + { + $this->sys->setUsers(1); + } + + /** + * filesystem information + * + * @return void + */ + private function _filesystems() + { + if (CommonFunctions::executeProgram('df', '2>/dev/null ', $df, PSI_DEBUG)) { + $df = preg_split("/\n/", $df, -1, PREG_SPLIT_NO_EMPTY); + if (CommonFunctions::executeProgram('mount', '', $mount, PSI_DEBUG)) { + $mount = preg_split("/\n/", $mount, -1, PREG_SPLIT_NO_EMPTY); + foreach ($mount as $mount_line) { + $mount_buf = preg_split('/\s+/', $mount_line); + if (count($mount_buf) == 6) { + $mount_parm[$mount_buf[1]]['fstype'] = $mount_buf[2]; + if (PSI_SHOW_MOUNT_OPTION) $mount_parm[$mount_buf[1]]['options'] = $mount_buf[3]; + $mount_parm[$mount_buf[1]]['mountdev'] = $mount_buf[0]; + } + } + foreach ($df as $df_line) { + if ((preg_match("/^(\/\S+)(\s+)(([0-9\.]+)([KMGT])(\s+)([0-9\.]+)([KMGT])(\s+)([0-9\.]+)([KMGT])(\s+))/", $df_line, $df_buf) + || preg_match("/^(\/[^\s\:]+)\:(\s+)(([0-9\.]+)([KMGT])(\s+total\,\s+)([0-9\.]+)([KMGT])(\s+used\,\s+)([0-9\.]+)([KMGT])(\s+available))/", $df_line, $df_buf)) + && !preg_match('/^\/mnt\/asec\/com\./', $df_buf[1])) { + $dev = new DiskDevice(); + if (PSI_SHOW_MOUNT_POINT) $dev->setMountPoint($df_buf[1]); + + if ($df_buf[5] == 'K') $dev->setTotal($df_buf[4] * 1024); + elseif ($df_buf[5] == 'M') $dev->setTotal($df_buf[4] * 1024*1024); + elseif ($df_buf[5] == 'G') $dev->setTotal($df_buf[4] * 1024*1024*1024); + elseif ($df_buf[5] == 'T') $dev->setTotal($df_buf[4] * 1024*1024*1024*1024); + + if ($df_buf[8] == 'K') $dev->setUsed($df_buf[7] * 1024); + elseif ($df_buf[8] == 'M') $dev->setUsed($df_buf[7] * 1024*1024); + elseif ($df_buf[8] == 'G') $dev->setUsed($df_buf[7] * 1024*1024*1024); + elseif ($df_buf[8] == 'T') $dev->setUsed($df_buf[7] * 1024*1024*1024*1024); + + if ($df_buf[11] == 'K') $dev->setFree($df_buf[10] * 1024); + elseif ($df_buf[11] == 'M') $dev->setFree($df_buf[10] * 1024*1024); + elseif ($df_buf[11] == 'G') $dev->setFree($df_buf[10] * 1024*1024*1024); + elseif ($df_buf[11] == 'T') $dev->setFree($df_buf[10] * 1024*1024*1024*1024); + + if (isset($mount_parm[$df_buf[1]])) { + $dev->setFsType($mount_parm[$df_buf[1]]['fstype']); + $dev->setName($mount_parm[$df_buf[1]]['mountdev']); + + if (PSI_SHOW_MOUNT_OPTION) { + if (PSI_SHOW_MOUNT_CREDENTIALS) { + $dev->setOptions($mount_parm[$df_buf[1]]['options']); + } else { + $mpo=$mount_parm[$df_buf[1]]['options']; + + $mpo=preg_replace('/(^guest,)|(^guest$)|(,guest$)/i', '', $mpo); + $mpo=preg_replace('/,guest,/i', ',', $mpo); + + $mpo=preg_replace('/(^user=[^,]*,)|(^user=[^,]*$)|(,user=[^,]*$)/i', '', $mpo); + $mpo=preg_replace('/,user=[^,]*,/i', ',', $mpo); + + $mpo=preg_replace('/(^username=[^,]*,)|(^username=[^,]*$)|(,username=[^,]*$)/i', '', $mpo); + $mpo=preg_replace('/,username=[^,]*,/i', ',', $mpo); + + $mpo=preg_replace('/(^password=[^,]*,)|(^password=[^,]*$)|(,password=[^,]*$)/i', '', $mpo); + $mpo=preg_replace('/,password=[^,]*,/i', ',', $mpo); + + $dev->setOptions($mpo); + } + } + } + $this->sys->setDiskDevices($dev); + } + } + } + } + } + + /** + * Distribution + * + * @return void + */ + protected function _distro() + { + $buf = ""; + if (CommonFunctions::rfts('/system/build.prop', $lines, 0, 4096, false) + && preg_match('/^ro\.build\.version\.release=([^\n]+)/m', $lines, $ar_buf)) { + $buf = trim($ar_buf[1]); + } + if (is_null($buf) || ($buf == "")) { + $this->sys->setDistribution('Android'); + } else { + if (preg_match('/^(\d+\.\d+)/', $buf, $ver) + && ($list = @parse_ini_file(APP_ROOT."/data/osnames.ini", true)) + && isset($list['Android'][$ver[1]])) { + $buf.=' '.$list['Android'][$ver[1]]; + } + $this->sys->setDistribution('Android '.$buf); + } + $this->sys->setDistributionIcon('Android.png'); + } + + /** + * Machine + * + * @return void + */ + private function _machine() + { + if (CommonFunctions::rfts('/system/build.prop', $lines, 0, 4096, false)) { + $buf = ""; + if (preg_match('/^ro\.product\.manufacturer=([^\n]+)/m', $lines, $ar_buf)) { + $buf .= ' '.trim($ar_buf[1]); + } + if (preg_match('/^ro\.product\.model=([^\n]+)/m', $lines, $ar_buf) && (trim($buf) !== trim($ar_buf[1]))) { + $buf .= ' '.trim($ar_buf[1]); + } + if (preg_match('/^ro\.semc\.product\.name=([^\n]+)/m', $lines, $ar_buf)) { + $buf .= ' '.trim($ar_buf[1]); + } + if (trim($buf) != "") { + $this->sys->setMachine(trim($buf)); + } + } + } + + /** + * PCI devices + * + * @return array + */ + private function _pci() + { + if (CommonFunctions::executeProgram('lspci', '', $bufr, false)) { + $bufe = preg_split("/\n/", $bufr, -1, PREG_SPLIT_NO_EMPTY); + foreach ($bufe as $buf) { + $device = preg_split("/ /", $buf, 4); + if (isset($device[3]) && trim($device[3]) != "") { + $dev = new HWDevice(); + $dev->setName('Class '.trim($device[2]).' Device '.trim($device[3])); + $this->sys->setPciDevices($dev); + } + } + } + } + + /** + * USB devices + * + * @return array + */ + private function _usb() + { + if (file_exists('/dev/bus/usb') && CommonFunctions::executeProgram('lsusb', '', $bufr, false)) { + $bufe = preg_split("/\n/", $bufr, -1, PREG_SPLIT_NO_EMPTY); + foreach ($bufe as $buf) { + $device = preg_split("/ /", $buf, 6); + if (isset($device[5]) && trim($device[5]) != "") { + $dev = new HWDevice(); + $dev->setName(trim($device[5])); + $this->sys->setUsbDevices($dev); + } + } + } + } + + /** + * get the information + * + * @see PSI_Interface_OS::build() + * + * @return Void + */ + public function build() + { + $this->_distro(); + $this->_hostname(); + $this->_kernel(); + $this->_machine(); + $this->_uptime(); + $this->_users(); + $this->_cpuinfo(); + $this->_pci(); + $this->_usb(); + $this->_i2c(); + $this->_network(); + $this->_memory(); + $this->_filesystems(); + $this->_loadavg(); + $this->_processes(); + } +} diff --git a/sources/includes/os/class.BSDCommon.inc.php b/sources/includes/os/class.BSDCommon.inc.php new file mode 100644 index 0000000..769f9b1 --- /dev/null +++ b/sources/includes/os/class.BSDCommon.inc.php @@ -0,0 +1,580 @@ + + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version SVN: $Id: class.BSDCommon.inc.php 621 2012-07-29 18:49:04Z namiltd $ + * @link http://phpsysinfo.sourceforge.net + */ + /** + * BSDCommon class + * get all the required information for BSD Like systems + * no need to implement in every class the same methods + * + * @category PHP + * @package PSI BSDCommon OS class + * @author Michael Cramer + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version Release: 3.0 + * @link http://phpsysinfo.sourceforge.net + */ +abstract class BSDCommon extends OS +{ + /** + * content of the syslog + * + * @var array + */ + private $_dmesg = array(); + + /** + * regexp1 for cpu information out of the syslog + * + * @var string + */ + private $_CPURegExp1 = "//"; + + /** + * regexp2 for cpu information out of the syslog + * + * @var string + */ + private $_CPURegExp2 = "//"; + + /** + * regexp1 for scsi information out of the syslog + * + * @var string + */ + private $_SCSIRegExp1 = "//"; + + /** + * regexp2 for scsi information out of the syslog + * + * @var string + */ + private $_SCSIRegExp2 = "//"; + + /** + * regexp1 for pci information out of the syslog + * + * @var string + */ + private $_PCIRegExp1 = "//"; + + /** + * regexp1 for pci information out of the syslog + * + * @var string + */ + private $_PCIRegExp2 = "//"; + + /** + * call parent constructor + */ + public function __construct() + { + parent::__construct(); + } + + /** + * setter for cpuregexp1 + * + * @param string $value value to set + * + * @return void + */ + protected function setCPURegExp1($value) + { + $this->_CPURegExp1 = $value; + } + + /** + * setter for cpuregexp2 + * + * @param string $value value to set + * + * @return void + */ + protected function setCPURegExp2($value) + { + $this->_CPURegExp2 = $value; + } + + /** + * setter for scsiregexp1 + * + * @param string $value value to set + * + * @return void + */ + protected function setSCSIRegExp1($value) + { + $this->_SCSIRegExp1 = $value; + } + + /** + * setter for scsiregexp2 + * + * @param string $value value to set + * + * @return void + */ + protected function setSCSIRegExp2($value) + { + $this->_SCSIRegExp2 = $value; + } + + /** + * setter for pciregexp1 + * + * @param string $value value to set + * + * @return void + */ + protected function setPCIRegExp1($value) + { + $this->_PCIRegExp1 = $value; + } + + /** + * setter for pciregexp2 + * + * @param string $value value to set + * + * @return void + */ + protected function setPCIRegExp2($value) + { + $this->_PCIRegExp2 = $value; + } + + /** + * read /var/run/dmesg.boot, but only if we haven't already + * + * @return array + */ + protected function readdmesg() + { + if (count($this->_dmesg) === 0) { + if (PSI_OS != "Darwin") { + if (CommonFunctions::rfts('/var/run/dmesg.boot', $buf, 0, 4096, false) || CommonFunctions::rfts('/var/log/dmesg.boot', $buf, 0, 4096, false) || CommonFunctions::rfts('/var/run/dmesg.boot', $buf)) { // Once again but with debug + $parts = preg_split("/rebooting|Uptime/", $buf, -1, PREG_SPLIT_NO_EMPTY); + $this->_dmesg = preg_split("/\n/", $parts[count($parts) - 1], -1, PREG_SPLIT_NO_EMPTY); + } + } + } + + return $this->_dmesg; + } + + /** + * get a value from sysctl command + * + * @param string $key key for the value to get + * + * @return string + */ + protected function grabkey($key) + { + $buf = ""; + if (CommonFunctions::executeProgram('sysctl', "-n $key", $buf, PSI_DEBUG)) { + return $buf; + } else { + return ''; + } + } + + /** + * Virtual Host Name + * + * @return void + */ + protected function hostname() + { + if (PSI_USE_VHOST === true) { + $this->sys->setHostname(getenv('SERVER_NAME')); + } else { + if (CommonFunctions::executeProgram('hostname', '', $buf, PSI_DEBUG)) { + $this->sys->setHostname($buf); + } + } + } + + /** + * Kernel Version + * + * @return void + */ + protected function kernel() + { + $s = $this->grabkey('kern.version'); + $a = preg_split('/:/', $s); + if (isset($a[2])) { + $this->sys->setKernel($a[0].$a[1].':'.$a[2]); + } else { + $this->sys->setKernel($s); + } + } + + /** + * Processor Load + * optionally create a loadbar + * + * @return void + */ + protected function loadavg() + { + $s = $this->grabkey('vm.loadavg'); + $s = preg_replace('/{ /', '', $s); + $s = preg_replace('/ }/', '', $s); + $this->sys->setLoad($s); + if (PSI_LOAD_BAR && (PSI_OS != "Darwin")) { + if ($fd = $this->grabkey('kern.cp_time')) { + // Find out the CPU load + // user + sys = load + // total = total + preg_match($this->_CPURegExp2, $fd, $res); + $load = $res[2] + $res[3] + $res[4]; // cpu.user + cpu.sys + $total = $res[2] + $res[3] + $res[4] + $res[5]; // cpu.total + // we need a second value, wait 1 second befor getting (< 1 second no good value will occour) + sleep(1); + $fd = $this->grabkey('kern.cp_time'); + preg_match($this->_CPURegExp2, $fd, $res); + $load2 = $res[2] + $res[3] + $res[4]; + $total2 = $res[2] + $res[3] + $res[4] + $res[5]; + $this->sys->setLoadPercent((100 * ($load2 - $load)) / ($total2 - $total)); + } + } + } + + /** + * CPU information + * + * @return void + */ + protected function cpuinfo() + { + $dev = new CpuDevice(); + + if (PSI_OS == "NetBSD") { + if ($model = $this->grabkey('machdep.cpu_brand')) { + $dev->setModel($model); + } + if ($cpuspeed = $this->grabkey('machdep.tsc_freq')) { + $dev->setCpuSpeed(round($cpuspeed / 1000000)); + } + } + + if ($dev->getModel() === "") { + $dev->setModel($this->grabkey('hw.model')); + } + $notwas = true; + foreach ($this->readdmesg() as $line) { + if ($notwas) { + if (preg_match($this->_CPURegExp1, $line, $ar_buf)) { + if ($dev->getCpuSpeed() === 0) { + $dev->setCpuSpeed(round($ar_buf[2])); + } + $notwas = false; + } + } else { + if (preg_match("/ Origin| Features/", $line, $ar_buf)) { + if (preg_match("/ Features2[ ]*=.*<(.*)>/", $line, $ar_buf)) { + $feats = preg_split("/,/", strtolower(trim($ar_buf[1])), -1, PREG_SPLIT_NO_EMPTY); + foreach ($feats as $feat) { + if (($feat=="vmx") || ($feat=="svm")) { + $dev->setVirt($feat); + break 2; + } + } + break; + } + } else break; + } + } + + $ncpu = $this->grabkey('hw.ncpu'); + if (is_null($ncpu) || (trim($ncpu) == "") || (!($ncpu >= 1))) + $ncpu = 1; + for ($ncpu ; $ncpu > 0 ; $ncpu--) { + $this->sys->setCpus($dev); + } + } + + /** + * SCSI devices + * get the scsi device information out of dmesg + * + * @return void + */ + protected function scsi() + { + foreach ($this->readdmesg() as $line) { + if (preg_match($this->_SCSIRegExp1, $line, $ar_buf)) { + $dev = new HWDevice(); + $dev->setName($ar_buf[1].": ".$ar_buf[2]); + $this->sys->setScsiDevices($dev); + } elseif (preg_match($this->_SCSIRegExp2, $line, $ar_buf)) { + /* duplication security */ + $notwas = true; + foreach ($this->sys->getScsiDevices() as $finddev) { + if ($notwas && (substr($finddev->getName(), 0, strpos($finddev->getName(), ': ')) == $ar_buf[1])) { + $finddev->setCapacity($ar_buf[2] * 2048 * 1.049); + $notwas = false; + break; + } + } + if ($notwas) { + $dev = new HWDevice(); + $dev->setName($ar_buf[1]); + $dev->setCapacity($ar_buf[2] * 2048 * 1.049); + $this->sys->setScsiDevices($dev); + } + } + } + /* cleaning */ + foreach ($this->sys->getScsiDevices() as $finddev) { + if (strpos($finddev->getName(), ': ') !== false) + $finddev->setName(substr(strstr($finddev->getName(), ': '), 2)); + } + } + + /** + * parsing the output of pciconf command + * + * @return Array + */ + protected function pciconf() + { + $arrResults = array(); + $intS = 0; + if (CommonFunctions::executeProgram("pciconf", "-lv", $strBuf, PSI_DEBUG)) { + $arrTemp = array(); + $arrBlocks = preg_split("/\n\S/", $strBuf, -1, PREG_SPLIT_NO_EMPTY); + foreach ($arrBlocks as $strBlock) { + $arrLines = preg_split("/\n/", $strBlock, -1, PREG_SPLIT_NO_EMPTY); + $vend = null; + foreach ($arrLines as $strLine) { + if (preg_match("/\sclass=0x([a-fA-F0-9]{4})[a-fA-F0-9]{2}\s.*\schip=0x([a-fA-F0-9]{4})([a-fA-F0-9]{4})\s/", $strLine, $arrParts)) { + $arrTemp[$intS] = 'Class '.$arrParts[1].': Device '.$arrParts[3].':'.$arrParts[2]; + $vend = ''; + } elseif (preg_match("/(.*) = '(.*)'/", $strLine, $arrParts)) { + if (trim($arrParts[1]) == "vendor") { + $vend = trim($arrParts[2]); + } elseif (trim($arrParts[1]) == "device") { + if (($vend !== null) && ($vend !== '')) { + $arrTemp[$intS] = $vend." - ".trim($arrParts[2]); + } else { + $arrTemp[$intS] = trim($arrParts[2]); + $vend = ''; + } + } + } + } + if ($vend !== null) { + $intS++; + } + } + foreach ($arrTemp as $name) { + $dev = new HWDevice(); + $dev->setName($name); + $arrResults[] = $dev; + } + } + + return $arrResults; + } + + /** + * PCI devices + * get the pci device information out of dmesg + * + * @return void + */ + protected function pci() + { + if ((!$results = Parser::lspci(false)) && (!$results = $this->pciconf())) { + foreach ($this->readdmesg() as $line) { + if (preg_match($this->_PCIRegExp1, $line, $ar_buf)) { + $dev = new HWDevice(); + $dev->setName($ar_buf[1].": ".$ar_buf[2]); + $results[] = $dev; + } elseif (preg_match($this->_PCIRegExp2, $line, $ar_buf)) { + $dev = new HWDevice(); + $dev->setName($ar_buf[1].": ".$ar_buf[2]); + $results[] = $dev; + } + } + } + foreach ($results as $dev) { + $this->sys->setPciDevices($dev); + } + } + + /** + * IDE devices + * get the ide device information out of dmesg + * + * @return void + */ + protected function ide() + { + foreach ($this->readdmesg() as $line) { + if (preg_match('/^(ad[0-9]+): (.*)MB <(.*)> (.*) (.*)/', $line, $ar_buf)) { + $dev = new HWDevice(); + $dev->setName($ar_buf[1].": ".$ar_buf[3]); + $dev->setCapacity($ar_buf[2] * 1024); + $this->sys->setIdeDevices($dev); + } elseif (preg_match('/^(acd[0-9]+): (.*) <(.*)> (.*)/', $line, $ar_buf)) { + $dev = new HWDevice(); + $dev->setName($ar_buf[1].": ".$ar_buf[3]); + $this->sys->setIdeDevices($dev); + } elseif (preg_match('/^(ada[0-9]+): <(.*)> (.*)/', $line, $ar_buf)) { + $dev = new HWDevice(); + $dev->setName($ar_buf[1].": ".$ar_buf[2]); + $this->sys->setIdeDevices($dev); + } elseif (preg_match('/^(ada[0-9]+): (.*)MB \((.*)\)/', $line, $ar_buf)) { + /* duplication security */ + $notwas = true; + foreach ($this->sys->getIdeDevices() as $finddev) { + if ($notwas && (substr($finddev->getName(), 0, strpos($finddev->getName(), ': ')) == $ar_buf[1])) { + $finddev->setCapacity($ar_buf[2] * 1024); + $notwas = false; + break; + } + } + if ($notwas) { + $dev = new HWDevice(); + $dev->setName($ar_buf[1]); + $dev->setCapacity($ar_buf[2] * 1024); + $this->sys->setIdeDevices($dev); + } + } + } + /* cleaning */ + foreach ($this->sys->getIdeDevices() as $finddev) { + if (strpos($finddev->getName(), ': ') !== false) + $finddev->setName(substr(strstr($finddev->getName(), ': '), 2)); + } + } + + /** + * Physical memory information and Swap Space information + * + * @return void + */ + protected function memory() + { + if (PSI_OS == 'FreeBSD' || PSI_OS == 'OpenBSD') { + // vmstat on fbsd 4.4 or greater outputs kbytes not hw.pagesize + // I should probably add some version checking here, but for now + // we only support fbsd 4.4 + $pagesize = 1024; + } else { + $pagesize = $this->grabkey('hw.pagesize'); + } + if (CommonFunctions::executeProgram('vmstat', '', $vmstat, PSI_DEBUG)) { + $lines = preg_split("/\n/", $vmstat, -1, PREG_SPLIT_NO_EMPTY); + $ar_buf = preg_split("/\s+/", trim($lines[2]), 19); + if (PSI_OS == 'NetBSD' || PSI_OS == 'DragonFly') { + $this->sys->setMemFree($ar_buf[4] * 1024); + } else { + $this->sys->setMemFree($ar_buf[4] * $pagesize); + } + $this->sys->setMemTotal($this->grabkey('hw.physmem')); + $this->sys->setMemUsed($this->sys->getMemTotal() - $this->sys->getMemFree()); + + if (((PSI_OS == 'OpenBSD' || PSI_OS == 'NetBSD') && CommonFunctions::executeProgram('swapctl', '-l -k', $swapstat, PSI_DEBUG)) || CommonFunctions::executeProgram('swapinfo', '-k', $swapstat, PSI_DEBUG)) { + $lines = preg_split("/\n/", $swapstat, -1, PREG_SPLIT_NO_EMPTY); + foreach ($lines as $line) { + $ar_buf = preg_split("/\s+/", $line, 6); + if (($ar_buf[0] != 'Total') && ($ar_buf[0] != 'Device')) { + $dev = new DiskDevice(); + $dev->setMountPoint($ar_buf[0]); + $dev->setName("SWAP"); + $dev->setFsType('swap'); + $dev->setTotal($ar_buf[1] * 1024); + $dev->setUsed($ar_buf[2] * 1024); + $dev->setFree($dev->getTotal() - $dev->getUsed()); + $this->sys->setSwapDevices($dev); + } + } + } + } + } + + /** + * USB devices + * get the ide device information out of dmesg + * + * @return void + */ + protected function usb() + { + foreach ($this->readdmesg() as $line) { +// if (preg_match('/^(ugen[0-9\.]+): <(.*)> (.*) (.*)/', $line, $ar_buf)) { +// $dev->setName($ar_buf[1].": ".$ar_buf[2]); + if (preg_match('/^(u[a-z]+[0-9]+): <([^,]*)(.*)> on (usbus[0-9]+)/', $line, $ar_buf)) { + $dev = new HWDevice(); + $dev->setName($ar_buf[2]); + $this->sys->setUSBDevices($dev); + } + } + } + + /** + * filesystem information + * + * @return void + */ + protected function filesystems() + { + $arrResult = Parser::df(); + foreach ($arrResult as $dev) { + $this->sys->setDiskDevices($dev); + } + } + + /** + * Distribution + * + * @return void + */ + protected function distro() + { + if (CommonFunctions::executeProgram('uname', '-s', $result, PSI_DEBUG)) { + $this->sys->setDistribution($result); + } + } + + /** + * get the information + * + * @see PSI_Interface_OS::build() + * + * @return Void + */ + public function build() + { + $this->distro(); + $this->memory(); + $this->ide(); + $this->pci(); + $this->cpuinfo(); + $this->filesystems(); + $this->kernel(); + $this->loadavg(); + $this->hostname(); + $this->scsi(); + $this->usb(); + $this->_users(); + } +} diff --git a/sources/includes/os/class.Darwin.inc.php b/sources/includes/os/class.Darwin.inc.php new file mode 100644 index 0000000..0f2a461 --- /dev/null +++ b/sources/includes/os/class.Darwin.inc.php @@ -0,0 +1,475 @@ + + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version SVN: $Id: class.Darwin.inc.php 638 2012-08-24 09:40:48Z namiltd $ + * @link http://phpsysinfo.sourceforge.net + */ + /** + * Darwin sysinfo class + * get all the required information from Darwin system + * information may be incomplete + * + * @category PHP + * @package PSI Darwin OS class + * @author Michael Cramer + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version Release: 3.0 + * @link http://phpsysinfo.sourceforge.net + */ +class Darwin extends BSDCommon +{ + /** + * define the regexp for log parser + */ + /* public function __construct() + { + parent::__construct(); + $this->error->addWarning("The Darwin version of phpSysInfo is a work in progress, some things currently don't work!"); + $this->setCPURegExp1("/CPU: (.*) \((.*)-MHz (.*)\)/"); + $this->setCPURegExp2("/(.*) ([0-9]+) ([0-9]+) ([0-9]+) ([0-9]+)/"); + $this->setSCSIRegExp1("/^(.*): <(.*)> .*SCSI.*device/"); + } */ + + /** + * get a value from sysctl command + * + * @param string $key key of the value to get + * + * @return string + */ + protected function grabkey($key) + { + if (CommonFunctions::executeProgram('sysctl', $key, $s, PSI_DEBUG)) { + $s = preg_replace('/'.$key.': /', '', $s); + $s = preg_replace('/'.$key.' = /', '', $s); + + return $s; + } else { + return ''; + } + } + + /** + * get a value from ioreg command + * + * @param string $key key of the value to get + * + * @return string + */ + private function _grabioreg($key) + { + if (CommonFunctions::executeProgram('ioreg', '-c "'.$key.'"', $s, PSI_DEBUG)) { + /* delete newlines */ + $s = preg_replace("/\s+/", " ", $s); + /* new newlines */ + $s = preg_replace("/[\|\t ]*\+\-o/", "\n", $s); + /* combine duplicate whitespaces and some chars */ + $s = preg_replace("/[\|\t ]+/", " ", $s); + + $lines = preg_split("/\n/", $s, -1, PREG_SPLIT_NO_EMPTY); + $out = ""; + foreach ($lines as $line) { + if (preg_match('/^([^<]*) sys->setUptime(time() - $data); + } else { /* kern.boottime= 1096732600 */ + $this->sys->setUptime(time() - $a); + } + } + } + + /** + * get CPU information + * + * @return void + */ + protected function cpuinfo() + { + $dev = new CpuDevice(); + if (CommonFunctions::executeProgram('hostinfo', '| grep "Processor type"', $buf, PSI_DEBUG)) { + $dev->setModel(preg_replace('/Processor type: /', '', $buf)); + $buf=$this->grabkey('hw.model'); + if (!is_null($buf) && (trim($buf) != "")) { + $this->sys->setMachine(trim($buf)); + if (CommonFunctions::rfts(APP_ROOT.'/data/ModelTranslation.txt', $buffer)) { + $buffer = preg_split("/\n/", $buffer, -1, PREG_SPLIT_NO_EMPTY); + foreach ($buffer as $line) { + $ar_buf = preg_split("/:/", $line, 3); + if (trim($buf) === trim($ar_buf[0])) { + $dev->setModel(trim($ar_buf[2])); + $this->sys->setMachine($this->sys->getMachine().' - '.trim($ar_buf[1])); + break; + } + } + } + } + $buf=$this->grabkey('machdep.cpu.brand_string'); + if (!is_null($buf) && (trim($buf) != "") && + ((trim($buf) != "i486 (Intel 80486)") || ($dev->getModel() == ""))) { + $dev->setModel(trim($buf)); + } + $buf=$this->grabkey('machdep.cpu.features'); + if (!is_null($buf) && (trim($buf) != "")) { + if (preg_match("/ VMX/", $buf)) { + $dev->setVirt("vmx"); + } elseif (preg_match("/ SVM/", $buf)) { + $dev->setVirt("svm"); + } + } + } + $dev->setCpuSpeed(round($this->grabkey('hw.cpufrequency') / 1000000)); + $dev->setBusSpeed(round($this->grabkey('hw.busfrequency') / 1000000)); + $bufn=$this->grabkey('hw.cpufrequency_min'); + $bufx=$this->grabkey('hw.cpufrequency_max'); + if (!is_null($bufn) && (trim($bufn) != "") && !is_null($bufx) && (trim($bufx) != "") && ($bufn != $bufx)) { + $dev->setCpuSpeedMin(round($bufn / 1000000)); + $dev->setCpuSpeedMax(round($bufx / 1000000)); + } + $buf=$this->grabkey('hw.l2cachesize'); + if (!is_null($buf) && (trim($buf) != "")) { + $dev->setCache(round($buf)); + } + $ncpu = $this->grabkey('hw.ncpu'); + if (is_null($ncpu) || (trim($ncpu) == "") || (!($ncpu >= 1))) + $ncpu = 1; + for ($ncpu ; $ncpu > 0 ; $ncpu--) { + $this->sys->setCpus($dev); + } + } + + /** + * get the pci device information out of ioreg + * + * @return void + */ + protected function pci() + { + if (!$arrResults = Parser::lspci(false)) { //no lspci port + $s = $this->_grabioreg('IOPCIDevice'); + $lines = preg_split("/\n/", $s, -1, PREG_SPLIT_NO_EMPTY); + foreach ($lines as $line) { + $dev = new HWDevice(); + if (!preg_match('/"IOName" = "([^"]*)"/', $line, $ar_buf)) { + $ar_buf = preg_split("/[\s@]+/", $line, 19); + } + if (preg_match('/"model" = setName(trim($ar_buf[1]). ": ".trim($ar_buf2[1])); + } else { + $dev->setName(trim($ar_buf[1])); + } + $this->sys->setPciDevices($dev); + } + } else { + foreach ($arrResults as $dev) { + $this->sys->setPciDevices($dev); + } + } + } + + /** + * get the ide device information out of ioreg + * + * @return void + */ + protected function ide() + { + $s = $this->_grabioreg('IOATABlockStorageDevice'); + $lines = preg_split("/\n/", $s, -1, PREG_SPLIT_NO_EMPTY); + foreach ($lines as $line) { + $dev = new HWDevice(); + if (!preg_match('/"Product Name"="([^"]*)"/', $line, $ar_buf)) + $ar_buf = preg_split("/[\s@]+/", $line, 19); + $dev->setName(trim($ar_buf[1])); + $this->sys->setIdeDevices($dev); + } + + $s = $this->_grabioreg('IOAHCIBlockStorageDevice'); + $lines = preg_split("/\n/", $s, -1, PREG_SPLIT_NO_EMPTY); + foreach ($lines as $line) { + $dev = new HWDevice(); + if (!preg_match('/"Product Name"="([^"]*)"/', $line, $ar_buf)) + $ar_buf = preg_split("/[\s@]+/", $line, 19); + $dev->setName(trim($ar_buf[1])); + $this->sys->setIdeDevices($dev); + } + } + + /** + * get the usb device information out of ioreg + * + * @return void + */ + protected function usb() + { + $s = $this->_grabioreg('IOUSBDevice'); + $lines = preg_split("/\n/", $s, -1, PREG_SPLIT_NO_EMPTY); + foreach ($lines as $line) { + $dev = new HWDevice(); + if (!preg_match('/"USB Product Name" = "([^"]*)"/', $line, $ar_buf)) + $ar_buf = preg_split("/[\s@]+/", $line, 19); + $dev->setName(trim($ar_buf[1])); + $this->sys->setUsbDevices($dev); + } + } + + /** + * get the scsi device information out of ioreg + * + * @return void + */ + protected function scsi() + { + $s = $this->_grabioreg('IOBlockStorageServices'); + $lines = preg_split("/\n/", $s, -1, PREG_SPLIT_NO_EMPTY); + foreach ($lines as $line) { + $dev = new HWDevice(); + if (!preg_match('/"Product Name"="([^"]*)"/', $line, $ar_buf)) + $ar_buf = preg_split("/[\s@]+/", $line, 19); + $dev->setName(trim($ar_buf[1])); + $this->sys->setScsiDevices($dev); + } + } + + /** + * get memory and swap information + * + * @return void + */ + protected function memory() + { + $s = $this->grabkey('hw.memsize'); + if (CommonFunctions::executeProgram('vm_stat', '', $pstat, PSI_DEBUG)) { + // calculate free memory from page sizes (each page = 4096) + if (preg_match('/^Pages free:\s+(\S+)/m', $pstat, $free_buf)) { + if (preg_match('/^Anonymous pages:\s+(\S+)/m', $pstat, $anon_buf) + && preg_match('/^Pages wired down:\s+(\S+)/m', $pstat, $wire_buf) + && preg_match('/^File-backed pages:\s+(\S+)/m', $pstat, $fileb_buf)) { + // OS X 10.9 or never + $this->sys->setMemFree($free_buf[1] * 4 * 1024); + $this->sys->setMemApplication(($anon_buf[1]+$wire_buf[1]) * 4 * 1024); + $this->sys->setMemCache($fileb_buf[1] * 4 * 1024); + if (preg_match('/^Pages occupied by compressor:\s+(\S+)/m', $pstat, $compr_buf)) { + $this->sys->setMemBuffer($compr_buf[1] * 4 * 1024); + } + } else { + if (preg_match('/^Pages speculative:\s+(\S+)/m', $pstat, $spec_buf)) { + $this->sys->setMemFree(($free_buf[1]+$spec_buf[1]) * 4 * 1024); + } else { + $this->sys->setMemFree($free_buf[1] * 4 * 1024); + } + $appMemory = 0; + if (preg_match('/^Pages wired down:\s+(\S+)/m', $pstat, $wire_buf)) { + $appMemory += $wire_buf[1] * 4 * 1024; + } + if (preg_match('/^Pages active:\s+(\S+)/m', $pstat, $active_buf)) { + $appMemory += $active_buf[1] * 4 * 1024; + } + $this->sys->setMemApplication($appMemory); + + if (preg_match('/^Pages inactive:\s+(\S+)/m', $pstat, $inactive_buf)) { + $this->sys->setMemCache($inactive_buf[1] * 4 * 1024); + } + } + } else { + $lines = preg_split("/\n/", $pstat, -1, PREG_SPLIT_NO_EMPTY); + $ar_buf = preg_split("/\s+/", $lines[1], 19); + $this->sys->setMemFree($ar_buf[2] * 4 * 1024); + } + + $this->sys->setMemTotal($s); + $this->sys->setMemUsed($this->sys->getMemTotal() - $this->sys->getMemFree()); + + if (CommonFunctions::executeProgram('sysctl', 'vm.swapusage | colrm 1 22', $swapBuff, PSI_DEBUG)) { + $swap1 = preg_split('/M/', $swapBuff); + $swap2 = preg_split('/=/', $swap1[1]); + $swap3 = preg_split('/=/', $swap1[2]); + $dev = new DiskDevice(); + $dev->setName('SWAP'); + $dev->setMountPoint('SWAP'); + $dev->setFsType('swap'); + $dev->setTotal($swap1[0] * 1024 * 1024); + $dev->setUsed($swap2[1] * 1024 * 1024); + $dev->setFree($swap3[1] * 1024 * 1024); + $this->sys->setSwapDevices($dev); + } + } + } + + /** + * get the thunderbolt device information out of ioreg + * + * @return void + */ + protected function _tb() + { + $s = $this->_grabioreg('IOThunderboltPort'); + $lines = preg_split("/\n/", $s, -1, PREG_SPLIT_NO_EMPTY); + foreach ($lines as $line) { + $dev = new HWDevice(); + if (!preg_match('/"Description" = "([^"]*)"/', $line, $ar_buf)) + $ar_buf = preg_split("/[\s@]+/", $line, 19); + $dev->setName(trim($ar_buf[1])); + $this->sys->setTbDevices($dev); + } + } + + /** + * get network information + * + * @return void + */ + private function _network() + { + if (CommonFunctions::executeProgram('netstat', '-nbdi | cut -c1-24,42- | grep Link', $netstat, PSI_DEBUG)) { + $lines = preg_split("/\n/", $netstat, -1, PREG_SPLIT_NO_EMPTY); + foreach ($lines as $line) { + $ar_buf = preg_split("/\s+/", $line, 10); + if (!empty($ar_buf[0])) { + $dev = new NetDevice(); + $dev->setName($ar_buf[0]); + $dev->setTxBytes($ar_buf[8]); + $dev->setRxBytes($ar_buf[5]); + $dev->setErrors($ar_buf[4] + $ar_buf[7]); + if (isset($ar_buf[10])) { + $dev->setDrops($ar_buf[10]); + } + if (defined('PSI_SHOW_NETWORK_INFOS') && (PSI_SHOW_NETWORK_INFOS) && (CommonFunctions::executeProgram('ifconfig', $ar_buf[0].' 2>/dev/null', $bufr2, PSI_DEBUG))) { + $bufe2 = preg_split("/\n/", $bufr2, -1, PREG_SPLIT_NO_EMPTY); + foreach ($bufe2 as $buf2) { + if (preg_match('/^\s+ether\s+(\S+)/i', $buf2, $ar_buf2)) + $dev->setInfo(($dev->getInfo()?$dev->getInfo().';':'').preg_replace('/:/', '-', strtoupper($ar_buf2[1]))); + elseif (preg_match('/^\s+inet\s+(\S+)\s+netmask/i', $buf2, $ar_buf2)) + $dev->setInfo(($dev->getInfo()?$dev->getInfo().';':'').$ar_buf2[1]); + elseif ((preg_match('/^\s+inet6\s+([^\s%]+)\s+prefixlen/i', $buf2, $ar_buf2) + || preg_match('/^\s+inet6\s+([^\s%]+)%\S+\s+prefixlen/i', $buf2, $ar_buf2)) + && ($ar_buf2[1]!="::") && !preg_match('/^fe80::/i', $ar_buf2[1])) + $dev->setInfo(($dev->getInfo()?$dev->getInfo().';':'').strtolower($ar_buf2[1])); + elseif (preg_match('/^\s+media:\s+/i', $buf2) && preg_match('/[\(\s](\d+)(G*)base/i', $buf2, $ar_buf2)) { + if (isset($ar_buf2[2]) && strtoupper($ar_buf2[2])=="G") { + $unit = "G"; + } else { + $unit = "M"; + } + if (preg_match('/[<\s]([^\s<]+)-duplex/i', $buf2, $ar_buf3)) + $dev->setInfo(($dev->getInfo()?$dev->getInfo().';':'').$ar_buf2[1].$unit.'b/s '.strtolower($ar_buf3[1])); + else + $dev->setInfo(($dev->getInfo()?$dev->getInfo().';':'').$ar_buf2[1].$unit.'b/s'); + } + } + } + $this->sys->setNetDevices($dev); + } + } + } + } + + /** + * get icon name + * + * @return void + */ + protected function distro() + { + $this->sys->setDistributionIcon('Darwin.png'); + if (!CommonFunctions::executeProgram('system_profiler', 'SPSoftwareDataType', $buffer, PSI_DEBUG)) { + parent::distro(); + } else { + $arrBuff = preg_split("/\n/", $buffer, -1, PREG_SPLIT_NO_EMPTY); + foreach ($arrBuff as $line) { + $arrLine = preg_split("/:/", $line, -1, PREG_SPLIT_NO_EMPTY); + if (trim($arrLine[0]) === "System Version") { + $distro = trim($arrLine[1]); + + if (preg_match('/(^Mac OS)|(^OS X)/', $distro)) { + $this->sys->setDistributionIcon('Apple.png'); + if (preg_match('/((^Mac OS X Server)|(^Mac OS X)|(^OS X Server)|(^OS X)) (\d+\.\d+)/', $distro, $ver) + && ($list = @parse_ini_file(APP_ROOT."/data/osnames.ini", true)) + && isset($list['OS X'][$ver[6]])) { + $distro.=' '.$list['OS X'][$ver[6]]; + } + } + + $this->sys->setDistribution($distro); + + return; + } + } + } + } + + /** + * Processes + * + * @return void + */ + protected function _processes() + { + if (CommonFunctions::executeProgram('ps', 'aux', $bufr, PSI_DEBUG)) { + $lines = preg_split("/\n/", $bufr, -1, PREG_SPLIT_NO_EMPTY); + $processes['*'] = 0; + foreach ($lines as $line) { + if (preg_match("/^\S+\s+\d+\s+\S+\s+\S+\s+\d+\s+\d+\s+\S+\s+(\w)/", $line, $ar_buf)) { + $processes['*']++; + $state = $ar_buf[1]; + if ($state == 'U') $state = 'D'; //linux format + elseif ($state == 'I') $state = 'S'; + elseif ($state == 'D') $state = 'd'; //invalid + if (isset($processes[$state])) { + $processes[$state]++; + } else { + $processes[$state] = 1; + } + } + } + if ($processes['*'] > 0) { + $this->sys->setProcesses($processes); + } + } + } + + /** + * get the information + * + * @see PSI_Interface_OS::build() + * + * @return Void + */ + public function build() + { + parent::build(); + $this->_uptime(); + $this->_network(); + $this->_processes(); + $this->_tb(); + } +} diff --git a/sources/includes/os/class.DragonFly.inc.php b/sources/includes/os/class.DragonFly.inc.php new file mode 100644 index 0000000..3244f45 --- /dev/null +++ b/sources/includes/os/class.DragonFly.inc.php @@ -0,0 +1,153 @@ + + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version SVN: $Id: class.DragonFly.inc.php 287 2009-06-26 12:11:59Z bigmichi1 $ + * @link http://phpsysinfo.sourceforge.net + */ + /** + * DragonFly sysinfo class + * get all the required information from DragonFly system + * + * @category PHP + * @package PSI DragonFly OS class + * @author Michael Cramer + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version Release: 3.0 + * @link http://phpsysinfo.sourceforge.net + */ +class DragonFly extends BSDCommon +{ + /** + * define the regexp for log parser + */ + public function __construct() + { + parent::__construct(); + $this->setCPURegExp1("/^cpu(.*)\, (.*) MHz/"); + $this->setCPURegExp2("/^(.*) at scsibus.*: <(.*)> .*/"); + $this->setSCSIRegExp2("/^(da[0-9]+): (.*)MB /"); + $this->setPCIRegExp1("/(.*): <(.*)>(.*) (pci|legacypci)[0-9]+$/"); + $this->setPCIRegExp2("/(.*): <(.*)>.* at [0-9\.]+$/"); + } + + /** + * UpTime + * time the system is running + * + * @return void + */ + private function _uptime() + { + $a = $this->grab_key('kern.boottime'); + preg_match("/sec = ([0-9]+)/", $a, $buf); + $this->sys->setUptime(time() - $buf[1]); + } + + /** + * get network information + * + * @return array + */ + private function _network() + { + CommonFunctions::executeProgram('netstat', '-nbdi | cut -c1-25,44- | grep "^[a-z]*[0-9][ \t].*Link"', $netstat_b); + CommonFunctions::executeProgram('netstat', '-ndi | cut -c1-25,44- | grep "^[a-z]*[0-9][ \t].*Link"', $netstat_n); + $lines_b = preg_split("/\n/", $netstat_b, -1, PREG_SPLIT_NO_EMPTY); + $lines_n = preg_split("/\n/", $netstat_n, -1, PREG_SPLIT_NO_EMPTY); + for ($i = 0, $max = sizeof($lines_b); $i < $max; $i++) { + $ar_buf_b = preg_split("/\s+/", $lines_b[$i]); + $ar_buf_n = preg_split("/\s+/", $lines_n[$i]); + if (!empty($ar_buf_b[0]) && (!empty($ar_buf_n[5]) || ($ar_buf_n[5] === "0"))) { + $dev = new NetDevice(); + $dev->setName($ar_buf_b[0]); + $dev->setTxBytes($ar_buf_b[8]); + $dev->setRxBytes($ar_buf_b[5]); + $dev->setErrors($ar_buf_n[4] + $ar_buf_n[6]); + $dev->setDrops($ar_buf_n[8]); + $this->sys->setNetDevices($dev); + } + } + } + + /** + * get the ide information + * + * @return array + */ + protected function ide() + { + foreach ($this->readdmesg() as $line) { + if (preg_match('/^(.*): (.*) <(.*)> at (ata[0-9]+\-(.*)) (.*)/', $line, $ar_buf)) { + $dev = new HWDevice(); + $dev->setName($ar_buf[1]); + if (!preg_match("/^acd[0-9]+(.*)/", $ar_buf[1])) { + $dev->setCapacity($ar_buf[2] * 1024); + } + $this->sys->setIdeDevices($dev); + } + } + } + + /** + * get icon name + * + * @return void + */ + private function _distroicon() + { + $this->sys->setDistributionIcon('DragonFly.png'); + } + + /** + * Processes + * + * @return void + */ + protected function _processes() + { + if (CommonFunctions::executeProgram('ps', 'aux', $bufr, PSI_DEBUG)) { + $lines = preg_split("/\n/", $bufr, -1, PREG_SPLIT_NO_EMPTY); + $processes['*'] = 0; + foreach ($lines as $line) { + if (preg_match("/^\S+\s+\d+\s+\S+\s+\S+\s+\d+\s+\d+\s+\S+\s+(\w)/", $line, $ar_buf)) { + $processes['*']++; + $state = $ar_buf[1]; + if ($state == 'I') $state = 'S'; //linux format + if (isset($processes[$state])) { + $processes[$state]++; + } else { + $processes[$state] = 1; + } + } + } + if ($processes['*'] > 0) { + $this->sys->setProcesses($processes); + } + } + } + + /** + * get the information + * + * @see BSDCommon::build() + * + * @return Void + */ + public function build() + { + parent::build(); + $this->_distroicon(); + $this->_network(); + $this->_uptime(); + $this->_processes(); + } +} diff --git a/sources/includes/os/class.FreeBSD.inc.php b/sources/includes/os/class.FreeBSD.inc.php new file mode 100644 index 0000000..330f516 --- /dev/null +++ b/sources/includes/os/class.FreeBSD.inc.php @@ -0,0 +1,201 @@ + + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version SVN: $Id: class.FreeBSD.inc.php 696 2012-09-09 11:24:04Z namiltd $ + * @link http://phpsysinfo.sourceforge.net + */ + /** + * FreeBSD sysinfo class + * get all the required information from FreeBSD system + * + * @category PHP + * @package PSI FreeBSD OS class + * @author Michael Cramer + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version Release: 3.0 + * @link http://phpsysinfo.sourceforge.net + */ +class FreeBSD extends BSDCommon +{ + /** + * define the regexp for log parser + */ + public function __construct() + { + parent::__construct(); + $this->setCPURegExp1("/CPU: (.*) \((.*)-MHz (.*)\)/"); + $this->setCPURegExp2("/(.*) ([0-9]+) ([0-9]+) ([0-9]+) ([0-9]+)/"); + $this->setSCSIRegExp1("/^(.*): <(.*)> .*SCSI.*device/"); + $this->setSCSIRegExp2("/^(da[0-9]+): (.*)MB /"); + $this->setPCIRegExp1("/(.*): <(.*)>(.*) pci[0-9]+$/"); + $this->setPCIRegExp2("/(.*): <(.*)>.* at [.0-9]+ irq/"); + } + + /** + * UpTime + * time the system is running + * + * @return void + */ + private function _uptime() + { + $s = preg_split('/ /', $this->grabkey('kern.boottime')); + $a = preg_replace('/,/', '', $s[3]); + $this->sys->setUptime(time() - $a); + } + + /** + * get network information + * + * @return void + */ + private function _network() + { + $dev = null; + if (CommonFunctions::executeProgram('netstat', '-nibd', $netstat, PSI_DEBUG)) { + $lines = preg_split("/\n/", $netstat, -1, PREG_SPLIT_NO_EMPTY); + foreach ($lines as $line) { + $ar_buf = preg_split("/\s+/", $line); + if (!empty($ar_buf[0])) { + if (preg_match('/^setName($ar_buf[0]); + if (strlen($ar_buf[3]) < 17) { /* no Address */ + if (isset($ar_buf[11]) && (trim($ar_buf[11]) != '')) { /* Idrop column exist*/ + $dev->setTxBytes($ar_buf[9]); + $dev->setRxBytes($ar_buf[6]); + $dev->setErrors($ar_buf[4] + $ar_buf[8]); + $dev->setDrops($ar_buf[11] + $ar_buf[5]); + } else { + $dev->setTxBytes($ar_buf[8]); + $dev->setRxBytes($ar_buf[5]); + $dev->setErrors($ar_buf[4] + $ar_buf[7]); + $dev->setDrops($ar_buf[10]); + } + } else { + if (isset($ar_buf[12]) && (trim($ar_buf[12]) != '')) { /* Idrop column exist*/ + $dev->setTxBytes($ar_buf[10]); + $dev->setRxBytes($ar_buf[7]); + $dev->setErrors($ar_buf[5] + $ar_buf[9]); + $dev->setDrops($ar_buf[12] + $ar_buf[6]); + } else { + $dev->setTxBytes($ar_buf[9]); + $dev->setRxBytes($ar_buf[6]); + $dev->setErrors($ar_buf[5] + $ar_buf[8]); + $dev->setDrops($ar_buf[11]); + } + } + if (defined('PSI_SHOW_NETWORK_INFOS') && (PSI_SHOW_NETWORK_INFOS) && (CommonFunctions::executeProgram('ifconfig', $ar_buf[0].' 2>/dev/null', $bufr2, PSI_DEBUG))) { + $bufe2 = preg_split("/\n/", $bufr2, -1, PREG_SPLIT_NO_EMPTY); + foreach ($bufe2 as $buf2) { + if (preg_match('/^\s+ether\s+(\S+)/i', $buf2, $ar_buf2)) + $dev->setInfo(($dev->getInfo()?$dev->getInfo().';':'').preg_replace('/:/', '-', strtoupper($ar_buf2[1]))); + elseif (preg_match('/^\s+inet\s+(\S+)\s+netmask/i', $buf2, $ar_buf2)) + $dev->setInfo(($dev->getInfo()?$dev->getInfo().';':'').$ar_buf2[1]); + elseif ((preg_match('/^\s+inet6\s+([^\s%]+)\s+prefixlen/i', $buf2, $ar_buf2) + || preg_match('/^\s+inet6\s+([^\s%]+)%\S+\s+prefixlen/i', $buf2, $ar_buf2)) + && ($ar_buf2[1]!="::") && !preg_match('/^fe80::/i', $ar_buf2[1])) + $dev->setInfo(($dev->getInfo()?$dev->getInfo().';':'').strtolower($ar_buf2[1])); + elseif (preg_match('/^\s+media:\s+/i', $buf2) && preg_match('/[\(\s](\d+)(G*)base/i', $buf2, $ar_buf2)) { + if (isset($ar_buf2[2]) && strtoupper($ar_buf2[2])=="G") { + $unit = "G"; + } else { + $unit = "M"; + } + if (preg_match('/[<\s]([^\s<]+)-duplex/i', $buf2, $ar_buf3)) + $dev->setInfo(($dev->getInfo()?$dev->getInfo().';':'').$ar_buf2[1].$unit.'b/s '.strtolower($ar_buf3[1])); + else + $dev->setInfo(($dev->getInfo()?$dev->getInfo().';':'').$ar_buf2[1].$unit.'b/s'); + } + } + } + $this->sys->setNetDevices($dev); + } + } + } + } + } + + /** + * get icon name and distro extended check + * + * @return void + */ + private function _distroicon() + { + if (extension_loaded('pfSense') && CommonFunctions::rfts('/etc/version', $version, 1, 4096, false) && (trim($version) != '')) { // pfSense detection + $this->sys->setDistribution('pfSense '. trim($version)); + $this->sys->setDistributionIcon('pfSense.png'); + } else { + $this->sys->setDistributionIcon('FreeBSD.png'); + } + } + + /** + * extend the memory information with additional values + * + * @return void + */ + private function _memoryadditional() + { + $pagesize = $this->grabkey("hw.pagesize"); + $this->sys->setMemCache($this->grabkey("vm.stats.vm.v_cache_count") * $pagesize); + $this->sys->setMemApplication(($this->grabkey("vm.stats.vm.v_active_count") + $this->grabkey("vm.stats.vm.v_wire_count")) * $pagesize); + $this->sys->setMemBuffer($this->sys->getMemUsed() - $this->sys->getMemApplication() - $this->sys->getMemCache()); + } + + /** + * Processes + * + * @return void + */ + protected function _processes() + { + if (CommonFunctions::executeProgram('ps', 'aux', $bufr, PSI_DEBUG)) { + $lines = preg_split("/\n/", $bufr, -1, PREG_SPLIT_NO_EMPTY); + $processes['*'] = 0; + foreach ($lines as $line) { + if (preg_match("/^\S+\s+\d+\s+\S+\s+\S+\s+\d+\s+\d+\s+\S+\s+(\w)/", $line, $ar_buf)) { + $processes['*']++; + $state = $ar_buf[1]; + if ($state == 'L') $state = 'D'; //linux format + elseif ($state == 'I') $state = 'S'; + if (isset($processes[$state])) { + $processes[$state]++; + } else { + $processes[$state] = 1; + } + } + } + if ($processes['*'] > 0) { + $this->sys->setProcesses($processes); + } + } + } + + /** + * get the information + * + * @see BSDCommon::build() + * + * @return Void + */ + public function build() + { + parent::build(); + $this->_memoryadditional(); + $this->_distroicon(); + $this->_network(); + $this->_uptime(); + $this->_processes(); + } +} diff --git a/sources/includes/os/class.HPUX.inc.php b/sources/includes/os/class.HPUX.inc.php new file mode 100644 index 0000000..4e2280e --- /dev/null +++ b/sources/includes/os/class.HPUX.inc.php @@ -0,0 +1,377 @@ + + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version SVN: $Id: class.HPUX.inc.php 596 2012-07-05 19:37:48Z namiltd $ + * @link http://phpsysinfo.sourceforge.net + */ + /** + * HP-UX sysinfo class + * get all the required information from HP-UX system + * + * @category PHP + * @package PSI HPUX OS class + * @author Michael Cramer + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version Release: 3.0 + * @link http://phpsysinfo.sourceforge.net + */ +class HPUX extends OS +{ + /** + * Virtual Host Name + * + * @return void + */ + private function _hostname() + { + if (PSI_USE_VHOST === true) { + $this->sys->setHostname(getenv('SERVER_NAME')); + } else { + if (CommonFunctions::executeProgram('hostname', '', $ret)) { + $this->sys->setHostname($ret); + } + } + } + + /** + * HP-UX Version + * + * @return void + */ + private function _kernel() + { + if (CommonFunctions::executeProgram('uname', '-srvm', $ret)) { + $this->sys->setKernel($ret); + } + } + + /** + * UpTime + * time the system is running + * + * @return void + */ + private function _uptime() + { + if (CommonFunctions::executeProgram('uptime', '', $buf)) { + if (preg_match("/up (\d+) days,\s*(\d+):(\d+),/", $buf, $ar_buf)) { + $min = $ar_buf[3]; + $hours = $ar_buf[2]; + $days = $ar_buf[1]; + $this->sys->setUptime($days * 86400 + $hours * 3600 + $min * 60); + } + } + } + + /** + * Processor Load + * optionally create a loadbar + * + * @return void + */ + private function _loadavg() + { + if (CommonFunctions::executeProgram('uptime', '', $buf)) { + if (preg_match("/average: (.*), (.*), (.*)$/", $buf, $ar_buf)) { + $this->sys->setLoad($ar_buf[1].' '.$ar_buf[2].' '.$ar_buf[3]); + } + } + } + + /** + * CPU information + * All of the tags here are highly architecture dependant + * + * @return void + */ + private function _cpuinfo() + { + if (CommonFunctions::rfts('/proc/cpuinfo', $bufr)) { + $processors = preg_split('/\s?\n\s?\n/', trim($bufr)); + foreach ($processors as $processor) { + $dev = new CpuDevice(); + $details = preg_split("/\n/", $processor, -1, PREG_SPLIT_NO_EMPTY); + foreach ($details as $detail) { + $arrBuff = preg_split('/\s+:\s+/', trim($detail)); + if (count($arrBuff) == 2) { + switch (strtolower($arrBuff[0])) { + case 'model name': + case 'cpu': + $dev->setModel($arrBuff[1]); + break; + case 'cpu mhz': + case 'clock': + $dev->setCpuSpeed($arrBuff[1]); + break; + case 'cycle frequency [hz]': + $dev->setCpuSpeed($arrBuff[1] / 1000000); + break; + case 'cpu0clktck': + $dev->setCpuSpeed(hexdec($arrBuff[1]) / 1000000); // Linux sparc64 + break; + case 'l2 cache': + case 'cache size': + $dev->setCache(preg_replace("/[a-zA-Z]/", "", $arrBuff[1]) * 1024); + break; + case 'bogomips': + case 'cpu0bogo': + $dev->setBogomips($arrBuff[1]); + break; + } + } + } + } + } + } + + /** + * PCI devices + * + * @return void + */ + private function _pci() + { + if (CommonFunctions::rfts('/proc/pci', $bufr)) { + $bufe = preg_split("/\n/", $bufr, -1, PREG_SPLIT_NO_EMPTY); + foreach ($bufe as $buf) { + if (preg_match('/^\s*Bus\s/', $buf)) { + $device = true; + continue; + } + if ($device) { + $dev = new HWDevice(); + $dev->setName(preg_replace('/\([^\)]+\)\.$/', '', trim($buf))); + $this->sys->setPciDevices($dev); +/* + list($key, $value) = preg_split('/: /', $buf, 2); + if (!preg_match('/bridge/i', $key) && !preg_match('/USB/i', $key)) { + $dev = new HWDevice(); + $dev->setName(preg_replace('/\([^\)]+\)\.$/', '', trim($value))); + $this->sys->setPciDevices($dev); + } +*/ + $device = false; + } + } + } + } + + /** + * IDE devices + * + * @return void + */ + private function _ide() + { + $bufd = CommonFunctions::gdc('/proc/ide', false); + foreach ($bufd as $file) { + if (preg_match('/^hd/', $file)) { + $dev = new HWDevice(); + $dev->setName(trim($file)); + if (CommonFunctions::rfts("/proc/ide/".$file."/media", $buf, 1)) { + if (trim($buf) == 'disk') { + if (CommonFunctions::rfts("/proc/ide/".$file."/capacity", $buf, 1, 4096, false)) { + $dev->setCapacity(trim($buf) * 512 / 1024); + } + } + } + $this->sys->setIdeDevices($dev); + } + } + } + + /** + * SCSI devices + * + * @return void + */ + private function _scsi() + { + $get_type = false; + if (CommonFunctions::rfts('/proc/scsi/scsi', $bufr, 0, 4096, PSI_DEBUG)) { + $bufe = preg_split("/\n/", $bufr, -1, PREG_SPLIT_NO_EMPTY); + foreach ($bufe as $buf) { + if (preg_match('/Vendor: (.*) Model: (.*) Rev: (.*)/i', $buf, $dev)) { + $get_type = true; + continue; + } + if ($get_type) { + preg_match('/Type:\s+(\S+)/i', $buf, $dev_type); + $dev = new HWDevice(); + $dev->setName($dev[1].' '.$dev[2].' ('.$dev_type[1].')'); + $this->sys->setScsiDevices($dev); + $get_type = false; + } + } + } + } + + /** + * USB devices + * + * @return void + */ + private function _usb() + { + if (CommonFunctions::rfts('/proc/bus/usb/devices', $bufr, 0, 4096, false)) { + $bufe = preg_split("/\n/", $bufr, -1, PREG_SPLIT_NO_EMPTY); + foreach ($bufe as $buf) { + if (preg_match('/^T/', $buf)) { + $devnum += 1; + $results[$devnum] = ""; + } elseif (preg_match('/^S:/', $buf)) { + list($key, $value) = preg_split('/: /', $buf, 2); + list($key, $value2) = preg_split('/=/', $value, 2); + if (trim($key) != "SerialNumber") { + $results[$devnum] .= " ".trim($value2); + } + } + } + foreach ($results as $var) { + $dev = new HWDevice(); + $dev->setName($var); + $this->sys->setUsbDevices($dev); + } + } + } + + /** + * Network devices + * includes also rx/tx bytes + * + * @return void + */ + private function _network() + { + if (CommonFunctions::executeProgram('netstat', '-ni | tail -n +2', $netstat)) { + $lines = preg_split("/\n/", $netstat, -1, PREG_SPLIT_NO_EMPTY); + foreach ($lines as $line) { + $ar_buf = preg_split("/\s+/", $line); + if (! empty($ar_buf[0]) && ! empty($ar_buf[3])) { + $dev = new NetDevice(); + $dev->setName($ar_buf[0]); + $dev->setRxBytes($ar_buf[4]); + $dev->setTxBytes($ar_buf[6]); + $dev->setErrors($ar_buf[5] + $ar_buf[7]); + $dev->setDrops($ar_buf[8]); + $this->sys->setNetDevices($dev); + } + } + } + } + + /** + * Physical memory information and Swap Space information + * + * @return void + */ + private function _memory() + { + if (CommonFunctions::rfts('/proc/meminfo', $bufr)) { + $bufe = preg_split("/\n/", $bufr, -1, PREG_SPLIT_NO_EMPTY); + foreach ($bufe as $buf) { + if (preg_match('/Mem:\s+(.*)$/', $buf, $ar_buf)) { + $ar_buf = preg_split('/\s+/', $ar_buf[1], 6); + $this->sys->setMemTotal($ar_buf[0]); + $this->sys->setMemUsed($ar_buf[1]); + $this->sys->setMemFree($ar_buf[2]); + $this->sys->setMemApplication($ar_buf[3]); + $this->sys->setMemBuffer($ar_buf[4]); + $this->sys->setMemCache($ar_buf[5]); + } + // Get info on individual swap files + if (CommonFunctions::rfts('/proc/swaps', $swaps)) { + $swapdevs = preg_split("/\n/", $swaps, -1, PREG_SPLIT_NO_EMPTY); + for ($i = 1, $max = (sizeof($swapdevs) - 1); $i < $max; $i++) { + $ar_buf = preg_split('/\s+/', $swapdevs[$i], 6); + $dev = new DiskDevice(); + $dev->setMountPoint($ar_buf[0]); + $dev->setName("SWAP"); + $dev->setFsType('swap'); + $dev->setTotal($ar_buf[2] * 1024); + $dev->setUsed($ar_buf[3] * 1024); + $dev->setFree($dev->getTotal() - $dev->getUsed()); + $this->sys->setSwapDevices($dev); + } + } + } + } + } + + /** + * filesystem information + * + * @return void + */ + private function _filesystems() + { + if (CommonFunctions::executeProgram('df', '-kP', $df, PSI_DEBUG)) { + $mounts = preg_split("/\n/", $df, -1, PREG_SPLIT_NO_EMPTY); + if (CommonFunctions::executeProgram('mount', '-v', $s, PSI_DEBUG)) { + $lines = preg_split("/\n/", $s, -1, PREG_SPLIT_NO_EMPTY); + while (list(, $line) = each($lines)) { + $a = preg_split('/ /', $line, -1, PREG_SPLIT_NO_EMPTY); + $fsdev[$a[0]] = $a[4]; + } + } + foreach ($mounts as $mount) { + $ar_buf = preg_split("/\s+/", $mount, 6); + $dev = new DiskDevice(); + $dev->setName($ar_buf[0]); + $dev->setTotal($ar_buf[1] * 1024); + $dev->setUsed($ar_buf[2] * 1024); + $dev->setFree($ar_buf[3] * 1024); + $dev->setMountPoint($ar_buf[5]); + if (isset($fsdev[$ar_buf[0]])) { + $dev->setFsType($fsdev[$ar_buf[0]]); + } + $this->sys->setDiskDevices($dev); + } + } + } + + /** + * Distribution + * + * @return void + */ + private function _distro() + { + $this->sys->setDistribution('HP-UX'); + $this->sys->setDistributionIcon('HPUX.png'); + } + + /** + * get the information + * + * @see PSI_Interface_OS::build() + * + * @return Void + */ + public function build() + { + $this->_distro(); + $this->_hostname(); + $this->_kernel(); + $this->_uptime(); + $this->_users(); + $this->_loadavg(); + $this->_cpuinfo(); + $this->_pci(); + $this->_ide(); + $this->_scsi(); + $this->_usb(); + $this->_network(); + $this->_memory(); + $this->_filesystems(); + } +} diff --git a/sources/includes/os/class.Haiku.inc.php b/sources/includes/os/class.Haiku.inc.php new file mode 100644 index 0000000..413817a --- /dev/null +++ b/sources/includes/os/class.Haiku.inc.php @@ -0,0 +1,384 @@ + + * @copyright 2012 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version SVN: $Id: class.Haiku.inc.php 687 2012-09-06 20:54:49Z namiltd $ + * @link http://phpsysinfo.sourceforge.net + */ + /** + * Haiku sysinfo class + * get all the required information from Haiku system + * + * @category PHP + * @package PSI Haiku OS class + * @author Mieczyslaw Nalewaj + * @copyright 2012 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version Release: 3.0 + * @link http://phpsysinfo.sourceforge.net + */ +class Haiku extends OS +{ + /** + * call parent constructor + */ + public function __construct() + { + parent::__construct(); + } + + /** + * get the cpu information + * + * @return array + */ + protected function _cpuinfo() + { + + if (CommonFunctions::executeProgram('sysinfo', '-cpu', $bufr, PSI_DEBUG)) { + $cpus = preg_split("/\nCPU #\d+/", $bufr, -1, PREG_SPLIT_NO_EMPTY); + $cpuspeed = ""; + foreach ($cpus as $cpu) { + if (preg_match("/^.*running at (\d+)MHz/", $cpu, $ar_buf)) { + $cpuspeed = $ar_buf[1]; + } elseif (preg_match("/^: \"(.*)\"/", $cpu, $ar_buf)) { + $dev = new CpuDevice(); + $dev->setModel($ar_buf[1]); + $arrLines = preg_split("/\n/", $cpu, -1, PREG_SPLIT_NO_EMPTY); + foreach ($arrLines as $Line) { + if (preg_match("/^\s+Data TLB:\s+(.*)K-byte/", $Line, $Line_buf)) { + $dev->setCache(max($Line_buf[1]*1024, $dev->getCache())); + } elseif (preg_match("/^\s+Data TLB:\s+(.*)M-byte/", $Line, $Line_buf)) { + $dev->setCache(max($Line_buf[1]*1024*1024, $dev->getCache())); + } elseif (preg_match("/^\s+Data TLB:\s+(.*)G-byte/", $Line, $Line_buf)) { + $dev->setCache(max($Line_buf[1]*1024*1024*1024, $dev->getCache())); + } elseif (preg_match("/\s+VMX/", $Line, $Line_buf)) { + $dev->setVirt("vmx"); + } elseif (preg_match("/\s+SVM/", $Line, $Line_buf)) { + $dev->setVirt("svm"); + } + } + if ($cpuspeed != "")$dev->setCpuSpeed($cpuspeed); + $this->sys->setCpus($dev); + //echo ">>>>>".$cpu; + } + } + } + } + + /** + * PCI devices + * get the pci device information + * + * @return void + */ + protected function _pci() + { + if (CommonFunctions::executeProgram('listdev', '', $bufr, PSI_DEBUG)) { +// $devices = preg_split("/^device |\ndevice /", $bufr, -1, PREG_SPLIT_NO_EMPTY); + $devices = preg_split("/^device /m", $bufr, -1, PREG_SPLIT_NO_EMPTY); + foreach ($devices as $device) { + $ar_buf = preg_split("/\n/", $device); + if (count($ar_buf) >= 3) { + if (preg_match("/^([^\(\[\n]*)/", $device, $ar_buf2)) { + if (preg_match("/^[^\(]*\((.*)\)/", $device, $ar_buf3)) { + $ar_buf2[1] = $ar_buf3[1]; + } + $name = trim($ar_buf2[1]).": "; + + if (preg_match("/^\s+vendor\s+[0-9a-fA-F]{4}:\s+(.*)/", $ar_buf[1], $ar_buf3)) { + $name .=$ar_buf3[1]." "; + } + if (preg_match("/^\s+device\s+[0-9a-fA-F]{4}:\s+(.*)/", $ar_buf[2], $ar_buf3)) { + $name .=$ar_buf3[1]." "; + } + $dev = new HWDevice(); + $dev->setName(trim($name)); + $this->sys->setPciDevices($dev); + } + } + } + } + } + + /** + * USB devices + * get the usb device information + * + * @return void + */ + protected function _usb() + { + if (CommonFunctions::executeProgram('listusb', '', $bufr, PSI_DEBUG)) { + $devices = preg_split("/\n/", $bufr); + foreach ($devices as $device) { + if (preg_match("/^\S+\s+\S+\s+\"(.*)\"\s+\"(.*)\"/", $device, $ar_buf)) { + $dev = new HWDevice(); + $dev->setName(trim($ar_buf[1]." ".$ar_buf[2])); + $this->sys->setUSBDevices($dev); + } + } + } + } + + /** + * Haiku Version + * + * @return void + */ + private function _kernel() + { + if (CommonFunctions::executeProgram('uname', '-rvm', $ret)) { + $this->sys->setKernel($ret); + } + } + + /** + * Distribution + * + * @return void + */ + protected function _distro() + { + if (CommonFunctions::executeProgram('uname', '-sr', $ret)) + $this->sys->setDistribution($ret); + else + $this->sys->setDistribution('Haiku'); + + $this->sys->setDistributionIcon('Haiku.png'); + } + + /** + * UpTime + * time the system is running + * + * @return void + */ + private function _uptime() + { + if (CommonFunctions::executeProgram('uptime', '-u', $buf)) { + if (preg_match("/^up (\d+) minute[s]?/", $buf, $ar_buf)) { + $min = $ar_buf[1]; + $this->sys->setUptime($min * 60); + } elseif (preg_match("/^up (\d+) hour[s]?, (\d+) minute[s]?/", $buf, $ar_buf)) { + $min = $ar_buf[2]; + $hours = $ar_buf[1]; + $this->sys->setUptime($hours * 3600 + $min * 60); + } elseif (preg_match("/^up (\d+) day[s]?, (\d+) hour[s]?, (\d+) minute[s]?/", $buf, $ar_buf)) { + $min = $ar_buf[3]; + $hours = $ar_buf[2]; + $days = $ar_buf[1]; + $this->sys->setUptime($days * 86400 + $hours * 3600 + $min * 60); + } + } + } + + /** + * Processor Load + * optionally create a loadbar + * + * @return void + */ + private function _loadavg() + { + if (CommonFunctions::executeProgram('top', '-n 1 -i 1', $buf)) { + if (preg_match("/\s+(\S+)%\s+TOTAL\s+\(\S+%\s+idle time/", $buf, $ar_buf)) { + $this->sys->setLoad($ar_buf[1]); + if (PSI_LOAD_BAR) { + $this->sys->setLoadPercent(round($ar_buf[1])); + } + } + } + } + + /** + * Number of Users + * + * @return void + */ + protected function _users() + { + $this->sys->setUsers(1); + } + + /** + * Virtual Host Name + * + * @return void + */ + private function _hostname() + { + if (PSI_USE_VHOST === true) { + $this->sys->setHostname(getenv('SERVER_NAME')); + } else { + if (CommonFunctions::executeProgram('uname', '-n', $result, PSI_DEBUG)) { + $ip = gethostbyname($result); + if ($ip != $result) { + $this->sys->setHostname(gethostbyaddr($ip)); + } + } + } + } + + /** + * Physical memory information and Swap Space information + * + * @return void + */ + private function _memory() + { + if (CommonFunctions::executeProgram('sysinfo', '-mem', $bufr, PSI_DEBUG)) { + if (preg_match("/(.*)bytes free\s+\(used\/max\s+(.*)\s+\/\s+(.*)\)\s*\n\s+\(cached\s+(.*)\)/", $bufr, $ar_buf)) { + $this->sys->setMemTotal($ar_buf[3]); + $this->sys->setMemFree($ar_buf[1]); + $this->sys->setMemCache($ar_buf[4]); + $this->sys->setMemUsed($ar_buf[2]); + } + } + if (CommonFunctions::executeProgram('vmstat', '', $bufr, PSI_DEBUG)) { + if (preg_match("/max swap space:\s+(.*)\nfree swap space:\s+(.*)\n/", $bufr, $ar_buf)) { + if ($ar_buf[1]>0) { + $dev = new DiskDevice(); + $dev->setMountPoint("/boot/common/var/swap"); + $dev->setName("SWAP"); + $dev->setTotal($ar_buf[1]); + $dev->setFree($ar_buf[2]); + $dev->setUSed($ar_buf[1]-$ar_buf[2]); + $this->sys->setSwapDevices($dev); + } + } + } + } + + /** + * filesystem information + * + * @return void + */ + private function _filesystems() + { + if (CommonFunctions::executeProgram('df', '-b', $df, PSI_DEBUG)) { + $df = preg_split("/\n/", $df, -1, PREG_SPLIT_NO_EMPTY); + foreach ($df as $df_line) { + $ar_buf = preg_split("/\s+/", $df_line); + if ((substr($df_line, 0, 1) == "/") && (count($ar_buf) == 6)) { + $dev = new DiskDevice(); + $dev->setMountPoint($ar_buf[0]); + $dev->setName($ar_buf[5]); + $dev->setFsType($ar_buf[1]); + $dev->setOptions($ar_buf[4]); + $dev->setTotal($ar_buf[2] * 1024); + $dev->setFree($ar_buf[3] * 1024); + $dev->setUsed($dev->getTotal() - $dev->getFree()); + $this->sys->setDiskDevices($dev); + } + } + } + } + + /** + * network information + * + * @return void + */ + private function _network() + { + if (CommonFunctions::executeProgram('ifconfig', '', $bufr, PSI_DEBUG)) { + $lines = preg_split("/\n/", $bufr, -1, PREG_SPLIT_NO_EMPTY); + $was = false; + foreach ($lines as $line) { + if (preg_match("/^(\S+)/", $line, $ar_buf)) { + if ($was) { + $dev->setErrors($errors); + $dev->setDrops($drops); + $this->sys->setNetDevices($dev); + } + $errors = 0; + $drops = 0; + $dev = new NetDevice(); + $dev->setName($ar_buf[1]); + $was = true; + } else { + if ($was) { + if (preg_match('/\sReceive:\s\d+\spackets,\s(\d+)\serrors,\s(\d+)\sbytes,\s\d+\smcasts,\s(\d+)\sdropped/i', $line, $ar_buf2)) { + $errors +=$ar_buf2[1]; + $drops +=$ar_buf2[3]; + $dev->setRxBytes($ar_buf2[2]); + } elseif (preg_match('/\sTransmit:\s\d+\spackets,\s(\d+)\serrors,\s(\d+)\sbytes,\s\d+\smcasts,\s(\d+)\sdropped/i', $line, $ar_buf2)) { + $errors +=$ar_buf2[1]; + $drops +=$ar_buf2[3]; + $dev->setTxBytes($ar_buf2[2]); + } + + if (defined('PSI_SHOW_NETWORK_INFOS') && (PSI_SHOW_NETWORK_INFOS)) { + if (preg_match('/\sEthernet,\s+Address:\s(\S*)/i', $line, $ar_buf2)) + $dev->setInfo(preg_replace('/:/', '-', strtoupper($ar_buf2[1]))); + elseif (preg_match('/^\s+inet\saddr:\s(\S*),/i', $line, $ar_buf2)) + $dev->setInfo(($dev->getInfo()?$dev->getInfo().';':'').$ar_buf2[1]); + elseif (preg_match('/^\s+inet6\saddr:\s(\S*),/i', $line, $ar_buf2) + && ($ar_buf2[1]!="::") && !preg_match('/^fe80::/i', $ar_buf2[1])) + $dev->setInfo(($dev->getInfo()?$dev->getInfo().';':'').strtolower($ar_buf2[1])); + } + } + } + } + if ($was) { + $dev->setErrors($errors); + $dev->setDrops($drops); + $this->sys->setNetDevices($dev); + } + } + } + + /** + * Processes + * + * @return void + */ + protected function _processes() + { + if (CommonFunctions::executeProgram('ps', '', $bufr, PSI_DEBUG)) { + $lines = preg_split("/\n/", $bufr, -1, PREG_SPLIT_NO_EMPTY); + $processes['*'] = 0; + foreach ($lines as $line) { + if (preg_match("/^(kernel_team|\/)/", $line, $ar_buf)) { + $processes['*']++; + } + } + if ($processes['*'] > 0) { + $processes[' '] = $processes['*']; + $this->sys->setProcesses($processes); + } + } + } + + /** + * get the information + * + * @return Void + */ + public function build() + { + $this->error->addError("WARN", "The Haiku version of phpSysInfo is a work in progress, some things currently don't work"); + $this->_distro(); + $this->_hostname(); + $this->_kernel(); + $this->_uptime(); + $this->_users(); + $this->_loadavg(); + $this->_pci(); + $this->_usb(); + $this->_cpuinfo(); + $this->_memory(); + $this->_filesystems(); + $this->_network(); + $this->_processes(); + } +} diff --git a/sources/includes/os/class.Linux.inc.php b/sources/includes/os/class.Linux.inc.php new file mode 100644 index 0000000..5d93718 --- /dev/null +++ b/sources/includes/os/class.Linux.inc.php @@ -0,0 +1,1281 @@ + + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version SVN: $Id: class.Linux.inc.php 712 2012-12-05 14:09:18Z namiltd $ + * @link http://phpsysinfo.sourceforge.net + */ + /** + * Linux sysinfo class + * get all the required information from Linux system + * + * @category PHP + * @package PSI Linux OS class + * @author Michael Cramer + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version Release: 3.0 + * @link http://phpsysinfo.sourceforge.net + */ +class Linux extends OS +{ + /** + * Assoc array of all CPUs loads. + */ + protected $_cpu_loads; + + /** + * call parent constructor + */ + public function __construct() + { + parent::__construct(); + } + + /** + * Machine + * + * @return void + */ + private function _machine() + { + if ((CommonFunctions::rfts('/var/log/dmesg', $result, 0, 4096, false) + && preg_match('/^[\s\[\]\.\d]*DMI:\s*(.*)/m', $result, $ar_buf)) + ||(CommonFunctions::executeProgram('dmesg', '', $result, false) + && preg_match('/^[\s\[\]\.\d]*DMI:\s*(.*)/m', $result, $ar_buf))) { + $this->sys->setMachine(trim($ar_buf[1])); + } else { //data from /sys/devices/virtual/dmi/id/ + $machine = ""; + $product = ""; + $board = ""; + $bios = ""; + if (CommonFunctions::rfts('/sys/devices/virtual/dmi/id/board_vendor', $buf, 1, 4096, false) && (trim($buf)!="")) { + $machine = trim($buf); + } + if (CommonFunctions::rfts('/sys/devices/virtual/dmi/id/product_name', $buf, 1, 4096, false) && (trim($buf)!="")) { + $product = trim($buf); + } + if (CommonFunctions::rfts('/sys/devices/virtual/dmi/id/board_name', $buf, 1, 4096, false) && (trim($buf)!="")) { + $board = trim($buf); + } + if (CommonFunctions::rfts('/sys/devices/virtual/dmi/id/bios_version', $buf, 1, 4096, false) && (trim($buf)!="")) { + $bios = trim($buf); + } + if (CommonFunctions::rfts('/sys/devices/virtual/dmi/id/bios_date', $buf, 1, 4096, false) && (trim($buf)!="")) { + $bios = trim($bios." ".trim($buf)); + } + if ($product != "") { + $machine .= " ".$product; + } + if ($board != "") { + $machine .= "/".$board; + } + if ($bios != "") { + $machine .= ", BIOS ".$bios; + } + + if ($machine != "") { + $this->sys->setMachine(trim($machine)); + } elseif (CommonFunctions::fileexists($filename="/etc/config/uLinux.conf") // QNAP detection + && CommonFunctions::rfts($filename, $buf, 0, 4096, false) + && preg_match("/^Rsync\sModel\s*=\s*QNAP/m", $buf) + && CommonFunctions::fileexists($filename="/etc/platform.conf") // Platform detection + && CommonFunctions::rfts($filename, $buf, 0, 4096, false) + && preg_match("/^DISPLAY_NAME\s*=\s*(\S+)/m", $buf, $mach_buf) && ($mach_buf[1]!=="")) { + $this->sys->setMachine("QNAP ".$mach_buf[1]); + } + } + } + + /** + * Hostname + * + * @return void + */ + protected function _hostname() + { + if (PSI_USE_VHOST === true) { + $this->sys->setHostname(getenv('SERVER_NAME')); + } else { + if (CommonFunctions::rfts('/proc/sys/kernel/hostname', $result, 1)) { + $result = trim($result); + $ip = gethostbyname($result); + if ($ip != $result) { + $this->sys->setHostname(gethostbyaddr($ip)); + } + } + } + } + + /** + * Kernel Version + * + * @return void + */ + private function _kernel() + { + $result = ""; + if (CommonFunctions::executeProgram($uname="uptrack-uname", '-r', $strBuf, false) || // show effective kernel if ksplice uptrack is installed + CommonFunctions::executeProgram($uname="uname", '-r', $strBuf, PSI_DEBUG)) { + $result = $strBuf; + if (CommonFunctions::executeProgram($uname, '-v', $strBuf, PSI_DEBUG)) { + if (preg_match('/SMP/', $strBuf)) { + $result .= ' (SMP)'; + } + } + if (CommonFunctions::executeProgram($uname, '-m', $strBuf, PSI_DEBUG)) { + $result .= ' '.$strBuf; + } + } elseif (CommonFunctions::rfts('/proc/version', $strBuf, 1) && preg_match('/version (.*?) /', $strBuf, $ar_buf)) { + $result = $ar_buf[1]; + if (preg_match('/SMP/', $strBuf)) { + $result .= ' (SMP)'; + } + } + if ($result != "") { + if (CommonFunctions::rfts('/proc/self/cgroup', $strBuf2, 0, 4096, false)) { + if (preg_match('/:\/lxc\//m', $strBuf2)) { + $result .= ' [lxc]'; + } elseif (preg_match('/:\/docker\//m', $strBuf2)) { + $result .= ' [docker]'; + } elseif (preg_match('/:\/system\.slice\/docker\-/m', $strBuf2)) { + $result .= ' [docker]'; + } + } + $this->sys->setKernel($result); + } + } + + /** + * UpTime + * time the system is running + * + * @return void + */ + protected function _uptime() + { + CommonFunctions::rfts('/proc/uptime', $buf, 1); + $ar_buf = preg_split('/ /', $buf); + $this->sys->setUptime(trim($ar_buf[0])); + } + + /** + * Processor Load + * optionally create a loadbar + * + * @return void + */ + protected function _loadavg() + { + if (CommonFunctions::rfts('/proc/loadavg', $buf)) { + $result = preg_split("/\s/", $buf, 4); + // don't need the extra values, only first three + unset($result[3]); + $this->sys->setLoad(implode(' ', $result)); + } + if (PSI_LOAD_BAR) { + $this->sys->setLoadPercent($this->_parseProcStat('cpu')); + } + } + + /** + * fill the load for a individual cpu, through parsing /proc/stat for the specified cpu + * + * @param String $cpuline cpu for which load should be meassured + * + * @return Integer + */ + protected function _parseProcStat($cpuline) + { + if (is_null($this->_cpu_loads)) { + $this->_cpu_loads = array(); + + if (CommonFunctions::rfts('/proc/stat', $buf)) { + if (preg_match_all('/^(cpu[0-9]*) (.*)/m', $buf, $matches, PREG_SET_ORDER)) { + foreach ($matches as $line) { + $cpu = $line[1]; + $buf2 = $line[2]; + + $this->_cpu_loads[$cpu] = array(); + + $ab = 0; + $ac = 0; + $ad = 0; + $ae = 0; + sscanf($buf2, "%Ld %Ld %Ld %Ld", $ab, $ac, $ad, $ae); + $this->_cpu_loads[$cpu]['load'] = $ab + $ac + $ad; // cpu.user + cpu.sys + $this->_cpu_loads[$cpu]['total'] = $ab + $ac + $ad + $ae; // cpu.total + } + } + } + // we need a second value, wait 1 second befor getting (< 1 second no good value will occour) + if (PSI_LOAD_BAR) { + sleep(1); + } + if (CommonFunctions::rfts('/proc/stat', $buf)) { + if (preg_match_all('/^(cpu[0-9]*) (.*)/m', $buf, $matches, PREG_SET_ORDER)) { + foreach ($matches as $line) { + $cpu = $line[1]; + $buf2 = $line[2]; + + $ab = 0; + $ac = 0; + $ad = 0; + $ae = 0; + sscanf($buf2, "%Ld %Ld %Ld %Ld", $ab, $ac, $ad, $ae); + $load2 = $ab + $ac + $ad; // cpu.user + cpu.sys + $total2 = $ab + $ac + $ad + $ae; // cpu.total + $total = $this->_cpu_loads[$cpu]['total']; + $load = $this->_cpu_loads[$cpu]['load']; + $this->_cpu_loads[$cpu] = 0; + if ($total > 0 && $total2 > 0 && $load > 0 && $load2 > 0 && $total2 != $total && $load2 != $load) { + $this->_cpu_loads[$cpu] = (100 * ($load2 - $load)) / ($total2 - $total); + } + } + } + } + } + + if (isset($this->_cpu_loads[$cpuline])) { + return $this->_cpu_loads[$cpuline]; + } + + return 0; + } + + /** + * CPU information + * All of the tags here are highly architecture dependant. + * + * @return void + */ + protected function _cpuinfo() + { + if (CommonFunctions::rfts('/proc/cpuinfo', $bufr)) { + $processors = preg_split('/\s?\n\s?\n/', trim($bufr)); + $procname = null; + foreach ($processors as $processor) { + $proc = null; + $arch = null; + $dev = new CpuDevice(); + $details = preg_split("/\n/", $processor, -1, PREG_SPLIT_NO_EMPTY); + foreach ($details as $detail) { + $arrBuff = preg_split('/\s*:\s*/', trim($detail)); + if (count($arrBuff) == 2) { + switch (strtolower($arrBuff[0])) { + case 'processor': + $proc = trim($arrBuff[1]); + if (is_numeric($proc)) { + if (strlen($procname)>0) { + $dev->setModel($procname); + } + } else { + $procname = $proc; + $dev->setModel($procname); + } + break; + case 'model name': + case 'cpu model': + case 'cpu type': + case 'cpu': + $dev->setModel($arrBuff[1]); + break; + case 'cpu mhz': + case 'clock': + if ($arrBuff[1] > 0) { //openSUSE fix + $dev->setCpuSpeed($arrBuff[1]); + } + break; + case 'cycle frequency [hz]': + $dev->setCpuSpeed($arrBuff[1] / 1000000); + break; + case 'cpu0clktck': + $dev->setCpuSpeed(hexdec($arrBuff[1]) / 1000000); // Linux sparc64 + break; + case 'l2 cache': + case 'cache size': + $dev->setCache(preg_replace("/[a-zA-Z]/", "", $arrBuff[1]) * 1024); + break; + case 'initial bogomips': + case 'bogomips': + case 'cpu0bogo': + $dev->setBogomips($arrBuff[1]); + break; + case 'flags': + if (preg_match("/ vmx/", $arrBuff[1])) { + $dev->setVirt("vmx"); + } elseif (preg_match("/ svm/", $arrBuff[1])) { + $dev->setVirt("svm"); + } elseif (preg_match("/ hypervisor/", $arrBuff[1])) { + $dev->setVirt("hypervisor"); + } + break; + case 'i size': + case 'd size': + if ($dev->getCache() === null) { + $dev->setCache($arrBuff[1] * 1024); + } else { + $dev->setCache($dev->getCache() + ($arrBuff[1] * 1024)); + } + break; + case 'cpu architecture': + $arch = trim($arrBuff[1]); + break; + } + } + } + // sparc64 specific code follows + // This adds the ability to display the cache that a CPU has + // Originally made by Sven Blumenstein in 2004 + // Modified by Tom Weustink in 2004 + $sparclist = array('SUNW,UltraSPARC@0,0', 'SUNW,UltraSPARC-II@0,0', 'SUNW,UltraSPARC@1c,0', 'SUNW,UltraSPARC-IIi@1c,0', 'SUNW,UltraSPARC-II@1c,0', 'SUNW,UltraSPARC-IIe@0,0'); + foreach ($sparclist as $name) { + if (CommonFunctions::rfts('/proc/openprom/'.$name.'/ecache-size', $buf, 1, 32, false)) { + $dev->setCache(base_convert($buf, 16, 10)); + } + } + // sparc64 specific code ends + + // XScale detection code + if (($arch === "5TE") && ($dev->getBogomips() != null)) { + $dev->setCpuSpeed($dev->getBogomips()); //BogoMIPS are not BogoMIPS on this CPU, it's the speed + $dev->setBogomips(null); // no BogoMIPS available, unset previously set BogoMIPS + } + + if ($proc != null) { + if (!is_numeric($proc)) { + $proc = 0; + } + // variable speed processors specific code follows + if (CommonFunctions::rfts('/sys/devices/system/cpu/cpu'.$proc.'/cpufreq/cpuinfo_cur_freq', $buf, 1, 4096, false)) { + $dev->setCpuSpeed($buf / 1000); + } elseif (CommonFunctions::rfts('/sys/devices/system/cpu/cpu'.$proc.'/cpufreq/scaling_cur_freq', $buf, 1, 4096, false)) { + $dev->setCpuSpeed($buf / 1000); + } + if (CommonFunctions::rfts('/sys/devices/system/cpu/cpu'.$proc.'/cpufreq/cpuinfo_max_freq', $buf, 1, 4096, false)) { + $dev->setCpuSpeedMax($buf / 1000); + } + if (CommonFunctions::rfts('/sys/devices/system/cpu/cpu'.$proc.'/cpufreq/cpuinfo_min_freq', $buf, 1, 4096, false)) { + $dev->setCpuSpeedMin($buf / 1000); + } + // variable speed processors specific code ends + if (PSI_LOAD_BAR) { + $dev->setLoad($this->_parseProcStat('cpu'.$proc)); + } + + if (CommonFunctions::rfts('/proc/acpi/thermal_zone/THRM/temperature', $buf, 1, 4096, false)) { + $dev->setTemp(substr($buf, 25, 2)); + } + if ($dev->getModel() === "") { + $dev->setModel("unknown"); + } + $this->sys->setCpus($dev); + } + } + } + } + + /** + * PCI devices + * + * @return void + */ + private function _pci() + { + if ($arrResults = Parser::lspci()) { + foreach ($arrResults as $dev) { + $this->sys->setPciDevices($dev); + } + } elseif (CommonFunctions::rfts('/proc/pci', $strBuf, 0, 4096, false)) { + $booDevice = false; + $arrBuf = preg_split("/\n/", $strBuf, -1, PREG_SPLIT_NO_EMPTY); + foreach ($arrBuf as $strLine) { + if (preg_match('/^\s*Bus\s/', $strLine)) { + $booDevice = true; + continue; + } + if ($booDevice) { + $dev = new HWDevice(); + $dev->setName(preg_replace('/\([^\)]+\)\.$/', '', trim($strLine))); + $this->sys->setPciDevices($dev); +/* + list($strKey, $strValue) = preg_split('/: /', $strLine, 2); + if (!preg_match('/bridge/i', $strKey) && !preg_match('/USB/i ', $strKey)) { + $dev = new HWDevice(); + $dev->setName(preg_replace('/\([^\)]+\)\.$/', '', trim($strValue))); + $this->sys->setPciDevices($dev); + } +*/ + $booDevice = false; + } + } + } else { + $pcidevices = glob('/sys/bus/pci/devices/*/uevent', GLOB_NOSORT); + if (($total = count($pcidevices)) > 0) { + $buf = ""; + for ($i = 0; $i < $total; $i++) { + if (CommonFunctions::rfts($pcidevices[$i], $buf, 0, 4096, false) && (trim($buf) != "")) { + $pcibuf = ""; + if (preg_match("/^PCI_CLASS=(\S+)/m", trim($buf), $subbuf)) { + $pcibuf = "Class ".$subbuf[1].":"; + } + if (preg_match("/^PCI_ID=(\S+)/m", trim($buf), $subbuf)) { + $pcibuf .= " Device ".$subbuf[1]; + } + if (preg_match("/^DRIVER=(\S+)/m", trim($buf), $subbuf)) { + $pcibuf .= " Driver ".$subbuf[1]; + } + $dev = new HWDevice(); + if (trim($pcibuf) != "") { + $dev->setName(trim($pcibuf)); + } else { + $dev->setName("unknown"); + } + $this->sys->setPciDevices($dev); + } + } + } + } + } + + /** + * IDE devices + * + * @return void + */ + private function _ide() + { + $bufd = CommonFunctions::gdc('/proc/ide', false); + foreach ($bufd as $file) { + if (preg_match('/^hd/', $file)) { + $dev = new HWDevice(); + $dev->setName(trim($file)); + if (CommonFunctions::rfts("/proc/ide/".$file."/media", $buf, 1)) { + if (trim($buf) == 'disk') { + if (CommonFunctions::rfts("/proc/ide/".$file."/capacity", $buf, 1, 4096, false) || CommonFunctions::rfts("/sys/block/".$file."/size", $buf, 1, 4096, false)) { + $dev->setCapacity(trim($buf) * 512 / 1024); + } + } + } + if (CommonFunctions::rfts("/proc/ide/".$file."/model", $buf, 1)) { + $dev->setName($dev->getName().": ".trim($buf)); + } + $this->sys->setIdeDevices($dev); + } + } + } + + /** + * SCSI devices + * + * @return void + */ + private function _scsi() + { + $get_type = false; + $device = null; + if (CommonFunctions::executeProgram('lsscsi', '-c', $bufr, PSI_DEBUG) || CommonFunctions::rfts('/proc/scsi/scsi', $bufr, 0, 4096, PSI_DEBUG)) { + $bufe = preg_split("/\n/", $bufr, -1, PREG_SPLIT_NO_EMPTY); + foreach ($bufe as $buf) { + if (preg_match('/Vendor: (.*) Model: (.*) Rev: (.*)/i', $buf, $devices)) { + $get_type = true; + $device = $devices; + continue; + } + if ($get_type) { + preg_match('/Type:\s+(\S+)/i', $buf, $dev_type); + $dev = new HWDevice(); + $dev->setName($device[1].' '.$device[2].' ('.$dev_type[1].')'); + $this->sys->setScsiDevices($dev); + $get_type = false; + } + } + } + } + + /** + * USB devices + * + * @return array + */ + private function _usb() + { + $devnum = -1; + if (CommonFunctions::executeProgram('lsusb', '', $bufr, PSI_DEBUG) && (trim($bufr) !== "")) { + $bufe = preg_split("/\n/", $bufr, -1, PREG_SPLIT_NO_EMPTY); + foreach ($bufe as $buf) { + $device = preg_split("/ /", $buf, 7); + if (isset($device[6]) && trim($device[6]) != "") { + $dev = new HWDevice(); + $dev->setName(trim($device[6])); + $this->sys->setUsbDevices($dev); + } elseif (isset($device[5]) && trim($device[5]) != "") { + $dev = new HWDevice(); + $dev->setName("unknown"); + $this->sys->setUsbDevices($dev); + } + } + } elseif (CommonFunctions::rfts('/proc/bus/usb/devices', $bufr, 0, 4096, false)) { + $bufe = preg_split("/\n/", $bufr, -1, PREG_SPLIT_NO_EMPTY); + foreach ($bufe as $buf) { + if (preg_match('/^T/', $buf)) { + $devnum += 1; + $results[$devnum] = ""; + } elseif (preg_match('/^S:/', $buf)) { + list($key, $value) = preg_split('/: /', $buf, 2); + list($key, $value2) = preg_split('/=/', $value, 2); + if ((trim($key) == "Manufacturer") && (preg_match("/^linux\s/i", trim($value2)))) { + $value2 = "Linux"; + } + if (trim($key) != "SerialNumber") { + $results[$devnum] .= " ".trim($value2); + } + } + } + foreach ($results as $var) { + $dev = new HWDevice(); + $var = trim($var); + if ($var != "") { + $dev->setName($var); + } else { + $dev->setName("unknown"); + } + $this->sys->setUsbDevices($dev); + } + } else { + $usbdevices = glob('/sys/bus/usb/devices/*/idProduct', GLOB_NOSORT); + if (($total = count($usbdevices)) > 0) { + $buf = ""; + for ($i = 0; $i < $total; $i++) { + if (CommonFunctions::rfts($usbdevices[$i], $buf, 1, 4096, false) && (trim($buf) != "")) { //is readable + $product = preg_replace("/\/idProduct$/", "/product", $usbdevices[$i]); + $manufacturer = preg_replace("/\/idProduct$/", "/manufacturer", $usbdevices[$i]); + $usbbuf = ""; + if (CommonFunctions::fileexists($manufacturer) && CommonFunctions::rfts($manufacturer, $buf, 1, 4096, false) && (trim($buf) != "")) { + if (preg_match("/^linux\s/i", trim($buf))) { + $usbbuf = "Linux"; + } else { + $usbbuf = trim($buf); + } + } + if (CommonFunctions::fileexists($product) && CommonFunctions::rfts($product, $buf, 1, 4096, false) && (trim($buf) != "")) { + $usbbuf .= " ".trim($buf); + } + $dev = new HWDevice(); + if (trim($usbbuf) != "") { + $dev->setName(trim($usbbuf)); + } else { + $dev->setName("unknown"); + } + $this->sys->setUsbDevices($dev); + } + } + } + } + } + + /** + * I2C devices + * + * @return void + */ + protected function _i2c() + { + $i2cdevices = glob('/sys/bus/i2c/devices/*/name', GLOB_NOSORT); + if (($total = count($i2cdevices)) > 0) { + $buf = ""; + for ($i = 0; $i < $total; $i++) { + if (CommonFunctions::rfts($i2cdevices[$i], $buf, 1, 4096, false) && (trim($buf) != "")) { + $dev = new HWDevice(); + $dev->setName(trim($buf)); + $this->sys->setI2cDevices($dev); + } + } + } + } + + /** + * Network devices + * includes also rx/tx bytes + * + * @return void + */ + protected function _network() + { + if (CommonFunctions::rfts('/proc/net/dev', $bufr, 0, 4096, PSI_DEBUG)) { + $bufe = preg_split("/\n/", $bufr, -1, PREG_SPLIT_NO_EMPTY); + foreach ($bufe as $buf) { + if (preg_match('/:/', $buf)) { + list($dev_name, $stats_list) = preg_split('/:/', $buf, 2); + $stats = preg_split('/\s+/', trim($stats_list)); + $dev = new NetDevice(); + $dev->setName(trim($dev_name)); + $dev->setRxBytes($stats[0]); + $dev->setTxBytes($stats[8]); + $dev->setErrors($stats[2] + $stats[10]); + $dev->setDrops($stats[3] + $stats[11]); + if (defined('PSI_SHOW_NETWORK_INFOS') && (PSI_SHOW_NETWORK_INFOS)) { + if ((CommonFunctions::executeProgram('ip', 'addr show '.trim($dev_name), $bufr2, PSI_DEBUG) && (trim($bufr2)!="")) + || CommonFunctions::executeProgram('ifconfig', trim($dev_name).' 2>/dev/null', $bufr2, PSI_DEBUG)) { + $bufe2 = preg_split("/\n/", $bufr2, -1, PREG_SPLIT_NO_EMPTY); + $macaddr = ""; + foreach ($bufe2 as $buf2) { +// if (preg_match('/^'.trim($dev_name).'\s+Link\sencap:Ethernet\s+HWaddr\s(\S+)/i', $buf2, $ar_buf2) + if (preg_match('/\s+encap:Ethernet\s+HWaddr\s(\S+)/i', $buf2, $ar_buf2) + || preg_match('/^\s+ether\s+(\S+)\s+txqueuelen/i', $buf2, $ar_buf2) + || preg_match('/^\s+link\/ether\s+(\S+)\s+brd/i', $buf2, $ar_buf2)) //ip + $macaddr = preg_replace('/:/', '-', strtoupper($ar_buf2[1])); + elseif (preg_match('/^\s+inet\saddr:(\S+)\s+P-t-P:(\S+)/i', $buf2, $ar_buf2) + || preg_match('/^\s+inet\s+(\S+)\s+netmask.+destination\s+(\S+)/i', $buf2, $ar_buf2) + || preg_match('/^\s+inet\s+([^\/\s]+).*peer\s+([^\/\s]+).*\s+scope\s((global)|(host))/i', $buf2, $ar_buf2)) { //ip + if ($ar_buf2[1] != $ar_buf2[2]) { + $dev->setInfo(($dev->getInfo()?$dev->getInfo().';':'').$ar_buf2[1].";:".$ar_buf2[2]); + } else { + $dev->setInfo(($dev->getInfo()?$dev->getInfo().';':'').$ar_buf2[1]); + } + } elseif (preg_match('/^\s+inet\saddr:(\S+)/i', $buf2, $ar_buf2) + || preg_match('/^\s+inet\s+(\S+)\s+netmask/i', $buf2, $ar_buf2) + || preg_match('/^'.trim($dev_name).':\s+ip\s+(\S+)\s+mask/i', $buf2, $ar_buf2) + || preg_match('/^\s+inet6\saddr:\s([^\/\s]+)(.+)\s+Scope:[GH]/i', $buf2, $ar_buf2) + || preg_match('/^\s+inet6\s+(\S+)\s+prefixlen(.+)(()|())/i', $buf2, $ar_buf2) + || preg_match('/^\s+inet6?\s+([^\/\s]+).*\s+scope\s((global)|(host))/i', $buf2, $ar_buf2)) //ip + $dev->setInfo(($dev->getInfo()?$dev->getInfo().';':'').strtolower($ar_buf2[1])); + } + } + if ($macaddr != "") { + $dev->setInfo($macaddr.($dev->getInfo()?';'.$dev->getInfo():'')); + } + if (CommonFunctions::rfts('/sys/class/net/'.trim($dev_name).'/speed', $buf, 1, 4096, false) && (trim($buf)!="") && ($buf > 0) && ($buf < 65535)) { + $speed = trim($buf); + if ($speed > 1000) { + $speed = $speed/1000; + $unit = "G"; + } else { + $unit = "M"; + } + if (CommonFunctions::rfts('/sys/class/net/'.trim($dev_name).'/duplex', $buf, 1, 4096, false) && (trim($buf)!="")) { + $dev->setInfo(($dev->getInfo()?$dev->getInfo().';':'').$speed.$unit.'b/s '.strtolower(trim($buf))); + } else { + $dev->setInfo(($dev->getInfo()?$dev->getInfo().';':'').$speed.$unit.'b/s'); + } + } + } + $this->sys->setNetDevices($dev); + } + } + } elseif (CommonFunctions::executeProgram('ip', 'addr show', $bufr, PSI_DEBUG) && (trim($bufr)!="")) { + $lines = preg_split("/\n/", $bufr, -1, PREG_SPLIT_NO_EMPTY); + $was = false; + foreach ($lines as $line) { + if (preg_match("/^\d+:\s+([^\s:]+)/", $line, $ar_buf)) { + if ($was) { + if ($macaddr != "") { + $dev->setInfo($macaddr.($dev->getInfo()?';'.$dev->getInfo():'')); + } + if ($speedinfo != "") { + $dev->setInfo(($dev->getInfo()?$dev->getInfo().';':'').$speedinfo); + } + $this->sys->setNetDevices($dev); + } + $speedinfo = ""; + $macaddr = ""; + $dev = new NetDevice(); + $dev->setName($ar_buf[1]); + if (CommonFunctions::executeProgram('ip', '-s link show '.$ar_buf[1], $bufr2, PSI_DEBUG) && (trim($bufr2)!="") + && preg_match("/\n\s+RX:\s[^\n]+\n\s+(\d+)\s+\d+\s+(\d+)\s+(\d+)[^\n]+\n\s+TX:\s[^\n]+\n\s+(\d+)\s+\d+\s+(\d+)\s+(\d+)/m", $bufr2, $ar_buf2)) { + $dev->setRxBytes($ar_buf2[1]); + $dev->setTxBytes($ar_buf2[4]); + $dev->setErrors($ar_buf2[2]+$ar_buf2[5]); + $dev->setDrops($ar_buf2[3]+$ar_buf2[6]); + } + $was = true; + if (defined('PSI_SHOW_NETWORK_INFOS') && (PSI_SHOW_NETWORK_INFOS)) { + if (CommonFunctions::rfts('/sys/class/net/'.$ar_buf[1].'/speed', $buf, 1, 4096, false) && (trim($buf)!="")) { + $speed = trim($buf); + if ($speed > 1000) { + $speed = $speed/1000; + $unit = "G"; + } else { + $unit = "M"; + } + if (CommonFunctions::rfts('/sys/class/net/'.$ar_buf[1].'/duplex', $buf, 1, 4096, false) && (trim($buf)!="")) { + $speedinfo = $speed.$unit.'b/s '.strtolower(trim($buf)); + } else { + $speedinfo = $speed.$unit.'b/s'; + } + } + } + } else { + if ($was) { + if (defined('PSI_SHOW_NETWORK_INFOS') && (PSI_SHOW_NETWORK_INFOS)) { + if (preg_match('/^\s+link\/ether\s+(\S+)\s+brd/i', $line, $ar_buf2)) + $macaddr = preg_replace('/:/', '-', strtoupper($ar_buf2[1])); + elseif (preg_match('/^\s+inet\s+([^\/\s]+).*peer\s+([^\/\s]+).*\s+scope\s((global)|(host))/i', $line, $ar_buf2)) { + if ($ar_buf2[1] != $ar_buf2[2]) { + $dev->setInfo(($dev->getInfo()?$dev->getInfo().';':'').$ar_buf2[1].";:".$ar_buf2[2]); + } else { + $dev->setInfo(($dev->getInfo()?$dev->getInfo().';':'').$ar_buf2[1]); + } + } elseif (preg_match('/^\s+inet6?\s+([^\/\s]+).*\s+scope\s((global)|(host))/i', $line, $ar_buf2)) + $dev->setInfo(($dev->getInfo()?$dev->getInfo().';':'').strtolower($ar_buf2[1])); + } + } + } + } + if ($was) { + if ($macaddr != "") { + $dev->setInfo($macaddr.($dev->getInfo()?';'.$dev->getInfo():'')); + } + if ($speedinfo != "") { + $dev->setInfo(($dev->getInfo()?$dev->getInfo().';':'').$speedinfo); + } + $this->sys->setNetDevices($dev); + } + } elseif (CommonFunctions::executeProgram('ifconfig', '-a', $bufr, PSI_DEBUG)) { + $lines = preg_split("/\n/", $bufr, -1, PREG_SPLIT_NO_EMPTY); + $was = false; + foreach ($lines as $line) { + if (preg_match("/^([^\s:]+)/", $line, $ar_buf)) { + if ($was) { + $dev->setErrors($errors); + $dev->setDrops($drops); + if ($macaddr != "") { + $dev->setInfo($macaddr.($dev->getInfo()?';'.$dev->getInfo():'')); + } + if ($speedinfo != "") { + $dev->setInfo(($dev->getInfo()?$dev->getInfo().';':'').$speedinfo); + } + $this->sys->setNetDevices($dev); + } + $errors = 0; + $drops = 0; + $speedinfo = ""; + $macaddr = ""; + $dev = new NetDevice(); + $dev->setName($ar_buf[1]); + $was = true; + if (defined('PSI_SHOW_NETWORK_INFOS') && (PSI_SHOW_NETWORK_INFOS)) { + if (CommonFunctions::rfts('/sys/class/net/'.$ar_buf[1].'/speed', $buf, 1, 4096, false) && (trim($buf)!="")) { + $speed = trim($buf); + if ($speed > 1000) { + $speed = $speed/1000; + $unit = "G"; + } else { + $unit = "M"; + } + if (CommonFunctions::rfts('/sys/class/net/'.$ar_buf[1].'/duplex', $buf, 1, 4096, false) && (trim($buf)!="")) { + $speedinfo = $speed.$unit.'b/s '.strtolower(trim($buf)); + } else { + $speedinfo = $speed.$unit.'b/s'; + } + } + if (preg_match('/^'.$ar_buf[1].'\s+Link\sencap:Ethernet\s+HWaddr\s(\S+)/i', $line, $ar_buf2)) + $macaddr = preg_replace('/:/', '-', strtoupper($ar_buf2[1])); + elseif (preg_match('/^'.$ar_buf[1].':\s+ip\s+(\S+)\s+mask/i', $line, $ar_buf2)) + $dev->setInfo(($dev->getInfo()?$dev->getInfo().';':'').$ar_buf2[1]); + } + } else { + if ($was) { + if (preg_match('/\sRX bytes:(\d+)\s/i', $line, $ar_buf2)) { + $dev->setRxBytes($ar_buf2[1]); + } + if (preg_match('/\sTX bytes:(\d+)\s/i', $line, $ar_buf2)) { + $dev->setTxBytes($ar_buf2[1]); + } + + if (preg_match('/\sRX packets:\d+\serrors:(\d+)\sdropped:(\d+)/i', $line, $ar_buf2)) { + $errors +=$ar_buf2[1]; + $drops +=$ar_buf2[2]; + } elseif (preg_match('/\sTX packets:\d+\serrors:(\d+)\sdropped:(\d+)/i', $line, $ar_buf2)) { + $errors +=$ar_buf2[1]; + $drops +=$ar_buf2[2]; + } + + if (defined('PSI_SHOW_NETWORK_INFOS') && (PSI_SHOW_NETWORK_INFOS)) { + if (preg_match('/\s+encap:Ethernet\s+HWaddr\s(\S+)/i', $line, $ar_buf2) + || preg_match('/^\s+ether\s+(\S+)\s+txqueuelen/i', $line, $ar_buf2)) + $macaddr = preg_replace('/:/', '-', strtoupper($ar_buf2[1])); + elseif (preg_match('/^\s+inet\saddr:(\S+)\s+P-t-P:(\S+)/i', $line, $ar_buf2) + || preg_match('/^\s+inet\s+(\S+)\s+netmask.+destination\s+(\S+)/i', $line, $ar_buf2)) { + if ($ar_buf2[1] != $ar_buf2[2]) { + $dev->setInfo(($dev->getInfo()?$dev->getInfo().';':'').$ar_buf2[1].";:".$ar_buf2[2]); + } else { + $dev->setInfo(($dev->getInfo()?$dev->getInfo().';':'').$ar_buf2[1]); + } + } elseif (preg_match('/^\s+inet\saddr:(\S+)/i', $line, $ar_buf2) + || preg_match('/^\s+inet\s+(\S+)\s+netmask/i', $line, $ar_buf2) + || preg_match('/^\s+inet6\saddr:\s([^\/\s]+)(.+)\s+Scope:[GH]/i', $line, $ar_buf2) + || preg_match('/^\s+inet6\s+(\S+)\s+prefixlen(.+)(()|())/i', $line, $ar_buf2)) + $dev->setInfo(($dev->getInfo()?$dev->getInfo().';':'').strtolower($ar_buf2[1])); + } + } + } + } + if ($was) { + $dev->setErrors($errors); + $dev->setDrops($drops); + if ($macaddr != "") { + $dev->setInfo($macaddr.($dev->getInfo()?';'.$dev->getInfo():'')); + } + if ($speedinfo != "") { + $dev->setInfo(($dev->getInfo()?$dev->getInfo().';':'').$speedinfo); + } + $this->sys->setNetDevices($dev); + } + } + } + + /** + * Physical memory information and Swap Space information + * + * @return void + */ + protected function _memory() + { + if (CommonFunctions::rfts('/proc/meminfo', $mbuf)) { + $bufe = preg_split("/\n/", $mbuf, -1, PREG_SPLIT_NO_EMPTY); + foreach ($bufe as $buf) { + if (preg_match('/^MemTotal:\s+(.*)\s*kB/i', $buf, $ar_buf)) { + $this->sys->setMemTotal($ar_buf[1] * 1024); + } elseif (preg_match('/^MemFree:\s+(.*)\s*kB/i', $buf, $ar_buf)) { + $this->sys->setMemFree($ar_buf[1] * 1024); + } elseif (preg_match('/^Cached:\s+(.*)\s*kB/i', $buf, $ar_buf)) { + $this->sys->setMemCache($ar_buf[1] * 1024); + } elseif (preg_match('/^Buffers:\s+(.*)\s*kB/i', $buf, $ar_buf)) { + $this->sys->setMemBuffer($ar_buf[1] * 1024); + } + } + $this->sys->setMemUsed($this->sys->getMemTotal() - $this->sys->getMemFree()); + // values for splitting memory usage + if ($this->sys->getMemCache() !== null && $this->sys->getMemBuffer() !== null) { + $this->sys->setMemApplication($this->sys->getMemUsed() - $this->sys->getMemCache() - $this->sys->getMemBuffer()); + } + if (CommonFunctions::rfts('/proc/swaps', $sbuf, 0, 4096, false)) { + $swaps = preg_split("/\n/", $sbuf, -1, PREG_SPLIT_NO_EMPTY); + unset($swaps[0]); + foreach ($swaps as $swap) { + $ar_buf = preg_split('/\s+/', $swap, 5); + $dev = new DiskDevice(); + $dev->setMountPoint($ar_buf[0]); + $dev->setName("SWAP"); + $dev->setTotal($ar_buf[2] * 1024); + $dev->setUsed($ar_buf[3] * 1024); + $dev->setFree($dev->getTotal() - $dev->getUsed()); + $this->sys->setSwapDevices($dev); + } + } + } + } + + /** + * filesystem information + * + * @return void + */ + private function _filesystems() + { + $df_args = ""; + $hideFstypes = array(); + if (defined('PSI_HIDE_FS_TYPES') && is_string(PSI_HIDE_FS_TYPES)) { + if (preg_match(ARRAY_EXP, PSI_HIDE_FS_TYPES)) { + $hideFstypes = eval(PSI_HIDE_FS_TYPES); + } else { + $hideFstypes = array(PSI_HIDE_FS_TYPES); + } + } + foreach ($hideFstypes as $Fstype) { + $df_args .= "-x $Fstype "; + } + if ($df_args !== "") { + $df_args = trim($df_args); //trim spaces + $arrResult = Parser::df("-P $df_args 2>/dev/null"); + } else { + $arrResult = Parser::df("-P 2>/dev/null"); + } + foreach ($arrResult as $dev) { + $this->sys->setDiskDevices($dev); + } + } + + /** + * Distribution + * + * @return void + */ + protected function _distro() + { + $this->sys->setDistribution("Linux"); + $list = @parse_ini_file(APP_ROOT."/data/distros.ini", true); + if (!$list) { + return; + } + // We have the '2>/dev/null' because Ubuntu gives an error on this command which causes the distro to be unknown + if (CommonFunctions::executeProgram('lsb_release', '-a 2>/dev/null', $distro_info, PSI_DEBUG) && (strlen($distro_info) > 0)) { + $distro_tmp = preg_split("/\n/", $distro_info, -1, PREG_SPLIT_NO_EMPTY); + foreach ($distro_tmp as $info) { + $info_tmp = preg_split('/:/', $info, 2); + if (isset($distro_tmp[0]) && !is_null($distro_tmp[0]) && (trim($distro_tmp[0]) != "") && + isset($distro_tmp[1]) && !is_null($distro_tmp[1]) && (trim($distro_tmp[1]) != "")) { + $distro[trim($info_tmp[0])] = trim($info_tmp[1]); + } + } + if (!isset($distro['Distributor ID']) && !isset($distro['Description'])) { // Systems like StartOS + if (isset($distro_tmp[0]) && !is_null($distro_tmp[0]) && (trim($distro_tmp[0]) != "")) { + $this->sys->setDistribution(trim($distro_tmp[0])); + if (preg_match('/^(\S+)\s*/', $distro_tmp[0], $id_buf) + && isset($list[trim($id_buf[1])]['Image'])) { + $this->sys->setDistributionIcon($list[trim($id_buf[1])]['Image']); + } + } + } else { + if (isset($distro['Description']) + && preg_match('/^NAME=\s*(.+)\s*$/', $distro['Description'], $name_tmp)) { + $distro['Description'] = $name_tmp[1]; + } + if (isset($distro['Description']) + && ($distro['Description'] != "n/a") + && (!isset($distro['Distributor ID']) + || (($distro['Distributor ID'] != "n/a") + && ($distro['Description'] != $distro['Distributor ID'])))) { + $this->sys->setDistribution($distro['Description']); + if (isset($distro['Release']) && ($distro['Release'] != "n/a") + && ($distro['Release'] != $distro['Description']) && strstr($distro['Release'], ".")){ + if (preg_match("/^(\d+)\.[0]+$/", $distro['Release'], $match_buf)) { + $tofind = $match_buf[1]; + } else { + $tofind = $distro['Release']; + } + if (!preg_match("/^".$tofind."[\s\.]|[\(\[]".$tofind."[\.\)\]]|\s".$tofind."$|\s".$tofind."[\s\.]/", $distro['Description'])) { + $this->sys->setDistribution($this->sys->getDistribution()." ".$distro['Release']); + } + } + } elseif (isset($distro['Distributor ID']) && ($distro['Distributor ID'] != "n/a")) { + $this->sys->setDistribution($distro['Distributor ID']); + if (isset($distro['Release']) && ($distro['Release'] != "n/a")) { + $this->sys->setDistribution($this->sys->getDistribution()." ".$distro['Release']); + } + if (isset($distro['Codename']) && ($distro['Codename'] != "n/a")) { + $this->sys->setDistribution($this->sys->getDistribution()." (".$distro['Codename'].")"); + } + } + if (isset($distro['Distributor ID']) && ($distro['Distributor ID'] != "n/a") && isset($list[$distro['Distributor ID']]['Image'])) { + $this->sys->setDistributionIcon($list[$distro['Distributor ID']]['Image']); + } + } + } else { + /* default error handler */ + if (function_exists('errorHandlerPsi')) { + restore_error_handler(); + } + /* fatal errors only */ + $old_err_rep = error_reporting(); + error_reporting(E_ERROR); + + // Fall back in case 'lsb_release' does not exist but exist /etc/lsb-release + if (CommonFunctions::fileexists($filename="/etc/lsb-release") + && CommonFunctions::rfts($filename, $buf, 0, 4096, false) + && preg_match('/^DISTRIB_ID="?([^"\n]+)"?/m', $buf, $id_buf)) { + if (preg_match('/^DISTRIB_DESCRIPTION="?([^"\n]+)"?/m', $buf, $desc_buf) + && (trim($desc_buf[1])!=trim($id_buf[1]))) { + $this->sys->setDistribution(trim($desc_buf[1])); + if (preg_match('/^DISTRIB_RELEASE="?([^"\n]+)"?/m', $buf, $vers_buf) + && (trim($vers_buf[1])!=trim($desc_buf[1])) && strstr($vers_buf[1], ".")){ + if (preg_match("/^(\d+)\.[0]+$/", trim($vers_buf[1]), $match_buf)) { + $tofind = $match_buf[1]; + } else { + $tofind = trim($vers_buf[1]); + } + if (!preg_match("/^".$tofind."[\s\.]|[\(\[]".$tofind."[\.\)\]]|\s".$tofind."$|\s".$tofind."[\s\.]/", trim($desc_buf[1]))) { + $this->sys->setDistribution($this->sys->getDistribution()." ".trim($vers_buf[1])); + } + } + } else { + if (isset($list[trim($id_buf[1])]['Name'])) { + $this->sys->setDistribution(trim($list[trim($id_buf[1])]['Name'])); + } else { + $this->sys->setDistribution(trim($id_buf[1])); + } + if (preg_match('/^DISTRIB_RELEASE="?([^"\n]+)"?/m', $buf, $vers_buf)) { + $this->sys->setDistribution($this->sys->getDistribution()." ".trim($vers_buf[1])); + } + if (preg_match('/^DISTRIB_CODENAME="?([^"\n]+)"?/m', $buf, $vers_buf)) { + $this->sys->setDistribution($this->sys->getDistribution()." (".trim($vers_buf[1]).")"); + } + } + if (isset($list[trim($id_buf[1])]['Image'])) { + $this->sys->setDistributionIcon($list[trim($id_buf[1])]['Image']); + } + } else { // otherwise find files specific for distribution + foreach ($list as $section=>$distribution) { + if (!isset($distribution['Files'])) { + continue; + } else { + foreach (preg_split("/;/", $distribution['Files'], -1, PREG_SPLIT_NO_EMPTY) as $filename) { + if (CommonFunctions::fileexists($filename)) { + $distro = $distribution; + if (isset($distribution['Mode'])&&(strtolower($distribution['Mode'])=="detection")) { + $buf = ""; + } elseif (isset($distribution['Mode'])&&(strtolower($distribution['Mode'])=="execute")) { + if (!CommonFunctions::executeProgram($filename, '2>/dev/null', $buf, PSI_DEBUG)) { + $buf = ""; + } + } else { + if (!CommonFunctions::rfts($filename, $buf, 1, 4096, false)) { + $buf = ""; + } elseif (isset($distribution['Mode'])&&(strtolower($distribution['Mode'])=="analyse")) { + if (preg_match('/^(\S+)\s*/', preg_replace('/^Red\s+/', 'Red', $buf), $id_buf) + && isset($list[trim($id_buf[1])]['Image'])) { + $distro = $list[trim($id_buf[1])]; + } + } + } + if (isset($distro['Image'])) { + $this->sys->setDistributionIcon($distro['Image']); + } + if (isset($distribution['Name'])) { + if (is_null($buf) || (trim($buf) == "")) { + $this->sys->setDistribution($distribution['Name']); + } else { + $this->sys->setDistribution($distribution['Name']." ".trim($buf)); + } + } else { + if (is_null($buf) || (trim($buf) == "")) { + $this->sys->setDistribution($section); + } else { + $this->sys->setDistribution(trim($buf)); + } + } + if (isset($distribution['Files2'])) { + foreach (preg_split("/;/", $distribution['Files2'], -1, PREG_SPLIT_NO_EMPTY) as $filename2) { + if (CommonFunctions::fileexists($filename2) && CommonFunctions::rfts($filename2, $buf, 0, 4096, false)) { + if (preg_match('/^majorversion="?([^"\n]+)"?/m', $buf, $maj_buf) + && preg_match('/^minorversion="?([^"\n]+)"?/m', $buf, $min_buf)) { + $distr2=$maj_buf[1].'.'.$min_buf[1]; + if (preg_match('/^buildphase="?([^"\n]+)"?/m', $buf, $pha_buf) && ($pha_buf[1]!=="0")) { + $distr2.='.'.$pha_buf[1]; + } + if (preg_match('/^buildnumber="?([^"\n]+)"?/m', $buf, $num_buf)) { + $distr2.='-'.$num_buf[1]; + } + if (preg_match('/^builddate="?([^"\n]+)"?/m', $buf, $dat_buf)) { + $distr2.=' ('.$dat_buf[1].')'; + } + $this->sys->setDistribution($this->sys->getDistribution()." ".$distr2); + } else { + $distr2=trim(substr($buf, 0, strpos($buf, "\n"))); + if (!is_null($distr2) && ($distr2 != "")) { + $this->sys->setDistribution($this->sys->getDistribution()." ".$distr2); + } + } + break; + } + } + } + break 2; + } + } + } + } + } + // if the distribution is still unknown + if ($this->sys->getDistribution() == "Linux") { + if (CommonFunctions::fileexists($filename="/etc/DISTRO_SPECS") + && CommonFunctions::rfts($filename, $buf, 0, 4096, false) + && preg_match('/^DISTRO_NAME=\'(.+)\'/m', $buf, $id_buf)) { + if (isset($list[trim($id_buf[1])]['Name'])) { + $dist = trim($list[trim($id_buf[1])]['Name']); + } else { + $dist = trim($id_buf[1]); + } + if (preg_match('/^DISTRO_VERSION=(.+)/m', $buf, $vers_buf)) { + $this->sys->setDistribution(trim($dist." ".trim($vers_buf[1]))); + } else { + $this->sys->setDistribution($dist); + } + if (isset($list[trim($id_buf[1])]['Image'])) { + $this->sys->setDistributionIcon($list[trim($id_buf[1])]['Image']); + } else { + if (isset($list['Puppy']['Image'])) { + $this->sys->setDistributionIcon($list['Puppy']['Image']); + } + } + } elseif ((CommonFunctions::fileexists($filename="/etc/distro-release") + && CommonFunctions::rfts($filename, $buf, 1, 4096, false) + && !is_null($buf) && (trim($buf) != "")) + || (CommonFunctions::fileexists($filename="/etc/system-release") + && CommonFunctions::rfts($filename, $buf, 1, 4096, false) + && !is_null($buf) && (trim($buf) != ""))) { + $this->sys->setDistribution(trim($buf)); + if (preg_match('/^(\S+)\s*/', preg_replace('/^Red\s+/', 'Red', $buf), $id_buf) + && isset($list[trim($id_buf[1])]['Image'])) { + $this->sys->setDistributionIcon($list[trim($id_buf[1])]['Image']); + } + } elseif (CommonFunctions::fileexists($filename="/etc/solydxk/info") + && CommonFunctions::rfts($filename, $buf, 0, 4096, false) + && preg_match('/^DISTRIB_ID="?([^"\n]+)"?/m', $buf, $id_buf)) { + if (preg_match('/^DESCRIPTION="?([^"\n]+)"?/m', $buf, $desc_buf) + && (trim($desc_buf[1])!=trim($id_buf[1]))) { + $this->sys->setDistribution(trim($desc_buf[1])); + } else { + if (isset($list[trim($id_buf[1])]['Name'])) { + $this->sys->setDistribution(trim($list[trim($id_buf[1])]['Name'])); + } else { + $this->sys->setDistribution(trim($id_buf[1])); + } + if (preg_match('/^RELEASE="?([^"\n]+)"?/m', $buf, $vers_buf)) { + $this->sys->setDistribution($this->sys->getDistribution()." ".trim($vers_buf[1])); + } + if (preg_match('/^CODENAME="?([^"\n]+)"?/m', $buf, $vers_buf)) { + $this->sys->setDistribution($this->sys->getDistribution()." (".trim($vers_buf[1]).")"); + } + } + if (isset($list[trim($id_buf[1])]['Image'])) { + $this->sys->setDistributionIcon($list[trim($id_buf[1])]['Image']); + } else { + $this->sys->setDistributionIcon($list['SolydXK']['Image']); + } + } elseif (CommonFunctions::fileexists($filename="/etc/os-release") + && CommonFunctions::rfts($filename, $buf, 0, 4096, false) + && (preg_match('/^TAILS_VERSION_ID="?([^"\n]+)"?/m', $buf, $tid_buf) + || preg_match('/^NAME="?([^"\n]+)"?/m', $buf, $id_buf))) { + if (preg_match('/^TAILS_VERSION_ID="?([^"\n]+)"?/m', $buf, $tid_buf)) { + if (preg_match('/^TAILS_PRODUCT_NAME="?([^"\n]+)"?/m', $buf, $desc_buf)) { + $this->sys->setDistribution(trim($desc_buf[1])." ".trim($tid_buf[1])); + } else { + if (isset($list['Tails']['Name'])) { + $this->sys->setDistribution(trim($list['Tails']['Name'])." ".trim($tid_buf[1])); + } else { + $this->sys->setDistribution('Tails'." ".trim($tid_buf[1])); + } + } + $this->sys->setDistributionIcon($list['Tails']['Image']); + } else { + if (preg_match('/^PRETTY_NAME="?([^"\n]+)"?/m', $buf, $desc_buf) + && !preg_match('/\$/', $desc_buf[1])) { //if is not defined by variable + $this->sys->setDistribution(trim($desc_buf[1])); + } else { + if (isset($list[trim($id_buf[1])]['Name'])) { + $this->sys->setDistribution(trim($list[trim($id_buf[1])]['Name'])); + } else { + $this->sys->setDistribution(trim($id_buf[1])); + } + if (preg_match('/^VERSION="?([^"\n]+)"?/m', $buf, $vers_buf)) { + $this->sys->setDistribution($this->sys->getDistribution()." ".trim($vers_buf[1])); + } elseif (preg_match('/^VERSION_ID="?([^"\n]+)"?/m', $buf, $vers_buf)) { + $this->sys->setDistribution($this->sys->getDistribution()." ".trim($vers_buf[1])); + } + } + if (isset($list[trim($id_buf[1])]['Image'])) { + $this->sys->setDistributionIcon($list[trim($id_buf[1])]['Image']); + } + } + } elseif (CommonFunctions::fileexists($filename="/etc/debian_version")) { + if (!CommonFunctions::rfts($filename, $buf, 1, 4096, false)) { + $buf = ""; + } + if (isset($list['Debian']['Image'])) { + $this->sys->setDistributionIcon($list['Debian']['Image']); + } + if (isset($list['Debian']['Name'])) { + if (is_null($buf) || (trim($buf) == "")) { + $this->sys->setDistribution($list['Debian']['Name']); + } else { + $this->sys->setDistribution($list['Debian']['Name']." ".trim($buf)); + } + } else { + if (is_null($buf) || (trim($buf) == "")) { + $this->sys->setDistribution('Debian'); + } else { + $this->sys->setDistribution(trim($buf)); + } + } + } elseif (CommonFunctions::fileexists($filename="/etc/config/uLinux.conf") + && CommonFunctions::rfts($filename, $buf, 0, 4096, false) + && preg_match("/^Rsync\sModel\s*=\s*QNAP/m", $buf) + && preg_match("/^Version\s*=\s*([\d\.]+)\r?\nBuild\sNumber\s*=\s*(\S+)/m", $buf, $ver_buf)) { + $buf = $ver_buf[1]."-".$ver_buf[2]; + if (isset($list['QTS']['Image'])) { + $this->sys->setDistributionIcon($list['QTS']['Image']); + } + if (isset($list['QTS']['Name'])) { + $this->sys->setDistribution($list['QTS']['Name']." ".trim($buf)); + } else { + $this->sys->setDistribution(trim($buf)); + } + } + } + /* restore error level */ + error_reporting($old_err_rep); + /* restore error handler */ + if (function_exists('errorHandlerPsi')) { + set_error_handler('errorHandlerPsi'); + } + } + } + + /** + * Processes + * + * @return void + */ + protected function _processes() + { + $process = glob('/proc/*/status', GLOB_NOSORT); + if (($total = count($process)) > 0) { + + $processes['*'] = 0; + $buf = ""; + for ($i = 0; $i < $total; $i++) { + if (CommonFunctions::rfts($process[$i], $buf, 0, 4096, false)) { + $processes['*']++; //current total + if (preg_match('/^State:\s+(\w)/m', $buf, $state)) { + if (isset($processes[$state[1]])) { + $processes[$state[1]]++; + } else { + $processes[$state[1]] = 1; + } + } + } + } + if (!($processes['*'] > 0)) { + $processes['*'] = $processes[' '] = $total; //all unknown + } + $this->sys->setProcesses($processes); + } + } + + /** + * get the information + * + * @see PSI_Interface_OS::build() + * + * @return Void + */ + public function build() + { + $this->_distro(); + $this->_hostname(); + $this->_kernel(); + $this->_machine(); + $this->_uptime(); + $this->_users(); + $this->_cpuinfo(); + $this->_pci(); + $this->_ide(); + $this->_scsi(); + $this->_usb(); + $this->_i2c(); + $this->_network(); + $this->_memory(); + $this->_filesystems(); + $this->_loadavg(); + $this->_processes(); + } +} diff --git a/sources/includes/os/class.Minix.inc.php b/sources/includes/os/class.Minix.inc.php new file mode 100644 index 0000000..3822475 --- /dev/null +++ b/sources/includes/os/class.Minix.inc.php @@ -0,0 +1,350 @@ + + * @copyright 2012 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version SVN: $Id: class.Minix.inc.php 687 2012-09-06 20:54:49Z namiltd $ + * @link http://phpsysinfo.sourceforge.net + */ + /** + * Minix sysinfo class + * get all the required information from Minix system + * + * @category PHP + * @package PSI Minix OS class + * @author Mieczyslaw Nalewaj + * @copyright 2012 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version Release: 3.0 + * @link http://phpsysinfo.sourceforge.net + */ +class Minix extends OS +{ + /** + * content of the syslog + * + * @var array + */ + private $_dmesg = array(); + + /** + * call parent constructor + */ + public function __construct() + { + parent::__construct(); + } + + /** + * read /var/log/messages, but only if we haven't already + * + * @return array + */ + protected function readdmesg() + { + if (count($this->_dmesg) === 0) { + if (CommonFunctions::rfts('/var/log/messages', $buf)) { + $parts = preg_split("/kernel: APIC/", $buf, -1, PREG_SPLIT_NO_EMPTY); +// $parts = preg_split("/ syslogd: restart\n/", $buf, -1, PREG_SPLIT_NO_EMPTY); + $this->_dmesg = preg_split("/\n/", $parts[count($parts) - 1], -1, PREG_SPLIT_NO_EMPTY); + } + } + + return $this->_dmesg; + } + + /** + * get the cpu information + * + * @return array + */ + protected function _cpuinfo() + { + if (CommonFunctions::rfts('/proc/cpuinfo', $bufr, 0, 4096, false)) { + $processors = preg_split('/\s?\n\s?\n/', trim($bufr)); + foreach ($processors as $processor) { + $_n = ""; $_f = ""; $_m = ""; $_s = ""; + $dev = new CpuDevice(); + $details = preg_split("/\n/", $processor, -1, PREG_SPLIT_NO_EMPTY); + foreach ($details as $detail) { + $arrBuff = preg_split('/\s+:\s+/', trim($detail)); + if (count($arrBuff) == 2) { + switch (strtolower($arrBuff[0])) { + case 'model name': + $_n = $arrBuff[1]; + break; + case 'cpu mhz': + $dev->setCpuSpeed($arrBuff[1]); + break; + case 'cpu family': + $_f = $arrBuff[1]; + break; + case 'model': + $_m = $arrBuff[1]; + break; + case 'stepping': + $_s = $arrBuff[1]; + break; + case 'flags': + if (preg_match("/ vmx/", $arrBuff[1])) { + $dev->setVirt("vmx"); + } elseif (preg_match("/ svm/", $arrBuff[1])) { + $dev->setVirt("svm"); + } + break; + } + } + } + if ($_n == "") $_n="CPU"; + if ($_f != "") $_n.=" Family ".$_f; + if ($_m != "") $_n.=" Model ".$_m; + if ($_s != "") $_n.=" Stepping ".$_s; + $dev->SetModel($_n); + $this->sys->setCpus($dev); + } + } else + foreach ($this->readdmesg() as $line) { + if (preg_match('/kernel: (CPU .*) freq (.*) MHz/', $line, $ar_buf)) { + $dev = new CpuDevice(); + $dev->setModel($ar_buf[1]); + $dev->setCpuSpeed($ar_buf[2]); + $this->sys->setCpus($dev); + } + } + } + + /** + * PCI devices + * get the pci device information out of dmesg + * + * @return void + */ + protected function _pci() + { + if (CommonFunctions::rfts('/proc/pci', $strBuf, 0, 4096, false)) { + $arrLines = preg_split("/\n/", $strBuf, -1, PREG_SPLIT_NO_EMPTY); + foreach ($arrLines as $strLine) { + $arrParams = preg_split('/\s+/', trim($strLine), 4); + if (count($arrParams) == 4) + $strName = $arrParams[3]; + else + $strName = "unknown"; + $strName = preg_replace('/\(.*\)/', '', $strName); + $dev = new HWDevice(); + $dev->setName($strName); + $arrResults[] = $dev; + } + foreach ($arrResults as $dev) { + $this->sys->setPciDevices($dev); + } + } + if (!(isset($arrResults) && is_array($arrResults)) && ($results = Parser::lspci())) { + /* if access error: chmod 4755 /usr/bin/lspci */ + foreach ($results as $dev) { + $this->sys->setPciDevices($dev); + } + } + } + + /** + * Minix Version + * + * @return void + */ + private function _kernel() + { + foreach ($this->readdmesg() as $line) { + if (preg_match('/kernel: MINIX (.*) \((.*)\)/', $line, $ar_buf)) { + $branch = $ar_buf[2]; + } + } + if (CommonFunctions::executeProgram('uname', '-rvm', $ret)) { + if (isset($branch)) + $this->sys->setKernel($ret.' ('.$branch.')'); + else + $this->sys->setKernel($ret); + } + } + + /** + * Distribution + * + * @return void + */ + protected function _distro() + { + if (CommonFunctions::executeProgram('uname', '-sr', $ret)) + $this->sys->setDistribution($ret); + else + $this->sys->setDistribution('Minix'); + + $this->sys->setDistributionIcon('Minix.png'); + } + + /** + * UpTime + * time the system is running + * + * @return void + */ + private function _uptime() + { + if (CommonFunctions::executeProgram('uptime', '', $buf)) { + if (preg_match("/up (\d+) days,\s*(\d+):(\d+),/", $buf, $ar_buf)) { + $min = $ar_buf[3]; + $hours = $ar_buf[2]; + $days = $ar_buf[1]; + $this->sys->setUptime($days * 86400 + $hours * 3600 + $min * 60); + } elseif (preg_match("/up (\d+):(\d+),/", $buf, $ar_buf)) { + $min = $ar_buf[2]; + $hours = $ar_buf[1]; + $this->sys->setUptime($hours * 3600 + $min * 60); + } + } + } + + /** + * Processor Load + * optionally create a loadbar + * + * @return void + */ + private function _loadavg() + { + if (CommonFunctions::executeProgram('uptime', '', $buf)) { + if (preg_match("/load averages: (.*), (.*), (.*)$/", $buf, $ar_buf)) { + $this->sys->setLoad($ar_buf[1].' '.$ar_buf[2].' '.$ar_buf[3]); + } + } + } + + /** + * Virtual Host Name + * + * @return void + */ + private function _hostname() + { + if (PSI_USE_VHOST === true) { + $this->sys->setHostname(getenv('SERVER_NAME')); + } else { + if (CommonFunctions::executeProgram('uname', '-n', $result, PSI_DEBUG)) { + $ip = gethostbyname($result); + if ($ip != $result) { + $this->sys->setHostname(gethostbyaddr($ip)); + } + } + } + } + + + /** + * Physical memory information and Swap Space information + * + * @return void + */ + private function _memory() + { + if (CommonFunctions::rfts('/proc/meminfo', $bufr, 1, 4096, false)) { + $ar_buf = preg_split('/\s+/', trim($bufr)); + if (count($ar_buf) >= 5) { + $this->sys->setMemTotal($ar_buf[0]*$ar_buf[1]); + $this->sys->setMemFree($ar_buf[0]*$ar_buf[2]); + $this->sys->setMemCache($ar_buf[0]*$ar_buf[4]); + $this->sys->setMemUsed($ar_buf[0]*($ar_buf[1]-$ar_buf[2])); + } + } + } + + /** + * filesystem information + * + * @return void + */ + private function _filesystems() + { + $arrResult = Parser::df("-P 2>/dev/null"); + foreach ($arrResult as $dev) { + $this->sys->setDiskDevices($dev); + } + } + + /** + * network information + * + * @return void + */ + private function _network() + { + if (CommonFunctions::executeProgram('ifconfig', '-a', $bufr, PSI_DEBUG)) { + $lines = preg_split("/\n/", $bufr, -1, PREG_SPLIT_NO_EMPTY); + foreach ($lines as $line) { + if (preg_match("/^([^\s:]+):\saddress\s(\S+)\snetmask/", $line, $ar_buf)) { + $dev = new NetDevice(); + $dev->setName($ar_buf[1]); + if (defined('PSI_SHOW_NETWORK_INFOS') && (PSI_SHOW_NETWORK_INFOS)) { + $dev->setInfo($ar_buf[2]); + } + $this->sys->setNetDevices($dev); + } + } + } + } + + /** + * Processes + * + * @return void + */ + protected function _processes() + { + if (CommonFunctions::executeProgram('ps', 'alx', $bufr, PSI_DEBUG)) { + $lines = preg_split("/\n/", $bufr, -1, PREG_SPLIT_NO_EMPTY); + $processes['*'] = 0; + foreach ($lines as $line) { + if (preg_match("/^\s(\w)\s/", $line, $ar_buf)) { + $processes['*']++; + $state = $ar_buf[1]; + if ($state == 'W') $state = 'D'; //linux format + elseif ($state == 'D') $state = 'd'; //invalid + if (isset($processes[$state])) { + $processes[$state]++; + } else { + $processes[$state] = 1; + } + } + } + if ($processes['*'] > 0) { + $this->sys->setProcesses($processes); + } + } + } + + /** + * get the information + * + * @return Void + */ + public function build() + { + $this->error->addError("WARN", "The Minix version of phpSysInfo is a work in progress, some things currently don't work"); + $this->_distro(); + $this->_hostname(); + $this->_kernel(); + $this->_uptime(); + $this->_users(); + $this->_loadavg(); + $this->_pci(); + $this->_cpuinfo(); + $this->_memory(); + $this->_filesystems(); + $this->_network(); + $this->_processes(); + } +} diff --git a/sources/includes/os/class.NetBSD.inc.php b/sources/includes/os/class.NetBSD.inc.php new file mode 100644 index 0000000..54a7e66 --- /dev/null +++ b/sources/includes/os/class.NetBSD.inc.php @@ -0,0 +1,185 @@ + + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version SVN: $Id: class.NetBSD.inc.php 287 2009-06-26 12:11:59Z bigmichi1 $ + * @link http://phpsysinfo.sourceforge.net + */ + /** + * NetBSD sysinfo class + * get all the required information from NetBSD systems + * + * @category PHP + * @package PSI NetBSD OS class + * @author Michael Cramer + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version Release: 3.0 + * @link http://phpsysinfo.sourceforge.net + */ +class NetBSD extends BSDCommon +{ + /** + * define the regexp for log parser + */ + public function __construct() + { + parent::__construct(); + $this->setCPURegExp1("/^cpu(.*)\, (.*) MHz/"); + $this->setCPURegExp2("/user = (.*), nice = (.*), sys = (.*), intr = (.*), idle = (.*)/"); + $this->setSCSIRegExp1("/^(.*) at scsibus.*: <(.*)> .*/"); + $this->setSCSIRegExp2("/^(da[0-9]+): (.*)MB /"); + $this->setPCIRegExp1("/(.*) at pci[0-9]+ dev [0-9]* function [0-9]*: (.*)$/"); + $this->setPCIRegExp2("/\"(.*)\" (.*).* at [.0-9]+ irq/"); + } + + /** + * UpTime + * time the system is running + * + * @return void + */ + private function _uptime() + { + $a = $this->grabkey('kern.boottime'); + $this->sys->setUptime(time() - $a); + } + + /** + * get network information + * + * @return void + */ + private function _network() + { + CommonFunctions::executeProgram('netstat', '-nbdi | cut -c1-25,44- | grep "^[a-z]*[0-9][ \t].*Link"', $netstat_b); + CommonFunctions::executeProgram('netstat', '-ndi | cut -c1-25,44- | grep "^[a-z]*[0-9][ \t].*Link"', $netstat_n); + $lines_b = preg_split("/\n/", $netstat_b, -1, PREG_SPLIT_NO_EMPTY); + $lines_n = preg_split("/\n/", $netstat_n, -1, PREG_SPLIT_NO_EMPTY); + for ($i = 0, $max = sizeof($lines_b); $i < $max; $i++) { + $ar_buf_b = preg_split("/\s+/", $lines_b[$i]); + $ar_buf_n = preg_split("/\s+/", $lines_n[$i]); + if (!empty($ar_buf_b[0]) && (!empty($ar_buf_n[3]) || ($ar_buf_n[3] === "0"))) { + $dev = new NetDevice(); + $dev->setName($ar_buf_b[0]); + $dev->setTxBytes($ar_buf_b[4]); + $dev->setRxBytes($ar_buf_b[3]); + $dev->setDrops($ar_buf_n[8]); + $dev->setErrors($ar_buf_n[4] + $ar_buf_n[6]); + if (defined('PSI_SHOW_NETWORK_INFOS') && (PSI_SHOW_NETWORK_INFOS) && (CommonFunctions::executeProgram('ifconfig', $ar_buf_b[0].' 2>/dev/null', $bufr2, PSI_DEBUG))) { + $speedinfo = ""; + $bufe2 = preg_split("/\n/", $bufr2, -1, PREG_SPLIT_NO_EMPTY); + foreach ($bufe2 as $buf2) { + if (preg_match('/^\s+address:\s+(\S+)/i', $buf2, $ar_buf2)) + $dev->setInfo(($dev->getInfo()?$dev->getInfo().';':'').preg_replace('/:/', '-', strtoupper($ar_buf2[1]))); + elseif (preg_match('/^\s+inet\s+(\S+)\s+netmask/i', $buf2, $ar_buf2)) + $dev->setInfo(($dev->getInfo()?$dev->getInfo().';':'').$ar_buf2[1]); + elseif ((preg_match('/^\s+inet6\s+([^\s%]+)\s+prefixlen/i', $buf2, $ar_buf2) + || preg_match('/^\s+inet6\s+([^\s%]+)%\S+\s+prefixlen/i', $buf2, $ar_buf2)) + && ($ar_buf2[1]!="::") && !preg_match('/^fe80::/i', $ar_buf2[1])) + $dev->setInfo(($dev->getInfo()?$dev->getInfo().';':'').strtolower($ar_buf2[1])); + elseif (preg_match('/^\s+media:\s+/i', $buf2) && preg_match('/[\(\s](\d+)(G*)base/i', $buf2, $ar_buf2)) { + if (isset($ar_buf2[2]) && strtoupper($ar_buf2[2])=="G") { + $unit = "G"; + } else { + $unit = "M"; + } + if (preg_match('/\s(\S+)-duplex/i', $buf2, $ar_buf3)) + $speedinfo = $ar_buf2[1].$unit.'b/s '.strtolower($ar_buf3[1]); + else + $speedinfo = $ar_buf2[1].$unit.'b/s'; + } + } + if ($speedinfo != "") $dev->setInfo(($dev->getInfo()?$dev->getInfo().';':'').$speedinfo); + } + $this->sys->setNetDevices($dev); + } + } + } + + /** + * IDE information + * + * @return void + */ + protected function ide() + { + foreach ($this->readdmesg() as $line) { + if (preg_match('/^(.*) at (pciide|wdc|atabus|atapibus)[0-9]+ (.*): <(.*)>/', $line, $ar_buf)) { + $dev = new HWDevice(); + $dev->setName($ar_buf[1]); + // now loop again and find the capacity + foreach ($this->readdmesg() as $line2) { + if (preg_match("/^(".$ar_buf[1]."): (.*), (.*), (.*)MB, .*$/", $line2, $ar_buf_n)) { + $dev->setCapacity($ar_buf_n[4] * 2048 * 1.049); + } elseif (preg_match("/^(".$ar_buf[1]."): (.*) MB, (.*), (.*), .*$/", $line2, $ar_buf_n)) { + $dev->setCapacity($ar_buf_n[2] * 2048); + } + } + $this->sys->setIdeDevices($dev); + } + } + } + + /** + * get icon name + * + * @return void + */ + private function _distroicon() + { + $this->sys->setDistributionIcon('NetBSD.png'); + } + + /** + * Processes + * + * @return void + */ + protected function _processes() + { + if (CommonFunctions::executeProgram('ps', 'aux', $bufr, PSI_DEBUG)) { + $lines = preg_split("/\n/", $bufr, -1, PREG_SPLIT_NO_EMPTY); + $processes['*'] = 0; + foreach ($lines as $line) { + if (preg_match("/^\S+\s+\d+\s+\S+\s+\S+\s+\d+\s+\d+\s+\S+\s+(\w)/", $line, $ar_buf)) { + $processes['*']++; + $state = $ar_buf[1]; + if ($state == 'O') $state = 'R'; //linux format + elseif ($state == 'I') $state = 'S'; + if (isset($processes[$state])) { + $processes[$state]++; + } else { + $processes[$state] = 1; + } + } + } + if ($processes['*'] > 0) { + $this->sys->setProcesses($processes); + } + } + } + + /** + * get the information + * + * @see BSDCommon::build() + * + * @return Void + */ + public function build() + { + parent::build(); + $this->_distroicon(); + $this->_network(); + $this->_uptime(); + $this->_processes(); + } +} diff --git a/sources/includes/os/class.OS.inc.php b/sources/includes/os/class.OS.inc.php new file mode 100644 index 0000000..c7dccab --- /dev/null +++ b/sources/includes/os/class.OS.inc.php @@ -0,0 +1,149 @@ + + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version SVN: $Id: class.OS.inc.php 699 2012-09-15 11:57:13Z namiltd $ + * @link http://phpsysinfo.sourceforge.net + */ + /** + * Basic OS functions for all OS classes + * + * @category PHP + * @package PSI OS class + * @author Michael Cramer + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version Release: 3.0 + * @link http://phpsysinfo.sourceforge.net + */ +abstract class OS implements PSI_Interface_OS +{ + /** + * object for error handling + * + * @var Error + */ + protected $error; + + /** + * @var System + */ + protected $sys; + + /** + * build the global Error object + */ + public function __construct() + { + $this->error = PSI_Error::singleton(); + $this->sys = new System(); + } + + /** + * get os specific encoding + * + * @see PSI_Interface_OS::getEncoding() + * + * @return string + */ + public function getEncoding() + { + return PSI_SYSTEM_CODEPAGE; + } + /** + * get os specific language + * + * @see PSI_Interface_OS::getLanguage() + * + * @return string + */ + public function getLanguage() + { + return PSI_SYSTEM_LANG; + } + + /** + * Number of Users + * + * @return void + */ + protected function _users() + { + if (CommonFunctions::executeProgram('who', '', $strBuf, PSI_DEBUG)) { + if (strlen($strBuf) > 0) { + $lines = preg_split('/\n/', $strBuf); + $this->sys->setUsers(count($lines)); + } + } elseif (CommonFunctions::executeProgram('uptime', '', $buf, PSI_DEBUG) && preg_match("/,\s+(\d+)\s+user[s]?,/", $buf, $ar_buf)) { + //} elseif (CommonFunctions::executeProgram('uptime', '', $buf) && preg_match("/,\s+(\d+)\s+user[s]?,\s+load average[s]?:\s+(.*),\s+(.*),\s+(.*)$/", $buf, $ar_buf)) { + $this->sys->setUsers($ar_buf[1]); + } else { + $processlist = glob('/proc/*/cmdline', GLOB_NOSORT); + if (($total = count($processlist)) > 0) { + $count = 0; + $buf = ""; + for ($i = 0; $i < $total; $i++) { + if (CommonFunctions::rfts($processlist[$i], $buf, 0, 4096, false)) { + $name = str_replace(chr(0), ' ', trim($buf)); + if (preg_match("/^-/", $name)) { + $count++; + } + } + } + if ($count > 0) { + $this->sys->setUsers($count); + } + } + } + } + + /** + * IP of the Host + * + * @return void + */ + protected function _ip() + { + if (PSI_USE_VHOST === true) { + if ((($result = getenv('SERVER_ADDR')) || ($result = getenv('LOCAL_ADDR'))) //is server address defined + && !strstr($result, '.') && strstr($result, ':')){ //is IPv6, quick version of preg_match('/\(([[0-9A-Fa-f\:]+)\)/', $result) + $dnsrec = dns_get_record($this->sys->getHostname(), DNS_AAAA); + if (isset($dnsrec[0]['ipv6'])) { //is DNS IPv6 record + $this->sys->setIp($dnsrec[0]['ipv6']); //from DNS (avoid IPv6 NAT translation) + } else { + $this->sys->setIp(preg_replace('/^::ffff:/i', '', $result)); //from SERVER_ADDR or LOCAL_ADDR + } + } else { + $this->sys->setIp(gethostbyname($this->sys->getHostname())); //IPv4 only + } + } else { + if (($result = getenv('SERVER_ADDR')) || ($result = getenv('LOCAL_ADDR'))) { + $this->sys->setIp(preg_replace('/^::ffff:/i', '', $result)); + } else { + $this->sys->setIp(gethostbyname($this->sys->getHostname())); + } + } + } + + /** + * get the filled or unfilled (with default values) System object + * + * @see PSI_Interface_OS::getSys() + * + * @return System + */ + final public function getSys() + { + $this->build(); + $this->_ip(); + + return $this->sys; + } +} diff --git a/sources/includes/os/class.OpenBSD.inc.php b/sources/includes/os/class.OpenBSD.inc.php new file mode 100644 index 0000000..a9a3089 --- /dev/null +++ b/sources/includes/os/class.OpenBSD.inc.php @@ -0,0 +1,222 @@ + + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version SVN: $Id: class.OpenBSD.inc.php 621 2012-07-29 18:49:04Z namiltd $ + * @link http://phpsysinfo.sourceforge.net + */ + /** + * OpenBSD sysinfo class + * get all the required information from OpenBSD systems + * + * @category PHP + * @package PSI OpenBSD OS class + * @author Michael Cramer + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version Release: 3.0 + * @link http://phpsysinfo.sourceforge.net + */ +class OpenBSD extends BSDCommon +{ + /** + * define the regexp for log parser + */ + public function __construct() + { + parent::__construct(); +// $this->setCPURegExp1("/^cpu(.*) (.*) MHz/"); + $this->setCPURegExp2("/(.*),(.*),(.*),(.*),(.*)/"); + $this->setSCSIRegExp1("/^(.*) at scsibus.*: <(.*)> .*/"); + $this->setSCSIRegExp2("/^(da[0-9]+): (.*)MB /"); + $this->setPCIRegExp1("/(.*) at pci[0-9]+ .* \"(.*)\"/"); + $this->setPCIRegExp2("/\"(.*)\" (.*).* at [.0-9]+ irq/"); + } + + /** + * UpTime + * time the system is running + * + * @return void + */ + private function _uptime() + { + $a = $this->grabkey('kern.boottime'); + $this->sys->setUptime(time() - $a); + } + + /** + * get network information + * + * @return void + */ + private function _network() + { + CommonFunctions::executeProgram('netstat', '-nbdi | cut -c1-25,44- | grep Link | grep -v \'* \'', $netstat_b, PSI_DEBUG); + CommonFunctions::executeProgram('netstat', '-ndi | cut -c1-25,44- | grep Link | grep -v \'* \'', $netstat_n, PSI_DEBUG); + $lines_b = preg_split("/\n/", $netstat_b, -1, PREG_SPLIT_NO_EMPTY); + $lines_n = preg_split("/\n/", $netstat_n, -1, PREG_SPLIT_NO_EMPTY); + for ($i = 0, $max = sizeof($lines_b); $i < $max; $i++) { + $ar_buf_b = preg_split("/\s+/", $lines_b[$i]); + $ar_buf_n = preg_split("/\s+/", $lines_n[$i]); + if (!empty($ar_buf_b[0]) && (!empty($ar_buf_n[3]) || ($ar_buf_n[3] === "0"))) { + $dev = new NetDevice(); + $dev->setName($ar_buf_b[0]); + $dev->setTxBytes($ar_buf_b[4]); + $dev->setRxBytes($ar_buf_b[3]); + $dev->setErrors($ar_buf_n[4] + $ar_buf_n[6]); + $dev->setDrops($ar_buf_n[8]); + if (defined('PSI_SHOW_NETWORK_INFOS') && (PSI_SHOW_NETWORK_INFOS) && (CommonFunctions::executeProgram('ifconfig', $ar_buf_b[0].' 2>/dev/null', $bufr2, PSI_DEBUG))) { + $speedinfo = ""; + $bufe2 = preg_split("/\n/", $bufr2, -1, PREG_SPLIT_NO_EMPTY); + foreach ($bufe2 as $buf2) { + if (preg_match('/^\s+lladdr\s+(\S+)/i', $buf2, $ar_buf2)) + $dev->setInfo(($dev->getInfo()?$dev->getInfo().';':'').preg_replace('/:/', '-', strtoupper($ar_buf2[1]))); + elseif (preg_match('/^\s+inet\s+(\S+)\s+netmask/i', $buf2, $ar_buf2)) + $dev->setInfo(($dev->getInfo()?$dev->getInfo().';':'').$ar_buf2[1]); + elseif ((preg_match('/^\s+inet6\s+([^\s%]+)\s+prefixlen/i', $buf2, $ar_buf2) + || preg_match('/^\s+inet6\s+([^\s%]+)%\S+\s+prefixlen/i', $buf2, $ar_buf2)) + && ($ar_buf2[1]!="::") && !preg_match('/^fe80::/i', $ar_buf2[1])) + $dev->setInfo(($dev->getInfo()?$dev->getInfo().';':'').strtolower($ar_buf2[1])); + elseif (preg_match('/^\s+media:\s+/i', $buf2) && preg_match('/[\(\s](\d+)(G*)base/i', $buf2, $ar_buf2)) { + if (isset($ar_buf2[2]) && strtoupper($ar_buf2[2])=="G") { + $unit = "G"; + } else { + $unit = "M"; + } + if (preg_match('/\s(\S+)-duplex/i', $buf2, $ar_buf3)) + $speedinfo = $ar_buf2[1].$unit.'b/s '.strtolower($ar_buf3[1]); + else + $speedinfo = $ar_buf2[1].$unit.'b/s'; + } + } + if ($speedinfo != "") $dev->setInfo(($dev->getInfo()?$dev->getInfo().';':'').$speedinfo); + } + $this->sys->setNetDevices($dev); + } + } + } + + /** + * IDE information + * + * @return void + */ + protected function ide() + { + foreach ($this->readdmesg() as $line) { + if (preg_match('/^(.*) at pciide[0-9]+ (.*): <(.*)>/', $line, $ar_buf)) { + $dev = new HWDevice(); + $dev->setName($ar_buf[0]); + // now loop again and find the capacity + foreach ($this->readdmesg() as $line2) { + if (preg_match("/^(".$ar_buf[0]."): (.*), (.*), (.*)MB, .*$/", $line2, $ar_buf_n)) { + $dev->setCapacity($ar_buf_n[4] * 2048 * 1.049); + } + } + $this->sys->setIdeDevices($dev); + } + } + } + + /** + * get CPU information + * + * @return void + */ + protected function cpuinfo() + { + $dev = new CpuDevice(); + $dev->setModel($this->grabkey('hw.model')); + $dev->setCpuSpeed($this->grabkey('hw.cpuspeed')); + $was = false; + foreach ($this->readdmesg() as $line) { + if (preg_match("/^cpu[0-9]+: (.*)/", $line, $ar_buf)) { + $was = true; + if (preg_match("/^cpu[0-9]+: (\d+)([KM])B (.*) L2 cache/", $line, $ar_buf2)) { + if ($ar_buf2[2]=="M") { + $dev->setCache($ar_buf2[1]*1024*1024); + } elseif ($ar_buf2[2]=="K") { + $dev->setCache($ar_buf2[1]*1024); + } + } else { + $feats = preg_split("/,/", strtolower(trim($ar_buf[1])), -1, PREG_SPLIT_NO_EMPTY); + foreach ($feats as $feat) { + if (($feat=="vmx") || ($feat=="svm")) { + $dev->setVirt($feat); + } + } + } + } elseif ($was) { + break; + } + } + $ncpu = $this->grabkey('hw.ncpu'); + if (is_null($ncpu) || (trim($ncpu) == "") || (!($ncpu >= 1))) + $ncpu = 1; + for ($ncpu ; $ncpu > 0 ; $ncpu--) { + $this->sys->setCpus($dev); + } + } + + /** + * get icon name + * + * @return void + */ + private function _distroicon() + { + $this->sys->setDistributionIcon('OpenBSD.png'); + } + + /** + * Processes + * + * @return void + */ + protected function _processes() + { + if (CommonFunctions::executeProgram('ps', 'aux', $bufr, PSI_DEBUG)) { + $lines = preg_split("/\n/", $bufr, -1, PREG_SPLIT_NO_EMPTY); + $processes['*'] = 0; + foreach ($lines as $line) { + if (preg_match("/^\S+\s+\d+\s+\S+\s+\S+\s+\d+\s+\d+\s+\S+\s+(\w)/", $line, $ar_buf)) { + $processes['*']++; + $state = $ar_buf[1]; + if ($state == 'I') $state = 'S'; //linux format + if (isset($processes[$state])) { + $processes[$state]++; + } else { + $processes[$state] = 1; + } + } + } + if ($processes['*'] > 0) { + $this->sys->setProcesses($processes); + } + } + } + + /** + * get the information + * + * @see BSDCommon::build() + * + * @return Void + */ + public function build() + { + parent::build(); + $this->_distroicon(); + $this->_network(); + $this->_uptime(); + $this->_processes(); + } +} diff --git a/sources/includes/os/class.QNX.inc.php b/sources/includes/os/class.QNX.inc.php new file mode 100644 index 0000000..91a8d8d --- /dev/null +++ b/sources/includes/os/class.QNX.inc.php @@ -0,0 +1,237 @@ + + * @copyright 2012 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version SVN: $Id: class.QNX.inc.php 687 2012-09-06 20:54:49Z namiltd $ + * @link http://phpsysinfo.sourceforge.net + */ + /** + * QNX sysinfo class + * get all the required information from QNX system + * + * @category PHP + * @package PSI QNX OS class + * @author Mieczyslaw Nalewaj + * @copyright 2012 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version Release: 3.0 + * @link http://phpsysinfo.sourceforge.net + */ +class QNX extends OS +{ + /** + * content of the syslog + * + * @var array + */ + private $_dmesg = array(); + + /** + * call parent constructor + */ + public function __construct() + { + parent::__construct(); + } + + /** + * get the cpu information + * + * @return array + */ + protected function _cpuinfo() + { + if (CommonFunctions::executeProgram('pidin', 'info', $buf) + && preg_match('/^Processor\d+: (.*)/m', $buf)) { + $lines = preg_split("/\n/", $buf, -1, PREG_SPLIT_NO_EMPTY); + foreach ($lines as $line) { + if (preg_match('/^Processor\d+: (.+)/', $line, $proc)) { + $dev = new CpuDevice(); + $dev->SetModel(trim($proc[1])); + if (preg_match('/(\d+)MHz/', $proc[1], $mhz)) { + $dev->setCpuSpeed($mhz[1]); + } + $this->sys->setCpus($dev); + } + } + } + } + + /** + * QNX Version + * + * @return void + */ + private function _kernel() + { + if (CommonFunctions::executeProgram('uname', '-rvm', $ret)) { + $this->sys->setKernel($ret); + } + } + + /** + * Distribution + * + * @return void + */ + protected function _distro() + { + if (CommonFunctions::executeProgram('uname', '-sr', $ret)) + $this->sys->setDistribution($ret); + else + $this->sys->setDistribution('QNX'); + + $this->sys->setDistributionIcon('QNX.png'); + } + + /** + * UpTime + * time the system is running + * + * @return void + */ + private function _uptime() + { + + if (CommonFunctions::executeProgram('pidin', 'info', $buf) + && preg_match('/^.* BootTime:(.*)/', $buf, $bstart) + && CommonFunctions::executeProgram('date', '', $bstop)) { + /* default error handler */ + if (function_exists('errorHandlerPsi')) { + restore_error_handler(); + } + /* fatal errors only */ + $old_err_rep = error_reporting(); + error_reporting(E_ERROR); + + $uptime = strtotime($bstop)-strtotime($bstart[1]); + if ($uptime > 0) $this->sys->setUptime($uptime); + + /* restore error level */ + error_reporting($old_err_rep); + /* restore error handler */ + if (function_exists('errorHandlerPsi')) { + set_error_handler('errorHandlerPsi'); + } + } + } + + /** + * Number of Users + * + * @return void + */ + protected function _users() + { + $this->sys->setUsers(1); + } + + /** + * Virtual Host Name + * + * @return void + */ + private function _hostname() + { + if (PSI_USE_VHOST === true) { + $this->sys->setHostname(getenv('SERVER_NAME')); + } else { + if (CommonFunctions::executeProgram('uname', '-n', $result, PSI_DEBUG)) { + $ip = gethostbyname($result); + if ($ip != $result) { + $this->sys->setHostname(gethostbyaddr($ip)); + } + } + } + } + + /** + * Physical memory information and Swap Space information + * + * @return void + */ + private function _memory() + { + if (CommonFunctions::executeProgram('pidin', 'info', $buf) + && preg_match('/^.* FreeMem:(\S+)Mb\/(\S+)Mb/', $buf, $memm)) { + $this->sys->setMemTotal(1024*1024*$memm[2]); + $this->sys->setMemFree(1024*1024*$memm[1]); + $this->sys->setMemUsed(1024*1024*($memm[2]-$memm[1])); + } + } + + /** + * filesystem information + * + * @return void + */ + private function _filesystems() + { + $arrResult = Parser::df("-P 2>/dev/null"); + foreach ($arrResult as $dev) { + $this->sys->setDiskDevices($dev); + } + } + + /** + * network information + * + * @return void + */ + private function _network() + { + if (CommonFunctions::executeProgram('ifconfig', '', $bufr, PSI_DEBUG)) { + $lines = preg_split("/\n/", $bufr, -1, PREG_SPLIT_NO_EMPTY); + $was = false; + foreach ($lines as $line) { + if (preg_match("/^([^\s:]+)/", $line, $ar_buf)) { + if ($was) { + $this->sys->setNetDevices($dev); + } + $dev = new NetDevice(); + $dev->setName($ar_buf[1]); + $was = true; + } else { + if ($was) { + if (defined('PSI_SHOW_NETWORK_INFOS') && (PSI_SHOW_NETWORK_INFOS)) { + if (preg_match('/^\s+address:\s*(\S+)/i', $line, $ar_buf2)) { + $dev->setInfo(($dev->getInfo()?$dev->getInfo().';':'').preg_replace('/:/', '-', strtoupper($ar_buf2[1]))); + } elseif (preg_match('/^\s+inet\s+(\S+)\s+netmask/i', $line, $ar_buf2)) + $dev->setInfo(($dev->getInfo()?$dev->getInfo().';':'').$ar_buf2[1]); + + } + } + } + } + if ($was) { + $this->sys->setNetDevices($dev); + } + } + } + + /** + * get the information + * + * @return Void + */ + public function build() + { + $this->error->addError("WARN", "The QNX version of phpSysInfo is a work in progress, some things currently don't work"); + $this->_distro(); + $this->_hostname(); + $this->_kernel(); + $this->_uptime(); + $this->_users(); + $this->_cpuinfo(); + $this->_memory(); + $this->_filesystems(); + $this->_network(); + } +} diff --git a/sources/includes/os/class.SunOS.inc.php b/sources/includes/os/class.SunOS.inc.php new file mode 100644 index 0000000..9abdd5f --- /dev/null +++ b/sources/includes/os/class.SunOS.inc.php @@ -0,0 +1,334 @@ + + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version SVN: $Id: class.SunOS.inc.php 687 2012-09-06 20:54:49Z namiltd $ + * @link http://phpsysinfo.sourceforge.net + */ + /** + * SunOS sysinfo class + * get all the required information from SunOS systems + * + * @category PHP + * @package PSI SunOS OS class + * @author Michael Cramer + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version Release: 3.0 + * @link http://phpsysinfo.sourceforge.net + */ +class SunOS extends OS +{ + /** + * Extract kernel values via kstat() interface + * + * @param string $key key for kstat programm + * + * @return string + */ + private function _kstat($key) + { + if (CommonFunctions::executeProgram('kstat', '-p d '.$key, $m, PSI_DEBUG) && ($m!=="")) { + list($key, $value) = preg_split("/\t/", $m, 2); + + return trim($value); + } else { + return ''; + } + } + + /** + * Virtual Host Name + * + * @return void + */ + private function _hostname() + { + if (PSI_USE_VHOST === true) { + $this->sys->setHostname(getenv('SERVER_NAME')); + } else { + if (CommonFunctions::executeProgram('uname', '-n', $result, PSI_DEBUG)) { + $ip = gethostbyname($result); + if ($ip != $result) { + $this->sys->setHostname(gethostbyaddr($ip)); + } + } + } + } + + /** + * Kernel Version + * + * @return void + */ + private function _kernel() + { + if (CommonFunctions::executeProgram('uname', '-s', $os, PSI_DEBUG) && ($os!="")) { + if (CommonFunctions::executeProgram('uname', '-r', $version, PSI_DEBUG) && ($version!="")) { + $os.=' '.$version; + } + if (CommonFunctions::executeProgram('uname', '-v', $subversion, PSI_DEBUG) && ($subversion!="")) { + $os.=' ('.$subversion.')'; + } + if (CommonFunctions::executeProgram('uname', '-i', $platform, PSI_DEBUG) && ($platform!="")) { + $os.=' '.$platform; + } + $this->sys->setKernel($os); + } + } + + /** + * UpTime + * time the system is running + * + * @return void + */ + private function _uptime() + { + $this->sys->setUptime(time() - $this->_kstat('unix:0:system_misc:boot_time')); + } + + /** + * Processor Load + * optionally create a loadbar + * + * @return void + */ + private function _loadavg() + { + $load1 = $this->_kstat('unix:0:system_misc:avenrun_1min'); + $load5 = $this->_kstat('unix:0:system_misc:avenrun_5min'); + $load15 = $this->_kstat('unix:0:system_misc:avenrun_15min'); + $this->sys->setLoad(round($load1 / 256, 2).' '.round($load5 / 256, 2).' '.round($load15 / 256, 2)); + } + + /** + * CPU information + * + * @return void + */ + private function _cpuinfo() + { + if (CommonFunctions::executeProgram('kstat', '-p d cpu_info:*:cpu_info*:core_id', $m, PSI_DEBUG) && ($m!=="")) { + $cpuc = count(preg_split('/\n/', $m, -1, PREG_SPLIT_NO_EMPTY)); + for ($cpu=0; $cpu < $cpuc; $cpu++) { + $dev = new CpuDevice(); + if (($buf = $this->_kstat('cpu_info:'.$cpu.':cpu_info'.$cpu.':clock_MHz')) !== "") { + $dev->setCpuSpeed($buf); + } + if (($buf = $this->_kstat('cpu_info:'.$cpu.':cpu_info'.$cpu.':current_clock_Hz')) !== "") { + $dev->setCpuSpeedMax($buf/1000000); + } + if (($buf =$this->_kstat('cpu_info:'.$cpu.':cpu_info'.$cpu.':brand')) !== "") { + $dev->setModel($buf); + } elseif (($buf =$this->_kstat('cpu_info:'.$cpu.':cpu_info'.$cpu.':cpu_type')) !== "") { + $dev->setModel($buf); + } elseif (CommonFunctions::executeProgram('uname', '-p', $buf, PSI_DEBUG) && ($buf!="")) { + $dev->setModel($buf); + } elseif (CommonFunctions::executeProgram('uname', '-i', $buf, PSI_DEBUG) && ($buf!="")) { + $dev->setModel($buf); + } + $this->sys->setCpus($dev); + } + } + } + + /** + * Network devices + * + * @return void + */ + private function _network() + { + if (CommonFunctions::executeProgram('netstat', '-ni | awk \'(NF ==10){print;}\'', $netstat, PSI_DEBUG)) { + $lines = preg_split("/\n/", $netstat, -1, PREG_SPLIT_NO_EMPTY); + foreach ($lines as $line) { + $ar_buf = preg_split("/\s+/", $line); + if (!empty($ar_buf[0]) && $ar_buf[0] !== 'Name') { + $dev = new NetDevice(); + $dev->setName($ar_buf[0]); + $results[$ar_buf[0]]['errs'] = $ar_buf[5] + $ar_buf[7]; + if (preg_match('/^(\D+)(\d+)$/', $ar_buf[0], $intf)) { + $prefix = $intf[1].':'.$intf[2].':'.$intf[1].$intf[2].':'; + } elseif (preg_match('/^(\D.*)(\d+)$/', $ar_buf[0], $intf)) { + $prefix = $intf[1].':'.$intf[2].':mac:'; + } else { + $prefix = ""; + } + if ($prefix !== "") { + $cnt = $this->_kstat($prefix.'drop'); + if ($cnt > 0) { + $dev->setDrops($cnt); + } + $cnt = $this->_kstat($prefix.'obytes64'); + if ($cnt > 0) { + $dev->setTxBytes($cnt); + } + $cnt = $this->_kstat($prefix.'rbytes64'); + if ($cnt > 0) { + $dev->setRxBytes($cnt); + } + } + if (defined('PSI_SHOW_NETWORK_INFOS') && (PSI_SHOW_NETWORK_INFOS)) { + if (CommonFunctions::executeProgram('ifconfig', $ar_buf[0], $bufr2, PSI_DEBUG) && ($bufr2!=="")) { + $bufe2 = preg_split("/\n/", $bufr2, -1, PREG_SPLIT_NO_EMPTY); + foreach ($bufe2 as $buf2) { + if (preg_match('/^\s+ether\s+(\S+)/i', $buf2, $ar_buf2)) + $dev->setInfo(($dev->getInfo()?$dev->getInfo().';':'').preg_replace('/:/', '-', strtoupper($ar_buf2[1]))); + elseif (preg_match('/^\s+inet\s+(\S+)\s+netmask/i', $buf2, $ar_buf2)) + $dev->setInfo(($dev->getInfo()?$dev->getInfo().';':'').$ar_buf2[1]); + } + } + if (CommonFunctions::executeProgram('ifconfig', $ar_buf[0].' inet6', $bufr2, PSI_DEBUG) && ($bufr2!=="")) { + $bufe2 = preg_split("/\n/", $bufr2, -1, PREG_SPLIT_NO_EMPTY); + foreach ($bufe2 as $buf2) { + if (preg_match('/^\s+inet6\s+([^\s\/]+)/i', $buf2, $ar_buf2) + && ($ar_buf2[1]!="::") && !preg_match('/^fe80::/i', $ar_buf2[1])) + $dev->setInfo(($dev->getInfo()?$dev->getInfo().';':'').strtolower($ar_buf2[1])); + } + } + } + + $this->sys->setNetDevices($dev); + } + } + } + } + + /** + * Physical memory information and Swap Space information + * + * @return void + */ + private function _memory() + { + $pagesize = $this->_kstat('unix:0:seg_cache:slab_size'); + $this->sys->setMemTotal($this->_kstat('unix:0:system_pages:pagestotal') * $pagesize); + $this->sys->setMemUsed($this->_kstat('unix:0:system_pages:pageslocked') * $pagesize); + $this->sys->setMemFree($this->_kstat('unix:0:system_pages:pagesfree') * $pagesize); + $dev = new DiskDevice(); + $dev->setName('SWAP'); + $dev->setFsType('swap'); + $dev->setMountPoint('SWAP'); + $dev->setTotal($this->_kstat('unix:0:vminfo:swap_avail') / 1024); + $dev->setUsed($this->_kstat('unix:0:vminfo:swap_alloc') / 1024); + $dev->setFree($this->_kstat('unix:0:vminfo:swap_free') / 1024); + $this->sys->setSwapDevices($dev); + } + + /** + * filesystem information + * + * @return void + */ + private function _filesystems() + { + if (CommonFunctions::executeProgram('df', '-k', $df, PSI_DEBUG)) { + $df = preg_replace('/\n\s/m', ' ', $df); + $mounts = preg_split("/\n/", $df, -1, PREG_SPLIT_NO_EMPTY); + foreach ($mounts as $mount) { + $ar_buf = preg_split('/\s+/', $mount, 6); + if (!empty($ar_buf[0]) && $ar_buf[0] !== 'Filesystem') { + $dev = new DiskDevice(); + $dev->setName($ar_buf[0]); + $dev->setTotal($ar_buf[1] * 1024); + $dev->setUsed($ar_buf[2] * 1024); + $dev->setFree($ar_buf[3] * 1024); + $dev->setMountPoint($ar_buf[5]); + if (CommonFunctions::executeProgram('df', '-n', $dftypes, PSI_DEBUG)) { + $mounttypes = preg_split("/\n/", $dftypes, -1, PREG_SPLIT_NO_EMPTY); + foreach ($mounttypes as $type) { + $ty_buf = preg_split('/:/', $type, 2); + if (trim($ty_buf[0]) == $dev->getMountPoint()) { + $dev->setFsType($ty_buf[1]); + break; + } + } + } elseif (CommonFunctions::executeProgram('df', '-T', $dftypes, PSI_DEBUG)) { + $dftypes = preg_replace('/\n\s/m', ' ', $dftypes); + $mounttypes = preg_split("/\n/", $dftypes, -1, PREG_SPLIT_NO_EMPTY); + foreach ($mounttypes as $type) { + $ty_buf = preg_split("/\s+/", $type, 3); + if ($ty_buf[0] == $dev->getName()) { + $dev->setFsType($ty_buf[1]); + break; + } + } + } + $this->sys->setDiskDevices($dev); + } + } + } + } + + /** + * Distribution Icon + * + * @return void + */ + private function _distro() + { + $this->sys->setDistribution('SunOS'); + $this->sys->setDistributionIcon('SunOS.png'); + } + + /** + * Processes + * + * @return void + */ + protected function _processes() + { + if (CommonFunctions::executeProgram('ps', 'aux', $bufr, PSI_DEBUG)) { + $lines = preg_split("/\n/", $bufr, -1, PREG_SPLIT_NO_EMPTY); + $processes['*'] = 0; + foreach ($lines as $line) { + if (preg_match("/^\S+\s+\d+\s+\S+\s+\S+\s+\d+\s+\d+\s+\S+\s+(\w)/", $line, $ar_buf)) { + $processes['*']++; + $state = $ar_buf[1]; + if ($state == 'O') $state = 'R'; //linux format + elseif ($state == 'W') $state = 'D'; + elseif ($state == 'D') $state = 'd'; //invalid + if (isset($processes[$state])) { + $processes[$state]++; + } else { + $processes[$state] = 1; + } + } + } + if ($processes['*'] > 0) { + $this->sys->setProcesses($processes); + } + } + } + + /** + * get the information + * + * @see PSI_Interface_OS::build() + * + * @return Void + */ + public function build() + { + $this->error->addError("WARN", "The SunOS version of phpSysInfo is a work in progress, some things currently don't work"); + $this->_distro(); + $this->_hostname(); + $this->_kernel(); + $this->_uptime(); + $this->_users(); + $this->_loadavg(); + $this->_cpuinfo(); + $this->_network(); + $this->_memory(); + $this->_filesystems(); + $this->_processes(); + } +} diff --git a/sources/includes/os/class.WINNT.inc.php b/sources/includes/os/class.WINNT.inc.php new file mode 100644 index 0000000..24f80aa --- /dev/null +++ b/sources/includes/os/class.WINNT.inc.php @@ -0,0 +1,632 @@ + + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version SVN: $Id: class.WINNT.inc.php 699 2012-09-15 11:57:13Z namiltd $ + * @link http://phpsysinfo.sourceforge.net + */ + /** + * WINNT sysinfo class + * get all the required information from WINNT systems + * information are retrieved through the WMI interface + * + * @category PHP + * @package PSI WINNT OS class + * @author Michael Cramer + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version Release: 3.0 + * @link http://phpsysinfo.sourceforge.net + */ +class WINNT extends OS +{ + /** + * holds the COM object that we pull all the WMI data from + * + * @var Object + */ + private $_wmi = null; + + /** + * holds all devices, which are in the system + * + * @var array + */ + private $_wmidevices; + + /** + * store language encoding of the system to convert some output to utf-8 + * + * @var string + */ + private $_codepage = null; + + /** + * store language of the system + * + * @var string + */ + private $_syslang = null; + + /** + * build the global Error object and create the WMI connection + */ + public function __construct() + { + parent::__construct(); + // don't set this params for local connection, it will not work + $strHostname = ''; + $strUser = ''; + $strPassword = ''; + try { + // initialize the wmi object + $objLocator = new COM('WbemScripting.SWbemLocator'); + if ($strHostname == "") { + $this->_wmi = $objLocator->ConnectServer(); + + } else { + $this->_wmi = $objLocator->ConnectServer($strHostname, 'root\CIMv2', $strHostname.'\\'.$strUser, $strPassword); + } + } catch (Exception $e) { + $this->error->addError("WMI connect error", "PhpSysInfo can not connect to the WMI interface for security reasons.\nCheck an authentication mechanism for the directory where phpSysInfo is installed."); + } + $this->_getCodeSet(); + } + + /** + * store the codepage of the os for converting some strings to utf-8 + * + * @return void + */ + private function _getCodeSet() + { + $buffer = CommonFunctions::getWMI($this->_wmi, 'Win32_OperatingSystem', array('CodeSet', 'OSLanguage')); + if ($buffer) { + $this->_codepage = 'windows-'.$buffer[0]['CodeSet']; + $lang = ""; + if (is_readable(APP_ROOT.'/data/languages.ini') && ($langdata = @parse_ini_file(APP_ROOT.'/data/languages.ini', true))) { + if (isset($langdata['WINNT'][$buffer[0]['OSLanguage']])) { + $lang = $langdata['WINNT'][$buffer[0]['OSLanguage']]; + } + } + if ($lang == "") { + $lang = 'Unknown'; + } + $this->_syslang = $lang.' ('.$buffer[0]['OSLanguage'].')'; + } + } + + /** + * retrieve different device types from the system based on selector + * + * @param string $strType type of the devices that should be returned + * + * @return array list of devices of the specified type + */ + private function _devicelist($strType) + { + if (empty($this->_wmidevices)) { + $this->_wmidevices = CommonFunctions::getWMI($this->_wmi, 'Win32_PnPEntity', array('Name', 'PNPDeviceID')); + } + $list = array(); + foreach ($this->_wmidevices as $device) { + if (substr($device['PNPDeviceID'], 0, strpos($device['PNPDeviceID'], "\\") + 1) == ($strType."\\")) { + $list[] = $device['Name']; + } + } + + return $list; + } + + /** + * Host Name + * + * @return void + */ + private function _hostname() + { + if (PSI_USE_VHOST === true) { + if ($hnm = getenv('SERVER_NAME')) $this->sys->setHostname($hnm); + } else { + $buffer = CommonFunctions::getWMI($this->_wmi, 'Win32_ComputerSystem', array('Name')); + if ($buffer) { + $result = $buffer[0]['Name']; + $ip = gethostbyname($result); + if ($ip != $result) { + $long = ip2long($ip); + if (($long >= 167772160 && $long <= 184549375) || + ($long >= -1408237568 && $long <= -1407188993) || + ($long >= -1062731776 && $long <= -1062666241) || + ($long >= 2130706432 && $long <= 2147483647) || $long == -1) { + $this->sys->setHostname($result); //internal ip + } else { + $this->sys->setHostname(gethostbyaddr($ip)); + } + } + } else { + if ($hnm = getenv('COMPUTERNAME')) $this->sys->setHostname($hnm); + } + } + } + + /** + * UpTime + * time the system is running + * + * @return void + */ + private function _uptime() + { + $result = 0; + date_default_timezone_set('UTC'); + $buffer = CommonFunctions::getWMI($this->_wmi, 'Win32_OperatingSystem', array('LastBootUpTime', 'LocalDateTime')); + if ($buffer) { + $byear = intval(substr($buffer[0]['LastBootUpTime'], 0, 4)); + $bmonth = intval(substr($buffer[0]['LastBootUpTime'], 4, 2)); + $bday = intval(substr($buffer[0]['LastBootUpTime'], 6, 2)); + $bhour = intval(substr($buffer[0]['LastBootUpTime'], 8, 2)); + $bminute = intval(substr($buffer[0]['LastBootUpTime'], 10, 2)); + $bseconds = intval(substr($buffer[0]['LastBootUpTime'], 12, 2)); + $lyear = intval(substr($buffer[0]['LocalDateTime'], 0, 4)); + $lmonth = intval(substr($buffer[0]['LocalDateTime'], 4, 2)); + $lday = intval(substr($buffer[0]['LocalDateTime'], 6, 2)); + $lhour = intval(substr($buffer[0]['LocalDateTime'], 8, 2)); + $lminute = intval(substr($buffer[0]['LocalDateTime'], 10, 2)); + $lseconds = intval(substr($buffer[0]['LocalDateTime'], 12, 2)); + $boottime = mktime($bhour, $bminute, $bseconds, $bmonth, $bday, $byear); + $localtime = mktime($lhour, $lminute, $lseconds, $lmonth, $lday, $lyear); + $result = $localtime - $boottime; + $this->sys->setUptime($result); + } + } + + /** + * Number of Users + * + * @return void + */ + protected function _users() + { + if (CommonFunctions::executeProgram("quser", "", $strBuf, false) && (strlen($strBuf) > 0)) { + $lines = preg_split('/\n/', $strBuf); + $users = count($lines)-1; + } else { + $users = 0; + $buffer = CommonFunctions::getWMI($this->_wmi, 'Win32_Process', array('Caption')); + foreach ($buffer as $process) { + if (strtoupper($process['Caption']) == strtoupper('explorer.exe')) { + $users++; + } + } + } + $this->sys->setUsers($users); + } + + /** + * Distribution + * + * @return void + */ + private function _distro() + { + $buffer = CommonFunctions::getWMI($this->_wmi, 'Win32_OperatingSystem', array('Version', 'ServicePackMajorVersion', 'Caption', 'OSArchitecture')); + if ($buffer) { + $kernel = $buffer[0]['Version']; + if ($buffer[0]['ServicePackMajorVersion'] > 0) { + $kernel .= ' SP'.$buffer[0]['ServicePackMajorVersion']; + } + if (isset($buffer[0]['OSArchitecture']) && preg_match("/^(\d+)/", $buffer[0]['OSArchitecture'], $bits)) { + $this->sys->setKernel($kernel.' ('.$bits[1].'-bit)'); + } elseif (($allCpus = CommonFunctions::getWMI($this->_wmi, 'Win32_Processor', array('AddressWidth'))) && isset($allCpus[0]['AddressWidth'])) { + $this->sys->setKernel($kernel.' ('.$allCpus[0]['AddressWidth'].'-bit)'); + } else { + $this->sys->setKernel($kernel); + } + $this->sys->setDistribution($buffer[0]['Caption']); + + if ((($kernel[1] == ".") && ($kernel[0] <5)) || (substr($kernel, 0, 4) == "5.0.")) + $icon = 'Win2000.png'; + elseif ((substr($kernel, 0, 4) == "6.0.") || (substr($kernel, 0, 4) == "6.1.")) + $icon = 'WinVista.png'; + elseif ((substr($kernel, 0, 4) == "6.2.") || (substr($kernel, 0, 4) == "6.3.") || (substr($kernel, 0, 4) == "6.4.") || (substr($kernel, 0, 5) == "10.0.")) + $icon = 'Win8.png'; + else + $icon = 'WinXP.png'; + $this->sys->setDistributionIcon($icon); + } elseif (CommonFunctions::executeProgram("cmd", "/c ver 2>nul", $ver_value, false)) { + if (preg_match("/ReactOS\r?\nVersion\s+(.+)/", $ver_value, $ar_temp)) { + $this->sys->setDistribution("ReactOS"); + $this->sys->setKernel($ar_temp[1]); + $this->sys->setDistributionIcon('ReactOS.png'); + } elseif (preg_match("/^(Microsoft [^\[]*)\s*\[\D*\s*(.+)\]/", $ver_value, $ar_temp)) { + $this->sys->setDistribution($ar_temp[1]); + $this->sys->setKernel($ar_temp[2]); + $this->sys->setDistributionIcon('Win2000.png'); + } else { + $this->sys->setDistribution("WinNT"); + $this->sys->setDistributionIcon('Win2000.png'); + } + } else { + $this->sys->setDistribution("WinNT"); + $this->sys->setDistributionIcon('Win2000.png'); + } + } + + /** + * Processor Load + * optionally create a loadbar + * + * @return void + */ + private function _loadavg() + { + $loadavg = ""; + $sum = 0; + $buffer = CommonFunctions::getWMI($this->_wmi, 'Win32_Processor', array('LoadPercentage')); + if ($buffer) { + foreach ($buffer as $load) { + $value = $load['LoadPercentage']; + $loadavg .= $value.' '; + $sum += $value; + } + $this->sys->setLoad(trim($loadavg)); + if (PSI_LOAD_BAR) { + $this->sys->setLoadPercent($sum / count($buffer)); + } + } + } + + /** + * CPU information + * + * @return void + */ + private function _cpuinfo() + { + $allCpus = CommonFunctions::getWMI($this->_wmi, 'Win32_Processor', array('Name', 'L2CacheSize', 'CurrentClockSpeed', 'ExtClock', 'NumberOfCores', 'MaxClockSpeed')); + foreach ($allCpus as $oneCpu) { + $coreCount = 1; + if (isset($oneCpu['NumberOfCores'])) { + $coreCount = $oneCpu['NumberOfCores']; + } + for ($i = 0; $i < $coreCount; $i++) { + $cpu = new CpuDevice(); + $cpu->setModel($oneCpu['Name']); + $cpu->setCache($oneCpu['L2CacheSize'] * 1024); + $cpu->setCpuSpeed($oneCpu['CurrentClockSpeed']); + $cpu->setBusSpeed($oneCpu['ExtClock']); + if ($oneCpu['CurrentClockSpeed'] < $oneCpu['MaxClockSpeed']) $cpu->setCpuSpeedMax($oneCpu['MaxClockSpeed']); + $this->sys->setCpus($cpu); + } + } + } + + /** + * Machine information + * + * @return void + */ + private function _machine() + { + $buffer = CommonFunctions::getWMI($this->_wmi, 'Win32_ComputerSystem', array('Manufacturer', 'Model')); + if ($buffer) { + $buf = ""; + if (isset($buffer[0]['Manufacturer'])) { + $buf .= ' '.$buffer[0]['Manufacturer']; + } + if (isset($buffer[0]['Model'])) { + $buf .= ' '.$buffer[0]['Model']; + } + if (trim($buf) != "") { + $this->sys->setMachine(trim($buf)); + } + } + } + + /** + * Hardwaredevices + * + * @return void + */ + private function _hardware() + { + foreach ($this->_devicelist('PCI') as $pciDev) { + $dev = new HWDevice(); + $dev->setName($pciDev); + $this->sys->setPciDevices($dev); + } + + foreach ($this->_devicelist('IDE') as $ideDev) { + $dev = new HWDevice(); + $dev->setName($ideDev); + $this->sys->setIdeDevices($dev); + } + + foreach ($this->_devicelist('SCSI') as $scsiDev) { + $dev = new HWDevice(); + $dev->setName($scsiDev); + $this->sys->setScsiDevices($dev); + } + + foreach ($this->_devicelist('USB') as $usbDev) { + $dev = new HWDevice(); + $dev->setName($usbDev); + $this->sys->setUsbDevices($dev); + } + } + + /** + * Network devices + * + * @return void + */ + private function _network() + { + $allDevices = CommonFunctions::getWMI($this->_wmi, 'Win32_PerfRawData_Tcpip_NetworkInterface', array('Name', 'BytesSentPersec', 'BytesTotalPersec', 'BytesReceivedPersec', 'PacketsReceivedErrors', 'PacketsReceivedDiscarded', 'CurrentBandwidth')); + $allNetworkAdapterConfigurations = CommonFunctions::getWMI($this->_wmi, 'Win32_NetworkAdapterConfiguration', array('Description', 'MACAddress', 'IPAddress', 'SettingID')); + $allNetworkAdapter = CommonFunctions::getWMI($this->_wmi, 'Win32_NetworkAdapter', array('Name', 'GUID', 'Speed')); + + foreach ($allDevices as $device) { + $dev = new NetDevice(); + $name = $device['Name']; + + if (preg_match('/^isatap\.({[A-Fa-f0-9\-]*})/', $name, $ar_name)) { //isatap device + foreach ($allNetworkAdapterConfigurations as $NetworkAdapterConfiguration) { + if ($ar_name[1]==$NetworkAdapterConfiguration['SettingID']) { + $dev->setName($NetworkAdapterConfiguration['Description']); + if (defined('PSI_SHOW_NETWORK_INFOS') && PSI_SHOW_NETWORK_INFOS) { + $dev->setInfo(preg_replace('/:/', '-', strtoupper($NetworkAdapterConfiguration['MACAddress']))); + if (isset($NetworkAdapterConfiguration['IPAddress'])) + foreach($NetworkAdapterConfiguration['IPAddress'] as $ipaddres) + if (($ipaddres!="0.0.0.0") && ($ipaddres!="::") && !preg_match('/^fe80::/i', $ipaddres)) + $dev->setInfo(($dev->getInfo()?$dev->getInfo().';':'').strtolower($ipaddres)); + } + + break; + } + } + if (defined('PSI_SHOW_NETWORK_INFOS') && PSI_SHOW_NETWORK_INFOS) { + $speedinfo = null; + foreach ($allNetworkAdapter as $NetworkAdapter) { + if ($ar_name[1]==$NetworkAdapter['GUID']) { + if (!empty($NetworkAdapter['Speed']) && ($NetworkAdapter['Speed']!=="9223372036854775807")) { + if ($NetworkAdapter['Speed'] > 1000000000) { + $speedinfo = ($NetworkAdapter['Speed']/1000000000)."Gb/s"; + } else { + $speedinfo = ($NetworkAdapter['Speed']/1000000)."Mb/s"; + } + } + break; + } + } + if (($speedinfo !== null) && ($speedinfo !== "")) { + $dev->setInfo(($dev->getInfo()?$dev->getInfo().';':'').$speedinfo); + } elseif (($speedinfo = $device['CurrentBandwidth']) >= 1000000) { + $dev->setInfo(($dev->getInfo()?$dev->getInfo().';':'').($speedinfo/1000000)."Mb/s"); + } + } + } + if ($dev->getName() == "") { //no isatap or no isatap description + $cname=preg_replace('/[^A-Za-z0-9]/', '_', $name); //convert to canonical + if (preg_match('/\s-\s([^-]*)$/', $name, $ar_name)) + $name=substr($name, 0, strlen($name)-strlen($ar_name[0])); + $dev->setName($name); + + if (defined('PSI_SHOW_NETWORK_INFOS') && PSI_SHOW_NETWORK_INFOS) { + foreach ($allNetworkAdapterConfigurations as $NetworkAdapterConfiguration) { + if (preg_replace('/[^A-Za-z0-9]/', '_', $NetworkAdapterConfiguration['Description']) === $cname) { + if ($dev->getInfo() !== null) { + $dev->setInfo(''); //multiple with the same name + } else { + $dev->setInfo(preg_replace('/:/', '-', strtoupper($NetworkAdapterConfiguration['MACAddress']))); + if (isset($NetworkAdapterConfiguration['IPAddress'])) + foreach($NetworkAdapterConfiguration['IPAddress'] as $ipaddres) + if (($ipaddres!="0.0.0.0") && !preg_match('/^fe80::/i', $ipaddres)) + $dev->setInfo(($dev->getInfo()?$dev->getInfo().';':'').strtolower($ipaddres)); + } + } + } + $speedinfo = null; + foreach ($allNetworkAdapter as $NetworkAdapter) { + if (preg_replace('/[^A-Za-z0-9]/', '_', $NetworkAdapter['Name']) === $cname) { + if ($speedinfo !== null) { + $speedinfo = ""; //multiple with the same name + } else { + if (!empty($NetworkAdapter['Speed']) && ($NetworkAdapter['Speed']!=="9223372036854775807")) { + if ($NetworkAdapter['Speed'] > 1000000000) { + $speedinfo = ($NetworkAdapter['Speed']/1000000000)."Gb/s"; + } else { + $speedinfo = ($NetworkAdapter['Speed']/1000000)."Mb/s"; + } + } else { + $speedinfo = ""; + } + } + } + } + if (($speedinfo !== null) && ($speedinfo !== "")) { + $dev->setInfo(($dev->getInfo()?$dev->getInfo().';':'').$speedinfo); + } elseif (($speedinfo = $device['CurrentBandwidth']) >= 1000000) { + $dev->setInfo(($dev->getInfo()?$dev->getInfo().';':'').($speedinfo/1000000)."Mb/s"); + } + } + } + + // http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmi/win32_perfrawdata_tcpip_networkinterface.asp + // there is a possible bug in the wmi interfaceabout uint32 and uint64: http://www.ureader.com/message/1244948.aspx, so that + // magative numbers would occour, try to calculate the nagative value from total - positive number + $txbytes = $device['BytesSentPersec']; + $rxbytes = $device['BytesReceivedPersec']; + if (($txbytes < 0) && ($rxbytes < 0)) { + $txbytes += 4294967296; + $rxbytes += 4294967296; + } elseif ($txbytes < 0) { + if ($device['BytesTotalPersec'] > $rxbytes) + $txbytes = $device['BytesTotalPersec'] - $rxbytes; + else + $txbytes += 4294967296; + } elseif ($rxbytes < 0) { + if ($device['BytesTotalPersec'] > $txbytes) + $rxbytes = $device['BytesTotalPersec'] - $txbytes; + else + $rxbytes += 4294967296; + } + $dev->setTxBytes($txbytes); + $dev->setRxBytes($rxbytes); + $dev->setErrors($device['PacketsReceivedErrors']); + $dev->setDrops($device['PacketsReceivedDiscarded']); + + $this->sys->setNetDevices($dev); + } + } + + /** + * Physical memory information and Swap Space information + * + * @link http://msdn2.microsoft.com/En-US/library/aa394239.aspx + * @link http://msdn2.microsoft.com/en-us/library/aa394246.aspx + * @return void + */ + private function _memory() + { + $buffer = CommonFunctions::getWMI($this->_wmi, "Win32_OperatingSystem", array('TotalVisibleMemorySize', 'FreePhysicalMemory')); + if ($buffer) { + $this->sys->setMemTotal($buffer[0]['TotalVisibleMemorySize'] * 1024); + $this->sys->setMemFree($buffer[0]['FreePhysicalMemory'] * 1024); + $this->sys->setMemUsed($this->sys->getMemTotal() - $this->sys->getMemFree()); + } + $buffer = CommonFunctions::getWMI($this->_wmi, 'Win32_PageFileUsage'); + foreach ($buffer as $swapdevice) { + $dev = new DiskDevice(); + $dev->setName("SWAP"); + $dev->setMountPoint($swapdevice['Name']); + $dev->setTotal($swapdevice['AllocatedBaseSize'] * 1024 * 1024); + $dev->setUsed($swapdevice['CurrentUsage'] * 1024 * 1024); + $dev->setFree($dev->getTotal() - $dev->getUsed()); + $dev->setFsType('swap'); + $this->sys->setSwapDevices($dev); + } + } + + /** + * filesystem information + * + * @return void + */ + private function _filesystems() + { + $typearray = array('Unknown', 'No Root Directory', 'Removable Disk', 'Local Disk', 'Network Drive', 'Compact Disc', 'RAM Disk'); + $floppyarray = array('Unknown', '5 1/4 in.', '3 1/2 in.', '3 1/2 in.', '3 1/2 in.', '3 1/2 in.', '5 1/4 in.', '5 1/4 in.', '5 1/4 in.', '5 1/4 in.', '5 1/4 in.', 'Other', 'HD', '3 1/2 in.', '3 1/2 in.', '5 1/4 in.', '5 1/4 in.', '3 1/2 in.', '3 1/2 in.', '5 1/4 in.', '3 1/2 in.', '3 1/2 in.', '8 in.'); + $buffer = CommonFunctions::getWMI($this->_wmi, 'Win32_LogicalDisk', array('Name', 'Size', 'FreeSpace', 'FileSystem', 'DriveType', 'MediaType')); + foreach ($buffer as $filesystem) { + $dev = new DiskDevice(); + $dev->setMountPoint($filesystem['Name']); + $dev->setFsType($filesystem['FileSystem']); + if ($filesystem['Size'] > 0) { + $dev->setTotal($filesystem['Size']); + $dev->setFree($filesystem['FreeSpace']); + $dev->setUsed($filesystem['Size'] - $filesystem['FreeSpace']); + } + if ($filesystem['MediaType'] != "" && $filesystem['DriveType'] == 2) { + $dev->setName($typearray[$filesystem['DriveType']]." (".$floppyarray[$filesystem['MediaType']].")"); + } else { + $dev->setName($typearray[$filesystem['DriveType']]); + } + $this->sys->setDiskDevices($dev); + } + if (!$buffer && ($this->sys->getDistribution()=="ReactOS")) { + // test for command 'free' on current disk + if (CommonFunctions::executeProgram("cmd", "/c free 2>nul", $out_value, true)) { + for ($letter='A'; $letter!='AA'; $letter++) if (CommonFunctions::executeProgram("cmd", "/c free ".$letter.": 2>nul", $out_value, false)) { + if (preg_match('/\n\s*([\d\.\,]+).*\n\s*([\d\.\,]+).*\n\s*([\d\.\,]+).*$/', $out_value, $out_dig)) { + $size = preg_replace('/(\.)|(\,)/', '', $out_dig[1]); + $used = preg_replace('/(\.)|(\,)/', '', $out_dig[2]); + $free = preg_replace('/(\.)|(\,)/', '', $out_dig[3]); + if ($used + $free == $size) { + $dev = new DiskDevice(); + $dev->setMountPoint($letter.":"); + $dev->setFsType('Unknown'); + $dev->setTotal($size); + $dev->setFree($free); + $dev->setUsed($used); + $this->sys->setDiskDevices($dev); + } + } + } + } + } + } + + /** + * get os specific encoding + * + * @see OS::getEncoding() + * + * @return string + */ + public function getEncoding() + { + return $this->_codepage; + } + + /** + * get os specific language + * + * @see OS::getLanguage() + * + * @return string + */ + public function getLanguage() + { + return $this->_syslang; + } + + public function _processes() + { + $processes['*'] = 0; + if (CommonFunctions::executeProgram("qprocess", "*", $strBuf, false) && (strlen($strBuf) > 0)) { + $lines = preg_split('/\n/', $strBuf); + $processes['*'] = (count($lines)-1) - 3 ; //correction for process "qprocess *" + } + if ($processes['*'] <= 0) { + $buffer = CommonFunctions::getWMI($this->_wmi, 'Win32_Process', array('Caption')); + $processes['*'] = count($buffer); + } + $processes[' '] = $processes['*']; + $this->sys->setProcesses($processes); + } + + + /** + * get the information + * + * @see PSI_Interface_OS::build() + * + * @return Void + */ + public function build() + { + $this->_distro(); + if ($this->sys->getDistribution()=="ReactOS") { + $this->error->addError("WARN", "The ReactOS version of phpSysInfo is a work in progress, some things currently don't work"); + } + $this->_hostname(); + $this->_users(); + $this->_machine(); + $this->_uptime(); + $this->_cpuinfo(); + $this->_network(); + $this->_hardware(); + $this->_filesystems(); + $this->_memory(); + $this->_loadavg(); + $this->_processes(); + } +} diff --git a/sources/includes/output/class.Output.inc.php b/sources/includes/output/class.Output.inc.php new file mode 100644 index 0000000..c9ed74a --- /dev/null +++ b/sources/includes/output/class.Output.inc.php @@ -0,0 +1,58 @@ + + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version SVN: $Id: class.Output.inc.php 569 2012-04-16 06:08:18Z namiltd $ + * @link http://phpsysinfo.sourceforge.net + */ + /** + * basic output functions for all output formats + * + * @category PHP + * @package PSI_Output + * @author Michael Cramer + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version Release: 3.0 + * @link http://phpsysinfo.sourceforge.net + */ +abstract class Output +{ + /** + * error object for logging errors + * + * @var Error + */ + protected $error; + + /** + * call the parent constructor and check for needed extensions + */ + public function __construct() + { + $this->error = PSI_Error::singleton(); + $this->_checkConfig(); + CommonFunctions::checkForExtensions(); + } + + /** + * read the config file and check for existence + * + * @return void + */ + private function _checkConfig() + { + include_once APP_ROOT.'/read_config.php'; + + if ($this->error->errorsExist()) { + $this->error->errorsAsXML(); + } + } +} diff --git a/sources/includes/output/class.Template.inc.php b/sources/includes/output/class.Template.inc.php new file mode 100644 index 0000000..3fa71ce --- /dev/null +++ b/sources/includes/output/class.Template.inc.php @@ -0,0 +1,93 @@ + + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version SVN: $Id: class.Output.inc.php 315 2009-09-02 15:48:31Z bigmichi1 $ + * @link http://phpsysinfo.sourceforge.net + */ +/** + * basic output functions for all output formats + * + * @category PHP + * @package PSI_Output + * @author Damien Roth + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version Release: 3.0 + * @link http://phpsysinfo.sourceforge.net + */ +class Template +{ + /** + * Vars used in the template + * + * @Array + */ + private $_vars; + + /** + * Template file + * + * @String + */ + private $_file; + + /** + * Constructor + * + * @param String $file the template file name + */ + public function __construct($file=null) + { + $this->_file = $file; + $this->_vars = array(); + } + + /** + * Set a template variable. + * + * @param string variable name + * @param string variable value + */ + public function set($name, $value) + { + $this->_vars[$name] = is_object($value) ? $value->fetch() : $value; + } + + /** + * Open, parse, and return the template file. + * + * @param string $file + * + * @return string + */ + public function fetch($file=null) + { + if (!$file) { + $file = $this->_file; + } + + // Extract the vars to local namespace + extract($this->_vars); + + // Start output buffering + ob_start(); + + include(APP_ROOT.$file); + + // Get the contents of the buffer + $contents = ob_get_contents(); + + // End buffering and discard + ob_end_clean(); + + return $contents; + } +} diff --git a/sources/includes/output/class.Webpage.inc.php b/sources/includes/output/class.Webpage.inc.php new file mode 100644 index 0000000..c559847 --- /dev/null +++ b/sources/includes/output/class.Webpage.inc.php @@ -0,0 +1,190 @@ + + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version SVN: $Id: class.Webpage.inc.php 661 2012-08-27 11:26:39Z namiltd $ + * @link http://phpsysinfo.sourceforge.net + */ + /** + * generate the dynamic webpage + * + * @category PHP + * @package PSI_Web + * @author Michael Cramer + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version Release: 3.0 + * @link http://phpsysinfo.sourceforge.net + */ +class Webpage extends Output implements PSI_Interface_Output +{ + /** + * configured indexname + * + * @var String + */ + private $_indexname; + + /** + * configured language + * + * @var String + */ + private $_language; + + /** + * configured template + * + * @var String + */ + private $_template; + + /** + * all available templates + * + * @var Array + */ + private $_templates = array(); + + /** + * configured bootstrap template + * + * @var String + */ + private $_bootstrap_template; + + /** + * all available bootstrap templates + * + * @var Array + */ + private $_bootstrap_templates = array(); + + /** + * all available languages + * + * @var Array + */ + private $_languages = array(); + + /** + * configured show picklist language + * + * @var boolean + */ + private $_pick_language; + + /** + * configured show picklist template + * + * @var boolean + */ + private $_pick_template; + + /** + * check for all extensions that are needed, initialize needed vars and read phpsysinfo.ini + */ + public function __construct($indexname="dynamic") + { + $this->_indexname = $indexname; + parent::__construct(); + $this->_getTemplateList(); + $this->_getLanguageList(); + } + + /** + * checking phpsysinfo.ini setting for template, if not supportet set phpsysinfo.css as default + * checking phpsysinfo.ini setting for language, if not supported set en as default + * + * @return void + */ + private function _checkTemplateLanguage() + { + if (!defined("PSI_DEFAULT_TEMPLATE") || (($this->_template = strtolower(trim(PSI_DEFAULT_TEMPLATE))) == "") || !file_exists(APP_ROOT.'/templates/'.$this->_template.".css")) { + $this->_template = 'phpsysinfo'; + } + if (!defined("PSI_DEFAULT_BOOTSTRAP_TEMPLATE") || (($this->_bootstrap_template = strtolower(trim(PSI_DEFAULT_BOOTSTRAP_TEMPLATE))) == "") || !file_exists(APP_ROOT.'/templates/'.$this->_bootstrap_template.".css")) { + $this->_bootstrap_template = 'phpsysinfo'; + } + $this->_pick_template = !defined("PSI_SHOW_PICKLIST_TEMPLATE") || (PSI_SHOW_PICKLIST_TEMPLATE !== false); + + if (!defined("PSI_DEFAULT_LANG") || (($this->_language = strtolower(trim(PSI_DEFAULT_LANG))) == "") || !file_exists(APP_ROOT.'/language/'.$this->_language.".xml")) { + $this->_language = 'en'; + } + $this->_pick_language = !defined("PSI_SHOW_PICKLIST_LANG") || (PSI_SHOW_PICKLIST_LANG !== false); + } + + /** + * get all available tamplates and store them in internal array + * + * @return void + */ + private function _getTemplateList() + { + $dirlist = CommonFunctions::gdc(APP_ROOT.'/templates/'); + sort($dirlist); + foreach ($dirlist as $file) { + $tpl_ext = substr($file, strlen($file) - 4); + $tpl_name = substr($file, 0, strlen($file) - 4); + if ($tpl_ext === ".css") { + if (preg_match("/(\S+)_bootstrap$/", $tpl_name, $ar_buf)) { + array_push($this->_bootstrap_templates, $ar_buf[1]); + } else { + array_push($this->_templates, $tpl_name); + } + } + } + } + + /** + * get all available translations and store them in internal array + * + * @return void + */ + private function _getLanguageList() + { + $dirlist = CommonFunctions::gdc(APP_ROOT.'/language/'); + sort($dirlist); + foreach ($dirlist as $file) { + $lang_ext = substr($file, strlen($file) - 4); + $lang_name = substr($file, 0, strlen($file) - 4); + if ($lang_ext == ".xml") { + array_push($this->_languages, $lang_name); + } + } + } + + /** + * render the page + * + * @return void + */ + public function run() + { + $this->_checkTemplateLanguage(); + + $tpl = new Template("/templates/html/index_".$this->_indexname.".html"); + + $tpl->set("template", $this->_template); + $tpl->set("templates", $this->_templates); + $tpl->set("bootstraptemplate", $this->_bootstrap_template); + $tpl->set("bootstraptemplates", $this->_bootstrap_templates); + $tpl->set("picktemplate", $this->_pick_template); + $tpl->set("language", $this->_language); + $tpl->set("languages", $this->_languages); + $tpl->set("picklanguage", $this->_pick_language); + $tpl->set("showCPUListExpanded", defined('PSI_SHOW_CPULIST_EXPANDED') ? (PSI_SHOW_CPULIST_EXPANDED ? 'true' : 'false') : 'true'); + $tpl->set("showCPUInfoExpanded", defined('PSI_SHOW_CPUINFO_EXPANDED') ? (PSI_SHOW_CPUINFO_EXPANDED ? 'true' : 'false') : 'false'); + $tpl->set("showNetworkInfosExpanded", defined('PSI_SHOW_NETWORK_INFOS_EXPANDED') ? (PSI_SHOW_NETWORK_INFOS_EXPANDED ? 'true' : 'false') : 'false'); + $tpl->set("showMemoryInfosExpanded", defined('PSI_SHOW_MEMORY_INFOS_EXPANDED') ? (PSI_SHOW_MEMORY_INFOS_EXPANDED ? 'true' : 'false') : 'false'); + + echo $tpl->fetch(); + } +} diff --git a/sources/includes/output/class.WebpageXML.inc.php b/sources/includes/output/class.WebpageXML.inc.php new file mode 100644 index 0000000..511fed9 --- /dev/null +++ b/sources/includes/output/class.WebpageXML.inc.php @@ -0,0 +1,177 @@ + + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version SVN: $Id: class.WebpageXML.inc.php 661 2012-08-27 11:26:39Z namiltd $ + * @link http://phpsysinfo.sourceforge.net + */ + /** + * class for xml output + * + * @category PHP + * @package PSI_XML + * @author Michael Cramer + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version Release: 3.0 + * @link http://phpsysinfo.sourceforge.net + */ +class WebpageXML extends Output implements PSI_Interface_Output +{ + /** + * xml object that holds the generated xml + * + * @var XML + */ + private $_xml; + + /** + * only plugin xml + * + * @var boolean + */ + private $_pluginRequest = false; + + /** + * complete xml + * + * @var boolean + */ + private $_completeXML = false; + + /** + * name of the plugin + * + * @var string + */ + private $_pluginName = null; + + /** + * generate the output + * + * @return void + */ + private function _prepare() + { + if (!$this->_pluginRequest) { + // Figure out which OS we are running on, and detect support + if (!file_exists(APP_ROOT.'/includes/os/class.'.PSI_OS.'.inc.php')) { + $this->error->addError("file_exists(class.".PSI_OS.".inc.php)", PSI_OS." is not currently supported"); + } + + // check if there is a valid sensor configuration in phpsysinfo.ini + $foundsp = array(); + if (defined('PSI_SENSOR_PROGRAM') && is_string(PSI_SENSOR_PROGRAM)) { + if (preg_match(ARRAY_EXP, PSI_SENSOR_PROGRAM)) { + $sensorprograms = eval(strtolower(PSI_SENSOR_PROGRAM)); + } else { + $sensorprograms = array(strtolower(PSI_SENSOR_PROGRAM)); + } + foreach ($sensorprograms as $sensorprogram) { + if (!file_exists(APP_ROOT.'/includes/mb/class.'.$sensorprogram.'.inc.php')) { + $this->error->addError("file_exists(class.".htmlspecialchars($sensorprogram).".inc.php)", "specified sensor program is not supported"); + } else { + $foundsp[] = $sensorprogram; + } + } + } + + /** + * motherboard information + * + * @var serialized array + */ + define('PSI_MBINFO', serialize($foundsp)); + + // check if there is a valid ups configuration in phpsysinfo.ini + $foundup = array(); + if (defined('PSI_UPS_PROGRAM') && is_string(PSI_UPS_PROGRAM)) { + if (preg_match(ARRAY_EXP, PSI_UPS_PROGRAM)) { + $upsprograms = eval(strtolower(PSI_UPS_PROGRAM)); + } else { + $upsprograms = array(strtolower(PSI_UPS_PROGRAM)); + } + foreach ($upsprograms as $upsprogram) { + if (!file_exists(APP_ROOT.'/includes/ups/class.'.$upsprogram.'.inc.php')) { + $this->error->addError("file_exists(class.".htmlspecialchars($upsprogram).".inc.php)", "specified UPS program is not supported"); + } else { + $foundup[] = $upsprogram; + } + } + } + /** + * ups information + * + * @var serialized array + */ + define('PSI_UPSINFO', serialize($foundup)); + + // if there are errors stop executing the script until they are fixed + if ($this->error->errorsExist()) { + $this->error->errorsAsXML(); + } + } + + // Create the XML + if ($this->_pluginRequest) { + $this->_xml = new XML(false, $this->_pluginName); + } else { + $this->_xml = new XML($this->_completeXML); + } + } + + /** + * render the output + * + * @return void + */ + public function run() + { + header("Cache-Control: no-cache, must-revalidate\n"); + header("Content-Type: text/xml\n\n"); + $xml = $this->_xml->getXml(); + echo $xml->asXML(); + } + + /** + * get XML as pure string + * + * @return string + */ + public function getXMLString() + { + $xml = $this->_xml->getXml(); + + return $xml->asXML(); + } + + /** + * set parameters for the XML generation process + * + * @param boolean $completeXML switch for complete xml with all plugins + * @param string $plugin name of the plugin + * + * @return void + */ + public function __construct($completeXML, $plugin = null) + { + parent::__construct(); + if ($completeXML) { + $this->_completeXML = true; + } + if ($plugin) { + if (in_array(strtolower($plugin), CommonFunctions::getPlugins())) { + $this->_pluginName = $plugin; + $this->_pluginRequest = true; + } + } + $this->_prepare(); + } +} diff --git a/sources/includes/output/class.WebpageXSLT.inc.php b/sources/includes/output/class.WebpageXSLT.inc.php new file mode 100644 index 0000000..284498c --- /dev/null +++ b/sources/includes/output/class.WebpageXSLT.inc.php @@ -0,0 +1,54 @@ + + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version SVN: $Id: class.WebpageXSLT.inc.php 569 2012-04-16 06:08:18Z namiltd $ + * @link http://phpsysinfo.sourceforge.net + */ + /** + * generate a static webpage with xslt trasformation of the xml + * + * @category PHP + * @package PSI_Web + * @author Michael Cramer + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version Release: 3.0 + * @link http://phpsysinfo.sourceforge.net + */ +class WebpageXSLT extends WebpageXML implements PSI_Interface_Output +{ + /** + * call the parent constructor + */ + public function __construct() + { + parent::__construct(false, null); + } + + /** + * generate the static page + * + * @return void + */ + public function run() + { + CommonFunctions::checkForExtensions(array('xsl')); + $xmlfile = $this->getXMLString(); + $xslfile = "phpsysinfo.xslt"; + $domxml = new DOMDocument(); + $domxml->loadXML($xmlfile); + $domxsl = new DOMDocument(); + $domxsl->load($xslfile); + $xsltproc = new XSLTProcessor; + $xsltproc->importStyleSheet($domxsl); + echo $xsltproc->transformToXML($domxml); + } +} diff --git a/sources/includes/plugin/class.PSI_Plugin.inc.php b/sources/includes/plugin/class.PSI_Plugin.inc.php new file mode 100644 index 0000000..2ae3af8 --- /dev/null +++ b/sources/includes/plugin/class.PSI_Plugin.inc.php @@ -0,0 +1,134 @@ + + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version SVN: $Id: class.PSI_Plugin.inc.php 661 2012-08-27 11:26:39Z namiltd $ + * @link http://phpsysinfo.sourceforge.net + */ + /** + * basic functions to get a plugin working in phpSysinfo + * every plugin must implement this abstract class to be a valid plugin, main tasks + * of this class are reading the configuration file and check for the required files + * (*.js, lang/en.xml) to get everything working, if we have errors here we log them + * to our global error object + * + * @category PHP + * @package PSI_Plugin + * @author Michael Cramer + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version Release: 3.0 + * @link http://phpsysinfo.sourceforge.net + */ +abstract class PSI_Plugin implements PSI_Interface_Plugin +{ + /** + * name of the plugin (classname) + * + * @var string + */ + private $_plugin_name = ""; + + /** + * full directory path of the plugin + * + * @var string + */ + private $_plugin_base = ""; + + /** + * global object for error handling + * + * @var Error + */ + protected $global_error = ""; + + /** + * xml tamplate with header + * + * @var SimpleXMLExtended + */ + protected $xml; + + /** + * build the global Error object, read the configuration and check if all files are available + * for a minimalistic function of the plugin + * + * @param String $plugin_name name of the plugin + * @param String $enc target encoding + * + * @return void + */ + public function __construct($plugin_name, $enc) + { + $this->global_error = PSI_Error::Singleton(); + if (trim($plugin_name) != "") { + $this->_plugin_name = $plugin_name; + $this->_plugin_base = APP_ROOT."/plugins/".strtolower($this->_plugin_name)."/"; + $this->_checkfiles(); + $this->_getconfig(); + } else { + $this->global_error->addError("__construct()", "Parent constructor called without Plugin-Name!"); + } + $this->_createXml($enc); + } + + /** + * read the plugin configuration file, if we have one in the plugin directory + * + * @return void + */ + private function _getconfig() + { + if ((!defined('PSI_PLUGIN_'.strtoupper($this->_plugin_name).'_ACCESS')) && + (!defined('PSI_PLUGIN_'.strtoupper($this->_plugin_name).'_FILE'))) { + $this->global_error->addError("config.ini", "Config for plugin ".$this->_plugin_name." not exist!"); + } + } + + /** + * check if there is a default translation file availabe and also the required js file for + * appending the content of the plugin to the main webpage + * + * @return void + */ + private function _checkfiles() + { + if (!file_exists($this->_plugin_base."js/".strtolower($this->_plugin_name).".js")) { + $this->global_error->addError("file_exists(".$this->_plugin_base."js/".strtolower($this->_plugin_name).".js)", "JS-File for Plugin '".$this->_plugin_name."' is missing!"); + } else { + if (!is_readable($this->_plugin_base."js/".strtolower($this->_plugin_name).".js")) { + $this->global_error->addError("is_readable(".$this->_plugin_base."js/".strtolower($this->_plugin_name).".js)", "JS-File for Plugin '".$this->_plugin_name."' is not readable but present!"); + } + } + if (!file_exists($this->_plugin_base."lang/en.xml")) { + $this->global_error->addError("file_exists(".$this->_plugin_base."lang/en.xml)", "At least an english translation must exist for the plugin!"); + } else { + if (!is_readable($this->_plugin_base."lang/en.xml")) { + $this->global_error->addError("is_readable(".$this->_plugin_base."js/".$this->_plugin_name.".js)", "The english translation can't be read but is present!"); + } + } + } + + /** + * create the xml template where plugin information are added to + * + * @param String $enc target encoding + * + * @return Void + */ + private function _createXml($enc) + { + $dom = new DOMDocument('1.0', 'UTF-8'); + $root = $dom->createElement("Plugin_".$this->_plugin_name); + $dom->appendChild($root); + $this->xml = new SimpleXMLExtended(simplexml_import_dom($dom), $enc); + } +} diff --git a/sources/includes/to/class.MBInfo.inc.php b/sources/includes/to/class.MBInfo.inc.php new file mode 100644 index 0000000..07c254c --- /dev/null +++ b/sources/includes/to/class.MBInfo.inc.php @@ -0,0 +1,201 @@ + + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version SVN: $Id: class.MBInfo.inc.php 253 2009-06-17 13:07:50Z bigmichi1 $ + * @link http://phpsysinfo.sourceforge.net + */ + /** + * MBInfo TO class + * + * @category PHP + * @package PSI_TO + * @author Michael Cramer + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version Release: 3.0 + * @link http://phpsysinfo.sourceforge.net + */ +class MBInfo +{ + /** + * array with SensorDevices for temperatures + * + * @see SensorDevice + * + * @var Array + */ + private $_mbTemp = array(); + + /** + * array with SensorDevices for fans + * + * @see SensorDevice + * + * @var Array + */ + private $_mbFan = array(); + + /** + * array with SensorDevices for voltages + * + * @see SensorDevice + * + * @var Array + */ + private $_mbVolt = array(); + + /** + * array with SensorDevices for power + * + * @see SensorDevice + * + * @var Array + */ + private $_mbPower = array(); + + /** + * array with SensorDevices for apmers + * + * @see SensorDevice + * + * @var Array + */ + private $_mbCurrent = array(); + + /** + * Returns $_mbFan. + * + * @see System::$_mbFan + * + * @return Array + */ + public function getMbFan() + { + return $this->_mbFan; + } + + /** + * Sets $_mbFan. + * + * @param SensorDevice $mbFan fan device + * + * @see System::$_mbFan + * + * @return Void + */ + public function setMbFan($mbFan) + { + array_push($this->_mbFan, $mbFan); + } + + /** + * Returns $_mbTemp. + * + * @see System::$_mbTemp + * + * @return Array + */ + public function getMbTemp() + { + return $this->_mbTemp; + } + + /** + * Sets $_mbTemp. + * + * @param Sensor $mbTemp temp device + * + * @see System::$_mbTemp + * + * @return Void + */ + public function setMbTemp($mbTemp) + { + array_push($this->_mbTemp, $mbTemp); + } + + /** + * Returns $_mbVolt. + * + * @see System::$_mbVolt + * + * @return Array + */ + public function getMbVolt() + { + return $this->_mbVolt; + } + + /** + * Sets $_mbVolt. + * + * @param Sensor $mbVolt voltage device + * + * @see System::$_mbVolt + * + * @return Void + */ + public function setMbVolt($mbVolt) + { + array_push($this->_mbVolt, $mbVolt); + } + + /** + * Returns $_mbPower. + * + * @see System::$_mbPower + * + * @return Array + */ + public function getMbPower() + { + return $this->_mbPower; + } + + /** + * Sets $_mbPower. + * + * @param Sensor $mbPower power device + * + * @see System::$_mbPower + * + * @return Void + */ + public function setMbPower($mbPower) + { + array_push($this->_mbPower, $mbPower); + } + /** + * Returns $_mbCurrent. + * + * @see System::$_mbCurrent + * + * @return Array + */ + public function getMbCurrent() + { + return $this->_mbCurrent; + } + + /** + * Sets $_mbCurrent. + * + * @param Sensor $mbCurrent current device + * + * @see System::$_mbCurrent + * + * @return Void + */ + public function setMbCurrent($mbCurrent) + { + array_push($this->_mbCurrent, $mbCurrent); + } +} diff --git a/sources/includes/to/class.System.inc.php b/sources/includes/to/class.System.inc.php new file mode 100644 index 0000000..938139e --- /dev/null +++ b/sources/includes/to/class.System.inc.php @@ -0,0 +1,1167 @@ + + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version SVN: $Id: class.System.inc.php 255 2009-06-17 13:39:41Z bigmichi1 $ + * @link http://phpsysinfo.sourceforge.net + */ + /** + * System TO class + * + * @category PHP + * @package PSI_TO + * @author Michael Cramer + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version Release: 3.0 + * @link http://phpsysinfo.sourceforge.net + */ +class System +{ + /** + * name of the host where phpSysInfo runs + * + * @var String + */ + private $_hostname = "localhost"; + + /** + * ip of the host where phpSysInfo runs + * + * @var String + */ + private $_ip = "127.0.0.1"; + + /** + * detailed Information about the kernel + * + * @var String + */ + private $_kernel = "Unknown"; + + /** + * name of the distribution + * + * @var String + */ + private $_distribution = "Unknown"; + + /** + * icon of the distribution (must be available in phpSysInfo) + * + * @var String + */ + private $_distributionIcon = "unknown.png"; + + /** + * detailed Information about the machine name + * + * @var String + */ + private $_machine = ""; + + /** + * time in sec how long the system is running + * + * @var Integer + */ + private $_uptime = 0; + + /** + * count of users that are currently logged in + * + * @var Integer + */ + private $_users = 0; + + /** + * load of the system + * + * @var String + */ + private $_load = ""; + + /** + * load of the system in percent (all cpus, if more than one) + * + * @var Integer + */ + private $_loadPercent = null; + + /** + * array with cpu devices + * + * @see CpuDevice + * + * @var Array + */ + private $_cpus = array(); + + /** + * array with network devices + * + * @see NetDevice + * + * @var Array + */ + private $_netDevices = array(); + + /** + * array with pci devices + * + * @see HWDevice + * + * @var Array + */ + private $_pciDevices = array(); + + /** + * array with ide devices + * + * @see HWDevice + * + * @var Array + */ + private $_ideDevices = array(); + + /** + * array with scsi devices + * + * @see HWDevice + * + * @var Array + */ + private $_scsiDevices = array(); + + /** + * array with usb devices + * + * @see HWDevice + * + * @var Array + */ + private $_usbDevices = array(); + + /** + * array with thunderbolt devices + * + * @see HWDevice + * + * @var Array + */ + private $_tbDevices = array(); + + /** + * array with I2C devices + * + * @see HWDevice + * + * @var Array + */ + private $_i2cDevices = array(); + + /** + * array with disk devices + * + * @see DiskDevice + * + * @var Array + */ + private $_diskDevices = array(); + + /** + * free memory in bytes + * + * @var Integer + */ + private $_memFree = 0; + + /** + * total memory in bytes + * + * @var Integer + */ + private $_memTotal = 0; + + /** + * used memory in bytes + * + * @var Integer + */ + private $_memUsed = 0; + + /** + * used memory by applications in bytes + * + * @var Integer + */ + private $_memApplication = null; + + /** + * used memory for buffers in bytes + * + * @var Integer + */ + private $_memBuffer = null; + + /** + * used memory for cache in bytes + * + * @var Integer + */ + private $_memCache = null; + + /** + * array with swap devices + * + * @see DiskDevice + * + * @var Array + */ + private $_swapDevices = array(); + + /** + * array of types of processes + * + * @var Array + */ + private $_processes = array(); + + /** + * remove duplicate Entries and Count + * + * @param Array $arrDev list of HWDevices + * + * @see HWDevice + * + * @return Array + */ + public static function removeDupsAndCount($arrDev) + { + $result = array(); + foreach ($arrDev as $dev) { + if (count($result) === 0) { + array_push($result, $dev); + } else { + $found = false; + foreach ($result as $tmp) { + if ($dev->equals($tmp)) { + $tmp->setCount($tmp->getCount() + 1); + $found = true; + break; + } + } + if (!$found) { + array_push($result, $dev); + } + } + } + + return $result; + } + + /** + * return percent of used memory + * + * @see System::_memUsed + * @see System::_memTotal + * + * @return Integer + */ + public function getMemPercentUsed() + { + if ($this->_memTotal > 0) { + return round($this->_memUsed / $this->_memTotal * 100); + } else { + return 0; + } + } + + /** + * return percent of used memory for applications + * + * @see System::_memApplication + * @see System::_memTotal + * + * @return Integer + */ + public function getMemPercentApplication() + { + if ($this->_memApplication !== null) { + if (($this->_memApplication > 0) && ($this->_memTotal > 0)) { + return round($this->_memApplication / $this->_memTotal * 100); + } else { + return 0; + } + } else { + return null; + } + } + + /** + * return percent of used memory for cache + * + * @see System::_memCache + * @see System::_memTotal + * + * @return Integer + */ + public function getMemPercentCache() + { + if ($this->_memCache !== null) { + if (($this->_memCache > 0) && ($this->_memTotal > 0)) { + if (($this->_memApplication !== null) && ($this->_memApplication > 0)) { + return round(($this->_memCache + $this->_memApplication) / $this->_memTotal * 100) - $this->getMemPercentApplication(); + } else { + return round($this->_memCache / $this->_memTotal * 100); + } + } else { + return 0; + } + } else { + return null; + } + } + + /** + * return percent of used memory for buffer + * + * @see System::_memBuffer + * @see System::_memTotal + * + * @return Integer + */ + public function getMemPercentBuffer() + { + if ($this->_memBuffer !== null) { + if (($this->_memBuffer > 0) && ($this->_memTotal > 0)) { + if (($this->_memCache !== null) && ($this->_memCache > 0)) { + if (($this->_memApplication !== null) && ($this->_memApplication > 0)) { + return round(($this->_memBuffer + $this->_memApplication + $this->_memCache) / $this->_memTotal * 100) - $this->getMemPercentApplication() - $this->getMemPercentCache(); + } else { + return round(($this->_memBuffer + $this->_memCache) / $this->_memTotal * 100) - $this->getMemPercentCache(); + } + } elseif (($this->_memApplication !== null) && ($this->_memApplication > 0)) { + return round(($this->_memBuffer + $this->_memApplication) / $this->_memTotal * 100) - $this->getMemPercentApplication(); + } else { + return round($this->_memBuffer / $this->_memTotal * 100); + } + } else { + return 0; + } + } else { + return null; + } + } + + /** + * Returns total free swap space + * + * @see System::_swapDevices + * @see DiskDevice::getFree() + * + * @return Integer + */ + public function getSwapFree() + { + if (count($this->_swapDevices) > 0) { + $free = 0; + foreach ($this->_swapDevices as $dev) { + $free += $dev->getFree(); + } + + return $free; + } + + return null; + } + + /** + * Returns total swap space + * + * @see System::_swapDevices + * @see DiskDevice::getTotal() + * + * @return Integer + */ + public function getSwapTotal() + { + if (count($this->_swapDevices) > 0) { + $total = 0; + foreach ($this->_swapDevices as $dev) { + $total += $dev->getTotal(); + } + + return $total; + } else { + return null; + } + } + + /** + * Returns total used swap space + * + * @see System::_swapDevices + * @see DiskDevice::getUsed() + * + * @return Integer + */ + public function getSwapUsed() + { + if (count($this->_swapDevices) > 0) { + $used = 0; + foreach ($this->_swapDevices as $dev) { + $used += $dev->getUsed(); + } + + return $used; + } else { + return null; + } + } + + /** + * return percent of total swap space used + * + * @see System::getSwapUsed() + * @see System::getSwapTotal() + * + * @return Integer + */ + public function getSwapPercentUsed() + { + if ($this->getSwapTotal() !== null) { + if ($this->getSwapTotal() > 0) { + return round($this->getSwapUsed() / $this->getSwapTotal() * 100); + } else { + return 0; + } + } else { + return null; + } + } + + /** + * Returns $_distribution. + * + * @see System::$_distribution + * + * @return String + */ + public function getDistribution() + { + return $this->_distribution; + } + + /** + * Sets $_distribution. + * + * @param String $distribution distributionname + * + * @see System::$_distribution + * + * @return Void + */ + public function setDistribution($distribution) + { + $this->_distribution = $distribution; + } + + /** + * Returns $_distributionIcon. + * + * @see System::$_distributionIcon + * + * @return String + */ + public function getDistributionIcon() + { + return $this->_distributionIcon; + } + + /** + * Sets $_distributionIcon. + * + * @param String $distributionIcon distribution icon + * + * @see System::$_distributionIcon + * + * @return Void + */ + public function setDistributionIcon($distributionIcon) + { + $this->_distributionIcon = $distributionIcon; + } + + /** + * Returns $_hostname. + * + * @see System::$_hostname + * + * @return String + */ + public function getHostname() + { + return $this->_hostname; + } + + /** + * Sets $_hostname. + * + * @param String $hostname hostname + * + * @see System::$_hostname + * + * @return Void + */ + public function setHostname($hostname) + { + $this->_hostname = $hostname; + } + + /** + * Returns $_ip. + * + * @see System::$_ip + * + * @return String + */ + public function getIp() + { + return $this->_ip; + } + + /** + * Sets $_ip. + * + * @param String $ip IP + * + * @see System::$_ip + * + * @return Void + */ + public function setIp($ip) + { + $this->_ip = $ip; + } + + /** + * Returns $_kernel. + * + * @see System::$_kernel + * + * @return String + */ + public function getKernel() + { + return $this->_kernel; + } + + /** + * Sets $_kernel. + * + * @param String $kernel kernelname + * + * @see System::$_kernel + * + * @return Void + */ + public function setKernel($kernel) + { + $this->_kernel = $kernel; + } + + /** + * Returns $_load. + * + * @see System::$_load + * + * @return String + */ + public function getLoad() + { + return $this->_load; + } + + /** + * Sets $_load. + * + * @param String $load current system load + * + * @see System::$_load + * + * @return Void + */ + public function setLoad($load) + { + $this->_load = $load; + } + + /** + * Returns $_loadPercent. + * + * @see System::$_loadPercent + * + * @return Integer + */ + public function getLoadPercent() + { + return $this->_loadPercent; + } + + /** + * Sets $_loadPercent. + * + * @param Integer $loadPercent load percent + * + * @see System::$_loadPercent + * + * @return Void + */ + public function setLoadPercent($loadPercent) + { + $this->_loadPercent = $loadPercent; + } + + /** + * Returns $_machine. + * + * @see System::$_machine + * + * @return String + */ + public function getMachine() + { + return $this->_machine; + } + + /** + * Sets $_machine. + * + * @param Interger $machine machine + * + * @see System::$_machine + * + * @return Void + */ + public function setMachine($machine) + { + $this->_machine = $machine; + } + + /** + * Returns $_uptime. + * + * @see System::$_uptime + * + * @return Integer + */ + public function getUptime() + { + return $this->_uptime; + } + + /** + * Sets $_uptime. + * + * @param Interger $uptime uptime + * + * @see System::$_uptime + * + * @return Void + */ + public function setUptime($uptime) + { + $this->_uptime = $uptime; + } + + /** + * Returns $_users. + * + * @see System::$_users + * + * @return Integer + */ + public function getUsers() + { + return $this->_users; + } + + /** + * Sets $_users. + * + * @param Integer $users user count + * + * @see System::$_users + * + * @return Void + */ + public function setUsers($users) + { + $this->_users = $users; + } + + /** + * Returns $_cpus. + * + * @see System::$_cpus + * + * @return Array + */ + public function getCpus() + { + return $this->_cpus; + } + + /** + * Sets $_cpus. + * + * @param Cpu $cpus cpu device + * + * @see System::$_cpus + * @see CpuDevice + * + * @return Void + */ + public function setCpus($cpus) + { + array_push($this->_cpus, $cpus); + } + + /** + * Returns $_netDevices. + * + * @see System::$_netDevices + * + * @return Array + */ + public function getNetDevices() + { + return $this->_netDevices; + } + + /** + * Sets $_netDevices. + * + * @param NetDevice $netDevices network device + * + * @see System::$_netDevices + * @see NetDevice + * + * @return Void + */ + public function setNetDevices($netDevices) + { + array_push($this->_netDevices, $netDevices); + } + + /** + * Returns $_pciDevices. + * + * @see System::$_pciDevices + * + * @return Array + */ + public function getPciDevices() + { + return $this->_pciDevices; + } + + /** + * Sets $_pciDevices. + * + * @param HWDevice $pciDevices pci device + * + * @see System::$_pciDevices + * @see HWDevice + * + * @return Void + */ + public function setPciDevices($pciDevices) + { + array_push($this->_pciDevices, $pciDevices); + } + + /** + * Returns $_ideDevices. + * + * @see System::$_ideDevices + * + * @return Array + */ + public function getIdeDevices() + { + return $this->_ideDevices; + } + + /** + * Sets $_ideDevices. + * + * @param HWDevice $ideDevices ide device + * + * @see System::$_ideDevices + * @see HWDevice + * + * @return Void + */ + public function setIdeDevices($ideDevices) + { + array_push($this->_ideDevices, $ideDevices); + } + + /** + * Returns $_scsiDevices. + * + * @see System::$_scsiDevices + * + * @return Array + */ + public function getScsiDevices() + { + return $this->_scsiDevices; + } + + /** + * Sets $_scsiDevices. + * + * @param HWDevice $scsiDevices scsi devices + * + * @see System::$_scsiDevices + * @see HWDevice + * + * @return Void + */ + public function setScsiDevices($scsiDevices) + { + array_push($this->_scsiDevices, $scsiDevices); + } + + /** + * Returns $_usbDevices. + * + * @see System::$_usbDevices + * + * @return Array + */ + public function getUsbDevices() + { + return $this->_usbDevices; + } + + /** + * Sets $_usbDevices. + * + * @param HWDevice $usbDevices usb device + * + * @see System::$_usbDevices + * @see HWDevice + * + * @return Void + */ + public function setUsbDevices($usbDevices) + { + array_push($this->_usbDevices, $usbDevices); + } + + /** + * Returns $_tbDevices. + * + * @see System::$_tbDevices + * + * @return Array + */ + public function getTbDevices() + { + return $this->_tbDevices; + } + + /** + * Sets $_tbDevices. + * + * @param HWDevice $tbDevices thunderbolt device + * + * @see System::$_tbDevices + * @see HWDevice + * + * @return Void + */ + public function setTbDevices($tbDevices) + { + array_push($this->_tbDevices, $tbDevices); + } + + /** + * Returns $_i2cDevices. + * + * @see System::$_i2cDevices + * + * @return Array + */ + public function getI2cDevices() + { + return $this->_i2cDevices; + } + + /** + * Sets $_i2cDevices. + * + * @param HWDevice $i2cDevices I2C device + * + * @see System::$_i2cDevices + * @see HWDevice + * + * @return Void + */ + public function setI2cDevices($i2cDevices) + { + array_push($this->_i2cDevices, $i2cDevices); + } + + /** + * Returns $_diskDevices. + * + * @see System::$_diskDevices + * + * @return Array + */ + public function getDiskDevices() + { + return $this->_diskDevices; + } + + /** + * Sets $_diskDevices. + * + * @param DiskDevice $diskDevices disk device + * + * @see System::$_diskDevices + * @see DiskDevice + * + * @return void + */ + public function setDiskDevices($diskDevices) + { + array_push($this->_diskDevices, $diskDevices); + } + + /** + * Returns $_memApplication. + * + * @see System::$_memApplication + * + * @return Integer + */ + public function getMemApplication() + { + return $this->_memApplication; + } + + /** + * Sets $_memApplication. + * + * @param Integer $memApplication application memory + * + * @see System::$_memApplication + * + * @return Void + */ + public function setMemApplication($memApplication) + { + $this->_memApplication = $memApplication; + } + + /** + * Returns $_memBuffer. + * + * @see System::$_memBuffer + * + * @return Integer + */ + public function getMemBuffer() + { + return $this->_memBuffer; + } + + /** + * Sets $_memBuffer. + * + * @param Integer $memBuffer buffer memory + * + * @see System::$_memBuffer + * + * @return Void + */ + public function setMemBuffer($memBuffer) + { + $this->_memBuffer = $memBuffer; + } + + /** + * Returns $_memCache. + * + * @see System::$_memCache + * + * @return Integer + */ + public function getMemCache() + { + return $this->_memCache; + } + + /** + * Sets $_memCache. + * + * @param Integer $memCache cache memory + * + * @see System::$_memCache + * + * @return Void + */ + public function setMemCache($memCache) + { + $this->_memCache = $memCache; + } + + /** + * Returns $_memFree. + * + * @see System::$_memFree + * + * @return Integer + */ + public function getMemFree() + { + return $this->_memFree; + } + + /** + * Sets $_memFree. + * + * @param Integer $memFree free memory + * + * @see System::$_memFree + * + * @return Void + */ + public function setMemFree($memFree) + { + $this->_memFree = $memFree; + } + + /** + * Returns $_memTotal. + * + * @see System::$_memTotal + * + * @return Integer + */ + public function getMemTotal() + { + return $this->_memTotal; + } + + /** + * Sets $_memTotal. + * + * @param Integer $memTotal total memory + * + * @see System::$_memTotal + * + * @return Void + */ + public function setMemTotal($memTotal) + { + $this->_memTotal = $memTotal; + } + + /** + * Returns $_memUsed. + * + * @see System::$_memUsed + * + * @return Integer + */ + public function getMemUsed() + { + return $this->_memUsed; + } + + /** + * Sets $_memUsed. + * + * @param Integer $memUsed used memory + * + * @see System::$_memUsed + * + * @return Void + */ + public function setMemUsed($memUsed) + { + $this->_memUsed = $memUsed; + } + + /** + * Returns $_swapDevices. + * + * @see System::$_swapDevices + * + * @return Array + */ + public function getSwapDevices() + { + return $this->_swapDevices; + } + + /** + * Sets $_swapDevices. + * + * @param DiskDevice $swapDevices swap devices + * + * @see System::$_swapDevices + * @see DiskDevice + * + * @return Void + */ + public function setSwapDevices($swapDevices) + { + array_push($this->_swapDevices, $swapDevices); + } + + /** + * Returns $_processes. + * + * @see System::$_processes + * + * @return Array + */ + public function getProcesses() + { + return $this->_processes; + } + + /** + * Sets $_proceses. + * + * @param $processes array of types of processes + * + * @see System::$_processes + * + * @return Void + */ + public function setProcesses($processes) + { + $this->_processes = $processes; +/* + foreach ($processes as $proc_type=>$proc_count) { + $this->_processes[$proc_type] = $proc_count; + } +*/ + } +} diff --git a/sources/includes/to/class.UPSInfo.inc.php b/sources/includes/to/class.UPSInfo.inc.php new file mode 100644 index 0000000..26b81cf --- /dev/null +++ b/sources/includes/to/class.UPSInfo.inc.php @@ -0,0 +1,62 @@ + + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version SVN: $Id: class.UPSInfo.inc.php 329 2009-09-07 11:21:44Z bigmichi1 $ + * @link http://phpsysinfo.sourceforge.net + */ + /** + * MBInfo TO class + * + * @category PHP + * @package PSI_TO + * @author Michael Cramer + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version Release: 3.0 + * @link http://phpsysinfo.sourceforge.net + */ +class UPSInfo +{ + /** + * array with upsdivices + * + * @see UPSDevice + * + * @var Array + */ + private $_upsDevices = array(); + + /** + * Returns $_upsDevices. + * + * @see UPSInfo::$_upsDevices + * + * @return Array + */ + public function getUpsDevices() + { + return $this->_upsDevices; + } + + /** + * Sets $_upsDevices. + * + * @param UPSDevice $upsDevices upsdevice + * + * @see UPSInfo::$_upsDevices + * + * @return Void + */ + public function setUpsDevices($upsDevices) + { + array_push($this->_upsDevices, $upsDevices); + } +} diff --git a/sources/includes/to/device/class.CpuDevice.inc.php b/sources/includes/to/device/class.CpuDevice.inc.php new file mode 100644 index 0000000..e690ef2 --- /dev/null +++ b/sources/includes/to/device/class.CpuDevice.inc.php @@ -0,0 +1,357 @@ + + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version SVN: $Id: class.CpuDevice.inc.php 411 2010-12-28 22:32:52Z Jacky672 $ + * @link http://phpsysinfo.sourceforge.net + */ + /** + * CpuDevice TO class + * + * @category PHP + * @package PSI_TO + * @author Michael Cramer + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version Release: 3.0 + * @link http://phpsysinfo.sourceforge.net + */ +class CpuDevice +{ + /** + * model of the cpu + * + * @var String + */ + private $_model = ""; + + /** + * speed of the cpu in hertz + * + * @var Integer + */ + private $_cpuSpeed = 0; + + /** + * max speed of the cpu in hertz + * + * @var Integer + */ + private $_cpuSpeedMax = 0; + + /** + * min speed of the cpu in hertz + * + * @var Integer + */ + private $_cpuSpeedMin = 0; + + /** + * cache size in bytes, if available + * + * @var Integer + */ + private $_cache = null; + + /** + * virtualization, if available + * + * @var String + */ + private $_virt = null; + + /** + * busspeed in hertz, if available + * + * @var Integer + */ + private $_busSpeed = null; + + /** + * temperature of the cpu, if available + * + * @var Integer + */ + private $_temp = null; + + /** + * bogomips of the cpu, if available + * + * @var Integer + */ + private $_bogomips = null; + + /** + * current load in percent of the cpu, if available + * + * @var Integer + */ + private $_load = null; + + /** + * Returns $_bogomips. + * + * @see Cpu::$_bogomips + * + * @return Integer + */ + public function getBogomips() + { + return $this->_bogomips; + } + + /** + * Sets $_bogomips. + * + * @param Integer $bogomips bogompis + * + * @see Cpu::$_bogomips + * + * @return Void + */ + public function setBogomips($bogomips) + { + $this->_bogomips = $bogomips; + } + + /** + * Returns $_busSpeed. + * + * @see Cpu::$_busSpeed + * + * @return Integer + */ + public function getBusSpeed() + { + return $this->_busSpeed; + } + + /** + * Sets $_busSpeed. + * + * @param Integer $busSpeed busspeed + * + * @see Cpu::$_busSpeed + * + * @return Void + */ + public function setBusSpeed($busSpeed) + { + $this->_busSpeed = $busSpeed; + } + + /** + * Returns $_cache. + * + * @see Cpu::$_cache + * + * @return Integer + */ + public function getCache() + { + return $this->_cache; + } + + /** + * Sets $_cache. + * + * @param Integer $cache cache size + * + * @see Cpu::$_cache + * + * @return Void + */ + public function setCache($cache) + { + $this->_cache = $cache; + } + + /** + * Returns $_virt. + * + * @see Cpu::$_virt + * + * @return String + */ + public function getVirt() + { + return $this->_virt; + } + + /** + * Sets $_virt. + * + * @param String $_virt + * + * @see Cpu::$_virt + * + * @return Void + */ + public function setVirt($virt) + { + $this->_virt = $virt; + } + + /** + * Returns $_cpuSpeed. + * + * @see Cpu::$_cpuSpeed + * + * @return Integer + */ + public function getCpuSpeed() + { + return $this->_cpuSpeed; + } + + /** + * Returns $_cpuSpeedMax. + * + * @see Cpu::$_cpuSpeedMAx + * + * @return Integer + */ + public function getCpuSpeedMax() + { + return $this->_cpuSpeedMax; + } + + /** + * Returns $_cpuSpeedMin. + * + * @see Cpu::$_cpuSpeedMin + * + * @return Integer + */ + public function getCpuSpeedMin() + { + return $this->_cpuSpeedMin; + } + + /** + * Sets $_cpuSpeed. + * + * @param Integer $cpuSpeed cpuspeed + * + * @see Cpu::$_cpuSpeed + * + * @return Void + */ + public function setCpuSpeed($cpuSpeed) + { + $this->_cpuSpeed = $cpuSpeed; + } + + /** + * Sets $_cpuSpeedMax. + * + * @param Integer $cpuSpeedMax cpuspeedmax + * + * @see Cpu::$_cpuSpeedMax + * + * @return Void + */ + public function setCpuSpeedMax($cpuSpeedMax) + { + $this->_cpuSpeedMax = $cpuSpeedMax; + } + + /** + * Sets $_cpuSpeedMin. + * + * @param Integer $cpuSpeedMin cpuspeedmin + * + * @see Cpu::$_cpuSpeedMin + * + * @return Void + */ + public function setCpuSpeedMin($cpuSpeedMin) + { + $this->_cpuSpeedMin = $cpuSpeedMin; + } + + /** + * Returns $_model. + * + * @see Cpu::$_model + * + * @return String + */ + public function getModel() + { + return $this->_model; + } + + /** + * Sets $_model. + * + * @param String $model cpumodel + * + * @see Cpu::$_model + * + * @return Void + */ + public function setModel($model) + { + $this->_model = $model; + } + + /** + * Returns $_temp. + * + * @see Cpu::$_temp + * + * @return Integer + */ + public function getTemp() + { + return $this->_temp; + } + + /** + * Sets $_temp. + * + * @param Integer $temp temperature + * + * @see Cpu::$_temp + * + * @return Void + */ + public function setTemp($temp) + { + $this->_temp = $temp; + } + + /** + * Returns $_load. + * + * @see CpuDevice::$_load + * + * @return Integer + */ + public function getLoad() + { + return $this->_load; + } + + /** + * Sets $_load. + * + * @param Integer $load load percent + * + * @see CpuDevice::$_load + * + * @return Void + */ + public function setLoad($load) + { + $this->_load = $load; + } +} diff --git a/sources/includes/to/device/class.DiskDevice.inc.php b/sources/includes/to/device/class.DiskDevice.inc.php new file mode 100644 index 0000000..32e5b73 --- /dev/null +++ b/sources/includes/to/device/class.DiskDevice.inc.php @@ -0,0 +1,308 @@ + + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version SVN: $Id: class.DiskDevice.inc.php 252 2009-06-17 13:06:44Z bigmichi1 $ + * @link http://phpsysinfo.sourceforge.net + */ + /** + * DiskDevice TO class + * + * @category PHP + * @package PSI_TO + * @author Michael Cramer + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version Release: 3.0 + * @link http://phpsysinfo.sourceforge.net + */ +class DiskDevice +{ + /** + * name of the disk device + * + * @var String + */ + private $_name = ""; + + /** + * type of the filesystem on the disk device + * + * @var String + */ + private $_fsType = ""; + + /** + * diskspace that is free in bytes + * + * @var Integer + */ + private $_free = 0; + + /** + * diskspace that is used in bytes + * + * @var Integer + */ + private $_used = 0; + + /** + * total diskspace + * + * @var Integer + */ + private $_total = 0; + + /** + * mount point of the disk device if available + * + * @var String + */ + private $_mountPoint = null; + + /** + * additional options of the device, like mount options + * + * @var String + */ + private $_options = null; + + /** + * inodes usage in percent if available + * + * @var + */ + private $_percentInodesUsed = null; + + /** + * Returns PercentUsed calculated when function is called from internal values + * + * @see DiskDevice::$_total + * @see DiskDevice::$_used + * + * @return Integer + */ + public function getPercentUsed() + { + if ($this->_total > 0) { + return round($this->_used / $this->_total * 100); + } else { + return 0; + } + } + + /** + * Returns $_PercentInodesUsed. + * + * @see DiskDevice::$_PercentInodesUsed + * + * @return Integer + */ + public function getPercentInodesUsed() + { + return $this->_percentInodesUsed; + } + + /** + * Sets $_PercentInodesUsed. + * + * @param Integer $percentInodesUsed inodes percent + * + * @see DiskDevice::$_PercentInodesUsed + * + * @return Void + */ + public function setPercentInodesUsed($percentInodesUsed) + { + $this->_percentInodesUsed = $percentInodesUsed; + } + + /** + * Returns $_free. + * + * @see DiskDevice::$_free + * + * @return Integer + */ + public function getFree() + { + return $this->_free; + } + + /** + * Sets $_free. + * + * @param Integer $free free bytes + * + * @see DiskDevice::$_free + * + * @return Void + */ + public function setFree($free) + { + $this->_free = $free; + } + + /** + * Returns $_fsType. + * + * @see DiskDevice::$_fsType + * + * @return String + */ + public function getFsType() + { + return $this->_fsType; + } + + /** + * Sets $_fsType. + * + * @param String $fsType filesystemtype + * + * @see DiskDevice::$_fsType + * + * @return Void + */ + public function setFsType($fsType) + { + $this->_fsType = $fsType; + } + + /** + * Returns $_mountPoint. + * + * @see DiskDevice::$_mountPoint + * + * @return String + */ + public function getMountPoint() + { + return $this->_mountPoint; + } + + /** + * Sets $_mountPoint. + * + * @param String $mountPoint mountpoint + * + * @see DiskDevice::$_mountPoint + * + * @return Void + */ + public function setMountPoint($mountPoint) + { + $this->_mountPoint = $mountPoint; + } + + /** + * Returns $_name. + * + * @see DiskDevice::$_name + * + * @return String + */ + public function getName() + { + return $this->_name; + } + + /** + * Sets $_name. + * + * @param String $name device name + * + * @see DiskDevice::$_name + * + * @return Void + */ + public function setName($name) + { + $this->_name = $name; + } + + /** + * Returns $_options. + * + * @see DiskDevice::$_options + * + * @return String + */ + public function getOptions() + { + return $this->_options; + } + + /** + * Sets $_options. + * + * @param String $options additional options + * + * @see DiskDevice::$_options + * + * @return Void + */ + public function setOptions($options) + { + $this->_options = $options; + } + + /** + * Returns $_total. + * + * @see DiskDevice::$_total + * + * @return Integer + */ + public function getTotal() + { + return $this->_total; + } + + /** + * Sets $_total. + * + * @param Integer $total total bytes + * + * @see DiskDevice::$_total + * + * @return Void + */ + public function setTotal($total) + { + $this->_total = $total; + } + + /** + * Returns $_used. + * + * @see DiskDevice::$_used + * + * @return Integer + */ + public function getUsed() + { + return $this->_used; + } + + /** + * Sets $_used. + * + * @param Integer $used used bytes + * + * @see DiskDevice::$_used + * + * @return Void + */ + public function setUsed($used) + { + $this->_used = $used; + } +} diff --git a/sources/includes/to/device/class.HWDevice.inc.php b/sources/includes/to/device/class.HWDevice.inc.php new file mode 100644 index 0000000..3a2b0f1 --- /dev/null +++ b/sources/includes/to/device/class.HWDevice.inc.php @@ -0,0 +1,142 @@ + + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version SVN: $Id: class.HWDevice.inc.php 255 2009-06-17 13:39:41Z bigmichi1 $ + * @link http://phpsysinfo.sourceforge.net + */ + /** + * HWDevice TO class + * + * @category PHP + * @package PSI_TO + * @author Michael Cramer + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version Release: 3.0 + * @link http://phpsysinfo.sourceforge.net + */ +class HWDevice +{ + /** + * name of the device + * + * @var String + */ + private $_name = ""; + + /** + * capacity of the device, if not available it will be null + * + * @var Integer + */ + private $_capacity = null; + + /** + * count of the device + * + * @var Integer + */ + private $_count = 1; + + /** + * compare a given device with the internal one + * + * @param HWDevice $dev device that should be compared + * + * @return boolean + */ + public function equals(HWDevice $dev) + { + if ($dev->getName() === $this->_name && $dev->getCapacity() === $this->_capacity) { + return true; + } else { + return false; + } + } + + /** + * Returns $_capacity. + * + * @see HWDevice::$_capacity + * + * @return Integer + */ + public function getCapacity() + { + return $this->_capacity; + } + + /** + * Sets $_capacity. + * + * @param Integer $capacity device capacity + * + * @see HWDevice::$_capacity + * + * @return Void + */ + public function setCapacity($capacity) + { + $this->_capacity = $capacity; + } + + /** + * Returns $_name. + * + * @see HWDevice::$_name + * + * @return String + */ + public function getName() + { + return $this->_name; + } + + /** + * Sets $_name. + * + * @param String $name device name + * + * @see HWDevice::$_name + * + * @return Void + */ + public function setName($name) + { + $this->_name = $name; + } + + /** + * Returns $_count. + * + * @see HWDevice::$_count + * + * @return Integer + */ + public function getCount() + { + return $this->_count; + } + + /** + * Sets $_count. + * + * @param Integer $count device count + * + * @see HWDevice::$_count + * + * @return Void + */ + public function setCount($count) + { + $this->_count = $count; + } +} diff --git a/sources/includes/to/device/class.NetDevice.inc.php b/sources/includes/to/device/class.NetDevice.inc.php new file mode 100644 index 0000000..6f8d3b9 --- /dev/null +++ b/sources/includes/to/device/class.NetDevice.inc.php @@ -0,0 +1,225 @@ + + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version SVN: $Id: class.NetDevice.inc.php 547 2012-03-22 09:44:38Z namiltd $ + * @link http://phpsysinfo.sourceforge.net + */ + /** + * NetDevice TO class + * + * @category PHP + * @package PSI_TO + * @author Michael Cramer + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version Release: 3.0 + * @link http://phpsysinfo.sourceforge.net + */ +class NetDevice +{ + /** + * name of the device + * + * @var String + */ + private $_name = ""; + + /** + * transmitted bytes + * + * @var Integer + */ + private $_txBytes = 0; + + /** + * received bytes + * + * @var Integer + */ + private $_rxBytes = 0; + + /** + * counted error packages + * + * @var Integer + */ + private $_errors = 0; + + /** + * counted droped packages + * + * @var Integer + */ + private $_drops = 0; + + /** + * string with info + * + * @var String + */ + private $_info = null; + + /** + * Returns $_drops. + * + * @see NetDevice::$_drops + * + * @return Integer + */ + public function getDrops() + { + return $this->_drops; + } + + /** + * Sets $_drops. + * + * @param Integer $drops dropped packages + * + * @see NetDevice::$_drops + * + * @return Void + */ + public function setDrops($drops) + { + $this->_drops = $drops; + } + + /** + * Returns $_errors. + * + * @see NetDevice::$_errors + * + * @return Integer + */ + public function getErrors() + { + return $this->_errors; + } + + /** + * Sets $_errors. + * + * @param Integer $errors error packages + * + * @see NetDevice::$_errors + * + * @return Void + */ + public function setErrors($errors) + { + $this->_errors = $errors; + } + + /** + * Returns $_name. + * + * @see NetDevice::$_name + * + * @return String + */ + public function getName() + { + return $this->_name; + } + + /** + * Sets $_name. + * + * @param String $name device name + * + * @see NetDevice::$_name + * + * @return Void + */ + public function setName($name) + { + $this->_name = $name; + } + + /** + * Returns $_rxBytes. + * + * @see NetDevice::$_rxBytes + * + * @return Integer + */ + public function getRxBytes() + { + return $this->_rxBytes; + } + + /** + * Sets $_rxBytes. + * + * @param Integer $rxBytes received bytes + * + * @see NetDevice::$_rxBytes + * + * @return Void + */ + public function setRxBytes($rxBytes) + { + $this->_rxBytes = $rxBytes; + } + + /** + * Returns $_txBytes. + * + * @see NetDevice::$_txBytes + * + * @return Integer + */ + public function getTxBytes() + { + return $this->_txBytes; + } + + /** + * Sets $_txBytes. + * + * @param Integer $txBytes transmitted bytes + * + * @see NetDevice::$_txBytes + * + * @return Void + */ + public function setTxBytes($txBytes) + { + $this->_txBytes = $txBytes; + } + + /** + * Returns $_info. + * + * @see NetDevice::$_info + * + * @return String + */ + public function getInfo() + { + return $this->_info; + } + + /** + * Sets $_info. + * + * @param String $info info string + * + * @see NetDevice::$_info + * + * @return Void + */ + public function setInfo($info) + { + $this->_info = $info; + } +} diff --git a/sources/includes/to/device/class.SensorDevice.inc.php b/sources/includes/to/device/class.SensorDevice.inc.php new file mode 100644 index 0000000..65c2f6c --- /dev/null +++ b/sources/includes/to/device/class.SensorDevice.inc.php @@ -0,0 +1,192 @@ + + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version SVN: $Id: class.SensorDevice.inc.php 592 2012-07-03 10:55:51Z namiltd $ + * @link http://phpsysinfo.sourceforge.net + */ + /** + * SensorDevice TO class + * + * @category PHP + * @package PSI_TO + * @author Michael Cramer + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version Release: 3.0 + * @link http://phpsysinfo.sourceforge.net + */ +class SensorDevice +{ + /** + * name of the sensor + * + * @var String + */ + private $_name = ""; + + /** + * current value of the sensor + * + * @var Integer + */ + private $_value = 0; + + /** + * maximum value of the sensor + * + * @var Integer + */ + private $_max = null; + + /** + * minimum value of the sensor + * + * @var Integer + */ + private $_min = null; + + /** + * event of the sensor + * + * @var String + */ + private $_event = ""; + + /** + * Returns $_max. + * + * @see Sensor::$_max + * + * @return Integer + */ + public function getMax() + { + return $this->_max; + } + + /** + * Sets $_max. + * + * @param Integer $max maximum value + * + * @see Sensor::$_max + * + * @return Void + */ + public function setMax($max) + { + $this->_max = $max; + } + + /** + * Returns $_min. + * + * @see Sensor::$_min + * + * @return Integer + */ + public function getMin() + { + return $this->_min; + } + + /** + * Sets $_min. + * + * @param Integer $min minimum value + * + * @see Sensor::$_min + * + * @return Void + */ + public function setMin($min) + { + $this->_min = $min; + } + + /** + * Returns $_name. + * + * @see Sensor::$_name + * + * @return String + */ + public function getName() + { + return $this->_name; + } + + /** + * Sets $_name. + * + * @param String $name sensor name + * + * @see Sensor::$_name + * + * @return Void + */ + public function setName($name) + { + $this->_name = $name; + } + + /** + * Returns $_value. + * + * @see Sensor::$_value + * + * @return Integer + */ + public function getValue() + { + return $this->_value; + } + + /** + * Sets $_value. + * + * @param Integer $value current value + * + * @see Sensor::$_value + * + * @return Void + */ + public function setValue($value) + { + $this->_value = $value; + } + + /** + * Returns $_event. + * + * @see Sensor::$_event + * + * @return String + */ + public function getEvent() + { + return $this->_event; + } + + /** + * Sets $_event. + * + * @param String $event sensor event + * + * @see Sensor::$_event + * + * @return Void + */ + public function setEvent($event) + { + $this->_event = $event; + } +} diff --git a/sources/includes/to/device/class.UPSDevice.inc.php b/sources/includes/to/device/class.UPSDevice.inc.php new file mode 100644 index 0000000..f72e30a --- /dev/null +++ b/sources/includes/to/device/class.UPSDevice.inc.php @@ -0,0 +1,555 @@ + + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version SVN: $Id: class.UPSDevice.inc.php 262 2009-06-22 10:48:33Z bigmichi1 $ + * @link http://phpsysinfo.sourceforge.net + */ + /** + * UPSDevice TO class + * + * @category PHP + * @package PSI_TO + * @author Michael Cramer + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version Release: 3.0 + * @link http://phpsysinfo.sourceforge.net + */ +class UPSDevice +{ + /** + * name of the ups + * + * @var String + */ + private $_name = ""; + + /** + * model of the ups + * + * @var String + */ + private $_model = ""; + + /** + * mode of the ups + * + * @var String + */ + private $_mode = ""; + + /** + * last start time + * + * @var String + */ + private $_startTime = ""; + + /** + * status of the ups + * + * @var String + */ + private $_status = ""; + + /** + * temperature of the ups + * + * @var Integer + */ + private $_temperatur = null; + + /** + * outages count + * + * @var Integer + */ + private $_outages = null; + + /** + * date of last outtage + * + * @var String + */ + private $_lastOutage = null; + + /** + * date of last outage finish + * + * @var String + */ + private $_lastOutageFinish = null; + + /** + * line volt + * + * @var Integer + */ + private $_lineVoltage = null; + + /** + * line freq + * + * @var Integer + */ + private $_lineFrequency = null; + + /** + * current load of the ups in percent + * + * @var Integer + */ + private $_load = null; + + /** + * battery installation date + * + * @var String + */ + private $_batteryDate = null; + + /** + * current battery volt + * + * @var Integer + */ + private $_batteryVoltage = null; + + /** + * current charge in percent of the battery + * + * @var Integer + */ + private $_batterCharge = null; + + /** + * time left + * + * @var String + */ + private $_timeLeft = null; + + /** + * Returns $_batterCharge. + * + * @see UPSDevice::$_batterCharge + * + * @return integer + */ + public function getBatterCharge() + { + return $this->_batterCharge; + } + + /** + * Sets $_batterCharge. + * + * @param Integer $batterCharge battery charge + * + * @see UPSDevice::$_batterCharge + * + * @return void + */ + public function setBatterCharge($batterCharge) + { + $this->_batterCharge = $batterCharge; + } + + /** + * Returns $_batteryDate. + * + * @see UPSDevice::$_batteryDate + * + * @return String + */ + public function getBatteryDate() + { + return $this->_batteryDate; + } + + /** + * Sets $_batteryDate. + * + * @param object $batteryDate battery date + * + * @see UPSDevice::$_batteryDate + * + * @return Void + */ + public function setBatteryDate($batteryDate) + { + $this->_batteryDate = $batteryDate; + } + + /** + * Returns $_batteryVoltage. + * + * @see UPSDevice::$_batteryVoltage + * + * @return Integer + */ + public function getBatteryVoltage() + { + return $this->_batteryVoltage; + } + + /** + * Sets $_batteryVoltage. + * + * @param object $batteryVoltage battery volt + * + * @see UPSDevice::$_batteryVoltage + * + * @return Void + */ + public function setBatteryVoltage($batteryVoltage) + { + $this->_batteryVoltage = $batteryVoltage; + } + + /** + * Returns $_lastOutage. + * + * @see UPSDevice::$_lastOutage + * + * @return String + */ + public function getLastOutage() + { + return $this->_lastOutage; + } + + /** + * Sets $_lastOutage. + * + * @param String $lastOutage last Outage + * + * @see UPSDevice::$lastOutage + * + * @return Void + */ + public function setLastOutage($lastOutage) + { + $this->_lastOutage = $lastOutage; + } + + /** + * Returns $_lastOutageFinish. + * + * @see UPSDevice::$_lastOutageFinish + * + * @return String + */ + public function getLastOutageFinish() + { + return $this->_lastOutageFinish; + } + + /** + * Sets $_lastOutageFinish. + * + * @param String $lastOutageFinish last outage finish + * + * @see UPSDevice::$_lastOutageFinish + * + * @return Void + */ + public function setLastOutageFinish($lastOutageFinish) + { + $this->_lastOutageFinish = $lastOutageFinish; + } + + /** + * Returns $_lineVoltage. + * + * @see UPSDevice::$_lineVoltage + * + * @return Integer + */ + public function getLineVoltage() + { + return $this->_lineVoltage; + } + + /** + * Sets $_lineVoltage. + * + * @param Integer $lineVoltage line voltage + * + * @see UPSDevice::$_lineVoltage + * + * @return Void + */ + public function setLineVoltage($lineVoltage) + { + $this->_lineVoltage = $lineVoltage; + } + + /** + * Returns $_lineFrequency. + * + * @see UPSDevice::$_lineFrequency + * + * @return Integer + */ + public function getLineFrequency() + { + return $this->_lineFrequency; + } + + /** + * Sets $_lineFrequency. + * + * @param Integer $lineFrequency line frequency + * + * @see UPSDevice::$_lineFrequency + * + * @return Void + */ + public function setLineFrequency($lineFrequency) + { + $this->_lineFrequency = $lineFrequency; + } + + /** + * Returns $_load. + * + * @see UPSDevice::$_load + * + * @return Integer + */ + public function getLoad() + { + return $this->_load; + } + + /** + * Sets $_load. + * + * @param Integer $load current load + * + * @see UPSDevice::$_load + * + * @return Void + */ + public function setLoad($load) + { + $this->_load = $load; + } + + /** + * Returns $_mode. + * + * @see UPSDevice::$_mode + * + * @return String + */ + public function getMode() + { + return $this->_mode; + } + + /** + * Sets $_mode. + * + * @param String $mode mode + * + * @see UPSDevice::$_mode + * + * @return Void + */ + public function setMode($mode) + { + $this->_mode = $mode; + } + + /** + * Returns $_model. + * + * @see UPSDevice::$_model + * + * @return String + */ + public function getModel() + { + return $this->_model; + } + + /** + * Sets $_model. + * + * @param String $model model + * + * @see UPSDevice::$_model + * + * @return Void + */ + public function setModel($model) + { + $this->_model = $model; + } + + /** + * Returns $_name. + * + * @see UPSDevice::$_name + * + * @return String + */ + public function getName() + { + return $this->_name; + } + + /** + * Sets $_name. + * + * @param String $name name + * + * @see UPSDevice::$_name + * + * @return Void + */ + public function setName($name) + { + $this->_name = $name; + } + + /** + * Returns $_outages. + * + * @see UPSDevice::$_outages + * + * @return Integer + */ + public function getOutages() + { + return $this->_outages; + } + + /** + * Sets $_outages. + * + * @param Integer $outages outages count + * + * @see UPSDevice::$_outages + * + * @return Void + */ + public function setOutages($outages) + { + $this->_outages = $outages; + } + + /** + * Returns $_startTime. + * + * @see UPSDevice::$_startTime + * + * @return String + */ + public function getStartTime() + { + return $this->_startTime; + } + + /** + * Sets $_startTime. + * + * @param String $startTime startTime + * + * @see UPSDevice::$_startTime + * + * @return Void + */ + public function setStartTime($startTime) + { + $this->_startTime = $startTime; + } + + /** + * Returns $_status. + * + * @see UPSDevice::$_status + * + * @return String + */ + public function getStatus() + { + return $this->_status; + } + + /** + * Sets $_status. + * + * @param String $status status + * + * @see UPSDevice::$_status + * + * @return Void + */ + public function setStatus($status) + { + $this->_status = $status; + } + + /** + * Returns $_temperatur. + * + * @see UPSDevice::$_temperatur + * + * @return Integer + */ + public function getTemperatur() + { + return $this->_temperatur; + } + + /** + * Sets $_temperatur. + * + * @param Integer $temperatur temperature + * + * @see UPSDevice::$_temperatur + * + * @return Void + */ + public function setTemperatur($temperatur) + { + $this->_temperatur = $temperatur; + } + + /** + * Returns $_timeLeft. + * + * @see UPSDevice::$_timeLeft + * + * @return String + */ + public function getTimeLeft() + { + return $this->_timeLeft; + } + + /** + * Sets $_timeLeft. + * + * @param String $timeLeft time left + * + * @see UPSDevice::$_timeLeft + * + * @return Void + */ + public function setTimeLeft($timeLeft) + { + $this->_timeLeft = $timeLeft; + } +} diff --git a/sources/includes/ups/class.apcupsd.inc.php b/sources/includes/ups/class.apcupsd.inc.php new file mode 100644 index 0000000..0a0744a --- /dev/null +++ b/sources/includes/ups/class.apcupsd.inc.php @@ -0,0 +1,145 @@ + + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version SVN: $Id: class.apcupsd.inc.php 661 2012-08-27 11:26:39Z namiltd $ + * @link http://phpsysinfo.sourceforge.net + */ + /** + * getting ups information from apcupsd program + * + * @category PHP + * @package PSI_UPS + * @author Michael Cramer + * @author Artem Volk + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version Release: 3.0 + * @link http://phpsysinfo.sourceforge.net + */ +class Apcupsd extends UPS +{ + /** + * internal storage for all gathered data + * + * @var Array + */ + private $_output = array(); + + /** + * get all information from all configured ups in phpsysinfo.ini and store output in internal array + */ + public function __construct() + { + parent::__construct(); + if (defined('PSI_UPS_APCUPSD_LIST') && is_string(PSI_UPS_APCUPSD_LIST)) { + if (preg_match(ARRAY_EXP, PSI_UPS_APCUPSD_LIST)) { + $upses = eval(PSI_UPS_APCUPSD_LIST); + } else { + $upses = array(PSI_UPS_APCUPSD_LIST); + } + foreach ($upses as $ups) { + CommonFunctions::executeProgram('apcaccess', 'status '.trim($ups), $temp); + if (! empty($temp)) { + $this->_output[] = $temp; + } + } + } else { //use default if address and port not defined + CommonFunctions::executeProgram('apcaccess', 'status', $temp); + if (! empty($temp)) { + $this->_output[] = $temp; + } + } + } + + /** + * parse the input and store data in resultset for xml generation + * + * @return Void + */ + private function _info() + { + foreach ($this->_output as $ups) { + + $dev = new UPSDevice(); + + // General info + if (preg_match('/^UPSNAME\s*:\s*(.*)$/m', $ups, $data)) { + $dev->setName(trim($data[1])); + } + if (preg_match('/^MODEL\s*:\s*(.*)$/m', $ups, $data)) { + $model=trim($data[1]); + if (preg_match('/^APCMODEL\s*:\s*(.*)$/m', $ups, $data)) { + $dev->setModel($model.' ('.trim($data[1]).')'); + } else { + $dev->setModel($model); + } + } + if (preg_match('/^UPSMODE\s*:\s*(.*)$/m', $ups, $data)) { + $dev->setMode(trim($data[1])); + } + if (preg_match('/^STARTTIME\s*:\s*(.*)$/m', $ups, $data)) { + $dev->setStartTime(trim($data[1])); + } + if (preg_match('/^STATUS\s*:\s*(.*)$/m', $ups, $data)) { + $dev->setStatus(trim($data[1])); + } + if (preg_match('/^ITEMP\s*:\s*(.*)$/m', $ups, $data)) { + $dev->setTemperatur(trim($data[1])); + } + // Outages + if (preg_match('/^NUMXFERS\s*:\s*(.*)$/m', $ups, $data)) { + $dev->setOutages(trim($data[1])); + } + if (preg_match('/^LASTXFER\s*:\s*(.*)$/m', $ups, $data)) { + $dev->setLastOutage(trim($data[1])); + } + if (preg_match('/^XOFFBATT\s*:\s*(.*)$/m', $ups, $data)) { + $dev->setLastOutageFinish(trim($data[1])); + } + // Line + if (preg_match('/^LINEV\s*:\s*(\d*\.\d*)(.*)$/m', $ups, $data)) { + $dev->setLineVoltage(trim($data[1])); + } + if (preg_match('/^LINEFREQ\s*:\s*(\d*\.\d*)(.*)$/m', $ups, $data)) { + $dev->setLineFrequency(trim($data[1])); + } + if (preg_match('/^LOADPCT\s*:\s*(\d*\.\d*)(.*)$/m', $ups, $data)) { + $dev->setLoad(trim($data[1])); + } + // Battery + if (preg_match('/^BATTDATE\s*:\s*(.*)$/m', $ups, $data)) { + $dev->setBatteryDate(trim($data[1])); + } + if (preg_match('/^BATTV\s*:\s*(\d*\.\d*)(.*)$/m', $ups, $data)) { + $dev->setBatteryVoltage(trim($data[1])); + } + if (preg_match('/^BCHARGE\s*:\s*(\d*\.\d*)(.*)$/m', $ups, $data)) { + $dev->setBatterCharge(trim($data[1])); + } + if (preg_match('/^TIMELEFT\s*:\s*(\d*\.\d*)(.*)$/m', $ups, $data)) { + $dev->setTimeLeft(trim($data[1])); + } + $this->upsinfo->setUpsDevices($dev); + } + } + + /** + * get the information + * + * @see PSI_Interface_UPS::build() + * + * @return Void + */ + public function build() + { + $this->_info(); + } +} diff --git a/sources/includes/ups/class.nut.inc.php b/sources/includes/ups/class.nut.inc.php new file mode 100644 index 0000000..b9b86a9 --- /dev/null +++ b/sources/includes/ups/class.nut.inc.php @@ -0,0 +1,142 @@ + + * @author Anders Häggström + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version SVN: $Id: class.nut.inc.php 661 2012-08-27 11:26:39Z namiltd $ + * @link http://phpsysinfo.sourceforge.net + */ + /** + * getting ups information from upsc program + * + * @category PHP + * @package PSI_UPS + * @author Artem Volk + * @author Anders Häggström + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version Release: 3.0 + * @link http://phpsysinfo.sourceforge.net + */ +class Nut extends UPS +{ + /** + * internal storage for all gathered data + * + * @var array + */ + private $_output = array(); + + /** + * get all information from all configured ups and store output in internal array + */ + public function __construct() + { + parent::__construct(); + if (defined('PSI_UPS_NUT_LIST') && is_string(PSI_UPS_NUT_LIST)) { + if (preg_match(ARRAY_EXP, PSI_UPS_NUT_LIST)) { + $upses = eval(PSI_UPS_NUT_LIST); + } else { + $upses = array(PSI_UPS_NUT_LIST); + } + foreach ($upses as $ups) { + CommonFunctions::executeProgram('upsc', '-l '.trim($ups), $output); + $ups_names = preg_split("/\n/", $output, -1, PREG_SPLIT_NO_EMPTY); + foreach ($ups_names as $ups_name) { + CommonFunctions::executeProgram('upsc', trim($ups_name).'@'.trim($ups), $temp); + if (! empty($temp)) { + $this->_output[trim($ups_name).'@'.trim($ups)] = $temp; + } + } + } + } else { //use default if address and port not defined + CommonFunctions::executeProgram('upsc', '-l', $output); + $ups_names = preg_split("/\n/", $output, -1, PREG_SPLIT_NO_EMPTY); + foreach ($ups_names as $ups_name) { + CommonFunctions::executeProgram('upsc', trim($ups_name), $temp); + if (! empty($temp)) { + $this->_output[trim($ups_name)] = $temp; + } + } + } + } + + /** + * parse the input and store data in resultset for xml generation + * + * @return array + */ + private function _info() + { + if (! empty($this->_output)) { + foreach ($this->_output as $name=>$value) { + $temp = preg_split("/\n/", $value, -1, PREG_SPLIT_NO_EMPTY); + $ups_data = array(); + foreach ($temp as $value) { + $line = preg_split('/: /', $value, 2); + $ups_data[$line[0]] = isset($line[1]) ? trim($line[1]) : ''; + } + $dev = new UPSDevice(); + //General + $dev->setName($name); + if (isset($ups_data['ups.model'])) { + $dev->setModel($ups_data['ups.model']); + } + if (isset($ups_data['driver.name'])) { + $dev->setMode($ups_data['driver.name']); + } + if (isset($ups_data['ups.status'])) { + $dev->setStatus($ups_data['ups.status']); + } + + //Line + if (isset($ups_data['input.voltage'])) { + $dev->setLineVoltage($ups_data['input.voltage']); + } + if (isset($ups_data['input.frequency'])) { + $dev->setLineFrequency($ups_data['input.frequency']); + } + if (isset($ups_data['ups.load'])) { + $dev->setLoad($ups_data['ups.load']); + } + + //Battery + if (isset($ups_data['battery.voltage'])) { + $dev->setBatteryVoltage($ups_data['battery.voltage']); + } + if (isset($ups_data['battery.charge'])) { + $dev->setBatterCharge($ups_data['battery.charge']); + } + if (isset($ups_data['battery.runtime'])) { + $dev->setTimeLeft(round($ups_data['battery.runtime']/60, 2)); + } + + //Temperature + if (isset($ups_data['ups.temperature'])) { + $dev->setTemperatur($ups_data['ups.temperature']); + } + + $this->upsinfo->setUpsDevices($dev); + } + } + } + + /** + * get the information + * + * @see PSI_Interface_UPS::build() + * + * @return Void + */ + public function build() + { + $this->_info(); + } +} diff --git a/sources/includes/ups/class.pmset.inc.php b/sources/includes/ups/class.pmset.inc.php new file mode 100644 index 0000000..b334eb9 --- /dev/null +++ b/sources/includes/ups/class.pmset.inc.php @@ -0,0 +1,90 @@ + + * @copyright 2014 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version SVN: $Id: class.nut.inc.php 661 2012-08-27 11:26:39Z namiltd $ + * @link http://phpsysinfo.sourceforge.net + */ + /** + * getting ups information from pmset program + * + * @category PHP + * @package PSI_UPS + * @author Robert Pelletier + * @copyright 2014 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version Release: 3.0 + * @link http://phpsysinfo.sourceforge.net + */ +class Pmset extends UPS +{ + /** + * internal storage for all gathered data + * + * @var array + */ + private $_output = array(); + + /** + * get all information from all configured ups and store output in internal array + */ + public function __construct() + { + parent::__construct(); + CommonFunctions::executeProgram('pmset', '-g batt', $temp); + if (! empty($temp)) { + $this->_output[] = $temp; + } + } + + /** + * parse the input and store data in resultset for xml generation + * + * @return array + */ + private function _info() + { + $model = array(); + $percCharge = array(); + $lines = explode(PHP_EOL, implode($this->_output)); + $dev = new UPSDevice(); + $model = explode('FW:', $lines[1]); + if (strpos($model[0], 'InternalBattery') === false) { + $percCharge = explode(';', $lines[1]); + $dev->setName('UPS'); + if ($model !== false) { + $dev->setModel(substr(trim($model[0]), 1)); + } + if ($percCharge !== false) { + $dev->setBatterCharge(trim(substr($percCharge[0], -4, 3))); + $dev->setStatus(trim($percCharge[1])); + if (isset($percCharge[2])) { + $time = explode(':', $percCharge[2]); + $hours = $time[0]; + $minutes = $hours*60+substr($time[1], 0, 2); + $dev->setTimeLeft($minutes); + } + } + $this->upsinfo->setUpsDevices($dev); + } + } + + /** + * get the information + * + * @see PSI_Interface_UPS::build() + * + * @return Void + */ + public function build() + { + $this->_info(); + } +} diff --git a/sources/includes/ups/class.powersoftplus.inc.php b/sources/includes/ups/class.powersoftplus.inc.php new file mode 100644 index 0000000..b43ac34 --- /dev/null +++ b/sources/includes/ups/class.powersoftplus.inc.php @@ -0,0 +1,115 @@ + + * @copyright 2014 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version SVN: $Id: class.powersoftplus.inc.php 661 2014-06-13 11:26:39Z namiltd $ + * @link http://phpsysinfo.sourceforge.net +*/ +/** + * getting ups information from powersoftplus program + * + * @category PHP + * @package PSI_UPS + * @author Mieczyslaw Nalewaj + * @copyright 2014 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version Release: 3.0 + * @link http://phpsysinfo.sourceforge.net +*/ +class PowerSoftPlus extends UPS +{ + /** + * internal storage for all gathered data + * + * @var Array + */ + private $_output = array(); + + /** + * get all information from all configured ups in phpsysinfo.ini and store output in internal array + */ + public function __construct() + { + parent::__construct(); + CommonFunctions::executeProgram('powersoftplus', '-p', $temp); + if (! empty($temp)) { + $this->_output[] = $temp; + } + } + + /** + * parse the input and store data in resultset for xml generation + * + * @return Void + */ + private function _info() + { + foreach ($this->_output as $ups) { + + $dev = new UPSDevice(); + + // General info + $dev->setName("EVER"); + $dev->setMode("PowerSoftPlus"); + $maxpwr = 0; + $load = null; + if (preg_match('/^Identifier: UPS Model\s*:\s*(.*)$/m', $ups, $data)) { + $dev->setModel(trim($data[1])); + if (preg_match('/\s(\d*)[^\d]*$/', trim($data[1]), $number)) { + $maxpwr=$number[1]*0.65; + } + } + if (preg_match('/^Current UPS state\s*:\s*(.*)$/m', $ups, $data)) { + $dev->setStatus(trim($data[1])); + } + if (preg_match('/^Output load\s*:\s*(.*)\s\[\%\]$/m', $ups, $data)) { + $load = trim($data[1]); + } + //wrong Output load issue + if (($load == 0) && ($maxpwr != 0) && preg_match('/^Effective power\s*:\s*(.*)\s\[W\]$/m', $ups, $data)) { + $load = 100.0*trim($data[1])/$maxpwr; + } + if ($load != null) { + $dev->setLoad($load); + } + // Battery + if (preg_match('/^Battery voltage\s*:\s*(.*)\s\[Volt\]$/m', $ups, $data)) { + $dev->setBatteryVoltage(trim($data[1])); + } + if (preg_match('/^Battery state\s*:\s*(.*)$/m', $ups, $data)) { + if (preg_match('/^At full capacity$/', trim($data[1]))) { + $dev->setBatterCharge(100); + } elseif (preg_match('/^(Discharged)|(Depleted)$/', trim($data[1]))) { + $dev->setBatterCharge(0); + } + } + // Line + if (preg_match('/^Input voltage\s*:\s*(.*)\s\[Volt\]$/m', $ups, $data)) { + $dev->setLineVoltage(trim($data[1])); + } + if (preg_match('/^Input frequency\s*:\s*(.*)\s\[Hz\]$/m', $ups, $data)) { + $dev->setLineFrequency(trim($data[1])); + } + $this->upsinfo->setUpsDevices($dev); + } + } + + /** + * get the information + * + * @see PSI_Interface_UPS::build() + * + * @return Void + */ + public function build() + { + $this->_info(); + } +} diff --git a/sources/includes/ups/class.snmpups.inc.php b/sources/includes/ups/class.snmpups.inc.php new file mode 100644 index 0000000..feebf0a --- /dev/null +++ b/sources/includes/ups/class.snmpups.inc.php @@ -0,0 +1,286 @@ + + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version SVN: $Id: class.apcupsd.inc.php 661 2012-08-27 11:26:39Z namiltd $ + * @link http://phpsysinfo.sourceforge.net + */ + /** + * getting ups information from SNMPups program + * + * @category PHP + * @package PSI_UPS + * @author Michael Cramer + * @author Artem Volk + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version Release: 3.0 + * @link http://phpsysinfo.sourceforge.net + */ +class SNMPups extends UPS +{ + /** + * internal storage for all gathered data + * + * @var Array + */ + private $_output = array(); + + /** + * get all information from all configured ups in phpsysinfo.ini and store output in internal array + */ + public function __construct() + { + parent::__construct(); + switch (strtolower(PSI_UPS_SNMPUPS_ACCESS)) { + case 'command': + if (defined('PSI_UPS_SNMPUPS_LIST') && is_string(PSI_UPS_SNMPUPS_LIST)) { + if (preg_match(ARRAY_EXP, PSI_UPS_SNMPUPS_LIST)) { + $upss = eval(PSI_UPS_SNMPUPS_LIST); + } else { + $upss = array(PSI_UPS_SNMPUPS_LIST); + } + foreach ($upss as $ups) { + CommonFunctions::executeProgram("snmpwalk", "-Ona -c public -v 1 -r 1 ".$ups." .1.3.6.1.4.1.318.1.1.1.1", $buffer, PSI_DEBUG); + if (strlen($buffer) > 0) { + $this->_output[$ups] = $buffer; + $buffer = ""; + CommonFunctions::executeProgram("snmpwalk", "-Ona -c public -v 1 -r 1 ".$ups." .1.3.6.1.4.1.318.1.1.1.2", $buffer, PSI_DEBUG); + if (strlen($buffer) > 0) { + $this->_output[$ups] .= "\n".$buffer; + } + $buffer = ""; + CommonFunctions::executeProgram("snmpwalk", "-Ona -c public -v 1 -r 1 ".$ups." .1.3.6.1.4.1.318.1.1.1.3", $buffer, PSI_DEBUG); + if (strlen($buffer) > 0) { + $this->_output[$ups] .= "\n".$buffer; + } + $buffer = ""; + CommonFunctions::executeProgram("snmpwalk", "-Ona -c public -v 1 -r 1 ".$ups." .1.3.6.1.4.1.318.1.1.1.4", $buffer, PSI_DEBUG); + if (strlen($buffer) > 0) { + $this->_output[$ups] .= "\n".$buffer; + } + } + } + } + break; + case 'php-snmp': + if (!extension_loaded("snmp")) { + $this->error->addError("Requirements error", "SNMPups plugin requires the snmp extension to php in order to work properly"); + break; + } + snmp_set_valueretrieval(SNMP_VALUE_LIBRARY); + snmp_set_oid_output_format(SNMP_OID_OUTPUT_NUMERIC); + if (defined('PSI_UPS_SNMPUPS_LIST') && is_string(PSI_UPS_SNMPUPS_LIST)) { + if (preg_match(ARRAY_EXP, PSI_UPS_SNMPUPS_LIST)) { + $upss = eval(PSI_UPS_SNMPUPS_LIST); + } else { + $upss = array(PSI_UPS_SNMPUPS_LIST); + } + foreach ($upss as $ups) { + if (! PSI_DEBUG) { + restore_error_handler(); /* default error handler */ + $old_err_rep = error_reporting(); + error_reporting(E_ERROR); /* fatal errors only */ + } + $bufferarr=snmprealwalk($ups, "public", ".1.3.6.1.4.1.318.1.1.1.1", 1000000, 1); + if (! PSI_DEBUG) { + error_reporting($old_err_rep); /* restore error level */ + set_error_handler('errorHandlerPsi'); /* restore error handler */ + } + if (! empty($bufferarr)) { + $buffer=""; + foreach ($bufferarr as $id=>$string) { + $buffer .= $id." = ".$string."\n"; + } + + if (! PSI_DEBUG) { + restore_error_handler(); /* default error handler */ + $old_err_rep = error_reporting(); + error_reporting(E_ERROR); /* fatal errors only */ + } + $bufferarr2=snmprealwalk($ups, "public", ".1.3.6.1.4.1.318.1.1.1.2", 1000000, 1); + $bufferarr3=snmprealwalk($ups, "public", ".1.3.6.1.4.1.318.1.1.1.3", 1000000, 1); + $bufferarr4=snmprealwalk($ups, "public", ".1.3.6.1.4.1.318.1.1.1.4", 1000000, 1); + if (! PSI_DEBUG) { + error_reporting($old_err_rep); /* restore error level */ + set_error_handler('errorHandlerPsi'); /* restore error handler */ + } + if (! empty($bufferarr2)) { + foreach ($bufferarr2 as $id=>$string) { + $buffer .= $id." = ".$string."\n"; + } + if (! empty($bufferarr3)) { + foreach ($bufferarr3 as $id=>$string) { + $buffer .= $id." = ".$string."\n"; + } + } } + if (! empty($bufferarr4)) { + foreach ($bufferarr4 as $id=>$string) { + $buffer .= $id." = ".$string."\n"; + } + } + if (strlen(trim($buffer)) > 0) { + $this->_output[$ups] = $buffer; + } + } + } + } + break; + default: + $this->error->addError("switch(PSI_UPS_SNMPUPS_ACCESS)", "Bad SNMPups configuration in phpsysinfo.ini"); + break; + } + } + + /** + * parse the input and store data in resultset for xml generation + * + * @return Void + */ + private function _info() + { + if (empty($this->_output)) { + return; + } + foreach ($this->_output as $result) { + $dev = new UPSDevice(); + $status = ""; + $status2 = ""; + $status3 = ""; + $dev->setMode("SNMP"); + if (preg_match('/^\.1\.3\.6\.1\.4\.1\.318\.1\.1\.1\.1\.1\.2\.0 = STRING:\s(.*)/m', $result, $data)) { + $dev->setName(trim($data[1], "\" \r\t")); + } + if (preg_match('/^\.1\.3\.6\.1\.4\.1\.318\.1\.1\.1\.1\.1\.1\.0 = STRING:\s(.*)/m', $result, $data)) { + $dev->setModel(trim($data[1], "\" \r\t")); + } + if (preg_match('/^\.1\.3\.6\.1\.4\.1\.318\.1\.1\.1\.4\.1\.1\.0 = INTEGER:\s(.*)/m', $result, $data)) { + switch (trim($data[1])) { + case 1: $status = "Unknown"; + break; + case 2: $status = "On Line"; + break; + case 3: $status = "On Battery"; + break; + case 4: $status = "On Smart Boost"; + break; + case 5: $status = "Timed Sleeping"; + break; + case 6: $status = "Software Bypass"; + break; + case 7: $status = "Off"; + break; + case 8: $status = "Rebooting"; + break; + case 9: $status = "Switched Bypass"; + break; + case 10:$status = "Hardware Failure Bypass"; + break; + case 11:$status = "Sleeping Until Power Returns"; + break; + case 12:$status = "On Smart Trim"; + break; + default: $status = "Unknown state (".trim($data[1]).")"; + break; + } + } + if (preg_match('/^\.1\.3\.6\.1\.4\.1\.318\.1\.1\.1\.2\.1\.1\.0 = INTEGER:\s(.*)/m', $result, $data)) { + $batstat = ""; + switch (trim($data[1])) { + case 1: $batstat = "Battery Unknown"; + break; + case 2: break; + case 3: $batstat = "Battery Low"; + break; + default: $batstat = "Battery Unknown (".trim($data[1]).")"; + break; + } + if ($batstat !== "") { + if ($status !== "") { + $status .= ", ".$batstat; + } else { + $status = $batstat; + } + } + } + if (preg_match('/^\.1\.3\.6\.1\.4\.1\.318\.1\.1\.1\.2\.2\.4\.0 = INTEGER:\s(.*)/m', $result, $data)) { + $batstat = ""; + switch (trim($data[1])) { + case 1: break; + case 2: $batstat = "Replace Battery"; + break; + default: $batstat = "Replace Battery (".trim($data[1]).")"; + break; + } + if ($batstat !== "") { + if ($status !== "") { + $status .= ", ".$batstat; + } else { + $status = $batstat; + } + } + } + if ($status !== "") { + $dev->setStatus(trim($status)); + } + + if (preg_match('/^\.1\.3\.6\.1\.4\.1\.318\.1\.1\.1\.3\.3\.1\.0 = Gauge32:\s(.*)/m', $result, $data)) { + $dev->setLineVoltage(trim($data[1])/10); + } elseif (preg_match('/^\.1\.3\.6\.1\.4\.1\.318\.1\.1\.1\.3\.2\.1\.0 = Gauge32:\s(.*)/m', $result, $data)) { + $dev->setLineVoltage(trim($data[1])); + } + if (preg_match('/^\.1\.3\.6\.1\.4\.1\.318\.1\.1\.1\.4\.3\.3\.0 = Gauge32:\s(.*)/m', $result, $data)) { + $dev->setLoad(trim($data[1])/10); + } elseif (preg_match('/^\.1\.3\.6\.1\.4\.1\.318\.1\.1\.1\.4\.2\.3\.0 = Gauge32:\s(.*)/m', $result, $data)) { + $dev->setLoad(trim($data[1])); + } + if (preg_match('/^\.1\.3\.6\.1\.4\.1\.318\.1\.1\.1\.2\.3\.4\.0 = INTEGER:\s(.*)/m', $result, $data)) { + $dev->setBatteryVoltage(trim($data[1])/10); + } elseif (preg_match('/^\.1\.3\.6\.1\.4\.1\.318\.1\.1\.1\.2\.2\.8\.0 = INTEGER:\s(.*)/m', $result, $data)) { + $dev->setBatteryVoltage(trim($data[1])); + } + if (preg_match('/^\.1\.3\.6\.1\.4\.1\.318\.1\.1\.1\.2\.3\.1\.0 = Gauge32:\s(.*)/m', $result, $data)) { + $dev->setBatterCharge(trim($data[1])/10); + } elseif (preg_match('/^\.1\.3\.6\.1\.4\.1\.318\.1\.1\.1\.2\.2\.1\.0 = Gauge32:\s(.*)/m', $result, $data)) { + $dev->setBatterCharge(trim($data[1])); + } + if (preg_match('/^\.1\.3\.6\.1\.4\.1\.318\.1\.1\.1\.2\.2\.3\.0 = Timeticks:\s\((\d*)\)/m', $result, $data)) { + $dev->setTimeLeft(trim($data[1])/6000); + } + if (preg_match('/^\.1\.3\.6\.1\.4\.1\.318\.1\.1\.1\.2\.3\.2\.0 = Gauge32:\s(.*)/m', $result, $data)) { + $dev->setTemperatur(trim($data[1])/10); + } elseif (preg_match('/^\.1\.3\.6\.1\.4\.1\.318\.1\.1\.1\.2\.2\.2\.0 = Gauge32:\s(.*)/m', $result, $data)) { + $dev->setTemperatur(trim($data[1])); + } + if (preg_match('/^\.1\.3\.6\.1\.4\.1\.318\.1\.1\.1\.2\.1\.3\.0 = STRING:\s(.*)/m', $result, $data)) { + $dev->setBatteryDate(trim($data[1], "\" \r\t")); + } + if (preg_match('/^\.1\.3\.6\.1\.4\.1\.318\.1\.1\.1\.3\.3\.4\.0 = Gauge32:\s(.*)/m', $result, $data)) { + $dev->setLineFrequency(trim($data[1])/10); + } elseif (preg_match('/^\.1\.3\.6\.1\.4\.1\.318\.1\.1\.1\.3\.2\.4\.0 = Gauge32:\s(.*)/m', $result, $data)) { + $dev->setLineFrequency(trim($data[1])); + } + + $this->upsinfo->setUpsDevices($dev); + } + } + + /** + * get the information + * + * @see PSI_Interface_UPS::build() + * + * @return Void + */ + public function build() + { + $this->_info(); + } +} diff --git a/sources/includes/ups/class.ups.inc.php b/sources/includes/ups/class.ups.inc.php new file mode 100644 index 0000000..10b94e2 --- /dev/null +++ b/sources/includes/ups/class.ups.inc.php @@ -0,0 +1,64 @@ + + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version SVN: $Id: class.ups.inc.php 661 2012-08-27 11:26:39Z namiltd $ + * @link http://phpsysinfo.sourceforge.net + */ + /** + * Basic UPS functions for all UPS classes + * + * @category PHP + * @package PSI_UPS + * @author Michael Cramer + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version Release: 3.0 + * @link http://phpsysinfo.sourceforge.net + */ +abstract class UPS implements PSI_Interface_UPS +{ + /** + * object for error handling + * + * @var Error + */ + public $error; + + /** + * main object for ups information + * + * @var UPSInfo + */ + protected $upsinfo; + + /** + * build the global Error object + */ + public function __construct() + { + $this->error = PSI_Error::singleton(); + $this->upsinfo = new UPSInfo(); + } + + /** + * build and return the ups information + * + * @see PSI_Interface_UPS::getUPSInfo() + * + * @return UPSInfo + */ + final public function getUPSInfo() + { + $this->build(); + + return $this->upsinfo; + } +} diff --git a/sources/includes/xml/class.SimpleXMLExtended.inc.php b/sources/includes/xml/class.SimpleXMLExtended.inc.php new file mode 100644 index 0000000..a05ff2c --- /dev/null +++ b/sources/includes/xml/class.SimpleXMLExtended.inc.php @@ -0,0 +1,212 @@ + + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version SVN: $Id: class.SimpleXMLExtended.inc.php 610 2012-07-11 19:12:12Z namiltd $ + * @link http://phpsysinfo.sourceforge.net + */ + /** + * class extends the SimpleXML element for including some special functions, like encoding stuff and cdata support + * + * @category PHP + * @package PSI_XML + * @author Michael Cramer + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version Release: 3.0 + * @link http://phpsysinfo.sourceforge.net + */ +class SimpleXMLExtended +{ + /** + * store the encoding that is used for conversation to utf8 + * + * @var String base encoding + */ + private $_encoding = null; + + /** + * SimpleXMLElement to which every call is delegated + * + * @var SimpleXMLElement delegated SimpleXMLElement + */ + private $_SimpleXmlElement = null; + + /** + * _CP437toUTF8Table for code page conversion for CP437 + * + * @var _CP437toUTF8Table array + */ + private static $_CP437toUTF8Table = array( + "\xC3\x87","\xC3\xBC","\xC3\xA9","\xC3\xA2", + "\xC3\xA4","\xC3\xA0","\xC3\xA5","\xC3\xA7", + "\xC3\xAA","\xC3\xAB","\xC3\xA8","\xC3\xAF", + "\xC3\xAE","\xC3\xAC","\xC3\x84","\xC3\x85", + "\xC3\x89","\xC3\xA6","\xC3\x86","\xC3\xB4", + "\xC3\xB6","\xC3\xB2","\xC3\xBB","\xC3\xB9", + "\xC3\xBF","\xC3\x96","\xC3\x9C","\xC3\xA2", + "\xC2\xA3","\xC3\xA5","\xE2\x82\xA7","\xC6\x92", + "\xC3\xA1","\xC3\xAD","\xC3\xB3","\xC3\xBA", + "\xC3\xB1","\xC3\x91","\xC2\xAA","\xC2\xBA", + "\xC2\xBF","\xE2\x8C\x90","\xC2\xAC","\xC2\xBD", + "\xC2\xBC","\xC2\xA1","\xC2\xAB","\xC2\xBB", + "\xE2\x96\x91","\xE2\x96\x92","\xE2\x96\x93","\xE2\x94\x82", + "\xE2\x94\xA4","\xE2\x95\xA1","\xE2\x95\xA2","\xE2\x95\x96", + "\xE2\x95\x95","\xE2\x95\xA3","\xE2\x95\x91","\xE2\x95\x97", + "\xE2\x95\x9D","\xE2\x95\x9C","\xE2\x95\x9B","\xE2\x94\x90", + "\xE2\x94\x94","\xE2\x94\xB4","\xE2\x94\xAC","\xE2\x94\x9C", + "\xE2\x94\x80","\xE2\x94\xBC","\xE2\x95\x9E","\xE2\x95\x9F", + "\xE2\x95\x9A","\xE2\x95\x94","\xE2\x95\xA9","\xE2\x95\xA6", + "\xE2\x95\xA0","\xE2\x95\x90","\xE2\x95\xAC","\xE2\x95\xA7", + "\xE2\x95\xA8","\xE2\x95\xA4","\xE2\x95\xA5","\xE2\x95\x99", + "\xE2\x95\x98","\xE2\x95\x92","\xE2\x95\x93","\xE2\x95\xAB", + "\xE2\x95\xAA","\xE2\x94\x98","\xE2\x94\x8C","\xE2\x96\x88", + "\xE2\x96\x84","\xE2\x96\x8C","\xE2\x96\x90","\xE2\x96\x80", + "\xCE\xB1","\xC3\x9F","\xCE\x93","\xCF\x80", + "\xCE\xA3","\xCF\x83","\xC2\xB5","\xCF\x84", + "\xCE\xA6","\xCE\x98","\xCE\xA9","\xCE\xB4", + "\xE2\x88\x9E","\xCF\x86","\xCE\xB5","\xE2\x88\xA9", + "\xE2\x89\xA1","\xC2\xB1","\xE2\x89\xA5","\xE2\x89\xA4", + "\xE2\x8C\xA0","\xE2\x8C\xA1","\xC3\xB7","\xE2\x89\x88", + "\xC2\xB0","\xE2\x88\x99","\xC2\xB7","\xE2\x88\x9A", + "\xE2\x81\xBF","\xC2\xB2","\xE2\x96\xA0","\xC2\xA0"); + + /** + * create a new extended SimpleXMLElement and set encoding if specified + * + * @param SimpleXMLElement $xml base xml element + * @param String $encoding base encoding that should be used for conversation to utf8 + * + * @return void + */ + public function __construct($xml, $encoding = null) + { + if ($encoding != null) { + $this->_encoding = $encoding; + } + $this->_SimpleXmlElement = $xml; + } + + /** + * insert a child element with or without a value, also doing conversation of name and if value is set to utf8 + * + * @param String $name name of the child element + * @param String $value a value that should be insert to the child + * + * @return SimpleXMLExtended extended child SimpleXMLElement + */ + public function addChild($name, $value = null) + { + $nameUtf8 = $this->_toUTF8($name); + if ($value == null) { + return new SimpleXMLExtended($this->_SimpleXmlElement->addChild($nameUtf8), $this->_encoding); + } else { + $valueUtf8 = htmlspecialchars($this->_toUTF8($value)); + + return new SimpleXMLExtended($this->_SimpleXmlElement->addChild($nameUtf8, $valueUtf8), $this->_encoding); + } + } + + /** + * insert a child with cdata section + * + * @param String $name name of the child element + * @param String $cdata data for CDATA section + * + * @return SimpleXMLExtended extended child SimpleXMLElement + */ + public function addCData($name, $cdata) + { + $nameUtf8 = $this->_toUTF8($name); + $node = $this->_SimpleXmlElement->addChild($nameUtf8); + $domnode = dom_import_simplexml($node); + $no = $domnode->ownerDocument; + $domnode->appendChild($no->createCDATASection($cdata)); + + return new SimpleXMLExtended($node, $this->_encoding); + } + + /** + * add a attribute to a child and convert name and value to utf8 + * + * @param String $name name of the attribute + * @param String $value value of the attribute + * + * @return Void + */ + public function addAttribute($name, $value) + { + $nameUtf8 = $this->_toUTF8($name); + $valueUtf8 = htmlspecialchars($this->_toUTF8($value)); + $this->_SimpleXmlElement->addAttribute($nameUtf8, $valueUtf8); + } + + /** + * append a xml-tree to another xml-tree + * + * @param SimpleXMLElement $new_child child that should be appended + * + * @return Void + */ + public function combinexml(SimpleXMLElement $new_child) + { + $node1 = dom_import_simplexml($this->_SimpleXmlElement); + $dom_sxe = dom_import_simplexml($new_child); + $node2 = $node1->ownerDocument->importNode($dom_sxe, true); + $node1->appendChild($node2); + } + + /** + * convert a string into an UTF-8 string + * + * @param String $str string to convert + * + * @return String UTF-8 string + */ + private function _toUTF8($str) + { + if ($this->_encoding != null) { + if (strcasecmp($this->_encoding, "UTF-8") == 0) { + return trim($str); + } elseif (strcasecmp($this->_encoding, "CP437") == 0) { + $str = trim($str); + $strr = ""; + if (($strl = strlen($str)) > 0) for ($i = 0; $i < $strl; $i++) { + $strc = substr($str, $i, 1); + if ($strc < 128) $strr.=$strc; + else $strr.=$_CP437toUTF8Table[$strc-128]; + } + + return $strr; + } else { + $enclist = mb_list_encodings(); + if (in_array($this->_encoding, $enclist)) { + return mb_convert_encoding(trim($str), 'UTF-8', $this->_encoding); + } elseif (function_exists("iconv")) { + return iconv($this->_encoding, 'UTF-8', trim($str)); + } else { + return mb_convert_encoding(trim($str), 'UTF-8'); + } + } + } else { + return mb_convert_encoding(trim($str), 'UTF-8'); + } + } + + /** + * Returns the SimpleXmlElement + * + * @return SimpleXmlElement entire xml as SimpleXmlElement + */ + public function getSimpleXmlElement() + { + return $this->_SimpleXmlElement; + } +} diff --git a/sources/includes/xml/class.XML.inc.php b/sources/includes/xml/class.XML.inc.php new file mode 100644 index 0000000..31e7440 --- /dev/null +++ b/sources/includes/xml/class.XML.inc.php @@ -0,0 +1,732 @@ + + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version SVN: $Id: class.XML.inc.php 699 2012-09-15 11:57:13Z namiltd $ + * @link http://phpsysinfo.sourceforge.net + */ + /** + * class for generation of the xml + * + * @category PHP + * @package PSI_XML + * @author Michael Cramer + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version Release: 3.0 + * @link http://phpsysinfo.sourceforge.net + */ +class XML +{ + /** + * Sysinfo object where the information retrieval methods are included + * + * @var PSI_Interface_OS + */ + private $_sysinfo; + + /** + * @var System + */ + private $_sys = null; + + /** + * xml object with the xml content + * + * @var SimpleXMLExtended + */ + private $_xml; + + /** + * object for error handling + * + * @var Error + */ + private $_errors; + + /** + * array with all enabled plugins (name) + * + * @var array + */ + private $_plugins; + + /** + * plugin name if pluginrequest + * + * @var string + */ + private $_plugin = ''; + + /** + * generate a xml for a plugin or for the main app + * + * @var boolean + */ + private $_plugin_request = false; + + /** + * generate the entire xml with all plugins or only a part of the xml (main or plugin) + * + * @var boolean + */ + private $_complete_request = false; + + /** + * doing some initial tasks + * - generate the xml structure with the right header elements + * - get the error object for error output + * - get a instance of the sysinfo object + * + * @param boolean $complete generate xml with all plugins or not + * @param string $pluginname name of the plugin + * + * @return void + */ + public function __construct($complete = false, $pluginname = "") + { + $this->_errors = PSI_Error::singleton(); + if ($pluginname == "") { + $this->_plugin_request = false; + $this->_plugin = ''; + } else { + $this->_plugin_request = true; + $this->_plugin = $pluginname; + } + if ($complete) { + $this->_complete_request = true; + } else { + $this->_complete_request = false; + } + $os = PSI_OS; + $this->_sysinfo = new $os(); + $this->_plugins = CommonFunctions::getPlugins(); + $this->_xmlbody(); + } + + /** + * generate common information + * + * @return void + */ + private function _buildVitals() + { + $vitals = $this->_xml->addChild('Vitals'); + $vitals->addAttribute('Hostname', $this->_sys->getHostname()); + $vitals->addAttribute('IPAddr', $this->_sys->getIp()); + $vitals->addAttribute('Kernel', $this->_sys->getKernel()); + $vitals->addAttribute('Distro', $this->_sys->getDistribution()); + $vitals->addAttribute('Distroicon', $this->_sys->getDistributionIcon()); + $vitals->addAttribute('Uptime', $this->_sys->getUptime()); + $vitals->addAttribute('Users', $this->_sys->getUsers()); + $vitals->addAttribute('LoadAvg', $this->_sys->getLoad()); + if ($this->_sys->getLoadPercent() !== null) { + $vitals->addAttribute('CPULoad', $this->_sys->getLoadPercent()); + } + if ($this->_sysinfo->getLanguage() !== null) { + $vitals->addAttribute('SysLang', $this->_sysinfo->getLanguage()); + } + if ($this->_sysinfo->getEncoding() !== null) { + $vitals->addAttribute('CodePage', $this->_sysinfo->getEncoding()); + } + + //processes + if (($procss = $this->_sys->getProcesses()) !== null) { + if (isset($procss['*']) && (($procall = $procss['*']) > 0)) { + $vitals->addAttribute('Processes', $procall); + if (!isset($procss[' ']) || !($procss[' '] > 0)) { // not unknown + $procsum = 0; + if (isset($procss['R']) && (($proctmp = $procss['R']) > 0)) { + $vitals->addAttribute('ProcessesRunning', $proctmp); + $procsum += $proctmp; + } + if (isset($procss['S']) && (($proctmp = $procss['S']) > 0)) { + $vitals->addAttribute('ProcessesSleeping', $proctmp); + $procsum += $proctmp; + } + if (isset($procss['T']) && (($proctmp = $procss['T']) > 0)) { + $vitals->addAttribute('ProcessesStopped', $proctmp); + $procsum += $proctmp; + } + if (isset($procss['Z']) && (($proctmp = $procss['Z']) > 0)) { + $vitals->addAttribute('ProcessesZombie', $proctmp); + $procsum += $proctmp; + } + if (isset($procss['D']) && (($proctmp = $procss['D']) > 0)) { + $vitals->addAttribute('ProcessesWaiting', $proctmp); + $procsum += $proctmp; + } + if (($proctmp = $procall - $procsum) > 0) { + $vitals->addAttribute('ProcessesOther', $proctmp); + } + } + } + } + $vitals->addAttribute('OS', PSI_OS); + } + + /** + * generate the network information + * + * @return void + */ + private function _buildNetwork() + { + $hideDevices = array(); + $network = $this->_xml->addChild('Network'); + if (defined('PSI_HIDE_NETWORK_INTERFACE')) { + if (is_string(PSI_HIDE_NETWORK_INTERFACE)) { + if (preg_match(ARRAY_EXP, PSI_HIDE_NETWORK_INTERFACE)) { + $hideDevices = eval(PSI_HIDE_NETWORK_INTERFACE); + } else { + $hideDevices = array(PSI_HIDE_NETWORK_INTERFACE); + } + } elseif (PSI_HIDE_NETWORK_INTERFACE === true) { + return; + } + } + foreach ($this->_sys->getNetDevices() as $dev) { + if (!in_array(trim($dev->getName()), $hideDevices)) { + $device = $network->addChild('NetDevice'); + $device->addAttribute('Name', $dev->getName()); + $device->addAttribute('RxBytes', $dev->getRxBytes()); + $device->addAttribute('TxBytes', $dev->getTxBytes()); + $device->addAttribute('Err', $dev->getErrors()); + $device->addAttribute('Drops', $dev->getDrops()); + if (defined('PSI_SHOW_NETWORK_INFOS') && PSI_SHOW_NETWORK_INFOS && $dev->getInfo()) + $device->addAttribute('Info', $dev->getInfo()); + } + } + } + + /** + * generate the hardware information + * + * @return void + */ + private function _buildHardware() + { + $dev = new HWDevice(); + $hardware = $this->_xml->addChild('Hardware'); + if ($this->_sys->getMachine() != "") { + $hardware->addAttribute('Name', $this->_sys->getMachine()); + } + $pci = null; + foreach (System::removeDupsAndCount($this->_sys->getPciDevices()) as $dev) { + if ($pci === null) $pci = $hardware->addChild('PCI'); + $tmp = $pci->addChild('Device'); + $tmp->addAttribute('Name', $dev->getName()); + $tmp->addAttribute('Count', $dev->getCount()); + } + $usb = null; + foreach (System::removeDupsAndCount($this->_sys->getUsbDevices()) as $dev) { + if ($usb === null) $usb = $hardware->addChild('USB'); + $tmp = $usb->addChild('Device'); + $tmp->addAttribute('Name', $dev->getName()); + $tmp->addAttribute('Count', $dev->getCount()); + } + $ide = null; + foreach (System::removeDupsAndCount($this->_sys->getIdeDevices()) as $dev) { + if ($ide === null) $ide = $hardware->addChild('IDE'); + $tmp = $ide->addChild('Device'); + $tmp->addAttribute('Name', $dev->getName()); + $tmp->addAttribute('Count', $dev->getCount()); + if ($dev->getCapacity() !== null) { + $tmp->addAttribute('Capacity', $dev->getCapacity()); + } + } + $scsi = null; + foreach (System::removeDupsAndCount($this->_sys->getScsiDevices()) as $dev) { + if ($scsi === null) $scsi = $hardware->addChild('SCSI'); + $tmp = $scsi->addChild('Device'); + $tmp->addAttribute('Name', $dev->getName()); + $tmp->addAttribute('Count', $dev->getCount()); + if ($dev->getCapacity() !== null) { + $tmp->addAttribute('Capacity', $dev->getCapacity()); + } + } + $tb = null; + foreach (System::removeDupsAndCount($this->_sys->getTbDevices()) as $dev) { + if ($tb === null) $tb = $hardware->addChild('TB'); + $tmp = $tb->addChild('Device'); + $tmp->addAttribute('Name', $dev->getName()); + $tmp->addAttribute('Count', $dev->getCount()); + } + $i2c = null; + foreach (System::removeDupsAndCount($this->_sys->getI2cDevices()) as $dev) { + if ($i2c === null) $i2c = $hardware->addChild('I2C'); + $tmp = $i2c->addChild('Device'); + $tmp->addAttribute('Name', $dev->getName()); + $tmp->addAttribute('Count', $dev->getCount()); + } + + $cpu = null; + foreach ($this->_sys->getCpus() as $oneCpu) { + if ($cpu === null) $cpu = $hardware->addChild('CPU'); + $tmp = $cpu->addChild('CpuCore'); + $tmp->addAttribute('Model', $oneCpu->getModel()); + if ($oneCpu->getCpuSpeed() !== 0) { + $tmp->addAttribute('CpuSpeed', $oneCpu->getCpuSpeed()); + } + if ($oneCpu->getCpuSpeedMax() !== 0) { + $tmp->addAttribute('CpuSpeedMax', $oneCpu->getCpuSpeedMax()); + } + if ($oneCpu->getCpuSpeedMin() !== 0) { + $tmp->addAttribute('CpuSpeedMin', $oneCpu->getCpuSpeedMin()); + } + if ($oneCpu->getTemp() !== null) { + $tmp->addAttribute('CpuTemp', $oneCpu->getTemp()); + } + if ($oneCpu->getBusSpeed() !== null) { + $tmp->addAttribute('BusSpeed', $oneCpu->getBusSpeed()); + } + if ($oneCpu->getCache() !== null) { + $tmp->addAttribute('Cache', $oneCpu->getCache()); + } + if ($oneCpu->getVirt() !== null) { + $tmp->addAttribute('Virt', $oneCpu->getVirt()); + } + if ($oneCpu->getBogomips() !== null) { + $tmp->addAttribute('Bogomips', $oneCpu->getBogomips()); + } + if ($oneCpu->getLoad() !== null) { + $tmp->addAttribute('Load', $oneCpu->getLoad()); + } + } + } + + /** + * generate the memory information + * + * @return void + */ + private function _buildMemory() + { + $memory = $this->_xml->addChild('Memory'); + $memory->addAttribute('Free', $this->_sys->getMemFree()); + $memory->addAttribute('Used', $this->_sys->getMemUsed()); + $memory->addAttribute('Total', $this->_sys->getMemTotal()); + $memory->addAttribute('Percent', $this->_sys->getMemPercentUsed()); + if (($this->_sys->getMemApplication() !== null) || ($this->_sys->getMemBuffer() !== null) || ($this->_sys->getMemCache() !== null)) { + $details = $memory->addChild('Details'); + if ($this->_sys->getMemApplication() !== null) { + $details->addAttribute('App', $this->_sys->getMemApplication()); + $details->addAttribute('AppPercent', $this->_sys->getMemPercentApplication()); + } + if ($this->_sys->getMemBuffer() !== null) { + $details->addAttribute('Buffers', $this->_sys->getMemBuffer()); + $details->addAttribute('BuffersPercent', $this->_sys->getMemPercentBuffer()); + } + if ($this->_sys->getMemCache() !== null) { + $details->addAttribute('Cached', $this->_sys->getMemCache()); + $details->addAttribute('CachedPercent', $this->_sys->getMemPercentCache()); + } + } + if (count($this->_sys->getSwapDevices()) > 0) { + $swap = $memory->addChild('Swap'); + $swap->addAttribute('Free', $this->_sys->getSwapFree()); + $swap->addAttribute('Used', $this->_sys->getSwapUsed()); + $swap->addAttribute('Total', $this->_sys->getSwapTotal()); + $swap->addAttribute('Percent', $this->_sys->getSwapPercentUsed()); + $i = 1; + foreach ($this->_sys->getSwapDevices() as $dev) { + $swapMount = $swap->addChild('Mount'); + $this->_fillDevice($swapMount, $dev, $i++); + } + } + } + + /** + * fill a xml element with atrributes from a disk device + * + * @param SimpleXmlExtended $mount Xml-Element + * @param DiskDevice $dev DiskDevice + * @param Integer $i counter + * + * @return Void + */ + private function _fillDevice(SimpleXMLExtended $mount, DiskDevice $dev, $i) + { + $mount->addAttribute('MountPointID', $i); + if ($dev->getFsType()!=="") $mount->addAttribute('FSType', $dev->getFsType()); + $mount->addAttribute('Name', $dev->getName()); + $mount->addAttribute('Free', sprintf("%.0f", $dev->getFree())); + $mount->addAttribute('Used', sprintf("%.0f", $dev->getUsed())); + $mount->addAttribute('Total', sprintf("%.0f", $dev->getTotal())); + $mount->addAttribute('Percent', $dev->getPercentUsed()); + if (PSI_SHOW_MOUNT_OPTION === true) { + if ($dev->getOptions() !== null) { + $mount->addAttribute('MountOptions', preg_replace("/,/", ", ", $dev->getOptions())); + } + } + if ($dev->getPercentInodesUsed() !== null) { + $mount->addAttribute('Inodes', $dev->getPercentInodesUsed()); + } + if (PSI_SHOW_MOUNT_POINT === true) { + $mount->addAttribute('MountPoint', $dev->getMountPoint()); + } + } + + /** + * generate the filesysteminformation + * + * @return void + */ + private function _buildFilesystems() + { + $hideMounts = $hideFstypes = $hideDisks = array(); + $i = 1; + if (defined('PSI_HIDE_MOUNTS') && is_string(PSI_HIDE_MOUNTS)) { + if (preg_match(ARRAY_EXP, PSI_HIDE_MOUNTS)) { + $hideMounts = eval(PSI_HIDE_MOUNTS); + } else { + $hideMounts = array(PSI_HIDE_MOUNTS); + } + } + if (defined('PSI_HIDE_FS_TYPES') && is_string(PSI_HIDE_FS_TYPES)) { + if (preg_match(ARRAY_EXP, PSI_HIDE_FS_TYPES)) { + $hideFstypes = eval(PSI_HIDE_FS_TYPES); + } else { + $hideFstypes = array(PSI_HIDE_FS_TYPES); + } + } + if (defined('PSI_HIDE_DISKS')) { + if (is_string(PSI_HIDE_DISKS)) { + if (preg_match(ARRAY_EXP, PSI_HIDE_DISKS)) { + $hideDisks = eval(PSI_HIDE_DISKS); + } else { + $hideDisks = array(PSI_HIDE_DISKS); + } + } elseif (PSI_HIDE_DISKS === true) { + return; + } + } + $fs = $this->_xml->addChild('FileSystem'); + foreach ($this->_sys->getDiskDevices() as $disk) { + if (!in_array($disk->getMountPoint(), $hideMounts, true) && !in_array($disk->getFsType(), $hideFstypes, true) && !in_array($disk->getName(), $hideDisks, true)) { + $mount = $fs->addChild('Mount'); + $this->_fillDevice($mount, $disk, $i++); + } + } + } + + /** + * generate the motherboard information + * + * @return void + */ + private function _buildMbinfo() + { + $mbinfo = $this->_xml->addChild('MBInfo'); + $temp = $fan = $volt = $power = $current = null; + + if (sizeof(unserialize(PSI_MBINFO))>0) { + foreach (unserialize(PSI_MBINFO) as $mbinfoclass) { + $mbinfo_data = new $mbinfoclass(); + $mbinfo_detail = $mbinfo_data->getMBInfo(); + + foreach ($mbinfo_detail->getMbTemp() as $dev) { + if ($temp == null) { + $temp = $mbinfo->addChild('Temperature'); + } + $item = $temp->addChild('Item'); + $item->addAttribute('Label', $dev->getName()); + $item->addAttribute('Value', $dev->getValue()); + if ($dev->getMax() !== null) { + $item->addAttribute('Max', $dev->getMax()); + } + if (defined('PSI_SENSOR_EVENTS') && PSI_SENSOR_EVENTS && $dev->getEvent() !== "") { + $item->addAttribute('Event', $dev->getEvent()); + } + } + + foreach ($mbinfo_detail->getMbFan() as $dev) { + if ($fan == null) { + $fan = $mbinfo->addChild('Fans'); + } + $item = $fan->addChild('Item'); + $item->addAttribute('Label', $dev->getName()); + $item->addAttribute('Value', $dev->getValue()); + if ($dev->getMin() !== null) { + $item->addAttribute('Min', $dev->getMin()); + } + if (defined('PSI_SENSOR_EVENTS') && PSI_SENSOR_EVENTS && $dev->getEvent() !== "") { + $item->addAttribute('Event', $dev->getEvent()); + } + } + + foreach ($mbinfo_detail->getMbVolt() as $dev) { + if ($volt == null) { + $volt = $mbinfo->addChild('Voltage'); + } + $item = $volt->addChild('Item'); + $item->addAttribute('Label', $dev->getName()); + $item->addAttribute('Value', $dev->getValue()); + if ($dev->getMin() !== null) { + $item->addAttribute('Min', $dev->getMin()); + } + if ($dev->getMax() !== null) { + $item->addAttribute('Max', $dev->getMax()); + } + if (defined('PSI_SENSOR_EVENTS') && PSI_SENSOR_EVENTS && $dev->getEvent() !== "") { + $item->addAttribute('Event', $dev->getEvent()); + } + } + + foreach ($mbinfo_detail->getMbPower() as $dev) { + if ($power == null) { + $power = $mbinfo->addChild('Power'); + } + $item = $power->addChild('Item'); + $item->addAttribute('Label', $dev->getName()); + $item->addAttribute('Value', $dev->getValue()); + if ($dev->getMax() !== null) { + $item->addAttribute('Max', $dev->getMax()); + } + if (defined('PSI_SENSOR_EVENTS') && PSI_SENSOR_EVENTS && $dev->getEvent() !== "") { + $item->addAttribute('Event', $dev->getEvent()); + } + } + + foreach ($mbinfo_detail->getMbCurrent() as $dev) { + if ($current == null) { + $current = $mbinfo->addChild('Current'); + } + $item = $current->addChild('Item'); + $item->addAttribute('Label', $dev->getName()); + $item->addAttribute('Value', $dev->getValue()); + if ($dev->getMax() !== null) { + $item->addAttribute('Max', $dev->getMax()); + } + if (defined('PSI_SENSOR_EVENTS') && PSI_SENSOR_EVENTS && $dev->getEvent() !== "") { + $item->addAttribute('Event', $dev->getEvent()); + } + } + } + } + } + + /** + * generate the ups information + * + * @return void + */ + private function _buildUpsinfo() + { + $upsinfo = $this->_xml->addChild('UPSInfo'); + if (defined('PSI_UPS_APCUPSD_CGI_ENABLE') && PSI_UPS_APCUPSD_CGI_ENABLE) { + $upsinfo->addAttribute('ApcupsdCgiLinks', true); + } + if (sizeof(unserialize(PSI_UPSINFO))>0) { + foreach (unserialize(PSI_UPSINFO) as $upsinfoclass) { + $upsinfo_data = new $upsinfoclass(); + $upsinfo_detail = $upsinfo_data->getUPSInfo(); + foreach ($upsinfo_detail->getUpsDevices() as $ups) { + $item = $upsinfo->addChild('UPS'); + $item->addAttribute('Name', $ups->getName()); + if ($ups->getModel() !== "") { + $item->addAttribute('Model', $ups->getModel()); + } + $item->addAttribute('Mode', $ups->getMode()); + if ($ups->getStartTime() !== "") { + $item->addAttribute('StartTime', $ups->getStartTime()); + } + $item->addAttribute('Status', $ups->getStatus()); + if ($ups->getTemperatur() !== null) { + $item->addAttribute('Temperature', $ups->getTemperatur()); + } + if ($ups->getOutages() !== null) { + $item->addAttribute('OutagesCount', $ups->getOutages()); + } + if ($ups->getLastOutage() !== null) { + $item->addAttribute('LastOutage', $ups->getLastOutage()); + } + if ($ups->getLastOutageFinish() !== null) { + $item->addAttribute('LastOutageFinish', $ups->getLastOutageFinish()); + } + if ($ups->getLineVoltage() !== null) { + $item->addAttribute('LineVoltage', $ups->getLineVoltage()); + } + if ($ups->getLineFrequency() !== null) { + $item->addAttribute('LineFrequency', $ups->getLineFrequency()); + } + if ($ups->getLoad() !== null) { + $item->addAttribute('LoadPercent', $ups->getLoad()); + } + if ($ups->getBatteryDate() !== null) { + $item->addAttribute('BatteryDate', $ups->getBatteryDate()); + } + if ($ups->getBatteryVoltage() !== null) { + $item->addAttribute('BatteryVoltage', $ups->getBatteryVoltage()); + } + if ($ups->getBatterCharge() !== null) { + $item->addAttribute('BatteryChargePercent', $ups->getBatterCharge()); + } + if ($ups->getTimeLeft() !== null) { + $item->addAttribute('TimeLeftMinutes', $ups->getTimeLeft()); + } + } + } + } + } + + /** + * generate the xml document + * + * @return void + */ + private function _buildXml() + { + if (!$this->_plugin_request || $this->_complete_request) { + if (version_compare("5.2", PHP_VERSION, ">")) { + $this->_errors->addError("ERROR", "PHP 5.2 or greater is required, some things may not work correctly"); + } + if ($this->_sys === null) { + if (PSI_DEBUG === true) { + // unstable version check + if (!is_numeric(substr(PSI_VERSION, -1))) { + $this->_errors->addError("WARN", "This is an unstable version of phpSysInfo, some things may not work correctly"); + } + + // Safe mode check + $safe_mode = @ini_get("safe_mode") ? true : false; + if ($safe_mode) { + $this->_errors->addError("WARN", "PhpSysInfo requires to set off 'safe_mode' in 'php.ini'"); + } + // Include path check + $include_path = @ini_get("include_path"); + if ($include_path && ($include_path!="")) { + $include_path = preg_replace("/(:)|(;)/", "\n", $include_path); + if (preg_match("/^\.$/m", $include_path)) { + $include_path = "."; + } + } + if ($include_path != ".") { + $this->_errors->addError("WARN", "PhpSysInfo requires '.' inside the 'include_path' in php.ini"); + } + // popen mode check + if (defined("PSI_MODE_POPEN") && PSI_MODE_POPEN === true) { + $this->_errors->addError("WARN", "Installed version of PHP does not support proc_open() function, popen() is used"); + } + } + $this->_sys = $this->_sysinfo->getSys(); + } + $this->_buildVitals(); + $this->_buildNetwork(); + $this->_buildHardware(); + $this->_buildMemory(); + $this->_buildFilesystems(); + $this->_buildMbinfo(); + $this->_buildUpsinfo(); + } + $this->_buildPlugins(); + $this->_xml->combinexml($this->_errors->errorsAddToXML($this->_sysinfo->getEncoding())); + } + + /** + * get the xml object + * + * @return string + */ + public function getXml() + { + $this->_buildXml(); + + return $this->_xml->getSimpleXmlElement(); + } + + /** + * include xml-trees of the plugins to the main xml + * + * @return void + */ + private function _buildPlugins() + { + $pluginroot = $this->_xml->addChild("Plugins"); + if (($this->_plugin_request || $this->_complete_request) && count($this->_plugins) > 0) { + $plugins = array(); + if ($this->_complete_request) { + $plugins = $this->_plugins; + } + if ($this->_plugin_request) { + $plugins = array($this->_plugin); + } + foreach ($plugins as $plugin) { + $object = new $plugin($this->_sysinfo->getEncoding()); + $object->execute(); + $oxml = $object->xml(); + if (sizeof($oxml) > 0) { + $pluginroot->combinexml($oxml); + } + } + } + } + + /** + * build the xml structure where the content can be inserted + * + * @return void + */ + private function _xmlbody() + { + $dom = new DOMDocument('1.0', 'UTF-8'); + $root = $dom->createElement("tns:phpsysinfo"); + $root->setAttribute('xmlns:tns', 'http://phpsysinfo.sourceforge.net/'); + $root->setAttribute('xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance'); + $root->setAttribute('xsi:schemaLocation', 'http://phpsysinfo.sourceforge.net/ phpsysinfo3.xsd'); + $dom->appendChild($root); + $this->_xml = new SimpleXMLExtended(simplexml_import_dom($dom), $this->_sysinfo->getEncoding()); + + $generation = $this->_xml->addChild('Generation'); + $generation->addAttribute('version', PSI_VERSION_STRING); + $generation->addAttribute('timestamp', time()); + $options = $this->_xml->addChild('Options'); + $options->addAttribute('tempFormat', defined('PSI_TEMP_FORMAT') ? strtolower(PSI_TEMP_FORMAT) : 'c'); + $options->addAttribute('byteFormat', defined('PSI_BYTE_FORMAT') ? strtolower(PSI_BYTE_FORMAT) : 'auto_binary'); + if (defined('PSI_REFRESH')) { + if (PSI_REFRESH === false) { + $options->addAttribute('refresh', 0); + } elseif (PSI_REFRESH === true) { + $options->addAttribute('refresh', 1); + } else { + $options->addAttribute('refresh', PSI_REFRESH); + } + } else { + $options->addAttribute('refresh', 60000); + } + if (defined('PSI_FS_USAGE_THRESHOLD')) { + if (PSI_FS_USAGE_THRESHOLD === true) { + $options->addAttribute('threshold', 1); + } elseif ((PSI_FS_USAGE_THRESHOLD !== false) && (PSI_FS_USAGE_THRESHOLD >= 1) && (PSI_FS_USAGE_THRESHOLD <= 99)) { + $options->addAttribute('threshold', PSI_FS_USAGE_THRESHOLD); + } + } else { + $options->addAttribute('threshold', 90); + } + if (count($this->_plugins) > 0) { + if ($this->_plugin_request) { + $plug = $this->_xml->addChild('UsedPlugins'); + $plug->addChild('Plugin')->addAttribute('name', $this->_plugin); + } elseif ($this->_complete_request) { + $plug = $this->_xml->addChild('UsedPlugins'); + foreach ($this->_plugins as $plugin) { + $plug->addChild('Plugin')->addAttribute('name', $plugin); + } +/* + } else { + $plug = $this->_xml->addChild('UnusedPlugins'); + foreach ($this->_plugins as $plugin) { + $plug->addChild('Plugin')->addAttribute('name', $plugin); + } +*/ + } + } + } +} diff --git a/sources/index.php b/sources/index.php new file mode 100644 index 0000000..6be1023 --- /dev/null +++ b/sources/index.php @@ -0,0 +1,96 @@ + + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version SVN: $Id: index.php 687 2012-09-06 20:54:49Z namiltd $ + * @link http://phpsysinfo.sourceforge.net + */ +/** + * define the application root path on the webserver + * @var string + */ +define('APP_ROOT', dirname(__FILE__)); + +/** + * internal xml or external + * external is needed when running in static mode + * + * @var boolean + */ +define('PSI_INTERNAL_XML', false); + +if (version_compare("5.1.3", PHP_VERSION, ">")) { + die("PHP 5.1.3 or greater is required!!!"); +} +if (!extension_loaded("pcre")) { + die("phpSysInfo requires the pcre extension to php in order to work properly."); +} + +require_once APP_ROOT.'/includes/autoloader.inc.php'; + +// Load configuration +require_once APP_ROOT.'/read_config.php'; + +if (!defined('PSI_CONFIG_FILE') || !defined('PSI_DEBUG')) { + $tpl = new Template("/templates/html/error_config.html"); + echo $tpl->fetch(); + die(); +} + +// redirect to page with and without javascript +$display = strtolower(isset($_GET['disp']) ? $_GET['disp'] : PSI_DEFAULT_DISPLAY_MODE); +switch ($display) { +case "static": + $webpage = new WebpageXSLT(); + $webpage->run(); + break; +case "dynamic": + $webpage = new Webpage(); + $webpage->run(); + break; +case "xml": + $webpage = new WebpageXML(true, null); + $webpage->run(); + break; +case "bootstrap": +/* + $tpl = new Template("/templates/html/index_bootstrap.html"); + echo $tpl->fetch(); +*/ + $webpage = new Webpage("bootstrap"); + $webpage->run(); + break; +case "auto": + $tpl = new Template("/templates/html/index_all.html"); + echo $tpl->fetch(); + break; +default: + $defaultdisplay = strtolower(PSI_DEFAULT_DISPLAY_MODE); + switch ($defaultdisplay) { + case "static": + $webpage = new WebpageXSLT(); + $webpage->run(); + break; + case "dynamic": + $webpage = new Webpage(); + $webpage->run(); + break; + case "bootstrap": + $webpage = new Webpage("bootstrap"); + $webpage->run(); + break; + default: + $tpl = new Template("/templates/html/index_all.html"); + echo $tpl->fetch(); + break; + } + break; +} diff --git a/sources/js.php b/sources/js.php new file mode 100644 index 0000000..375cb99 --- /dev/null +++ b/sources/js.php @@ -0,0 +1,85 @@ + + * @copyright 2009 phpSysInfo + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @version SVN: $Id: js.php 661 2012-08-27 11:26:39Z namiltd $ + * @link http://phpsysinfo.sourceforge.net + */ +/** + * application root path + * + * @var string + */ +define('APP_ROOT', dirname(__FILE__)); + +require_once APP_ROOT.'/includes/autoloader.inc.php'; + +require_once APP_ROOT.'/read_config.php'; + +$file = isset($_GET['name']) ? basename(htmlspecialchars($_GET['name'])) : null; +$plugin = isset($_GET['plugin']) ? basename(htmlspecialchars($_GET['plugin'])) : null; +$script = null; + +if ($file != null && $plugin == null) { + if (strtolower(substr($file, 0, 6)) == 'jquery') { + $script = APP_ROOT.'/js/jQuery/'.$file; + } elseif (strtolower(substr($file, 0, 10)) == 'phpsysinfo') { + $script = APP_ROOT.'/js/phpSysInfo/'.$file; + } else { + $script = APP_ROOT.'/js/vendor/'.$file; + } +} elseif ($file == null && $plugin != null) { + $script = APP_ROOT.'/plugins/'.strtolower($plugin).'/js/'.strtolower($plugin); +} elseif ($file != null && $plugin != null) { + $script = APP_ROOT.'/plugins/'.strtolower($plugin).'/js/'.strtolower($file); +} + +if ($script != null) { + $scriptjs = $script.'.js'; + $scriptmin = $script.'.min.js'; + $compression = false; + + header("content-type: application/x-javascript"); + + if ((!defined("PSI_DEBUG") || (PSI_DEBUG !== true)) && defined("PSI_JS_COMPRESSION")) { + $compression = strtolower(PSI_JS_COMPRESSION); + } + switch ($compression) { + case "normal": + if (file_exists($scriptmin) && is_readable($scriptmin)) { + $filecontent = file_get_contents($scriptmin); + echo $filecontent; + } elseif (file_exists($scriptjs) && is_readable($scriptjs)) { + $filecontent = file_get_contents($scriptjs); + $packer = new JavaScriptPacker($filecontent); + echo $packer->pack(); + } + break; + case "none": + if (file_exists($scriptjs) && is_readable($scriptjs)) { + $filecontent = file_get_contents($scriptjs); + $packer = new JavaScriptPacker($filecontent, 0); + echo $packer->pack(); + } elseif (file_exists($scriptmin) && is_readable($scriptmin)) { + $filecontent = file_get_contents($scriptmin); + echo $filecontent; + } + break; + default: + if (file_exists($scriptjs) && is_readable($scriptjs)) { + $filecontent = file_get_contents($scriptjs); + } elseif (file_exists($scriptmin) && is_readable($scriptmin)) { + $filecontent = file_get_contents($scriptmin); + } else break; + + echo $filecontent; + break; + } +} diff --git a/sources/js/jQuery/README b/sources/js/jQuery/README new file mode 100644 index 0000000..d16f476 --- /dev/null +++ b/sources/js/jQuery/README @@ -0,0 +1,65 @@ +versions, links and simple description of used jquery files +=========================================================== + +jquery.js +--------- +VERSION : 2.2.0 +URL : http://jquery.com/ +DESC : jQuery is a fast, concise, JavaScript Library that simplifies how you traverse HTML documents, handle + events, perform animations, and add Ajax interactions to your web pages. +USED : used for the entire userinterface + +jquery-1.js +--------- +VERSION : 1.12.0 +URL : http://jquery.com/ +DESC : jQuery is a fast, concise, JavaScript Library that simplifies how you traverse HTML documents, handle + events, perform animations, and add Ajax interactions to your web pages. +USED : used for the entire userinterface + + +jquery.dataTables.js +-------------------- +VERSION : 1.8.2+jquery1.9fix +URL : http://plugins.jquery.com/project/DataTables +DESC : dataTables is a jQuery plugin for turning a standard HTML table with THEAD and TBODY tags into a sortable + table without page refreshes. +USED : provide tablesorting for the filesystem table + +jquery.nyroModal.js +------------------- +VERSION : 1.6.2+jquery1.8fix +URL : http://plugins.jquery.com/project/nyroModal +DESC : nyroModal is a high customizable modal window plugin. +USED : provide a modal dialog, that is shown when errors are found during execution of the php parsers, or lets say + in this way: if there are error elements in the xml file + +jquery.timers.js +---------------- +VERSION : 0.1 +URL : http://plugins.jquery.com/project/Timer +DESC : provides a cleaner way to handle intervals +USED : automatic reloading of the entire page + +jquery.jgrowl.js +---------------- +VERSION : 1.2.6+jquery1.9fix+jquery3fix +URL : http://plugins.jquery.com/project/jGrowl +DESC : jGrowl is a jQuery plugin that raises unobtrusive messages within the browser, similar to the way that OS X's Growl Framework works +USED : show alert and error message + +jquery.treeTable.js +------------------- +VERSION : 2009-06-22+statefix+spanfix+altfix +URL : http://plugins.jquery.com/project/jQTreeTable; http://www.hanpau.com/index.php?page=jqtreetable +DESC : Take a plain html table, wrap the rows you want collapsing/expanding in a tbody tag with an id of treetable, map each row to it's parent row, set some options, and let jQTreeTable take it from there. +USED : Hardware, Memory, UPS blocks + +jquery.ifixpng.js +------------------- +VERSION : 2.1 (23/04/2008)+jquery1.8fix +URL : http://jquery.khurshid.com +DESC : Designed to fix that problem by applying appropriate filters to user specified elements, while keeping all element tags intact. +USED : used for the entire userinterface + +$Id: README 702 2012-09-21 16:52:32Z namiltd $ diff --git a/sources/js/jQuery/README_bootstrap b/sources/js/jQuery/README_bootstrap new file mode 100644 index 0000000..d8a38dc --- /dev/null +++ b/sources/js/jQuery/README_bootstrap @@ -0,0 +1,32 @@ +versions, links and simple description of used jquery files +=========================================================== + +jquery.js +--------- +VERSION : 2.2.0 +URL : http://jquery.com/ +DESC : jQuery is a fast, concise, JavaScript Library that simplifies how you traverse HTML documents, handle + events, perform animations, and add Ajax interactions to your web pages. +USED : used for the entire userinterface + +jquery-1.js +--------- +VERSION : 1.12.0 +URL : http://jquery.com/ +DESC : jQuery is a fast, concise, JavaScript Library that simplifies how you traverse HTML documents, handle + events, perform animations, and add Ajax interactions to your web pages. +USED : used for the entire userinterface + +jquery.treegrid.js +------------------- +VERSION : 0.3.0 +URL : http://plugins.jquery.com/treegrid/; http://maxazan.github.io/jquery-treegrid/ +DESC : TreeGrid is a lightweight and flexible jQuery plugin to create a tree grid component that renders hierarchical, nested and flat data in a table. +USED : Hardware, Memory, UPS blocks + +jquery.ifixpng.js +------------------- +VERSION : 2.1 (23/04/2008)+jquery1.8fix +URL : http://jquery.khurshid.com +DESC : Designed to fix that problem by applying appropriate filters to user specified elements, while keeping all element tags intact. +USED : used for the entire userinterface diff --git a/sources/js/jQuery/jquery-1.js b/sources/js/jQuery/jquery-1.js new file mode 100644 index 0000000..4855adc --- /dev/null +++ b/sources/js/jQuery/jquery-1.js @@ -0,0 +1,11027 @@ +/*! + * jQuery JavaScript Library v1.12.0 + * http://jquery.com/ + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2016-01-08T19:56Z + */ + +(function( global, factory ) { + + if ( typeof module === "object" && typeof module.exports === "object" ) { + // For CommonJS and CommonJS-like environments where a proper `window` + // is present, execute the factory and get jQuery. + // For environments that do not have a `window` with a `document` + // (such as Node.js), expose a factory as module.exports. + // This accentuates the need for the creation of a real `window`. + // e.g. var jQuery = require("jquery")(window); + // See ticket #14549 for more info. + module.exports = global.document ? + factory( global, true ) : + function( w ) { + if ( !w.document ) { + throw new Error( "jQuery requires a window with a document" ); + } + return factory( w ); + }; + } else { + factory( global ); + } + +// Pass this if window is not defined yet +}(typeof window !== "undefined" ? window : this, function( window, noGlobal ) { + +// Support: Firefox 18+ +// Can't be in strict mode, several libs including ASP.NET trace +// the stack via arguments.caller.callee and Firefox dies if +// you try to trace through "use strict" call chains. (#13335) +//"use strict"; +var deletedIds = []; + +var document = window.document; + +var slice = deletedIds.slice; + +var concat = deletedIds.concat; + +var push = deletedIds.push; + +var indexOf = deletedIds.indexOf; + +var class2type = {}; + +var toString = class2type.toString; + +var hasOwn = class2type.hasOwnProperty; + +var support = {}; + + + +var + version = "1.12.0", + + // Define a local copy of jQuery + jQuery = function( selector, context ) { + + // The jQuery object is actually just the init constructor 'enhanced' + // Need init if jQuery is called (just allow error to be thrown if not included) + return new jQuery.fn.init( selector, context ); + }, + + // Support: Android<4.1, IE<9 + // Make sure we trim BOM and NBSP + rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, + + // Matches dashed string for camelizing + rmsPrefix = /^-ms-/, + rdashAlpha = /-([\da-z])/gi, + + // Used by jQuery.camelCase as callback to replace() + fcamelCase = function( all, letter ) { + return letter.toUpperCase(); + }; + +jQuery.fn = jQuery.prototype = { + + // The current version of jQuery being used + jquery: version, + + constructor: jQuery, + + // Start with an empty selector + selector: "", + + // The default length of a jQuery object is 0 + length: 0, + + toArray: function() { + return slice.call( this ); + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + return num != null ? + + // Return just the one element from the set + ( num < 0 ? this[ num + this.length ] : this[ num ] ) : + + // Return all the elements in a clean array + slice.call( this ); + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems ) { + + // Build a new jQuery matched element set + var ret = jQuery.merge( this.constructor(), elems ); + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + ret.context = this.context; + + // Return the newly-formed element set + return ret; + }, + + // Execute a callback for every element in the matched set. + each: function( callback ) { + return jQuery.each( this, callback ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map( this, function( elem, i ) { + return callback.call( elem, i, elem ); + } ) ); + }, + + slice: function() { + return this.pushStack( slice.apply( this, arguments ) ); + }, + + first: function() { + return this.eq( 0 ); + }, + + last: function() { + return this.eq( -1 ); + }, + + eq: function( i ) { + var len = this.length, + j = +i + ( i < 0 ? len : 0 ); + return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); + }, + + end: function() { + return this.prevObject || this.constructor(); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push, + sort: deletedIds.sort, + splice: deletedIds.splice +}; + +jQuery.extend = jQuery.fn.extend = function() { + var src, copyIsArray, copy, name, options, clone, + target = arguments[ 0 ] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + + // skip the boolean and the target + target = arguments[ i ] || {}; + i++; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !jQuery.isFunction( target ) ) { + target = {}; + } + + // extend jQuery itself if only one argument is passed + if ( i === length ) { + target = this; + i--; + } + + for ( ; i < length; i++ ) { + + // Only deal with non-null/undefined values + if ( ( options = arguments[ i ] ) != null ) { + + // Extend the base object + for ( name in options ) { + src = target[ name ]; + copy = options[ name ]; + + // Prevent never-ending loop + if ( target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject( copy ) || + ( copyIsArray = jQuery.isArray( copy ) ) ) ) { + + if ( copyIsArray ) { + copyIsArray = false; + clone = src && jQuery.isArray( src ) ? src : []; + + } else { + clone = src && jQuery.isPlainObject( src ) ? src : {}; + } + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend( { + + // Unique for each copy of jQuery on the page + expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), + + // Assume jQuery is ready without the ready module + isReady: true, + + error: function( msg ) { + throw new Error( msg ); + }, + + noop: function() {}, + + // See test/unit/core.js for details concerning isFunction. + // Since version 1.3, DOM methods and functions like alert + // aren't supported. They return false on IE (#2968). + isFunction: function( obj ) { + return jQuery.type( obj ) === "function"; + }, + + isArray: Array.isArray || function( obj ) { + return jQuery.type( obj ) === "array"; + }, + + isWindow: function( obj ) { + /* jshint eqeqeq: false */ + return obj != null && obj == obj.window; + }, + + isNumeric: function( obj ) { + + // parseFloat NaNs numeric-cast false positives (null|true|false|"") + // ...but misinterprets leading-number strings, particularly hex literals ("0x...") + // subtraction forces infinities to NaN + // adding 1 corrects loss of precision from parseFloat (#15100) + var realStringObj = obj && obj.toString(); + return !jQuery.isArray( obj ) && ( realStringObj - parseFloat( realStringObj ) + 1 ) >= 0; + }, + + isEmptyObject: function( obj ) { + var name; + for ( name in obj ) { + return false; + } + return true; + }, + + isPlainObject: function( obj ) { + var key; + + // Must be an Object. + // Because of IE, we also have to check the presence of the constructor property. + // Make sure that DOM nodes and window objects don't pass through, as well + if ( !obj || jQuery.type( obj ) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { + return false; + } + + try { + + // Not own constructor property must be Object + if ( obj.constructor && + !hasOwn.call( obj, "constructor" ) && + !hasOwn.call( obj.constructor.prototype, "isPrototypeOf" ) ) { + return false; + } + } catch ( e ) { + + // IE8,9 Will throw exceptions on certain host objects #9897 + return false; + } + + // Support: IE<9 + // Handle iteration over inherited properties before own properties. + if ( !support.ownFirst ) { + for ( key in obj ) { + return hasOwn.call( obj, key ); + } + } + + // Own properties are enumerated firstly, so to speed up, + // if last one is own, then all properties are own. + for ( key in obj ) {} + + return key === undefined || hasOwn.call( obj, key ); + }, + + type: function( obj ) { + if ( obj == null ) { + return obj + ""; + } + return typeof obj === "object" || typeof obj === "function" ? + class2type[ toString.call( obj ) ] || "object" : + typeof obj; + }, + + // Workarounds based on findings by Jim Driscoll + // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context + globalEval: function( data ) { + if ( data && jQuery.trim( data ) ) { + + // We use execScript on Internet Explorer + // We use an anonymous function so that context is window + // rather than jQuery in Firefox + ( window.execScript || function( data ) { + window[ "eval" ].call( window, data ); // jscs:ignore requireDotNotation + } )( data ); + } + }, + + // Convert dashed to camelCase; used by the css and data modules + // Microsoft forgot to hump their vendor prefix (#9572) + camelCase: function( string ) { + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); + }, + + nodeName: function( elem, name ) { + return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); + }, + + each: function( obj, callback ) { + var length, i = 0; + + if ( isArrayLike( obj ) ) { + length = obj.length; + for ( ; i < length; i++ ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } else { + for ( i in obj ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } + + return obj; + }, + + // Support: Android<4.1, IE<9 + trim: function( text ) { + return text == null ? + "" : + ( text + "" ).replace( rtrim, "" ); + }, + + // results is for internal usage only + makeArray: function( arr, results ) { + var ret = results || []; + + if ( arr != null ) { + if ( isArrayLike( Object( arr ) ) ) { + jQuery.merge( ret, + typeof arr === "string" ? + [ arr ] : arr + ); + } else { + push.call( ret, arr ); + } + } + + return ret; + }, + + inArray: function( elem, arr, i ) { + var len; + + if ( arr ) { + if ( indexOf ) { + return indexOf.call( arr, elem, i ); + } + + len = arr.length; + i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0; + + for ( ; i < len; i++ ) { + + // Skip accessing in sparse arrays + if ( i in arr && arr[ i ] === elem ) { + return i; + } + } + } + + return -1; + }, + + merge: function( first, second ) { + var len = +second.length, + j = 0, + i = first.length; + + while ( j < len ) { + first[ i++ ] = second[ j++ ]; + } + + // Support: IE<9 + // Workaround casting of .length to NaN on otherwise arraylike objects (e.g., NodeLists) + if ( len !== len ) { + while ( second[ j ] !== undefined ) { + first[ i++ ] = second[ j++ ]; + } + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, invert ) { + var callbackInverse, + matches = [], + i = 0, + length = elems.length, + callbackExpect = !invert; + + // Go through the array, only saving the items + // that pass the validator function + for ( ; i < length; i++ ) { + callbackInverse = !callback( elems[ i ], i ); + if ( callbackInverse !== callbackExpect ) { + matches.push( elems[ i ] ); + } + } + + return matches; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var length, value, + i = 0, + ret = []; + + // Go through the array, translating each of the items to their new values + if ( isArrayLike( elems ) ) { + length = elems.length; + for ( ; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + + // Go through every key on the object, + } else { + for ( i in elems ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + } + + // Flatten any nested arrays + return concat.apply( [], ret ); + }, + + // A global GUID counter for objects + guid: 1, + + // Bind a function to a context, optionally partially applying any + // arguments. + proxy: function( fn, context ) { + var args, proxy, tmp; + + if ( typeof context === "string" ) { + tmp = fn[ context ]; + context = fn; + fn = tmp; + } + + // Quick check to determine if target is callable, in the spec + // this throws a TypeError, but we will just return undefined. + if ( !jQuery.isFunction( fn ) ) { + return undefined; + } + + // Simulated bind + args = slice.call( arguments, 2 ); + proxy = function() { + return fn.apply( context || this, args.concat( slice.call( arguments ) ) ); + }; + + // Set the guid of unique handler to the same of original handler, so it can be removed + proxy.guid = fn.guid = fn.guid || jQuery.guid++; + + return proxy; + }, + + now: function() { + return +( new Date() ); + }, + + // jQuery.support is not used in Core but other projects attach their + // properties to it so it needs to exist. + support: support +} ); + +// JSHint would error on this code due to the Symbol not being defined in ES5. +// Defining this global in .jshintrc would create a danger of using the global +// unguarded in another place, it seems safer to just disable JSHint for these +// three lines. +/* jshint ignore: start */ +if ( typeof Symbol === "function" ) { + jQuery.fn[ Symbol.iterator ] = deletedIds[ Symbol.iterator ]; +} +/* jshint ignore: end */ + +// Populate the class2type map +jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), +function( i, name ) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); +} ); + +function isArrayLike( obj ) { + + // Support: iOS 8.2 (not reproducible in simulator) + // `in` check used to prevent JIT error (gh-2145) + // hasOwn isn't used here due to false negatives + // regarding Nodelist length in IE + var length = !!obj && "length" in obj && obj.length, + type = jQuery.type( obj ); + + if ( type === "function" || jQuery.isWindow( obj ) ) { + return false; + } + + return type === "array" || length === 0 || + typeof length === "number" && length > 0 && ( length - 1 ) in obj; +} +var Sizzle = +/*! + * Sizzle CSS Selector Engine v2.2.1 + * http://sizzlejs.com/ + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2015-10-17 + */ +(function( window ) { + +var i, + support, + Expr, + getText, + isXML, + tokenize, + compile, + select, + outermostContext, + sortInput, + hasDuplicate, + + // Local document vars + setDocument, + document, + docElem, + documentIsHTML, + rbuggyQSA, + rbuggyMatches, + matches, + contains, + + // Instance-specific data + expando = "sizzle" + 1 * new Date(), + preferredDoc = window.document, + dirruns = 0, + done = 0, + classCache = createCache(), + tokenCache = createCache(), + compilerCache = createCache(), + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + } + return 0; + }, + + // General-purpose constants + MAX_NEGATIVE = 1 << 31, + + // Instance methods + hasOwn = ({}).hasOwnProperty, + arr = [], + pop = arr.pop, + push_native = arr.push, + push = arr.push, + slice = arr.slice, + // Use a stripped-down indexOf as it's faster than native + // http://jsperf.com/thor-indexof-vs-for/5 + indexOf = function( list, elem ) { + var i = 0, + len = list.length; + for ( ; i < len; i++ ) { + if ( list[i] === elem ) { + return i; + } + } + return -1; + }, + + booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", + + // Regular expressions + + // http://www.w3.org/TR/css3-selectors/#whitespace + whitespace = "[\\x20\\t\\r\\n\\f]", + + // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier + identifier = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+", + + // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors + attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + + // Operator (capture 2) + "*([*^$|!~]?=)" + whitespace + + // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + + "*\\]", + + pseudos = ":(" + identifier + ")(?:\\((" + + // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: + // 1. quoted (capture 3; capture 4 or capture 5) + "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + + // 2. simple (capture 6) + "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + + // 3. anything else (capture 2) + ".*" + + ")\\)|)", + + // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter + rwhitespace = new RegExp( whitespace + "+", "g" ), + rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), + + rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), + rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), + + rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ), + + rpseudo = new RegExp( pseudos ), + ridentifier = new RegExp( "^" + identifier + "$" ), + + matchExpr = { + "ID": new RegExp( "^#(" + identifier + ")" ), + "CLASS": new RegExp( "^\\.(" + identifier + ")" ), + "TAG": new RegExp( "^(" + identifier + "|[*])" ), + "ATTR": new RegExp( "^" + attributes ), + "PSEUDO": new RegExp( "^" + pseudos ), + "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), + "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), + // For use in libraries implementing .is() + // We use this for POS matching in `select` + "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + + whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) + }, + + rinputs = /^(?:input|select|textarea|button)$/i, + rheader = /^h\d$/i, + + rnative = /^[^{]+\{\s*\[native \w/, + + // Easily-parseable/retrievable ID or TAG or CLASS selectors + rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, + + rsibling = /[+~]/, + rescape = /'|\\/g, + + // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters + runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), + funescape = function( _, escaped, escapedWhitespace ) { + var high = "0x" + escaped - 0x10000; + // NaN means non-codepoint + // Support: Firefox<24 + // Workaround erroneous numeric interpretation of +"0x" + return high !== high || escapedWhitespace ? + escaped : + high < 0 ? + // BMP codepoint + String.fromCharCode( high + 0x10000 ) : + // Supplemental Plane codepoint (surrogate pair) + String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); + }, + + // Used for iframes + // See setDocument() + // Removing the function wrapper causes a "Permission Denied" + // error in IE + unloadHandler = function() { + setDocument(); + }; + +// Optimize for push.apply( _, NodeList ) +try { + push.apply( + (arr = slice.call( preferredDoc.childNodes )), + preferredDoc.childNodes + ); + // Support: Android<4.0 + // Detect silently failing push.apply + arr[ preferredDoc.childNodes.length ].nodeType; +} catch ( e ) { + push = { apply: arr.length ? + + // Leverage slice if possible + function( target, els ) { + push_native.apply( target, slice.call(els) ); + } : + + // Support: IE<9 + // Otherwise append directly + function( target, els ) { + var j = target.length, + i = 0; + // Can't trust NodeList.length + while ( (target[j++] = els[i++]) ) {} + target.length = j - 1; + } + }; +} + +function Sizzle( selector, context, results, seed ) { + var m, i, elem, nid, nidselect, match, groups, newSelector, + newContext = context && context.ownerDocument, + + // nodeType defaults to 9, since context defaults to document + nodeType = context ? context.nodeType : 9; + + results = results || []; + + // Return early from calls with invalid selector or context + if ( typeof selector !== "string" || !selector || + nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { + + return results; + } + + // Try to shortcut find operations (as opposed to filters) in HTML documents + if ( !seed ) { + + if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { + setDocument( context ); + } + context = context || document; + + if ( documentIsHTML ) { + + // If the selector is sufficiently simple, try using a "get*By*" DOM method + // (excepting DocumentFragment context, where the methods don't exist) + if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) { + + // ID selector + if ( (m = match[1]) ) { + + // Document context + if ( nodeType === 9 ) { + if ( (elem = context.getElementById( m )) ) { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( elem.id === m ) { + results.push( elem ); + return results; + } + } else { + return results; + } + + // Element context + } else { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( newContext && (elem = newContext.getElementById( m )) && + contains( context, elem ) && + elem.id === m ) { + + results.push( elem ); + return results; + } + } + + // Type selector + } else if ( match[2] ) { + push.apply( results, context.getElementsByTagName( selector ) ); + return results; + + // Class selector + } else if ( (m = match[3]) && support.getElementsByClassName && + context.getElementsByClassName ) { + + push.apply( results, context.getElementsByClassName( m ) ); + return results; + } + } + + // Take advantage of querySelectorAll + if ( support.qsa && + !compilerCache[ selector + " " ] && + (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { + + if ( nodeType !== 1 ) { + newContext = context; + newSelector = selector; + + // qSA looks outside Element context, which is not what we want + // Thanks to Andrew Dupont for this workaround technique + // Support: IE <=8 + // Exclude object elements + } else if ( context.nodeName.toLowerCase() !== "object" ) { + + // Capture the context ID, setting it first if necessary + if ( (nid = context.getAttribute( "id" )) ) { + nid = nid.replace( rescape, "\\$&" ); + } else { + context.setAttribute( "id", (nid = expando) ); + } + + // Prefix every selector in the list + groups = tokenize( selector ); + i = groups.length; + nidselect = ridentifier.test( nid ) ? "#" + nid : "[id='" + nid + "']"; + while ( i-- ) { + groups[i] = nidselect + " " + toSelector( groups[i] ); + } + newSelector = groups.join( "," ); + + // Expand context for sibling selectors + newContext = rsibling.test( selector ) && testContext( context.parentNode ) || + context; + } + + if ( newSelector ) { + try { + push.apply( results, + newContext.querySelectorAll( newSelector ) + ); + return results; + } catch ( qsaError ) { + } finally { + if ( nid === expando ) { + context.removeAttribute( "id" ); + } + } + } + } + } + } + + // All others + return select( selector.replace( rtrim, "$1" ), context, results, seed ); +} + +/** + * Create key-value caches of limited size + * @returns {function(string, object)} Returns the Object data after storing it on itself with + * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) + * deleting the oldest entry + */ +function createCache() { + var keys = []; + + function cache( key, value ) { + // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) + if ( keys.push( key + " " ) > Expr.cacheLength ) { + // Only keep the most recent entries + delete cache[ keys.shift() ]; + } + return (cache[ key + " " ] = value); + } + return cache; +} + +/** + * Mark a function for special use by Sizzle + * @param {Function} fn The function to mark + */ +function markFunction( fn ) { + fn[ expando ] = true; + return fn; +} + +/** + * Support testing using an element + * @param {Function} fn Passed the created div and expects a boolean result + */ +function assert( fn ) { + var div = document.createElement("div"); + + try { + return !!fn( div ); + } catch (e) { + return false; + } finally { + // Remove from its parent by default + if ( div.parentNode ) { + div.parentNode.removeChild( div ); + } + // release memory in IE + div = null; + } +} + +/** + * Adds the same handler for all of the specified attrs + * @param {String} attrs Pipe-separated list of attributes + * @param {Function} handler The method that will be applied + */ +function addHandle( attrs, handler ) { + var arr = attrs.split("|"), + i = arr.length; + + while ( i-- ) { + Expr.attrHandle[ arr[i] ] = handler; + } +} + +/** + * Checks document order of two siblings + * @param {Element} a + * @param {Element} b + * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b + */ +function siblingCheck( a, b ) { + var cur = b && a, + diff = cur && a.nodeType === 1 && b.nodeType === 1 && + ( ~b.sourceIndex || MAX_NEGATIVE ) - + ( ~a.sourceIndex || MAX_NEGATIVE ); + + // Use IE sourceIndex if available on both nodes + if ( diff ) { + return diff; + } + + // Check if b follows a + if ( cur ) { + while ( (cur = cur.nextSibling) ) { + if ( cur === b ) { + return -1; + } + } + } + + return a ? 1 : -1; +} + +/** + * Returns a function to use in pseudos for input types + * @param {String} type + */ +function createInputPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for buttons + * @param {String} type + */ +function createButtonPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for positionals + * @param {Function} fn + */ +function createPositionalPseudo( fn ) { + return markFunction(function( argument ) { + argument = +argument; + return markFunction(function( seed, matches ) { + var j, + matchIndexes = fn( [], seed.length, argument ), + i = matchIndexes.length; + + // Match elements found at the specified indexes + while ( i-- ) { + if ( seed[ (j = matchIndexes[i]) ] ) { + seed[j] = !(matches[j] = seed[j]); + } + } + }); + }); +} + +/** + * Checks a node for validity as a Sizzle context + * @param {Element|Object=} context + * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value + */ +function testContext( context ) { + return context && typeof context.getElementsByTagName !== "undefined" && context; +} + +// Expose support vars for convenience +support = Sizzle.support = {}; + +/** + * Detects XML nodes + * @param {Element|Object} elem An element or a document + * @returns {Boolean} True iff elem is a non-HTML XML node + */ +isXML = Sizzle.isXML = function( elem ) { + // documentElement is verified for cases where it doesn't yet exist + // (such as loading iframes in IE - #4833) + var documentElement = elem && (elem.ownerDocument || elem).documentElement; + return documentElement ? documentElement.nodeName !== "HTML" : false; +}; + +/** + * Sets document-related variables once based on the current document + * @param {Element|Object} [doc] An element or document object to use to set the document + * @returns {Object} Returns the current document + */ +setDocument = Sizzle.setDocument = function( node ) { + var hasCompare, parent, + doc = node ? node.ownerDocument || node : preferredDoc; + + // Return early if doc is invalid or already selected + if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { + return document; + } + + // Update global variables + document = doc; + docElem = document.documentElement; + documentIsHTML = !isXML( document ); + + // Support: IE 9-11, Edge + // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) + if ( (parent = document.defaultView) && parent.top !== parent ) { + // Support: IE 11 + if ( parent.addEventListener ) { + parent.addEventListener( "unload", unloadHandler, false ); + + // Support: IE 9 - 10 only + } else if ( parent.attachEvent ) { + parent.attachEvent( "onunload", unloadHandler ); + } + } + + /* Attributes + ---------------------------------------------------------------------- */ + + // Support: IE<8 + // Verify that getAttribute really returns attributes and not properties + // (excepting IE8 booleans) + support.attributes = assert(function( div ) { + div.className = "i"; + return !div.getAttribute("className"); + }); + + /* getElement(s)By* + ---------------------------------------------------------------------- */ + + // Check if getElementsByTagName("*") returns only elements + support.getElementsByTagName = assert(function( div ) { + div.appendChild( document.createComment("") ); + return !div.getElementsByTagName("*").length; + }); + + // Support: IE<9 + support.getElementsByClassName = rnative.test( document.getElementsByClassName ); + + // Support: IE<10 + // Check if getElementById returns elements by name + // The broken getElementById methods don't pick up programatically-set names, + // so use a roundabout getElementsByName test + support.getById = assert(function( div ) { + docElem.appendChild( div ).id = expando; + return !document.getElementsByName || !document.getElementsByName( expando ).length; + }); + + // ID find and filter + if ( support.getById ) { + Expr.find["ID"] = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var m = context.getElementById( id ); + return m ? [ m ] : []; + } + }; + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + return elem.getAttribute("id") === attrId; + }; + }; + } else { + // Support: IE6/7 + // getElementById is not reliable as a find shortcut + delete Expr.find["ID"]; + + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + var node = typeof elem.getAttributeNode !== "undefined" && + elem.getAttributeNode("id"); + return node && node.value === attrId; + }; + }; + } + + // Tag + Expr.find["TAG"] = support.getElementsByTagName ? + function( tag, context ) { + if ( typeof context.getElementsByTagName !== "undefined" ) { + return context.getElementsByTagName( tag ); + + // DocumentFragment nodes don't have gEBTN + } else if ( support.qsa ) { + return context.querySelectorAll( tag ); + } + } : + + function( tag, context ) { + var elem, + tmp = [], + i = 0, + // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too + results = context.getElementsByTagName( tag ); + + // Filter out possible comments + if ( tag === "*" ) { + while ( (elem = results[i++]) ) { + if ( elem.nodeType === 1 ) { + tmp.push( elem ); + } + } + + return tmp; + } + return results; + }; + + // Class + Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { + if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { + return context.getElementsByClassName( className ); + } + }; + + /* QSA/matchesSelector + ---------------------------------------------------------------------- */ + + // QSA and matchesSelector support + + // matchesSelector(:active) reports false when true (IE9/Opera 11.5) + rbuggyMatches = []; + + // qSa(:focus) reports false when true (Chrome 21) + // We allow this because of a bug in IE8/9 that throws an error + // whenever `document.activeElement` is accessed on an iframe + // So, we allow :focus to pass through QSA all the time to avoid the IE error + // See http://bugs.jquery.com/ticket/13378 + rbuggyQSA = []; + + if ( (support.qsa = rnative.test( document.querySelectorAll )) ) { + // Build QSA regex + // Regex strategy adopted from Diego Perini + assert(function( div ) { + // Select is set to empty string on purpose + // This is to test IE's treatment of not explicitly + // setting a boolean content attribute, + // since its presence should be enough + // http://bugs.jquery.com/ticket/12359 + docElem.appendChild( div ).innerHTML = "" + + ""; + + // Support: IE8, Opera 11-12.16 + // Nothing should be selected when empty strings follow ^= or $= or *= + // The test attribute must be unknown in Opera but "safe" for WinRT + // http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section + if ( div.querySelectorAll("[msallowcapture^='']").length ) { + rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); + } + + // Support: IE8 + // Boolean attributes and "value" are not treated correctly + if ( !div.querySelectorAll("[selected]").length ) { + rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); + } + + // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ + if ( !div.querySelectorAll( "[id~=" + expando + "-]" ).length ) { + rbuggyQSA.push("~="); + } + + // Webkit/Opera - :checked should return selected option elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + // IE8 throws error here and will not see later tests + if ( !div.querySelectorAll(":checked").length ) { + rbuggyQSA.push(":checked"); + } + + // Support: Safari 8+, iOS 8+ + // https://bugs.webkit.org/show_bug.cgi?id=136851 + // In-page `selector#id sibing-combinator selector` fails + if ( !div.querySelectorAll( "a#" + expando + "+*" ).length ) { + rbuggyQSA.push(".#.+[+~]"); + } + }); + + assert(function( div ) { + // Support: Windows 8 Native Apps + // The type and name attributes are restricted during .innerHTML assignment + var input = document.createElement("input"); + input.setAttribute( "type", "hidden" ); + div.appendChild( input ).setAttribute( "name", "D" ); + + // Support: IE8 + // Enforce case-sensitivity of name attribute + if ( div.querySelectorAll("[name=d]").length ) { + rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); + } + + // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) + // IE8 throws error here and will not see later tests + if ( !div.querySelectorAll(":enabled").length ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Opera 10-11 does not throw on post-comma invalid pseudos + div.querySelectorAll("*,:x"); + rbuggyQSA.push(",.*:"); + }); + } + + if ( (support.matchesSelector = rnative.test( (matches = docElem.matches || + docElem.webkitMatchesSelector || + docElem.mozMatchesSelector || + docElem.oMatchesSelector || + docElem.msMatchesSelector) )) ) { + + assert(function( div ) { + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9) + support.disconnectedMatch = matches.call( div, "div" ); + + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( div, "[s!='']:x" ); + rbuggyMatches.push( "!=", pseudos ); + }); + } + + rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") ); + rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") ); + + /* Contains + ---------------------------------------------------------------------- */ + hasCompare = rnative.test( docElem.compareDocumentPosition ); + + // Element contains another + // Purposefully self-exclusive + // As in, an element does not contain itself + contains = hasCompare || rnative.test( docElem.contains ) ? + function( a, b ) { + var adown = a.nodeType === 9 ? a.documentElement : a, + bup = b && b.parentNode; + return a === bup || !!( bup && bup.nodeType === 1 && ( + adown.contains ? + adown.contains( bup ) : + a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 + )); + } : + function( a, b ) { + if ( b ) { + while ( (b = b.parentNode) ) { + if ( b === a ) { + return true; + } + } + } + return false; + }; + + /* Sorting + ---------------------------------------------------------------------- */ + + // Document order sorting + sortOrder = hasCompare ? + function( a, b ) { + + // Flag for duplicate removal + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + // Sort on method existence if only one input has compareDocumentPosition + var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; + if ( compare ) { + return compare; + } + + // Calculate position if both inputs belong to the same document + compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ? + a.compareDocumentPosition( b ) : + + // Otherwise we know they are disconnected + 1; + + // Disconnected nodes + if ( compare & 1 || + (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) { + + // Choose the first element that is related to our preferred document + if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) { + return -1; + } + if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) { + return 1; + } + + // Maintain original order + return sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + } + + return compare & 4 ? -1 : 1; + } : + function( a, b ) { + // Exit early if the nodes are identical + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + var cur, + i = 0, + aup = a.parentNode, + bup = b.parentNode, + ap = [ a ], + bp = [ b ]; + + // Parentless nodes are either documents or disconnected + if ( !aup || !bup ) { + return a === document ? -1 : + b === document ? 1 : + aup ? -1 : + bup ? 1 : + sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + + // If the nodes are siblings, we can do a quick check + } else if ( aup === bup ) { + return siblingCheck( a, b ); + } + + // Otherwise we need full lists of their ancestors for comparison + cur = a; + while ( (cur = cur.parentNode) ) { + ap.unshift( cur ); + } + cur = b; + while ( (cur = cur.parentNode) ) { + bp.unshift( cur ); + } + + // Walk down the tree looking for a discrepancy + while ( ap[i] === bp[i] ) { + i++; + } + + return i ? + // Do a sibling check if the nodes have a common ancestor + siblingCheck( ap[i], bp[i] ) : + + // Otherwise nodes in our document sort first + ap[i] === preferredDoc ? -1 : + bp[i] === preferredDoc ? 1 : + 0; + }; + + return document; +}; + +Sizzle.matches = function( expr, elements ) { + return Sizzle( expr, null, null, elements ); +}; + +Sizzle.matchesSelector = function( elem, expr ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + // Make sure that attribute selectors are quoted + expr = expr.replace( rattributeQuotes, "='$1']" ); + + if ( support.matchesSelector && documentIsHTML && + !compilerCache[ expr + " " ] && + ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && + ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { + + try { + var ret = matches.call( elem, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || support.disconnectedMatch || + // As well, disconnected nodes are said to be in a document + // fragment in IE 9 + elem.document && elem.document.nodeType !== 11 ) { + return ret; + } + } catch (e) {} + } + + return Sizzle( expr, document, null, [ elem ] ).length > 0; +}; + +Sizzle.contains = function( context, elem ) { + // Set document vars if needed + if ( ( context.ownerDocument || context ) !== document ) { + setDocument( context ); + } + return contains( context, elem ); +}; + +Sizzle.attr = function( elem, name ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + var fn = Expr.attrHandle[ name.toLowerCase() ], + // Don't get fooled by Object.prototype properties (jQuery #13807) + val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? + fn( elem, name, !documentIsHTML ) : + undefined; + + return val !== undefined ? + val : + support.attributes || !documentIsHTML ? + elem.getAttribute( name ) : + (val = elem.getAttributeNode(name)) && val.specified ? + val.value : + null; +}; + +Sizzle.error = function( msg ) { + throw new Error( "Syntax error, unrecognized expression: " + msg ); +}; + +/** + * Document sorting and removing duplicates + * @param {ArrayLike} results + */ +Sizzle.uniqueSort = function( results ) { + var elem, + duplicates = [], + j = 0, + i = 0; + + // Unless we *know* we can detect duplicates, assume their presence + hasDuplicate = !support.detectDuplicates; + sortInput = !support.sortStable && results.slice( 0 ); + results.sort( sortOrder ); + + if ( hasDuplicate ) { + while ( (elem = results[i++]) ) { + if ( elem === results[ i ] ) { + j = duplicates.push( i ); + } + } + while ( j-- ) { + results.splice( duplicates[ j ], 1 ); + } + } + + // Clear input after sorting to release objects + // See https://github.com/jquery/sizzle/pull/225 + sortInput = null; + + return results; +}; + +/** + * Utility function for retrieving the text value of an array of DOM nodes + * @param {Array|Element} elem + */ +getText = Sizzle.getText = function( elem ) { + var node, + ret = "", + i = 0, + nodeType = elem.nodeType; + + if ( !nodeType ) { + // If no nodeType, this is expected to be an array + while ( (node = elem[i++]) ) { + // Do not traverse comment nodes + ret += getText( node ); + } + } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { + // Use textContent for elements + // innerText usage removed for consistency of new lines (jQuery #11153) + if ( typeof elem.textContent === "string" ) { + return elem.textContent; + } else { + // Traverse its children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + ret += getText( elem ); + } + } + } else if ( nodeType === 3 || nodeType === 4 ) { + return elem.nodeValue; + } + // Do not include comment or processing instruction nodes + + return ret; +}; + +Expr = Sizzle.selectors = { + + // Can be adjusted by the user + cacheLength: 50, + + createPseudo: markFunction, + + match: matchExpr, + + attrHandle: {}, + + find: {}, + + relative: { + ">": { dir: "parentNode", first: true }, + " ": { dir: "parentNode" }, + "+": { dir: "previousSibling", first: true }, + "~": { dir: "previousSibling" } + }, + + preFilter: { + "ATTR": function( match ) { + match[1] = match[1].replace( runescape, funescape ); + + // Move the given value to match[3] whether quoted or unquoted + match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape ); + + if ( match[2] === "~=" ) { + match[3] = " " + match[3] + " "; + } + + return match.slice( 0, 4 ); + }, + + "CHILD": function( match ) { + /* matches from matchExpr["CHILD"] + 1 type (only|nth|...) + 2 what (child|of-type) + 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) + 4 xn-component of xn+y argument ([+-]?\d*n|) + 5 sign of xn-component + 6 x of xn-component + 7 sign of y-component + 8 y of y-component + */ + match[1] = match[1].toLowerCase(); + + if ( match[1].slice( 0, 3 ) === "nth" ) { + // nth-* requires argument + if ( !match[3] ) { + Sizzle.error( match[0] ); + } + + // numeric x and y parameters for Expr.filter.CHILD + // remember that false/true cast respectively to 0/1 + match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); + match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); + + // other types prohibit arguments + } else if ( match[3] ) { + Sizzle.error( match[0] ); + } + + return match; + }, + + "PSEUDO": function( match ) { + var excess, + unquoted = !match[6] && match[2]; + + if ( matchExpr["CHILD"].test( match[0] ) ) { + return null; + } + + // Accept quoted arguments as-is + if ( match[3] ) { + match[2] = match[4] || match[5] || ""; + + // Strip excess characters from unquoted arguments + } else if ( unquoted && rpseudo.test( unquoted ) && + // Get excess from tokenize (recursively) + (excess = tokenize( unquoted, true )) && + // advance to the next closing parenthesis + (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { + + // excess is a negative index + match[0] = match[0].slice( 0, excess ); + match[2] = unquoted.slice( 0, excess ); + } + + // Return only captures needed by the pseudo filter method (type and argument) + return match.slice( 0, 3 ); + } + }, + + filter: { + + "TAG": function( nodeNameSelector ) { + var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); + return nodeNameSelector === "*" ? + function() { return true; } : + function( elem ) { + return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; + }; + }, + + "CLASS": function( className ) { + var pattern = classCache[ className + " " ]; + + return pattern || + (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && + classCache( className, function( elem ) { + return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" ); + }); + }, + + "ATTR": function( name, operator, check ) { + return function( elem ) { + var result = Sizzle.attr( elem, name ); + + if ( result == null ) { + return operator === "!="; + } + if ( !operator ) { + return true; + } + + result += ""; + + return operator === "=" ? result === check : + operator === "!=" ? result !== check : + operator === "^=" ? check && result.indexOf( check ) === 0 : + operator === "*=" ? check && result.indexOf( check ) > -1 : + operator === "$=" ? check && result.slice( -check.length ) === check : + operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : + operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : + false; + }; + }, + + "CHILD": function( type, what, argument, first, last ) { + var simple = type.slice( 0, 3 ) !== "nth", + forward = type.slice( -4 ) !== "last", + ofType = what === "of-type"; + + return first === 1 && last === 0 ? + + // Shortcut for :nth-*(n) + function( elem ) { + return !!elem.parentNode; + } : + + function( elem, context, xml ) { + var cache, uniqueCache, outerCache, node, nodeIndex, start, + dir = simple !== forward ? "nextSibling" : "previousSibling", + parent = elem.parentNode, + name = ofType && elem.nodeName.toLowerCase(), + useCache = !xml && !ofType, + diff = false; + + if ( parent ) { + + // :(first|last|only)-(child|of-type) + if ( simple ) { + while ( dir ) { + node = elem; + while ( (node = node[ dir ]) ) { + if ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) { + + return false; + } + } + // Reverse direction for :only-* (if we haven't yet done so) + start = dir = type === "only" && !start && "nextSibling"; + } + return true; + } + + start = [ forward ? parent.firstChild : parent.lastChild ]; + + // non-xml :nth-child(...) stores cache data on `parent` + if ( forward && useCache ) { + + // Seek `elem` from a previously-cached index + + // ...in a gzip-friendly way + node = parent; + outerCache = node[ expando ] || (node[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex && cache[ 2 ]; + node = nodeIndex && parent.childNodes[ nodeIndex ]; + + while ( (node = ++nodeIndex && node && node[ dir ] || + + // Fallback to seeking `elem` from the start + (diff = nodeIndex = 0) || start.pop()) ) { + + // When found, cache indexes on `parent` and break + if ( node.nodeType === 1 && ++diff && node === elem ) { + uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; + break; + } + } + + } else { + // Use previously-cached element index if available + if ( useCache ) { + // ...in a gzip-friendly way + node = elem; + outerCache = node[ expando ] || (node[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex; + } + + // xml :nth-child(...) + // or :nth-last-child(...) or :nth(-last)?-of-type(...) + if ( diff === false ) { + // Use the same loop as above to seek `elem` from the start + while ( (node = ++nodeIndex && node && node[ dir ] || + (diff = nodeIndex = 0) || start.pop()) ) { + + if ( ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) && + ++diff ) { + + // Cache the index of each encountered element + if ( useCache ) { + outerCache = node[ expando ] || (node[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); + + uniqueCache[ type ] = [ dirruns, diff ]; + } + + if ( node === elem ) { + break; + } + } + } + } + } + + // Incorporate the offset, then check against cycle size + diff -= last; + return diff === first || ( diff % first === 0 && diff / first >= 0 ); + } + }; + }, + + "PSEUDO": function( pseudo, argument ) { + // pseudo-class names are case-insensitive + // http://www.w3.org/TR/selectors/#pseudo-classes + // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters + // Remember that setFilters inherits from pseudos + var args, + fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || + Sizzle.error( "unsupported pseudo: " + pseudo ); + + // The user may use createPseudo to indicate that + // arguments are needed to create the filter function + // just as Sizzle does + if ( fn[ expando ] ) { + return fn( argument ); + } + + // But maintain support for old signatures + if ( fn.length > 1 ) { + args = [ pseudo, pseudo, "", argument ]; + return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? + markFunction(function( seed, matches ) { + var idx, + matched = fn( seed, argument ), + i = matched.length; + while ( i-- ) { + idx = indexOf( seed, matched[i] ); + seed[ idx ] = !( matches[ idx ] = matched[i] ); + } + }) : + function( elem ) { + return fn( elem, 0, args ); + }; + } + + return fn; + } + }, + + pseudos: { + // Potentially complex pseudos + "not": markFunction(function( selector ) { + // Trim the selector passed to compile + // to avoid treating leading and trailing + // spaces as combinators + var input = [], + results = [], + matcher = compile( selector.replace( rtrim, "$1" ) ); + + return matcher[ expando ] ? + markFunction(function( seed, matches, context, xml ) { + var elem, + unmatched = matcher( seed, null, xml, [] ), + i = seed.length; + + // Match elements unmatched by `matcher` + while ( i-- ) { + if ( (elem = unmatched[i]) ) { + seed[i] = !(matches[i] = elem); + } + } + }) : + function( elem, context, xml ) { + input[0] = elem; + matcher( input, null, xml, results ); + // Don't keep the element (issue #299) + input[0] = null; + return !results.pop(); + }; + }), + + "has": markFunction(function( selector ) { + return function( elem ) { + return Sizzle( selector, elem ).length > 0; + }; + }), + + "contains": markFunction(function( text ) { + text = text.replace( runescape, funescape ); + return function( elem ) { + return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; + }; + }), + + // "Whether an element is represented by a :lang() selector + // is based solely on the element's language value + // being equal to the identifier C, + // or beginning with the identifier C immediately followed by "-". + // The matching of C against the element's language value is performed case-insensitively. + // The identifier C does not have to be a valid language name." + // http://www.w3.org/TR/selectors/#lang-pseudo + "lang": markFunction( function( lang ) { + // lang value must be a valid identifier + if ( !ridentifier.test(lang || "") ) { + Sizzle.error( "unsupported lang: " + lang ); + } + lang = lang.replace( runescape, funescape ).toLowerCase(); + return function( elem ) { + var elemLang; + do { + if ( (elemLang = documentIsHTML ? + elem.lang : + elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) { + + elemLang = elemLang.toLowerCase(); + return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; + } + } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); + return false; + }; + }), + + // Miscellaneous + "target": function( elem ) { + var hash = window.location && window.location.hash; + return hash && hash.slice( 1 ) === elem.id; + }, + + "root": function( elem ) { + return elem === docElem; + }, + + "focus": function( elem ) { + return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); + }, + + // Boolean properties + "enabled": function( elem ) { + return elem.disabled === false; + }, + + "disabled": function( elem ) { + return elem.disabled === true; + }, + + "checked": function( elem ) { + // In CSS3, :checked should return both checked and selected elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + var nodeName = elem.nodeName.toLowerCase(); + return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); + }, + + "selected": function( elem ) { + // Accessing this property makes selected-by-default + // options in Safari work properly + if ( elem.parentNode ) { + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + // Contents + "empty": function( elem ) { + // http://www.w3.org/TR/selectors/#empty-pseudo + // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), + // but not by others (comment: 8; processing instruction: 7; etc.) + // nodeType < 6 works because attributes (2) do not appear as children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + if ( elem.nodeType < 6 ) { + return false; + } + } + return true; + }, + + "parent": function( elem ) { + return !Expr.pseudos["empty"]( elem ); + }, + + // Element/input types + "header": function( elem ) { + return rheader.test( elem.nodeName ); + }, + + "input": function( elem ) { + return rinputs.test( elem.nodeName ); + }, + + "button": function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === "button" || name === "button"; + }, + + "text": function( elem ) { + var attr; + return elem.nodeName.toLowerCase() === "input" && + elem.type === "text" && + + // Support: IE<8 + // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" + ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" ); + }, + + // Position-in-collection + "first": createPositionalPseudo(function() { + return [ 0 ]; + }), + + "last": createPositionalPseudo(function( matchIndexes, length ) { + return [ length - 1 ]; + }), + + "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { + return [ argument < 0 ? argument + length : argument ]; + }), + + "even": createPositionalPseudo(function( matchIndexes, length ) { + var i = 0; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "odd": createPositionalPseudo(function( matchIndexes, length ) { + var i = 1; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; --i >= 0; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; ++i < length; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }) + } +}; + +Expr.pseudos["nth"] = Expr.pseudos["eq"]; + +// Add button/input type pseudos +for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { + Expr.pseudos[ i ] = createInputPseudo( i ); +} +for ( i in { submit: true, reset: true } ) { + Expr.pseudos[ i ] = createButtonPseudo( i ); +} + +// Easy API for creating new setFilters +function setFilters() {} +setFilters.prototype = Expr.filters = Expr.pseudos; +Expr.setFilters = new setFilters(); + +tokenize = Sizzle.tokenize = function( selector, parseOnly ) { + var matched, match, tokens, type, + soFar, groups, preFilters, + cached = tokenCache[ selector + " " ]; + + if ( cached ) { + return parseOnly ? 0 : cached.slice( 0 ); + } + + soFar = selector; + groups = []; + preFilters = Expr.preFilter; + + while ( soFar ) { + + // Comma and first run + if ( !matched || (match = rcomma.exec( soFar )) ) { + if ( match ) { + // Don't consume trailing commas as valid + soFar = soFar.slice( match[0].length ) || soFar; + } + groups.push( (tokens = []) ); + } + + matched = false; + + // Combinators + if ( (match = rcombinators.exec( soFar )) ) { + matched = match.shift(); + tokens.push({ + value: matched, + // Cast descendant combinators to space + type: match[0].replace( rtrim, " " ) + }); + soFar = soFar.slice( matched.length ); + } + + // Filters + for ( type in Expr.filter ) { + if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || + (match = preFilters[ type ]( match ))) ) { + matched = match.shift(); + tokens.push({ + value: matched, + type: type, + matches: match + }); + soFar = soFar.slice( matched.length ); + } + } + + if ( !matched ) { + break; + } + } + + // Return the length of the invalid excess + // if we're just parsing + // Otherwise, throw an error or return tokens + return parseOnly ? + soFar.length : + soFar ? + Sizzle.error( selector ) : + // Cache the tokens + tokenCache( selector, groups ).slice( 0 ); +}; + +function toSelector( tokens ) { + var i = 0, + len = tokens.length, + selector = ""; + for ( ; i < len; i++ ) { + selector += tokens[i].value; + } + return selector; +} + +function addCombinator( matcher, combinator, base ) { + var dir = combinator.dir, + checkNonElements = base && dir === "parentNode", + doneName = done++; + + return combinator.first ? + // Check against closest ancestor/preceding element + function( elem, context, xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + return matcher( elem, context, xml ); + } + } + } : + + // Check against all ancestor/preceding elements + function( elem, context, xml ) { + var oldCache, uniqueCache, outerCache, + newCache = [ dirruns, doneName ]; + + // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching + if ( xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + if ( matcher( elem, context, xml ) ) { + return true; + } + } + } + } else { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + outerCache = elem[ expando ] || (elem[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {}); + + if ( (oldCache = uniqueCache[ dir ]) && + oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { + + // Assign to newCache so results back-propagate to previous elements + return (newCache[ 2 ] = oldCache[ 2 ]); + } else { + // Reuse newcache so results back-propagate to previous elements + uniqueCache[ dir ] = newCache; + + // A match means we're done; a fail means we have to keep checking + if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) { + return true; + } + } + } + } + } + }; +} + +function elementMatcher( matchers ) { + return matchers.length > 1 ? + function( elem, context, xml ) { + var i = matchers.length; + while ( i-- ) { + if ( !matchers[i]( elem, context, xml ) ) { + return false; + } + } + return true; + } : + matchers[0]; +} + +function multipleContexts( selector, contexts, results ) { + var i = 0, + len = contexts.length; + for ( ; i < len; i++ ) { + Sizzle( selector, contexts[i], results ); + } + return results; +} + +function condense( unmatched, map, filter, context, xml ) { + var elem, + newUnmatched = [], + i = 0, + len = unmatched.length, + mapped = map != null; + + for ( ; i < len; i++ ) { + if ( (elem = unmatched[i]) ) { + if ( !filter || filter( elem, context, xml ) ) { + newUnmatched.push( elem ); + if ( mapped ) { + map.push( i ); + } + } + } + } + + return newUnmatched; +} + +function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { + if ( postFilter && !postFilter[ expando ] ) { + postFilter = setMatcher( postFilter ); + } + if ( postFinder && !postFinder[ expando ] ) { + postFinder = setMatcher( postFinder, postSelector ); + } + return markFunction(function( seed, results, context, xml ) { + var temp, i, elem, + preMap = [], + postMap = [], + preexisting = results.length, + + // Get initial elements from seed or context + elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), + + // Prefilter to get matcher input, preserving a map for seed-results synchronization + matcherIn = preFilter && ( seed || !selector ) ? + condense( elems, preMap, preFilter, context, xml ) : + elems, + + matcherOut = matcher ? + // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, + postFinder || ( seed ? preFilter : preexisting || postFilter ) ? + + // ...intermediate processing is necessary + [] : + + // ...otherwise use results directly + results : + matcherIn; + + // Find primary matches + if ( matcher ) { + matcher( matcherIn, matcherOut, context, xml ); + } + + // Apply postFilter + if ( postFilter ) { + temp = condense( matcherOut, postMap ); + postFilter( temp, [], context, xml ); + + // Un-match failing elements by moving them back to matcherIn + i = temp.length; + while ( i-- ) { + if ( (elem = temp[i]) ) { + matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); + } + } + } + + if ( seed ) { + if ( postFinder || preFilter ) { + if ( postFinder ) { + // Get the final matcherOut by condensing this intermediate into postFinder contexts + temp = []; + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) ) { + // Restore matcherIn since elem is not yet a final match + temp.push( (matcherIn[i] = elem) ); + } + } + postFinder( null, (matcherOut = []), temp, xml ); + } + + // Move matched elements from seed to results to keep them synchronized + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) && + (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) { + + seed[temp] = !(results[temp] = elem); + } + } + } + + // Add elements to results, through postFinder if defined + } else { + matcherOut = condense( + matcherOut === results ? + matcherOut.splice( preexisting, matcherOut.length ) : + matcherOut + ); + if ( postFinder ) { + postFinder( null, results, matcherOut, xml ); + } else { + push.apply( results, matcherOut ); + } + } + }); +} + +function matcherFromTokens( tokens ) { + var checkContext, matcher, j, + len = tokens.length, + leadingRelative = Expr.relative[ tokens[0].type ], + implicitRelative = leadingRelative || Expr.relative[" "], + i = leadingRelative ? 1 : 0, + + // The foundational matcher ensures that elements are reachable from top-level context(s) + matchContext = addCombinator( function( elem ) { + return elem === checkContext; + }, implicitRelative, true ), + matchAnyContext = addCombinator( function( elem ) { + return indexOf( checkContext, elem ) > -1; + }, implicitRelative, true ), + matchers = [ function( elem, context, xml ) { + var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( + (checkContext = context).nodeType ? + matchContext( elem, context, xml ) : + matchAnyContext( elem, context, xml ) ); + // Avoid hanging onto element (issue #299) + checkContext = null; + return ret; + } ]; + + for ( ; i < len; i++ ) { + if ( (matcher = Expr.relative[ tokens[i].type ]) ) { + matchers = [ addCombinator(elementMatcher( matchers ), matcher) ]; + } else { + matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); + + // Return special upon seeing a positional matcher + if ( matcher[ expando ] ) { + // Find the next relative operator (if any) for proper handling + j = ++i; + for ( ; j < len; j++ ) { + if ( Expr.relative[ tokens[j].type ] ) { + break; + } + } + return setMatcher( + i > 1 && elementMatcher( matchers ), + i > 1 && toSelector( + // If the preceding token was a descendant combinator, insert an implicit any-element `*` + tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" }) + ).replace( rtrim, "$1" ), + matcher, + i < j && matcherFromTokens( tokens.slice( i, j ) ), + j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), + j < len && toSelector( tokens ) + ); + } + matchers.push( matcher ); + } + } + + return elementMatcher( matchers ); +} + +function matcherFromGroupMatchers( elementMatchers, setMatchers ) { + var bySet = setMatchers.length > 0, + byElement = elementMatchers.length > 0, + superMatcher = function( seed, context, xml, results, outermost ) { + var elem, j, matcher, + matchedCount = 0, + i = "0", + unmatched = seed && [], + setMatched = [], + contextBackup = outermostContext, + // We must always have either seed elements or outermost context + elems = seed || byElement && Expr.find["TAG"]( "*", outermost ), + // Use integer dirruns iff this is the outermost matcher + dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1), + len = elems.length; + + if ( outermost ) { + outermostContext = context === document || context || outermost; + } + + // Add elements passing elementMatchers directly to results + // Support: IE<9, Safari + // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id + for ( ; i !== len && (elem = elems[i]) != null; i++ ) { + if ( byElement && elem ) { + j = 0; + if ( !context && elem.ownerDocument !== document ) { + setDocument( elem ); + xml = !documentIsHTML; + } + while ( (matcher = elementMatchers[j++]) ) { + if ( matcher( elem, context || document, xml) ) { + results.push( elem ); + break; + } + } + if ( outermost ) { + dirruns = dirrunsUnique; + } + } + + // Track unmatched elements for set filters + if ( bySet ) { + // They will have gone through all possible matchers + if ( (elem = !matcher && elem) ) { + matchedCount--; + } + + // Lengthen the array for every element, matched or not + if ( seed ) { + unmatched.push( elem ); + } + } + } + + // `i` is now the count of elements visited above, and adding it to `matchedCount` + // makes the latter nonnegative. + matchedCount += i; + + // Apply set filters to unmatched elements + // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` + // equals `i`), unless we didn't visit _any_ elements in the above loop because we have + // no element matchers and no seed. + // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that + // case, which will result in a "00" `matchedCount` that differs from `i` but is also + // numerically zero. + if ( bySet && i !== matchedCount ) { + j = 0; + while ( (matcher = setMatchers[j++]) ) { + matcher( unmatched, setMatched, context, xml ); + } + + if ( seed ) { + // Reintegrate element matches to eliminate the need for sorting + if ( matchedCount > 0 ) { + while ( i-- ) { + if ( !(unmatched[i] || setMatched[i]) ) { + setMatched[i] = pop.call( results ); + } + } + } + + // Discard index placeholder values to get only actual matches + setMatched = condense( setMatched ); + } + + // Add matches to results + push.apply( results, setMatched ); + + // Seedless set matches succeeding multiple successful matchers stipulate sorting + if ( outermost && !seed && setMatched.length > 0 && + ( matchedCount + setMatchers.length ) > 1 ) { + + Sizzle.uniqueSort( results ); + } + } + + // Override manipulation of globals by nested matchers + if ( outermost ) { + dirruns = dirrunsUnique; + outermostContext = contextBackup; + } + + return unmatched; + }; + + return bySet ? + markFunction( superMatcher ) : + superMatcher; +} + +compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { + var i, + setMatchers = [], + elementMatchers = [], + cached = compilerCache[ selector + " " ]; + + if ( !cached ) { + // Generate a function of recursive functions that can be used to check each element + if ( !match ) { + match = tokenize( selector ); + } + i = match.length; + while ( i-- ) { + cached = matcherFromTokens( match[i] ); + if ( cached[ expando ] ) { + setMatchers.push( cached ); + } else { + elementMatchers.push( cached ); + } + } + + // Cache the compiled function + cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); + + // Save selector and tokenization + cached.selector = selector; + } + return cached; +}; + +/** + * A low-level selection function that works with Sizzle's compiled + * selector functions + * @param {String|Function} selector A selector or a pre-compiled + * selector function built with Sizzle.compile + * @param {Element} context + * @param {Array} [results] + * @param {Array} [seed] A set of elements to match against + */ +select = Sizzle.select = function( selector, context, results, seed ) { + var i, tokens, token, type, find, + compiled = typeof selector === "function" && selector, + match = !seed && tokenize( (selector = compiled.selector || selector) ); + + results = results || []; + + // Try to minimize operations if there is only one selector in the list and no seed + // (the latter of which guarantees us context) + if ( match.length === 1 ) { + + // Reduce context if the leading compound selector is an ID + tokens = match[0] = match[0].slice( 0 ); + if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && + support.getById && context.nodeType === 9 && documentIsHTML && + Expr.relative[ tokens[1].type ] ) { + + context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; + if ( !context ) { + return results; + + // Precompiled matchers will still verify ancestry, so step up a level + } else if ( compiled ) { + context = context.parentNode; + } + + selector = selector.slice( tokens.shift().value.length ); + } + + // Fetch a seed set for right-to-left matching + i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; + while ( i-- ) { + token = tokens[i]; + + // Abort if we hit a combinator + if ( Expr.relative[ (type = token.type) ] ) { + break; + } + if ( (find = Expr.find[ type ]) ) { + // Search, expanding context for leading sibling combinators + if ( (seed = find( + token.matches[0].replace( runescape, funescape ), + rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context + )) ) { + + // If seed is empty or no tokens remain, we can return early + tokens.splice( i, 1 ); + selector = seed.length && toSelector( tokens ); + if ( !selector ) { + push.apply( results, seed ); + return results; + } + + break; + } + } + } + } + + // Compile and execute a filtering function if one is not provided + // Provide `match` to avoid retokenization if we modified the selector above + ( compiled || compile( selector, match ) )( + seed, + context, + !documentIsHTML, + results, + !context || rsibling.test( selector ) && testContext( context.parentNode ) || context + ); + return results; +}; + +// One-time assignments + +// Sort stability +support.sortStable = expando.split("").sort( sortOrder ).join("") === expando; + +// Support: Chrome 14-35+ +// Always assume duplicates if they aren't passed to the comparison function +support.detectDuplicates = !!hasDuplicate; + +// Initialize against the default document +setDocument(); + +// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) +// Detached nodes confoundingly follow *each other* +support.sortDetached = assert(function( div1 ) { + // Should return 1, but returns 4 (following) + return div1.compareDocumentPosition( document.createElement("div") ) & 1; +}); + +// Support: IE<8 +// Prevent attribute/property "interpolation" +// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx +if ( !assert(function( div ) { + div.innerHTML = ""; + return div.firstChild.getAttribute("href") === "#" ; +}) ) { + addHandle( "type|href|height|width", function( elem, name, isXML ) { + if ( !isXML ) { + return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); + } + }); +} + +// Support: IE<9 +// Use defaultValue in place of getAttribute("value") +if ( !support.attributes || !assert(function( div ) { + div.innerHTML = ""; + div.firstChild.setAttribute( "value", "" ); + return div.firstChild.getAttribute( "value" ) === ""; +}) ) { + addHandle( "value", function( elem, name, isXML ) { + if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { + return elem.defaultValue; + } + }); +} + +// Support: IE<9 +// Use getAttributeNode to fetch booleans when getAttribute lies +if ( !assert(function( div ) { + return div.getAttribute("disabled") == null; +}) ) { + addHandle( booleans, function( elem, name, isXML ) { + var val; + if ( !isXML ) { + return elem[ name ] === true ? name.toLowerCase() : + (val = elem.getAttributeNode( name )) && val.specified ? + val.value : + null; + } + }); +} + +return Sizzle; + +})( window ); + + + +jQuery.find = Sizzle; +jQuery.expr = Sizzle.selectors; +jQuery.expr[ ":" ] = jQuery.expr.pseudos; +jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; +jQuery.text = Sizzle.getText; +jQuery.isXMLDoc = Sizzle.isXML; +jQuery.contains = Sizzle.contains; + + + +var dir = function( elem, dir, until ) { + var matched = [], + truncate = until !== undefined; + + while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { + if ( elem.nodeType === 1 ) { + if ( truncate && jQuery( elem ).is( until ) ) { + break; + } + matched.push( elem ); + } + } + return matched; +}; + + +var siblings = function( n, elem ) { + var matched = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + matched.push( n ); + } + } + + return matched; +}; + + +var rneedsContext = jQuery.expr.match.needsContext; + +var rsingleTag = ( /^<([\w-]+)\s*\/?>(?:<\/\1>|)$/ ); + + + +var risSimple = /^.[^:#\[\.,]*$/; + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, not ) { + if ( jQuery.isFunction( qualifier ) ) { + return jQuery.grep( elements, function( elem, i ) { + /* jshint -W018 */ + return !!qualifier.call( elem, i, elem ) !== not; + } ); + + } + + if ( qualifier.nodeType ) { + return jQuery.grep( elements, function( elem ) { + return ( elem === qualifier ) !== not; + } ); + + } + + if ( typeof qualifier === "string" ) { + if ( risSimple.test( qualifier ) ) { + return jQuery.filter( qualifier, elements, not ); + } + + qualifier = jQuery.filter( qualifier, elements ); + } + + return jQuery.grep( elements, function( elem ) { + return ( jQuery.inArray( elem, qualifier ) > -1 ) !== not; + } ); +} + +jQuery.filter = function( expr, elems, not ) { + var elem = elems[ 0 ]; + + if ( not ) { + expr = ":not(" + expr + ")"; + } + + return elems.length === 1 && elem.nodeType === 1 ? + jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] : + jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { + return elem.nodeType === 1; + } ) ); +}; + +jQuery.fn.extend( { + find: function( selector ) { + var i, + ret = [], + self = this, + len = self.length; + + if ( typeof selector !== "string" ) { + return this.pushStack( jQuery( selector ).filter( function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( self[ i ], this ) ) { + return true; + } + } + } ) ); + } + + for ( i = 0; i < len; i++ ) { + jQuery.find( selector, self[ i ], ret ); + } + + // Needed because $( selector, context ) becomes $( context ).find( selector ) + ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret ); + ret.selector = this.selector ? this.selector + " " + selector : selector; + return ret; + }, + filter: function( selector ) { + return this.pushStack( winnow( this, selector || [], false ) ); + }, + not: function( selector ) { + return this.pushStack( winnow( this, selector || [], true ) ); + }, + is: function( selector ) { + return !!winnow( + this, + + // If this is a positional/relative selector, check membership in the returned set + // so $("p:first").is("p:last") won't return true for a doc with two "p". + typeof selector === "string" && rneedsContext.test( selector ) ? + jQuery( selector ) : + selector || [], + false + ).length; + } +} ); + + +// Initialize a jQuery object + + +// A central reference to the root jQuery(document) +var rootjQuery, + + // A simple way to check for HTML strings + // Prioritize #id over to avoid XSS via location.hash (#9521) + // Strict HTML recognition (#11290: must start with <) + rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/, + + init = jQuery.fn.init = function( selector, context, root ) { + var match, elem; + + // HANDLE: $(""), $(null), $(undefined), $(false) + if ( !selector ) { + return this; + } + + // init accepts an alternate rootjQuery + // so migrate can support jQuery.sub (gh-2101) + root = root || rootjQuery; + + // Handle HTML strings + if ( typeof selector === "string" ) { + if ( selector.charAt( 0 ) === "<" && + selector.charAt( selector.length - 1 ) === ">" && + selector.length >= 3 ) { + + // Assume that strings that start and end with <> are HTML and skip the regex check + match = [ null, selector, null ]; + + } else { + match = rquickExpr.exec( selector ); + } + + // Match html or make sure no context is specified for #id + if ( match && ( match[ 1 ] || !context ) ) { + + // HANDLE: $(html) -> $(array) + if ( match[ 1 ] ) { + context = context instanceof jQuery ? context[ 0 ] : context; + + // scripts is true for back-compat + // Intentionally let the error be thrown if parseHTML is not present + jQuery.merge( this, jQuery.parseHTML( + match[ 1 ], + context && context.nodeType ? context.ownerDocument || context : document, + true + ) ); + + // HANDLE: $(html, props) + if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { + for ( match in context ) { + + // Properties of context are called as methods if possible + if ( jQuery.isFunction( this[ match ] ) ) { + this[ match ]( context[ match ] ); + + // ...and otherwise set as attributes + } else { + this.attr( match, context[ match ] ); + } + } + } + + return this; + + // HANDLE: $(#id) + } else { + elem = document.getElementById( match[ 2 ] ); + + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + if ( elem && elem.parentNode ) { + + // Handle the case where IE and Opera return items + // by name instead of ID + if ( elem.id !== match[ 2 ] ) { + return rootjQuery.find( selector ); + } + + // Otherwise, we inject the element directly into the jQuery object + this.length = 1; + this[ 0 ] = elem; + } + + this.context = document; + this.selector = selector; + return this; + } + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return ( context || root ).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor( context ).find( selector ); + } + + // HANDLE: $(DOMElement) + } else if ( selector.nodeType ) { + this.context = this[ 0 ] = selector; + this.length = 1; + return this; + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( jQuery.isFunction( selector ) ) { + return typeof root.ready !== "undefined" ? + root.ready( selector ) : + + // Execute immediately if ready is not present + selector( jQuery ); + } + + if ( selector.selector !== undefined ) { + this.selector = selector.selector; + this.context = selector.context; + } + + return jQuery.makeArray( selector, this ); + }; + +// Give the init function the jQuery prototype for later instantiation +init.prototype = jQuery.fn; + +// Initialize central reference +rootjQuery = jQuery( document ); + + +var rparentsprev = /^(?:parents|prev(?:Until|All))/, + + // methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + +jQuery.fn.extend( { + has: function( target ) { + var i, + targets = jQuery( target, this ), + len = targets.length; + + return this.filter( function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( this, targets[ i ] ) ) { + return true; + } + } + } ); + }, + + closest: function( selectors, context ) { + var cur, + i = 0, + l = this.length, + matched = [], + pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ? + jQuery( selectors, context || this.context ) : + 0; + + for ( ; i < l; i++ ) { + for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { + + // Always skip document fragments + if ( cur.nodeType < 11 && ( pos ? + pos.index( cur ) > -1 : + + // Don't pass non-elements to Sizzle + cur.nodeType === 1 && + jQuery.find.matchesSelector( cur, selectors ) ) ) { + + matched.push( cur ); + break; + } + } + } + + return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); + }, + + // Determine the position of an element within + // the matched set of elements + index: function( elem ) { + + // No argument, return index in parent + if ( !elem ) { + return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; + } + + // index in selector + if ( typeof elem === "string" ) { + return jQuery.inArray( this[ 0 ], jQuery( elem ) ); + } + + // Locate the position of the desired element + return jQuery.inArray( + + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[ 0 ] : elem, this ); + }, + + add: function( selector, context ) { + return this.pushStack( + jQuery.uniqueSort( + jQuery.merge( this.get(), jQuery( selector, context ) ) + ) + ); + }, + + addBack: function( selector ) { + return this.add( selector == null ? + this.prevObject : this.prevObject.filter( selector ) + ); + } +} ); + +function sibling( cur, dir ) { + do { + cur = cur[ dir ]; + } while ( cur && cur.nodeType !== 1 ); + + return cur; +} + +jQuery.each( { + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, i, until ) { + return dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return sibling( elem, "nextSibling" ); + }, + prev: function( elem ) { + return sibling( elem, "previousSibling" ); + }, + nextAll: function( elem ) { + return dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, i, until ) { + return dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, i, until ) { + return dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return siblings( ( elem.parentNode || {} ).firstChild, elem ); + }, + children: function( elem ) { + return siblings( elem.firstChild ); + }, + contents: function( elem ) { + return jQuery.nodeName( elem, "iframe" ) ? + elem.contentDocument || elem.contentWindow.document : + jQuery.merge( [], elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var ret = jQuery.map( this, fn, until ); + + if ( name.slice( -5 ) !== "Until" ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + ret = jQuery.filter( selector, ret ); + } + + if ( this.length > 1 ) { + + // Remove duplicates + if ( !guaranteedUnique[ name ] ) { + ret = jQuery.uniqueSort( ret ); + } + + // Reverse order for parents* and prev-derivatives + if ( rparentsprev.test( name ) ) { + ret = ret.reverse(); + } + } + + return this.pushStack( ret ); + }; +} ); +var rnotwhite = ( /\S+/g ); + + + +// Convert String-formatted options into Object-formatted ones +function createOptions( options ) { + var object = {}; + jQuery.each( options.match( rnotwhite ) || [], function( _, flag ) { + object[ flag ] = true; + } ); + return object; +} + +/* + * Create a callback list using the following parameters: + * + * options: an optional list of space-separated options that will change how + * the callback list behaves or a more traditional option object + * + * By default a callback list will act like an event callback list and can be + * "fired" multiple times. + * + * Possible options: + * + * once: will ensure the callback list can only be fired once (like a Deferred) + * + * memory: will keep track of previous values and will call any callback added + * after the list has been fired right away with the latest "memorized" + * values (like a Deferred) + * + * unique: will ensure a callback can only be added once (no duplicate in the list) + * + * stopOnFalse: interrupt callings when a callback returns false + * + */ +jQuery.Callbacks = function( options ) { + + // Convert options from String-formatted to Object-formatted if needed + // (we check in cache first) + options = typeof options === "string" ? + createOptions( options ) : + jQuery.extend( {}, options ); + + var // Flag to know if list is currently firing + firing, + + // Last fire value for non-forgettable lists + memory, + + // Flag to know if list was already fired + fired, + + // Flag to prevent firing + locked, + + // Actual callback list + list = [], + + // Queue of execution data for repeatable lists + queue = [], + + // Index of currently firing callback (modified by add/remove as needed) + firingIndex = -1, + + // Fire callbacks + fire = function() { + + // Enforce single-firing + locked = options.once; + + // Execute callbacks for all pending executions, + // respecting firingIndex overrides and runtime changes + fired = firing = true; + for ( ; queue.length; firingIndex = -1 ) { + memory = queue.shift(); + while ( ++firingIndex < list.length ) { + + // Run callback and check for early termination + if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && + options.stopOnFalse ) { + + // Jump to end and forget the data so .add doesn't re-fire + firingIndex = list.length; + memory = false; + } + } + } + + // Forget the data if we're done with it + if ( !options.memory ) { + memory = false; + } + + firing = false; + + // Clean up if we're done firing for good + if ( locked ) { + + // Keep an empty list if we have data for future add calls + if ( memory ) { + list = []; + + // Otherwise, this object is spent + } else { + list = ""; + } + } + }, + + // Actual Callbacks object + self = { + + // Add a callback or a collection of callbacks to the list + add: function() { + if ( list ) { + + // If we have memory from a past run, we should fire after adding + if ( memory && !firing ) { + firingIndex = list.length - 1; + queue.push( memory ); + } + + ( function add( args ) { + jQuery.each( args, function( _, arg ) { + if ( jQuery.isFunction( arg ) ) { + if ( !options.unique || !self.has( arg ) ) { + list.push( arg ); + } + } else if ( arg && arg.length && jQuery.type( arg ) !== "string" ) { + + // Inspect recursively + add( arg ); + } + } ); + } )( arguments ); + + if ( memory && !firing ) { + fire(); + } + } + return this; + }, + + // Remove a callback from the list + remove: function() { + jQuery.each( arguments, function( _, arg ) { + var index; + while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { + list.splice( index, 1 ); + + // Handle firing indexes + if ( index <= firingIndex ) { + firingIndex--; + } + } + } ); + return this; + }, + + // Check if a given callback is in the list. + // If no argument is given, return whether or not list has callbacks attached. + has: function( fn ) { + return fn ? + jQuery.inArray( fn, list ) > -1 : + list.length > 0; + }, + + // Remove all callbacks from the list + empty: function() { + if ( list ) { + list = []; + } + return this; + }, + + // Disable .fire and .add + // Abort any current/pending executions + // Clear all callbacks and values + disable: function() { + locked = queue = []; + list = memory = ""; + return this; + }, + disabled: function() { + return !list; + }, + + // Disable .fire + // Also disable .add unless we have memory (since it would have no effect) + // Abort any pending executions + lock: function() { + locked = true; + if ( !memory ) { + self.disable(); + } + return this; + }, + locked: function() { + return !!locked; + }, + + // Call all callbacks with the given context and arguments + fireWith: function( context, args ) { + if ( !locked ) { + args = args || []; + args = [ context, args.slice ? args.slice() : args ]; + queue.push( args ); + if ( !firing ) { + fire(); + } + } + return this; + }, + + // Call all the callbacks with the given arguments + fire: function() { + self.fireWith( this, arguments ); + return this; + }, + + // To know if the callbacks have already been called at least once + fired: function() { + return !!fired; + } + }; + + return self; +}; + + +jQuery.extend( { + + Deferred: function( func ) { + var tuples = [ + + // action, add listener, listener list, final state + [ "resolve", "done", jQuery.Callbacks( "once memory" ), "resolved" ], + [ "reject", "fail", jQuery.Callbacks( "once memory" ), "rejected" ], + [ "notify", "progress", jQuery.Callbacks( "memory" ) ] + ], + state = "pending", + promise = { + state: function() { + return state; + }, + always: function() { + deferred.done( arguments ).fail( arguments ); + return this; + }, + then: function( /* fnDone, fnFail, fnProgress */ ) { + var fns = arguments; + return jQuery.Deferred( function( newDefer ) { + jQuery.each( tuples, function( i, tuple ) { + var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ]; + + // deferred[ done | fail | progress ] for forwarding actions to newDefer + deferred[ tuple[ 1 ] ]( function() { + var returned = fn && fn.apply( this, arguments ); + if ( returned && jQuery.isFunction( returned.promise ) ) { + returned.promise() + .progress( newDefer.notify ) + .done( newDefer.resolve ) + .fail( newDefer.reject ); + } else { + newDefer[ tuple[ 0 ] + "With" ]( + this === promise ? newDefer.promise() : this, + fn ? [ returned ] : arguments + ); + } + } ); + } ); + fns = null; + } ).promise(); + }, + + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + return obj != null ? jQuery.extend( obj, promise ) : promise; + } + }, + deferred = {}; + + // Keep pipe for back-compat + promise.pipe = promise.then; + + // Add list-specific methods + jQuery.each( tuples, function( i, tuple ) { + var list = tuple[ 2 ], + stateString = tuple[ 3 ]; + + // promise[ done | fail | progress ] = list.add + promise[ tuple[ 1 ] ] = list.add; + + // Handle state + if ( stateString ) { + list.add( function() { + + // state = [ resolved | rejected ] + state = stateString; + + // [ reject_list | resolve_list ].disable; progress_list.lock + }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock ); + } + + // deferred[ resolve | reject | notify ] + deferred[ tuple[ 0 ] ] = function() { + deferred[ tuple[ 0 ] + "With" ]( this === deferred ? promise : this, arguments ); + return this; + }; + deferred[ tuple[ 0 ] + "With" ] = list.fireWith; + } ); + + // Make the deferred a promise + promise.promise( deferred ); + + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + + // All done! + return deferred; + }, + + // Deferred helper + when: function( subordinate /* , ..., subordinateN */ ) { + var i = 0, + resolveValues = slice.call( arguments ), + length = resolveValues.length, + + // the count of uncompleted subordinates + remaining = length !== 1 || + ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0, + + // the master Deferred. + // If resolveValues consist of only a single Deferred, just use that. + deferred = remaining === 1 ? subordinate : jQuery.Deferred(), + + // Update function for both resolve and progress values + updateFunc = function( i, contexts, values ) { + return function( value ) { + contexts[ i ] = this; + values[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; + if ( values === progressValues ) { + deferred.notifyWith( contexts, values ); + + } else if ( !( --remaining ) ) { + deferred.resolveWith( contexts, values ); + } + }; + }, + + progressValues, progressContexts, resolveContexts; + + // add listeners to Deferred subordinates; treat others as resolved + if ( length > 1 ) { + progressValues = new Array( length ); + progressContexts = new Array( length ); + resolveContexts = new Array( length ); + for ( ; i < length; i++ ) { + if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) { + resolveValues[ i ].promise() + .progress( updateFunc( i, progressContexts, progressValues ) ) + .done( updateFunc( i, resolveContexts, resolveValues ) ) + .fail( deferred.reject ); + } else { + --remaining; + } + } + } + + // if we're not waiting on anything, resolve the master + if ( !remaining ) { + deferred.resolveWith( resolveContexts, resolveValues ); + } + + return deferred.promise(); + } +} ); + + +// The deferred used on DOM ready +var readyList; + +jQuery.fn.ready = function( fn ) { + + // Add the callback + jQuery.ready.promise().done( fn ); + + return this; +}; + +jQuery.extend( { + + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See #6781 + readyWait: 1, + + // Hold (or release) the ready event + holdReady: function( hold ) { + if ( hold ) { + jQuery.readyWait++; + } else { + jQuery.ready( true ); + } + }, + + // Handle when the DOM is ready + ready: function( wait ) { + + // Abort if there are pending holds or we're already ready + if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { + return; + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if ( wait !== true && --jQuery.readyWait > 0 ) { + return; + } + + // If there are functions bound, to execute + readyList.resolveWith( document, [ jQuery ] ); + + // Trigger any bound ready events + if ( jQuery.fn.triggerHandler ) { + jQuery( document ).triggerHandler( "ready" ); + jQuery( document ).off( "ready" ); + } + } +} ); + +/** + * Clean-up method for dom ready events + */ +function detach() { + if ( document.addEventListener ) { + document.removeEventListener( "DOMContentLoaded", completed ); + window.removeEventListener( "load", completed ); + + } else { + document.detachEvent( "onreadystatechange", completed ); + window.detachEvent( "onload", completed ); + } +} + +/** + * The ready event handler and self cleanup method + */ +function completed() { + + // readyState === "complete" is good enough for us to call the dom ready in oldIE + if ( document.addEventListener || + window.event.type === "load" || + document.readyState === "complete" ) { + + detach(); + jQuery.ready(); + } +} + +jQuery.ready.promise = function( obj ) { + if ( !readyList ) { + + readyList = jQuery.Deferred(); + + // Catch cases where $(document).ready() is called + // after the browser event has already occurred. + // we once tried to use readyState "interactive" here, + // but it caused issues like the one + // discovered by ChrisS here: + // http://bugs.jquery.com/ticket/12282#comment:15 + if ( document.readyState === "complete" ) { + + // Handle it asynchronously to allow scripts the opportunity to delay ready + window.setTimeout( jQuery.ready ); + + // Standards-based browsers support DOMContentLoaded + } else if ( document.addEventListener ) { + + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", completed ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", completed ); + + // If IE event model is used + } else { + + // Ensure firing before onload, maybe late but safe also for iframes + document.attachEvent( "onreadystatechange", completed ); + + // A fallback to window.onload, that will always work + window.attachEvent( "onload", completed ); + + // If IE and not a frame + // continually check to see if the document is ready + var top = false; + + try { + top = window.frameElement == null && document.documentElement; + } catch ( e ) {} + + if ( top && top.doScroll ) { + ( function doScrollCheck() { + if ( !jQuery.isReady ) { + + try { + + // Use the trick by Diego Perini + // http://javascript.nwbox.com/IEContentLoaded/ + top.doScroll( "left" ); + } catch ( e ) { + return window.setTimeout( doScrollCheck, 50 ); + } + + // detach all dom ready events + detach(); + + // and execute any waiting functions + jQuery.ready(); + } + } )(); + } + } + } + return readyList.promise( obj ); +}; + +// Kick off the DOM ready check even if the user does not +jQuery.ready.promise(); + + + + +// Support: IE<9 +// Iteration over object's inherited properties before its own +var i; +for ( i in jQuery( support ) ) { + break; +} +support.ownFirst = i === "0"; + +// Note: most support tests are defined in their respective modules. +// false until the test is run +support.inlineBlockNeedsLayout = false; + +// Execute ASAP in case we need to set body.style.zoom +jQuery( function() { + + // Minified: var a,b,c,d + var val, div, body, container; + + body = document.getElementsByTagName( "body" )[ 0 ]; + if ( !body || !body.style ) { + + // Return for frameset docs that don't have a body + return; + } + + // Setup + div = document.createElement( "div" ); + container = document.createElement( "div" ); + container.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px"; + body.appendChild( container ).appendChild( div ); + + if ( typeof div.style.zoom !== "undefined" ) { + + // Support: IE<8 + // Check if natively block-level elements act like inline-block + // elements when setting their display to 'inline' and giving + // them layout + div.style.cssText = "display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1"; + + support.inlineBlockNeedsLayout = val = div.offsetWidth === 3; + if ( val ) { + + // Prevent IE 6 from affecting layout for positioned elements #11048 + // Prevent IE from shrinking the body in IE 7 mode #12869 + // Support: IE<8 + body.style.zoom = 1; + } + } + + body.removeChild( container ); +} ); + + +( function() { + var div = document.createElement( "div" ); + + // Support: IE<9 + support.deleteExpando = true; + try { + delete div.test; + } catch ( e ) { + support.deleteExpando = false; + } + + // Null elements to avoid leaks in IE. + div = null; +} )(); +var acceptData = function( elem ) { + var noData = jQuery.noData[ ( elem.nodeName + " " ).toLowerCase() ], + nodeType = +elem.nodeType || 1; + + // Do not set data on non-element DOM nodes because it will not be cleared (#8335). + return nodeType !== 1 && nodeType !== 9 ? + false : + + // Nodes accept data unless otherwise specified; rejection can be conditional + !noData || noData !== true && elem.getAttribute( "classid" ) === noData; +}; + + + + +var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, + rmultiDash = /([A-Z])/g; + +function dataAttr( elem, key, data ) { + + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + + var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); + + data = elem.getAttribute( name ); + + if ( typeof data === "string" ) { + try { + data = data === "true" ? true : + data === "false" ? false : + data === "null" ? null : + + // Only convert to a number if it doesn't change the string + +data + "" === data ? +data : + rbrace.test( data ) ? jQuery.parseJSON( data ) : + data; + } catch ( e ) {} + + // Make sure we set the data so it isn't changed later + jQuery.data( elem, key, data ); + + } else { + data = undefined; + } + } + + return data; +} + +// checks a cache object for emptiness +function isEmptyDataObject( obj ) { + var name; + for ( name in obj ) { + + // if the public data object is empty, the private is still empty + if ( name === "data" && jQuery.isEmptyObject( obj[ name ] ) ) { + continue; + } + if ( name !== "toJSON" ) { + return false; + } + } + + return true; +} + +function internalData( elem, name, data, pvt /* Internal Use Only */ ) { + if ( !acceptData( elem ) ) { + return; + } + + var ret, thisCache, + internalKey = jQuery.expando, + + // We have to handle DOM nodes and JS objects differently because IE6-7 + // can't GC object references properly across the DOM-JS boundary + isNode = elem.nodeType, + + // Only DOM nodes need the global jQuery cache; JS object data is + // attached directly to the object so GC can occur automatically + cache = isNode ? jQuery.cache : elem, + + // Only defining an ID for JS objects if its cache already exists allows + // the code to shortcut on the same path as a DOM node with no cache + id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey; + + // Avoid doing any more work than we need to when trying to get data on an + // object that has no data at all + if ( ( !id || !cache[ id ] || ( !pvt && !cache[ id ].data ) ) && + data === undefined && typeof name === "string" ) { + return; + } + + if ( !id ) { + + // Only DOM nodes need a new unique ID for each element since their data + // ends up in the global cache + if ( isNode ) { + id = elem[ internalKey ] = deletedIds.pop() || jQuery.guid++; + } else { + id = internalKey; + } + } + + if ( !cache[ id ] ) { + + // Avoid exposing jQuery metadata on plain JS objects when the object + // is serialized using JSON.stringify + cache[ id ] = isNode ? {} : { toJSON: jQuery.noop }; + } + + // An object can be passed to jQuery.data instead of a key/value pair; this gets + // shallow copied over onto the existing cache + if ( typeof name === "object" || typeof name === "function" ) { + if ( pvt ) { + cache[ id ] = jQuery.extend( cache[ id ], name ); + } else { + cache[ id ].data = jQuery.extend( cache[ id ].data, name ); + } + } + + thisCache = cache[ id ]; + + // jQuery data() is stored in a separate object inside the object's internal data + // cache in order to avoid key collisions between internal data and user-defined + // data. + if ( !pvt ) { + if ( !thisCache.data ) { + thisCache.data = {}; + } + + thisCache = thisCache.data; + } + + if ( data !== undefined ) { + thisCache[ jQuery.camelCase( name ) ] = data; + } + + // Check for both converted-to-camel and non-converted data property names + // If a data property was specified + if ( typeof name === "string" ) { + + // First Try to find as-is property data + ret = thisCache[ name ]; + + // Test for null|undefined property data + if ( ret == null ) { + + // Try to find the camelCased property + ret = thisCache[ jQuery.camelCase( name ) ]; + } + } else { + ret = thisCache; + } + + return ret; +} + +function internalRemoveData( elem, name, pvt ) { + if ( !acceptData( elem ) ) { + return; + } + + var thisCache, i, + isNode = elem.nodeType, + + // See jQuery.data for more information + cache = isNode ? jQuery.cache : elem, + id = isNode ? elem[ jQuery.expando ] : jQuery.expando; + + // If there is already no cache entry for this object, there is no + // purpose in continuing + if ( !cache[ id ] ) { + return; + } + + if ( name ) { + + thisCache = pvt ? cache[ id ] : cache[ id ].data; + + if ( thisCache ) { + + // Support array or space separated string names for data keys + if ( !jQuery.isArray( name ) ) { + + // try the string as a key before any manipulation + if ( name in thisCache ) { + name = [ name ]; + } else { + + // split the camel cased version by spaces unless a key with the spaces exists + name = jQuery.camelCase( name ); + if ( name in thisCache ) { + name = [ name ]; + } else { + name = name.split( " " ); + } + } + } else { + + // If "name" is an array of keys... + // When data is initially created, via ("key", "val") signature, + // keys will be converted to camelCase. + // Since there is no way to tell _how_ a key was added, remove + // both plain key and camelCase key. #12786 + // This will only penalize the array argument path. + name = name.concat( jQuery.map( name, jQuery.camelCase ) ); + } + + i = name.length; + while ( i-- ) { + delete thisCache[ name[ i ] ]; + } + + // If there is no data left in the cache, we want to continue + // and let the cache object itself get destroyed + if ( pvt ? !isEmptyDataObject( thisCache ) : !jQuery.isEmptyObject( thisCache ) ) { + return; + } + } + } + + // See jQuery.data for more information + if ( !pvt ) { + delete cache[ id ].data; + + // Don't destroy the parent cache unless the internal data object + // had been the only thing left in it + if ( !isEmptyDataObject( cache[ id ] ) ) { + return; + } + } + + // Destroy the cache + if ( isNode ) { + jQuery.cleanData( [ elem ], true ); + + // Use delete when supported for expandos or `cache` is not a window per isWindow (#10080) + /* jshint eqeqeq: false */ + } else if ( support.deleteExpando || cache != cache.window ) { + /* jshint eqeqeq: true */ + delete cache[ id ]; + + // When all else fails, undefined + } else { + cache[ id ] = undefined; + } +} + +jQuery.extend( { + cache: {}, + + // The following elements (space-suffixed to avoid Object.prototype collisions) + // throw uncatchable exceptions if you attempt to set expando properties + noData: { + "applet ": true, + "embed ": true, + + // ...but Flash objects (which have this classid) *can* handle expandos + "object ": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" + }, + + hasData: function( elem ) { + elem = elem.nodeType ? jQuery.cache[ elem[ jQuery.expando ] ] : elem[ jQuery.expando ]; + return !!elem && !isEmptyDataObject( elem ); + }, + + data: function( elem, name, data ) { + return internalData( elem, name, data ); + }, + + removeData: function( elem, name ) { + return internalRemoveData( elem, name ); + }, + + // For internal use only. + _data: function( elem, name, data ) { + return internalData( elem, name, data, true ); + }, + + _removeData: function( elem, name ) { + return internalRemoveData( elem, name, true ); + } +} ); + +jQuery.fn.extend( { + data: function( key, value ) { + var i, name, data, + elem = this[ 0 ], + attrs = elem && elem.attributes; + + // Special expections of .data basically thwart jQuery.access, + // so implement the relevant behavior ourselves + + // Gets all values + if ( key === undefined ) { + if ( this.length ) { + data = jQuery.data( elem ); + + if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) { + i = attrs.length; + while ( i-- ) { + + // Support: IE11+ + // The attrs elements can be null (#14894) + if ( attrs[ i ] ) { + name = attrs[ i ].name; + if ( name.indexOf( "data-" ) === 0 ) { + name = jQuery.camelCase( name.slice( 5 ) ); + dataAttr( elem, name, data[ name ] ); + } + } + } + jQuery._data( elem, "parsedAttrs", true ); + } + } + + return data; + } + + // Sets multiple values + if ( typeof key === "object" ) { + return this.each( function() { + jQuery.data( this, key ); + } ); + } + + return arguments.length > 1 ? + + // Sets one value + this.each( function() { + jQuery.data( this, key, value ); + } ) : + + // Gets one value + // Try to fetch any internally stored data first + elem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : undefined; + }, + + removeData: function( key ) { + return this.each( function() { + jQuery.removeData( this, key ); + } ); + } +} ); + + +jQuery.extend( { + queue: function( elem, type, data ) { + var queue; + + if ( elem ) { + type = ( type || "fx" ) + "queue"; + queue = jQuery._data( elem, type ); + + // Speed up dequeue by getting out quickly if this is just a lookup + if ( data ) { + if ( !queue || jQuery.isArray( data ) ) { + queue = jQuery._data( elem, type, jQuery.makeArray( data ) ); + } else { + queue.push( data ); + } + } + return queue || []; + } + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + startLength = queue.length, + fn = queue.shift(), + hooks = jQuery._queueHooks( elem, type ), + next = function() { + jQuery.dequeue( elem, type ); + }; + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + startLength--; + } + + if ( fn ) { + + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift( "inprogress" ); + } + + // clear up the last queue stop function + delete hooks.stop; + fn.call( elem, next, hooks ); + } + + if ( !startLength && hooks ) { + hooks.empty.fire(); + } + }, + + // not intended for public consumption - generates a queueHooks object, + // or returns the current one + _queueHooks: function( elem, type ) { + var key = type + "queueHooks"; + return jQuery._data( elem, key ) || jQuery._data( elem, key, { + empty: jQuery.Callbacks( "once memory" ).add( function() { + jQuery._removeData( elem, type + "queue" ); + jQuery._removeData( elem, key ); + } ) + } ); + } +} ); + +jQuery.fn.extend( { + queue: function( type, data ) { + var setter = 2; + + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + setter--; + } + + if ( arguments.length < setter ) { + return jQuery.queue( this[ 0 ], type ); + } + + return data === undefined ? + this : + this.each( function() { + var queue = jQuery.queue( this, type, data ); + + // ensure a hooks for this queue + jQuery._queueHooks( this, type ); + + if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + } ); + }, + dequeue: function( type ) { + return this.each( function() { + jQuery.dequeue( this, type ); + } ); + }, + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + }, + + // Get a promise resolved when queues of a certain type + // are emptied (fx is the type by default) + promise: function( type, obj ) { + var tmp, + count = 1, + defer = jQuery.Deferred(), + elements = this, + i = this.length, + resolve = function() { + if ( !( --count ) ) { + defer.resolveWith( elements, [ elements ] ); + } + }; + + if ( typeof type !== "string" ) { + obj = type; + type = undefined; + } + type = type || "fx"; + + while ( i-- ) { + tmp = jQuery._data( elements[ i ], type + "queueHooks" ); + if ( tmp && tmp.empty ) { + count++; + tmp.empty.add( resolve ); + } + } + resolve(); + return defer.promise( obj ); + } +} ); + + +( function() { + var shrinkWrapBlocksVal; + + support.shrinkWrapBlocks = function() { + if ( shrinkWrapBlocksVal != null ) { + return shrinkWrapBlocksVal; + } + + // Will be changed later if needed. + shrinkWrapBlocksVal = false; + + // Minified: var b,c,d + var div, body, container; + + body = document.getElementsByTagName( "body" )[ 0 ]; + if ( !body || !body.style ) { + + // Test fired too early or in an unsupported environment, exit. + return; + } + + // Setup + div = document.createElement( "div" ); + container = document.createElement( "div" ); + container.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px"; + body.appendChild( container ).appendChild( div ); + + // Support: IE6 + // Check if elements with layout shrink-wrap their children + if ( typeof div.style.zoom !== "undefined" ) { + + // Reset CSS: box-sizing; display; margin; border + div.style.cssText = + + // Support: Firefox<29, Android 2.3 + // Vendor-prefix box-sizing + "-webkit-box-sizing:content-box;-moz-box-sizing:content-box;" + + "box-sizing:content-box;display:block;margin:0;border:0;" + + "padding:1px;width:1px;zoom:1"; + div.appendChild( document.createElement( "div" ) ).style.width = "5px"; + shrinkWrapBlocksVal = div.offsetWidth !== 3; + } + + body.removeChild( container ); + + return shrinkWrapBlocksVal; + }; + +} )(); +var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; + +var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); + + +var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; + +var isHidden = function( elem, el ) { + + // isHidden might be called from jQuery#filter function; + // in that case, element will be second argument + elem = el || elem; + return jQuery.css( elem, "display" ) === "none" || + !jQuery.contains( elem.ownerDocument, elem ); + }; + + + +function adjustCSS( elem, prop, valueParts, tween ) { + var adjusted, + scale = 1, + maxIterations = 20, + currentValue = tween ? + function() { return tween.cur(); } : + function() { return jQuery.css( elem, prop, "" ); }, + initial = currentValue(), + unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), + + // Starting value computation is required for potential unit mismatches + initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && + rcssNum.exec( jQuery.css( elem, prop ) ); + + if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { + + // Trust units reported by jQuery.css + unit = unit || initialInUnit[ 3 ]; + + // Make sure we update the tween properties later on + valueParts = valueParts || []; + + // Iteratively approximate from a nonzero starting point + initialInUnit = +initial || 1; + + do { + + // If previous iteration zeroed out, double until we get *something*. + // Use string for doubling so we don't accidentally see scale as unchanged below + scale = scale || ".5"; + + // Adjust and apply + initialInUnit = initialInUnit / scale; + jQuery.style( elem, prop, initialInUnit + unit ); + + // Update scale, tolerating zero or NaN from tween.cur() + // Break the loop if scale is unchanged or perfect, or if we've just had enough. + } while ( + scale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations + ); + } + + if ( valueParts ) { + initialInUnit = +initialInUnit || +initial || 0; + + // Apply relative offset (+=/-=) if specified + adjusted = valueParts[ 1 ] ? + initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : + +valueParts[ 2 ]; + if ( tween ) { + tween.unit = unit; + tween.start = initialInUnit; + tween.end = adjusted; + } + } + return adjusted; +} + + +// Multifunctional method to get and set values of a collection +// The value/s can optionally be executed if it's a function +var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { + var i = 0, + length = elems.length, + bulk = key == null; + + // Sets many values + if ( jQuery.type( key ) === "object" ) { + chainable = true; + for ( i in key ) { + access( elems, fn, i, key[ i ], true, emptyGet, raw ); + } + + // Sets one value + } else if ( value !== undefined ) { + chainable = true; + + if ( !jQuery.isFunction( value ) ) { + raw = true; + } + + if ( bulk ) { + + // Bulk operations run against the entire set + if ( raw ) { + fn.call( elems, value ); + fn = null; + + // ...except when executing function values + } else { + bulk = fn; + fn = function( elem, key, value ) { + return bulk.call( jQuery( elem ), value ); + }; + } + } + + if ( fn ) { + for ( ; i < length; i++ ) { + fn( + elems[ i ], + key, + raw ? value : value.call( elems[ i ], i, fn( elems[ i ], key ) ) + ); + } + } + } + + return chainable ? + elems : + + // Gets + bulk ? + fn.call( elems ) : + length ? fn( elems[ 0 ], key ) : emptyGet; +}; +var rcheckableType = ( /^(?:checkbox|radio)$/i ); + +var rtagName = ( /<([\w:-]+)/ ); + +var rscriptType = ( /^$|\/(?:java|ecma)script/i ); + +var rleadingWhitespace = ( /^\s+/ ); + +var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|" + + "details|dialog|figcaption|figure|footer|header|hgroup|main|" + + "mark|meter|nav|output|picture|progress|section|summary|template|time|video"; + + + +function createSafeFragment( document ) { + var list = nodeNames.split( "|" ), + safeFrag = document.createDocumentFragment(); + + if ( safeFrag.createElement ) { + while ( list.length ) { + safeFrag.createElement( + list.pop() + ); + } + } + return safeFrag; +} + + +( function() { + var div = document.createElement( "div" ), + fragment = document.createDocumentFragment(), + input = document.createElement( "input" ); + + // Setup + div.innerHTML = "
    a"; + + // IE strips leading whitespace when .innerHTML is used + support.leadingWhitespace = div.firstChild.nodeType === 3; + + // Make sure that tbody elements aren't automatically inserted + // IE will insert them into empty tables + support.tbody = !div.getElementsByTagName( "tbody" ).length; + + // Make sure that link elements get serialized correctly by innerHTML + // This requires a wrapper element in IE + support.htmlSerialize = !!div.getElementsByTagName( "link" ).length; + + // Makes sure cloning an html5 element does not cause problems + // Where outerHTML is undefined, this still works + support.html5Clone = + document.createElement( "nav" ).cloneNode( true ).outerHTML !== "<:nav>"; + + // Check if a disconnected checkbox will retain its checked + // value of true after appended to the DOM (IE6/7) + input.type = "checkbox"; + input.checked = true; + fragment.appendChild( input ); + support.appendChecked = input.checked; + + // Make sure textarea (and checkbox) defaultValue is properly cloned + // Support: IE6-IE11+ + div.innerHTML = ""; + support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; + + // #11217 - WebKit loses check when the name is after the checked attribute + fragment.appendChild( div ); + + // Support: Windows Web Apps (WWA) + // `name` and `type` must use .setAttribute for WWA (#14901) + input = document.createElement( "input" ); + input.setAttribute( "type", "radio" ); + input.setAttribute( "checked", "checked" ); + input.setAttribute( "name", "t" ); + + div.appendChild( input ); + + // Support: Safari 5.1, iOS 5.1, Android 4.x, Android 2.3 + // old WebKit doesn't clone checked state correctly in fragments + support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; + + // Support: IE<9 + // Cloned elements keep attachEvent handlers, we use addEventListener on IE9+ + support.noCloneEvent = !!div.addEventListener; + + // Support: IE<9 + // Since attributes and properties are the same in IE, + // cleanData must set properties to undefined rather than use removeAttribute + div[ jQuery.expando ] = 1; + support.attributes = !div.getAttribute( jQuery.expando ); +} )(); + + +// We have to close these tags to support XHTML (#13200) +var wrapMap = { + option: [ 1, "" ], + legend: [ 1, "