From 916c32589f34532a1f53b290a72d5d3a00f3df16 Mon Sep 17 00:00:00 2001 From: arcan1s Date: Mon, 18 Nov 2013 19:16:38 +0400 Subject: [PATCH] Release ext-sysmon 1.5 + added configuration file --- PKGBUILD | 4 +- ext-sysmon-1.5.zip | Bin 4300 -> 5155 bytes ext-sysmon/CMakeLists.txt | 6 +- ext-sysmon/extsysmon.conf | 13 ++++ ext-sysmon/extsysmon.cpp | 103 ++++++++++++++++++++++++-------- ext-sysmon/extsysmon.h | 7 ++- old_versions/ext-sysmon-1.4.zip | Bin 0 -> 4299 bytes py-text-monitor-1.5.1.plasmoid | Bin 21954 -> 21954 bytes 8 files changed, 103 insertions(+), 30 deletions(-) create mode 100644 ext-sysmon/extsysmon.conf create mode 100644 old_versions/ext-sysmon-1.4.zip diff --git a/PKGBUILD b/PKGBUILD index d673a2a..0d4723d 100644 --- a/PKGBUILD +++ b/PKGBUILD @@ -22,8 +22,8 @@ makedepends=('automoc4' 'cmake') source=(https://github.com/arcan1s/pytextmonitor/releases/download/V.${pkgver}/${_pkgname}-${pkgver}.plasmoid https://github.com/arcan1s/pytextmonitor/releases/download/V.${pkgver}/${_dtengine}-${_dtver}.zip) install=${pkgname}.install -md5sums=('2a7e055aaabc8a767eccf0f0cfd03303' - 'b17aba604e5102961faf0bcdfd20744b') +md5sums=('9872eedca313768f18de0facc2fc135d' + '29a0fbc2014b0b7cacfab8186a56a1b6') build () { diff --git a/ext-sysmon-1.5.zip b/ext-sysmon-1.5.zip index 1d33b64f159066d4cc9d8693c4629d507d66b5f0..3203b4253f06500fea0e3224f4069bec38ee079f 100644 GIT binary patch delta 4332 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 Y0P>4%#GZk`Oq2jh!1P6Zmg$f1KbZt>FaQ7m diff --git a/ext-sysmon/CMakeLists.txt b/ext-sysmon/CMakeLists.txt index 2aaef1f..a5ed7f7 100644 --- a/ext-sysmon/CMakeLists.txt +++ b/ext-sysmon/CMakeLists.txt @@ -14,11 +14,13 @@ include_directories (${CMAKE_SOURCE_DIR} set (PLUGIN_NAME ${PROJECT_NAME}) file (GLOB PROJECT_DESKTOP *.desktop) file (GLOB PROJECT_SRCS *.cpp) +file (GLOB PROJECT_CONF *.conf) # make kde4_add_plugin (${PLUGIN_NAME} ${PROJECT_SRCS}) target_link_libraries (${PLUGIN_NAME} ${KDE4_KDECORE_LIBS} ${KDE4_PLASMA_LIBS}) # install -install(TARGETS ${PLUGIN_NAME} DESTINATION ${PLUGIN_INSTALL_DIR}) -install(FILES ${PROJECT_DESKTOP} DESTINATION ${SERVICES_INSTALL_DIR}) +install (TARGETS ${PLUGIN_NAME} DESTINATION ${PLUGIN_INSTALL_DIR}) +install (FILES ${PROJECT_DESKTOP} DESTINATION ${SERVICES_INSTALL_DIR}) +install (FILES ${PROJECT_CONF} DESTINATION ../etc/) diff --git a/ext-sysmon/extsysmon.conf b/ext-sysmon/extsysmon.conf new file mode 100644 index 0000000..343daec --- /dev/null +++ b/ext-sysmon/extsysmon.conf @@ -0,0 +1,13 @@ +# Configuration file for Extended Systemmonitor DataEngine (v.1.5) +# Uncomment needed lines + +# Set GPU device +# May be 'nvidia' (for nvidia), 'ati' (for ATI RADEON), 'ignore' or 'auto' +#GPUDEV=auto + +# Set block device for hddtemp comma separated or use 'all' +#HDDDEV=all + +# Set MPD settings +#MPDADDRESS=localhost +#MPDPORT=6600 diff --git a/ext-sysmon/extsysmon.cpp b/ext-sysmon/extsysmon.cpp index 5304102..2964426 100644 --- a/ext-sysmon/extsysmon.cpp +++ b/ext-sysmon/extsysmon.cpp @@ -20,6 +20,7 @@ #include "extsysmon.h" #include +#include #include @@ -30,29 +31,7 @@ ExtendedSysMon::ExtendedSysMon(QObject* parent, const QVariantList& args) Q_UNUSED(args) setMinimumPollingInterval(333); - - FILE *f_out; - f_out = popen("lspci 2> /dev/null", "r"); - char device[256]; - QString dev; - while (fgets(device, 256, f_out) != NULL) - { - dev = QString(device); - if (dev.toLower().contains("nvidia")) - gpudev = QString("nvidia"); - else if (dev.toLower().contains("radeon")) - gpudev = QString("ati"); - } - pclose(f_out); - - f_out = popen("ls -1 /dev/sd[a-z] 2> /dev/null ; ls -1 /dev/hd[a-z] 2> /dev/null", "r"); - while (fgets(device, 256, f_out) != NULL) - { - dev = QString(device).split("\n")[0]; - if (dev[0] == '/') - hdddev.append(dev); - } - pclose(f_out); + readConfiguration(QString("/etc/extsysmon.conf")); } QStringList ExtendedSysMon::sources() const @@ -65,6 +44,80 @@ QStringList ExtendedSysMon::sources() const return source; } +bool ExtendedSysMon::readConfiguration(const QString confFileName) +{ + // pre-setup + FILE *f_out; + f_out = popen("lspci 2> /dev/null", "r"); + char device[256]; + QString dev; + while (fgets(device, 256, f_out) != NULL) + { + dev = QString(device); + if (dev.toLower().contains("nvidia")) + gpudev = QString("nvidia"); + else if (dev.toLower().contains("radeon")) + gpudev = QString("ati"); + } + pclose(f_out); + + f_out = popen("ls -1 /dev/sd[a-z] 2> /dev/null ; ls -1 /dev/hd[a-z] 2> /dev/null", "r"); + while (fgets(device, 256, f_out) != NULL) + { + dev = QString(device).split("\n")[0]; + if (dev[0] == '/') + hdddev.append(dev); + } + pclose(f_out); + + mpdAddress = QString("localhost"); + mpdPort = QString("6600"); + + QString fileStr; + QFile confFile(confFileName); + bool exists = confFile.open(QIODevice::ReadOnly); + if (!exists) + return false; + + while (true) + { + fileStr = QString(confFile.readLine()); + if (confFile.atEnd()) + break; + else if (fileStr[0] != '#') + { + if (fileStr.split(QString("="), QString::SkipEmptyParts).count() == 1) + { + if (fileStr.split(QString("="), QString::SkipEmptyParts)[0] == QString("GPUDEV")) + { + if (fileStr.split(QString("="), QString::SkipEmptyParts)[1] == QString("ati")) + gpudev = fileStr.split(QString("="), QString::SkipEmptyParts)[1]; + else if (fileStr.split(QString("="), QString::SkipEmptyParts)[1] == QString("nvidia")) + gpudev = fileStr.split(QString("="), QString::SkipEmptyParts)[1]; + else if (fileStr.split(QString("="), QString::SkipEmptyParts)[1] == QString("ignore")) + gpudev = QString("ignore"); + } + else if (fileStr.split(QString("="), QString::SkipEmptyParts)[0] == QString("HDDDEV")) + { + if (fileStr.split(QString("="), QString::SkipEmptyParts)[1] != QString("all")) + { + hdddev.clear(); + for (int i=0; i)&V66r3H4y98Bq(vHO z1cCp0y))N)oqPZ1%y-UrX3qTHdFPq;o9BV3U||yieq13$mU4e={(Jxdi~u;ojmOo? z)!xy8Pe+>ofOWst8~S6pBY*%5>@_R^0NWh>I|L1(0$>90|A2JlrAi57000J<008&j zAx?HCuJ$H8a0g3k2RIL!{u9n?4tKS6b9DNz8llhIY&!Uf!gjp~rCMhNrc7u%8o>;IW`>l#IaN$(%{I@kn3XRF1+Gnfc*#Ptt)UB9ugQMkSB&~B zcT7T}<7|2(`eE^O@7mm5(6P))D+B_^uS)eKiJZ{hc_8Vd%N>eoBp zaD8gqC=2=%lC^`iNJ{-L~LkivJwvFJUaGWaR`9F7lpeVFu8`fc`FwoSKO( zT-Dmu&6U>;;r53PEb1yyjq2aD_S5Wh=wKmxb3m>1u5CTL;QJG^v54*pN+<54kO)?C z;kHs%Xc70-Bd2R>C9fH!w+08d24k`kNotJ_z&G)TrIeg5V(TiPnBn{UK*`P@VRmdHT_u6NiynEU^r7Vx~y!xL~4RLavmxXU79Cr*= znc|j#jGH*4sC^Msqm!l9SMr*15Yocw+LOyxTLK%_f?HxAHge`Q=nmAsyA@n}-Q2kR z>Cv71#KMc3?bC@283U=5mbf66q(x9Oj-G*P@}Bsl=u4zK%+|>(M-c3)4Ha8BluMc$ zDbGbw4O)XN4IKAZy1#}9$?tl%oC>XEMZ8(S9>M4n{Y%Mv=sAsYE|>1bLys6606_P5 zCI1>KGpC;e)m`HaokXvH4DGhTx$BGw#ida|m#%1}vYy7wJGWdht?uVWYH)**WpDAB zAUzkiz&%%mcql1?>4qZa*^d-T;U0B#Iv+bErqs z8Nhd6GLPj{X^tEULxM?pZ{r zbN-yStv+H(L|qSoPm22L3&{(8_X2%v-o}vhw}D-ExSTC&4%l|zANJDk*q zafrS$RoT-)@v)h3JWLEg>cPe@E>OIT-_?=VNW1XJ`4Bu7#Y;CV(0H->E(`9KEwtvr>rG5# z`fL<(^|X=)Ko=_A{{5l$^;L!SXKJlJA@!|OQ#7i*$m`>3?=9#+nBdW4a{NI~HWAMr zlXBlN;g*_;|~wPp;(%Ea+?S#`V@$!-CteYiy}IWR!0Gk$-zFgj~Pc^nxf4rha{ z6%I5QKM{o~<(W=qHTQ{VI{49Y2@UaL zMAm+KLq9<}Nu9v#a(ZxCK3-E$_gBQf;4b)J+KTEmKF+@Um)Gypj8 zIV;m!iLm3W3FsqkT4^=;gNhf32Uf&XP7~6~`!p>%Z}XQksVroyyga*aDegCBMhy!b z2f@_}<#VH^dz0)5{Y*7?9JC^^BdR|wmsw83AUylrL|eg1vK929n)=DPr!AX#<+4nI z6!F3osjX6)+A5fvrQ`d0Ypd|j-dw#1(w?4jy*U+3{)$`FHZaD9*a|@eW6&X%GFl2L+nTuq zFXEo~1CqTwhyrITa^ou@$>=_orb{ITww19FD5|C?j>gzu$x@->Ed4X=8tj9Xd%GMc zlC^c>@k(Yhr_TLvWQy!*F}Z@Vw^|TcW+q)s8A{vYs10wwoSO)gWb?DDGOEO`oNAXc z8CCtbx^^7)SZ+3vFw^IT3aX;h0tKc#+D_Y(qQQwBWf(WZjhS_mhRfObPprkEU3{hf zXUnVLXB}5Xnm6s#mder_fFGffd(1PU6JNV(YRD3|AOVdh`F8ro0n0oND#SbC6vkO3 zCk$UQ6hEwyHb%D~m@W_czK#SvoR@v4^Qv>~=CPz3&+W6+FY|=*F>f&=7%v*gK5AM^ z-E-%wes0xdc7W4+9P7Y^tjdkLJFU=s_#{)X z3>IeCv*+SWL0KL8xTtJ1FyWAxHoV_JX_0RfR>Tn=&v%9G8x1*#a%tC0jQdd zquoxu{1F5+;GDco^aK`Ajyg%3s)nLs#cnorSu}P9rBUY(AC4`_77fte~0#W zxM+7k^KZ_;>JNiwEbRpa{%-J^6Eq#C`N?|b54bL&c~5nT9uzbuyngszwr?Dh-GoUa zQJJ^Xusn5pINN&OFIieIWwJ27@f(-;{DtpHOI2DpU)^0s%(b+R3U57L}3$c z*tGsSW(9;FJp{;fniv+QkOwcOAD2?5mio6Nav%htdgMZHKabnP3)o>#J&S_k3LVWD zth+u=fJ=qU*WbDV#Gc1ZS}s^@XhG>vDWfN3Bvz=yaKmfP*#YpiST>MS}sTKTlMEW6puTTcXs1lXyPMz5Fcwu=$f zHLtnw$1I$1)F0hvYhhNKW?U5Za39c^G3nX@=Xns`7y5cM(^Gp2j(p6Zm#KU9%%yU!X@cv z%99P%hGycqTIjffo@t5^l;K@8sW?6(hK|HUGwGz$5-hr<03~P#Jli9s2d4J=4@_$f zu#K4ncnI{4UoeNpA9YZeF*&>J(=GWOJV|S6`*xm1=`}aK8)DxSF+K43EYdW*1E)^9 z!n{Iva&a}7KhAN0+E{lBC{%@KpHH_vl^REJd*aTQ@M?a6=rt9YNgUrJm_614jZ$WU zANy)&1;dqT8&iJy)3cIudVL%_I~_uUxEs~8m8P|v9z2QjcV;I^Cf%!>chirr(e^KY zv~vKG?BYRGFfgxS{ad)D`!nW}0k&m+Z2uN@aehYKe>mo!z<&$6KY{3Y1;`Cl_&f0b z#@_#5@Av%nYrQ#i*