From owner-freebsd-gnome@FreeBSD.ORG Sat Sep 13 14:15:36 2003 Return-Path: Delivered-To: freebsd-gnome@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 6849D16A4BF for ; Sat, 13 Sep 2003 14:15:36 -0700 (PDT) Received: from lakemtao08.cox.net (lakemtao08.cox.net [68.1.17.113]) by mx1.FreeBSD.org (Postfix) with ESMTP id 1103043FAF for ; Sat, 13 Sep 2003 14:15:35 -0700 (PDT) (envelope-from mezz7@cox.net) Received: from mezz.mezzweb.com ([68.103.37.247]) by lakemtao08.cox.net (InterMail vM.5.01.06.05 201-253-122-130-105-20030824) with ESMTP id <20030913211532.OIVB16616.lakemtao08.cox.net@mezz.mezzweb.com>; Sat, 13 Sep 2003 17:15:32 -0400 Date: Sat, 13 Sep 2003 16:14:32 -0500 To: Alexander Leidinger References: <20030913161106.30288fe4.Alexander@Leidinger.net> From: Jeremy Messenger Content-Type: multipart/mixed; boundary=----------zbpFeTQNcVcKpNoxJ6FICd MIME-Version: 1.0 Message-ID: In-Reply-To: <20030913161106.30288fe4.Alexander@Leidinger.net> User-Agent: Opera7.20/Linux M2 build 459 cc: freebsd-gnome@freebsd.org Subject: Re: Need the help on hack gDesklets to kill the 'Linuxish' in Python. X-BeenThere: freebsd-gnome@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: GNOME for FreeBSD -- porting and maintaining List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 13 Sep 2003 21:15:36 -0000 ------------zbpFeTQNcVcKpNoxJ6FICd Content-Type: text/plain; format=flowed; charset=utf-8 Content-Transfer-Encoding: 8bit On Sat, 13 Sep 2003 16:11:06 +0200, Alexander Leidinger wrote: > On Sat, 13 Sep 2003 02:46:41 -0500 > Jeremy Messenger wrote: > >> The new version of gDesklets just released yesterday and it has the new >> directory called libgdesklets. All of them will not work on FreeBSD, >> because it is too 'Linuxish' by read the /proc/* stuff. They are written >> in Python and I don't know Python that much and much, but I am trying to >> learn it. The gDesklets developer said that they will accept the >> patch(es)[1] as long it will work on Linux too, so you can send me the >> patch(es) too and I will add it in the gDesklets port until one of your >> patch(es) make it in gDesklets. It doesn't matter if you only can get it >> works on FreeBSD but not on Linux, then just send it to me. > >> [1] Send the patch(es) to gDesklets at http://bugzilla.gnome.org .. > > Patches attached, because of lack of a Display which uses them I haven't > tested the patches... beware, it may eat your pets because there are > maybe some typos. Ok, I have tested them and they don't patch correct, so here's attaches of cleaned patches.. I cleaned very few mistyped too. :-) I have tried to run it with the SysInfo and I keep get this.. ============================== Traceback (most recent call last): File "/usr/X11R6/share/gnome/gdesklets/factory/SensorFactory.py", line 55, in create_sensor module = __import__(name) File "./SysInfo/__init__.py", line 5, in ? import libdesklets as lib File "/usr/X11R6/share/gnome/gdesklets/libdesklets/__init__.py", line 56, in ? cpu = CPU() File "/usr/X11R6/share/gnome/gdesklets/libdesklets/CPU.py", line 25, in __init__ os = lib.sys.get_os() AttributeError: 'module' object has no attribute 'sys' 'module' object has no attribute 'sys' ============================== I tried to add the 'import sys' and it still doesn't work.. I am not sure what to do with the 'lib.sys.get_os()', which I normal use 'sys.platform' for OS stuff. Cheers, Mezz > The new version of gdesklets also doesn't update the weather and pi's > network desklet... > > Bye, > Alexander. -- bsdforums.org 's moderator, mezz. ------------zbpFeTQNcVcKpNoxJ6FICd Content-Disposition: attachment; filename="patch-libdesklets::CPU.py" Content-Type: text/plain; name="patch-libdesklets::CPU.py" Content-Transfer-Encoding: 8bit --- libdesklets/CPU.py.orig Sat Sep 13 14:23:43 2003 +++ libdesklets/CPU.py Sat Sep 13 14:41:25 2003 @@ -1,5 +1,5 @@ import polling - +import libdesklets as lib # # TODO: support SMP @@ -21,8 +21,17 @@ self.get_load = polling.wrap(self.__poll_load, 0.2) + os = lib.sys.get_os() + try: - fd = open("/proc/cpuinfo", "r") + if os == "FreeBSD": + print "FreeBSD" + fd = os.popen("grep -3 CPU /var/run/dmesg.boot | head -7 | tail -4", "r") + elif os == "Linux": + fd = open("/proc/cpuinfo", "r") + else: + print "Unknown OS, strange things may happen." + return except IOError, e: import traceback; traceback.print_exc() print e @@ -40,15 +49,24 @@ def __poll_cpu(self): - import libdesklets as lib + import re arch = lib.sys.get_arch() + os = lib.sys.get_os() if (arch in ["i386", "i486", "i586", "i686"]): - fields = self.__lines[4].split() - model_name = " ".join(fields[3:]) - fields = self.__lines[6].split() - cpu_mhz = fields[3] - fields = self.__lines[7].split() - cpu_cache = " ".join(fields[3:5]) + if ("FreeBSD" == os): + m = re.search('^CPU: (.*) \(([0-9]+.*)-MHz [0-9]+-class CPU\)', self.__lines[0]) + model_name = " ".join(m.group(0)) # or sysctl hw.model + cpu_mhz = m.group(1) # or sysctl hw.clockrate + cpu_cache = " " # not available by default + elif ("Linux" == os): + fields = self.__lines[4].split() + model_name = " ".join(fields[3:]) + fields = self.__lines[6].split() + cpu_mhz = fields[3] + fields = self.__lines[7].split() + cpu_cache = " ".join(fields[3:5]) + else: + pass elif (arch == "ppc"): fields = self.__lines[0].split() @@ -68,17 +86,34 @@ def __poll_load(self): - fd = open("/proc/stat", "r") + os = lib.sys.get_os() + + if ("FreeBSD" == os): + fd = os.popen("iostat -n 0", "r") + line = 2 + elif ("Linux" == os): + fd = open("/proc/stat", "r") + line = 0 + else: + return data = fd.read() fd.close() data = data.splitlines() - fields = data[0].split() + fields = data[line].split() - u = float(fields[1]) - s = float(fields[2]) - n = float(fields[3]) - i = float(fields[4]) + if ("FreeBSD" == os): + u = float(fields[2]) + float(fields[3]) + s = float(fields[4]) + n = float(fields[5]) + i = float(fields[6]) + elif ("Linux" == os): + u = float(fields[1]) + s = float(fields[2]) + n = float(fields[3]) + i = float(fields[4]) + else: + pass total = ((u - self.__uT) + (s - self.__sT) + (n - self.__nT) + (i - self.__iT)) ------------zbpFeTQNcVcKpNoxJ6FICd Content-Disposition: attachment; filename="patch-libdesklets::Disk.py" Content-Type: text/plain; name="patch-libdesklets::Disk.py" Content-Transfer-Encoding: 8bit --- libdesklets/Disk.py.orig Sat Sep 13 14:44:30 2003 +++ libdesklets/Disk.py Sat Sep 13 14:51:45 2003 @@ -3,7 +3,7 @@ import time import os import statvfs - +import libdesklets as lib class Disk: @@ -19,21 +19,33 @@ def __poll_partitions(self): + os = lib.sys.get_os() + # we don't have to reread the file if it hasn't changed - if (self.__partitions_last_read >= os.path.getmtime("/etc/mtab")): + if (os == "Linux" and self.__partitions_last_read >= os.path.getmtime("/etc/mtab")): return self.__partitions else: self.__partitions_last_read = time.time() # /etc/mtab is more portable than /proc/mount, so we use it - fd = open("/etc/mtab", "r") + if (os == "Linux"): + fd = open("/etc/mtab", "r") + else: + fd = os.popen("mount", "r") lines = fd.readlines() fd.close() partitions = [] for l in lines: parts = l.split() - device, mpoint, fstype = parts[:3] + if (os == "Linux"): + device, mpoint, fstype = parts[:3] + elif (os == "FreeBSD"): + device = parts[0] + mpoint = parts[2] + import re + m = re.search('\(([a-zA-Z]+)[,)]', parts[3]) + fstype = m.group(0) # FIXME: is this OK? it might be better to check if the device # actually is a file in /dev if (fstype in ("ext2", "ext3", "msdos", "vfat", "ntfs", "hpfs" ------------zbpFeTQNcVcKpNoxJ6FICd Content-Disposition: attachment; filename="patch-libdesklets::Memory.py" Content-Type: text/plain; name="patch-libdesklets::Memory.py" Content-Transfer-Encoding: 8bit --- libdesklets/Memory.py.orig Sat Sep 13 14:52:40 2003 +++ libdesklets/Memory.py Sat Sep 13 15:03:06 2003 @@ -17,28 +17,76 @@ def __poll_total_ram(self): - memtotal = os.stat("/proc/kcore")[stat.ST_SIZE] + if ("FreeBSD" == os): + fd = os.popen("sysctl hw.physmem") + physmem = fd.readlines() + fd.close() + lines = physmem.splitlines() + + memtotal = lines[0].split()[1] + elif ("Linux" == os): + memtotal = os.stat("/proc/kcore")[stat.ST_SIZE] + else: + memtotal = 0 return memtotal def __poll_mem(self, mode): - fd = open("/proc/meminfo", "r") + if ("FreeBSD" == os): + fd = os.popen("vmstat -n 0", "r") + elif ("Linux" == os): + fd = open("/proc/meminfo", "r") + else: + return (0, 0) mem = fd.read() fd.close() lines = mem.splitlines() # RAM if (mode == 0): - nil, total, used , free, share, buffers, cached = lines[1].split() + if ("FreeBSD" == os): + fd = os.popen("vmstat -n 0", "r") + elif ("Linux" == os): + fd = open("/proc/meminfo", "r") + else: + return (0, 0) + mem = fd.read() + fd.close() + lines = mem.splitlines() + + if ("FreeBSD" == os): + # this may be larger than total, as this is the active virtual + # memory, not the active physical memory + used = int(lines[2].split()[3]) * 1024 + elif ("Linux" == os): + nil, total, used , free, share, buffers, cached = lines[1].split() + used = int(used) - int(cached) + total = self.__get_total_ram() - used = int(used) - int(cached) # Swap elif (mode == 1): - nil, total, used, free = lines[2].split() - total = int(total) - used = int(used) + if ("FreeBSD" == os): + fd = os.popen("pstat -T", "r") + elif ("Linux" == os): + fd = open("/proc/meminfo", "r") + else: + return (0, 0) + mem = fd.read() + fd.close() + lines = mem.splitlines() + + if ("FreeBSD" == os): + used, total = lines[1].split()[0].split("/") + used = long(used[0:-2]) * 1024 * 1024 + total = long(total[0:-2]) * 1024 * 1024 + elif ("Linux" == os): + nil, total, used, free = lines[2].split() + total = int(total) + used = int(used) + else: + pass return (total, used) ------------zbpFeTQNcVcKpNoxJ6FICd Content-Disposition: attachment; filename="patch-libdesklets::Network.py" Content-Type: text/plain; name="patch-libdesklets::Network.py" Content-Transfer-Encoding: 8bit --- libdesklets/Network.py.orig Sat Sep 13 15:06:34 2003 +++ libdesklets/Network.py Sat Sep 13 15:26:16 2003 @@ -2,6 +2,7 @@ import os import time +import libdesklets as lib class Network: @@ -25,22 +26,42 @@ def __poll_devices(self): - fd = open("/proc/net/dev", "r") + os = lib.sys.get_os() + + if ("FreeBSD" == os): + fd = os.popen("ifconfig -a | grep mtu", "r") + elif ("Linux" == os): + fd = open("/proc/net/dev", "r") + else: + return [] data = fd.readlines() fd.close() devices = [] - for lines in data[2:]: - l = lines.strip() - l = l.replace(":", " ") - fields = l.split() - - if (fields[0] == "lo"): - continue - else: # (fields[0].startswith("eth")): - device = fields[0] - devices.append(device) - #end for + + if ("FreeBSD" == os): + for lines in data: + fields = lines.strip().strip(":") + + if (fields[0] == "lo"): + continue + else: + device = fields[0] + devices.append(device) + elif ("Linux" == os): + for lines in data[2:]: + l = lines.strip() + l = l.replace(":", " ") + fields = l.split() + + if (fields[0] == "lo"): + continue + else: # (fields[0].startswith("eth")): + device = fields[0] + devices.append(device) + #end for + else: + pass return devices @@ -48,27 +69,48 @@ def __poll_ipaddr(self, dev): - fd = open("/proc/net/rt_cache", "r") + os = lib.sys.get_os() + + if ("FreeBSD" == os): + fd = os.popen("ifconfig " + device, "r") + elif ("Linux" == os): + fd = open("/proc/net/rt_cache", "r") + else: + return ("xxx.xxx.xxx.xxx") + data = fd.readlines() fd.close() - for l in data: - l = l.strip() - if (l.startswith(dev)): + + if ("FreeBSD" == os): + for l in data: + l = l.strip() fields = l.split() - addr = fields[7] - addr4 = int(addr[0:2], 16) - addr3 = int(addr[2:4], 16) - addr2 = int(addr[4:6], 16) - addr1 = int(addr[6:8], 16) - return (str(addr1) + "." + str(addr2) + "." + + if fields[0] == "inet": + return fields[1] + elif ("Linux" == os): + for l in data: + l = l.strip() + if (l.startswith(dev)): + fields = l.split() + addr = fields[7] + addr4 = int(addr[0:2], 16) + addr3 = int(addr[2:4], 16) + addr2 = int(addr[4:6], 16) + addr1 = int(addr[6:8], 16) + return (str(addr1) + "." + str(addr2) + "." + str(addr3) + "." + str(addr4)) - + else: + pass + return ("xxx.xxx.xxx.xxx") def __poll_in_out(self, dev): + os = lib.sys.get_os() + t = time.time() interval = t - self.__time self.__time = t @@ -79,23 +121,38 @@ speed_in = 0 speed_out = 0 - fd = open("/proc/net/dev", "r") + if ("FreeBSD" == os): + fd = os.popen("netstat -b -I " + dev + " | grep Link", "r") + elif ("Linux" == os): + fd = open("/proc/net/dev", "r") + else: + return (bytes_in, bytes_out, pack_in, pack_out, speed_in, speed_out) data = fd.read() fd.close() lines = data.splitlines() # look for the device found = 0 - for l in lines: - l.strip() - l = l.replace(":", " ") - fields = l.split() - if (fields[0] == dev): - bytes_in, pack_in, bytes_out, pack_out = \ - int(fields[1]), int(fields[2]), int(fields[9]), int(fields[10]) + if ("FreeBSD" == os): + for l in lines: found = 1 + fields = l.strip().split() + bytes_in, pack_in, bytes_out, pack_out = \ + int(fields[6]), int(fields[4]), int(fields[9]), int(fields[7]) break - #end for + elif ("Linux" == os): + for l in lines: + l.strip() + l = l.replace(":", " ") + fields = l.split() + if (fields[0] == dev): + bytes_in, pack_in, bytes_out, pack_out = \ + int(fields[1]), int(fields[2]), int(fields[9]), int(fields[10]) + found = 1 + break + #end for + else: + pass # warn if we didn't find the device if (not found): print ("WARNING:: Device %(dev)s not found!") % vars() ------------zbpFeTQNcVcKpNoxJ6FICd Content-Disposition: attachment; filename="patch-libdesklets::Sys.py" Content-Type: text/plain; name="patch-libdesklets::Sys.py" Content-Transfer-Encoding: 8bit --- libdesklets/Sys.py.orig Sat Sep 13 15:27:22 2003 +++ libdesklets/Sys.py Sat Sep 13 15:37:16 2003 @@ -2,7 +2,7 @@ import commands import time - +import libdesklets as lib class Sys: @@ -31,17 +31,29 @@ def __poll_os(self): - os = commands.getoutput("uname -o") + os = commands.getoutput("uname -s") return os def __poll_uptime(self, mode): - fd = open("/proc/uptime", "r") - data = fd.readlines() - fd.close() + os = lib.sys.get_os() + + if ("FreeBSD" == os): + bt = commands.getoutput("sysctl kern.boottime") + boottime = int(bt.strip().split()[4]) + uptime = int(time.time() - float(boottime)) + idletime = 0 + elif ("Linux" == os): + fd = open("/proc/uptime", "r") + data = fd.readlines() + fd.close() - uptime, idletime = data[0].split() + uptime, idletime = data[0].split() + boottime = int(time.time() - float(uptime)) + else: + uptime = 0 + idletime = 0 # uptime if (mode == 0): @@ -51,16 +63,32 @@ return int(float(idletime)) # sys start elif (mode == 2): - now = time.time() - return int(now - float(uptime)) + return boottime def __poll_load_avg(self, mode): - fd = open("/proc/loadavg", "r") + import re + os = lib.sys.get_os() + + if ("FreeBSD" == os): + fd = os.popen("uptime") + elif ("Linux" == os): + fd = open("/proc/loadavg", "r") + else: + return float(0.0) data = fd.readlines() fd.close() - load1, load5, load15, t, d = data[0].split() + + if ("FreeBSD" == os): + m = re.search('load averages: ([0-9]\.[0-9]+), ([0-9]\.[0-9]+), ([0-9]\.[0-9]+)', data) + load1 = m.group(0) + load5 = m.group(1) + load15 = m.group(2) + elif ("Linux" == os): + load1, load5, load15, t, d = data[0].split() + else: + pass # avg over 1 minute if (mode == 0): @@ -76,11 +104,25 @@ def __poll_tasks(self): - fd = open("/proc/loadavg", "r") + os = lib.sys.get_os() + + if ("FreeBSD" == os): + fd = os.popen("vmstat -n 0") + elif ("Linux" == os): + fd = open("/proc/loadavg", "r") + else: + return (int(0), int(0)) data = fd.readlines() fd.close() - parts = data[0].split() - running, tasks = parts[3].split("/") + if ("FreeBSD" == os): + parts = data[2].split() + running = parts[0] + tasks = parts[0] + parts[1] + parts[2] + elif ("Linux" == os): + parts = data[0].split() + running, tasks = parts[3].split("/") + else: + pass return (int(tasks), int(running)) ------------zbpFeTQNcVcKpNoxJ6FICd--