From 95526522927bf572ee84a44d1e6778ed631030ec Mon Sep 17 00:00:00 2001 From: Trevor Batley Date: Sat, 7 Sep 2024 20:53:46 +1000 Subject: [PATCH] initial commit of file from CVS for smeserver-phpsysinfo on Sat Sep 7 20:53:46 AEST 2024 --- .gitignore | 4 + Makefile | 21 + README.md | 17 +- additional/CHANGELOG.git | 57 + additional/README.md | 1 + additional/smeserver-phpsysinfo.spec | 118 + contriborbase | 1 + createlinks | 25 + .../db/accounts/defaults/phpsysinfo/type | 1 + .../configuration/defaults/phpsysinfo/access | 1 + .../db/configuration/defaults/phpsysinfo/type | 1 + .../httpd/conf/httpd.conf/86PhpsysinfoAlias | 23 + .../httpd.conf/VirtualHosts/30PhpsysinfoAlias | 8 + root/etc/e-smith/web/functions/phpsysinfo | 30 + root/opt/phpsysinfo/.gitignore | 1 + root/opt/phpsysinfo/.htaccess | 11 + root/opt/phpsysinfo/.travis.yml | 18 + root/opt/phpsysinfo/CHANGELOG.md | 255 + root/opt/phpsysinfo/COPYING | 339 + root/opt/phpsysinfo/Dockerfile | 26 + root/opt/phpsysinfo/README.md | 121 + root/opt/phpsysinfo/README_PLUGIN.md | 134 + root/opt/phpsysinfo/composer.json | 18 + root/opt/phpsysinfo/data/ModelTranslation.txt | 143 + root/opt/phpsysinfo/data/distros.ini | 799 ++ root/opt/phpsysinfo/data/languages.ini | 1025 ++ root/opt/phpsysinfo/data/osnames.ini | 34 + root/opt/phpsysinfo/gfx/ajax-loader.gif | Bin 0 -> 404 bytes root/opt/phpsysinfo/gfx/ajaxLoader.gif | Bin 0 -> 4659 bytes root/opt/phpsysinfo/gfx/attention.png | Bin 0 -> 1500 bytes root/opt/phpsysinfo/gfx/body.png | Bin 0 -> 443 bytes .../phpsysinfo/gfx/bullet_toggle_minus.png | Bin 0 -> 207 bytes .../opt/phpsysinfo/gfx/bullet_toggle_plus.png | Bin 0 -> 209 bytes root/opt/phpsysinfo/gfx/close.gif | Bin 0 -> 70 bytes root/opt/phpsysinfo/gfx/favicon.ico | Bin 0 -> 15086 bytes root/opt/phpsysinfo/gfx/favicon.png | Bin 0 -> 479 bytes root/opt/phpsysinfo/gfx/html.gif | Bin 0 -> 94 bytes root/opt/phpsysinfo/gfx/htmlwarn.gif | Bin 0 -> 120 bytes root/opt/phpsysinfo/gfx/images/4MLinux.png | Bin 0 -> 3211 bytes root/opt/phpsysinfo/gfx/images/AIX.png | Bin 0 -> 4346 bytes root/opt/phpsysinfo/gfx/images/ALT.png | Bin 0 -> 4217 bytes root/opt/phpsysinfo/gfx/images/Alpine.png | Bin 0 -> 972 bytes root/opt/phpsysinfo/gfx/images/Amazon.png | Bin 0 -> 2193 bytes root/opt/phpsysinfo/gfx/images/Android.png | Bin 0 -> 4217 bytes root/opt/phpsysinfo/gfx/images/Apple.png | Bin 0 -> 380 bytes root/opt/phpsysinfo/gfx/images/Arch.png | Bin 0 -> 1182 bytes root/opt/phpsysinfo/gfx/images/BOSS.png | Bin 0 -> 3211 bytes root/opt/phpsysinfo/gfx/images/Calculate.png | Bin 0 -> 3211 bytes root/opt/phpsysinfo/gfx/images/Canaima.png | Bin 0 -> 2193 bytes root/opt/phpsysinfo/gfx/images/CentOS.png | Bin 0 -> 1212 bytes root/opt/phpsysinfo/gfx/images/Chakra.png | Bin 0 -> 2193 bytes root/opt/phpsysinfo/gfx/images/ClearOS.png | Bin 0 -> 4217 bytes root/opt/phpsysinfo/gfx/images/Cloud.png | Bin 0 -> 4196 bytes root/opt/phpsysinfo/gfx/images/Cobalt.png | Bin 0 -> 1943 bytes root/opt/phpsysinfo/gfx/images/CoreOS.png | Bin 0 -> 2193 bytes root/opt/phpsysinfo/gfx/images/Crux.png | Bin 0 -> 4217 bytes root/opt/phpsysinfo/gfx/images/Darwin.png | Bin 0 -> 851 bytes root/opt/phpsysinfo/gfx/images/Debian.png | Bin 0 -> 1276 bytes root/opt/phpsysinfo/gfx/images/Deepin.png | Bin 0 -> 3211 bytes root/opt/phpsysinfo/gfx/images/DragonFly.png | Bin 0 -> 1805 bytes root/opt/phpsysinfo/gfx/images/Eisfair.png | Bin 0 -> 3827 bytes root/opt/phpsysinfo/gfx/images/Fedora.png | Bin 0 -> 742 bytes root/opt/phpsysinfo/gfx/images/Foresight.png | Bin 0 -> 4196 bytes root/opt/phpsysinfo/gfx/images/FreeBSD.png | Bin 0 -> 2562 bytes root/opt/phpsysinfo/gfx/images/Frugalware.png | Bin 0 -> 3190 bytes root/opt/phpsysinfo/gfx/images/Fuduntu.png | Bin 0 -> 4196 bytes .../opt/phpsysinfo/gfx/images/Generations.png | Bin 0 -> 3193 bytes root/opt/phpsysinfo/gfx/images/Gentoo.png | Bin 0 -> 1890 bytes root/opt/phpsysinfo/gfx/images/Gobo.png | Bin 0 -> 2193 bytes root/opt/phpsysinfo/gfx/images/HPUX.png | Bin 0 -> 2411 bytes root/opt/phpsysinfo/gfx/images/Haiku.png | Bin 0 -> 4217 bytes root/opt/phpsysinfo/gfx/images/Handy.png | Bin 0 -> 1671 bytes root/opt/phpsysinfo/gfx/images/IPFire.png | Bin 0 -> 2763 bytes root/opt/phpsysinfo/gfx/images/KaOS.png | Bin 0 -> 4217 bytes root/opt/phpsysinfo/gfx/images/Korora.png | Bin 0 -> 2193 bytes root/opt/phpsysinfo/gfx/images/LFS.png | Bin 0 -> 2193 bytes root/opt/phpsysinfo/gfx/images/Linaro.png | Bin 0 -> 4217 bytes root/opt/phpsysinfo/gfx/images/Lunar.png | Bin 0 -> 3211 bytes root/opt/phpsysinfo/gfx/images/Mageia.png | Bin 0 -> 3065 bytes root/opt/phpsysinfo/gfx/images/Mandrake.png | Bin 0 -> 451 bytes root/opt/phpsysinfo/gfx/images/Manjaro.png | Bin 0 -> 4196 bytes root/opt/phpsysinfo/gfx/images/Mer.png | Bin 0 -> 1458 bytes root/opt/phpsysinfo/gfx/images/Minix.png | Bin 0 -> 3701 bytes root/opt/phpsysinfo/gfx/images/Mint.png | Bin 0 -> 1268 bytes root/opt/phpsysinfo/gfx/images/NetBSD.png | Bin 0 -> 2723 bytes root/opt/phpsysinfo/gfx/images/Netrunner.png | Bin 0 -> 4217 bytes root/opt/phpsysinfo/gfx/images/NixOS.png | Bin 0 -> 3211 bytes root/opt/phpsysinfo/gfx/images/OpenBSD.png | Bin 0 -> 1876 bytes .../phpsysinfo/gfx/images/OpenMandriva.png | Bin 0 -> 2193 bytes root/opt/phpsysinfo/gfx/images/Oracle.png | Bin 0 -> 2066 bytes root/opt/phpsysinfo/gfx/images/PCLinuxOS.png | Bin 0 -> 3959 bytes root/opt/phpsysinfo/gfx/images/PLD.png | Bin 0 -> 952 bytes root/opt/phpsysinfo/gfx/images/Parsix.png | Bin 0 -> 2193 bytes root/opt/phpsysinfo/gfx/images/Pear.png | Bin 0 -> 2193 bytes root/opt/phpsysinfo/gfx/images/Peppermint.png | Bin 0 -> 4217 bytes root/opt/phpsysinfo/gfx/images/Pisi.png | Bin 0 -> 2193 bytes root/opt/phpsysinfo/gfx/images/Porteus.png | Bin 0 -> 4217 bytes root/opt/phpsysinfo/gfx/images/Puppy.png | Bin 0 -> 4196 bytes root/opt/phpsysinfo/gfx/images/QNX.png | Bin 0 -> 4217 bytes root/opt/phpsysinfo/gfx/images/Qubes.png | Bin 0 -> 979 bytes root/opt/phpsysinfo/gfx/images/ROSA.png | Bin 0 -> 4217 bytes root/opt/phpsysinfo/gfx/images/Raspbian.png | Bin 0 -> 1911 bytes root/opt/phpsysinfo/gfx/images/ReactOS.png | Bin 0 -> 3019 bytes root/opt/phpsysinfo/gfx/images/RedFlag.png | Bin 0 -> 2193 bytes root/opt/phpsysinfo/gfx/images/RedHat.png | Bin 0 -> 469 bytes root/opt/phpsysinfo/gfx/images/Rubix.png | Bin 0 -> 1403 bytes root/opt/phpsysinfo/gfx/images/SMEServer.png | Bin 0 -> 3211 bytes root/opt/phpsysinfo/gfx/images/SMS.png | Bin 0 -> 2193 bytes root/opt/phpsysinfo/gfx/images/SUSE.png | Bin 0 -> 3211 bytes root/opt/phpsysinfo/gfx/images/Sabayon.png | Bin 0 -> 3211 bytes root/opt/phpsysinfo/gfx/images/Salix.png | Bin 0 -> 2193 bytes root/opt/phpsysinfo/gfx/images/Scientific.png | Bin 0 -> 3925 bytes root/opt/phpsysinfo/gfx/images/Semplice.png | Bin 0 -> 1925 bytes root/opt/phpsysinfo/gfx/images/Slackware.png | Bin 0 -> 2551 bytes root/opt/phpsysinfo/gfx/images/Slax.png | Bin 0 -> 4217 bytes root/opt/phpsysinfo/gfx/images/SliTaz.png | Bin 0 -> 2193 bytes root/opt/phpsysinfo/gfx/images/SolusOS.png | Bin 0 -> 4217 bytes root/opt/phpsysinfo/gfx/images/SolydXK.png | Bin 0 -> 2193 bytes root/opt/phpsysinfo/gfx/images/StartOS.png | Bin 0 -> 1510 bytes root/opt/phpsysinfo/gfx/images/SteamOS.png | Bin 0 -> 2225 bytes root/opt/phpsysinfo/gfx/images/SunOS.png | Bin 0 -> 2754 bytes root/opt/phpsysinfo/gfx/images/Synology.png | Bin 0 -> 4196 bytes root/opt/phpsysinfo/gfx/images/Tails.png | Bin 0 -> 2193 bytes root/opt/phpsysinfo/gfx/images/Tanglu.png | Bin 0 -> 2193 bytes root/opt/phpsysinfo/gfx/images/TinyCore.png | Bin 0 -> 3943 bytes root/opt/phpsysinfo/gfx/images/Tizen.png | Bin 0 -> 1933 bytes root/opt/phpsysinfo/gfx/images/Trisquel.png | Bin 0 -> 4217 bytes root/opt/phpsysinfo/gfx/images/Trustix.png | Bin 0 -> 2155 bytes root/opt/phpsysinfo/gfx/images/Turbo.png | Bin 0 -> 4217 bytes root/opt/phpsysinfo/gfx/images/Ubuntu.png | Bin 0 -> 1164 bytes .../phpsysinfo/gfx/images/UltimateEdition.png | Bin 0 -> 2193 bytes root/opt/phpsysinfo/gfx/images/Vector.png | Bin 0 -> 3599 bytes root/opt/phpsysinfo/gfx/images/VortexBox.png | Bin 0 -> 3193 bytes root/opt/phpsysinfo/gfx/images/Win2000.png | Bin 0 -> 4196 bytes root/opt/phpsysinfo/gfx/images/Win8.png | Bin 0 -> 903 bytes root/opt/phpsysinfo/gfx/images/WinVista.png | Bin 0 -> 2691 bytes root/opt/phpsysinfo/gfx/images/WinXP.png | Bin 0 -> 2512 bytes root/opt/phpsysinfo/gfx/images/Zenwalk.png | Bin 0 -> 3211 bytes root/opt/phpsysinfo/gfx/images/Zorin.png | Bin 0 -> 4217 bytes root/opt/phpsysinfo/gfx/images/antiX.png | Bin 0 -> 4857 bytes .../phpsysinfo/gfx/images/elementaryOS.png | Bin 0 -> 987 bytes root/opt/phpsysinfo/gfx/images/free-eos.png | Bin 0 -> 1676 bytes root/opt/phpsysinfo/gfx/images/gNewSense.png | Bin 0 -> 6137 bytes root/opt/phpsysinfo/gfx/images/iycc.png | Bin 0 -> 1636 bytes root/opt/phpsysinfo/gfx/images/openSUSE.png | Bin 0 -> 908 bytes root/opt/phpsysinfo/gfx/images/pfSense.png | Bin 0 -> 1169 bytes root/opt/phpsysinfo/gfx/images/unknown.png | Bin 0 -> 31826 bytes root/opt/phpsysinfo/gfx/logo_48.png | Bin 0 -> 1819 bytes root/opt/phpsysinfo/gfx/next.png | Bin 0 -> 169 bytes root/opt/phpsysinfo/gfx/prev.png | Bin 0 -> 173 bytes root/opt/phpsysinfo/gfx/reload.png | Bin 0 -> 685 bytes root/opt/phpsysinfo/gfx/sort_asc.png | Bin 0 -> 217 bytes root/opt/phpsysinfo/gfx/sort_both.png | Bin 0 -> 246 bytes root/opt/phpsysinfo/gfx/sort_desc.png | Bin 0 -> 215 bytes root/opt/phpsysinfo/gfx/treeTable/blank.gif | Bin 0 -> 55 bytes .../gfx/treeTable/tv-collapsable-last.gif | Bin 0 -> 129 bytes .../gfx/treeTable/tv-collapsable.gif | Bin 0 -> 90 bytes .../gfx/treeTable/tv-expandable-last.gif | Bin 0 -> 131 bytes .../gfx/treeTable/tv-expandable.gif | Bin 0 -> 133 bytes .../phpsysinfo/gfx/treeTable/tv-item-last.gif | Bin 0 -> 66 bytes root/opt/phpsysinfo/gfx/treeTable/tv-item.gif | Bin 0 -> 70 bytes .../opt/phpsysinfo/gfx/treeTable/vertline.gif | Bin 0 -> 68 bytes .../phpsysinfo/includes/autoloader.inc.php | 73 + .../includes/class.CommonFunctions.inc.php | 563 + .../phpsysinfo/includes/class.Parser.inc.php | 216 + .../includes/error/class.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 + root/opt/phpsysinfo/includes/js/README | 10 + .../js/class.JavaScriptPacker.inc.php | 788 ++ .../includes/mb/class.coretemp.inc.php | 62 + .../includes/mb/class.freeipmi.inc.php | 177 + .../includes/mb/class.hddtemp.inc.php | 135 + .../includes/mb/class.healthd.inc.php | 159 + .../includes/mb/class.hwsensors.inc.php | 156 + .../phpsysinfo/includes/mb/class.ipmi.inc.php | 197 + .../includes/mb/class.ipmiutil.inc.php | 220 + .../includes/mb/class.k8temp.inc.php | 91 + .../includes/mb/class.lmsensors.inc.php | 411 + .../phpsysinfo/includes/mb/class.mbm5.inc.php | 138 + .../includes/mb/class.mbmon.inc.php | 143 + .../phpsysinfo/includes/mb/class.ohm.inc.php | 145 + .../includes/mb/class.pitemp.inc.php | 62 + .../includes/mb/class.sensors.inc.php | 64 + .../includes/mb/class.thermalzone.inc.php | 132 + .../phpsysinfo/includes/os/class.AIX.inc.php | 381 + .../includes/os/class.Android.inc.php | 254 + .../includes/os/class.BSDCommon.inc.php | 592 + .../includes/os/class.Darwin.inc.php | 464 + .../includes/os/class.DragonFly.inc.php | 153 + .../includes/os/class.FreeBSD.inc.php | 190 + .../phpsysinfo/includes/os/class.HPUX.inc.php | 404 + .../includes/os/class.Haiku.inc.php | 403 + .../includes/os/class.Linux.inc.php | 1096 ++ .../includes/os/class.Minix.inc.php | 382 + .../includes/os/class.NetBSD.inc.php | 159 + .../phpsysinfo/includes/os/class.OS.inc.php | 85 + .../includes/os/class.OpenBSD.inc.php | 174 + .../phpsysinfo/includes/os/class.QNX.inc.php | 256 + .../includes/os/class.SunOS.inc.php | 349 + .../includes/os/class.WINNT.inc.php | 609 + .../includes/output/class.Output.inc.php | 60 + .../includes/output/class.Template.inc.php | 93 + .../includes/output/class.Webpage.inc.php | 139 + .../includes/output/class.WebpageXML.inc.php | 189 + .../includes/output/class.WebpageXSLT.inc.php | 54 + .../includes/plugin/class.PSI_Plugin.inc.php | 134 + .../includes/to/class.MBInfo.inc.php | 201 + .../includes/to/class.System.inc.php | 1167 ++ .../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 + .../includes/ups/class.apcupsd.inc.php | 145 + .../phpsysinfo/includes/ups/class.nut.inc.php | 142 + .../includes/ups/class.pmset.inc.php | 90 + .../includes/ups/class.powersoftplus.inc.php | 115 + .../phpsysinfo/includes/ups/class.ups.inc.php | 64 + .../xml/class.SimpleXMLExtended.inc.php | 212 + .../phpsysinfo/includes/xml/class.XML.inc.php | 742 ++ root/opt/phpsysinfo/index.php | 71 + root/opt/phpsysinfo/js.php | 85 + root/opt/phpsysinfo/js/jQuery/README | 58 + .../opt/phpsysinfo/js/jQuery/README_bootstrap | 25 + root/opt/phpsysinfo/js/jQuery/jquery-1.js | 10351 ++++++++++++++++ .../phpsysinfo/js/jQuery/jquery.dataTables.js | 7440 +++++++++++ .../opt/phpsysinfo/js/jQuery/jquery.jgrowl.js | 338 + root/opt/phpsysinfo/js/jQuery/jquery.js | 9210 ++++++++++++++ .../phpsysinfo/js/jQuery/jquery.nyroModal.js | 1707 +++ .../opt/phpsysinfo/js/jQuery/jquery.timers.js | 75 + .../phpsysinfo/js/jQuery/jquery.treeTable.js | 124 + .../phpsysinfo/js/jQuery/jquery.treegrid.js | 626 + .../phpsysinfo/js/phpSysInfo/phpsysinfo.js | 1621 +++ .../js/phpSysInfo/phpsysinfo_bootstrap.js | 1172 ++ root/opt/phpsysinfo/js/vendor/README | 37 + .../opt/phpsysinfo/js/vendor/bootstrap.min.js | 7 + root/opt/phpsysinfo/js/vendor/console-shim.js | 32 + .../js/vendor/html5shiv-printshiv.js | 520 + root/opt/phpsysinfo/js/vendor/sorttable.js | 503 + .../opt/phpsysinfo/js/vendor/sorttable_org.js | 495 + root/opt/phpsysinfo/js/vendor/transparency.js | 784 ++ root/opt/phpsysinfo/language/ast.xml | 363 + root/opt/phpsysinfo/language/bg.xml | 363 + root/opt/phpsysinfo/language/ca.xml | 363 + root/opt/phpsysinfo/language/cz.xml | 363 + root/opt/phpsysinfo/language/da.xml | 363 + root/opt/phpsysinfo/language/de.xml | 363 + root/opt/phpsysinfo/language/en.xml | 363 + root/opt/phpsysinfo/language/es.xml | 363 + root/opt/phpsysinfo/language/et.xml | 363 + root/opt/phpsysinfo/language/fi.xml | 363 + root/opt/phpsysinfo/language/fr.xml | 363 + root/opt/phpsysinfo/language/gl.xml | 363 + root/opt/phpsysinfo/language/gr.xml | 363 + root/opt/phpsysinfo/language/he.xml | 363 + root/opt/phpsysinfo/language/hu.xml | 363 + root/opt/phpsysinfo/language/is.xml | 363 + root/opt/phpsysinfo/language/it.xml | 363 + root/opt/phpsysinfo/language/ja.xml | 363 + root/opt/phpsysinfo/language/ko.xml | 363 + root/opt/phpsysinfo/language/language.php | 68 + root/opt/phpsysinfo/language/nl.xml | 363 + root/opt/phpsysinfo/language/no.xml | 363 + root/opt/phpsysinfo/language/pl.xml | 363 + root/opt/phpsysinfo/language/pt-br.xml | 363 + root/opt/phpsysinfo/language/pt-pt.xml | 363 + root/opt/phpsysinfo/language/ro.xml | 363 + root/opt/phpsysinfo/language/ru.xml | 363 + root/opt/phpsysinfo/language/sk.xml | 363 + root/opt/phpsysinfo/language/sl.xml | 363 + root/opt/phpsysinfo/language/sv.xml | 363 + root/opt/phpsysinfo/language/th.xml | 363 + root/opt/phpsysinfo/language/tr.xml | 363 + .../language/translation-plugin.xsd | 34 + root/opt/phpsysinfo/language/translation.xsd | 35 + root/opt/phpsysinfo/language/tw.xml | 363 + root/opt/phpsysinfo/language/uk.xml | 363 + root/opt/phpsysinfo/language/zh.xml | 363 + root/opt/phpsysinfo/phpsysinfo.ini.new | 538 + root/opt/phpsysinfo/phpsysinfo.xslt | 1206 ++ root/opt/phpsysinfo/phpsysinfo3.xsd | 465 + .../phpsysinfo/plugins/bat/bat_bootstrap.html | 61 + .../phpsysinfo/plugins/bat/class.bat.inc.php | 539 + root/opt/phpsysinfo/plugins/bat/js/bat.js | 168 + .../plugins/bat/js/bat_bootstrap.js | 70 + root/opt/phpsysinfo/plugins/bat/lang/cz.xml | 48 + root/opt/phpsysinfo/plugins/bat/lang/de.xml | 48 + root/opt/phpsysinfo/plugins/bat/lang/en.xml | 48 + root/opt/phpsysinfo/plugins/bat/lang/fr.xml | 48 + root/opt/phpsysinfo/plugins/bat/lang/pl.xml | 48 + root/opt/phpsysinfo/plugins/bat/lang/ro.xml | 48 + root/opt/phpsysinfo/plugins/bat/lang/ru.xml | 48 + .../plugins/dmraid/class.dmraid.inc.php | 176 + .../phpsysinfo/plugins/dmraid/css/dmraid.css | 14 + .../plugins/dmraid/dmraid_bootstrap.html | 9 + .../phpsysinfo/plugins/dmraid/gfx/error.png | Bin 0 -> 3617 bytes .../plugins/dmraid/gfx/harddrivefail.png | Bin 0 -> 3920 bytes .../plugins/dmraid/gfx/harddriveok.png | Bin 0 -> 3675 bytes .../plugins/dmraid/gfx/harddrivespare.png | Bin 0 -> 1749 bytes .../plugins/dmraid/gfx/harddrivewarn.png | Bin 0 -> 10979 bytes .../phpsysinfo/plugins/dmraid/js/dmraid.js | 176 + .../plugins/dmraid/js/dmraid_bootstrap.js | 95 + .../opt/phpsysinfo/plugins/dmraid/lang/en.xml | 42 + .../opt/phpsysinfo/plugins/dmraid/lang/fr.xml | 41 + .../opt/phpsysinfo/plugins/dmraid/lang/ro.xml | 42 + .../opt/phpsysinfo/plugins/dmraid/lang/ru.xml | 41 + .../plugins/ipmiinfo/class.ipmiinfo.inc.php | 269 + .../plugins/ipmiinfo/ipmiinfo_bootstrap.html | 15 + .../plugins/ipmiinfo/js/ipmiinfo.js | 153 + .../plugins/ipmiinfo/js/ipmiinfo_bootstrap.js | 36 + .../phpsysinfo/plugins/ipmiinfo/lang/cz.xml | 33 + .../phpsysinfo/plugins/ipmiinfo/lang/de.xml | 33 + .../phpsysinfo/plugins/ipmiinfo/lang/en.xml | 33 + .../phpsysinfo/plugins/ipmiinfo/lang/fr.xml | 33 + .../phpsysinfo/plugins/ipmiinfo/lang/pl.xml | 33 + .../phpsysinfo/plugins/ipmiinfo/lang/ro.xml | 33 + .../phpsysinfo/plugins/ipmiinfo/lang/ru.xml | 33 + .../plugins/mdstatus/class.mdstatus.inc.php | 236 + .../plugins/mdstatus/css/mdstatus.css | 14 + .../phpsysinfo/plugins/mdstatus/gfx/error.png | Bin 0 -> 3617 bytes .../plugins/mdstatus/gfx/harddrivefail.png | Bin 0 -> 3920 bytes .../plugins/mdstatus/gfx/harddriveok.png | Bin 0 -> 3675 bytes .../plugins/mdstatus/gfx/harddrivespare.png | Bin 0 -> 1749 bytes .../plugins/mdstatus/js/mdstatus.js | 225 + .../plugins/mdstatus/js/mdstatus_bootstrap.js | 146 + .../phpsysinfo/plugins/mdstatus/lang/cz.xml | 57 + .../phpsysinfo/plugins/mdstatus/lang/de.xml | 57 + .../phpsysinfo/plugins/mdstatus/lang/en.xml | 57 + .../phpsysinfo/plugins/mdstatus/lang/fr.xml | 57 + .../phpsysinfo/plugins/mdstatus/lang/gr.xml | 57 + .../phpsysinfo/plugins/mdstatus/lang/ro.xml | 57 + .../phpsysinfo/plugins/mdstatus/lang/ru.xml | 57 + .../plugins/mdstatus/mdstatus_bootstrap.html | 9 + .../phpsysinfo/plugins/ps/class.ps.inc.php | 254 + root/opt/phpsysinfo/plugins/ps/js/ps.js | 120 + .../phpsysinfo/plugins/ps/js/ps_bootstrap.js | 38 + root/opt/phpsysinfo/plugins/ps/lang/cz.xml | 27 + root/opt/phpsysinfo/plugins/ps/lang/de.xml | 27 + root/opt/phpsysinfo/plugins/ps/lang/en.xml | 27 + root/opt/phpsysinfo/plugins/ps/lang/fr.xml | 27 + root/opt/phpsysinfo/plugins/ps/lang/gr.xml | 27 + root/opt/phpsysinfo/plugins/ps/lang/pl.xml | 27 + root/opt/phpsysinfo/plugins/ps/lang/ro.xml | 27 + root/opt/phpsysinfo/plugins/ps/lang/ru.xml | 27 + .../phpsysinfo/plugins/ps/ps_bootstrap.html | 27 + .../plugins/psstatus/class.psstatus.inc.php | 179 + .../plugins/psstatus/css/psstatus.css | 6 + .../plugins/psstatus/gfx/offline.png | Bin 0 -> 993 bytes .../plugins/psstatus/gfx/online.png | Bin 0 -> 755 bytes .../plugins/psstatus/js/psstatus.js | 124 + .../plugins/psstatus/js/psstatus_bootstrap.js | 27 + .../phpsysinfo/plugins/psstatus/lang/cz.xml | 21 + .../phpsysinfo/plugins/psstatus/lang/de.xml | 21 + .../phpsysinfo/plugins/psstatus/lang/en.xml | 21 + .../phpsysinfo/plugins/psstatus/lang/fr.xml | 21 + .../phpsysinfo/plugins/psstatus/lang/gr.xml | 21 + .../phpsysinfo/plugins/psstatus/lang/pl.xml | 21 + .../phpsysinfo/plugins/psstatus/lang/ro.xml | 21 + .../phpsysinfo/plugins/psstatus/lang/ru.xml | 21 + .../plugins/psstatus/psstatus_bootstrap.html | 21 + .../plugins/quotas/class.quotas.inc.php | 132 + .../phpsysinfo/plugins/quotas/css/quotas.css | 7 + .../phpsysinfo/plugins/quotas/js/quotas.js | 146 + .../plugins/quotas/js/quotas_bootstrap.js | 50 + .../opt/phpsysinfo/plugins/quotas/lang/cz.xml | 42 + .../opt/phpsysinfo/plugins/quotas/lang/de.xml | 42 + .../opt/phpsysinfo/plugins/quotas/lang/en.xml | 42 + .../opt/phpsysinfo/plugins/quotas/lang/fr.xml | 42 + .../opt/phpsysinfo/plugins/quotas/lang/pl.xml | 42 + .../opt/phpsysinfo/plugins/quotas/lang/ro.xml | 42 + .../opt/phpsysinfo/plugins/quotas/lang/ru.xml | 42 + .../plugins/quotas/quotas_bootstrap.html | 35 + .../plugins/smart/class.smart.inc.php | 302 + .../phpsysinfo/plugins/smart/css/smart.css | 6 + root/opt/phpsysinfo/plugins/smart/js/smart.js | 166 + .../plugins/smart/js/smart_bootstrap.js | 84 + root/opt/phpsysinfo/plugins/smart/lang/cz.xml | 97 + root/opt/phpsysinfo/plugins/smart/lang/en.xml | 97 + root/opt/phpsysinfo/plugins/smart/lang/fr.xml | 97 + root/opt/phpsysinfo/plugins/smart/lang/gr.xml | 97 + root/opt/phpsysinfo/plugins/smart/lang/pl.xml | 97 + root/opt/phpsysinfo/plugins/smart/lang/ro.xml | 97 + root/opt/phpsysinfo/plugins/smart/lang/ru.xml | 42 + .../plugins/smart/smart_bootstrap.html | 9 + .../plugins/snmppinfo/class.snmppinfo.inc.php | 239 + .../plugins/snmppinfo/js/snmppinfo.js | 139 + .../snmppinfo/js/snmppinfo_bootstrap.js | 106 + .../phpsysinfo/plugins/snmppinfo/lang/cz.xml | 30 + .../phpsysinfo/plugins/snmppinfo/lang/de.xml | 30 + .../phpsysinfo/plugins/snmppinfo/lang/en.xml | 30 + .../phpsysinfo/plugins/snmppinfo/lang/fr.xml | 29 + .../phpsysinfo/plugins/snmppinfo/lang/pl.xml | 30 + .../phpsysinfo/plugins/snmppinfo/lang/ro.xml | 30 + .../phpsysinfo/plugins/snmppinfo/lang/ru.xml | 30 + .../snmppinfo/snmppinfo_bootstrap.html | 9 + .../class.updatenotifier.inc.php | 109 + .../updatenotifier/js/updatenotifier.js | 107 + .../js/updatenotifier_bootstrap.js | 25 + .../plugins/updatenotifier/lang/cz.xml | 24 + .../plugins/updatenotifier/lang/de.xml | 24 + .../plugins/updatenotifier/lang/en.xml | 24 + .../plugins/updatenotifier/lang/fr.xml | 24 + .../plugins/updatenotifier/lang/pl.xml | 24 + .../plugins/updatenotifier/lang/ro.xml | 24 + .../plugins/updatenotifier/lang/ru.xml | 24 + .../updatenotifier_bootstrap.html | 12 + .../plugins/uprecords/class.uprecords.inc.php | 114 + .../plugins/uprecords/js/uprecords.js | 116 + .../uprecords/js/uprecords_bootstrap.js | 25 + .../phpsysinfo/plugins/uprecords/lang/en.xml | 27 + .../phpsysinfo/plugins/uprecords/lang/fr.xml | 26 + .../phpsysinfo/plugins/uprecords/lang/hu.xml | 27 + .../phpsysinfo/plugins/uprecords/lang/pl.xml | 27 + .../phpsysinfo/plugins/uprecords/lang/ro.xml | 27 + .../phpsysinfo/plugins/uprecords/lang/ru.xml | 27 + .../uprecords/uprecords_bootstrap.html | 25 + root/opt/phpsysinfo/read_config.php | 244 + .../sample/distrotest/4MLinux/10.0-server.txt | 2 + .../sample/distrotest/ALT/6.0.0.txt | 14 + .../sample/distrotest/ALT/7.0.0-Simply.txt | 18 + .../sample/distrotest/ALT/7.0.1.txt | 18 + .../sample/distrotest/Alpine/2.6.4.txt | 2 + .../sample/distrotest/Amazon/2013.09.txt | 8 + .../sample/distrotest/Arch/2011.08.19-ISO.txt | 2 + .../sample/distrotest/Arch/2013.11.01.txt | 10 + .../sample/distrotest/Arch/2014.01.05.txt | 22 + .../sample/distrotest/BOSS/1.0-server.txt | 10 + .../phpsysinfo/sample/distrotest/BOSS/5.0.txt | 19 + .../sample/distrotest/Calculate/13.11.txt | 10 + .../sample/distrotest/Canaima/4.1.txt | 19 + .../sample/distrotest/CentOS/5.6.txt | 8 + .../sample/distrotest/CentOS/6.5-SF.txt | 6 + .../sample/distrotest/CentOS/6.5.txt | 14 + .../sample/distrotest/CentOS/7.1.1503.txt | 23 + .../sample/distrotest/Chakra/2013.02.txt | 21 + .../sample/distrotest/ClearOS/6.4.0-Beta.txt | 6 + .../sample/distrotest/Cloud/5.10.txt | 10 + .../sample/distrotest/Cloud/6.4.txt | 12 + .../sample/distrotest/CoreOS/367.1.0.txt | 15 + .../phpsysinfo/sample/distrotest/Crux/2.8.txt | 2 + .../sample/distrotest/Debian/5.0.3.txt | 2 + .../sample/distrotest/Debian/6.0.6.txt | 7 + .../Debian/8-20140106-netinstall.txt | 6 + .../sample/distrotest/Debian/8-20140106.txt | 15 + .../sample/distrotest/Deepin/2013.txt | 22 + .../sample/distrotest/Eisfair/2-1.8.1.txt | 4 + .../sample/distrotest/Fedora/20-lsb.txt | 26 + .../sample/distrotest/Fedora/20.txt | 20 + .../phpsysinfo/sample/distrotest/Fedora/4.txt | 12 + .../sample/distrotest/Foresight/2.5.3.txt | 2 + .../sample/distrotest/Frugalware/1.9.txt | 9 + .../sample/distrotest/Fuduntu/2013.2.txt | 19 + .../sample/distrotest/Generations/3.1.txt | 22 + .../sample/distrotest/Gentoo/2.2-NAME.txt | 18 + .../sample/distrotest/Gentoo/2.2.txt | 18 + .../sample/distrotest/Gobo/015.beta2.txt | 2 + .../sample/distrotest/Handy/2.0.txt | 19 + .../sample/distrotest/IPFire/2.13.txt | 2 + .../sample/distrotest/KaOS/2014.0301.txt | 21 + .../sample/distrotest/Korora/20.txt | 21 + .../sample/distrotest/Linaro/13.12.txt | 22 + .../sample/distrotest/Lunar/1.7.0-rc2.txt | 13 + .../phpsysinfo/sample/distrotest/Mageia/4.txt | 36 + .../sample/distrotest/Mandrake/2011.0.txt | 24 + .../sample/distrotest/Mandrake/9.2.txt | 16 + .../sample/distrotest/Manjaro/0.8.8.txt | 21 + .../sample/distrotest/Mer/0.2011.txt | 18 + .../phpsysinfo/sample/distrotest/Mint/13.txt | 12 + .../phpsysinfo/sample/distrotest/Mint/14.txt | 19 + .../phpsysinfo/sample/distrotest/Mint/15.txt | 22 + .../sample/distrotest/Netrunner/13.06-SE.txt | 22 + .../sample/distrotest/Netrunner/13.06.txt | 22 + .../sample/distrotest/Netrunner/2014.04.txt | 22 + .../sample/distrotest/NixOS/13.10.txt | 7 + .../distrotest/OpenMandriva/2013.0-RC1.txt | 41 + .../sample/distrotest/Oracle/5.10-el.txt | 12 + .../sample/distrotest/Oracle/6.3.txt | 12 + .../sample/distrotest/PCLinuxOS/2012.06.txt | 26 + .../phpsysinfo/sample/distrotest/PLD/2.99.txt | 2 + .../phpsysinfo/sample/distrotest/PLD/3.0.txt | 11 + .../sample/distrotest/Parsix/5.0.txt | 19 + .../sample/distrotest/Parsix/6.0.txt | 19 + .../sample/distrotest/Pear/5.00.txt | 12 + .../sample/distrotest/Pear/6.1-LTS.txt | 20 + .../phpsysinfo/sample/distrotest/Pear/6.1.txt | 19 + .../phpsysinfo/sample/distrotest/Pear/7.0.txt | 20 + .../sample/distrotest/Peppermint/3.txt | 12 + .../distrotest/Peppermint/4-20131113.txt | 22 + .../phpsysinfo/sample/distrotest/Pisi/1.0.txt | 15 + .../sample/distrotest/Porteus/2.1.txt | 15 + .../sample/distrotest/Puppy/431.txt | 11 + .../sample/distrotest/Puppy/5.3-wary.txt | 23 + .../sample/distrotest/Puppy/5.3.3-slacko.txt | 22 + .../sample/distrotest/Puppy/528-lucid.txt | 22 + .../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 + .../sample/distrotest/ROSA/6.5-Server.txt | 14 + .../sample/distrotest/Raspbian/7.txt | 13 + .../sample/distrotest/Raspbian/8.0.txt | 17 + .../sample/distrotest/RedFlag/8.0.txt | 23 + .../sample/distrotest/RedHat/6.0.txt | 10 + .../sample/distrotest/RedHat/7.0-Beta.txt | 17 + .../sample/distrotest/SMEServer/8.1beta3.txt | 11 + .../sample/distrotest/SMEServer/9.0beta3.txt | 8 + .../sample/distrotest/SMS/2.0.5.txt | 15 + .../sample/distrotest/Sabayon/14.01.txt | 22 + .../sample/distrotest/Salix/14.0.txt | 15 + .../sample/distrotest/Scientific/6.3-lsb.txt | 10 + .../sample/distrotest/Scientific/6.3.txt | 4 + .../sample/distrotest/Scientific/6.4.txt | 12 + .../sample/distrotest/Semplice/6.txt | 22 + .../sample/distrotest/Slackware/14.0.txt | 13 + .../sample/distrotest/Slax/7.0.1.txt | 15 + .../distrotest/SliTaz/2014.02.16-cooking.txt | 2 + .../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 + .../sample/distrotest/StartOS/5.0.txt | 4 + .../sample/distrotest/StartOS/6.0.txt | 4 + .../sample/distrotest/SteamOS/1.0-beta.txt | 23 + .../sample/distrotest/Synology/4.1-2668.txt | 264 + .../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 + .../sample/distrotest/Trisquel/6.0.txt | 19 + .../sample/distrotest/Turbo/12.5.txt | 2 + .../sample/distrotest/Ubuntu/10.04.txt | 7 + .../sample/distrotest/Ubuntu/12.04.txt | 19 + .../sample/distrotest/Ubuntu/13.10.txt | 22 + .../sample/distrotest/UltimateEdition/3.9.txt | 19 + .../sample/distrotest/Vector/647.0.txt | 4 + .../sample/distrotest/VortexBox/2.2.txt | 8 + .../sample/distrotest/VortexBox/2.3-beta.txt | 22 + .../sample/distrotest/Zenwalk/7.4.txt | 11 + .../phpsysinfo/sample/distrotest/Zorin/6.txt | 19 + .../phpsysinfo/sample/distrotest/Zorin/7.txt | 22 + .../phpsysinfo/sample/distrotest/Zorin/8.txt | 22 + .../sample/distrotest/antiX/2012.07.06.txt | 9 + .../sample/distrotest/elementaryOS/0.2.txt | 19 + .../sample/distrotest/gNewSense/3.0.txt | 12 + .../sample/distrotest/openSUSE/11.3.txt | 9 + .../sample/distrotest/openSUSE/13.1.txt | 18 + .../phpsysinfo/sample/logs/log_android21.txt | 270 + .../phpsysinfo/sample/logs/log_android412.txt | 443 + .../phpsysinfo/sample/logs/log_bluestacks.txt | 202 + .../phpsysinfo/sample/logs/log_debian7.txt | 153 + root/opt/phpsysinfo/sample/logs/log_sf.txt | 697 ++ root/opt/phpsysinfo/sample/main/1-cpuinfo.txt | 21 + root/opt/phpsysinfo/sample/main/1-dfiP.txt | 6 + root/opt/phpsysinfo/sample/main/1-dfkP.txt | 6 + root/opt/phpsysinfo/sample/main/1-mount.txt | 10 + root/opt/phpsysinfo/sample/main/README | 6 + root/opt/phpsysinfo/sample/main/cpuinfo1.txt | 21 + root/opt/phpsysinfo/sample/main/cpuinfo2.txt | 12 + root/opt/phpsysinfo/sample/main/cpuinfo3.txt | 17 + root/opt/phpsysinfo/sample/main/cpuinfo4.txt | 14 + root/opt/phpsysinfo/sample/main/cpuinfo5.txt | 12 + root/opt/phpsysinfo/sample/main/cpuinfo6.txt | 12 + root/opt/phpsysinfo/sample/main/cpuinfo7.txt | 24 + root/opt/phpsysinfo/sample/main/cpuinfo8.txt | 17 + root/opt/phpsysinfo/sample/main/cpuinfo9.txt | 10 + root/opt/phpsysinfo/sample/main/dev1.txt | 6 + root/opt/phpsysinfo/sample/main/df1.txt | 24 + root/opt/phpsysinfo/sample/main/mount1.txt | 23 + root/opt/phpsysinfo/sample/main/pmset1.txt | 2 + root/opt/phpsysinfo/sample/main/pmset2.txt | 2 + root/opt/phpsysinfo/sample/main/pmset3.txt | 2 + root/opt/phpsysinfo/sample/main/pmset4.txt | 2 + root/opt/phpsysinfo/sample/main/swaps1.txt | 2 + root/opt/phpsysinfo/sample/main/vm_stat1.txt | 12 + root/opt/phpsysinfo/sample/main/vm_stat2.txt | 13 + root/opt/phpsysinfo/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 + .../sample/motherboard/mbm5/MBM51.csv | 11 + root/opt/phpsysinfo/sample/plugin_bat/README | 4 + .../sample/plugin_bat/ac_state1.txt | 1 + .../sample/plugin_bat/battery_info1.txt | 13 + .../sample/plugin_bat/battery_state1.txt | 6 + .../sample/plugin_bat/log_LenovoT530.txt | 31 + .../sample/plugin_bat/log_android233.txt | 37 + .../sample/plugin_bat/log_android412.txt | 20 + .../sample/plugin_bat/log_android422.txt | 33 + .../sample/plugin_bat/log_darwin_1.txt | 41 + .../sample/plugin_bat/log_freebsd_1.txt | 18 + .../sample/plugin_bat/log_freebsd_2.txt | 18 + .../sample/plugin_bat/log_test_1.txt | 22 + .../sample/plugin_bat/log_test_2.txt | 22 + .../phpsysinfo/sample/plugin_bat/log_vbox.txt | 31 + .../sample/plugin_dmraid/dmraid1.txt | 98 + .../sample/plugin_dmraid/dmraid2.txt | 121 + .../sample/plugin_dmraid/dmraid3.txt | 22 + .../sample/plugin_dmraid/dmraid4.txt | 63 + .../sample/plugin_dmraid/dmraid5.txt | 31 + .../phpsysinfo/sample/plugin_mdstat/README | 2 + .../phpsysinfo/sample/plugin_mdstat/raid1.txt | 5 + .../sample/plugin_mdstat/raid10.txt | 6 + .../sample/plugin_mdstat/raid11.txt | 6 + .../sample/plugin_mdstat/raid12.txt | 6 + .../phpsysinfo/sample/plugin_mdstat/raid2.txt | 5 + .../phpsysinfo/sample/plugin_mdstat/raid3.txt | 5 + .../phpsysinfo/sample/plugin_mdstat/raid4.txt | 6 + .../phpsysinfo/sample/plugin_mdstat/raid5.txt | 5 + .../phpsysinfo/sample/plugin_mdstat/raid6.txt | 6 + .../phpsysinfo/sample/plugin_mdstat/raid7.txt | 5 + .../phpsysinfo/sample/plugin_mdstat/raid8.txt | 11 + .../phpsysinfo/sample/plugin_mdstat/raid9.txt | 6 + root/opt/phpsysinfo/sample/plugin_ps/README | 3 + root/opt/phpsysinfo/sample/plugin_ps/ps1.txt | 39 + root/opt/phpsysinfo/sample/plugin_ps/ps2.txt | 127 + .../phpsysinfo/sample/plugin_psstatus/README | 2 + .../sample/plugin_psstatus/psstatus1.txt | 7 + .../phpsysinfo/sample/plugin_quotas/README | 2 + .../sample/plugin_quotas/quotas1.txt | 5 + .../phpsysinfo/sample/plugin_smart/smart0.txt | 43 + .../phpsysinfo/sample/plugin_smart/smart1.txt | 86 + .../plugin_updatenotifier/ubuntu-landscape | 4 + .../plugin_updatenotifier/universal-format | 1 + .../phpsysinfo/sample/processes/processes.txt | 71 + .../phpsysinfo/sample/ups/1-upscDell2700.txt | 74 + .../phpsysinfo/sample/ups/1-upscPW5110.txt | 19 + root/opt/phpsysinfo/sample/ups/1-upscl.txt | 1 + root/opt/phpsysinfo/sample/ups/apcaccess1.txt | 53 + .../phpsysinfo/sample/ups/powersoftplus1.txt | 16 + root/opt/phpsysinfo/templates/aqua.css | 161 + .../templates/aqua/aq_background.gif | Bin 0 -> 291 bytes root/opt/phpsysinfo/templates/blue.css | 146 + root/opt/phpsysinfo/templates/blue/bar.png | Bin 0 -> 1067 bytes .../opt/phpsysinfo/templates/blue/barwarn.png | Bin 0 -> 974 bytes root/opt/phpsysinfo/templates/blue/bg.png | Bin 0 -> 9687 bytes root/opt/phpsysinfo/templates/blue/title.png | Bin 0 -> 1169 bytes root/opt/phpsysinfo/templates/clean.css | 141 + root/opt/phpsysinfo/templates/cleansyn.css | 142 + root/opt/phpsysinfo/templates/cream.css | 141 + root/opt/phpsysinfo/templates/cream/bg.gif | Bin 0 -> 219 bytes .../templates/html/error_config.html | 22 + .../phpsysinfo/templates/html/index_all.html | 40 + .../templates/html/index_bootstrap.html | 375 + .../templates/html/index_dynamic.html | 233 + root/opt/phpsysinfo/templates/idash.css | 151 + root/opt/phpsysinfo/templates/idash/bg.png | Bin 0 -> 30344 bytes root/opt/phpsysinfo/templates/idash/html.gif | Bin 0 -> 120 bytes .../phpsysinfo/templates/idash/htmlwarn.gif | Bin 0 -> 120 bytes root/opt/phpsysinfo/templates/jstyle_blue.css | 137 + .../opt/phpsysinfo/templates/jstyle_green.css | 142 + root/opt/phpsysinfo/templates/nextgen.css | 152 + .../templates/nextgen/nextgen_bg.png | Bin 0 -> 30250 bytes root/opt/phpsysinfo/templates/phpsysinfo.css | 142 + .../templates/phpsysinfo_bootstrap.css | 84 + .../templates/plugin/jquery.dataTables.css | 14 + .../templates/plugin/jquery.jgrowl.css | 132 + .../templates/plugin/jquery.treeTable.css | 37 + .../templates/plugin/nyroModal.full.css | 105 + root/opt/phpsysinfo/templates/two.css | 123 + .../opt/phpsysinfo/templates/two/gradient.png | Bin 0 -> 525 bytes .../templates/vendor/bootstrap.min.css | 5 + root/opt/phpsysinfo/tools/MakeRelease.sh | 32 + root/opt/phpsysinfo/tools/README | 4 + root/opt/phpsysinfo/tools/aptana/js.xml | 43 + root/opt/phpsysinfo/tools/aptana/php.xml | 90 + root/opt/phpsysinfo/tools/check.sh | 15 + root/opt/phpsysinfo/tools/checkdistro.php | 208 + root/opt/phpsysinfo/tools/distrotest.php | 44 + root/opt/phpsysinfo/tools/lint.bat | 10 + root/opt/phpsysinfo/xml.php | 60 + smeserver-phpsysinfo.spec | 148 + 693 files changed, 86806 insertions(+), 2 deletions(-) create mode 100644 .gitignore create mode 100644 Makefile create mode 100644 additional/CHANGELOG.git create mode 100644 additional/README.md create mode 100644 additional/smeserver-phpsysinfo.spec create mode 100644 contriborbase create mode 100644 createlinks create mode 100644 root/etc/e-smith/db/accounts/defaults/phpsysinfo/type create mode 100644 root/etc/e-smith/db/configuration/defaults/phpsysinfo/access create mode 100644 root/etc/e-smith/db/configuration/defaults/phpsysinfo/type create mode 100644 root/etc/e-smith/templates/etc/httpd/conf/httpd.conf/86PhpsysinfoAlias create mode 100644 root/etc/e-smith/templates/etc/httpd/conf/httpd.conf/VirtualHosts/30PhpsysinfoAlias create mode 100644 root/etc/e-smith/web/functions/phpsysinfo create mode 100644 root/opt/phpsysinfo/.gitignore create mode 100644 root/opt/phpsysinfo/.htaccess create mode 100644 root/opt/phpsysinfo/.travis.yml create mode 100644 root/opt/phpsysinfo/CHANGELOG.md create mode 100644 root/opt/phpsysinfo/COPYING create mode 100644 root/opt/phpsysinfo/Dockerfile create mode 100644 root/opt/phpsysinfo/README.md create mode 100644 root/opt/phpsysinfo/README_PLUGIN.md create mode 100644 root/opt/phpsysinfo/composer.json create mode 100644 root/opt/phpsysinfo/data/ModelTranslation.txt create mode 100644 root/opt/phpsysinfo/data/distros.ini create mode 100644 root/opt/phpsysinfo/data/languages.ini create mode 100644 root/opt/phpsysinfo/data/osnames.ini create mode 100644 root/opt/phpsysinfo/gfx/ajax-loader.gif create mode 100644 root/opt/phpsysinfo/gfx/ajaxLoader.gif create mode 100644 root/opt/phpsysinfo/gfx/attention.png create mode 100644 root/opt/phpsysinfo/gfx/body.png create mode 100644 root/opt/phpsysinfo/gfx/bullet_toggle_minus.png create mode 100644 root/opt/phpsysinfo/gfx/bullet_toggle_plus.png create mode 100644 root/opt/phpsysinfo/gfx/close.gif create mode 100644 root/opt/phpsysinfo/gfx/favicon.ico create mode 100644 root/opt/phpsysinfo/gfx/favicon.png create mode 100644 root/opt/phpsysinfo/gfx/html.gif create mode 100644 root/opt/phpsysinfo/gfx/htmlwarn.gif create mode 100644 root/opt/phpsysinfo/gfx/images/4MLinux.png create mode 100644 root/opt/phpsysinfo/gfx/images/AIX.png create mode 100644 root/opt/phpsysinfo/gfx/images/ALT.png create mode 100644 root/opt/phpsysinfo/gfx/images/Alpine.png create mode 100644 root/opt/phpsysinfo/gfx/images/Amazon.png create mode 100644 root/opt/phpsysinfo/gfx/images/Android.png create mode 100644 root/opt/phpsysinfo/gfx/images/Apple.png create mode 100644 root/opt/phpsysinfo/gfx/images/Arch.png create mode 100644 root/opt/phpsysinfo/gfx/images/BOSS.png create mode 100644 root/opt/phpsysinfo/gfx/images/Calculate.png create mode 100644 root/opt/phpsysinfo/gfx/images/Canaima.png create mode 100644 root/opt/phpsysinfo/gfx/images/CentOS.png create mode 100644 root/opt/phpsysinfo/gfx/images/Chakra.png create mode 100644 root/opt/phpsysinfo/gfx/images/ClearOS.png create mode 100644 root/opt/phpsysinfo/gfx/images/Cloud.png create mode 100644 root/opt/phpsysinfo/gfx/images/Cobalt.png create mode 100644 root/opt/phpsysinfo/gfx/images/CoreOS.png create mode 100644 root/opt/phpsysinfo/gfx/images/Crux.png create mode 100644 root/opt/phpsysinfo/gfx/images/Darwin.png create mode 100644 root/opt/phpsysinfo/gfx/images/Debian.png create mode 100644 root/opt/phpsysinfo/gfx/images/Deepin.png create mode 100644 root/opt/phpsysinfo/gfx/images/DragonFly.png create mode 100644 root/opt/phpsysinfo/gfx/images/Eisfair.png create mode 100644 root/opt/phpsysinfo/gfx/images/Fedora.png create mode 100644 root/opt/phpsysinfo/gfx/images/Foresight.png create mode 100644 root/opt/phpsysinfo/gfx/images/FreeBSD.png create mode 100644 root/opt/phpsysinfo/gfx/images/Frugalware.png create mode 100644 root/opt/phpsysinfo/gfx/images/Fuduntu.png create mode 100644 root/opt/phpsysinfo/gfx/images/Generations.png create mode 100644 root/opt/phpsysinfo/gfx/images/Gentoo.png create mode 100644 root/opt/phpsysinfo/gfx/images/Gobo.png create mode 100644 root/opt/phpsysinfo/gfx/images/HPUX.png create mode 100644 root/opt/phpsysinfo/gfx/images/Haiku.png create mode 100644 root/opt/phpsysinfo/gfx/images/Handy.png create mode 100644 root/opt/phpsysinfo/gfx/images/IPFire.png create mode 100644 root/opt/phpsysinfo/gfx/images/KaOS.png create mode 100644 root/opt/phpsysinfo/gfx/images/Korora.png create mode 100644 root/opt/phpsysinfo/gfx/images/LFS.png create mode 100644 root/opt/phpsysinfo/gfx/images/Linaro.png create mode 100644 root/opt/phpsysinfo/gfx/images/Lunar.png create mode 100644 root/opt/phpsysinfo/gfx/images/Mageia.png create mode 100644 root/opt/phpsysinfo/gfx/images/Mandrake.png create mode 100644 root/opt/phpsysinfo/gfx/images/Manjaro.png create mode 100644 root/opt/phpsysinfo/gfx/images/Mer.png create mode 100644 root/opt/phpsysinfo/gfx/images/Minix.png create mode 100644 root/opt/phpsysinfo/gfx/images/Mint.png create mode 100644 root/opt/phpsysinfo/gfx/images/NetBSD.png create mode 100644 root/opt/phpsysinfo/gfx/images/Netrunner.png create mode 100644 root/opt/phpsysinfo/gfx/images/NixOS.png create mode 100644 root/opt/phpsysinfo/gfx/images/OpenBSD.png create mode 100644 root/opt/phpsysinfo/gfx/images/OpenMandriva.png create mode 100644 root/opt/phpsysinfo/gfx/images/Oracle.png create mode 100644 root/opt/phpsysinfo/gfx/images/PCLinuxOS.png create mode 100644 root/opt/phpsysinfo/gfx/images/PLD.png create mode 100644 root/opt/phpsysinfo/gfx/images/Parsix.png create mode 100644 root/opt/phpsysinfo/gfx/images/Pear.png create mode 100644 root/opt/phpsysinfo/gfx/images/Peppermint.png create mode 100644 root/opt/phpsysinfo/gfx/images/Pisi.png create mode 100644 root/opt/phpsysinfo/gfx/images/Porteus.png create mode 100644 root/opt/phpsysinfo/gfx/images/Puppy.png create mode 100644 root/opt/phpsysinfo/gfx/images/QNX.png create mode 100644 root/opt/phpsysinfo/gfx/images/Qubes.png create mode 100644 root/opt/phpsysinfo/gfx/images/ROSA.png create mode 100644 root/opt/phpsysinfo/gfx/images/Raspbian.png create mode 100644 root/opt/phpsysinfo/gfx/images/ReactOS.png create mode 100644 root/opt/phpsysinfo/gfx/images/RedFlag.png create mode 100644 root/opt/phpsysinfo/gfx/images/RedHat.png create mode 100644 root/opt/phpsysinfo/gfx/images/Rubix.png create mode 100644 root/opt/phpsysinfo/gfx/images/SMEServer.png create mode 100644 root/opt/phpsysinfo/gfx/images/SMS.png create mode 100644 root/opt/phpsysinfo/gfx/images/SUSE.png create mode 100644 root/opt/phpsysinfo/gfx/images/Sabayon.png create mode 100644 root/opt/phpsysinfo/gfx/images/Salix.png create mode 100644 root/opt/phpsysinfo/gfx/images/Scientific.png create mode 100644 root/opt/phpsysinfo/gfx/images/Semplice.png create mode 100644 root/opt/phpsysinfo/gfx/images/Slackware.png create mode 100644 root/opt/phpsysinfo/gfx/images/Slax.png create mode 100644 root/opt/phpsysinfo/gfx/images/SliTaz.png create mode 100644 root/opt/phpsysinfo/gfx/images/SolusOS.png create mode 100644 root/opt/phpsysinfo/gfx/images/SolydXK.png create mode 100644 root/opt/phpsysinfo/gfx/images/StartOS.png create mode 100644 root/opt/phpsysinfo/gfx/images/SteamOS.png create mode 100644 root/opt/phpsysinfo/gfx/images/SunOS.png create mode 100644 root/opt/phpsysinfo/gfx/images/Synology.png create mode 100644 root/opt/phpsysinfo/gfx/images/Tails.png create mode 100644 root/opt/phpsysinfo/gfx/images/Tanglu.png create mode 100644 root/opt/phpsysinfo/gfx/images/TinyCore.png create mode 100644 root/opt/phpsysinfo/gfx/images/Tizen.png create mode 100644 root/opt/phpsysinfo/gfx/images/Trisquel.png create mode 100644 root/opt/phpsysinfo/gfx/images/Trustix.png create mode 100644 root/opt/phpsysinfo/gfx/images/Turbo.png create mode 100644 root/opt/phpsysinfo/gfx/images/Ubuntu.png create mode 100644 root/opt/phpsysinfo/gfx/images/UltimateEdition.png create mode 100644 root/opt/phpsysinfo/gfx/images/Vector.png create mode 100644 root/opt/phpsysinfo/gfx/images/VortexBox.png create mode 100644 root/opt/phpsysinfo/gfx/images/Win2000.png create mode 100644 root/opt/phpsysinfo/gfx/images/Win8.png create mode 100644 root/opt/phpsysinfo/gfx/images/WinVista.png create mode 100644 root/opt/phpsysinfo/gfx/images/WinXP.png create mode 100644 root/opt/phpsysinfo/gfx/images/Zenwalk.png create mode 100644 root/opt/phpsysinfo/gfx/images/Zorin.png create mode 100644 root/opt/phpsysinfo/gfx/images/antiX.png create mode 100644 root/opt/phpsysinfo/gfx/images/elementaryOS.png create mode 100644 root/opt/phpsysinfo/gfx/images/free-eos.png create mode 100644 root/opt/phpsysinfo/gfx/images/gNewSense.png create mode 100644 root/opt/phpsysinfo/gfx/images/iycc.png create mode 100644 root/opt/phpsysinfo/gfx/images/openSUSE.png create mode 100644 root/opt/phpsysinfo/gfx/images/pfSense.png create mode 100644 root/opt/phpsysinfo/gfx/images/unknown.png create mode 100644 root/opt/phpsysinfo/gfx/logo_48.png create mode 100644 root/opt/phpsysinfo/gfx/next.png create mode 100644 root/opt/phpsysinfo/gfx/prev.png create mode 100644 root/opt/phpsysinfo/gfx/reload.png create mode 100644 root/opt/phpsysinfo/gfx/sort_asc.png create mode 100644 root/opt/phpsysinfo/gfx/sort_both.png create mode 100644 root/opt/phpsysinfo/gfx/sort_desc.png create mode 100644 root/opt/phpsysinfo/gfx/treeTable/blank.gif create mode 100644 root/opt/phpsysinfo/gfx/treeTable/tv-collapsable-last.gif create mode 100644 root/opt/phpsysinfo/gfx/treeTable/tv-collapsable.gif create mode 100644 root/opt/phpsysinfo/gfx/treeTable/tv-expandable-last.gif create mode 100644 root/opt/phpsysinfo/gfx/treeTable/tv-expandable.gif create mode 100644 root/opt/phpsysinfo/gfx/treeTable/tv-item-last.gif create mode 100644 root/opt/phpsysinfo/gfx/treeTable/tv-item.gif create mode 100644 root/opt/phpsysinfo/gfx/treeTable/vertline.gif create mode 100644 root/opt/phpsysinfo/includes/autoloader.inc.php create mode 100644 root/opt/phpsysinfo/includes/class.CommonFunctions.inc.php create mode 100644 root/opt/phpsysinfo/includes/class.Parser.inc.php create mode 100644 root/opt/phpsysinfo/includes/error/class.Error.inc.php create mode 100644 root/opt/phpsysinfo/includes/interface/class.PSI_Interface_OS.inc.php create mode 100644 root/opt/phpsysinfo/includes/interface/class.PSI_Interface_Output.inc.php create mode 100644 root/opt/phpsysinfo/includes/interface/class.PSI_Interface_Plugin.inc.php create mode 100644 root/opt/phpsysinfo/includes/interface/class.PSI_Interface_Sensor.inc.php create mode 100644 root/opt/phpsysinfo/includes/interface/class.PSI_Interface_UPS.inc.php create mode 100644 root/opt/phpsysinfo/includes/js/README create mode 100644 root/opt/phpsysinfo/includes/js/class.JavaScriptPacker.inc.php create mode 100644 root/opt/phpsysinfo/includes/mb/class.coretemp.inc.php create mode 100644 root/opt/phpsysinfo/includes/mb/class.freeipmi.inc.php create mode 100644 root/opt/phpsysinfo/includes/mb/class.hddtemp.inc.php create mode 100644 root/opt/phpsysinfo/includes/mb/class.healthd.inc.php create mode 100644 root/opt/phpsysinfo/includes/mb/class.hwsensors.inc.php create mode 100644 root/opt/phpsysinfo/includes/mb/class.ipmi.inc.php create mode 100644 root/opt/phpsysinfo/includes/mb/class.ipmiutil.inc.php create mode 100644 root/opt/phpsysinfo/includes/mb/class.k8temp.inc.php create mode 100644 root/opt/phpsysinfo/includes/mb/class.lmsensors.inc.php create mode 100644 root/opt/phpsysinfo/includes/mb/class.mbm5.inc.php create mode 100644 root/opt/phpsysinfo/includes/mb/class.mbmon.inc.php create mode 100644 root/opt/phpsysinfo/includes/mb/class.ohm.inc.php create mode 100644 root/opt/phpsysinfo/includes/mb/class.pitemp.inc.php create mode 100644 root/opt/phpsysinfo/includes/mb/class.sensors.inc.php create mode 100644 root/opt/phpsysinfo/includes/mb/class.thermalzone.inc.php create mode 100644 root/opt/phpsysinfo/includes/os/class.AIX.inc.php create mode 100644 root/opt/phpsysinfo/includes/os/class.Android.inc.php create mode 100644 root/opt/phpsysinfo/includes/os/class.BSDCommon.inc.php create mode 100644 root/opt/phpsysinfo/includes/os/class.Darwin.inc.php create mode 100644 root/opt/phpsysinfo/includes/os/class.DragonFly.inc.php create mode 100644 root/opt/phpsysinfo/includes/os/class.FreeBSD.inc.php create mode 100644 root/opt/phpsysinfo/includes/os/class.HPUX.inc.php create mode 100644 root/opt/phpsysinfo/includes/os/class.Haiku.inc.php create mode 100644 root/opt/phpsysinfo/includes/os/class.Linux.inc.php create mode 100644 root/opt/phpsysinfo/includes/os/class.Minix.inc.php create mode 100644 root/opt/phpsysinfo/includes/os/class.NetBSD.inc.php create mode 100644 root/opt/phpsysinfo/includes/os/class.OS.inc.php create mode 100644 root/opt/phpsysinfo/includes/os/class.OpenBSD.inc.php create mode 100644 root/opt/phpsysinfo/includes/os/class.QNX.inc.php create mode 100644 root/opt/phpsysinfo/includes/os/class.SunOS.inc.php create mode 100644 root/opt/phpsysinfo/includes/os/class.WINNT.inc.php create mode 100644 root/opt/phpsysinfo/includes/output/class.Output.inc.php create mode 100644 root/opt/phpsysinfo/includes/output/class.Template.inc.php create mode 100644 root/opt/phpsysinfo/includes/output/class.Webpage.inc.php create mode 100644 root/opt/phpsysinfo/includes/output/class.WebpageXML.inc.php create mode 100644 root/opt/phpsysinfo/includes/output/class.WebpageXSLT.inc.php create mode 100644 root/opt/phpsysinfo/includes/plugin/class.PSI_Plugin.inc.php create mode 100644 root/opt/phpsysinfo/includes/to/class.MBInfo.inc.php create mode 100644 root/opt/phpsysinfo/includes/to/class.System.inc.php create mode 100644 root/opt/phpsysinfo/includes/to/class.UPSInfo.inc.php create mode 100644 root/opt/phpsysinfo/includes/to/device/class.CpuDevice.inc.php create mode 100644 root/opt/phpsysinfo/includes/to/device/class.DiskDevice.inc.php create mode 100644 root/opt/phpsysinfo/includes/to/device/class.HWDevice.inc.php create mode 100644 root/opt/phpsysinfo/includes/to/device/class.NetDevice.inc.php create mode 100644 root/opt/phpsysinfo/includes/to/device/class.SensorDevice.inc.php create mode 100644 root/opt/phpsysinfo/includes/to/device/class.UPSDevice.inc.php create mode 100644 root/opt/phpsysinfo/includes/ups/class.apcupsd.inc.php create mode 100644 root/opt/phpsysinfo/includes/ups/class.nut.inc.php create mode 100644 root/opt/phpsysinfo/includes/ups/class.pmset.inc.php create mode 100644 root/opt/phpsysinfo/includes/ups/class.powersoftplus.inc.php create mode 100644 root/opt/phpsysinfo/includes/ups/class.ups.inc.php create mode 100644 root/opt/phpsysinfo/includes/xml/class.SimpleXMLExtended.inc.php create mode 100644 root/opt/phpsysinfo/includes/xml/class.XML.inc.php create mode 100644 root/opt/phpsysinfo/index.php create mode 100644 root/opt/phpsysinfo/js.php create mode 100644 root/opt/phpsysinfo/js/jQuery/README create mode 100644 root/opt/phpsysinfo/js/jQuery/README_bootstrap create mode 100644 root/opt/phpsysinfo/js/jQuery/jquery-1.js create mode 100644 root/opt/phpsysinfo/js/jQuery/jquery.dataTables.js create mode 100644 root/opt/phpsysinfo/js/jQuery/jquery.jgrowl.js create mode 100644 root/opt/phpsysinfo/js/jQuery/jquery.js create mode 100644 root/opt/phpsysinfo/js/jQuery/jquery.nyroModal.js create mode 100644 root/opt/phpsysinfo/js/jQuery/jquery.timers.js create mode 100644 root/opt/phpsysinfo/js/jQuery/jquery.treeTable.js create mode 100644 root/opt/phpsysinfo/js/jQuery/jquery.treegrid.js create mode 100644 root/opt/phpsysinfo/js/phpSysInfo/phpsysinfo.js create mode 100644 root/opt/phpsysinfo/js/phpSysInfo/phpsysinfo_bootstrap.js create mode 100644 root/opt/phpsysinfo/js/vendor/README create mode 100644 root/opt/phpsysinfo/js/vendor/bootstrap.min.js create mode 100644 root/opt/phpsysinfo/js/vendor/console-shim.js create mode 100644 root/opt/phpsysinfo/js/vendor/html5shiv-printshiv.js create mode 100644 root/opt/phpsysinfo/js/vendor/sorttable.js create mode 100644 root/opt/phpsysinfo/js/vendor/sorttable_org.js create mode 100644 root/opt/phpsysinfo/js/vendor/transparency.js create mode 100644 root/opt/phpsysinfo/language/ast.xml create mode 100644 root/opt/phpsysinfo/language/bg.xml create mode 100644 root/opt/phpsysinfo/language/ca.xml create mode 100644 root/opt/phpsysinfo/language/cz.xml create mode 100644 root/opt/phpsysinfo/language/da.xml create mode 100644 root/opt/phpsysinfo/language/de.xml create mode 100644 root/opt/phpsysinfo/language/en.xml create mode 100644 root/opt/phpsysinfo/language/es.xml create mode 100644 root/opt/phpsysinfo/language/et.xml create mode 100644 root/opt/phpsysinfo/language/fi.xml create mode 100644 root/opt/phpsysinfo/language/fr.xml create mode 100644 root/opt/phpsysinfo/language/gl.xml create mode 100644 root/opt/phpsysinfo/language/gr.xml create mode 100644 root/opt/phpsysinfo/language/he.xml create mode 100644 root/opt/phpsysinfo/language/hu.xml create mode 100644 root/opt/phpsysinfo/language/is.xml create mode 100644 root/opt/phpsysinfo/language/it.xml create mode 100644 root/opt/phpsysinfo/language/ja.xml create mode 100644 root/opt/phpsysinfo/language/ko.xml create mode 100644 root/opt/phpsysinfo/language/language.php create mode 100644 root/opt/phpsysinfo/language/nl.xml create mode 100644 root/opt/phpsysinfo/language/no.xml create mode 100644 root/opt/phpsysinfo/language/pl.xml create mode 100644 root/opt/phpsysinfo/language/pt-br.xml create mode 100644 root/opt/phpsysinfo/language/pt-pt.xml create mode 100644 root/opt/phpsysinfo/language/ro.xml create mode 100644 root/opt/phpsysinfo/language/ru.xml create mode 100644 root/opt/phpsysinfo/language/sk.xml create mode 100644 root/opt/phpsysinfo/language/sl.xml create mode 100644 root/opt/phpsysinfo/language/sv.xml create mode 100644 root/opt/phpsysinfo/language/th.xml create mode 100644 root/opt/phpsysinfo/language/tr.xml create mode 100644 root/opt/phpsysinfo/language/translation-plugin.xsd create mode 100644 root/opt/phpsysinfo/language/translation.xsd create mode 100644 root/opt/phpsysinfo/language/tw.xml create mode 100644 root/opt/phpsysinfo/language/uk.xml create mode 100644 root/opt/phpsysinfo/language/zh.xml create mode 100644 root/opt/phpsysinfo/phpsysinfo.ini.new create mode 100644 root/opt/phpsysinfo/phpsysinfo.xslt create mode 100644 root/opt/phpsysinfo/phpsysinfo3.xsd create mode 100644 root/opt/phpsysinfo/plugins/bat/bat_bootstrap.html create mode 100644 root/opt/phpsysinfo/plugins/bat/class.bat.inc.php create mode 100644 root/opt/phpsysinfo/plugins/bat/js/bat.js create mode 100644 root/opt/phpsysinfo/plugins/bat/js/bat_bootstrap.js create mode 100644 root/opt/phpsysinfo/plugins/bat/lang/cz.xml create mode 100644 root/opt/phpsysinfo/plugins/bat/lang/de.xml create mode 100644 root/opt/phpsysinfo/plugins/bat/lang/en.xml create mode 100644 root/opt/phpsysinfo/plugins/bat/lang/fr.xml create mode 100644 root/opt/phpsysinfo/plugins/bat/lang/pl.xml create mode 100644 root/opt/phpsysinfo/plugins/bat/lang/ro.xml create mode 100644 root/opt/phpsysinfo/plugins/bat/lang/ru.xml create mode 100644 root/opt/phpsysinfo/plugins/dmraid/class.dmraid.inc.php create mode 100644 root/opt/phpsysinfo/plugins/dmraid/css/dmraid.css create mode 100644 root/opt/phpsysinfo/plugins/dmraid/dmraid_bootstrap.html create mode 100644 root/opt/phpsysinfo/plugins/dmraid/gfx/error.png create mode 100644 root/opt/phpsysinfo/plugins/dmraid/gfx/harddrivefail.png create mode 100644 root/opt/phpsysinfo/plugins/dmraid/gfx/harddriveok.png create mode 100644 root/opt/phpsysinfo/plugins/dmraid/gfx/harddrivespare.png create mode 100644 root/opt/phpsysinfo/plugins/dmraid/gfx/harddrivewarn.png create mode 100644 root/opt/phpsysinfo/plugins/dmraid/js/dmraid.js create mode 100644 root/opt/phpsysinfo/plugins/dmraid/js/dmraid_bootstrap.js create mode 100644 root/opt/phpsysinfo/plugins/dmraid/lang/en.xml create mode 100644 root/opt/phpsysinfo/plugins/dmraid/lang/fr.xml create mode 100644 root/opt/phpsysinfo/plugins/dmraid/lang/ro.xml create mode 100644 root/opt/phpsysinfo/plugins/dmraid/lang/ru.xml create mode 100644 root/opt/phpsysinfo/plugins/ipmiinfo/class.ipmiinfo.inc.php create mode 100644 root/opt/phpsysinfo/plugins/ipmiinfo/ipmiinfo_bootstrap.html create mode 100644 root/opt/phpsysinfo/plugins/ipmiinfo/js/ipmiinfo.js create mode 100644 root/opt/phpsysinfo/plugins/ipmiinfo/js/ipmiinfo_bootstrap.js create mode 100644 root/opt/phpsysinfo/plugins/ipmiinfo/lang/cz.xml create mode 100644 root/opt/phpsysinfo/plugins/ipmiinfo/lang/de.xml create mode 100644 root/opt/phpsysinfo/plugins/ipmiinfo/lang/en.xml create mode 100644 root/opt/phpsysinfo/plugins/ipmiinfo/lang/fr.xml create mode 100644 root/opt/phpsysinfo/plugins/ipmiinfo/lang/pl.xml create mode 100644 root/opt/phpsysinfo/plugins/ipmiinfo/lang/ro.xml create mode 100644 root/opt/phpsysinfo/plugins/ipmiinfo/lang/ru.xml create mode 100644 root/opt/phpsysinfo/plugins/mdstatus/class.mdstatus.inc.php create mode 100644 root/opt/phpsysinfo/plugins/mdstatus/css/mdstatus.css create mode 100644 root/opt/phpsysinfo/plugins/mdstatus/gfx/error.png create mode 100644 root/opt/phpsysinfo/plugins/mdstatus/gfx/harddrivefail.png create mode 100644 root/opt/phpsysinfo/plugins/mdstatus/gfx/harddriveok.png create mode 100644 root/opt/phpsysinfo/plugins/mdstatus/gfx/harddrivespare.png create mode 100644 root/opt/phpsysinfo/plugins/mdstatus/js/mdstatus.js create mode 100644 root/opt/phpsysinfo/plugins/mdstatus/js/mdstatus_bootstrap.js create mode 100644 root/opt/phpsysinfo/plugins/mdstatus/lang/cz.xml create mode 100644 root/opt/phpsysinfo/plugins/mdstatus/lang/de.xml create mode 100644 root/opt/phpsysinfo/plugins/mdstatus/lang/en.xml create mode 100644 root/opt/phpsysinfo/plugins/mdstatus/lang/fr.xml create mode 100644 root/opt/phpsysinfo/plugins/mdstatus/lang/gr.xml create mode 100644 root/opt/phpsysinfo/plugins/mdstatus/lang/ro.xml create mode 100644 root/opt/phpsysinfo/plugins/mdstatus/lang/ru.xml create mode 100644 root/opt/phpsysinfo/plugins/mdstatus/mdstatus_bootstrap.html create mode 100644 root/opt/phpsysinfo/plugins/ps/class.ps.inc.php create mode 100644 root/opt/phpsysinfo/plugins/ps/js/ps.js create mode 100644 root/opt/phpsysinfo/plugins/ps/js/ps_bootstrap.js create mode 100644 root/opt/phpsysinfo/plugins/ps/lang/cz.xml create mode 100644 root/opt/phpsysinfo/plugins/ps/lang/de.xml create mode 100644 root/opt/phpsysinfo/plugins/ps/lang/en.xml create mode 100644 root/opt/phpsysinfo/plugins/ps/lang/fr.xml create mode 100644 root/opt/phpsysinfo/plugins/ps/lang/gr.xml create mode 100644 root/opt/phpsysinfo/plugins/ps/lang/pl.xml create mode 100644 root/opt/phpsysinfo/plugins/ps/lang/ro.xml create mode 100644 root/opt/phpsysinfo/plugins/ps/lang/ru.xml create mode 100644 root/opt/phpsysinfo/plugins/ps/ps_bootstrap.html create mode 100644 root/opt/phpsysinfo/plugins/psstatus/class.psstatus.inc.php create mode 100644 root/opt/phpsysinfo/plugins/psstatus/css/psstatus.css create mode 100644 root/opt/phpsysinfo/plugins/psstatus/gfx/offline.png create mode 100644 root/opt/phpsysinfo/plugins/psstatus/gfx/online.png create mode 100644 root/opt/phpsysinfo/plugins/psstatus/js/psstatus.js create mode 100644 root/opt/phpsysinfo/plugins/psstatus/js/psstatus_bootstrap.js create mode 100644 root/opt/phpsysinfo/plugins/psstatus/lang/cz.xml create mode 100644 root/opt/phpsysinfo/plugins/psstatus/lang/de.xml create mode 100644 root/opt/phpsysinfo/plugins/psstatus/lang/en.xml create mode 100644 root/opt/phpsysinfo/plugins/psstatus/lang/fr.xml create mode 100644 root/opt/phpsysinfo/plugins/psstatus/lang/gr.xml create mode 100644 root/opt/phpsysinfo/plugins/psstatus/lang/pl.xml create mode 100644 root/opt/phpsysinfo/plugins/psstatus/lang/ro.xml create mode 100644 root/opt/phpsysinfo/plugins/psstatus/lang/ru.xml create mode 100644 root/opt/phpsysinfo/plugins/psstatus/psstatus_bootstrap.html create mode 100644 root/opt/phpsysinfo/plugins/quotas/class.quotas.inc.php create mode 100644 root/opt/phpsysinfo/plugins/quotas/css/quotas.css create mode 100644 root/opt/phpsysinfo/plugins/quotas/js/quotas.js create mode 100644 root/opt/phpsysinfo/plugins/quotas/js/quotas_bootstrap.js create mode 100644 root/opt/phpsysinfo/plugins/quotas/lang/cz.xml create mode 100644 root/opt/phpsysinfo/plugins/quotas/lang/de.xml create mode 100644 root/opt/phpsysinfo/plugins/quotas/lang/en.xml create mode 100644 root/opt/phpsysinfo/plugins/quotas/lang/fr.xml create mode 100644 root/opt/phpsysinfo/plugins/quotas/lang/pl.xml create mode 100644 root/opt/phpsysinfo/plugins/quotas/lang/ro.xml create mode 100644 root/opt/phpsysinfo/plugins/quotas/lang/ru.xml create mode 100644 root/opt/phpsysinfo/plugins/quotas/quotas_bootstrap.html create mode 100644 root/opt/phpsysinfo/plugins/smart/class.smart.inc.php create mode 100644 root/opt/phpsysinfo/plugins/smart/css/smart.css create mode 100644 root/opt/phpsysinfo/plugins/smart/js/smart.js create mode 100644 root/opt/phpsysinfo/plugins/smart/js/smart_bootstrap.js create mode 100644 root/opt/phpsysinfo/plugins/smart/lang/cz.xml create mode 100644 root/opt/phpsysinfo/plugins/smart/lang/en.xml create mode 100644 root/opt/phpsysinfo/plugins/smart/lang/fr.xml create mode 100644 root/opt/phpsysinfo/plugins/smart/lang/gr.xml create mode 100644 root/opt/phpsysinfo/plugins/smart/lang/pl.xml create mode 100644 root/opt/phpsysinfo/plugins/smart/lang/ro.xml create mode 100644 root/opt/phpsysinfo/plugins/smart/lang/ru.xml create mode 100644 root/opt/phpsysinfo/plugins/smart/smart_bootstrap.html create mode 100644 root/opt/phpsysinfo/plugins/snmppinfo/class.snmppinfo.inc.php create mode 100644 root/opt/phpsysinfo/plugins/snmppinfo/js/snmppinfo.js create mode 100644 root/opt/phpsysinfo/plugins/snmppinfo/js/snmppinfo_bootstrap.js create mode 100644 root/opt/phpsysinfo/plugins/snmppinfo/lang/cz.xml create mode 100644 root/opt/phpsysinfo/plugins/snmppinfo/lang/de.xml create mode 100644 root/opt/phpsysinfo/plugins/snmppinfo/lang/en.xml create mode 100644 root/opt/phpsysinfo/plugins/snmppinfo/lang/fr.xml create mode 100644 root/opt/phpsysinfo/plugins/snmppinfo/lang/pl.xml create mode 100644 root/opt/phpsysinfo/plugins/snmppinfo/lang/ro.xml create mode 100644 root/opt/phpsysinfo/plugins/snmppinfo/lang/ru.xml create mode 100644 root/opt/phpsysinfo/plugins/snmppinfo/snmppinfo_bootstrap.html create mode 100644 root/opt/phpsysinfo/plugins/updatenotifier/class.updatenotifier.inc.php create mode 100644 root/opt/phpsysinfo/plugins/updatenotifier/js/updatenotifier.js create mode 100644 root/opt/phpsysinfo/plugins/updatenotifier/js/updatenotifier_bootstrap.js create mode 100644 root/opt/phpsysinfo/plugins/updatenotifier/lang/cz.xml create mode 100644 root/opt/phpsysinfo/plugins/updatenotifier/lang/de.xml create mode 100644 root/opt/phpsysinfo/plugins/updatenotifier/lang/en.xml create mode 100644 root/opt/phpsysinfo/plugins/updatenotifier/lang/fr.xml create mode 100644 root/opt/phpsysinfo/plugins/updatenotifier/lang/pl.xml create mode 100644 root/opt/phpsysinfo/plugins/updatenotifier/lang/ro.xml create mode 100644 root/opt/phpsysinfo/plugins/updatenotifier/lang/ru.xml create mode 100644 root/opt/phpsysinfo/plugins/updatenotifier/updatenotifier_bootstrap.html create mode 100644 root/opt/phpsysinfo/plugins/uprecords/class.uprecords.inc.php create mode 100644 root/opt/phpsysinfo/plugins/uprecords/js/uprecords.js create mode 100644 root/opt/phpsysinfo/plugins/uprecords/js/uprecords_bootstrap.js create mode 100644 root/opt/phpsysinfo/plugins/uprecords/lang/en.xml create mode 100644 root/opt/phpsysinfo/plugins/uprecords/lang/fr.xml create mode 100644 root/opt/phpsysinfo/plugins/uprecords/lang/hu.xml create mode 100644 root/opt/phpsysinfo/plugins/uprecords/lang/pl.xml create mode 100644 root/opt/phpsysinfo/plugins/uprecords/lang/ro.xml create mode 100644 root/opt/phpsysinfo/plugins/uprecords/lang/ru.xml create mode 100644 root/opt/phpsysinfo/plugins/uprecords/uprecords_bootstrap.html create mode 100644 root/opt/phpsysinfo/read_config.php create mode 100644 root/opt/phpsysinfo/sample/distrotest/4MLinux/10.0-server.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/ALT/6.0.0.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/ALT/7.0.0-Simply.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/ALT/7.0.1.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/Alpine/2.6.4.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/Amazon/2013.09.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/Arch/2011.08.19-ISO.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/Arch/2013.11.01.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/Arch/2014.01.05.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/BOSS/1.0-server.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/BOSS/5.0.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/Calculate/13.11.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/Canaima/4.1.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/CentOS/5.6.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/CentOS/6.5-SF.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/CentOS/6.5.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/CentOS/7.1.1503.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/Chakra/2013.02.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/ClearOS/6.4.0-Beta.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/Cloud/5.10.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/Cloud/6.4.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/CoreOS/367.1.0.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/Crux/2.8.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/Debian/5.0.3.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/Debian/6.0.6.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/Debian/8-20140106-netinstall.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/Debian/8-20140106.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/Deepin/2013.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/Eisfair/2-1.8.1.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/Fedora/20-lsb.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/Fedora/20.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/Fedora/4.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/Foresight/2.5.3.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/Frugalware/1.9.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/Fuduntu/2013.2.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/Generations/3.1.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/Gentoo/2.2-NAME.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/Gentoo/2.2.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/Gobo/015.beta2.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/Handy/2.0.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/IPFire/2.13.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/KaOS/2014.0301.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/Korora/20.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/Linaro/13.12.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/Lunar/1.7.0-rc2.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/Mageia/4.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/Mandrake/2011.0.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/Mandrake/9.2.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/Manjaro/0.8.8.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/Mer/0.2011.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/Mint/13.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/Mint/14.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/Mint/15.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/Netrunner/13.06-SE.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/Netrunner/13.06.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/Netrunner/2014.04.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/NixOS/13.10.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/OpenMandriva/2013.0-RC1.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/Oracle/5.10-el.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/Oracle/6.3.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/PCLinuxOS/2012.06.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/PLD/2.99.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/PLD/3.0.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/Parsix/5.0.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/Parsix/6.0.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/Pear/5.00.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/Pear/6.1-LTS.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/Pear/6.1.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/Pear/7.0.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/Peppermint/3.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/Peppermint/4-20131113.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/Pisi/1.0.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/Porteus/2.1.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/Puppy/431.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/Puppy/5.3-wary.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/Puppy/5.3.3-slacko.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/Puppy/528-lucid.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/Qubes/3.0.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/ROSA/2012.0.0-11-LTS.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/ROSA/2012.0.0-6-LTS.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/ROSA/2012.1.0-20.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/ROSA/6.5-Server.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/Raspbian/7.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/Raspbian/8.0.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/RedFlag/8.0.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/RedHat/6.0.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/RedHat/7.0-Beta.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/SMEServer/8.1beta3.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/SMEServer/9.0beta3.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/SMS/2.0.5.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/Sabayon/14.01.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/Salix/14.0.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/Scientific/6.3-lsb.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/Scientific/6.3.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/Scientific/6.4.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/Semplice/6.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/Slackware/14.0.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/Slax/7.0.1.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/SliTaz/2014.02.16-cooking.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/SolusOS/1.3.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/SolusOS/2-alpha7.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/SolydXK/2014.01-K.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/SolydXK/2014.01-X.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/StartOS/5.0.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/StartOS/6.0.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/SteamOS/1.0-beta.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/Synology/4.1-2668.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/Tails/0.22.1.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/Tanglu/2.0-beta2.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/TinyCore/5.0.alpha4.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/Tizen/2.2.0-Magnolia.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/Tizen/2.2.0-Tizen.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/Trisquel/6.0.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/Turbo/12.5.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/Ubuntu/10.04.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/Ubuntu/12.04.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/Ubuntu/13.10.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/UltimateEdition/3.9.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/Vector/647.0.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/VortexBox/2.2.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/VortexBox/2.3-beta.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/Zenwalk/7.4.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/Zorin/6.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/Zorin/7.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/Zorin/8.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/antiX/2012.07.06.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/elementaryOS/0.2.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/gNewSense/3.0.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/openSUSE/11.3.txt create mode 100644 root/opt/phpsysinfo/sample/distrotest/openSUSE/13.1.txt create mode 100644 root/opt/phpsysinfo/sample/logs/log_android21.txt create mode 100644 root/opt/phpsysinfo/sample/logs/log_android412.txt create mode 100644 root/opt/phpsysinfo/sample/logs/log_bluestacks.txt create mode 100644 root/opt/phpsysinfo/sample/logs/log_debian7.txt create mode 100644 root/opt/phpsysinfo/sample/logs/log_sf.txt create mode 100644 root/opt/phpsysinfo/sample/main/1-cpuinfo.txt create mode 100644 root/opt/phpsysinfo/sample/main/1-dfiP.txt create mode 100644 root/opt/phpsysinfo/sample/main/1-dfkP.txt create mode 100644 root/opt/phpsysinfo/sample/main/1-mount.txt create mode 100644 root/opt/phpsysinfo/sample/main/README create mode 100644 root/opt/phpsysinfo/sample/main/cpuinfo1.txt create mode 100644 root/opt/phpsysinfo/sample/main/cpuinfo2.txt create mode 100644 root/opt/phpsysinfo/sample/main/cpuinfo3.txt create mode 100644 root/opt/phpsysinfo/sample/main/cpuinfo4.txt create mode 100644 root/opt/phpsysinfo/sample/main/cpuinfo5.txt create mode 100644 root/opt/phpsysinfo/sample/main/cpuinfo6.txt create mode 100644 root/opt/phpsysinfo/sample/main/cpuinfo7.txt create mode 100644 root/opt/phpsysinfo/sample/main/cpuinfo8.txt create mode 100644 root/opt/phpsysinfo/sample/main/cpuinfo9.txt create mode 100644 root/opt/phpsysinfo/sample/main/dev1.txt create mode 100644 root/opt/phpsysinfo/sample/main/df1.txt create mode 100644 root/opt/phpsysinfo/sample/main/mount1.txt create mode 100644 root/opt/phpsysinfo/sample/main/pmset1.txt create mode 100644 root/opt/phpsysinfo/sample/main/pmset2.txt create mode 100644 root/opt/phpsysinfo/sample/main/pmset3.txt create mode 100644 root/opt/phpsysinfo/sample/main/pmset4.txt create mode 100644 root/opt/phpsysinfo/sample/main/swaps1.txt create mode 100644 root/opt/phpsysinfo/sample/main/vm_stat1.txt create mode 100644 root/opt/phpsysinfo/sample/main/vm_stat2.txt create mode 100644 root/opt/phpsysinfo/sample/main/vm_stat3.txt create mode 100644 root/opt/phpsysinfo/sample/motherboard/hwsensors/hwsensors1.txt create mode 100644 root/opt/phpsysinfo/sample/motherboard/hwsensors/hwsensors2.txt create mode 100644 root/opt/phpsysinfo/sample/motherboard/hwsensors/hwsensors3.txt create mode 100644 root/opt/phpsysinfo/sample/motherboard/hwsensors/hwsensors4.txt create mode 100644 root/opt/phpsysinfo/sample/motherboard/hwsensors/hwsensors5.txt create mode 100644 root/opt/phpsysinfo/sample/motherboard/ipmi-sensors/ipmi-sensors1.txt create mode 100644 root/opt/phpsysinfo/sample/motherboard/ipmitool/ipmitool1.txt create mode 100644 root/opt/phpsysinfo/sample/motherboard/ipmiutil/ipmiutil1.txt create mode 100644 root/opt/phpsysinfo/sample/motherboard/lmsensors/lmsensors1.txt create mode 100644 root/opt/phpsysinfo/sample/motherboard/lmsensors/lmsensors10.txt create mode 100644 root/opt/phpsysinfo/sample/motherboard/lmsensors/lmsensors2.txt create mode 100644 root/opt/phpsysinfo/sample/motherboard/lmsensors/lmsensors3.txt create mode 100644 root/opt/phpsysinfo/sample/motherboard/lmsensors/lmsensors4.txt create mode 100644 root/opt/phpsysinfo/sample/motherboard/lmsensors/lmsensors5.txt create mode 100644 root/opt/phpsysinfo/sample/motherboard/lmsensors/lmsensors6.txt create mode 100644 root/opt/phpsysinfo/sample/motherboard/lmsensors/lmsensors7.txt create mode 100644 root/opt/phpsysinfo/sample/motherboard/lmsensors/lmsensors8.txt create mode 100644 root/opt/phpsysinfo/sample/motherboard/lmsensors/lmsensors9.txt create mode 100644 root/opt/phpsysinfo/sample/motherboard/mbm5/MBM51.csv create mode 100644 root/opt/phpsysinfo/sample/plugin_bat/README create mode 100644 root/opt/phpsysinfo/sample/plugin_bat/ac_state1.txt create mode 100644 root/opt/phpsysinfo/sample/plugin_bat/battery_info1.txt create mode 100644 root/opt/phpsysinfo/sample/plugin_bat/battery_state1.txt create mode 100644 root/opt/phpsysinfo/sample/plugin_bat/log_LenovoT530.txt create mode 100644 root/opt/phpsysinfo/sample/plugin_bat/log_android233.txt create mode 100644 root/opt/phpsysinfo/sample/plugin_bat/log_android412.txt create mode 100644 root/opt/phpsysinfo/sample/plugin_bat/log_android422.txt create mode 100644 root/opt/phpsysinfo/sample/plugin_bat/log_darwin_1.txt create mode 100644 root/opt/phpsysinfo/sample/plugin_bat/log_freebsd_1.txt create mode 100644 root/opt/phpsysinfo/sample/plugin_bat/log_freebsd_2.txt create mode 100644 root/opt/phpsysinfo/sample/plugin_bat/log_test_1.txt create mode 100644 root/opt/phpsysinfo/sample/plugin_bat/log_test_2.txt create mode 100644 root/opt/phpsysinfo/sample/plugin_bat/log_vbox.txt create mode 100644 root/opt/phpsysinfo/sample/plugin_dmraid/dmraid1.txt create mode 100644 root/opt/phpsysinfo/sample/plugin_dmraid/dmraid2.txt create mode 100644 root/opt/phpsysinfo/sample/plugin_dmraid/dmraid3.txt create mode 100644 root/opt/phpsysinfo/sample/plugin_dmraid/dmraid4.txt create mode 100644 root/opt/phpsysinfo/sample/plugin_dmraid/dmraid5.txt create mode 100644 root/opt/phpsysinfo/sample/plugin_mdstat/README create mode 100644 root/opt/phpsysinfo/sample/plugin_mdstat/raid1.txt create mode 100644 root/opt/phpsysinfo/sample/plugin_mdstat/raid10.txt create mode 100644 root/opt/phpsysinfo/sample/plugin_mdstat/raid11.txt create mode 100644 root/opt/phpsysinfo/sample/plugin_mdstat/raid12.txt create mode 100644 root/opt/phpsysinfo/sample/plugin_mdstat/raid2.txt create mode 100644 root/opt/phpsysinfo/sample/plugin_mdstat/raid3.txt create mode 100644 root/opt/phpsysinfo/sample/plugin_mdstat/raid4.txt create mode 100644 root/opt/phpsysinfo/sample/plugin_mdstat/raid5.txt create mode 100644 root/opt/phpsysinfo/sample/plugin_mdstat/raid6.txt create mode 100644 root/opt/phpsysinfo/sample/plugin_mdstat/raid7.txt create mode 100644 root/opt/phpsysinfo/sample/plugin_mdstat/raid8.txt create mode 100644 root/opt/phpsysinfo/sample/plugin_mdstat/raid9.txt create mode 100644 root/opt/phpsysinfo/sample/plugin_ps/README create mode 100644 root/opt/phpsysinfo/sample/plugin_ps/ps1.txt create mode 100644 root/opt/phpsysinfo/sample/plugin_ps/ps2.txt create mode 100644 root/opt/phpsysinfo/sample/plugin_psstatus/README create mode 100644 root/opt/phpsysinfo/sample/plugin_psstatus/psstatus1.txt create mode 100644 root/opt/phpsysinfo/sample/plugin_quotas/README create mode 100644 root/opt/phpsysinfo/sample/plugin_quotas/quotas1.txt create mode 100644 root/opt/phpsysinfo/sample/plugin_smart/smart0.txt create mode 100644 root/opt/phpsysinfo/sample/plugin_smart/smart1.txt create mode 100644 root/opt/phpsysinfo/sample/plugin_updatenotifier/ubuntu-landscape create mode 100644 root/opt/phpsysinfo/sample/plugin_updatenotifier/universal-format create mode 100644 root/opt/phpsysinfo/sample/processes/processes.txt create mode 100644 root/opt/phpsysinfo/sample/ups/1-upscDell2700.txt create mode 100644 root/opt/phpsysinfo/sample/ups/1-upscPW5110.txt create mode 100644 root/opt/phpsysinfo/sample/ups/1-upscl.txt create mode 100644 root/opt/phpsysinfo/sample/ups/apcaccess1.txt create mode 100644 root/opt/phpsysinfo/sample/ups/powersoftplus1.txt create mode 100644 root/opt/phpsysinfo/templates/aqua.css create mode 100644 root/opt/phpsysinfo/templates/aqua/aq_background.gif create mode 100644 root/opt/phpsysinfo/templates/blue.css create mode 100644 root/opt/phpsysinfo/templates/blue/bar.png create mode 100644 root/opt/phpsysinfo/templates/blue/barwarn.png create mode 100644 root/opt/phpsysinfo/templates/blue/bg.png create mode 100644 root/opt/phpsysinfo/templates/blue/title.png create mode 100644 root/opt/phpsysinfo/templates/clean.css create mode 100644 root/opt/phpsysinfo/templates/cleansyn.css create mode 100644 root/opt/phpsysinfo/templates/cream.css create mode 100644 root/opt/phpsysinfo/templates/cream/bg.gif create mode 100644 root/opt/phpsysinfo/templates/html/error_config.html create mode 100644 root/opt/phpsysinfo/templates/html/index_all.html create mode 100644 root/opt/phpsysinfo/templates/html/index_bootstrap.html create mode 100644 root/opt/phpsysinfo/templates/html/index_dynamic.html create mode 100644 root/opt/phpsysinfo/templates/idash.css create mode 100644 root/opt/phpsysinfo/templates/idash/bg.png create mode 100644 root/opt/phpsysinfo/templates/idash/html.gif create mode 100644 root/opt/phpsysinfo/templates/idash/htmlwarn.gif create mode 100644 root/opt/phpsysinfo/templates/jstyle_blue.css create mode 100644 root/opt/phpsysinfo/templates/jstyle_green.css create mode 100644 root/opt/phpsysinfo/templates/nextgen.css create mode 100644 root/opt/phpsysinfo/templates/nextgen/nextgen_bg.png create mode 100644 root/opt/phpsysinfo/templates/phpsysinfo.css create mode 100644 root/opt/phpsysinfo/templates/phpsysinfo_bootstrap.css create mode 100644 root/opt/phpsysinfo/templates/plugin/jquery.dataTables.css create mode 100644 root/opt/phpsysinfo/templates/plugin/jquery.jgrowl.css create mode 100644 root/opt/phpsysinfo/templates/plugin/jquery.treeTable.css create mode 100644 root/opt/phpsysinfo/templates/plugin/nyroModal.full.css create mode 100644 root/opt/phpsysinfo/templates/two.css create mode 100644 root/opt/phpsysinfo/templates/two/gradient.png create mode 100644 root/opt/phpsysinfo/templates/vendor/bootstrap.min.css create mode 100755 root/opt/phpsysinfo/tools/MakeRelease.sh create mode 100644 root/opt/phpsysinfo/tools/README create mode 100644 root/opt/phpsysinfo/tools/aptana/js.xml create mode 100644 root/opt/phpsysinfo/tools/aptana/php.xml create mode 100755 root/opt/phpsysinfo/tools/check.sh create mode 100644 root/opt/phpsysinfo/tools/checkdistro.php create mode 100644 root/opt/phpsysinfo/tools/distrotest.php create mode 100644 root/opt/phpsysinfo/tools/lint.bat create mode 100644 root/opt/phpsysinfo/xml.php create mode 100644 smeserver-phpsysinfo.spec diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..cbb3a13 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +*.rpm +*.log +*spec-20* +*.tar.gz diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..4eaf6e8 --- /dev/null +++ b/Makefile @@ -0,0 +1,21 @@ +# Makefile for source rpm: smeserver-phpsysinfo +# $Id: Makefile,v 1.1 2020/10/24 08:32:48 brianr Exp $ +NAME := smeserver-phpsysinfo +SPECFILE = $(firstword $(wildcard *.spec)) + +define find-makefile-common +for d in common ../common ../../common ; do if [ -f $$d/Makefile.common ] ; then if [ -f $$d/CVS/Root -a -w $$/Makefile.common ] ; then cd $$d ; cvs -Q update ; fi ; echo "$$d/Makefile.common" ; break ; fi ; done +endef + +MAKEFILE_COMMON := $(shell $(find-makefile-common)) + +ifeq ($(MAKEFILE_COMMON),) +# attept a checkout +define checkout-makefile-common +test -f CVS/Root && { cvs -Q -d $$(cat CVS/Root) checkout common && echo "common/Makefile.common" ; } || { echo "ERROR: I can't figure out how to checkout the 'common' module." ; exit -1 ; } >&2 +endef + +MAKEFILE_COMMON := $(shell $(checkout-makefile-common)) +endif + +include $(MAKEFILE_COMMON) diff --git a/README.md b/README.md index 34adc87..88feb0d 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,16 @@ -# smeserver-phpsysinfo +# smeserver-phpsysinfo -SMEServer Koozali developed git repo for smeserver-phpsysinfo smecontribs \ No newline at end of file +SMEServer Koozali developed git repo for smeserver-phpsysinfo smecontribs + +## Wiki +
https://wiki.koozali.org/Phpsysinfo +
https://wiki.koozali.org/Phpsysinfo/fr + +## Bugzilla +Show list of outstanding bugs: [here](https://bugs.koozali.org/buglist.cgi?component=smeserver-phpsysinfo&product=SME%20Contribs&query_format=advanced&limit=0&bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&bug_status=CONFIRMED) + +## Description + +
*This description has been generated by an LLM AI system and cannot be relied on to be fully correct.* +*Once it has been checked, then this comment will be deleted* +
diff --git a/additional/CHANGELOG.git b/additional/CHANGELOG.git new file mode 100644 index 0000000..3e15765 --- /dev/null +++ b/additional/CHANGELOG.git @@ -0,0 +1,57 @@ +commit 6a9efeb32f280ce307491450e6cd876c547d2a76 +Author: Stephane de Labrusse +Date: Tue Sep 22 08:07:37 2015 +0200 + + * Wed Sep 22 2015 stephane de Labrusse 3.2.3-1.sme + - Upgrade to upstream 3.2.3 + - Require hddtemp lm_sensors + +commit f4051d7cf72ec48f88c2dfdcec84fb9ead4edf72 +Author: Stephane de Labrusse +Date: Sun Jun 22 01:32:25 2014 +0200 + + - added a menu in the administration panel of server-manager + +commit 2bea40307fdfe6724aeb2cdc66ff3dc7c98ad21d +Author: Stephane de Labrusse +Date: Sun Jun 22 00:29:20 2014 +0200 + + createlinks and root/etc/e-smith/web/functions/phpsysinfo + +commit 8cf00cc167fba208c86ad0b1054218d65427859a +Author: Stephane de Labrusse +Date: Sun Jun 22 00:25:29 2014 +0200 + + createlinks and root/etc/e-smith/web/functions/phpsysinfo + +commit 2c63503593c13c7b6bccbba7af462853831ccc01 +Author: Stephane de Labrusse +Date: Sun Jun 22 00:22:10 2014 +0200 + + createlinks and root/etc/e-smith/web/functions/phpsysinfo + +commit 41a595743e45b9421c2b0fb4b2a87ba904cbddda +Author: Stephane de Labrusse +Date: Sun Jun 22 00:02:58 2014 +0200 + + added backup of phpsysinfo.ini + +commit 846f98c82d8434650addf9136978946952a68b0b +Author: Stephane de Labrusse +Date: Sat Jun 21 23:57:35 2014 +0200 + + added backup of phpsysinfo.ini + +commit aaff0ff14a86cb55a4a3b18d377e62644be32eed +Author: Stephane de Labrusse +Date: Sat Jun 21 19:28:45 2014 +0200 + + * Sat Jun 21 2014 stephane de Labrusse 3.1.13-1.sme + - Initial release to sme9 + - upgrade of phpsysinfo to 3.1.13 https://github.com/phpsysinfo/phpsysinfo/releases/tag/v3.1.13 + +commit 3de6c405b6b998ba4af41c1ab78b445d1427ef9d +Author: Stephane de Labrusse +Date: Sat Jun 21 19:19:49 2014 +0200 + + first commit to SME Server 9 diff --git a/additional/README.md b/additional/README.md new file mode 100644 index 0000000..75a8b35 --- /dev/null +++ b/additional/README.md @@ -0,0 +1 @@ +smeserver-phpsysinfo is a contrib for SME Server, a Linux distro oriented server. see http://wiki.contribs.org diff --git a/additional/smeserver-phpsysinfo.spec b/additional/smeserver-phpsysinfo.spec new file mode 100644 index 0000000..4b26681 --- /dev/null +++ b/additional/smeserver-phpsysinfo.spec @@ -0,0 +1,118 @@ +# $Id: smeserver-phpsysinfo.spec,v 1.1 2013/03/03 21:49:49 unnilennium Exp $ +# Authority: darrellmay +# Name: Darrell May + +Summary: phpSysInfo for SME Server +%define name smeserver-phpsysinfo +Name: %{name} +%define version 3.2.3 +%define release 1 +Version: %{version} +Release: %{release}%{?dist} +License: GPL +Group: SME/addon +Source: %{name}-%{version}.tar.gz +URL: http://phpsysinfo.sourceforge.net +BuildRoot: /var/tmp/%{name}-%{version}-%{release}-buildroot +BuildArchitectures: noarch +Requires: smeserver-release >= 9.0 +Requires: hddtemp lm_sensors +BuildRequires: e-smith-devtools +AutoReqProv: no + +%description +%name is an implementation of phpSysInfo on SME Server. +Access with admin login credentials via https://yourdomain/phpsysinfo + +%changelog +* Wed Sep 22 2015 stephane de Labrusse 3.2.3-1.sme +- Upgrade to upstream 3.2.3 +- Require hddtemp lm_sensors + +* Sat Jun 21 2014 stephane de Labrusse 3.1.13-1.sme +- Initial release to sme9 +- upgrade of phpsysinfo to 3.1.13 https://github.com/phpsysinfo/phpsysinfo/releases/tag/v3.1.13 +- added a menu in the administration panel of server-manager + +* Mon Apr 21 2008 Shad L. Lords +- Prep for import into buildsys +- Clean up spec + +* Fri Oct 19 2007 Darrell May +- accounts and configuration db phpsysinfo defaults added +- default access restricted to private (private|public) +- phpsysinfo-2.5.4 +- [2.5.4-0dmay] +* Mon Apr 09 2007 Darrell May +- [2.5.3-1dmay] +* Sun Apr 01 2007 Darrell May +- phpsysinfo-2.5.3 +- [2.5.3-0dmay] +* Tue Jan 02 2007 Darrell May +- phpsysinfo-2.5.2 +- [2.5.2-0] +* Fri Aug 04 2006 Darrell May +- phpsysinfo-2.5.2-rc3 +- [2.5.2-rc3] +* Wed Dec 14 2005 Darrell May +- phpsysinfo-2.5 +- [2.5-0] +* Fri Apr 22 2005 Darrell May +- added support for SME Server 7.x +- [2.3-2] +* Mon Nov 15 2004 Darrell May +- updated to release 2.3 +- renamed smeserver-phpsysinfo +- updated includes/os/class.Linux.inc.php to recognize SME Server +- [2.3-1] +* Sat Jun 29 2002 Darrell May +- updated to release 2.1 +- [2.1-1] +* Sun Mar 10 2002 Darrell May +- updated to release 2.0 +- [2.0-1] +* Sun Mar 10 2002 Darrell May +- changed rights/ownership to tighten security +- [1.9-2] +* Tue Mar 05 2002 Darrell May +- changed %post/postun to graceful +- [1.9-1] +* Mon Jan 21 2002 Darrell May +- updated to version 1.9 +- [1.9-0] +* Wed Oct 31 2001 Darrell May +- updated to version 1.8 +- [1.8-0] +* Sun Sep 23 2001 Darrell May +- name change +* Thu May 30 2001 Darrell May +- 2.1.0-1 +- Original version + +%prep +%setup + +%build +perl createlinks + + +%install +/bin/rm -rf $RPM_BUILD_ROOT +(cd root ; /usr/bin/find . -depth -print | /bin/cpio -dump $RPM_BUILD_ROOT) +/bin/rm -f %{name}-%{version}-filelist +/sbin/e-smith/genfilelist $RPM_BUILD_ROOT > %{name}-%{version}-filelist + +%clean +/bin/rm -rf $RPM_BUILD_ROOT + +%files -f %{name}-%{version}-filelist +%defattr(-,root,root) + +%pre +if [[ -f /opt/phpsysinfo/phpsysinfo.ini ]]; then + /bin/cp /opt/phpsysinfo/phpsysinfo.ini /opt/phpsysinfo/phpsysinfo.ini-$(date +"%H:%M-%b-%d-%Y") +fi +%post +if ! [[ -f /opt/phpsysinfo/phpsysinfo.ini ]]; then + cp /opt/phpsysinfo/phpsysinfo.ini.new /opt/phpsysinfo/phpsysinfo.ini +fi diff --git a/contriborbase b/contriborbase new file mode 100644 index 0000000..9b7fd51 --- /dev/null +++ b/contriborbase @@ -0,0 +1 @@ +contribs10 diff --git a/createlinks b/createlinks new file mode 100644 index 0000000..0a0b4dc --- /dev/null +++ b/createlinks @@ -0,0 +1,25 @@ +#! /usr/bin/perl -w +use esmith::Build::CreateLinks qw(:all); +# our event specific for updating with yum without reboot +$event = 'smeserver-phpsysinfo-update'; +#add here the path to your templates needed to expand +#see the /etc/systemd/system-preset/49-koozali.preset should be present for systemd integration on all you yum update event + +foreach my $file (qw( + /etc/systemd/system-preset/49-koozali.preset + /etc/httpd/conf/httpd.conf +)) +{ + templates2events( $file, $event ); +} +#action needed in case we have a systemd unit +event_link('systemd-default', $event, '10'); +event_link('systemd-reload', $event, '50'); +#action specific to this package +#event_link('action', $event, '30'); +#services we need to restart +safe_symlink('restart',"root/etc/e-smith/events/$event/services2adjust/httpd-e-smith"); +#and Server Manager panel link +#panel_link('somefunction', 'manager'); +# Links for the panel +panel_link("phpsysinfo", "manager"); diff --git a/root/etc/e-smith/db/accounts/defaults/phpsysinfo/type b/root/etc/e-smith/db/accounts/defaults/phpsysinfo/type new file mode 100644 index 0000000..123f60c --- /dev/null +++ b/root/etc/e-smith/db/accounts/defaults/phpsysinfo/type @@ -0,0 +1 @@ +reserved diff --git a/root/etc/e-smith/db/configuration/defaults/phpsysinfo/access b/root/etc/e-smith/db/configuration/defaults/phpsysinfo/access new file mode 100644 index 0000000..3e18ebf --- /dev/null +++ b/root/etc/e-smith/db/configuration/defaults/phpsysinfo/access @@ -0,0 +1 @@ +private diff --git a/root/etc/e-smith/db/configuration/defaults/phpsysinfo/type b/root/etc/e-smith/db/configuration/defaults/phpsysinfo/type new file mode 100644 index 0000000..f92f363 --- /dev/null +++ b/root/etc/e-smith/db/configuration/defaults/phpsysinfo/type @@ -0,0 +1 @@ +configuration diff --git a/root/etc/e-smith/templates/etc/httpd/conf/httpd.conf/86PhpsysinfoAlias b/root/etc/e-smith/templates/etc/httpd/conf/httpd.conf/86PhpsysinfoAlias new file mode 100644 index 0000000..86a6212 --- /dev/null +++ b/root/etc/e-smith/templates/etc/httpd/conf/httpd.conf/86PhpsysinfoAlias @@ -0,0 +1,23 @@ + +# phpsysinfo +Alias /phpsysinfo /opt/phpsysinfo + + SSLRequireSSL + Options -Indexes + AuthName "phpSysInfo" + AuthBasicProvider external + AuthType Basic + AuthExternal pwauth + + + Require user admin + Require {(($phpmyadmin{access} || 'private' ) eq "public" ) ? "all granted": "ip $localAccess $externalSSLAccess";} + + + AddType application/x-httpd-php .php .php3 + + SetHandler "proxy:unix:/var/run/php-fpm/php.sock|fcgi://localhost" + + + + diff --git a/root/etc/e-smith/templates/etc/httpd/conf/httpd.conf/VirtualHosts/30PhpsysinfoAlias b/root/etc/e-smith/templates/etc/httpd/conf/httpd.conf/VirtualHosts/30PhpsysinfoAlias new file mode 100644 index 0000000..6686e79 --- /dev/null +++ b/root/etc/e-smith/templates/etc/httpd/conf/httpd.conf/VirtualHosts/30PhpsysinfoAlias @@ -0,0 +1,8 @@ +{ + $haveSSL = (exists ${modSSL}{status} and ${modSSL}{status} eq "enabled") ? 'yes' : 'no'; + + if (($port eq "80") && ($haveSSL eq 'yes')) + { + $OUT .= " RewriteRule ^/phpsysinfo(/.*|\$) https://%{HTTP_HOST}/phpsysinfo\$1 [L,R]\n"; + } +} diff --git a/root/etc/e-smith/web/functions/phpsysinfo b/root/etc/e-smith/web/functions/phpsysinfo new file mode 100644 index 0000000..aa42fc1 --- /dev/null +++ b/root/etc/e-smith/web/functions/phpsysinfo @@ -0,0 +1,30 @@ +#!/usr/bin/perl +#---------------------------------------------------------------------- +# heading : Administration +# description : PhpSysInfo +# navigation : 4000 4200 +#---------------------------------------------------------------------- + +use strict; +use CGI':all'; +use CGI::Carp qw(fatalsToBrowser); + + +BEGIN +{ + $ENV {'PATH'} = '/bin:/usr/bin:/sbin'; + $ENV {'SHELL'} = '/bin/bash'; + delete $ENV {'ENV'}; +} + + +my $q = new CGI; +my $content="0; url=https://".$ENV {'HTTP_X_FORWARDED_HOST'}."/phpsysinfo"; +$q->default_dtd('-//W3C//DTD XHTML 1.0 Transitional//EN'); + +print $q->header ('text/html'); +print $q->start_html (-head=>meta({-http_equiv=>'refresh', -content=>$content})); + + + +print $q->end_html; diff --git a/root/opt/phpsysinfo/.gitignore b/root/opt/phpsysinfo/.gitignore new file mode 100644 index 0000000..dbb8d5e --- /dev/null +++ b/root/opt/phpsysinfo/.gitignore @@ -0,0 +1 @@ +phpsysinfo.ini diff --git a/root/opt/phpsysinfo/.htaccess b/root/opt/phpsysinfo/.htaccess new file mode 100644 index 0000000..9c15814 --- /dev/null +++ b/root/opt/phpsysinfo/.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 granted + + diff --git a/root/opt/phpsysinfo/.travis.yml b/root/opt/phpsysinfo/.travis.yml new file mode 100644 index 0000000..9ed9bd0 --- /dev/null +++ b/root/opt/phpsysinfo/.travis.yml @@ -0,0 +1,18 @@ +language: php + +php: + - 5.2 + - 5.3 + - 5.4 + - 5.5 + - 5.6 + +script: for i in `find . -name "*.php"`; do php -l $i; done; + +branches: + only: + - "master" + - "stable" + +notifications: + email: false diff --git a/root/opt/phpsysinfo/CHANGELOG.md b/root/opt/phpsysinfo/CHANGELOG.md new file mode 100644 index 0000000..0451ba5 --- /dev/null +++ b/root/opt/phpsysinfo/CHANGELOG.md @@ -0,0 +1,255 @@ +Changelog of phpSysInfo +======================= + +http://phpsysinfo.sourceforge.net/ + +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/root/opt/phpsysinfo/COPYING b/root/opt/phpsysinfo/COPYING new file mode 100644 index 0000000..d511905 --- /dev/null +++ b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/Dockerfile b/root/opt/phpsysinfo/Dockerfile new file mode 100644 index 0000000..5b62375 --- /dev/null +++ b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/README.md b/root/opt/phpsysinfo/README.md new file mode 100644 index 0000000..8f342bb --- /dev/null +++ b/root/opt/phpsysinfo/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-2015, 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 / 2003 / XP / Vista / 7 / 8 / 8.1 / 10 +- Android +- > PHP 5.2 or later + - 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/root/opt/phpsysinfo/README_PLUGIN.md b/root/opt/phpsysinfo/README_PLUGIN.md new file mode 100644 index 0000000..26140ac --- /dev/null +++ b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/composer.json b/root/opt/phpsysinfo/composer.json new file mode 100644 index 0000000..d839520 --- /dev/null +++ b/root/opt/phpsysinfo/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" + } +} \ No newline at end of file diff --git a/root/opt/phpsysinfo/data/ModelTranslation.txt b/root/opt/phpsysinfo/data/ModelTranslation.txt new file mode 100644 index 0000000..dfa05e1 --- /dev/null +++ b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/data/distros.ini b/root/opt/phpsysinfo/data/distros.ini new file mode 100644 index 0000000..16747ab --- /dev/null +++ b/root/opt/phpsysinfo/data/distros.ini @@ -0,0 +1,799 @@ +; 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] +Image = "Eisfair.png" +Files = "/etc/eisfair-system" +Files2 = "/etc/version" + +[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" + +[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" + +[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" + +[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" + +[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) +[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/root/opt/phpsysinfo/data/languages.ini b/root/opt/phpsysinfo/data/languages.ini new file mode 100644 index 0000000..c93aea4 --- /dev/null +++ b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/data/osnames.ini b/root/opt/phpsysinfo/data/osnames.ini new file mode 100644 index 0000000..08751d6 --- /dev/null +++ b/root/opt/phpsysinfo/data/osnames.ini @@ -0,0 +1,34 @@ +[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" + +[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" diff --git a/root/opt/phpsysinfo/gfx/ajax-loader.gif b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/gfx/ajaxLoader.gif b/root/opt/phpsysinfo/gfx/ajaxLoader.gif new file mode 100644 index 0000000000000000000000000000000000000000..2b3542497207707021696d31ab3f04b3a458690a GIT binary patch literal 4659 zcmZ{mdpwluqQ~EP-+5==cP>VA5po$!j7v3Hb|I~1lrq9X5o(oN5^15!BEq=GklcmV z3}He-R78zyt~D-+NJ0@R(tWj8yLI+H=X1_Jd;RzP@qC^?ewXj_+r{5$Y~rpD=mXa& zz_)MTR#sL@N=kBbbA>|Tnc;VZsr(WVK?r5WYr|k-&`;-e!V{yiI2e4OU*1NX zP+VM6s!agPD=NGlFx55Juh!X~zg~~IaW$)~4+ZUS}!dW`)CF+k(UOY}6$X zoT>%}kX98E`e-W7lr%Ogqry{*Gv=7tv0g*`;v=+oMSaP2`3Y@do7>ILQY9Hu>2&iioOK4qCOXfpl-4)Z zZw#p}?9Q7vbIM4Y^xBlSi#O9dwdetz-Ifjpn4HA_ltC|aLaG9IJJ(_o)qF&I{9;qS zoDA@{V???Tt%>f)EL^&IK@o!Dz3JUF`6Tq`Xzkoh8xJu1If zYd86RYMTPj-$G)bVu>f+Dpz9HPsQ*o2{{Z`Ty~L4TFjc$Q4+F3I=ep6EXI1us_1m4 zWG%RKd+)6d9dji;%C9hA&SxVY6mFvv_v2N}ER{DBg}DTn2JHJu1twUE5_5AmP$N{y zX`Y1AWam)loYH*HdMa5M-Eg<^ZcA%hy8@oj)!p3&+0UoF(@8?%agS50a#01{=JwBd;s>@1XQ2@t?~?pXUCP5O$y*wR$qCD z{8MZ^It6gG0;~Y&@BV6Eum37HfjI=xSX@tgmQpG%%Z@wpcB)ZV&oN3*dP2<_QuTY= zl{?3K5Tfo*Xn(uDw6};Jei~cDoVAhA(xSe`GLM*|&WEBhT=Yw0tEh@!ha4S??P{s= zZFFxD8@^T6EqHb1CN!bA>fapD`)BySJK(1}jrQDrqxd2DKo$EO!<#XX`b4AG*9VQM zl4cqb|Ut=wYa#)Y!TRN4M z?6N*?crQ~H?ovS9X@?2%Tj=mM@-LfrTJOQjK?n_w&*jkx8`N;#0vd{yE6MXB=jL9r z45Q+plIxj#e0hQ|2E2Y9dybJ)?u%=>E>T6}uQ?E!z{9NdS-x;FB=UV6{P>AFihnjW z)jzRudhUh#+{<}Y^5WF%m3Qwy_yR{Q5#n=)&p-&>Qo5)v4b#F=S&~^I+l?8^yiSnO$hg-uYVjR4@vw!+2=G z?ThR`2Ar%kI^rhjDAL*U`rV6KmAwQj7pp+!ck}e(FR9o7*JeMB;)ij#vu+H62Tfivhb`x3YPDfAdQce8f@O0SdFA{T<5VYbx0_ST-$QhW`ZqopE5@1* z#p&$cn(yW5?pei>iwxalxQ#?bsGBXU)hXBjdSn{;EDet)s2+!MsYD1XCNm<^B2i0I zVv&uwl5&McE)g&f5-KZyzF3m!P+wW0N+Jr5Q0s+jPu~-z-a8T`8&o5rk48p@aB@#3 zCa|MZ-uEz1XP-?!9-5tFp7Wn>4ZjQ8Vr2Xz=3j z_y)kO2L=M&BZid+nz3aaNzQeVxUurINVFHYT`&;21*=r6$;Owk)rv1*C~xJLd#^} z80+7||1a|Y8Ggr4BYmOwa&*q{-38q@uv*zFyG}$6YnXZOZ(0iKX9$)`%B3C%Vcsx< zq1(9K9L+F@YttzXG_ua3Ra|Qyp{Lx(f9h8(aZPZjZ;5?AJVGvSac2E-kdEV!J*g)s zo6MC@Lch>(5ots|4UJoGt^h&>d+2alnu&$jszBmGL&6JDT!I!r#Y?VSW?U$ArQVSI zrY4rU)=7lxFmR~r!IZ`aBH4f@{BZcuAO$-%J`O#ay!GJ8jPbMK(V3aqxxxAI(dD=F zo|SbVzSlZ( zRpUuqhaH>+UXKn2o58Z{DzXZH_oa@_k$T0RLq1~_%TDY7LCDv<261ECqd?&u`h}p@ zA=EbBHucP@gHAgRymIfe(x`C8xs+b4`&ifF8e&u68cba6zpY`Vp&>)h2|Jm6F_(;~DgleXNs~)lNl5)v!S=c5zdgBHhyBS`?xU?ig5C z@8aNHYf<|*T~_9B;)&g#1qPYjDujoF)ArM4G!C+{Tl^eQ0_+GPy{1@54pS|r%2$0+$fi*7KS<1 zl_zd(aWB9(`1CpU$+QvN(8Gr%ebD2vF>v@P?t1_D3^Y01PklZ<`*2FOF!u60e%@_) zvz3(L4q>6YW&pyK&trfH%F(Mn@5VFwgQ|JVQ7mqa-+jy|HD}31oFwPhI>&Ae1mGmO z6^yg)b^(NsAt9DNi_P44+`jom=45d+2B%JP4mRZ4<(aP7b0!CQect>`r-09Cz&3sR z;s(vhbdMZ~wz84MFjRr!pfG~5YfHsB(6gUaH*g~Io^VSx);a67UK8>kx6hyY+XRpP zR|A4b4orm{;bNPjMSj%F3yS`Xd&b4C@orkX&_%-P$5AEUarKe?Okgyy?yrs zo56v>LBjn<_4cHpad6~*H|5FD)4uMp>49epi|b$QxNHxsco{=roz}`bS3L9$qR)-p z{3!{D1g0ICovGGf46xeJ!18i7HUeo{m#YZlF`$AI9jN^z5+|%rVzECVHNB94Dh>(Y z4mM-6u$EZ|_6@$U$bu&9=lJeG4m!w#ZEhgG{vP) zc&#F>(lKeZEeunPYB|#1nQl|1ui&<4%Ax7Jc|f2i)|L_3f3m|89JzvD3fIy(?BGd_ zK5E0pqm1Kc!+)eiDClq%$oTBQWU1(zDQjJFT{@9hyK_ch5a4;ekws?-|N(?H?gL?Cl%vAM5U;Ovt8Q%+7U?6JHvD zAmNoJ`OO>rTQ9=<_Z6QQ#NX$uH400&mmR`P*J+4EIk6Cg3r-8*GA}@KhI%9L#==PQ z^6{8+TrRUHI+TJ)SWFDBEdk;)-Z7;t3`^g|%4g~AbTz20+SY3#5JYBED(aNnf&jR1 z_d&UwE=`{7oE^F~_=>y}KbcWu#bIWa;cJx81nc^s*2qd%k_uDy=IDOnVv0>ZbNJ9m zLaXNg8av?krLX%xV`srgakS55L~%G-jmB~EaVABjG30xjcU?JJ-NM+q&)7=DHCSS6 zD|7bh&Zn3^O*Y{fi|IA~cERJW$(rpEig?jK#o^k=eP{XG7Jx|4c3 zdJ|QLPUfl90#SDOn&<+mDA7088IxRD?p#=R ztKJNQZ@O~_ZBV(}hHqKZe)pb2R};BM);~~@Ye&S^?m`FzyhH^D$;lDQ(eZKeO&SKA ze)GTsKR1USpyJ^FMwaw@{5iv@_sxE9U#vcY6<`h!{}>zBsU)d zn@_Nfm|QoH_#}`nEzIEvqM?s!of>@RL}Z?}x`>|YU))P3_`GP#9h_>%ZxqW|Tmc(~ z+1ouZ%t-AH)K-T+Qtx{-wt^-)cnmoV*wj#^wv&m)zI>wZGHRSk-WiQ?sGb_Hl8O{p z2Yj?8R-ACe{$&-&#{a4U_o!gM@$ur2!wMeEdDFVrF-|*w8DSiFU7h#ITgpsvV5y}m zh~>QBJrq%{TxPGh7wy)}T>h%JpT}SA!lRRftc$J4yQzk#JCU4F4jmU78m=D|eP&;* zLc*D|Nt*Fzwx#N)XL50gIo?>g-$bGeZ?w3igm_6T&f}I|L(9vPs!Gdhz)VXtTfT%(qogQ=UpBN~jLeqT&=jRj>ac-G1 zH4V;#4^+<*-srJ%yah@E%p{wo=vJYAX%`CU&FvElwxU;zIbP1Tk-ISaU066X%#3tr zD)q<0uqv)*`v%-5IcC;dtyqXkyEtn6R?tn*yn4!+xngf~o)G}<#l;FDlVN`ct~@;n zjMLZoN|!|HDqztX-%MA5w+3K;0XMc(t&{rKjE5EfsdmafZ;Z8NCB+Bkv{tTfmsXiZ zXvenRwzmmteHoRfF{z`a;oN%2Ei(YQ)G`rWf7DhUivKkEGyf27afW%EM!h}N&)sZ& z_t}kLx15cQB;?ddUm6j6#)EK}1w=)k6#AVb2d19C<_rM9j8X5Dwjm&0ebz~I0Z42lwCH3<-Ob#$~u z6aRFU7)YF&no&S!mtXR5i&G37xcn4P%T>dTkJj9j5*vdFdThyzSSo;G!HOPlo2Z)@ z(7-@mdO>5=c8U*0dL@!6kfM;8!(?aRrKoIltr6m~iVtONRG0R?ToPNc41Ta3;k&%q*~emlcwbj}dM?)n)(-qx8RK4XRDyv1FOHG03FkY`Y;(3& zgb2JfrVP^Q)4OTDp?<~+<~x9dj9@C1?5F9Nk)d)X8MRF>z$B^=jyY1|FPVY3a!Nv0 zjUlP@Mgs$c?%ciGK*F`Pw&+cw+c+k;5P}4Wmc6z@=&~Fsr31tTG2~N4S^V^9xw-sK>hpDE^tkP~Nk6bVyGDL| zuk<`S_R`lfm0MSq1cRjp{_CCxpK1ZKv_h=6eh$>>xKyq@-YYxR(haXZjAaKfD;%%K U-3q*%u=+qe&h)IpIRM!553u`&EdT%j literal 0 HcmV?d00001 diff --git a/root/opt/phpsysinfo/gfx/attention.png b/root/opt/phpsysinfo/gfx/attention.png new file mode 100644 index 0000000000000000000000000000000000000000..4170d837a97c1c80594ca588074e4213cf8c562c GIT binary patch literal 1500 zcmV<21ta>2P)wxe{Jl>AlVqANK^=g7O8zm6dF0GH4j!HrD}0x9K}XT z8$?J6m55qZid3a4PgPqK{(yqi<|zsg2qjXSNER_zB|*h8?Dy{M&h5jl7t@fKQXmf< z>FCbAqkGQpoOAD;b44k|*ZF9C&5!$DCmt2)S#4QUPOX-`RIMI5pwx|r2Jn3m>xaqY z-};A!Qq^h|{q*TU;M)%^1=}=jylegXRQ>I@F+ci<)ZpOOqaxpXC;($3q13u{FSac% zQp)AXU%pIK*Xc|qkBG>F2l$q*znDm;!-X?vFg9*Pi^r**KTk&{v-UTz^ML~VOeD5u z-MVq_)vMT*3TR-r`%F$wa_H4pu@@HbJ^eK1`t=lNW{5?j)>_j%a91HvN`0jqgyFw$+N5T> zyVY5bN6nr)rxtQKb?n$N1t`DYuV!aw)zw^1&A#=PIt}W>t}gZ0{{Gqlcw{C0D@Gs_ zjUHYd43fWe32WCbT$v2@Vv$fN1VAhn!!%8tn>R7HZNu8Kh2kflusRTM_4s^;|EClj z5!u}F=%e4^gAbss4Rg;P$mLLgWmy22rioz~0Epw@-@hLR(C6ogr&8Nr6WMsr0Nt_J zFTY_~8Q^fTJSc zP4xF~axPpz3x_dx?}ls^5kV={0`Pb|xLhto1Ocd22ux3drXh24#1n}vuZwK^uK_wc zIu1v5ox*3I;oG|xS0VwneH%bmR~Nm#y{$PS0>vVp#~!0?bd=KKB2kx%WH@}}%k0RV zO0r*zj6D9t6MykvxIo42Ci3pPh+!c0dV^Zi&@_#cCr`3w%^HS=hNx63jVOp9UN6r4 zJpbIV0mJ2DF`48aAAkIVy-NLQ#R!Oq)|pPf5>|@B=bz)7m_Un0ky@?gWiS}z`0?Y6 zjg7H=`*yBfyM|#HEda`8jDZ1y&pk(}P#{vTlZZqP^@!*z0{j-n61}~TRL`A5PbM)( zMY@(##mvy6<4aN@)XPMtbMJRZlk?c3KvrGk-86CNL@T&)r;mx)KC zKmU>g{FK*|QDfj&lp3x!N^N!*3YWfs$>1Ap$M$9EZ6~ zhWh2plu{`^ymIB>u3GKoFBGMZi|8+9GSB<7S#A`IcuFO5Q&UhX-SVpO(%5byEG`@W z&z21+TzO)&r+a4p+K4p0Z|rc{8k zQp#CT_uXDjn~O_p%98P=i-1}N;Q-EE>;1pK9se7g#AV9-JfD030000xm8?i70Nq_#ntw2g5z$e5NNdN!;f5r}rH5VKf z9kJf xC#5QQ<|d}62BjvZR2H60wE-$h^mK6y(Kw&{<9vg>(S^W+6Zii9 z|Nhthr~iNb*Z!}6uiN$Dz5neG3a-`baBX8yz1H+_;eX)`ni0%X8XBDc-`=Ph(Uan2 zYsR{H!kvIN--9isvHznRsC#5QQ<|d}62BjvZR2H60wE-$h_H=O!(Kw&{<9vg>(S^W+6Zii9 z|Nhthr~iNb*Z!}6uiN$Dz5neG3a-`baBX8yz4q@v|B?28{s)#N@CGn3@%_y|zAV9T z66e<&B4?b6oF&azg|C(V&1ZbI_D}pL`}(^FT2yXwG1Ph~$Q@h8mJYOz!PC{xWt~$( F699+YQR)By literal 0 HcmV?d00001 diff --git a/root/opt/phpsysinfo/gfx/close.gif b/root/opt/phpsysinfo/gfx/close.gif new file mode 100644 index 0000000000000000000000000000000000000000..fa0962168ee41011c56c6b8f5cebbe75afbb0bb6 GIT binary patch literal 70 zcmZ?wbhEHbFaLjV8( literal 0 HcmV?d00001 diff --git a/root/opt/phpsysinfo/gfx/favicon.ico b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/gfx/favicon.png b/root/opt/phpsysinfo/gfx/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..80dd64e0c7e6a25752bac52437a4bfef0c589f4c GIT binary patch literal 479 zcmV<50U-W~P)m_3WWmw zexG{1P7nkL-zRf>%faRu!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 z?|Yx;d;h-g=IM$Xew><;odO_rN!g-Gx>~8_ihBBOn7Zdix+JeJTX7#?7|Tt-OD~%N zY44In3zk3hrSPh>(km#BDKzfVBvum(okrN%jLsGh`sG2yWS*&qR?I-UI2RV11t|sE zTCMidGy<1I;8acEZtSI(5mAqh>gl8Sc-!61Nw0W4vRf@Xi~LC_gB?9fj53<(h91U_Vz0 ze|^fRj8EQ#slWUTyB!BY54I%*2`~e)pi9>%(f;8--iQR3Q%BOj?}U`+|& z_YcuMxq@X35nz`@C=f5`;noUNKIr)ctZrI{v@&wVInFrEhj1U>sFcp=#S!07cPtYy z()18qu*;n|>@LG<+gj`?n}E4$+Ogj?eUQ>~;NFn?*39`+DhG8bkbgDl<)RJwJM&k!^E~{#fE9Dzb2z5yF4s&(nYj=Z=2#ERU%}zC;g*758;>ju(~8AjnA4}g zy#}wAU5*lS3-<gOH*WEAQcT$5KqPF}9}8d)$?csP&8BJ{S9oP3^`BpFh+;JR3i; zimIz+xd2yLy}82fJAVNWW zfwN#7t)fpBDQ$Rl?BjucNX3To6cZ*%M^N9g|I9{@46n?D!bZ4_WXgD~FoQ4#DGfQ| z2mFv;#4QbU3=ne&ycJE(ovrJ_soMDB;)FpU5E&E6lm*%hIl>*Bw`>8mwo|k&W}lPv z!R^!09zZ48XF`rtY?(EvqYU7_QK9iBn(G(gOQon0A*%f;(1_#;A4mVUWdPb_V?-14 zh)GoKMvF)iSwWcy$3!ev2~^<^6;GKuD|0a2Ox&>)_mu>a;;9!`O0#M891L0G;r!ka@LmLNHGWuCR3?*-gL9Lyv0NncKaW)nhfg2UZ^@r* zo{0+Eg8bFa`qMj*Jz`~^TxqAYPDgq$eos*MeO(YQP*_r)S)ygRMLadIfrE0H>$9; zA}@cIKcYYm6NX~Z`omCUZ3elZ+EkG3!H{z{mYMYdh}ouVG+wgszwl%e#|6@9x1$Kw zQ4u*1s%>*oR#=d0rfMmFMG=1%``yV!Qb!?*Dc9e0Y(2Biur6sK{0`AajV${y?diFbB1tK>25rT)|S->R{h?-w2ezBPaa}$KHie>R?D%$_rp|r zIat}3el2|JIC?KrVDdHlM5jopI+pa*7Bv<<45jWDD6nZ}5Ni~(YV|qO9!7Dzo2b-G0deJI-MBS&?)u+&Nr;X&Qc03A8#}an7A^B#Ma82 zPhyOZQjC@M(b#UfKT8`=kV2iK-9QA-(|c}Ah;?ugt43YfJLqnxQD)6xY&8hiFc z3vV@xD3z}%svKl1@IIda<;iSz)%0{9A(Ju)gL8RhllRbydkCy;1oS+^4N!W=;whd& zR$M~5W0>W8TzJ2^3i%bRS0%tqUQ=#gk}JRR!cXyBNm8-)1Z}%2>jVkTef8u+li2Jb zGA)C1Q1J@+9XAy)m?@2d6R?3=+B7&>cZINT$3bP)3dZE&DgnMJtIfIoL2+*0W_-N; zF*vIFrfW}xc$p*#5*`9lUy(vKdmlYBc*5jy@Np7i$+U86B!rqAk#`l&pV`I!WN3vj6 zYc=Y%1FGftwIS9c|Ey$|e-BPnKZ>)@gddsjpznfdm-1ck zH80?!8du|7xo+QHaaH+z440h5Ugtsl&e74?rPl^1rKs2pQ3>Wb{UdurI+4)lYdh}7 z){<#hZv6)W4Y$erKRPN_SI();zV>4MiTiI^Ako3s-kMgoDSfSEgqD7S~meuQldetoP#k?G!I)VZK_BTY0*HMEGVztg=P19^xS>1E!{~viT2Fw ze&^nM-miQ2uU=VXGfy@Huq`WIyoSD6;+JHg{~eW;Uiz4RSiE5eV1GmW*x?*|2H?zD zws_IH$KPjJ&dz?e*YyO^{r`a9Ox3Q^6zd&l_vV+EyR3=yNQn+UkA2t4UhhxN1N79>bC0PENIkD8Im)f*M>g) zYe)#=uY3A~8)|D^17bZs1*$g*fomC1hZ8D|9Wda)G2Bne$raZ2>^;1dFe@x6*1R+v zK6V*ZON{&(sM3Q`9tQQR0gGeYv`q%r-W8ic&0k#NacBIbDeDl zG-y#KVQBuG|S?Lp3Oav4K_@_IvU`SRq3`SO7 zM-qR%>`v77_6_z!)2330UIf&9I+qkr8?D2T(14CE;NI=PlXZYbo;IBU^1cO}31>3I zP2P~~s3;gnSSW8Qlm>=C{R@q!bZD&og#iqOLI(G|`WCz` z95d^Rbqq4?cR^7p@8f}!^4U!G{f*pQ0}ac+RKh)VC)Aj7!E&C`aG^cSe6#`h%j7b;Z^M}U{!wPM5SmQu|f>_EMMRR#cp(D9ohuyZpi6pNMAoMCsTi z$SL>LBHzql{tZSwB8NOwTp?+ZKPoi4C5+d;47?d_J=#if(w{QAP0u9Ni7 z%_Vj+;QRLh#S17r)OrJ<5fT>b9TDeRwxViHWVnjJ->rha$9??)i%!e6oAktm&?Cer z<5>nR+3!_jDUhl+<_%GUZ4u&X=%;NjYDec%Ltpc9_m&yBrFOx!QDAEs&==RgBpvBa- z2IEuIa_ZD{$}b&0dLN|K1zLxodlyOS#1?!{f^kE%xEH0lhO4Xp+g(5m0;n!xprZ-1 zbrm2CFwvX)rDjTl7x>yd;I%h^+tYxJ%YgT;g4ewY%%24;Btu)yi;AYMDF8os9O<$- z)#MxK_B*m?dlYy5tg@XS508&POzjv#m5c+w1cEY9Rth|Q9Jts)Lx>{L?+F{GqoE|u zcRfSi-%mzR?bQ4{e730sxZHtq_`0677^N-HF8zR{PoA>kiA?hC(?NVh1c!*mAsRgu zneQaP1sF1r%-td=UeJr25_m z4y04nE`T{>HWk==ko_;8Y@^wjNQ)RSkE{XioJw~MnYsBMDku_UB93*1)ERSt+o%TS zW&`DG!|Nr~F}uGFw7v_h{U%-29|J=ajc)o9?~BYfp@DloaI@U+N2bPDNB8 zb~7$BHmT?0B>(^eN=ZaPR9HvtmfcH}Q5?s2X=zACS6v8|6x~GG>_Wj~fsvIaNWPX) zMrLSbZ7DfCse5rbn{H#eO&u)7%`7+R73=XWL5skPiU@+biGm3F2TuEK$H$#^=H}zP z^9$db^PJ!3dv?z6JkMksiYD#oBvC(;as4b?*=pUTYr~^4fZtd2*$ZxmMSmqbNgR zB-u^f;@Ho>pHZQn-xC_oYa(lW;9*|75PqZ2&4kz3+=9~O5l-s*!+J&T4-8#IZJ!5a zH*}Nq2D3N@D(qkv0htqvAA-k_TCEkgsi2*0xGVNS;Y??6jJE*rLH`x>E=-Am-i2wr z^OA<-s7%ZvvKmcd4P?^cU=wXU8+^OL86Q@fguGTO&TZ)lEDS!WnGGf(^Nu;U$^!@r@#pP ue6LEk2S;#X86O;z{k6cLxD9b6ll=qqE(#_a-$K|t literal 0 HcmV?d00001 diff --git a/root/opt/phpsysinfo/gfx/images/Amazon.png b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/gfx/images/Apple.png b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/gfx/images/Arch.png b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/gfx/images/BOSS.png b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/gfx/images/CentOS.png b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/gfx/images/ClearOS.png b/root/opt/phpsysinfo/gfx/images/ClearOS.png new file mode 100644 index 0000000000000000000000000000000000000000..f2a1f2ecb9a0f643f33cb0506bc9169b959a27cc GIT binary patch literal 4217 zcmc&%d5o0h9e&>Ln(v$0Id*1PcG+ct-Q}>9!vlrGnEHPdjR;vVzMZ^k*g2=VV0=u)bJIBs^GvD3kTgqk?H1@B)$;@}o z`+I)Z^Lyr3S1!LS9vv425MR1v(bsvL7=Cn(-*?<|PlX5L_9fTd0VLiIKjQb(6RkjM z`qD)UuD<(YF)?+hAc7#^d;hXp}_URnVm=E1RBVbMvMTj&WJlJp@Y?R6mk zr{G&#KKZiyeyIqEXRlZVbKpiO5$?-~DIsni1OLP^wC07^GElDq(Nr&t_)WpJ&#wy~ zebM?t0OGI9ZbK#a2=o{|P0)Y~2&o5lVJpGxMsms^d`CfLU@Y&=0H#t>e)w4$giEa_hOM^aD-Vmf)Ioy`w=$qc6mx$;)9LnS)4MqN{KHi!@k` z2)GUO*l?hz9!tT8GEK(u*$wE8Nw72@)hpuIt0}Nmf!;wI4@ph9R5EbJBRNdn(!AqU z$kjX=n98zye6+pr{8Ior{qlooUNjqp?eFk)i{1<0hfKSOXt3e}o-D(k6vJ@_q8wFl zBn}i)I!b971BL`I;iK>UGOpfQ!kJqu=vv*6vGxOsnZHT9rJvzuAvD{{$FDA3=12!MMq}Oh*3qR(f&vW4Net}Ww8S>E(@!?wv0{+g` z`1^4h%w1J9dOoYBe)v7a$eKfgcb*nNgMx3MY0g*R6^{rXfhC|`mBFq{6WITwad;gX z@&&<$^x+)0F>8kjX@Y}&9Ucy@9>h7(AnZNv4>Vk!#k;ej=xt_nrWxq{n2t{>ebfz~ zv5ZC`p1a~_CqWEH;QGIa8LV)YQ#ylM-!ZnGn~Y$fQ^uewp>m`O=cW{1NeX;Ym0>jb z^vuD^RW@#Zw1Qj74xK3(H9kws(XnBIjKkcoCg}I12ue8%$^}u>p=w2bXj}Z`Qvh@u z^NxBjVIJELGnbFB>T4bnhaE^24`oll>~&E6VJn_w|L?5GXz0*TpoeuDD~t(XGCJvu zhBfmv>@3iDO<-u8io(VM+BJu5YT-2u<==&H9dZOq?8F+5fG^{WJ`xPfgGV3~HO^pi z)B4M0oPXFxv`IoA*ykVg!hWib-!Z2<8CI3KuaV>GeG-z2gQr*2@sFH<bBEvW>SexV;DcJKlw?K|H(UtPsL502a&ynHxpzQYqn<`VM$d8HJ!z!q83& z%U>;{88!xM7W}7lG~Tb{4@n8T_Daa~1ZXlXtpBBj&HES`*F^DL13gdVa0z*^u}y`$ zrHl=83@p1O=9q0kegG2d+YdTM0N5(zu`=xMq;PO$5{KFpbQe{q%zrS!M{Y>q+wave zeU`;EalKJT@-Y)nsxCfao;N?8#4E2x5od74qJESfEaJ+jkCupo{*r*ys9?gi<6w^` zm_<<>$I!k#aB^WWoQQyL!EV=KR(+ktqYQm;#IF{Q?01Pr&xr+4oj0nj9{ZFUlYPTD=@qN`Uzb4)|MErP%y z;WX#*=0Ou35{FQ$j$PdWE?Uc0?LUml;sdB|+l%I01>;%FJ3j2gxLp-=G!^l7x&aYM z9ge26zKW?P*;25s$hP_5mRqb40Q~}PSQ%_x^}GnO^qL^bIR_as+O(M-wsG2Nii_%` zI-cL-;I^!S5=cb;esmcw3U}+&2LfMhQm~*>L#)F6W)0zC#lRSuBRs33y57Y?wriq= z38(9NEU;b*?S^Z(2Er3f#-?-A*HGOskAFq0MlO0BHB| z$AuaAQ3+zeLVBi#H|s7E*%(|ShHBMDwMOEJ$gsF!O?F{YuH>Z(3Lfj4dZEg`4-`&I zPenZ|q3#--4<1@c;q_3waBxM80B>!-BgmgHKMKJ7Yk~?@%?nGiDD}CxsIS6Oaj-?O zWRi`L&P;ME3J{yKLFTr39c7F~X-X&ZN(!Ywf=z<+TnT0-36W}`a|R6R35TsH44L)A zwCt|lfBI<{BD!*U@a%cbIB;PT_SY2L&I%!L)X92oHI0NTP*F5aN(nWo21l=;+_x7d zC96-lWHZ0aI;t$xxKI&sJTy|ZJ4po!=inF?z`enJ_k~h=WR0ZY_*Di~t-___{_snR)=8W~lO zl$W8HSxvpT@uZ!T$KftGc@ZANS`inE+c#TyxG2NTJD6QE;5P>79x$<^Nyj7-VUmm% z%SlKpY{#^QSixp$II2U1%4nq20P$j2Lo!-oDxO>Qz2LW_?VLP6B?2cwT(~&6b4m>V zrUHtQLQ~}QsjUgLm#P>%Si}Jml3)>P?2;J!Tc>f)X1?2G2o_tS>LEokYoma<>+_6< zwoVIR7~KOxn!W?aKz(t-BaXCt>m0IzRz?aSg@uZandyVKkIeY9M^LVJ@Od zFQrKYddWhZ>L^B5bB7%Cy>%4%M2w_EeYj0frf_)@4sn?6;b?ZK4NWhCU%sMTArQ2X0odLVQfKoV_S{vb!7xa`3cYFdd-$aT3147mvSq=$H zaG;Ths+8##M{?DsiV}4Uaim+f9L2Gbmq(pw*WNd#{qg>vhqsnqx_r?Km)!7+{{XN0 BlV<<` literal 0 HcmV?d00001 diff --git a/root/opt/phpsysinfo/gfx/images/Cloud.png b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/gfx/images/Cobalt.png b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/gfx/images/CoreOS.png b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/gfx/images/Darwin.png b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/gfx/images/DragonFly.png b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/gfx/images/Eisfair.png b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/gfx/images/Fedora.png b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/gfx/images/Foresight.png b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/gfx/images/FreeBSD.png b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/gfx/images/Fuduntu.png b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/gfx/images/Generations.png b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/gfx/images/Gentoo.png b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/gfx/images/Gobo.png b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/gfx/images/HPUX.png b/root/opt/phpsysinfo/gfx/images/HPUX.png new file mode 100644 index 0000000000000000000000000000000000000000..6f55dd42698a7d69cfb580f068265232eec5d4bf GIT binary patch literal 2411 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 RYl;8>002ovPDHLkV1g#@6&L^j literal 0 HcmV?d00001 diff --git a/root/opt/phpsysinfo/gfx/images/IPFire.png b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/gfx/images/KaOS.png b/root/opt/phpsysinfo/gfx/images/KaOS.png new file mode 100644 index 0000000000000000000000000000000000000000..ea6bdad637552f6a8efa18db45aa79fd6bf6f6b8 GIT binary patch literal 4217 zcmc&%eN2^A7=P~Nc87#`BWFmaWcFb!qUD^mmCDdSn?abZsm(%XYf)@0aU_)B2hOY} zwj5Jq)23N5(;Q{8%v35(1=bS(kue}drgX>9uGf3}{m%QI_r8~VLHMhOJ@+~1Jm1fG z&N(leauz%{Ixaa*L`G+4WxfcSLX36ex2U9~4`ftf)+?K08$1LeaE4rJ;%jRINOcv-QpN>LHF z-I>@rx3fZJ|?GT`wf$Xh?xA-y}qAwemh{<6poFRXcyrO$NY zlG3JAiXX&p{H~e&3Hl5>RCc>Xx#`lNO(H z=`YOGGN6O{8I%Df4U}Q0(rk#9Hr8OC2#lAk;zI6z7~hcR5#iRcH+1-%S}?pO^j_|i zgnN>q6>{Qm1f{Hrl?Vl8=Ns!*g4hDeMSvxsIgFH`=b!-7@5*t)Ka5-2#lOYWL5RRY25 z^7X3Ca^c8tGW*SC^32MYtOBsZD<1yiF%g)8cl61dE zW)|kj!?QBvT6>#R&410*by~*|0mNcYe~HKvk{0aF-zS$&H)Gxd6*;E4S0UAY3we#`LJdtY>@k74dd=fKO-4o(~PT;3o9_KwdOH%vlky z_b#TzlyB6~l&@qvvqvHTj zNnox3Q*H+X>6Me8@3i!_9n$`P{+0Dl7Gp#Ye%+Z=a!NzZ7t+^rU2-=pL+obhaNdoK z>6lqZIL4X<3=G@KK>7^}&{wuVw=b-bD;NI)?<$a0^r;F!i2=~~RcZciKdSMnkv=jE z+){Cary7n9Fdh=DN?bhtE9@W<*eOrj21dXz@@(QR(IR;A{ZWWv|G5sOP8(Z++*|pMrsYABs6kyE{U#g!} z1u$Wjcv5i@@sUwwqhE~@iwQBTVwgt-*fWFG`X(JWIT;DoLdgTKpU_4~u$i3j-^1bCyiU%@?keO zqcWPmXPe|yR;V7LEv;{-e!sp?dhCx8?&eV*nKEszv^KQj_(2&R>vFlIH~`^=7a%4759OYX+y7!Mx~uRAJ#d{qYpeSK3`+vQzz0|E5uEg+N5c;WD( z;8jUQ(q5VK?(;YisOJc9#!^0RyuN8e+tZI3*XhfOh-1Pn;J|YpkUJB{D=yz2#xNXu zcgh&(a3AT2IM6PZ1_XeTzyrG_1ZXhBDVI6c^k7-NoIk)4_e*N_(~?)YB#dvE(G}(c z77+lOR||wZ+C~r{pGfcI7&LGz0O$3Xv!tE!XWao*g$}~y3|(yl><9=98GtDsz)O}Z zt!G+b-+?n7lyy(62CvIR_DZ)@q~}=tpQ;+5vkL3#(E*Lf9&3mhPq$HZR@b4wj>uDh zHKrW{j0f^2Oa$_@u#0tbaetWzuhwxu$`R-H6vsc5JhVteX$^ASuU0`3ZIh@{Us@?DO@ap=m}>(z(~Pk9-o|Xq40{vy zo@V*lU;@ElFb;dKBudv)AN$sa_FjXFZKS^RrBeU$z2|)A`}v;ZbH3{m9>TCN|I{1+ zV8LS2Trg{mUmx7U?zG<0RRC@Q9*0l2v!_0NOtF7Lr97qmK%qUR(4SE0Gzy(gb+D&1 zC=N^p9s97T3>MRYO=YraEJp^*fyrXf*&G&|>EP(Za75USEDjrCau7C$?dZftI9v|m z=;Fk2;&NOOCxqw3=OSEZM8M8r1jtYv24vvipiHi-5j|)qP4^K>pNJ@-MPKruNj!sR9NlT4QPm9Y)j~8b|i82zh zMA4a|#O%x%ab{AEI5sycE-yPiKPRCeH?c4;Ns^yjRFG0!m|7x9D=kVdE6yk{5j`)> ztSA##mSsj1AZt;(yb&aba2XsXR_s4Z-+%W15WwAAM|)fcrk9Rs zHx+a=7k0Ktx>}36UljMWmGrik_H~r?ca{%yRSb4l4)s(G_g0Ve)r|Jnjt$g}57tYE z8m2~@WTUmyW6kJz-OPB4Tw1S~XqcUBoSSM=PB+ibw7itHE}}19$=j9`?W)<1<+;uk zWw(01XLX@>ZLv@Ds(*cHK&u+uSRUG38QxNlY_E>4Yesk0#Q~BF7#m}dTU(ROVU(Ee_K8KyU z|E5aq9I(R7K#~jM3jX|m%e?V-JFFQW#xXq;0l2e*UuN|W??3=Ux1kl1Rx%Qs`Awg-9(&P!Bd~2Kl026?aEHg@A3~Y#bq?#@hpoFCV6#)cD zctl8o#9$+Y`kCT#O@acc3blmY2qYL14{UT*NuiAjRj5H6X=ZuB(y;wx?kvue?y1o= z+<^($&E}dA!qEWO%>(0dWcR*g~@Q^2ubDQU4@lD6;y73~fs1XD<&1 z%)l$XmPR9n>2*M%&<_rZ^qw9HBTOq**K>!N`hM#HYqG95{qiP2j5jPB+yEqS+Ni1< z0LlKU{Hq+Mz~@AbZbJGJOjD2{FgdwUto|Eb`~q456njq%1+DIWWT6uQLQ9eAa`Fa* mpQpgXQ>WOf5hZ#(I0NQixyl;JZy;etHx3pZp^a1g^Zo*HGU!_X literal 0 HcmV?d00001 diff --git a/root/opt/phpsysinfo/gfx/images/LFS.png b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/gfx/images/Linaro.png b/root/opt/phpsysinfo/gfx/images/Linaro.png new file mode 100644 index 0000000000000000000000000000000000000000..b076f7a3e4b02be8ed59d0b0d37ce84d69cdaaaf GIT binary patch literal 4217 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 literal 0 HcmV?d00001 diff --git a/root/opt/phpsysinfo/gfx/images/Mandrake.png b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/gfx/images/Manjaro.png b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/gfx/images/Mer.png b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/gfx/images/Netrunner.png b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/gfx/images/NixOS.png b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/gfx/images/OpenMandriva.png b/root/opt/phpsysinfo/gfx/images/OpenMandriva.png new file mode 100644 index 0000000000000000000000000000000000000000..0df0ebf9ae5c030da88d18c10359ffcf839a1357 GIT binary patch literal 2193 zcmd^=i%(N$7{*^`aVp?ovtFons1wjC6P-##1r(+jM?ld*b!!zFvkEAvpeV*FAeVuF z2y&_AQYla_EtHmC==}!0a0dY|QH&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/root/opt/phpsysinfo/gfx/images/Oracle.png b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/gfx/images/PLD.png b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/gfx/images/Pisi.png b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/gfx/images/Porteus.png b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/gfx/images/Puppy.png b/root/opt/phpsysinfo/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, "", "" ], + 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
", "
" ] + }, + safeFragment = createSafeFragment( document ), + fragmentDiv = safeFragment.appendChild( document.createElement("div") ); + +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 !== strundefined ? context.getElementsByTagName( tag || "*" ) : + typeof context.querySelectorAll !== strundefined ? 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; +} + +// Used in buildFragment, fixes the defaultChecked property +function fixDefaultChecked( elem ) { + if ( rcheckableType.test( elem.type ) ) { + elem.defaultChecked = elem.checked; + } +} + +// 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; +} + +// 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" ) ); + } +} + +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; + } +} + +jQuery.extend({ + 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; + }, + + buildFragment: function( elems, context, scripts, selection ) { + var j, elem, contains, + tmp, tag, tbody, wrap, + l = elems.length, + + // Ensure a safe fragment + safe = createSafeFragment( context ), + + nodes = [], + i = 0; + + for ( ; i < l; i++ ) { + elem = elems[ i ]; + + if ( elem || elem === 0 ) { + + // Add nodes directly + if ( jQuery.type( elem ) === "object" ) { + jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); + + // Convert non-html into a text node + } else if ( !rhtml.test( elem ) ) { + nodes.push( context.createTextNode( elem ) ); + + // Convert html into DOM nodes + } else { + tmp = tmp || safe.appendChild( context.createElement("div") ); + + // Deserialize a standard representation + tag = (rtagName.exec( elem ) || [ "", "" ])[ 1 ].toLowerCase(); + wrap = wrapMap[ tag ] || wrapMap._default; + + tmp.innerHTML = wrap[1] + elem.replace( rxhtmlTag, "<$1>" ) + wrap[2]; + + // Descend through wrappers to the right content + j = wrap[0]; + while ( j-- ) { + tmp = tmp.lastChild; + } + + // Manually add leading whitespace removed by IE + if ( !support.leadingWhitespace && rleadingWhitespace.test( elem ) ) { + nodes.push( context.createTextNode( rleadingWhitespace.exec( elem )[0] ) ); + } + + // Remove IE's autoinserted 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++ ]) ) { + + // #4087 - If origin and destination elements are the same, and this is + // that element, do not do anything + if ( selection && jQuery.inArray( elem, selection ) !== -1 ) { + 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; + }, + + cleanData: function( elems, /* internal */ acceptData ) { + var elem, type, id, data, + i = 0, + internalKey = jQuery.expando, + cache = jQuery.cache, + deleteExpando = support.deleteExpando, + special = jQuery.event.special; + + for ( ; (elem = elems[i]) != null; i++ ) { + if ( acceptData || jQuery.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 ]; + + // IE does not allow us to delete expando properties from nodes, + // nor does it have a removeAttribute function on Document nodes; + // we must handle all of these cases + if ( deleteExpando ) { + delete elem[ internalKey ]; + + } else if ( typeof elem.removeAttribute !== strundefined ) { + elem.removeAttribute( internalKey ); + + } else { + elem[ internalKey ] = null; + } + + deletedIds.push( id ); + } + } + } + } + } +}); + +jQuery.fn.extend({ + 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 this.domManip( arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.appendChild( elem ); + } + }); + }, + + prepend: function() { + return this.domManip( 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 this.domManip( arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this ); + } + }); + }, + + after: function() { + return this.domManip( arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this.nextSibling ); + } + }); + }, + + remove: function( selector, keepData /* Internal Use Only */ ) { + var elem, + elems = selector ? jQuery.filter( selector, this ) : this, + i = 0; + + for ( ; (elem = elems[i]) != null; i++ ) { + + if ( !keepData && elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem ) ); + } + + if ( elem.parentNode ) { + if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) { + setGlobalEval( getAll( elem, "script" ) ); + } + elem.parentNode.removeChild( elem ); + } + } + + return this; + }, + + 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 = value.replace( rxhtmlTag, "<$1>" ); + + 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 arg = arguments[ 0 ]; + + // Make the changes, replacing each context element with the new content + this.domManip( arguments, function( elem ) { + arg = this.parentNode; + + jQuery.cleanData( getAll( this ) ); + + if ( arg ) { + arg.replaceChild( elem, this ); + } + }); + + // Force removal if there was no new content (e.g., from empty arguments) + return arg && (arg.length || arg.nodeType) ? this : this.remove(); + }, + + detach: function( selector ) { + return this.remove( selector, true ); + }, + + domManip: function( args, callback ) { + + // Flatten any nested arrays + args = concat.apply( [], args ); + + var first, node, hasScripts, + scripts, doc, fragment, + i = 0, + l = this.length, + set = this, + 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 this.each(function( index ) { + var self = set.eq( index ); + if ( isFunction ) { + args[0] = value.call( this, index, self.html() ); + } + self.domManip( args, callback ); + }); + } + + if ( l ) { + fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, this ); + first = fragment.firstChild; + + if ( fragment.childNodes.length === 1 ) { + fragment = first; + } + + if ( first ) { + 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 ) { + jQuery.merge( scripts, getAll( node, "script" ) ); + } + } + + callback.call( this[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 this; + } +}); + +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 = {}; + +/** + * 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 style, + elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ), + + // getDefaultComputedStyle might be reliably used only on attached element + display = window.getDefaultComputedStyle && ( style = window.getDefaultComputedStyle( elem[ 0 ] ) ) ? + + // Use of this method is a temporary fix (more like optmization) until something better comes along, + // since it was removed from specification and supported only in FF + style.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, false) + "" + genlang(32, false) + "" + genlang(33, false) + "" + 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"); + } +} + +/** + * show the page + * @param {jQuery} xml phpSysInfo-XML + */ +function displayPage(xml) { + var versioni = ""; + if (cookie_template !== null) { + $("#template").val(cookie_template); + } + if (cookie_language !== null) { + $("#lang").val(cookie_language); + } + $("#loader").hide(); + $("#container").fadeIn("slow"); + versioni = $("Generation", xml).attr("version").toString(); + $("#version").html(versioni); + + $("Options", xml).each(function getOptions(id) { + var showPickListLang = "", showPickListTemplate = ""; + showPickListLang = $(this).attr("showPickListLang"); + showPickListTemplate = $(this).attr("showPickListTemplate"); + if (showPickListTemplate === 'false') { + $('#template').hide(); + $('span[id=lang_044]').hide(); + } + if (showPickListLang === 'false') { + $('#lang').hide(); + $('span[id=lang_045]').hide(); + } + }); +} + +/** + * 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); + $("#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); + if (prunning || psleeping || pstopped || pzombie || pwaiting || pother) { + $("#s_processes_1").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_1").append(eval("p" + proc_type) + " " + genlang(typelist[proc_type], true)); + not_first = true; + } + } + $("#s_processes_1").append(") "); + } + $("#s_processes_2").html($("#s_processes_1").html()); + }); +} + + +/** + * 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 = ""; + var showCPUInfoExpanded = ""; + var showCPUListExpanded = ""; + $("Options", xml).each(function getOptions(id) { + showCPUInfoExpanded = $(this).attr("showCPUInfoExpanded"); + showCPUListExpanded = $(this).attr("showCPUListExpanded"); + }); + $("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 === 'false') { + collapsed.push(rootposition); + } + html += "" + model + "\n"; + cpucoreposition = tree.push(rootposition); + if (showCPUInfoExpanded !== 'true') { + 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); + } + 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)) { + 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; + 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, false) + "" + model + "
" + genlang(72, false) + "" + start_time + "
" + genlang(73, false) + "" + upsstatus + "
" + genlang(84, false) + "" + temperature + "
" + genlang(74, false) + "" + outages_count + "
" + genlang(75, false) + "" + last_outage + "
" + genlang(76, false) + "" + last_outage_finish + "
" + genlang(77, false) + "" + line_voltage + " " + genlang(82, true) + "
" + genlang(108, false) + "" + line_frequency + " " + genlang(109, true) + "
" + genlang(78, false) + "" + createBar(load_percent) + "
" + genlang(104, false) + "" + battery_date + "
" + genlang(79, false) + "" + battery_voltage + " " + genlang(82, true) + "
" + genlang(80, false) + "" + createBar(battery_charge_percent) + "
" + genlang(81, false) + "" + time_left_minutes + " " + genlang(83, false) + "
\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); + + $('.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); + } + }); +} + +cookie_language = readCookie("language"); +cookie_template = readCookie("template"); + +if (cookie_template) { + switchStyle(cookie_template); +} + +$(document).ready(function buildpage() { + 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); + + changeLanguage(); + displayPage(xml); + settimer(xml); + + $('.stripeMe tr:nth-child(even)').addClass('even'); + langcounter = 1; + } + }); + + $("#errors").nyroModal(); + + $("#lang").change(function changeLang() { + var language = "", i = 0; + language = $("#lang").val().toString(); + createCookie('language', language, 365); + cookie_language = readCookie('language'); + changeLanguage(); + for (i = 0; i < plugin_liste.length; i += 1) { + changeLanguage(plugin_liste[i]); + } + return false; + }); + + $("#template").change(function changeTemplate() { + switchStyle($("#template").val().toString()); + return false; + }); +}); + +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.push(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; +} + +/** + * 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/root/opt/phpsysinfo/js/phpSysInfo/phpsysinfo_bootstrap.js b/root/opt/phpsysinfo/js/phpSysInfo/phpsysinfo_bootstrap.js new file mode 100644 index 0000000..cfe8626 --- /dev/null +++ b/root/opt/phpsysinfo/js/phpSysInfo/phpsysinfo_bootstrap.js @@ -0,0 +1,1172 @@ +//var data_dbg; + +function reload(initiate) { + $("#errorbutton").hide(); + $("#errors").empty(); + $.ajax({ + dataType: "json", + url: "xml.php?json", + 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); + if (data['UnusedPlugins'] !== undefined) { + var plugins = items(data["UnusedPlugins"]["Plugin"]); + for (var i = 0; i < plugins.length; i++) { + $.ajax({ + dataType: "json", + url: "xml.php?plugin=" + plugins[i]["@attributes"]["name"]+"&json", + pluginname: plugins[i]["@attributes"]["name"], + success: function (data) { + try { + // dynamic call + window['renderPlugin_' + this.pluginname](data); + } + catch (err) { + } + renderErrors(data); + } + }); + } + } + } + }); +} + +$(document).ready(function () { + $(document).ajaxStart(function () { + $("#loader").show(); + }); + $(document).ajaxStop(function () { + $("#loader").hide(); + }); + + $.getScript( "./js.php?name=bootstrap", function(data, status, jqxhr) { + reload(true); + + $(".navbar-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: { + text: 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"]; + } + }, + LoadAvg: { + html: function () { + if (this["CPULoad"] !== undefined) { + return '
'+this["LoadAvg"] + '
' + + '
' + + '
' + round(this["CPULoad"],0) + '%
'; + } else { + return this["LoadAvg"]; + } + } + }, + Processes: { + text: function () { + var processes = "", prunning = 0, psleeping = 0, pstopped = 0, pzombie = 0, pwaiting = 0, pother = 0; + var not_first = false; + processes = parseInt(this["Processes"]); + if (this["ProcessesRunning"] !== undefined) { + prunning = parseInt(this["ProcessesRunning"]); + } + if (this["ProcessesSleeping"] !== undefined) { + psleeping = parseInt(this["ProcessesSleeping"]); + } + if (this["ProcessesStopped"] !== undefined) { + pstopped = parseInt(this["ProcessesStopped"]); + } + if (this["ProcessesZombie"] !== undefined) { + pzombie = parseInt(this["ProcessesZombie"]); + } + if (this["ProcessesWaiting"] !== undefined) { + pwaiting = parseInt(this["ProcessesWaiting"]); + } + if (this["ProcessesOther"] !== undefined) { + pother = parseInt(this["ProcessesOther"]); + } + if (prunning || psleeping || pstopped || pzombie || pwaiting || pother) { + processes += " ("; + for (proc_type in {running:0,sleeping:1,stopped:2,zombie:3,waiting:4,other:5}) { + if (eval("p" + proc_type)) { + if (not_first) { + processes += ", "; + } + processes += eval("p" + proc_type) + String.fromCharCode(160) + proc_type; + 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); +} + +function renderHardware(data) { + + var directives = { + Model: { + text: function () { + return this["Model"]; + } + }, + CpuSpeed: { + text: function () { + return formatHertz(this["CpuSpeed"]); + } + }, + CpuSpeedMax: { + text: function () { + return formatHertz(this["CpuSpeedMax"]); + } + }, + CpuSpeedMin: { + text: function () { + return formatHertz(this["CpuSpeedMin"]); + } + }, + Cache: { + text: function () { + return formatBytes(this["Cache"], data["Options"]["@attributes"]["byteFormat"]); + } + }, + BusSpeed: { + text: 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+="Machine"; + html+=""; + html+=""; + html+=""; + } + + var paramlist = {CpuSpeed:"CPU Speed",CpuSpeedMax:"CPU Speed Max",CpuSpeedMin:"CPU Speed Min",Cache:"Cache Size",Virt:"Virtualization",BusSpeed:"BUS Speed",Bogomips:"System Bogomips",Cputemp:"Temperature",Load:"Load Averages"}; + try { + var datas = items(data["Hardware"]["CPU"]["CpuCore"]); + for (var i = 0; i < datas.length; i++) { + if (i == 0) { + html+=""; + html+="CPU"; + html+="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+=""+ paramlist[proc_param]+""; + html+=""; + html+=""; + } + } + + } + } + catch (err) { + $("#hardware-CPU").hide(); + } + + for (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+="Number of devices:"; + html+=""; + html+=""; + } + html+=""; + html+=""; + html+=""; + html+=""; + html+=""; + } + } + catch (err) { + $("#hardware-"+hw_type).hide(); + } + } + $("#hardware").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) { + $("#hardware-CPU span").html(i); + } + } + catch (err) { + $("#hardware-CPU").hide(); + } + + for (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) { + $("#hardware-" + hw_type + " span").html(licz); + } + } + catch (err) { + $("#hardware-"+hw_type).hide(); + } + } + $('#hardware').treegrid({ + initialState: 'collapsed', + expanderExpandedClass: 'normalicon normalicon-down', + expanderCollapsedClass: 'normalicon normalicon-right' + }); + if (data["Options"]["@attributes"]["showCPUListExpanded"] !== "false") { + try { + $('#hardware-CPU').treegrid('expand'); + } + catch (err) { + } + } + if (data["Options"]["@attributes"]["showCPUInfoExpanded"] === "true") { + try { + var datas = items(data["Hardware"]["CPU"]["CpuCore"]); + for (var i = 0; i < datas.length; i++) { + $('#hardware-CPU-'+i).treegrid('expand'); + } + } + catch (err) { + } + } +} + +function renderMemory(data) { + var directives = { + Total: { + text: function () { + return formatBytes(this["@attributes"]["Total"], data["Options"]["@attributes"]["byteFormat"]); + } + }, + Free: { + text: function () { + return formatBytes(this["@attributes"]["Free"], data["Options"]["@attributes"]["byteFormat"]); + } + }, + Used: { + text: 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 += 'Kernel+Apps: '+ this["Details"]["@attributes"]["AppPercent"] + '%'; + not_first = true; + } + if (this["Details"]["@attributes"]["CachedPercent"] !== undefined) { + if (not_first) html += ' - '; + html += 'Cache: ' + this["Details"]["@attributes"]["CachedPercent"] + '%'; + not_first = true; + } + if (this["Details"]["@attributes"]["BuffersPercent"] !== undefined) { + if (not_first) html += ' - '; + html += 'Buffers: ' + this["Details"]["@attributes"]["BuffersPercent"] + '%'; + } + html += ')
'; + return html; + } + } + }, + Type: { + text: function () { + return "Physical Memory"; + } + } + }; + + var directive_swap = { + Total: { + text: function () { + return formatBytes(this["Total"], data["Options"]["@attributes"]["byteFormat"]); + } + }, + Free: { + text: function () { + return formatBytes(this["Free"], data["Options"]["@attributes"]["byteFormat"]); + } + }, + Used: { + text: 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); +} + +function renderFilesystem(data) { + var directives = { + Total: { + text: function () { + return formatBytes(this["Total"], data["Options"]["@attributes"]["byteFormat"]); + } + }, + Free: { + text: function () { + return formatBytes(this["Free"], data["Options"]["@attributes"]["byteFormat"]); + } + }, + Used: { + text: 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: { + text: function () { + return formatBytes(this["RxBytes"], data["Options"]["@attributes"]["byteFormat"]); + } + }, + TxBytes: { + text: function () { + return formatBytes(this["TxBytes"], data["Options"]["@attributes"]["byteFormat"]); + } + }, + Drops: { + text: function () { + return this["Err"] + "/" + String.fromCharCode(8203) + this["Drops"]; + } + } + }; + + var html = ""; + + html+=""; + html+=""; + html+="Device"; + html+="Receive"; + html+="Sent"; + html+="Err/" + String.fromCharCode(8203) +"Drop"; + html+=""; + 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, String.fromCharCode(8203)+":").split(";"); /* split long addresses */ + for (var j = 0; j < infos.length; j++){ + html +="" + infos[j] + ""; + } + } + } + $("#network").empty().append(html); + if (i > 0) { + for (var i = 0; i < datas.length; i++) { + $('#network-' + i).render(datas[i]["@attributes"], directives); + } + $("#block_network").show(); + } else { + $("#block_network").hide(); + } + } + catch (err) { + $("#block_network").hide(); + } + + $('#network').treegrid({ + initialState: 'collapsed', + expanderExpandedClass: 'normalicon normalicon-down', + expanderCollapsedClass: 'normalicon normalicon-right' + }); + +} + +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: { + text: function () { + if (this["Event"] === undefined) + return this["Label"]; + else + return this["Label"] + " ! "+this["Event"]; + } + } + }; + 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: { + text: function () { + if (this["Event"] === undefined) + return this["Label"]; + else + return this["Label"] + " ! "+this["Event"]; + } + } + }; + + 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: { + text: function () { + return this["Value"] + String.fromCharCode(160) + "RPM"; + } + }, + Min: { + text: function () { + if (this["Min"] !== undefined) + return this["Min"] + String.fromCharCode(160) + "RPM"; + } + }, + Label: { + text: function () { + if (this["Event"] === undefined) + return this["Label"]; + else + return this["Label"] + " ! "+this["Event"]; + } + } + }; + + 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: { + text: function () { + if (this["Event"] === undefined) + return this["Label"]; + else + return this["Label"] + " ! "+this["Event"]; + } + } + }; + + 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: { + text: function () { + if (this["Event"] === undefined) + return this["Label"]; + else + return this["Label"] + " ! "+this["Event"]; + } + } + }; + + 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: { + text: function () { + return this["LineVoltage"] + String.fromCharCode(160) + "V"; + } + }, + LineFrequency: { + text: function () { + return this["LineFrequency"] + String.fromCharCode(160) + "Hz"; + } + }, + BatteryVoltage: { + text: function () { + return this["BatteryVoltage"] + String.fromCharCode(160) + "V"; + } + }, + TimeLeftMinutes: { + text: function () { + return this["TimeLeftMinutes"] + String.fromCharCode(160) + "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:"Model",StartTime:"Started",Status:"Status",Temperature:"Temperature",OutagesCount:"Outages",LastOutage:"Last outage cause",LastOutageFinish:"Last outage timestamp",LineVoltage:"Line voltage",LineFrequency:"Line frequency",LoadPercent:"Load percent",BatteryDate:"Battery date",BatteryVoltage:"Battery voltage",BatteryChargePercent:"Battery charge",TimeLeftMinutes:"Time left on batteries"}; + + 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+=""+ paramlist[proc_param]+""; + html+=""; + html+=""; + } + } + + } + } + catch (err) { + } + + if ((data["UPSInfo"]["@attributes"] !== undefined) && (data["UPSInfo"]["@attributes"]["ApcupsdCgiLinks"] === "1")) { + html+=""; + html+="(Details)"; + html+=""; + html+=""; + } + + $("#ups").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").show(); + } + } + catch (err) { + $("#errorbutton").hide(); + } +} + +/** + * 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) + "days" + String.fromCharCode(160); + } + if (intHours) { + txt += intHours.toString() + String.fromCharCode(160) + "hours" + String.fromCharCode(160); + } + return txt + intMin.toString() + String.fromCharCode(160) + "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) + "F"; + case "c": + return round(degree, 1) + String.fromCharCode(160) + "C"; + case "c-f": + return round(degree, 1) + String.fromCharCode(160) + "C
    (" + round((((9 * degree) / 5) + 32), 1) + String.fromCharCode(160) + "F)"; + case "f-c": + return round((((9 * degree) / 5) + 32), 1) + String.fromCharCode(160) + "F
    (" + round(degree, 1) + String.fromCharCode(160) + "C)"; + } + } +} + +/** + * 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) + "MHz"; + } + else { + if (mhertz && mhertz >= 1000) { + return round(mhertz / 1000, 2) + String.fromCharCode(160) + "GHz"; + } + 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) + "PiB"; + break; + case "tib": + show += round(bytes / Math.pow(1024, 4), 2); + show += String.fromCharCode(160) + "TiB"; + break; + case "gib": + show += round(bytes / Math.pow(1024, 3), 2); + show += String.fromCharCode(160) + "GiB"; + break; + case "mib": + show += round(bytes / Math.pow(1024, 2), 2); + show += String.fromCharCode(160) + "MiB"; + break; + case "kib": + show += round(bytes / Math.pow(1024, 1), 2); + show += String.fromCharCode(160) + "KiB"; + break; + case "pb": + show += round(bytes / Math.pow(1000, 5), 2); + show += String.fromCharCode(160) + "PB"; + break; + case "tb": + show += round(bytes / Math.pow(1000, 4), 2); + show += String.fromCharCode(160) + "TB"; + break; + case "gb": + show += round(bytes / Math.pow(1000, 3), 2); + show += String.fromCharCode(160) + "GB"; + break; + case "mb": + show += round(bytes / Math.pow(1000, 2), 2); + show += String.fromCharCode(160) + "MB"; + break; + case "kb": + show += round(bytes / Math.pow(1000, 1), 2); + show += String.fromCharCode(160) + "kB"; + break; + case "b": + show += bytes; + show += String.fromCharCode(160) + "B"; + break; + case "auto_decimal": + if (bytes > Math.pow(1000, 5)) { + show += round(bytes / Math.pow(1000, 5), 2); + show += String.fromCharCode(160) + "PB"; + } + else { + if (bytes > Math.pow(1000, 4)) { + show += round(bytes / Math.pow(1000, 4), 2); + show += String.fromCharCode(160) + "TB"; + } + else { + if (bytes > Math.pow(1000, 3)) { + show += round(bytes / Math.pow(1000, 3), 2); + show += String.fromCharCode(160) + "GB"; + } + else { + if (bytes > Math.pow(1000, 2)) { + show += round(bytes / Math.pow(1000, 2), 2); + show += String.fromCharCode(160) + "MB"; + } + else { + if (bytes > Math.pow(1000, 1)) { + show += round(bytes / Math.pow(1000, 1), 2); + show += String.fromCharCode(160) + "kB"; + } + else { + show += bytes; + show += String.fromCharCode(160) + "B"; + } + } + } + } + } + break; + default: + if (bytes > Math.pow(1024, 5)) { + show += round(bytes / Math.pow(1024, 5), 2); + show += String.fromCharCode(160) + "PiB"; + } + else { + if (bytes > Math.pow(1024, 4)) { + show += round(bytes / Math.pow(1024, 4), 2); + show += String.fromCharCode(160) + "TiB"; + } + else { + if (bytes > Math.pow(1024, 3)) { + show += round(bytes / Math.pow(1024, 3), 2); + show += String.fromCharCode(160) + "GiB"; + } + else { + if (bytes > Math.pow(1024, 2)) { + show += round(bytes / Math.pow(1024, 2), 2); + show += String.fromCharCode(160) + "MiB"; + } + else { + if (bytes > Math.pow(1024, 1)) { + show += round(bytes / Math.pow(1024, 1), 2); + show += String.fromCharCode(160) + "KiB"; + } + else { + show += bytes; + show += String.fromCharCode(160) + "B"; + } + } + } + } + } + } + return show; +} + +/** + * 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/root/opt/phpsysinfo/js/vendor/README b/root/opt/phpsysinfo/js/vendor/README new file mode 100644 index 0000000..45aea86 --- /dev/null +++ b/root/opt/phpsysinfo/js/vendor/README @@ -0,0 +1,37 @@ +versions, links and simple description of used jquery files +=========================================================== + +bootstrap.min.js +--------- +VERSION : 3.3.5 +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://code.google.com/p/html5shiv-printshiv/ +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 +URL : http://www.kryogenix.org/code/browser/sorttable/ +DESC : Make all your tables sortable +USED : used for the entire bootstrap userinterface diff --git a/root/opt/phpsysinfo/js/vendor/bootstrap.min.js b/root/opt/phpsysinfo/js/vendor/bootstrap.min.js new file mode 100644 index 0000000..133aeec --- /dev/null +++ b/root/opt/phpsysinfo/js/vendor/bootstrap.min.js @@ -0,0 +1,7 @@ +/*! + * Bootstrap v3.3.5 (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)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher")}(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.5",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.5",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.5",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.5",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("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.5",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("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.5",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.5",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.5",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/root/opt/phpsysinfo/js/vendor/console-shim.js b/root/opt/phpsysinfo/js/vendor/console-shim.js new file mode 100644 index 0000000..bd3d135 --- /dev/null +++ b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/js/vendor/html5shiv-printshiv.js b/root/opt/phpsysinfo/js/vendor/html5shiv-printshiv.js new file mode 100644 index 0000000..c2913b5 --- /dev/null +++ b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/js/vendor/sorttable.js b/root/opt/phpsysinfo/js/vendor/sorttable.js new file mode 100644 index 0000000..9b242af --- /dev/null +++ b/root/opt/phpsysinfo/js/vendor/sorttable.js @@ -0,0 +1,503 @@ +/* + SortTable + version 2+2014.12.25_fix + 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) + + 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. +*/ + + +var stIsIE = /*@cc_on!@*/false; + +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; + // kill the timer + if (_timer) clearInterval(_timer); + + 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; i5' : ' ▴'; + sortrevind.innerHTML = ' ▲'; + this.appendChild(sortrevind); + return; + } + if (this.className.search(/\bsorttable_sorted_reverse\b/) != -1) { + // if we're already sorted by this column in reverse, just + // re-reverse the table, which is quicker + sorttable.reverse(this.sorttable_tbody); + this.className = this.className.replace('sorttable_sorted_reverse', + 'sorttable_sorted'); + this.removeChild(document.getElementById('sorttable_sortrevind'+$(this).parent().parent().parent()[0].id)); + sortfwdind = document.createElement('span'); + sortfwdind.id = "sorttable_sortfwdind"+$(this).parent().parent().parent()[0].id; +// sortfwdind.innerHTML = stIsIE ? ' 6' : ' ▾'; + sortfwdind.innerHTML = ' ▼'; + this.appendChild(sortfwdind); + return; + } + + // remove sorttable_sorted classes + theadrow = this.parentNode; + forEach(theadrow.childNodes, function(cell) { + if (cell.nodeType == 1) { // an element + cell.className = cell.className.replace('sorttable_sorted_reverse',''); + cell.className = cell.className.replace('sorttable_sorted',''); + } + }); + sortfwdind = document.getElementById('sorttable_sortfwdind'+$(this).parent().parent().parent()[0].id); + if (sortfwdind) { sortfwdind.parentNode.removeChild(sortfwdind); } + sortrevind = document.getElementById('sorttable_sortrevind'+$(this).parent().parent().parent()[0].id); + if (sortrevind) { sortrevind.parentNode.removeChild(sortrevind); } + + this.className += ' sorttable_sorted'; + sortfwdind = document.createElement('span'); + sortfwdind.id = "sorttable_sortfwdind"+$(this).parent().parent().parent()[0].id; +// sortfwdind.innerHTML = stIsIE ? ' 6;' : ' ▾'; + sortfwdind.innerHTML = ' ▼'; + this.appendChild(sortfwdind); + + // build an array to sort. This is a Schwartzian transform thing, + // i.e., we "decorate" each row with the actual sort key, + // sort based on the sort keys, and then put the rows back in order + // which is a lot faster because you only do getInnerText once per row + row_array = []; + col = this.sorttable_columnindex; + rows = this.sorttable_tbody.rows; + for (var j=0; j 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) + } +}; + +/* ****************************************************************** + Supporting functions: bundled here to avoid depending on a library + ****************************************************************** */ + +// Dean Edwards/Matthias Miller/John Resig + +/* for Mozilla/Opera9 */ +if (document.addEventListener) { + document.addEventListener("DOMContentLoaded", sorttable.init, false); +} + +/* for Internet Explorer */ +/*@cc_on @*/ +/*@if (@_win32) + document.write(" 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. +*/ + + +var stIsIE = /*@cc_on!@*/false; + +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; + // kill the timer + if (_timer) clearInterval(_timer); + + 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; i5' : ' ▴'; + this.appendChild(sortrevind); + return; + } + if (this.className.search(/\bsorttable_sorted_reverse\b/) != -1) { + // if we're already sorted by this column in reverse, just + // re-reverse the table, which is quicker + sorttable.reverse(this.sorttable_tbody); + this.className = this.className.replace('sorttable_sorted_reverse', + 'sorttable_sorted'); + this.removeChild(document.getElementById('sorttable_sortrevind')); + sortfwdind = document.createElement('span'); + sortfwdind.id = "sorttable_sortfwdind"; + sortfwdind.innerHTML = stIsIE ? ' 6' : ' ▾'; + this.appendChild(sortfwdind); + return; + } + + // remove sorttable_sorted classes + theadrow = this.parentNode; + forEach(theadrow.childNodes, function(cell) { + if (cell.nodeType == 1) { // an element + cell.className = cell.className.replace('sorttable_sorted_reverse',''); + cell.className = cell.className.replace('sorttable_sorted',''); + } + }); + sortfwdind = document.getElementById('sorttable_sortfwdind'); + if (sortfwdind) { sortfwdind.parentNode.removeChild(sortfwdind); } + sortrevind = document.getElementById('sorttable_sortrevind'); + if (sortrevind) { sortrevind.parentNode.removeChild(sortrevind); } + + this.className += ' sorttable_sorted'; + sortfwdind = document.createElement('span'); + sortfwdind.id = "sorttable_sortfwdind"; + sortfwdind.innerHTML = stIsIE ? ' 6' : ' ▾'; + this.appendChild(sortfwdind); + + // build an array to sort. This is a Schwartzian transform thing, + // i.e., we "decorate" each row with the actual sort key, + // sort based on the sort keys, and then put the rows back in order + // which is a lot faster because you only do getInnerText once per row + row_array = []; + col = this.sorttable_columnindex; + rows = this.sorttable_tbody.rows; + for (var j=0; j 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) + } +} + +/* ****************************************************************** + Supporting functions: bundled here to avoid depending on a library + ****************************************************************** */ + +// Dean Edwards/Matthias Miller/John Resig + +/* for Mozilla/Opera9 */ +if (document.addEventListener) { + document.addEventListener("DOMContentLoaded", sorttable.init, false); +} + +/* for Internet Explorer */ +/*@cc_on @*/ +/*@if (@_win32) + document.write(" + + + +

    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/root/opt/phpsysinfo/templates/html/index_bootstrap.html b/root/opt/phpsysinfo/templates/html/index_bootstrap.html new file mode 100644 index 0000000..caab853 --- /dev/null +++ b/root/opt/phpsysinfo/templates/html/index_bootstrap.html @@ -0,0 +1,375 @@ + + + + + + + + phpSysInfo + + + + + + + + + + + +
    + +
    +
    +
    +
    System Vitals
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Hostname
    Listening IP
    Kernel Version
    Distro Name
    Uptime
    Last boot
    Current Users
    Load Averages
    System Language
    Code Page
    Processes
    +
    +
    +
    + + +
    +
    +
    Hardware Information
    +
    + +
    +
    +
    +
    +
    + +
    +
    +
    +
    Memory Usage
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TypeUsageFreeUsedSize
    +
    +
    +
    +
    + +
    + +
    + +
    + + + + + + + + + + + + + + + + + + + +
    + + + + + +
    + + + + + + + + + + + + + + + + + + diff --git a/root/opt/phpsysinfo/templates/html/index_dynamic.html b/root/opt/phpsysinfo/templates/html/index_dynamic.html new file mode 100644 index 0000000..b5c7eea --- /dev/null +++ b/root/opt/phpsysinfo/templates/html/index_dynamic.html @@ -0,0 +1,233 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + phpSysInfo <?php echo PSI_VERSION_STRING ?> + + +
    +

    Loading... please wait!

    +
    + +
    +
    + + + + diff --git a/root/opt/phpsysinfo/templates/idash.css b/root/opt/phpsysinfo/templates/idash.css new file mode 100644 index 0000000..ffac6d9 --- /dev/null +++ b/root/opt/phpsysinfo/templates/idash.css @@ -0,0 +1,151 @@ +/* NextGen Remixed by iDash.pl */ +a { + text-decoration: none; + color: #006; +} + +a:hover { + text-decoration: underline; + color: #5A7000; +} + +* { + margin: 0; + padding: 0; +} + +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} diff --git a/root/opt/phpsysinfo/templates/idash/bg.png b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/templates/idash/html.gif b/root/opt/phpsysinfo/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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 { + display: inline; +} + +.treegrid-indent { + width:16px; + height: 16px; + display: inline; + position: relative; +} + +.treegrid-expander { + width:16px; + height: 16px; + display: inline; + position: relative; + cursor: pointer; +} + +.normalicon { + position: relative; + top: 1px; + display: inline-block; + 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"; +} + +table.sortable thead th { + cursor: pointer; + position: relative; + top: 0; + left: 0; +} + +table.sortable thead th:hover { + background: #efefef; +} + +table.borderless td,table.borderless th{ + border: none !important; +} + +.navbar-logo { + cursor: pointer; +} diff --git a/root/opt/phpsysinfo/templates/plugin/jquery.dataTables.css b/root/opt/phpsysinfo/templates/plugin/jquery.dataTables.css new file mode 100644 index 0000000..1b1f16c --- /dev/null +++ b/root/opt/phpsysinfo/templates/plugin/jquery.dataTables.css @@ -0,0 +1,14 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * DataTables sorting + */ +.sorting_asc { + background: url('../../gfx/sort_asc.png') no-repeat center right; +} + +.sorting_desc { + background: url('../../gfx/sort_desc.png') no-repeat center right; +} + +.sorting { + background: url('../../gfx/sort_both.png') no-repeat center right; +} \ No newline at end of file diff --git a/root/opt/phpsysinfo/templates/plugin/jquery.jgrowl.css b/root/opt/phpsysinfo/templates/plugin/jquery.jgrowl.css new file mode 100644 index 0000000..082a044 --- /dev/null +++ b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/templates/plugin/jquery.treeTable.css b/root/opt/phpsysinfo/templates/plugin/jquery.treeTable.css new file mode 100644 index 0000000..4e6e853 --- /dev/null +++ b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/templates/plugin/nyroModal.full.css b/root/opt/phpsysinfo/templates/plugin/nyroModal.full.css new file mode 100644 index 0000000..c747207 --- /dev/null +++ b/root/opt/phpsysinfo/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.png); +} +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.png); +} \ No newline at end of file diff --git a/root/opt/phpsysinfo/templates/two.css b/root/opt/phpsysinfo/templates/two.css new file mode 100644 index 0000000..e506be6 --- /dev/null +++ b/root/opt/phpsysinfo/templates/two.css @@ -0,0 +1,123 @@ +/* + $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; +} + +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; +} diff --git a/root/opt/phpsysinfo/templates/two/gradient.png b/root/opt/phpsysinfo/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:"\2a"}.glyphicon-plus:before{content:"\2b"}.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-yen:before{content:"\00a5"}.glyphicon-ruble: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}.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:hover{color:#286090}.text-success{color:#3c763d}a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}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[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee;opacity:1}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date],input[type=time],input[type=datetime-local],input[type=month]{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{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{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}select.form-group-sm .form-control{height:30px;line-height:30px}select[multiple].form-group-sm .form-control,textarea.form-group-sm .form-control{height:auto}.form-group-sm .form-control-static{height:30px;padding:5px 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}select.form-group-lg .form-control{height:46px;line-height:46px}select[multiple].form-group-lg .form-control,textarea.form-group-lg .form-control{height:auto}.form-group-lg .form-control-static{height:46px;padding:10px 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}.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.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:14.33px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px}}.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{pointer-events:none;cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.active,.btn-default.focus,.btn-default:active,.btn-default:focus,.btn-default:hover,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,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.active,.btn-primary.focus,.btn-primary:active,.btn-primary:focus,.btn-primary:hover,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,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.active,.btn-success.focus,.btn-success:active,.btn-success:focus,.btn-success:hover,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,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.active,.btn-info.focus,.btn-info:active,.btn-info:focus,.btn-info:hover,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,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.active,.btn-warning.focus,.btn-warning:active,.btn-warning:focus,.btn-warning:hover,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,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.active,.btn-danger.focus,.btn-danger:active,.btn-danger:focus,.btn-danger:hover,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,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;visibility:hidden}.collapse.in{display:block;visibility:visible}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 solid;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 solid}.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-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-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-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-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{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;visibility:hidden}.tab-content>.active{display:block;visibility:visible}.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;visibility: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{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:2;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}.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}.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:baseline;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.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:30px 15px;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{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding:48px 0}.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-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{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}.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{color:#3c763d}a.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.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{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.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{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.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{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.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{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-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.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive.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:1040;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:absolute;top:0;right:0;left:0;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{min-height:16.43px;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-weight:400;line-height:1.4;visibility:visible;filter:alpha(opacity=0);opacity:0}.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;text-decoration:none;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-weight:400;line-height:1.42857143;text-align:left;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)}.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:1000;perspective:1000}.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);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}.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;margin-top:-10px;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:-15px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-15px}.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,.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,.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;visibility:hidden!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}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}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}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}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}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}} \ No newline at end of file diff --git a/root/opt/phpsysinfo/tools/MakeRelease.sh b/root/opt/phpsysinfo/tools/MakeRelease.sh new file mode 100755 index 0000000..6cbd4af --- /dev/null +++ b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/tools/README b/root/opt/phpsysinfo/tools/README new file mode 100644 index 0000000..71d6c21 --- /dev/null +++ b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/tools/aptana/js.xml b/root/opt/phpsysinfo/tools/aptana/js.xml new file mode 100644 index 0000000..ca19006 --- /dev/null +++ b/root/opt/phpsysinfo/tools/aptana/js.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/root/opt/phpsysinfo/tools/aptana/php.xml b/root/opt/phpsysinfo/tools/aptana/php.xml new file mode 100644 index 0000000..15fadc4 --- /dev/null +++ b/root/opt/phpsysinfo/tools/aptana/php.xml @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/root/opt/phpsysinfo/tools/check.sh b/root/opt/phpsysinfo/tools/check.sh new file mode 100755 index 0000000..62d32cb --- /dev/null +++ b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/tools/checkdistro.php b/root/opt/phpsysinfo/tools/checkdistro.php new file mode 100644 index 0000000..7bbd033 --- /dev/null +++ b/root/opt/phpsysinfo/tools/checkdistro.php @@ -0,0 +1,208 @@ +"; +echo ""; +echo " "; +echo ""; +if (PHP_OS != 'Linux') { + echo "Test works only on Linux"; + echo ""; + die(); +} + +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 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); + 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, '/')."\-\-\-\-\-\-\-\-\-\-\n/m", $contents)) { + return true; + } + + return false; + } + + public static function gdc() + { + return array(); + } +} + +$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/root/opt/phpsysinfo/tools/distrotest.php b/root/opt/phpsysinfo/tools/distrotest.php new file mode 100644 index 0000000..2b3b891 --- /dev/null +++ b/root/opt/phpsysinfo/tools/distrotest.php @@ -0,0 +1,44 @@ +/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/root/opt/phpsysinfo/tools/lint.bat b/root/opt/phpsysinfo/tools/lint.bat new file mode 100644 index 0000000..b0502ab --- /dev/null +++ b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/xml.php b/root/opt/phpsysinfo/xml.php new file mode 100644 index 0000000..9d8f10b --- /dev/null +++ b/root/opt/phpsysinfo/xml.php @@ -0,0 +1,60 @@ + + * @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 (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())); + } + // check for jsonp with callback name restriction + echo isset($_GET['jsonp']) ? (!preg_match('/[^A-Za-z0-9_\?]/', $_GET['callback'])?$_GET['callback']:'') . '('.$json.')' : $json; + } else { + $output->run(); + } +} diff --git a/smeserver-phpsysinfo.spec b/smeserver-phpsysinfo.spec new file mode 100644 index 0000000..0620465 --- /dev/null +++ b/smeserver-phpsysinfo.spec @@ -0,0 +1,148 @@ +# $Id: smeserver-phpsysinfo.spec,v 1.4 2022/08/01 03:32:28 jpp Exp $ +# Authority: darrellmay +# Name: Darrell May + +Summary: phpSysInfo for SME Server +%define name smeserver-phpsysinfo +Name: %{name} +%define version 3.2.3 +%define release 7 +Version: %{version} +Release: %{release}%{?dist} +License: GPL +Group: SME/addon +Source: %{name}-%{version}.tar.xz + +URL: http://phpsysinfo.sourceforge.net +BuildRoot: /var/tmp/%{name}-%{version}-%{release}-buildroot +BuildArchitectures: noarch +Requires: smeserver-release >= 10.0 +Requires: e-smith-apache >= 2.6.0-19 +Requires: hddtemp lm_sensors +BuildRequires: e-smith-devtools +AutoReqProv: no + +%description +%name is an implementation of phpSysInfo on SME Server. +Access with admin login credentials via https://yourdomain/phpsysinfo + +%changelog +* Sat Sep 07 2024 cvs2git.sh aka Brian Read 3.2.3-7.sme +- Roll up patches and move to git repo [SME: 12338] + +* Sat Sep 07 2024 BogusDateBot +- Eliminated rpmbuild "bogus date" warnings due to inconsistent weekday, + by assuming the date is correct and changing the weekday. + +* Sun Jul 31 2022 Jean-Philippe Pialasse 3.2.3-6.sme +- update to httpd 2.4 access syntax [SME: 12057] + removed compatibnility, added Requires e-smith-apache >= 2.6.0-19 + +* Sun Jul 24 2022 Jean-Philippe Pialasse 3.2.3-5.sme +- update to httpd 2.4 access syntax [SME: 12057] + +* Wed Apr 07 2021 Brian Read 3.2.3-4.sme +- Add Update event to createlinks [SME: 11054] + +* Wed Apr 07 2021 BogusDateBot +- Eliminated rpmbuild "bogus date" warnings due to inconsistent weekday, + by assuming the date is correct and changing the weekday. + Thu May 30 2001 --> Thu May 24 2001 or Wed May 30 2001 or Thu May 31 2001 or .... + Wed Sep 22 2015 --> Wed Sep 16 2015 or Tue Sep 22 2015 or Wed Sep 23 2015 or .... + +* Sun Jan 20 2019 Jean-Philipe Pialasse 3.2.3-3.sme +- Add Update event to createlinks process formating [SME: 10329] + +* Tue Sep 22 2015 stephane de Labrusse 3.2.3-1.sme + Wed Sep 22 2015 --> Wed Sep 16 2015 or Tue Sep 22 2015 or Wed Sep 23 2015 or .... +- Upgrade to upstream 3.2.3 +- Require hddtemp lm_sensors + +* Sat Jun 21 2014 stephane de Labrusse 3.1.13-1.sme +- Initial release to sme9 +- upgrade of phpsysinfo to 3.1.13 https://github.com/phpsysinfo/phpsysinfo/releases/tag/v3.1.13 +- added a menu in the administration panel of server-manager + +* Mon Apr 21 2008 Shad L. Lords +- Prep for import into buildsys +- Clean up spec + +* Fri Oct 19 2007 Darrell May +- accounts and configuration db phpsysinfo defaults added +- default access restricted to private (private|public) +- phpsysinfo-2.5.4 +- [2.5.4-0dmay] +* Mon Apr 09 2007 Darrell May +- [2.5.3-1dmay] +* Sun Apr 01 2007 Darrell May +- phpsysinfo-2.5.3 +- [2.5.3-0dmay] +* Tue Jan 02 2007 Darrell May +- phpsysinfo-2.5.2 +- [2.5.2-0] +* Fri Aug 04 2006 Darrell May +- phpsysinfo-2.5.2-rc3 +- [2.5.2-rc3] +* Wed Dec 14 2005 Darrell May +- phpsysinfo-2.5 +- [2.5-0] +* Fri Apr 22 2005 Darrell May +- added support for SME Server 7.x +- [2.3-2] +* Mon Nov 15 2004 Darrell May +- updated to release 2.3 +- renamed smeserver-phpsysinfo +- updated includes/os/class.Linux.inc.php to recognize SME Server +- [2.3-1] +* Sat Jun 29 2002 Darrell May +- updated to release 2.1 +- [2.1-1] +* Sun Mar 10 2002 Darrell May +- updated to release 2.0 +- [2.0-1] +* Sun Mar 10 2002 Darrell May +- changed rights/ownership to tighten security +- [1.9-2] +* Tue Mar 05 2002 Darrell May +- changed %post/postun to graceful +- [1.9-1] +* Mon Jan 21 2002 Darrell May +- updated to version 1.9 +- [1.9-0] +* Wed Oct 31 2001 Darrell May +- updated to version 1.8 +- [1.8-0] +* Sun Sep 23 2001 Darrell May +- name change +* Wed May 30 2001 Darrell May + Thu May 30 2001 --> Thu May 24 2001 or Wed May 30 2001 or Thu May 31 2001 or .... +- 2.1.0-1 +- Original version + +%prep +%setup + +%build +perl createlinks + + +%install +/bin/rm -rf $RPM_BUILD_ROOT +(cd root ; /usr/bin/find . -depth -print | /bin/cpio -dump $RPM_BUILD_ROOT) +/bin/rm -f %{name}-%{version}-filelist +/sbin/e-smith/genfilelist $RPM_BUILD_ROOT > %{name}-%{version}-filelist + +%clean +/bin/rm -rf $RPM_BUILD_ROOT + +%files -f %{name}-%{version}-filelist +%defattr(-,root,root) + +%pre +if [[ -f /opt/phpsysinfo/phpsysinfo.ini ]]; then + /bin/cp /opt/phpsysinfo/phpsysinfo.ini /opt/phpsysinfo/phpsysinfo.ini-$(date +"%H:%M-%b-%d-%Y") +fi +%post +if ! [[ -f /opt/phpsysinfo/phpsysinfo.ini ]]; then + cp /opt/phpsysinfo/phpsysinfo.ini.new /opt/phpsysinfo/phpsysinfo.ini +fi

    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/root/opt/phpsysinfo/gfx/images/QNX.png b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/gfx/images/Qubes.png b/root/opt/phpsysinfo/gfx/images/Qubes.png new file mode 100644 index 0000000000000000000000000000000000000000..96d568aa76f272ada39fc79a18a42bfc2137f157 GIT binary patch literal 979 zcmV;^11$WBP)Px#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/root/opt/phpsysinfo/gfx/images/ROSA.png b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/gfx/images/Raspbian.png b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/gfx/images/RedFlag.png b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/gfx/images/RedHat.png b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/gfx/images/Rubix.png b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/gfx/images/SMEServer.png b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/gfx/images/Sabayon.png b/root/opt/phpsysinfo/gfx/images/Sabayon.png new file mode 100644 index 0000000000000000000000000000000000000000..8213c2b35868764bfe0257b637027e4cbef56302 GIT binary patch literal 3211 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 literal 0 HcmV?d00001 diff --git a/root/opt/phpsysinfo/gfx/images/Semplice.png b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/gfx/images/Slackware.png b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/gfx/images/Slax.png b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/gfx/images/SliTaz.png b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/gfx/images/SolusOS.png b/root/opt/phpsysinfo/gfx/images/SolusOS.png new file mode 100644 index 0000000000000000000000000000000000000000..522d160580039c6c49ad6fd013b8da6da805dce7 GIT binary patch literal 4217 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 Iv~54*FKa{${{R30 literal 0 HcmV?d00001 diff --git a/root/opt/phpsysinfo/gfx/images/StartOS.png b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/gfx/images/SteamOS.png b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/gfx/images/SunOS.png b/root/opt/phpsysinfo/gfx/images/SunOS.png new file mode 100644 index 0000000000000000000000000000000000000000..e7de00fb1053e642563ed57082f7f32d4ff7cf5f GIT binary patch literal 2754 zcmV;z3O)6SP)3^BvK_j~)Cn^e21@2%G#4)>CK?>XQ8_TJy#TLB3QK%(WR<)h{0S4m?3 zi*%)D^o}Ibdu*|Ldf)xt1+&Eji`9y~{R8-Xl0u;8enC`-^u5UU5fp-7{zg6ne_MeY ziN7p^2p%jd1c5dX{0dQ||3w)HTZiuV=+gC}pzskinn5%)XtBI(g~uy|FmQt844ams4k3ULVk(*tMww4i8RkaWs zYw(L+g~$Og14J48e+S?RSRbG`K(iM#}O0w(zbb27n_Nv)moH2Zh(1Z9gIb0 zTri+N=>ircAA*qRCTn@5^Jo_-+MQ_YXhTYhk~Z$dxzG%v{RT=(w6JbC@!Dj;^6DC< zW)^WP@jl|B3Q$?D#gno|SXS2|XO=JEQYjDtVAyFkzfSr>+~8wJj{X*hTbjd5DctLj6R8T;(G; z9Q%+nLf(@dE^&6{-#9WB?eYVGQ_iB;<#wW5*F$v2piD&pckV92&ZeWaWfrSe7uq|= zpdwIf_FW8*%|hEf2D5bsOUv6xxKWJwxIA))2HDvUuwq&R%LvA--xp*;W+9Mb^n)Pr zv=IcK!r|OTQ*#4iV-r!X>PC22I(|NtjKP6b%+A`N>lwqF3YFK@+z2Wl)Wn&J0RKnovIoSjQb<)bC=2Lgd$(caM1fEx+7 zp?chm@bekCdYSzCWCV3}gIFWK&p%&*zIO!6E1PI*A0iMMESuLcH2f0H&BLg!?t!|> zfHPE!cNEG#&P?mcL(rE6Z`~Rz60@Utz_(k5*!4#%RIdpcVf<7Kw!T98{@0aOciF zEH0XOOfXlF)qe816YA;)T)7(0Mds4wRK7+=O<1vPk?zxG(@U_Jop?l6MPJKC&C?!O zEPJrow(;tf1;s@b&}v30_4d%wF-)wzg5B;yZLNXyp$KO}?;i#0!u496zv8~O)tP~ev29snJ&#ZW{oCvc8roP zv_sP|MLFMzp@BJK#X$_|Fflm?t91{J4SfV^3@@Hj^{&mQAZr z%)gjId_n@HS|ds7J$(0V44&2wz`E{2k6{wylS^1x-KM~5CMljE|2wg?WWl=a5X!7- zeD`%U@|DfRjvJ$+&*^X@Htd^dZ|^~mev&{P5C9w2);)OeupM80brHX({(<7+N;EXK zK`~{Vz%QrIkzX4SfBim=(uPl~DcT8uZG-&3Vn=<04ugg{tWea~H?-mT3v!Lgfz-QY zxE!8=lA>0aO-{Te%1x$C(h37~`l~@TcV?qNk`OB z?Ck6zG4U>r9{mXqA2yMQl;9$5TBSCix6g=*s%GeWCh_v6oqRh0qj3qQH`{nx)rF=; z176H;pu20FHtj*L-iT^-H?$;DE9AcZ{xM=@8mpFV>KXcQH6od;?%_2hGBO^f6$`ik zt&(QP#3bR%FOTwKay=#=KZL|0^mHP6duOrm%1*KHjNGw^RZ2BwmKw@?WmNySxF4<7 zP3XGE3HWVPSL!JcchTQBhmqk$Vqq7}O?uoQ-&d*I5qADE#aj$z)Vv&otX?w^X0r{^ z(Q)|VizCR*Ek#UJE{=T@hd#Xt-Q6=7pIU%@(?jCaiIn6=$jf~~2X9k=&fwXzaf)~+ z^tuUp-io2Y1zPji-hPjcwlPFpN#$7+8u}{<(@oNdCF-8MAv_H^08!#K!Q*iwD~qb# zH{VeqDMwU90ZxUGRq6qvai42{ZCx+y8!ogo_fw!5V1K(uWqAfeLlanE-z6~fP?a`w zfzosiAx?aM8rhjD#6}k5 z0;yqIsu~@dVGKT-!_3SZ%6|tM8+Ftt4Db{k9h<@M@H90eJLu{fq*kqpSH^NxJL$kJ zWMpIzV^p5WV5YuI`kCPY>-|)E82~EBbicFBKosHl@sr5SsYJ}RLW+q*bZW<`?Cw)= zO^`6X!J5rU+OLOJJ3ykeiHY%-vYl7pXriO1x$306`-UH1r#Gt1ofO^w}@2_x9w zb)%M2_)>T}6)!E$hhIT+XG^XHl9&5m47A;>hhr5|?ga(KgNF}r z?05(YipmgqEeAjSn8ed1DXe$>6PD`P@X_`29^hQFY@NuM$`WO z9@U9b96J_*!oo@tkzAY)OF@182<5XK>dIdHb~O`qH3nRd`<>Fb09#vcAyY2NL(QK9 zko1=`KY4htVf+|`!{MOeql!SBLSB9~wd5H%@k2a*Je5H0+D+8fXz4eq3;8A3+S~>B zw~S3cXY_xJW}jZ{;2<09%3Mu(`EGqnVG-lX8R08s3j4 zuYbZo5J0erWZAO2&l;FIT#1N8YFZWrXCaknGrV4rA1aE};!70i!SPJOKLZf#-=#kX z*1$l)CuA39<|e?(`PdBbUELoht_cz2j$DN}ib9AOVmX94cM&KBM zeFzBY|8C3dA`Y3A;}gJ%sW@D9JWJ(z7r?WY`+Cq+L9(e9*l&DlLpsc zIagadOeYLl>3Ig-f{*Vo7=8xpzCh~AF#Z62xp0`qRksh%_U59oUi#=J`Y zBCIJAH486N=ZE1uf#(Evpr4N3;iLF6JdY?R41z{e+VuxYl>M56Dw4v_oaw0@f)`w* z@D(bX6^UL_0oe9D#IdBFKzy zQqPwNLk(&L4ih3zol;fCxy3CWzCne*a=occ(jYwll7z*JKy#U5RYrD#5&0rxd3MXw zjAjF^V3m7(>1hzXcbwbc`EBaaRGA)FIY(V7{QOVOH6FM|_eYmkiJ7Ix9j07Z6f=S|mTVD~AjN#Y0l%ocLz!(LeAM5w`5()OFzTtzC{CXCc4FhTTD$t|M;D@9z8;^S?VV z7~a=}Fn_!aqX)b*_C@@pPIPPFNfjOR{9oJWpn48`?%0821dbem3oF-e&VBU#hg!um NS7xU^x%}=2e*n(g#~lCw literal 0 HcmV?d00001 diff --git a/root/opt/phpsysinfo/gfx/images/Tails.png b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/gfx/images/TinyCore.png b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/gfx/images/Trisquel.png b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/gfx/images/Trustix.png b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/gfx/images/Turbo.png b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/gfx/images/Ubuntu.png b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/gfx/images/UltimateEdition.png b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/gfx/images/Vector.png b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/gfx/images/Win2000.png b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/gfx/images/Win8.png b/root/opt/phpsysinfo/gfx/images/Win8.png new file mode 100644 index 0000000000000000000000000000000000000000..96f0ae100c5121340c25376211bda68920ab5c88 GIT binary patch literal 903 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 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/root/opt/phpsysinfo/gfx/images/Zorin.png b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/gfx/images/elementaryOS.png b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/gfx/images/free-eos.png b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/gfx/images/iycc.png b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/gfx/images/unknown.png b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/gfx/logo_48.png b/root/opt/phpsysinfo/gfx/logo_48.png new file mode 100644 index 0000000000000000000000000000000000000000..2157475bd6154053ef5ef9a1e2c207e147a9efdd GIT binary patch literal 1819 zcmV+$2juvPP)vxSE)3VtjBDUiQ(4ed$9>*<@d63}^yLtub`TrqwKwcBn)o zR)>EJ48zR*clH6e!|Bn^Q%d=Z&8h(SEzA0o5aNk0g!tHToMIE&5-iL5vu;_|!D18H zDh$JjX@Dp;k*&gU9HGCczYl;?ikAY438fUeVHoJTUTiK~hMrERm9Fb}y!AUdT{NVcWLLZ3!Dr@zPfT@`P+fjM8;fCnM{W1>1l?BhPZR*4mWPxAel^V zC`N@sWSg3>s;hAV0a)}^N}h})7Xg7)P&MB z)CS|}4<8cj=y1!aPd^2v2!8u5!ZZOeVln35f1ltt-=P2gJHYh1zfdZbBAHB*&1Nx8 zlhV>s%FD|Mg+eaDmX;P88yh)&`ZRa%-p%W8*4C1F_uZTz!$AM-H{{F=N=lqi2&b$J zyP^U#4bQ!MuCEgeV(;EfptI8@58(ajC$jN4_Wu1#0@hyxot>Rrym)a{eQj+mCr+H; z%$YNIJRZW~Fjuc$<>=9)q*AE`Cru;$!3Vk7{qY}YDU_B%f3EJA)ICt(G<|3g;B*Mv)Cv&92VU*9e@IuohaP8Wfs~ zIedM6U>Lc&i3x;ZVAa&*`8qpyVpmikpFG*RfF<2( z0vZ|`TzhO8X>EEMnM}In%zN)KfBZPkjvZTjk*1;6IiGD=Kut{zM~)nE%eQae&NV7U z;Jfeg7OwHe8>Bw}oODYIRwPo;yUbT#CEL`rW?R7mbY180;ls4Iw-XL8Tq9+(Svr;l zApmV^is08@BNz8;0HtY|_4Ul1I>p?nQiab41aew z+T`ShLJAU4S64?}UELpce*E|`mo8nRySsaRC&$4vFo0)Z0K2jhERW!u#kS(W z(}2EglI&f(3hrNY0m|!jZ80}jaQ|nLwJRx6q0oj~qw@PPUw=JEW?A%J4s-v0tXE!H zv+bD(uwHwO^oJj!KX`!m-aX{#C}MVYAqUnpoL~^EriSd>Z{w7e0Sm`&Pa?7Ac%J+B z@r;ZVwurX_^S}WR0;{Gb?@TXD6Q%2`qpwofTZB#G_u#is!+KRm5nF!Dm ziG}22#iCRm&uZU?5ApT&p+9)As!dKzV7&Df+TInr6x!@8^3kKb>}nh86Y#u31p>$Vj=4r~`M1r!@E1r!?^Y-g!osnS!@IUlob^f|Fvy<28aQHVl&z##)S}n4Fm%J_&>u$tqKO6D$D=?002ov JPDHLkV1g)AWeflS literal 0 HcmV?d00001 diff --git a/root/opt/phpsysinfo/gfx/next.png b/root/opt/phpsysinfo/gfx/next.png new file mode 100644 index 0000000000000000000000000000000000000000..53a34751539e0861d217c648481b6ae428958fc0 GIT binary patch literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^{6H+u0VEhcT6iS@DW;MjzhDN2vdL#HfV?D67sn8Z z%gG50O+_pYPaA(c{qghZkq^^zoF~UuR|~EB<#~VG!dLHWigpVh-P3ma{OcKg zO{qI9ynuS5u1>e= zexELE?theT`}w__KVL4K`2BgF%)3BYq4(*RXQ*%8_2jafVg97Q_WJK6neMX)hg@5% UC3`P92WTUMr>mdKI;Vst0MtT2-T(jq literal 0 HcmV?d00001 diff --git a/root/opt/phpsysinfo/gfx/reload.png b/root/opt/phpsysinfo/gfx/reload.png new file mode 100644 index 0000000000000000000000000000000000000000..0de26566d4102eec080253c2d08985ec58b14838 GIT binary patch literal 685 zcmV;e0#f~nP)`!iy8(2_#ButL^3%VaH2WCpD^U)OZxp@C)2#hU)y+@T%ZNzJigNk%37 zz-WYJwT%teVfiEI+B*@v4ey@58(ld4VY_&5-ox`e@AKg+0U-I`y79bmuw_~y6+4rZ zBG5EdFDS+@M0OSE`>d7SUDOzKZ&h*4eB1iX7tOd9RiYtW2mQ--bUahxr1`i{RG@dM zL#}_X=DDO1{;UI$pFu=dLYT_=5d8WC-sLfjr7UO-HKMAwa=!>)kEhvuwre zuW3yF@ZxFCkI*+ad|5kOX%5zu8IQjhan)UqgSrFGA_0nQFn@Z08DSEUToCSz4Z1ls z&fDbq$T&7|6iq$_uDI$@q1_kQ@dfqk*0>{SDL6V)94@)ete)j++*>bIc9sj}Y;R1o z#OpH+Yt-^4wfv{nern^iVag8&?@87=<9z3{r@809bkMG>M^Z)<<$qS#q2WsIh z3GxdDa^Zl%_JvX#P$JRO#W95Ada?yGGrPnAm8O%S%;{Oj56n28mfvRB|Lz_~a@6~K zZ<$lQ-ru{+kSKR^Z}oSz8Jq>$e2lK!9cHlaDt|w%QR~CKy|>v;+3cv+K6B^r?&SyX k3an*L5Br!zopr02k|Y^Z)<= literal 0 HcmV?d00001 diff --git a/root/opt/phpsysinfo/gfx/sort_desc.png b/root/opt/phpsysinfo/gfx/sort_desc.png new file mode 100644 index 0000000000000000000000000000000000000000..b768c6fd2b886b4c8739f62e75dc8d5b40aa3ad7 GIT binary patch literal 215 zcmeAS@N?(olHy`uVBq!ia0vp^!XV7T3?v)swEqJsmUKs7M+S!VC(K#9UIO{L0X`wF zfByV``TGCv{r`HW{JVDZ|ME5ePM-Py{rmsVU;h98{eR+&f3p_+Te9k3&*Xpq|NozG zCwwYu;P_{+Ofa zk9&J{*i-HHR&y?UyYMa74$fVb1!=tUbAAfl#A3YPdm*FGG{2wO;{)Lal!v;5e5cp09-R6H2?qr literal 0 HcmV?d00001 diff --git a/root/opt/phpsysinfo/gfx/treeTable/tv-expandable-last.gif b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/gfx/treeTable/tv-item-last.gif b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/gfx/treeTable/tv-item.gif b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/gfx/treeTable/vertline.gif b/root/opt/phpsysinfo/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 = 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 = Error::singleton(); + $error->addPhpError("errorHandlerPsi : ", "Level : ".$level." Message : ".$message." File : ".$file." Line : ".$line); +} + +set_error_handler('errorHandlerPsi'); diff --git a/root/opt/phpsysinfo/includes/class.CommonFunctions.inc.php b/root/opt/phpsysinfo/includes/class.CommonFunctions.inc.php new file mode 100644 index 0000000..d7885c0 --- /dev/null +++ b/root/opt/phpsysinfo/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; + } + } + } else if (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 = 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 = 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 = 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); + } else if (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 = 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/root/opt/phpsysinfo/includes/class.Parser.inc.php b/root/opt/phpsysinfo/includes/class.Parser.inc.php new file mode 100644 index 0000000..f137e4a --- /dev/null +++ b/root/opt/phpsysinfo/includes/class.Parser.inc.php @@ -0,0 +1,216 @@ + + * @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)) { + $mount_parm[$mount_buf[2]]['fstype'] = $mount_buf[3]; + $mount_parm[$mount_buf[2]]['name'] = $mount_buf[1]; + if (PSI_SHOW_MOUNT_OPTION) $mount_parm[$mount_buf[2]]['options'] = $mount_buf[4]; + } elseif (preg_match("/(\S+) is (.*) mounted on (\S+) \(type (.*)\)/", $mount_line, $mount_buf)) { + $mount_parm[$mount_buf[3]]['fstype'] = $mount_buf[4]; + $mount_parm[$mount_buf[3]]['name'] = $mount_buf[1]; + if (PSI_SHOW_MOUNT_OPTION) $mount_parm[$mount_buf[3]]['options'] = $mount_buf[2]; + } elseif (preg_match("/(\S+) (.*) on (\S+) \((.*)\)/", $mount_line, $mount_buf)) { + $mount_parm[$mount_buf[3]]['fstype'] = $mount_buf[2]; + $mount_parm[$mount_buf[3]]['name'] = $mount_buf[1]; + if (PSI_SHOW_MOUNT_OPTION) $mount_parm[$mount_buf[3]]['options'] = $mount_buf[4]; + } elseif (preg_match("/(\S+) on ([\S ]+) \((\S+)(,\s(.*))?\)/", $mount_line, $mount_buf)) { + $mount_parm[$mount_buf[2]]['fstype'] = $mount_buf[3]; + $mount_parm[$mount_buf[2]]['name'] = $mount_buf[1]; + if (PSI_SHOW_MOUNT_OPTION) $mount_parm[$mount_buf[2]]['options'] = isset($mount_buf[5]) ? $mount_buf[5] : ''; + } + } + } 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)) { + $mount_point = preg_replace("/\\\\040/i", ' ', $mount_buf[2]); //space as \040 + $mount_parm[$mount_point]['fstype'] = $mount_buf[3]; + $mount_parm[$mount_point]['name'] = $mount_buf[1]; + if (PSI_SHOW_MOUNT_OPTION) $mount_parm[$mount_point]['options'] = $mount_buf[4]; + } + } + } + if (CommonFunctions::executeProgram('df', '-k '.$df_param, $df, PSI_DEBUG)) { + $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]); + + if (isset($mount_parm[$df_buf[5]])) { + $dev->setFsType($mount_parm[$df_buf[5]]['fstype']); + if (PSI_SHOW_MOUNT_OPTION) { + if (PSI_SHOW_MOUNT_CREDENTIALS) { + $dev->setOptions($mount_parm[$df_buf[5]]['options']); + } else { + $mpo=$mount_parm[$df_buf[5]]['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); + } + } + } + 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_point=>$mount_param) { + $total = disk_total_space($mount_point); + 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_point); + + $dev->setTotal($total); + $free = disk_free_space($mount_point); + 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/root/opt/phpsysinfo/includes/error/class.Error.inc.php b/root/opt/phpsysinfo/includes/error/class.Error.inc.php new file mode 100644 index 0000000..684678f --- /dev/null +++ b/root/opt/phpsysinfo/includes/error/class.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 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/root/opt/phpsysinfo/includes/interface/class.PSI_Interface_OS.inc.php b/root/opt/phpsysinfo/includes/interface/class.PSI_Interface_OS.inc.php new file mode 100644 index 0000000..7fca97d --- /dev/null +++ b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/includes/interface/class.PSI_Interface_Output.inc.php b/root/opt/phpsysinfo/includes/interface/class.PSI_Interface_Output.inc.php new file mode 100644 index 0000000..7582403 --- /dev/null +++ b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/includes/interface/class.PSI_Interface_Plugin.inc.php b/root/opt/phpsysinfo/includes/interface/class.PSI_Interface_Plugin.inc.php new file mode 100644 index 0000000..138169c --- /dev/null +++ b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/includes/interface/class.PSI_Interface_Sensor.inc.php b/root/opt/phpsysinfo/includes/interface/class.PSI_Interface_Sensor.inc.php new file mode 100644 index 0000000..3113d37 --- /dev/null +++ b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/includes/interface/class.PSI_Interface_UPS.inc.php b/root/opt/phpsysinfo/includes/interface/class.PSI_Interface_UPS.inc.php new file mode 100644 index 0000000..73dd1f5 --- /dev/null +++ b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/includes/js/README b/root/opt/phpsysinfo/includes/js/README new file mode 100644 index 0000000..d01efd4 --- /dev/null +++ b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/includes/js/class.JavaScriptPacker.inc.php b/root/opt/phpsysinfo/includes/js/class.JavaScriptPacker.inc.php new file mode 100644 index 0000000..48e3ccd --- /dev/null +++ b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/includes/mb/class.coretemp.inc.php b/root/opt/phpsysinfo/includes/mb/class.coretemp.inc.php new file mode 100644 index 0000000..33af328 --- /dev/null +++ b/root/opt/phpsysinfo/includes/mb/class.coretemp.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.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() + { + $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/root/opt/phpsysinfo/includes/mb/class.freeipmi.inc.php b/root/opt/phpsysinfo/includes/mb/class.freeipmi.inc.php new file mode 100644 index 0000000..753e3d6 --- /dev/null +++ b/root/opt/phpsysinfo/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 tcp or file access + */ + public function __construct() + { + parent::__construct(); + switch (strtolower(PSI_SENSOR_ACCESS)) { + case 'command': + CommonFunctions::executeProgram('ipmi-sensors', '--output-sensor-thresholds', $lines); + $this->_lines = preg_split("/\n/", $lines, -1, PREG_SPLIT_NO_EMPTY); + break; + case 'file': + 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_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/root/opt/phpsysinfo/includes/mb/class.hddtemp.inc.php b/root/opt/phpsysinfo/includes/mb/class.hddtemp.inc.php new file mode 100644 index 0000000..7b8add4 --- /dev/null +++ b/root/opt/phpsysinfo/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 (strtolower(PSI_HDD_TEMP)) { + 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/root/opt/phpsysinfo/includes/mb/class.healthd.inc.php b/root/opt/phpsysinfo/includes/mb/class.healthd.inc.php new file mode 100644 index 0000000..dce6759 --- /dev/null +++ b/root/opt/phpsysinfo/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 tcp or file access + */ + public function __construct() + { + parent::__construct(); + switch (strtolower(PSI_SENSOR_ACCESS)) { + case 'command': + $lines = ""; + CommonFunctions::executeProgram('healthdc', '-t', $lines); + $this->_lines = preg_split("/\n/", $lines, -1, PREG_SPLIT_NO_EMPTY); + break; + case 'file': + 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_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/root/opt/phpsysinfo/includes/mb/class.hwsensors.inc.php b/root/opt/phpsysinfo/includes/mb/class.hwsensors.inc.php new file mode 100644 index 0000000..948fba6 --- /dev/null +++ b/root/opt/phpsysinfo/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 tcp or file access + */ + 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/root/opt/phpsysinfo/includes/mb/class.ipmi.inc.php b/root/opt/phpsysinfo/includes/mb/class.ipmi.inc.php new file mode 100644 index 0000000..1d16bde --- /dev/null +++ b/root/opt/phpsysinfo/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 tcp or file access + */ + public function __construct() + { + parent::__construct(); + switch (strtolower(PSI_SENSOR_ACCESS)) { + case 'command': + CommonFunctions::executeProgram('ipmitool', 'sensor', $lines); + $this->_lines = preg_split("/\n/", $lines, -1, PREG_SPLIT_NO_EMPTY); + break; + case 'file': + 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_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/root/opt/phpsysinfo/includes/mb/class.ipmiutil.inc.php b/root/opt/phpsysinfo/includes/mb/class.ipmiutil.inc.php new file mode 100644 index 0000000..68613c3 --- /dev/null +++ b/root/opt/phpsysinfo/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 tcp or file access + */ + public function __construct() + { + parent::__construct(); + switch (strtolower(PSI_SENSOR_ACCESS)) { + case 'command': + CommonFunctions::executeProgram('ipmiutil', 'sensor -stw', $lines); + $this->_lines = preg_split("/\r?\n/", $lines, -1, PREG_SPLIT_NO_EMPTY); + break; + case 'file': + 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_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/root/opt/phpsysinfo/includes/mb/class.k8temp.inc.php b/root/opt/phpsysinfo/includes/mb/class.k8temp.inc.php new file mode 100644 index 0000000..9383353 --- /dev/null +++ b/root/opt/phpsysinfo/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 (strtolower(PSI_SENSOR_ACCESS)) { + case 'command': + $lines = ""; + CommonFunctions::executeProgram('k8temp', '', $lines); + $this->_lines = preg_split("/\n/", $lines, -1, PREG_SPLIT_NO_EMPTY); + break; + case 'file': + 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_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/root/opt/phpsysinfo/includes/mb/class.lmsensors.inc.php b/root/opt/phpsysinfo/includes/mb/class.lmsensors.inc.php new file mode 100644 index 0000000..e883c1e --- /dev/null +++ b/root/opt/phpsysinfo/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 tcp or file access + */ + public function __construct() + { + parent::__construct(); + switch (strtolower(PSI_SENSOR_ACCESS)) { + 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 'file': + 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_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/root/opt/phpsysinfo/includes/mb/class.mbm5.inc.php b/root/opt/phpsysinfo/includes/mb/class.mbm5.inc.php new file mode 100644 index 0000000..bd22b40 --- /dev/null +++ b/root/opt/phpsysinfo/includes/mb/class.mbm5.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.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(); + switch (strtolower(PSI_SENSOR_ACCESS)) { + case 'file': + $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); + break; + default: + $this->error->addConfigError('__construct()', 'PSI_SENSOR_ACCESS'); + break; + } + } + + /** + * 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/root/opt/phpsysinfo/includes/mb/class.mbmon.inc.php b/root/opt/phpsysinfo/includes/mb/class.mbmon.inc.php new file mode 100644 index 0000000..351b0a8 --- /dev/null +++ b/root/opt/phpsysinfo/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 or file access + */ + public function __construct() + { + parent::__construct(); + switch (strtolower(PSI_SENSOR_ACCESS)) { + 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 'file': + 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_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/root/opt/phpsysinfo/includes/mb/class.ohm.inc.php b/root/opt/phpsysinfo/includes/mb/class.ohm.inc.php new file mode 100644 index 0000000..baed9bb --- /dev/null +++ b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/includes/mb/class.pitemp.inc.php b/root/opt/phpsysinfo/includes/mb/class.pitemp.inc.php new file mode 100644 index 0000000..1455ad5 --- /dev/null +++ b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/includes/mb/class.sensors.inc.php b/root/opt/phpsysinfo/includes/mb/class.sensors.inc.php new file mode 100644 index 0000000..a37385b --- /dev/null +++ b/root/opt/phpsysinfo/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 = 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/root/opt/phpsysinfo/includes/mb/class.thermalzone.inc.php b/root/opt/phpsysinfo/includes/mb/class.thermalzone.inc.php new file mode 100644 index 0000000..6abd7c1 --- /dev/null +++ b/root/opt/phpsysinfo/includes/mb/class.thermalzone.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.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 { + 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); + } + + $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); + } + + $this->mbinfo->setMbTemp($dev); + } + } + } + } + } + + /** + * get the information + * + * @see PSI_Interface_Sensor::build() + * + * @return Void + */ + public function build() + { + $this->_temperature(); + } +} diff --git a/root/opt/phpsysinfo/includes/os/class.AIX.inc.php b/root/opt/phpsysinfo/includes/os/class.AIX.inc.php new file mode 100644 index 0000000..61ce603 --- /dev/null +++ b/root/opt/phpsysinfo/includes/os/class.AIX.inc.php @@ -0,0 +1,381 @@ + + * @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')); + + } + + /** + * IP of the Virtual Host Name + * @return void + */ + private function _ip() + { + if (PSI_USE_VHOST === true) { + $this->sys->setIp(gethostbyname($this->sys->getHostname())); + } else { + if (!($result = getenv('SERVER_ADDR'))) { + $this->sys->setIp(gethostbyname($this->sys->getHostname())); + } else { + $this->sys->setIp($result); + } + } + } + + /** + * 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); + } + } + } + + /** + * Number of Users + * @return void + */ + private function _users() + { + if (CommonFunctions::executeProgram('who', '| wc -l', $buf, PSI_DEBUG)) { + $this->sys->setUsers($buf); + } + } + + /** + * 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->_ip(); + $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/root/opt/phpsysinfo/includes/os/class.Android.inc.php b/root/opt/phpsysinfo/includes/os/class.Android.inc.php new file mode 100644 index 0000000..04c88e4 --- /dev/null +++ b/root/opt/phpsysinfo/includes/os/class.Android.inc.php @@ -0,0 +1,254 @@ + + * @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 + */ + private 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 + */ + private 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->_ip(); + $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/root/opt/phpsysinfo/includes/os/class.BSDCommon.inc.php b/root/opt/phpsysinfo/includes/os/class.BSDCommon.inc.php new file mode 100644 index 0000000..50bc2cf --- /dev/null +++ b/root/opt/phpsysinfo/includes/os/class.BSDCommon.inc.php @@ -0,0 +1,592 @@ + + * @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); + } + } + } + + /** + * IP of the Canonical Host Name + * + * @return void + */ + protected function ip() + { + if (PSI_USE_VHOST === true) { + $this->sys->setIp(gethostbyname($this->sys->getHostname())); + } else { + if (!($result = getenv('SERVER_ADDR'))) { + $this->sys->setIp(gethostbyname($this->sys->getHostname())); + } else { + $this->sys->setIp($result); + } + } + } + + /** + * Kernel Version + * + * @return void + */ + protected function kernel() + { + $s = $this->grabkey('kern.version'); + $a = preg_split('/:/', $s); + $this->sys->setKernel($a[0].$a[1].':'.$a[2]); + } + + /** + * Number of Users + * + * @return void + */ + protected function users() + { + if (CommonFunctions::executeProgram('who', '| wc -l', $buf, PSI_DEBUG)) { + $this->sys->setUsers($buf); + } + } + + /** + * 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(); + $dev->setModel($this->grabkey('hw.model')); + $notwas = true; + foreach ($this->readdmesg() as $line) { + if ($notwas) { + if (preg_match("/".$this->_CPURegExp1."/", $line, $ar_buf)) { + $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 (!is_array($results = Parser::lspci(false)) || !is_array($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->users(); + $this->loadavg(); + $this->hostname(); + $this->ip(); + $this->scsi(); + $this->usb(); + } +} diff --git a/root/opt/phpsysinfo/includes/os/class.Darwin.inc.php b/root/opt/phpsysinfo/includes/os/class.Darwin.inc.php new file mode 100644 index 0000000..1ee9dd8 --- /dev/null +++ b/root/opt/phpsysinfo/includes/os/class.Darwin.inc.php @@ -0,0 +1,464 @@ + + * @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('/:/', '-', $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)) + && !preg_match('/^fe80::/i', $ar_buf2[1])) + $dev->setInfo(($dev->getInfo()?$dev->getInfo().';':'').$ar_buf2[1]); + } + } + $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/root/opt/phpsysinfo/includes/os/class.DragonFly.inc.php b/root/opt/phpsysinfo/includes/os/class.DragonFly.inc.php new file mode 100644 index 0000000..9e9f946 --- /dev/null +++ b/root/opt/phpsysinfo/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[3])) { + $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/root/opt/phpsysinfo/includes/os/class.FreeBSD.inc.php b/root/opt/phpsysinfo/includes/os/class.FreeBSD.inc.php new file mode 100644 index 0000000..d602a60 --- /dev/null +++ b/root/opt/phpsysinfo/includes/os/class.FreeBSD.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.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('/:/', '-', $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)) + && !preg_match('/^fe80::/i', $ar_buf2[1])) + $dev->setInfo(($dev->getInfo()?$dev->getInfo().';':'').$ar_buf2[1]); + } + } + $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/root/opt/phpsysinfo/includes/os/class.HPUX.inc.php b/root/opt/phpsysinfo/includes/os/class.HPUX.inc.php new file mode 100644 index 0000000..02626ca --- /dev/null +++ b/root/opt/phpsysinfo/includes/os/class.HPUX.inc.php @@ -0,0 +1,404 @@ + + * @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); + } + } + } + + /** + * IP of the Virtual Host Name + * + * @return void + */ + private function _ip() + { + if (PSI_USE_VHOST === true) { + $this->sys->setIp(gethostbyname($this->sys->getHostname())); + } else { + if (!($result = getenv('SERVER_ADDR'))) { + $this->sys->setIp(gethostbyname($this->sys->getHostname())); + } else { + $this->sys->setIp($result); + } + } + } + + /** + * 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); + } + } + } + + /** + * Number of Users + * + * @return void + */ + private function _users() + { + if (CommonFunctions::executeProgram('who', '-q', $ret)) { + $who = preg_split('/=/', $ret, -1, PREG_SPLIT_NO_EMPTY); + $this->sys->setUsers($who[1]); + } + } + + /** + * 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('/Bus/', $buf)) { + $device = true; + continue; + } + if ($device) { + 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->_ip(); + $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/root/opt/phpsysinfo/includes/os/class.Haiku.inc.php b/root/opt/phpsysinfo/includes/os/class.Haiku.inc.php new file mode 100644 index 0000000..c803156 --- /dev/null +++ b/root/opt/phpsysinfo/includes/os/class.Haiku.inc.php @@ -0,0 +1,403 @@ + + * @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 + */ + private 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)); + } + } + } + } + + /** + * IP of the Virtual Host Name + * + * @return void + */ + private function _ip() + { + if (PSI_USE_VHOST === true) { + $this->sys->setIp(gethostbyname($this->sys->getHostname())); + } else { + if (!($result = getenv('SERVER_ADDR'))) { + $this->sys->setIp(gethostbyname($this->sys->getHostname())); + } else { + $this->sys->setIp($result); + } + } + } + + /** + * 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); + $notwas = true; + foreach ($lines as $line) { + if (preg_match("/^(\S+)/", $line, $ar_buf)) { + if (!$notwas) { + $dev->setErrors($errors); + $dev->setDrops($drops); + $this->sys->setNetDevices($dev); + } + $errors = 0; + $drops = 0; + $dev = new NetDevice(); + $dev->setName($ar_buf[1]); + $notwas = false; + } else { + if (!$notwas) { + 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('/:/', '-', $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)) + if (!preg_match('/^fe80::/i', $ar_buf2[1])) + $dev->setInfo(($dev->getInfo()?$dev->getInfo().';':'').$ar_buf2[1]); + } + } + } + } + if (!$notwas) { + $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->_ip(); + $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/root/opt/phpsysinfo/includes/os/class.Linux.inc.php b/root/opt/phpsysinfo/includes/os/class.Linux.inc.php new file mode 100644 index 0000000..96abbbf --- /dev/null +++ b/root/opt/phpsysinfo/includes/os/class.Linux.inc.php @@ -0,0 +1,1096 @@ + + * @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)); + } + } + } + + /** + * 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)); + } + } + } + } + + /** + * IP + * + * @return void + */ + protected function _ip() + { + if (PSI_USE_VHOST === true) { + $this->sys->setIp(gethostbyname($this->sys->getHostname())); + } else { + if (!isset($_SERVER['SERVER_ADDR']) || !($result = $_SERVER['SERVER_ADDR'])) { + $this->sys->setIp(gethostbyname($this->sys->getHostname())); + } else { + $this->sys->setIp($result); + } + } + } + + /** + * 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 = trim($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 .= ' '.trim($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])); + } + + /** + * Number of Users + * + * @return void + */ + private function _users() + { + if (CommonFunctions::executeProgram('who', '', $strBuf, PSI_DEBUG)) { + if (strlen(trim($strBuf)) > 0) { + $lines = preg_split('/\n/', $strBuf); + $this->sys->setUsers(count($lines)); + } + } + } + + /** + * 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()) { + if (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('/Bus/', $strLine)) { + $booDevice = true; + continue; + } + if ($booDevice) { + 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 { + foreach ($arrResults as $dev) { + $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)) { + 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); + } + } + } else { + $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); + } + } + } + } + + /** + * 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)) { + if (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) && (CommonFunctions::executeProgram('ifconfig', trim($dev_name).' 2>/dev/null', $bufr2, PSI_DEBUG))) { + $bufe2 = preg_split("/\n/", $bufr2, -1, PREG_SPLIT_NO_EMPTY); + 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)) + $dev->setInfo(($dev->getInfo()?$dev->getInfo().';':'').preg_replace('/:/', '-', $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)) { + 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+Scope:[GH]/i', $buf2, $ar_buf2) + || preg_match('/^\s+inet6\s+(\S+)\s+prefixlen(.+)(()|())/i', $buf2, $ar_buf2)) + $dev->setInfo(($dev->getInfo()?$dev->getInfo().';':'').$ar_buf2[1]); + } + } + $this->sys->setNetDevices($dev); + } + } + } elseif (CommonFunctions::executeProgram('ifconfig', '', $bufr, PSI_DEBUG)) { + $lines = preg_split("/\n/", $bufr, -1, PREG_SPLIT_NO_EMPTY); + $notwas = true; + foreach ($lines as $line) { + if (preg_match("/^([^\s:]+)/", $line, $ar_buf)) { + if (!$notwas) { + $dev->setErrors($errors); + $dev->setDrops($drops); + $this->sys->setNetDevices($dev); + } + $errors = 0; + $drops = 0; + $dev = new NetDevice(); + $dev->setName($ar_buf[1]); + $notwas = false; + if (defined('PSI_SHOW_NETWORK_INFOS') && (PSI_SHOW_NETWORK_INFOS)) { + if (preg_match('/^'.$ar_buf[1].'\s+Link\sencap:Ethernet\s+HWaddr\s(\S+)/i', $line, $ar_buf2)) + $dev->setInfo(($dev->getInfo()?$dev->getInfo().';':'').preg_replace('/:/', '-', $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 (!$notwas) { + 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)) + $dev->setInfo(($dev->getInfo()?$dev->getInfo().';':'').preg_replace('/:/', '-', $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+Scope:[GH]/i', $line, $ar_buf2) + || preg_match('/^\s+inet6\s+(\S+)\s+prefixlen(.+)(()|())/i', $line, $ar_buf2)) + $dev->setInfo(($dev->getInfo()?$dev->getInfo().';':'').$ar_buf2[1]); + + } + } + } + } + if (!$notwas) { + $dev->setErrors($errors); + $dev->setDrops($drops); + $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 + */ + private 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(trim($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'])) { + $this->sys->setDistribution($distro['Description']); + } elseif (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']); + } 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])); + } 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)); + } + } + } + } + /* 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->_ip(); + $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/root/opt/phpsysinfo/includes/os/class.Minix.inc.php b/root/opt/phpsysinfo/includes/os/class.Minix.inc.php new file mode 100644 index 0000000..43fd4bf --- /dev/null +++ b/root/opt/phpsysinfo/includes/os/class.Minix.inc.php @@ -0,0 +1,382 @@ + + * @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)) && is_array($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]); + } + } + } + + /** + * Number of Users + * + * @return void + */ + private function _users() + { + if (CommonFunctions::executeProgram('uptime', '', $buf)) { + if (preg_match("/, (.*) users, load averages: (.*), (.*), (.*)$/", $buf, $ar_buf)) { + $this->sys->setUsers($ar_buf[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)); + } + } + } + } + + /** + * IP of the Virtual Host Name + * + * @return void + */ + private function _ip() + { + if (PSI_USE_VHOST === true) { + $this->sys->setIp(gethostbyname($this->sys->getHostname())); + } else { + if (!($result = getenv('SERVER_ADDR'))) { + $this->sys->setIp(gethostbyname($this->sys->getHostname())); + } else { + $this->sys->setIp($result); + } + } + } + + /** + * 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->_ip(); + $this->_kernel(); + $this->_uptime(); + $this->_users(); + $this->_loadavg(); + $this->_pci(); + $this->_cpuinfo(); + $this->_memory(); + $this->_filesystems(); + $this->_network(); + $this->_processes(); + } +} diff --git a/root/opt/phpsysinfo/includes/os/class.NetBSD.inc.php b/root/opt/phpsysinfo/includes/os/class.NetBSD.inc.php new file mode 100644 index 0000000..d43e79c --- /dev/null +++ b/root/opt/phpsysinfo/includes/os/class.NetBSD.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.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])) { + $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]); + $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/root/opt/phpsysinfo/includes/os/class.OS.inc.php b/root/opt/phpsysinfo/includes/os/class.OS.inc.php new file mode 100644 index 0000000..eadf92b --- /dev/null +++ b/root/opt/phpsysinfo/includes/os/class.OS.inc.php @@ -0,0 +1,85 @@ + + * @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 = 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; + } + + /** + * get the filled or unfilled (with default values) System object + * + * @see PSI_Interface_OS::getSys() + * + * @return System + */ + final public function getSys() + { + $this->build(); + + return $this->sys; + } +} diff --git a/root/opt/phpsysinfo/includes/os/class.OpenBSD.inc.php b/root/opt/phpsysinfo/includes/os/class.OpenBSD.inc.php new file mode 100644 index 0000000..e642d42 --- /dev/null +++ b/root/opt/phpsysinfo/includes/os/class.OpenBSD.inc.php @@ -0,0 +1,174 @@ + + * @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])) { + $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]); + $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')); + $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/root/opt/phpsysinfo/includes/os/class.QNX.inc.php b/root/opt/phpsysinfo/includes/os/class.QNX.inc.php new file mode 100644 index 0000000..203dae3 --- /dev/null +++ b/root/opt/phpsysinfo/includes/os/class.QNX.inc.php @@ -0,0 +1,256 @@ + + * @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 + */ + private 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)); + } + } + } + } + + /** + * IP of the Virtual Host Name + * + * @return void + */ + private function _ip() + { + if (PSI_USE_VHOST === true) { + $this->sys->setIp(gethostbyname($this->sys->getHostname())); + } else { + if (!($result = getenv('SERVER_ADDR'))) { + $this->sys->setIp(gethostbyname($this->sys->getHostname())); + } else { + $this->sys->setIp($result); + } + } + } + + /** + * 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); + $notwas = true; + foreach ($lines as $line) { + if (preg_match("/^([^\s:]+)/", $line, $ar_buf)) { + if (!$notwas) { + $this->sys->setNetDevices($dev); + } + $dev = new NetDevice(); + $dev->setName($ar_buf[1]); + $notwas = false; + } else { + if (!$notwas) { + 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().';':'').$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 (!$notwas) { + $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->_ip(); + $this->_kernel(); + $this->_uptime(); + $this->_users(); + $this->_cpuinfo(); + $this->_memory(); + $this->_filesystems(); + $this->_network(); + } +} diff --git a/root/opt/phpsysinfo/includes/os/class.SunOS.inc.php b/root/opt/phpsysinfo/includes/os/class.SunOS.inc.php new file mode 100644 index 0000000..e9dee30 --- /dev/null +++ b/root/opt/phpsysinfo/includes/os/class.SunOS.inc.php @@ -0,0 +1,349 @@ + + * @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) && + !is_null($m) && (trim($m)!=="")) { + list($key, $value) = preg_split("/\t/", trim($m), 2); + + return $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)); + } + } + } + } + + /** + * IP of the Virtual Host Name + * + * @return void + */ + private function _ip() + { + if (PSI_USE_VHOST === true) { + $this->sys->setIp(gethostbyname($this->sys->getHostname())); + } else { + if (!($result = getenv('SERVER_ADDR'))) { + $this->sys->setIp(gethostbyname($this->sys->getHostname())); + } else { + $this->sys->setIp($result); + } + } + } + + /** + * Kernel Version + * + * @return void + */ + private function _kernel() + { + if (CommonFunctions::executeProgram('uname', '-s', $os, PSI_DEBUG)) { + if (CommonFunctions::executeProgram('uname', '-r', $version, PSI_DEBUG)) { + $this->sys->setKernel($os.' '.$version); + } else { + $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')); + } + + /** + * Number of Users + * + * @return void + */ + private function _users() + { + if (CommonFunctions::executeProgram('who', '-q', $buf, PSI_DEBUG)) { + $who = preg_split('/=/', $buf); + $this->sys->setUsers($who[1]); + } + } + + /** + * 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() + { + $dev = new CpuDevice(); + if (CommonFunctions::executeProgram('uname', '-i', $buf, PSI_DEBUG)) { + $dev->setModel(trim($buf)); + } + $dev->setCpuSpeed($this->_kstat('cpu_info:0:cpu_info0:clock_MHz')); + $dev->setCache($this->_kstat('cpu_info:0:cpu_info0:cpu_type') * 1024); + $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) + && !is_null($bufr2) && (trim($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('/:/', '-', $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) + && !is_null($bufr2) && (trim($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) + && !preg_match('/^fe80::/i', $ar_buf2[1])) + $dev->setInfo(($dev->getInfo()?$dev->getInfo().';':'').$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->_ip(); + $this->_kernel(); + $this->_uptime(); + $this->_users(); + $this->_loadavg(); + $this->_cpuinfo(); + $this->_network(); + $this->_memory(); + $this->_filesystems(); + $this->_processes(); + } +} diff --git a/root/opt/phpsysinfo/includes/os/class.WINNT.inc.php b/root/opt/phpsysinfo/includes/os/class.WINNT.inc.php new file mode 100644 index 0000000..ff5eac5 --- /dev/null +++ b/root/opt/phpsysinfo/includes/os/class.WINNT.inc.php @@ -0,0 +1,609 @@ + + * @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); + } + } + } + + /** + * IP of the Canonical Host Name + * + * @return void + */ + private function _ip() + { + if (PSI_USE_VHOST === true) { + if ((($hnm=$this->sys->getHostname()) != 'localhost') && + (($hip=gethostbyname($hnm)) != $hnm)) $this->sys->setIp($hip); + } else { + $buffer = CommonFunctions::getWMI($this->_wmi, 'Win32_ComputerSystem', array('Name')); + if ($buffer) { + $result = $buffer[0]['Name']; + $this->sys->setIp(gethostbyname($result)); + } else { + if ((($hnm=$this->sys->getHostname()) != 'localhost') && + (($hip=gethostbyname($hnm)) != $hnm)) $this->sys->setIp($hip); + } + } + } + + /** + * 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 + */ + private function _users() + { + if (CommonFunctions::executeProgram("quser", "", $strBuf, false) && (strlen(trim($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')); + $allNetworkAdapterConfigurations = CommonFunctions::getWMI($this->_wmi, 'Win32_NetworkAdapterConfiguration', array('Description', 'MACAddress', 'IPAddress', 'SettingID')); + + 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('/:/', '-', $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().';':'').$ipaddres); + } + + break; + } + } + } + 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 (!is_null($dev->getInfo())) { + $dev->setInfo(''); //multiple with the same name + } else { + $dev->setInfo(preg_replace('/:/', '-', $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().';':'').$ipaddres); + } + } + } + } + + // 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(trim($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->_ip(); + $this->_users(); + $this->_machine(); + $this->_uptime(); + $this->_cpuinfo(); + $this->_network(); + $this->_hardware(); + $this->_filesystems(); + $this->_memory(); + $this->_loadavg(); + $this->_processes(); + } +} diff --git a/root/opt/phpsysinfo/includes/output/class.Output.inc.php b/root/opt/phpsysinfo/includes/output/class.Output.inc.php new file mode 100644 index 0000000..4d561e3 --- /dev/null +++ b/root/opt/phpsysinfo/includes/output/class.Output.inc.php @@ -0,0 +1,60 @@ + + * @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 = Error::singleton(); + $this->_checkConfig(); + CommonFunctions::checkForExtensions(); +// $this->error = Error::singleton(); +// $this->_checkConfig(); + } + + /** + * 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/root/opt/phpsysinfo/includes/output/class.Template.inc.php b/root/opt/phpsysinfo/includes/output/class.Template.inc.php new file mode 100644 index 0000000..3fa71ce --- /dev/null +++ b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/includes/output/class.Webpage.inc.php b/root/opt/phpsysinfo/includes/output/class.Webpage.inc.php new file mode 100644 index 0000000..2d27fea --- /dev/null +++ b/root/opt/phpsysinfo/includes/output/class.Webpage.inc.php @@ -0,0 +1,139 @@ + + * @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 language + * + * @var String + */ + private $_language; + + /** + * configured template + * + * @var String + */ + private $_template; + + /** + * all available templates + * + * @var Array + */ + private $_templates = array(); + + /** + * all available languages + * + * @var Array + */ + private $_languages = array(); + + /** + * check for all extensions that are needed, initialize needed vars and read phpsysinfo.ini + */ + public function __construct() + { + 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() + { + $this->_template = trim(strtolower(PSI_DEFAULT_TEMPLATE)); + if (!file_exists(APP_ROOT.'/templates/'.$this->_template.".css")) { + $this->_template = 'phpsysinfo'; + } + + $this->_language = trim(strtolower(PSI_DEFAULT_LANG)); + if (!file_exists(APP_ROOT.'/language/'.$this->_language.".xml")) { + $this->_language = 'en'; + } + } + + /** + * 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") && ($tpl_name !== "phpsysinfo_bootstrap")) { + 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_dynamic.html"); + + $tpl->set("template", $this->_template); + $tpl->set("templates", $this->_templates); + $tpl->set("language", $this->_language); + $tpl->set("languages", $this->_languages); + + echo $tpl->fetch(); + } +} diff --git a/root/opt/phpsysinfo/includes/output/class.WebpageXML.inc.php b/root/opt/phpsysinfo/includes/output/class.WebpageXML.inc.php new file mode 100644 index 0000000..43c226d --- /dev/null +++ b/root/opt/phpsysinfo/includes/output/class.WebpageXML.inc.php @@ -0,0 +1,189 @@ + + * @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 hddtemp configuration in phpsysinfo.ini + $found = false; + if (PSI_HDD_TEMP !== false) { + $found = true; + } + /** + * hddtemp information available or not + * + * @var boolean + */ + define('PSI_HDDTEMP', $found); + + // 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/root/opt/phpsysinfo/includes/output/class.WebpageXSLT.inc.php b/root/opt/phpsysinfo/includes/output/class.WebpageXSLT.inc.php new file mode 100644 index 0000000..284498c --- /dev/null +++ b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/includes/plugin/class.PSI_Plugin.inc.php b/root/opt/phpsysinfo/includes/plugin/class.PSI_Plugin.inc.php new file mode 100644 index 0000000..583ef8c --- /dev/null +++ b/root/opt/phpsysinfo/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 = 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/root/opt/phpsysinfo/includes/to/class.MBInfo.inc.php b/root/opt/phpsysinfo/includes/to/class.MBInfo.inc.php new file mode 100644 index 0000000..07c254c --- /dev/null +++ b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/includes/to/class.System.inc.php b/root/opt/phpsysinfo/includes/to/class.System.inc.php new file mode 100644 index 0000000..938139e --- /dev/null +++ b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/includes/to/class.UPSInfo.inc.php b/root/opt/phpsysinfo/includes/to/class.UPSInfo.inc.php new file mode 100644 index 0000000..26b81cf --- /dev/null +++ b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/includes/to/device/class.CpuDevice.inc.php b/root/opt/phpsysinfo/includes/to/device/class.CpuDevice.inc.php new file mode 100644 index 0000000..e690ef2 --- /dev/null +++ b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/includes/to/device/class.DiskDevice.inc.php b/root/opt/phpsysinfo/includes/to/device/class.DiskDevice.inc.php new file mode 100644 index 0000000..32e5b73 --- /dev/null +++ b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/includes/to/device/class.HWDevice.inc.php b/root/opt/phpsysinfo/includes/to/device/class.HWDevice.inc.php new file mode 100644 index 0000000..3a2b0f1 --- /dev/null +++ b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/includes/to/device/class.NetDevice.inc.php b/root/opt/phpsysinfo/includes/to/device/class.NetDevice.inc.php new file mode 100644 index 0000000..6f8d3b9 --- /dev/null +++ b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/includes/to/device/class.SensorDevice.inc.php b/root/opt/phpsysinfo/includes/to/device/class.SensorDevice.inc.php new file mode 100644 index 0000000..65c2f6c --- /dev/null +++ b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/includes/to/device/class.UPSDevice.inc.php b/root/opt/phpsysinfo/includes/to/device/class.UPSDevice.inc.php new file mode 100644 index 0000000..f72e30a --- /dev/null +++ b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/includes/ups/class.apcupsd.inc.php b/root/opt/phpsysinfo/includes/ups/class.apcupsd.inc.php new file mode 100644 index 0000000..0a0744a --- /dev/null +++ b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/includes/ups/class.nut.inc.php b/root/opt/phpsysinfo/includes/ups/class.nut.inc.php new file mode 100644 index 0000000..b9b86a9 --- /dev/null +++ b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/includes/ups/class.pmset.inc.php b/root/opt/phpsysinfo/includes/ups/class.pmset.inc.php new file mode 100644 index 0000000..b334eb9 --- /dev/null +++ b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/includes/ups/class.powersoftplus.inc.php b/root/opt/phpsysinfo/includes/ups/class.powersoftplus.inc.php new file mode 100644 index 0000000..b43ac34 --- /dev/null +++ b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/includes/ups/class.ups.inc.php b/root/opt/phpsysinfo/includes/ups/class.ups.inc.php new file mode 100644 index 0000000..c0970b4 --- /dev/null +++ b/root/opt/phpsysinfo/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 + */ + protected $error; + + /** + * main object for ups information + * + * @var UPSInfo + */ + protected $upsinfo; + + /** + * build the global Error object + */ + public function __construct() + { + $this->error = 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/root/opt/phpsysinfo/includes/xml/class.SimpleXMLExtended.inc.php b/root/opt/phpsysinfo/includes/xml/class.SimpleXMLExtended.inc.php new file mode 100644 index 0000000..a05ff2c --- /dev/null +++ b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/includes/xml/class.XML.inc.php b/root/opt/phpsysinfo/includes/xml/class.XML.inc.php new file mode 100644 index 0000000..b46330a --- /dev/null +++ b/root/opt/phpsysinfo/includes/xml/class.XML.inc.php @@ -0,0 +1,742 @@ + + * @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 = 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); + $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()); + } + } + } + } + + if (PSI_HDDTEMP) { + $hddtemp = new HDDTemp(); + $hddtemp_data = $hddtemp->getMBInfo(); + foreach ($hddtemp_data->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()); + } + } + } + } + + /** + * 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 ($this->_sys === null) { + if (PSI_DEBUG === true) { + // 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); + } + $options->addAttribute('showPickListTemplate', defined('PSI_SHOW_PICKLIST_TEMPLATE') ? (PSI_SHOW_PICKLIST_TEMPLATE ? 'true' : 'false') : 'false'); + $options->addAttribute('showPickListLang', defined('PSI_SHOW_PICKLIST_LANG') ? (PSI_SHOW_PICKLIST_LANG ? 'true' : 'false') : 'false'); + $options->addAttribute('showCPUListExpanded', defined('PSI_SHOW_CPULIST_EXPANDED') ? (PSI_SHOW_CPULIST_EXPANDED ? 'true' : 'false') : 'true'); + $options->addAttribute('showCPUInfoExpanded', defined('PSI_SHOW_CPUINFO_EXPANDED') ? (PSI_SHOW_CPUINFO_EXPANDED ? 'true' : 'false') : 'false'); + 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/root/opt/phpsysinfo/index.php b/root/opt/phpsysinfo/index.php new file mode 100644 index 0000000..2314548 --- /dev/null +++ b/root/opt/phpsysinfo/index.php @@ -0,0 +1,71 @@ + + * @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.2", PHP_VERSION, ">")) { + die("PHP 5.2 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 = isset($_GET['disp']) ? $_GET['disp'] : strtolower(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(); + break; +default: + $tpl = new Template("/templates/html/index_all.html"); + echo $tpl->fetch(); + break; +} diff --git a/root/opt/phpsysinfo/js.php b/root/opt/phpsysinfo/js.php new file mode 100644 index 0000000..375cb99 --- /dev/null +++ b/root/opt/phpsysinfo/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/root/opt/phpsysinfo/js/jQuery/README b/root/opt/phpsysinfo/js/jQuery/README new file mode 100644 index 0000000..5e80578 --- /dev/null +++ b/root/opt/phpsysinfo/js/jQuery/README @@ -0,0 +1,58 @@ +versions, links and simple description of used jquery files +=========================================================== + +jquery.js +--------- +VERSION : 2.1.4 +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.11.3 +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 +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 +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 +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 + +$Id: README 702 2012-09-21 16:52:32Z namiltd $ diff --git a/root/opt/phpsysinfo/js/jQuery/README_bootstrap b/root/opt/phpsysinfo/js/jQuery/README_bootstrap new file mode 100644 index 0000000..18e9b93 --- /dev/null +++ b/root/opt/phpsysinfo/js/jQuery/README_bootstrap @@ -0,0 +1,25 @@ +versions, links and simple description of used jquery files +=========================================================== + +jquery.js +--------- +VERSION : 2.1.4 +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.11.3 +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 diff --git a/root/opt/phpsysinfo/js/jQuery/jquery-1.js b/root/opt/phpsysinfo/js/jQuery/jquery-1.js new file mode 100644 index 0000000..6feb110 --- /dev/null +++ b/root/opt/phpsysinfo/js/jQuery/jquery-1.js @@ -0,0 +1,10351 @@ +/*! + * jQuery JavaScript Library v1.11.3 + * http://jquery.com/ + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * + * Copyright 2005, 2014 jQuery Foundation, Inc. and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2015-04-28T16:19Z + */ + +(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 inherently posses a window with a document + // (such as Node.js), expose a jQuery-making 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 ) { + +// Can't do this because several apps including ASP.NET trace +// the stack via arguments.caller.callee and Firefox dies if +// you try to trace through "use strict" call chains. (#13335) +// Support: Firefox 18+ +// + +var deletedIds = []; + +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.11.3", + + // 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. + // (You can seed the arguments with an array of args, but this is + // only used internally.) + each: function( callback, args ) { + return jQuery.each( this, callback, args ); + }, + + 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(null); + }, + + // 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) + return !jQuery.isArray( obj ) && (obj - parseFloat( obj ) + 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.ownLast ) { + 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; + }, + + // Evaluates a script in a global context + // 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 ); + } )( 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(); + }, + + // args is for internal usage only + each: function( obj, callback, args ) { + var value, + i = 0, + length = obj.length, + isArray = isArraylike( obj ); + + if ( args ) { + if ( isArray ) { + for ( ; i < length; i++ ) { + value = callback.apply( obj[ i ], args ); + + if ( value === false ) { + break; + } + } + } else { + for ( i in obj ) { + value = callback.apply( obj[ i ], args ); + + if ( value === false ) { + break; + } + } + } + + // A special, fast, case for the most common use of each + } else { + if ( isArray ) { + for ( ; i < length; i++ ) { + value = callback.call( obj[ i ], i, obj[ i ] ); + + if ( value === false ) { + break; + } + } + } else { + for ( i in obj ) { + value = callback.call( obj[ i ], i, obj[ i ] ); + + if ( value === 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 value, + i = 0, + length = elems.length, + isArray = isArraylike( elems ), + ret = []; + + // Go through the array, translating each of the items to their new values + if ( isArray ) { + 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 +}); + +// Populate the class2type map +jQuery.each("Boolean Number String Function Array Date RegExp Object Error".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 = "length" in obj && obj.length, + type = jQuery.type( obj ); + + if ( type === "function" || jQuery.isWindow( obj ) ) { + return false; + } + + if ( obj.nodeType === 1 && length ) { + return true; + } + + return type === "array" || length === 0 || + typeof length === "number" && length > 0 && ( length - 1 ) in obj; +} +var Sizzle = +/*! + * Sizzle CSS Selector Engine v2.2.0-pre + * http://sizzlejs.com/ + * + * Copyright 2008, 2014 jQuery Foundation, Inc. and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2014-12-16 + */ +(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 + + // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace + whitespace = "[\\x20\\t\\r\\n\\f]", + // http://www.w3.org/TR/css3-syntax/#characters + characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+", + + // Loosely modeled on CSS identifier characters + // An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors + // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier + identifier = characterEncoding.replace( "w", "w#" ), + + // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors + attributes = "\\[" + whitespace + "*(" + characterEncoding + ")(?:" + whitespace + + // Operator (capture 2) + "*([*^$|!~]?=)" + whitespace + + // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + + "*\\]", + + pseudos = ":(" + characterEncoding + ")(?:\\((" + + // 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( "^#(" + characterEncoding + ")" ), + "CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ), + "TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ), + "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 match, elem, m, nodeType, + // QSA vars + i, groups, old, nid, newContext, newSelector; + + if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { + setDocument( context ); + } + + context = context || document; + results = results || []; + nodeType = context.nodeType; + + if ( typeof selector !== "string" || !selector || + nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { + + return results; + } + + if ( !seed && documentIsHTML ) { + + // Try to shortcut find operations when possible (e.g., not under DocumentFragment) + if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) { + // Speed-up: Sizzle("#ID") + if ( (m = match[1]) ) { + if ( nodeType === 9 ) { + elem = context.getElementById( m ); + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document (jQuery #6963) + if ( elem && elem.parentNode ) { + // Handle the case where IE, Opera, and Webkit return items + // by name instead of ID + if ( elem.id === m ) { + results.push( elem ); + return results; + } + } else { + return results; + } + } else { + // Context is not a document + if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) && + contains( context, elem ) && elem.id === m ) { + results.push( elem ); + return results; + } + } + + // Speed-up: Sizzle("TAG") + } else if ( match[2] ) { + push.apply( results, context.getElementsByTagName( selector ) ); + return results; + + // Speed-up: Sizzle(".CLASS") + } else if ( (m = match[3]) && support.getElementsByClassName ) { + push.apply( results, context.getElementsByClassName( m ) ); + return results; + } + } + + // QSA path + if ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { + nid = old = expando; + newContext = context; + newSelector = nodeType !== 1 && selector; + + // qSA works strangely on Element-rooted queries + // We can work around this by specifying an extra ID on the root + // and working up from there (Thanks to Andrew Dupont for the technique) + // IE 8 doesn't work on object elements + if ( nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { + groups = tokenize( selector ); + + if ( (old = context.getAttribute("id")) ) { + nid = old.replace( rescape, "\\$&" ); + } else { + context.setAttribute( "id", nid ); + } + nid = "[id='" + nid + "'] "; + + i = groups.length; + while ( i-- ) { + groups[i] = nid + toSelector( groups[i] ); + } + newContext = rsibling.test( selector ) && testContext( context.parentNode ) || context; + newSelector = groups.join(","); + } + + if ( newSelector ) { + try { + push.apply( results, + newContext.querySelectorAll( newSelector ) + ); + return results; + } catch(qsaError) { + } finally { + if ( !old ) { + 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 = attrs.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; + + // If no document and documentElement is available, return + if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { + return document; + } + + // Set our document + document = doc; + docElem = doc.documentElement; + parent = doc.defaultView; + + // Support: IE>8 + // If iframe document is assigned to "document" variable and if iframe has been reloaded, + // IE will throw "permission denied" error when accessing "document" variable, see jQuery #13936 + // IE6-8 do not support the defaultView property so parent will be undefined + if ( parent && parent !== parent.top ) { + // IE11 does not have attachEvent, so all must suffer + if ( parent.addEventListener ) { + parent.addEventListener( "unload", unloadHandler, false ); + } else if ( parent.attachEvent ) { + parent.attachEvent( "onunload", unloadHandler ); + } + } + + /* Support tests + ---------------------------------------------------------------------- */ + documentIsHTML = !isXML( doc ); + + /* 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( doc.createComment("") ); + return !div.getElementsByTagName("*").length; + }); + + // Support: IE<9 + support.getElementsByClassName = rnative.test( doc.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 !doc.getElementsByName || !doc.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 ); + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + return m && m.parentNode ? [ 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 ( 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( doc.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.2+, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.7+ + 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 = doc.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 does not implement inclusive descendent + // 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 === doc || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) { + return -1; + } + if ( b === doc || 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 === doc ? -1 : + b === doc ? 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 doc; +}; + +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 && + ( !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, outerCache, node, diff, nodeIndex, start, + dir = simple !== forward ? "nextSibling" : "previousSibling", + parent = elem.parentNode, + name = ofType && elem.nodeName.toLowerCase(), + useCache = !xml && !ofType; + + 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 + outerCache = parent[ expando ] || (parent[ expando ] = {}); + cache = outerCache[ type ] || []; + nodeIndex = cache[0] === dirruns && cache[1]; + diff = cache[0] === dirruns && 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 ) { + outerCache[ type ] = [ dirruns, nodeIndex, diff ]; + break; + } + } + + // Use previously-cached element index if available + } else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) { + diff = cache[1]; + + // xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...) + } else { + // 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 ) { + (node[ expando ] || (node[ expando ] = {}))[ 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, outerCache, + newCache = [ dirruns, doneName ]; + + // We can't set arbitrary data on XML nodes, so they don't benefit from dir 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 ] = {}); + if ( (oldCache = outerCache[ 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 + outerCache[ 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; + } + + // Add elements passing elementMatchers directly to results + // Keep `i` a string if there are no elements so `matchedCount` will be "00" below + // 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; + while ( (matcher = elementMatchers[j++]) ) { + if ( matcher( elem, context, 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 ); + } + } + } + + // Apply set filters to unmatched elements + matchedCount += i; + 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 no seed and only one group + if ( match.length === 1 ) { + + // Take a shortcut and set the context if the root 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, + 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.unique = Sizzle.uniqueSort; +jQuery.text = Sizzle.getText; +jQuery.isXMLDoc = Sizzle.isXML; +jQuery.contains = Sizzle.contains; + + + +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 ) >= 0 ) !== 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, + + // Use the correct document accordingly with window argument (sandbox) + document = window.document, + + // 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 ) { + var match, elem; + + // HANDLE: $(""), $(null), $(undefined), $(false) + if ( !selector ) { + return this; + } + + // 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 || rootjQuery ).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 rootjQuery.ready !== "undefined" ? + rootjQuery.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.extend({ + dir: function( elem, dir, until ) { + var matched = [], + cur = elem[ dir ]; + + while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) { + if ( cur.nodeType === 1 ) { + matched.push( cur ); + } + cur = cur[dir]; + } + return matched; + }, + + sibling: function( n, elem ) { + var r = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + r.push( n ); + } + } + + return r; + } +}); + +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.unique( 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.unique( + 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 jQuery.dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, i, until ) { + return jQuery.dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return sibling( elem, "nextSibling" ); + }, + prev: function( elem ) { + return sibling( elem, "previousSibling" ); + }, + nextAll: function( elem ) { + return jQuery.dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return jQuery.dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, i, until ) { + return jQuery.dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, i, until ) { + return jQuery.dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem ); + }, + children: function( elem ) { + return jQuery.sibling( 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.unique( ret ); + } + + // Reverse order for parents* and prev-derivatives + if ( rparentsprev.test( name ) ) { + ret = ret.reverse(); + } + } + + return this.pushStack( ret ); + }; +}); +var rnotwhite = (/\S+/g); + + + +// String to Object options format cache +var optionsCache = {}; + +// Convert String-formatted options into Object-formatted ones and store in cache +function createOptions( options ) { + var object = optionsCache[ options ] = {}; + 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" ? + ( optionsCache[ options ] || 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, + // End of the loop when firing + firingLength, + // Index of currently firing callback (modified by remove if needed) + firingIndex, + // First callback to fire (used internally by add and fireWith) + firingStart, + // Actual callback list + list = [], + // Stack of fire calls for repeatable lists + stack = !options.once && [], + // Fire callbacks + fire = function( data ) { + memory = options.memory && data; + fired = true; + firingIndex = firingStart || 0; + firingStart = 0; + firingLength = list.length; + firing = true; + for ( ; list && firingIndex < firingLength; firingIndex++ ) { + if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) { + memory = false; // To prevent further calls using add + break; + } + } + firing = false; + if ( list ) { + if ( stack ) { + if ( stack.length ) { + fire( stack.shift() ); + } + } else if ( memory ) { + list = []; + } else { + self.disable(); + } + } + }, + // Actual Callbacks object + self = { + // Add a callback or a collection of callbacks to the list + add: function() { + if ( list ) { + // First, we save the current length + var start = list.length; + (function add( args ) { + jQuery.each( args, function( _, arg ) { + var type = jQuery.type( arg ); + if ( type === "function" ) { + if ( !options.unique || !self.has( arg ) ) { + list.push( arg ); + } + } else if ( arg && arg.length && type !== "string" ) { + // Inspect recursively + add( arg ); + } + }); + })( arguments ); + // Do we need to add the callbacks to the + // current firing batch? + if ( firing ) { + firingLength = list.length; + // With memory, if we're not firing then + // we should call right away + } else if ( memory ) { + firingStart = start; + fire( memory ); + } + } + return this; + }, + // Remove a callback from the list + remove: function() { + if ( list ) { + jQuery.each( arguments, function( _, arg ) { + var index; + while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { + list.splice( index, 1 ); + // Handle firing indexes + if ( firing ) { + if ( index <= firingLength ) { + firingLength--; + } + 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 && list.length ); + }, + // Remove all callbacks from the list + empty: function() { + list = []; + firingLength = 0; + return this; + }, + // Have the list do nothing anymore + disable: function() { + list = stack = memory = undefined; + return this; + }, + // Is it disabled? + disabled: function() { + return !list; + }, + // Lock the list in its current state + lock: function() { + stack = undefined; + if ( !memory ) { + self.disable(); + } + return this; + }, + // Is it locked? + locked: function() { + return !stack; + }, + // Call all callbacks with the given context and arguments + fireWith: function( context, args ) { + if ( list && ( !fired || stack ) ) { + args = args || []; + args = [ context, args.slice ? args.slice() : args ]; + if ( firing ) { + stack.push( args ); + } else { + fire( args ); + } + } + 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() + .done( newDefer.resolve ) + .fail( newDefer.reject ) + .progress( newDefer.notify ); + } 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() + .done( updateFunc( i, resolveContexts, resolveValues ) ) + .fail( deferred.reject ) + .progress( updateFunc( i, progressContexts, progressValues ) ); + } 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; + } + + // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). + if ( !document.body ) { + return setTimeout( jQuery.ready ); + } + + // 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, false ); + window.removeEventListener( "load", completed, false ); + + } 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 || 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 + setTimeout( jQuery.ready ); + + // Standards-based browsers support DOMContentLoaded + } else if ( document.addEventListener ) { + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", completed, false ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", completed, false ); + + // 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 setTimeout( doScrollCheck, 50 ); + } + + // detach all dom ready events + detach(); + + // and execute any waiting functions + jQuery.ready(); + } + })(); + } + } + } + return readyList.promise( obj ); +}; + + +var strundefined = typeof undefined; + + + +// Support: IE<9 +// Iteration over object's inherited properties before its own +var i; +for ( i in jQuery( support ) ) { + break; +} +support.ownLast = 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 !== strundefined ) { + // 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" ); + + // Execute the test only if not already executed in another module. + if (support.deleteExpando == null) { + // Support: IE<9 + support.deleteExpando = true; + try { + delete div.test; + } catch( e ) { + support.deleteExpando = false; + } + } + + // Null elements to avoid leaks in IE. + div = null; +})(); + + +/** + * Determines whether an object can have data + */ +jQuery.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 ( !jQuery.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 ( !jQuery.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, null + } else { + cache[ id ] = null; + } +} + +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 ); + } +}); +var pnum = (/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/).source; + +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 ); + }; + + + +// Multifunctional method to get and set values of a collection +// The value/s can optionally be executed if it's a function +var access = jQuery.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 ) { + jQuery.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); + + + +(function() { + // Minified: var a,b,c + var input = document.createElement( "input" ), + div = document.createElement( "div" ), + fragment = document.createDocumentFragment(); + + // 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 ); + div.innerHTML = ""; + + // 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 + // Opera does not clone events (and typeof div.attachEvent === undefined). + // IE9-10 clones events bound via attachEvent, but they don't trigger with .click() + support.noCloneEvent = true; + if ( div.attachEvent ) { + div.attachEvent( "onclick", function() { + support.noCloneEvent = false; + }); + + div.cloneNode( true ).click(); + } + + // Execute the test only if not already executed in another module. + if (support.deleteExpando == null) { + // Support: IE<9 + support.deleteExpando = true; + try { + delete div.test; + } catch( e ) { + support.deleteExpando = false; + } + } +})(); + + +(function() { + var i, eventName, + div = document.createElement( "div" ); + + // Support: IE<9 (lack submit/change bubble), Firefox 23+ (lack focusin event) + for ( i in { submit: true, change: true, focusin: true }) { + eventName = "on" + i; + + if ( !(support[ i + "Bubbles" ] = eventName in window) ) { + // Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP) + div.setAttribute( eventName, "t" ); + support[ i + "Bubbles" ] = 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)|click/, + rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, + rtypenamespace = /^([^.]*)(?:\.(.+)|)$/; + +function returnTrue() { + return true; +} + +function returnFalse() { + return false; +} + +function safeActiveElement() { + try { + return document.activeElement; + } catch ( err ) { } +} + +/* + * 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 !== strundefined && (!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(".") >= 0 ) { + // 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.namespace_re = 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 && jQuery.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) && + jQuery.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, ret, handleObj, matched, j, + 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.namespace_re || event.namespace_re.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 sel, handleObj, matches, i, + handlerQueue = [], + delegateCount = handlers.delegateCount, + cur = event.target; + + // Find delegate handlers + // Black-hole SVG instance trees (#13180) + // Avoid non-left-click bubbling in Firefox (#3861) + if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) { + + /* 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 ) >= 0 : + 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: Chrome 23+, Safari? + // 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 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; + } + } + } + }, + + simulate: function( type, elem, event, bubble ) { + // Piggyback on a donor event to simulate a different one. + // Fake originalEvent to avoid donor's stopPropagation, but if the + // simulated event prevents default then we do the same on the donor. + var e = jQuery.extend( + new jQuery.Event(), + event, + { + type: type, + isSimulated: true, + originalEvent: {} + } + ); + if ( bubble ) { + jQuery.event.trigger( e, null, elem ); + } else { + jQuery.event.dispatch.call( elem, e ); + } + if ( e.isDefaultPrevented() ) { + event.preventDefault(); + } + } +}; + +jQuery.removeEvent = document.removeEventListener ? + function( elem, type, handle ) { + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle, false ); + } + } : + 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 ] === strundefined ) { + 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 = { + 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 ) { + 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 +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 mousenter/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.submitBubbles ) { + + 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" ) ? elem.form : undefined; + if ( form && !jQuery._data( form, "submitBubbles" ) ) { + jQuery.event.add( form, "submit._submit", function( event ) { + event._submit_bubble = true; + }); + jQuery._data( form, "submitBubbles", 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._submit_bubble ) { + delete event._submit_bubble; + if ( this.parentNode && !event.isTrigger ) { + jQuery.event.simulate( "submit", this.parentNode, event, true ); + } + } + }, + + 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.changeBubbles ) { + + 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._just_changed = true; + } + }); + jQuery.event.add( this, "click._change", function( event ) { + if ( this._just_changed && !event.isTrigger ) { + this._just_changed = false; + } + // Allow triggered, simulated change events (#11500) + jQuery.event.simulate( "change", this, event, true ); + }); + } + 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, "changeBubbles" ) ) { + jQuery.event.add( elem, "change._change", function( event ) { + if ( this.parentNode && !event.isSimulated && !event.isTrigger ) { + jQuery.event.simulate( "change", this.parentNode, event, true ); + } + }); + jQuery._data( elem, "changeBubbles", 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 ); + } + }; +} + +// Create "bubbling" focus and blur events +if ( !support.focusinBubbles ) { + 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 ), true ); + }; + + 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, /*INTERNAL*/ one ) { + var type, origFn; + + // 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 ) { + this.on( type, selector, data, types[ type ], one ); + } + return this; + } + + 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 this; + } + + 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 this.each( function() { + jQuery.event.add( this, types, fn, data, selector ); + }); + }, + one: function( types, selector, data, fn ) { + return this.on( 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 ); + } + } +}); + + +function createSafeFragment( document ) { + var list = nodeNames.split( "|" ), + safeFrag = document.createDocumentFragment(); + + if ( safeFrag.createElement ) { + while ( list.length ) { + safeFrag.createElement( + list.pop() + ); + } + } + return safeFrag; +} + +var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" + + "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video", + rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g, + rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"), + rleadingWhitespace = /^\s+/, + rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi, + rtagName = /<([\w:]+)/, + rtbody = /\s*$/g, + + // We have to close these tags to support XHTML (#13200) + wrapMap = { + option: [ 1, "" ], + legend: [ 1, "