Subscription date : 26 October 2008
Messages : 1904
|
Si c'est du bash tu peut faire des conditions et lancer une commande dbus..genre notification .. |
Subscription date : 21 October 2009
Messages : 1575
|
Mais est-ce la commande pourrait changer les couleurs des chiffres, ou ajouter un cercle à l'intérieur des chiffres et faire flasher? Ça prend qque chose de pas trop intrusif, donc ça doit être inclus dans l'applet plutôt qu'une notification à l'externe.
En fait c'est exactement ce que fait gkrellm. En matière de system monitor, y a rien qui bât les fonctions de gkrellm! C'est pour ça que je l'utilise encore, même si graphiquement il jure à tout casser avec KDE4. Aucun autre monitor ne lui va à la cheville, pour l'instant (ça fait déjà des années). |
matttbe, Wednesday 30 June 2010 à 21:39
|
|
Subscription date : 24 January 2009
Messages : 12573
|
N'hésite pas à donner des idées plus précises, voir des mockups, c'est tjs utile ! |
Subscription date : 21 October 2009
Messages : 1575
|
Ah oui? Cool. Alors c'est simple, tout ce que je veux est ici :
En ordre de haut en bas :
- Core % load (user + system + total)
- Core temps + Core number
- Top (3 minimum)
- GPU C (nvidia)
- CPU temp
- Case temp
- Disk temps
- Bridge temp
- CPU Fan
- Case Fan 1
- Case Fan 2
- Case Fan 3
- Core voltage
- Disk I/O Read + Write in Kb/sec (Mb/s lorsque 1000k+)
- Network usage Transmit + Receive of the day in Kb/sec et Mb/sec quand 1000k+
- Network usage Transmit + Receive cumulative from date x to date x of next month (resets at the date you want, every week, month or year) in Kb/sec et Mb/sec quand 1000k+
- RAM usage (free, system, user, used, etc.)
- SWAP (même chose)
- Each partition usage in % or Kb-Mb-Gb (free, used, total)
- Up time in days, hours, mins
- Network IP
Puis des alarmes sur presque tout, haute et basse, warning et critical (donc 4 alarmes par fonction).
Comme ça :
Et ça, c'est pas bcp, car gkrellm peut faire tellement plus, tu peux déplacer les chiffres ou tu veux, faire des retour de chariot, agrandir ou réduire la taille de chaque senseur, etc...
Avec ça, tu vas remporter des prix c'est certain! Mais j'en convient que c'est pas évident!! Et très long! Mais peut-être peut on commencer qque part si on pense pouvoir tout faire un jour...
J'ai aussi bâti un script que j'ai testé pour un programme remplaçant et il a presque tout, sauf qu'il ne peut pas avoir d'alarmes (moi c'est important).
Ça vient de yasp script KDE http://kde-look.org/content/show.php/Yasp-Scripted?content=109367
###################################################################################################
########################## Yasp Script ###############################
################ openSUSE 11.2 QUAD Cores - Fans, Temps, HDD, VCore #################################
###################################################################################################
default title:color="white" title:font="Dejavu Sans, 13" title:shadow="Sunken" title:alignment="Center"
default value:color="white" value:font="Dejavu Sans, 8" value:alignment="Left"
title text="System"
default interval="single"
sensor name="Hostname" type="program" cmd="hostname"
sensor name="Date" type="program" cmd="date | cut -c1-10"
sensor name="KernelVersion" type="program" cmd="uname -r"
default interval="30000"
sensor name="UptimeSecs" type="engine" cmd="systemmonitor:system/uptime:value"
sensor name="UptimeDays" type="math" use="UptimeSecs" math="int $1 86400 /"
sensor name="UptimeHours" type="math" use="UptimeSecs" use="UptimeDays" math="int $1 86400 $2 * - 3600 /"
sensor name="UptimeMinutes" type="math" use="UptimeSecs" use="UptimeDays" use="UptimeHours" math="int $1 86400 $2 * - 3600 $3 * - 60 /"
#use sed for LoadAverage
default interval="60000"
#sensor name="LoadAverage1mn" type="program" cmd="uptime | cut -c46-49"
#sensor name="LoadAverage5mn" type="program" cmd="uptime | cut -c52-55"
#sensor name="LoadAverage15mn" type="program" cmd="uptime | cut -c58-62"
sensor name="LoadAverage" type="program" cmd=%uptime | cut -d":" -f4%
value key=" " use="Hostname" use="Date" use="KernelVersion" format="$1, $2 - Kernel $3"
#value key="Kernel" use="KernelVersion"
value key="Uptime: " use="UptimeDays" use="UptimeHours" use="UptimeMinutes" format="$1 day(s) $2 h $3 m"
#value key="Load Average: " use="LoadAverage1mn" use="LoadAverage5mn" use="LoadAverage15mn" format="$1 1min, $2 5mins, $3 15mins"
value key="Load Average:" use="LoadAverage"
title text="Temperatures"
default interval="single"
sensor name="NVDriver" type="program" cmd="nvidia-settings -q NvidiaDriverVersion | grep 0.0 | sed -e 's/^.*: \(.*\)$/\1/'"
default interval="3000"
sensor name="CpuFreq" type="engine" cmd="systemmonitor:cpu/cpu0/clock:value" math="int $0"
sensor name="GPU" type="program" cmd="nvidia-settings -q GPUCoreTemp | grep 0.0 | sed -e 's/^.*: \(.*\)\./\1/'"
value icon="/usr/share/doc/NVIDIA_GLX-1.0/nvidia-settings.png" key=" " use="NVDriver" use="GPU" format="Driver: $1\nGPU Temp: $2?\n"
sensor name="CPUTemp" type="program" cmd=%sensors | grep -A1 "temp1" | xargs | sed "s/.*: +\([0-9].....\).* \(+[0-9].*\)/\1/"%
sensor name="Cpu0Load" type="engine" cmd="systemmonitor:cpu/cpu0/TotalLoad:value" math="int $0"
sensor name="Cpu1Load" type="engine" cmd="systemmonitor:cpu/cpu1/TotalLoad:value" math="int $0"
sensor name="Cpu2Load" type="engine" cmd="systemmonitor:cpu/cpu2/TotalLoad:value" math="int $0"
sensor name="Cpu3Load" type="engine" cmd="systemmonitor:cpu/cpu3/TotalLoad:value" math="int $0"
sensor name="Core0Temp" type="program" cmd=%sensors | grep -A1 "Core 0" | xargs | sed "s/.*: +\([0-9].....\).* \(+[0-9].*\)/\1/"%
sensor name="Core1Temp" type="program" cmd=%sensors | grep -A1 "Core 1" | xargs | sed "s/.*: +\([0-9].....\).* \(+[0-9].*\)/\1/"%
sensor name="Core2Temp" type="program" cmd=%sensors | grep -A1 "Core 2" | xargs | sed "s/.*: +\([0-9].....\).* \(+[0-9].*\)/\1/"%
sensor name="Core3Temp" type="program" cmd=%sensors | grep -A1 "Core 3" | xargs | sed "s/.*: +\([0-9].....\).* \(+[0-9].*\)/\1/"%
sensor name="SysTemp" type="program" cmd="sensors | grep temp1 | sed -e 's/^.*: *+\([1-9].....\) .*/\1/'"
sensor name="sda" type="program" cmd="sudo hddtemp /dev/sda | sed -e 's/^.*sd.: //'"
sensor name="sdb" type="program" cmd="sudo hddtemp /dev/sdb | sed -e 's/^.*sd.: //'"
sensor name="sdf" type="program" cmd="sudo hddtemp /dev/sdf | sed -e 's/^.*sd.: //'"
sensor name="Bridge" type="program" cmd="sensors | grep temp3 | cut -c14-20"
#sensor name="Bridge" type="program" cmd="sensors | grep temp3 | sed -e 's/^.*: *+\([1-9].....\) .*/\1/'"
sensor name="Vcore" type="program" cmd=%sensors | grep "Vcore Voltage" | xargs | sed "s/.*: +\([0-9].....\).* \(+[0-9].*\)/\1/"%
value key="CPU Frequency" use="CpuFreq" format="$1 MHz"
value key="CPU Temp" use="CPUTemp"
value key="Core0 Temp" use="Core0Temp"
value key="Core1 Temp" use="Core1Temp"
value key="Core2 Temp" use="Core2Temp"
value key="Core3 Temp" use="Core3Temp"
value key="/dev/sda" use="sda"
value key="/dev/sdb" use="sdb"
value key="/dev/sdf" use="sdf"
value key="Bridge Temp" use="Bridge"
value key="Vcore" use="Vcore"
valeu key="Case Temp" use="SysTemp"
plotter use="Cpu0Load" use="Cpu1Load" use="Cpu2Load" use="Cpu3Load" plot="$1" color="red" plot="$2" color="white" plot="$3" color="green" plot="$4" color="blue" min="0" max="100" height="50"
title text="Fan Speeds"
default interval="3000"
sensor name="CPU Fan" type="program" cmd="sensors | grep fan2 | sed -e 's/^.* \([1-9].* RPM\) .*/\1/'"
sensor name="Case Fan 1" type="program" cmd="sensors | grep fan3 | sed -e 's/^.* \([1-9].* RPM\) .*/\1/'"
sensor name="Case Fan 2" type="program" cmd="sensors | grep fan5 | cut -c13-16"
#sensor name="Case Fan 2" type="program" cmd="sensors | grep fan5 | sed -e 's/^.* \([1-9].* RPM\) .*/\1/'"
sensor name="Case Fan 3" type="program" cmd="sensors | grep fan1 | sed -e 's/^.* \([1-9].* RPM\) .*/\1/'"
value key=" " use="CPU Fan" use="Case Fan 1" use="Case Fan 2" use="Case Fan 3" format="CPU Fan: $1\nCase Fan 1: $2\nCase Fan 2: $3\nCase Fan 3: $4"
title text="Network"
default interval="single"
sensor name="Eth0Ip" type="program" cmd=%/sbin/ifconfig eth0 | grep "inet addr" | cut -d":" -f2 | cut -d" " -f1%
default interval="1000"
sensor name="Eth0Down" type="engine" cmd="systemmonitor:network/interfaces/eth0/receiver/data:value"
sensor name="Eth0Up" type="engine" cmd="systemmonitor:network/interfaces/eth0/transmitter/data:value"
value icon="oxygen/22x22/places/network-workgroup.png" iconsize="22" key=" " use="Eth0Ip" use="Eth0Up" format="IP eth0: $1" alignment="Center" format="Up: $2 kB/s" alignment="Right"
plotter use="Eth0Down" use="Eth0Up" min="0" max="1500" plot="$1" color="green" plot="$2" color="red" height="50"
value key=" " use="Eth0Down" format="Down: $1 kB/s" alignment="Right"
title text="Partitions and Memory"
default interval="3000"
sensor name="RamApplicationMb" type="engine" cmd="systemmonitor:mem/physical/application:value" math="int $0 1024 /"
sensor name="RamTotalMb" type="program" cmd=$cat /proc/meminfo | grep MemTotal | sed -e "s/MemTotal: *\([0-9]*\).*/\1/"$ math="int $0 1024 /" interval="single"
sensor name="SwapMbUsed" type="engine" cmd="systemmonitor:mem/swap/used:value" math="int $0 1024 /"
sensor name="SwapMbFree" type="engine" cmd="systemmonitor:mem/swap/free:value" math="int $0 1024 /"
sensor name="SwapMbTotal" use="SwapMbUsed" type="engine" cmd="systemmonitor:mem/swap/free:value" math="int $0 1024 / $1 +"
sensor name="RootUsed" type="engine" cmd="systemmonitor:partitions/root/usedspace:value" math="int $0 256 /"
sensor name="RootFree" type="engine" cmd="systemmonitor:partitions/root/freespace:value" math="int $0 1024 /"
sensor name="RootTotal" use="RootUsed" type="engine" cmd="systemmonitor:partitions/root/freespace:value" math="int $0 256 / $1 +"
sensor name="HomeUsed" type="engine" cmd="systemmonitor:partitions/home/usedspace:value" math="int $0 256 /"
sensor name="HomeFree" type="engine" cmd="systemmonitor:partitions/home/freespace:value" math="int $0 1024 /"
sensor name="HomeTotal" use="HomeUsed" type="engine" cmd="systemmonitor:partitions/home/freespace:value" math="int $0 256 / $1 +"
sensor name="tmpUsed" type="engine" cmd="systemmonitor:partitions/tmp/usedspace:value" math="int $0 256 /"
sensor name="tmpFree" type="engine" cmd="systemmonitor:partitions/tmp/freespace:value" math="int $0 1024 /"
sensor name="tmpTotal" use="tmpUsed" type="engine" cmd="systemmonitor:partitions/tmp/freespace:value" math="int $0 256 / $1 +"
sensor name="imgUsed" type="engine" cmd="systemmonitor:partitions/img/usedspace:value" math="int $0 256 /"
sensor name="imgFree" type="engine" cmd="systemmonitor:partitions/img/freespace:value" math="int $0 1024 /"
sensor name="imgTotal" use="imgUsed" type="engine" cmd="systemmonitor:partitions/img/freespace:value" math="int $0 256 / $1 +"
sensor name="VMUsed" type="engine" cmd="systemmonitor:partitions/VM/usedspace:value" math="int $0 256 /"
sensor name="VMFree" type="engine" cmd="systemmonitor:partitions/VM/freespace:value" math="int $0 1024 /"
sensor name="VMTotal" use="VMUsed" type="engine" cmd="systemmonitor:partitions/VM/freespace:value" math="int $0 256 / $1 +"
sensor name="moviesUsed" type="engine" cmd="systemmonitor:partitions/movies/usedspace:value" math="int $0 256 /"
sensor name="moviesFree" type="engine" cmd="systemmonitor:partitions/movies/freespace:value" math="int $0 1024 /"
sensor name="moviesTotal" use="moviesUsed" type="engine" cmd="systemmonitor:partitions/movies/freespace:value" math="int $0 256 / $1 +"
meter use="RamApplicationMb" use="RamTotalMb" label:0="Ram" label:1="$1 used of $2 Mb" alignment:1="right" min="0" max="$2" value="$1"
meter use="SwapMbUsed" use="SwapMbFree" use="SwapMbTotal" label:0="Swap $3 Mb\$1 Mb used" label:1="$2 Mb free" alignment:1="right" min="0" max="$3" value="$1"
meter use="RootUsed" use="RootFree" use="RootTotal" label:0="root $3 Mb\$1 Mb used" label:1="$2 Mb free" alignment:1="right" min="0" max="$3" value="$1"
meter use="HomeUsed" use="HomeFree" use="HomeTotal" label:0="home $3 Mb\$1 Mb used" label:1="$2 Mb free" alignment:1="right" min="0" max="$3" value="$1"
meter use="tmpUsed" use="tmpFree" use="tmpTotal" label:0="tmp $3 Mb\$1 Mb used" label:1="$2 Mb free" alignment:1="right" min="0" max="$3" value="$1"
meter use="imgUsed" use="imgFree" use="imgTotal" label:0="img $3 Mb\$1 Mb used" label:1="$2 Mb free" alignment:1="right" min="0" max="$3" value="$1"
meter use="VMUsed" use="VMFree" use="VMTotal" label:0="VM $3 Mb\$1 Mb used" label:1="$2 Mb free" alignment:1="right" min="0" max="$3" value="$1"
meter use="moviesUsed" use="moviesFree" use="moviesTotal" label:0="movies $3 Mb\$1 Mb used" label:1="$2 Mb free" alignment:1="right" min="0" max="$3" value="$1"
default interval="1000"
title text="Top"
sensor name="Top" type="program" cmd="ps axo comm,user,pid,pcpu,pmem --sort -%cpu | head -5"
text use="Top" font="Monospace, 8"
Et voici ce que me retourne "sensors"
frank@oskde64:~> sensors
coretemp-isa-0000
Adapter: ISA adapter
Core 0: +39.0°C (high = +82.0°C, crit = +100.0°C)
coretemp-isa-0001
Adapter: ISA adapter
Core 1: +40.0°C (high = +82.0°C, crit = +100.0°C)
coretemp-isa-0002
Adapter: ISA adapter
Core 2: +31.0°C (high = +82.0°C, crit = +100.0°C)
coretemp-isa-0003
Adapter: ISA adapter
Core 3: +36.0°C (high = +82.0°C, crit = +100.0°C)
w83627dhg-isa-0290
Adapter: ISA adapter
Vcore: +1.16 V (min = +0.00 V, max = +1.74 V)
in1: +1.71 V (min = +1.02 V, max = +1.02 V) ALARM
AVCC: +3.30 V (min = +1.02 V, max = +0.54 V) ALARM
VCC: +3.30 V (min = +2.06 V, max = +1.41 V) ALARM
in4: +1.38 V (min = +0.51 V, max = +0.05 V) ALARM
in5: +1.64 V (min = +0.01 V, max = +1.54 V) ALARM
in6: +1.40 V (min = +0.26 V, max = +0.00 V) ALARM
3VSB: +3.30 V (min = +0.00 V, max = +0.29 V) ALARM
Vbat: +3.26 V (min = +2.06 V, max = +2.08 V) ALARM
fan1: 680 RPM (min = 2636 RPM, div = 32) ALARM
fan2: 874 RPM (min = 1298 RPM, div = 8) ALARM
fan3: 691 RPM (min = 2343 RPM, div = 32) ALARM
fan5: 691 RPM (min = 329 RPM, div = 32)
temp1: +27.0°C (high = +9.0°C, hyst = +112.0°C) sensor = thermistor
temp2: +26.0°C (high = +80.0°C, hyst = +75.0°C) sensor = diode
temp3: +121.5°C (high = +80.0°C, hyst = +75.0°C) ALARM sensor = thermistor |
matttbe, Friday 02 July 2010 à 13:13
|
|
Subscription date : 24 January 2009
Messages : 12573
|
Je pense que tu peux déjà avoir la majorité des info avec des commandes bash (avec l'utilisation des grep, tail, head, cut, etc.) mais en effet, ce serait plus simple d'avoir des commandes toutes prêtes  |
Subscription date : 21 October 2009
Messages : 1575
|
Oui avec le bash, comme on voit dans mes scripts, on peut aller chercher presque tout, y a plusieurs calculs mathématiques à faire, mais sinon avec les sensors tout est là par bash ou presque.
Y a juste les alarmes là c'est autre chose. |
matttbe, Saturday 03 July 2010 à 02:50
|
|
Subscription date : 24 January 2009
Messages : 12573
|
Tu sais faire des calculs en bash et utiliser des conditions (pour les alarmes)
Mais ce serait plus simple pour l'utilisateur si des outils étaient déjà prévus  |
Subscription date : 21 October 2009
Messages : 1575
|
Moi? Oh non je ne sais pas faire des calculs en bash et conditions :), j'ai repris une base et je l'ai modifiée et adaptée à c'que je voulais, avec oui des calculs différents, mais j'ai fouillé longtemps pour le faire. Sinon ça s'arrête là.
gkrellm a tous les outils, car tout est dans le GUI, en effet. C'est pour ça qu'il n'est pas battable. Mais c long bâtir tous les outils! C ça le problème... et je ne sais pas si on veut faire ça avec Doncky... |
Subscription date : 26 October 2008
Messages : 1904
|
Oups j'avais oublie la demande de Nochka...
Voila mes donky dans la nouvelle version...
Le lien vers les polices.
Santos Dumont http://img.dafont.com/dl/?f=santos_dumont
A Bite http://img.dafont.com/dl/?f=a_bite
<doncky>
<!-- Time -->
<alignW>center</alignW>
<font>Santos Dumont 90</font>
<color>255;255;255;255</color>
<cmd>
<echo>`uptime | cut -d" " -f2`</echo>
<refresh>1</refresh>
</cmd>
<br>2</br>
<alignW>right</alignW>
<font>A bite 24</font>
<color>255;255;255;255</color>
<txt>TIME </txt>
</doncky>
Affichage...
 |
matttbe, Tuesday 13 July 2010 à 00:30
|
|
Subscription date : 24 January 2009
Messages : 12573
|
Si vous voulez je peux donner les scripts pour ceux que ca interesse il y a un script Zeitgest, 3 script pour la conso 3G, un script pour les contacts Pidgins et un script pour l'IP derriere un proxy.. Of course  |
Subscription date : 26 October 2008
Messages : 1904
|
Ok alors le script zeitgest en python( Activities) ( il faut avoir zeitgest d'installe)
il faut lancer avec un chiffre x qui va definir les x dernieres activites...
#! /usr/bin/env python
# -.- coding: utf-8 -.-
import sys
import os
import locale
import time
import codecs
from datetime import datetime, date, time
from zeitgeist.client import ZeitgeistDBusInterface
from zeitgeist.datamodel import *
if not len(sys.argv) == 2 or not sys.argv[1].isdigit():
print 'Usage: %s <number of events>' % sys.argv[0]
sys.exit(1)
zeitgeist = ZeitgeistDBusInterface()
results = zeitgeist.FindEvents(TimeRange.always(),
[],
StorageState.Any,
sys.argv[1],
ResultType.MostRecentSubjects)
results = [Event(result) for result in results]
for event in results:
subjects = event.get_subjects()
timestamp = float(event.get_timestamp()) / 1000
date_event = date.fromtimestamp(timestamp)
date1 = date_event.strftime("%d %B")
interpretation = event.get_interpretation().split('#')[-1]
#manifestation = event.get_manifestation().split('#')[-1]
uri = subjects[0].get_uri()
if len(subjects) > 1:
uri += ' (and others)'
#u = unicode (uri, "utf-8")
#backToBytes = u.encode( "utf-8" )
#print '[%d] %s %s: %s' % (timestamp, manifestation, interpretation, uri)
print '%s %s' %(date1, uri)
Pour la conso 3g (ppp0)=3g vous pouvez changer et regarder la conso autre que 3g mais moi les autres m'interessent pas..
Il faut avoir le paquet vnstat d'installe.
Et apres il y a 3 script
un pour la conso du jour.
#!/bin/sh
vnstat -i ppp0 | grep "today" | awk '{print $8 $9}'
Conso a hebdomadaire
#!/bin/sh
vnstat -w -i ppp0 | grep "last 7 days" | awk '{print $10 $11}'
Conso du mois
#!/bin/sh
export LC_ALL=en_EN.UTF-8
vnstat -m -i ppp0 | grep "`date +"%b '%y"`" | awk '{print $9 $10}'
Ok pour l'adresse IP
#!/bin/bash
# voir ip derriere routeur
wget http://checkip.dyndns.org/ -O - -o /dev/null | cut -d: -f 2 | cut -d\< -f 1 > ip
cat ip
et en dernier le script pidgin la rien de moi tout vient du conky Pidgin..
#!/usr/bin/python
# -*- coding: utf-8 -*-
###############################################################################
# conkyPidgin.py is a simple python script to display
# details of pidgin buddies, for use in conky.
#
# Author: Kaivalagi
# Created: 03/11/2008
# Modifications:
# 03/11/2008 Added --onlineonly option to only show online buddies in the list
# 03/11/2008 Added --ignorelist to handle ignoring unwanted pidgin buddy output
# 03/11/2008 Added --includelist to handle including only wanted pidgin buddy output
# 03/11/2008 Updated to handle buddy group and status_messages
# 03/11/2008 Updated to display a status of "Chatting" when the buddy is messaging
# 04/11/2008 Status message Now html striped from the text
# 07/11/2008 Updated --ignorelist and --includelist options to be based on group names rather than buddy names, not case sensitive now either
# 07/11/2008 Added --onlinetext, --offlinetext and --chattingtext options to set custom text for status output
# 08/11/2008 Updated sorting to not be case sensitive and be ordered by status (chatting, online then offline), group then alias
# 10/11/2008 Added --errorlog and --infolog options to log data to a file
# 12/10/2008 Updated to now handle available, unavailable, invisible, away and mobile statuses. All have thier own text options for output.
# 12/10/2008 Added --availableonly option to only show available buddies
# 14/10/2008 Added code to cope with no match on statustype, will output available in this case...
# 15/11/2008 Now loading the template file in unicode mode to allow for the extended character set
# 18/11/2008 Changed option tags from <...> to [...], so <eta> now needs to be [eta] in the template to work
# 16/12/2008 Fixed buddy status handling
# 07/01/2009 Updated to sort based on activity in logs initially, falling back to groups then names after that in case no logging is switched on
# 07/01/2009 Added --limit option to restrict the number of buddies output, works in conjunction with new sort method
# 08/01/2009 Added --sortbylogactivity to change the sorting method to log file based, if not used default sorting by status, group then alias is done as before
# 17/01/2009 Added --offlineonly option, so only offline buddies are displayed in the list...
# 18/05/2009 Updated to expand ~ based template paths
# 27/06/2009 Updated to make safe the output, replacing "${exec" text with "$e!noexec!", to stop unwanted conky execution
from datetime import datetime
from htmlentitydefs import name2codepoint
from optparse import OptionParser
import re
import sys
import traceback
import codecs
import os
import stat
try:
import dbus
DBUS_AVAIL = True
except ImportError:
# Dummy D-Bus library
class _Connection:
get_object = lambda *a: object()
class _Interface:
__init__ = lambda *a: None
ListNames = lambda *a: []
class Dummy: pass
dbus = Dummy()
dbus.Interface = _Interface
dbus.service = Dummy()
dbus.service.method = lambda *a: lambda f: f
dbus.service.Object = object
dbus.SessionBus = _Connection
DBUS_AVAIL = False
class CommandLineParser:
parser = "none"
def __init__(self):
self.parser = OptionParser()
self.parser.add_option("-t", "--template", dest="template", type="string", metavar="FILE", help=u"Template file determining the format for each buddy's data. Use the following placeholders: [name], [alias], [group], [status], [status_message].")
self.parser.add_option("-o", "--onlineonly", dest="onlineonly", default=False, action="store_true", help=u"Only show online buddies")
self.parser.add_option("-a", "--availableonly", dest="availableonly", default=False, action="store_true", help=u"Only show available buddies")
self.parser.add_option("-f", "--offlineonly", dest="offlineonly", default=False, action="store_true", help=u"Only show offline buddies")
self.parser.add_option("-i", "--ignorelist", dest="ignorelist", type="string", metavar="LIST", help=u"A comma delimited list of groups to ignore. Partial text matches on group will be ignored if found")
self.parser.add_option("-I", "--includelist", dest="includelist", type="string", metavar="LIST", help=u"A comma delimited list of groups to include. Partial text matches on group will be included if found. The ignorelist, if used, takes precedence. if this list is omitted all groups will be included unless ignored.")
self.parser.add_option("-C", "--chattingtext", dest="chattingtext", type="string", default="Chatting", metavar="TEXT", help=u"[default: %default] Text to use for chatting status output")
self.parser.add_option("-A", "--availabletext", dest="availabletext", type="string", default="Available", metavar="TEXT", help=u"[default: %default] Text to use for available status output")
self.parser.add_option("-U", "--unavailabletext", dest="unavailabletext", type="string", default="Unavailable", metavar="TEXT", help=u"[default: %default] Text to use for unavailable status output")
self.parser.add_option("-N", "--invisibletext", dest="invisibletext", type="string", default="Invisible", metavar="TEXT", help=u"[default: %default] Text to use for invisible status output")
self.parser.add_option("-W", "--awaytext", dest="awaytext", type="string", default="Away", metavar="TEXT", help=u"[default: %default] Text to use for away status output")
self.parser.add_option("-M", "--mobiletext", dest="mobiletext", type="string", default="Mobile", metavar="TEXT", help=u"[default: %default] Text to use for mobile status output")
self.parser.add_option("-F", "--offlinetext", dest="offlinetext", type="string", default="Offline", metavar="TEXT", help=u"[default: %default] Text to use for offline status output")
self.parser.add_option("-l", "--limit", dest="limit", type="int", default=0, metavar="NUMBER", help=u"[default: %default] Set a limit to the number of buddies displayed, by default no limitation is made")
self.parser.add_option("-s", "--sortbylogactivity", dest="sortbylogactivity", default=False, action="store_true", help=u"If used the list is sorted by most recent activity first, this is useful when limiting the list size with the limit option")
self.parser.add_option("-v", "--verbose", dest="verbose", default=False, action="store_true", help=u"Request verbose output, not a good idea when running through conky!")
self.parser.add_option("-V", "--version", dest="version", default=False, action="store_true", help=u"Displays the version of the script.")
self.parser.add_option("--errorlogfile", dest="errorlogfile", type="string", metavar="FILE", help=u"If a filepath is set, the script appends errors to the filepath.")
self.parser.add_option("--infologfile", dest="infologfile", type="string", metavar="FILE", help=u"If a filepath is set, the script appends info to the filepath.")
def parse_args(self):
(options, args) = self.parser.parse_args()
return (options, args)
def print_help(self):
return self.parser.print_help()
class PidginData:
def __init__(self, name, alias, group, status, status_message, activitydatetime):
self.name = name
self.alias = alias
self.group = group
self.status = status
self.status_message = status_message
self.activitydatetime = activitydatetime
def __cmp__(self, other):
return cmp(str(self.status)+self.group.lower()+self.alias.lower(), str(other.status)+other.group.lower()+other.alias.lower())
def __str__(self):
return str(self.name+"("+self.alias+")")
class PidginInfo:
STATUS_OFFLINE = 1
STATUS_AVAILABLE = 2
STATUS_UNAVAILABLE = 3
STATUS_INVISIBLE = 4
STATUS_AWAY = 5
STATUS_EXTENDED_AWAY = 6
STATUS_MOBILE = 7
STATUS_TUNE = 8
TEXT_CHATTING = 1
TEXT_AVAILABLE = 2
TEXT_UNAVAILABLE = 3
TEXT_INVISIBLE = 4
TEXT_AWAY = 5
TEXT_MOBILE = 6
TEXT_OFFLINE = 7
PIDGIN_LOGS_PATH = "~/.purple/logs"
def __init__(self, options):
self.options = options
def testDBus(self, bus, interface):
obj = bus.get_object('org.freedesktop.DBus', '/org/freedesktop/DBus')
dbus_iface = dbus.Interface(obj, 'org.freedesktop.DBus')
avail = dbus_iface.ListNames()
return interface in avail
def getStatusText(self, status):
if status == self.TEXT_CHATTING:
return self.options.chattingtext
elif status == self.TEXT_AVAILABLE:
return self.options.availabletext
elif status == self.TEXT_UNAVAILABLE:
return self.options.unavailabletext
elif status == self.TEXT_INVISIBLE:
return self.options.invisibletext
elif status == self.TEXT_AWAY:
return self.options.awaytext
elif status == self.TEXT_MOBILE:
return self.options.mobiletext
elif status == self.TEXT_OFFLINE:
return self.options.offlinetext
else:
return ""
def getOutputFromTemplate(self, template, name, alias, group, status, status_message):
try:
output = template
output = output.replace("[name]",name)
output = output.replace("[alias]",alias)
output = output.replace("[group]",group)
output = output.replace("[status]",self.getStatusText(status))
output = output.replace("[status_message]",status_message)
# get rid of any excess crlf's
output = output.rstrip(" \n")
return output
except Exception,e:
self.logError("getOutputFromTemplate:Unexpected error:" + e.__str__())
return ""
def getPidginData(self):
pidginDataList = []
try:
bus = dbus.SessionBus()
if self.testDBus(bus, 'im.pidgin.purple.PurpleService'):
self.logInfo("Setting up dbus interface")
remote_object = bus.get_object("im.pidgin.purple.PurpleService","/im/pidgin/purple/PurpleObject")
iface = dbus.Interface(remote_object, "im.pidgin.purple.PurpleService")
self.logInfo("Calling dbus interface for IM data")
# Iterate through every active account
for acctID in iface.PurpleAccountsGetAllActive():
# get all the buddies associated with that account
buddies = iface.PurpleFindBuddies(acctID,"")
for buddyid in buddies:
groupid = iface.PurpleBuddyGetGroup(buddyid)
# get initial data
alias = iface.PurpleBuddyGetAlias(buddyid)
name = iface.PurpleBuddyGetName(buddyid)
online = iface.PurpleBuddyIsOnline(buddyid)
group = iface.PurpleGroupGetName(groupid)
if self.ignoreGroup(group) == False:
if self.includeGroup(group) == True:
addBuddy = False
if self.options.onlineonly == True:
if online == 1:
addBuddy = True
elif self.options.offlineonly == True:
if online == 0:
addBuddy = True
else:
addBuddy = True
if addBuddy == True:
# determine whether to show this buddies details based on onlineonly option
#if online == 1 or self.options.onlineonly == False:
available = 0
# retrieve buddy status
presenceid = iface.PurpleBuddyGetPresence(buddyid)
status = iface.PurplePresenceGetActiveStatus(presenceid)
# get extended message if set
status_message = self.getCleanText(iface.PurpleStatusGetAttrString(status, "message")) # getCleanText needed for google encoded text
# get the status type, id and text
statustype = iface.PurpleStatusGetType(status)
statusid = iface.PurpleStatusTypeGetPrimitive(statustype)
statustypetext = iface.PurpleStatusTypeGetId(statustype)
if online == 1:
if self.isBuddyChatting(name,iface):
statustext = self.TEXT_CHATTING
available = 1
else:
if statusid == self.STATUS_AVAILABLE:
statustext = self.TEXT_AVAILABLE
available = 1
elif statusid == self.STATUS_UNAVAILABLE:
statustext = self.TEXT_UNAVAILABLE
elif statusid == self.STATUS_INVISIBLE:
statustext = self.TEXT_INVISIBLE
elif statusid == self.STATUS_AWAY or statusid == self.STATUS_EXTENDED_AWAY:
statustext = self.TEXT_AWAY
elif statusid == self.STATUS_MOBILE:
statustext = self.TEXT_MOBILE
elif statusid == self.STATUS_TUNE:
#TODO: need icon for STATUS_TUNE whatever that is...
statustext = self.TEXT_AVAILABLE
else: # catch all in case no match on statustype, guess available
statustext = self.TEXT_AVAILABLE
else:
statustext = self.TEXT_OFFLINE
# determine whether to show this buddies details based on availableonly option
if available == 1 or self.options.availableonly == False:
# get latest activity datetime
activitydatetime = self.getBuddyActivityDatetime(self.PIDGIN_LOGS_PATH, name)
self.logInfo("Adding IM data for buddy '%s', status type '%s' -> status text '%s'"%(alias, statustypetext, self.getStatusText(statustext)))
pidginData = PidginData(name, alias, group, statustext, status_message, activitydatetime)
pidginDataList.append(pidginData)
# tidy up
del iface
del remote_object
del bus
# sort the list
if self.options.sortbylogactivity == True:
pidginDataList.sort(key=lambda obj: obj.activitydatetime,reverse=True)
else:
pidginDataList.sort()
return pidginDataList
except Exception, e:
self.logError("Issue calling the dbus service:"+e.__str__())
def writeOutput(self):
if self.options.template == None:
# create default template
template = "[alias] ([group]) - [status]\n [status_message]"
else:
# load the template file contents
try:
fileinput = codecs.open(os.path.expanduser(self.options.template), encoding='utf-8')
template = fileinput.read()
fileinput.close()
except:
self.logError("Template file no found!")
sys.exit(2)
try:
pidginDataList = self.getPidginData()
self.logInfo("Outputting buddy information...")
buddyCount = 0
for pidginData in pidginDataList:
# keep a tally of buddies output, if past the limit then exit
if self.options.limit <> 0:
buddyCount = buddyCount+1
if buddyCount > self.options.limit:
break
# output pidgin buddy data using the template
output = self.getOutputFromTemplate(template, pidginData.name, pidginData.alias, pidginData.group, pidginData.status, pidginData.status_message)
output = self.getMadeSafeOutput(output)
print output.encode("utf-8")
except SystemExit:
self.logError("System Exit!")
return u""
except Exception, e:
traceback.print_exc()
self.logError("Unknown error when calling writeOutput:" + e.__str__())
return u""
def getBuddyActivityDatetime(self, basefolder, buddyname):
basefolder = os.path.expanduser(basefolder)
latestmodifieddatetime = datetime(2000, 1, 1, 0, 0)
# if the folder passed in is non existant return an empty list
if os.path.exists(basefolder):
# for each file or folder
for root, dirs, files in os.walk(basefolder):
for dir in dirs:
if dir == buddyname:
buddypath = os.path.join(root,dir)
moddatetime = self.getLatestLogFileModificationDatetime(buddypath, latestmodifieddatetime)
if moddatetime > latestmodifieddatetime:
latestmodifieddatetime = moddatetime
return latestmodifieddatetime
def getLatestLogFileModificationDatetime(self, folderpath, latestmodifieddatetime):
for file in os.listdir(folderpath):
filepath = os.path.join(folderpath,file)
if os.path.isfile(filepath):
modifieddate = datetime.fromtimestamp(os.stat(filepath)[stat.ST_MTIME])
if modifieddate > latestmodifieddatetime:
latestmodifieddatetime = modifieddate
return latestmodifieddatetime
def isBuddyChatting(self,name,iface):
imids = iface.PurpleGetIms()
for imid in imids:
convname = iface.PurpleConversationGetName(imid)
if convname == name:
return True
return False
def ignoreBuddy(self, name, alias):
if self.options.ignorelist != None:
# for each text in the ignore list, should we be ignoring the buddy
for ignore in self.options.ignorelist.split(","):
# has the buddy been found in the list item
if name.lower().find(ignore.lower()) != -1 or alias.lower().find(ignore.lower()) != -1:
return True
return False
else:
return False
def includeBuddy(self, name, alias):
if self.options.includelist != None:
# for each text in the ignore list, should we be ignoring the buddy
for include in self.options.includelist.split(","):
# has the buddy been found in the list item
if name.lower().find(include.lower()) != -1 or alias.lower().find(include.lower()) != -1:
return True
return False
else:
return True
def ignoreGroup(self, group):
if self.options.ignorelist != None:
# for each text in the ignore list, should we be ignoring the buddy in the group
for ignore in self.options.ignorelist.split(","):
# has the group been found in the list item
if group.lower().find(ignore.lower()) != -1:
return True
return False
else:
return False
def includeGroup(self, group):
if self.options.includelist != None:
# for each text in the ignore list, should we be ignoring the buddy in the group
for include in self.options.includelist.split(","):
# has the group been found in the list item
if group.lower().find(include.lower()) != -1:
return True
return False
else:
return True
def getCleanText(self,text):
text = text.replace("'","'") # workaround for shitty xml codes not compliant with html
text = re.sub('<(.|\n)+?>','',text) # remove any html tags
return re.sub('&(%s);' % '|'.join(name2codepoint), lambda m: chr(name2codepoint[m.group(1)]), text)
def logInfo(self, text):
if self.options.verbose == True:
print >> sys.stdout, "INFO: " + text
if self.options.infologfile != None:
datetimestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
fileoutput = open(self.options.infologfile, "ab")
fileoutput.write(datetimestamp+" INFO: "+text+"\n")
fileoutput.close()
def logError(self, text):
print >> sys.stderr, "ERROR: " + text
if self.options.errorlogfile != None:
datetimestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
fileoutput = open(self.options.errorlogfile, "ab")
fileoutput.write(datetimestamp+" ERROR: "+text+"\n")
fileoutput.close()
def getMadeSafeOutput(self, text):
return text.replace("${exec","${!noexec!")
def main():
parser = CommandLineParser()
(options, args) = parser.parse_args()
if options.version == True:
print >> sys.stdout,"conkyPidgin v.2.11"
else:
if options.verbose == True:
print >> sys.stdout, "*** INITIAL OPTIONS:"
print >> sys.stdout, " template:", options.template
print >> sys.stdout, " onlineonly:", options.onlineonly
print >> sys.stdout, " availableonly:", options.availableonly
print >> sys.stdout, " ignorelist:", options.ignorelist
print >> sys.stdout, " includelist:", options.includelist
print >> sys.stdout, " chattingtext:", options.chattingtext
print >> sys.stdout, " availabletext:", options.availabletext
print >> sys.stdout, " unavailabletext:", options.unavailabletext
print >> sys.stdout, " invisibletext:", options.invisibletext
print >> sys.stdout, " awaytext:", options.awaytext
print >> sys.stdout, " mobiletext:", options.mobiletext
print >> sys.stdout, " offlinetext:", options.offlinetext
print >> sys.stdout, " verbose:", options.verbose
print >> sys.stdout, " errorlogfile:",options.errorlogfile
print >> sys.stdout, " infologfile:",options.infologfile
buddyinfo = PidginInfo(options)
buddyinfo.writeOutput()
if __name__ == '__main__':
main()
sys.exit() |
Subscription date : 02 September 2009
Messages : 539
|
bonjour
bon, mon propre Doncky :
en taille reelle ici : http://uppix.net/e/9/6/87df3a9dd739698c705aa3f1d1a92.png
avec le fond d ecran, cela donne : http://uppix.net/1/b/f/d8c4cd035aada5a3608b26258cb13.png
taille du desklet : 280x810
et enfin le plus important, l xml : http://dl.free.fr/px0tsW1vC
cordialement
Séb
-----------------------------
Aujourd'hui, résultats du bac.
Comme tous les "terminales", je vais voir les résultats devant le lycée.
Sur les tableaux, je ne trouve pas mon nom, ni aux admis, ni aux repêches, et pour cause : l'administration, aprÚs recherche, n'a pas connaissance de mon nom.
Je vais rester en terminale. VDM |
Subscription date : 02 September 2009
Messages : 539
|
bonjour,
tiens, une petite question.
est ce qu il est possible d avoir une mise a la ligne automatique ?
je prend un exemple, je fais un script en perl pour le site de vdm.
ce site doit m afficher une vdm aléatoire, mais le soucis c est que je ne peux connaitre le nombre de lettre affichable avant que ca disparaisse hord du desklet.
j arrive bien a afficher le texte de la vdm, mais j ai ce soucis de depassement.
cordialement
ours_en_pluche
------------------------
Aujourd'hui, cela fait un mois que je travaille au rayon charcuterie d'un supermarché. J'utilise des découpeuses électriques, des trancheuses, des couteaux de 30 cm et... je me suis finalement coupé avec une feuille pour emballer le jambon. VDM |
matttbe, Monday 19 July 2010 à 13:39
|
|
Subscription date : 24 January 2009
Messages : 12573
|
Au pire, tu peux également ajouter une fonction pour compter le nombre de caractères et ajouter le retour à la ligne. Mais je me souviens que ceci avait été implémenté dans RSSReader, donc si ça pouvait se faire également dans Doncky, ça ne serait pas plus mal  |
Subscription date : 30 November 2007
Messages : 17118
|
au fait on ne peut pas mettre d'images dans Doncky ? |
matttbe, Monday 19 July 2010 à 14:28
|
|
Subscription date : 24 January 2009
Messages : 12573
|
Il me semble que l'on peut, pourquoi? |
Subscription date : 30 November 2007
Messages : 17118
|
je n'en ai pas vu dans les captures, c'est pour ça que je me demandais. |
Subscription date : 02 September 2009
Messages : 539
|
re,
pour l image, je confirme :
img : Affiche une image - Utilisation : <img>chemin_complet_de_l_image</img>
imgsize : Définit la taille de l'image en spécifiant la largeur souhaitée (en conservant le ratio)
imgsizeW : Largeur de l'image (nécéssite de renseigner imgsizeH) pour forcer le ratio
imgsizeH : Hauteur de l'image (nécéssite de renseigner imgsizeW) pour forcer le ratio
extrait de la documentation  |
Subscription date : 29 November 2007
Messages : 7408
|
La doc n'est pas à jour ... Mais oui, les images sont supportées (il n'y a qu'à retrouver le post avec l'image de mon doncky) |
|