# Proc/Sys Spezialist da?

## root_tux_linux

Hi

Kleine Frage... Gibt es ne bessere Möglichkeit  die Folgenden Daten über Proc/Sys zu erlangen?

Bräuchte:

Dateisystem

Mount-Point

Momentan geh ich über /proc/mount aber irgendwie scheint mir das ganze ned all zu toll sein wenn man Programm mit RE in /proc/mount rumwuscheln muss...

Gibts da nicht was anderes? :-/

Btw. Auf DBUS bzw QtDBus verzichte ich absichtlich! 

Da manche Distrubtionen  HAL (Gentoo, Arch, Debian...) manche Device-Kit (Ubuntu 9.04, 9.10, Fedora 12, Mandriva 2010...) und manche Udisk (Jaja, die haben Device-Kit umbenannt (Fedora 13, das kommende OpenSuse, kommende Mandriva, Ubuntu 10.04...)) nutzen...

----------

## Knieper

getmntent()?

----------

## root_tux_linux

 *Knieper wrote:*   

> getmntent()?

 

Ist doch C?

Bringt mir daher ned viel bei PyQt :-/

----------

## franzf

 *root_tux_linux wrote:*   

>  *Knieper wrote:*   getmntent()? 
> 
> Ist doch C?
> 
> Bringt mir daher ned viel bei PyQt :-/

 

Du hast nicht gesagt, dass du es in PyQt4 haben willst.

Vllt. hilft dir PyKDE4.solid weiter.

----------

## root_tux_linux

 *franzf wrote:*   

>  *root_tux_linux wrote:*    *Knieper wrote:*   getmntent()? 
> 
> Ist doch C?
> 
> Bringt mir daher ned viel bei PyQt :-/ 
> ...

 

Bei Solid ist man dann aber an KDE gebunden :-/

Momentan les ich einfach /proc/partitions und /proc/mounts aber  wirklich sauber sieht das ganze ned aus *hust*

Und da das ganze auf jedem Linux laufen sollte unabhängig von HAL/Device-Kit/Udisk/Solid  dachte ich man könnte über /proc oder /sys tricksen aber halt bisschen sauberer...

Python hat zwar os.path.ismount() aber das funzt nur mit dem Mount-Point den ich da nicht habe.

Ganz "unsauber" wirds dann bei lvm pvs, dmsetup info :-/

Qt + C++ wollte ich eigentlich umgehen, ist mir ehrlich gesagt doch zu mühsam mit libdevmapper.h, libcryptsetup.h etc...

----------

## Necoro

folgendes in eine Datei speichern ... zum Beispiel als "mounts.pyx"

```
from stdio cimport *

cdef extern from "mntent.h":

    struct mntent:

        char *mnt_fsname   # name of mounted file system

        char *mnt_dir      # file system path prefix

        char *mnt_type     # mount type (see mntent.h)

        char *mnt_opts     # mount options (see mntent.h)

        int   mnt_freq     # dump frequency in days

        int   mnt_passno   # pass number on parallel fsck

    mntent* getmntent(FILE *fp)

cdef extern from "Python.h":

    FILE* PyFile_AsFile(object)

cdef class Mount (object):

    cdef readonly object name

    cdef readonly object dir

    cdef readonly object type

    cdef readonly object opts

    cdef readonly object freq

    cdef readonly object passno

    # need to have this, as __init__ and __cinit__

    # cannot take C-arguments

    # NOTE: this is NO special function

    cdef init (self, mntent* mnt):

        self.name = mnt.mnt_fsname

        self.dir = mnt.mnt_dir

        self.type = mnt.mnt_type

        self.opts = mnt.mnt_opts

        self.freq = mnt.mnt_freq

        self.passno = mnt.mnt_passno

cdef class Mounts (object):

    cdef object file

    def __init__ (self, name):

        self.file = open(name)

    def get_entries (self):

        return list(self)

    # this must indeed be called '__next__' and not 'next'

    # see http://docs.cython.org/src/userguide/special_methods.html#the-next-method

    def __next__ (self):

        cdef FILE* cfile = PyFile_AsFile(self.file)

        cdef mntent* mnt = getmntent(cfile)

        cdef Mount m = Mount()

        if mnt is NULL:

            raise StopIteration

        else:

            m.init(mnt)

            return m

    def __iter__ (self):

        return self
```

Anschließend mit cython mounts.pyx den C-Code bauen und dann mit dem gcc übersetzen (zB: gcc -pthread -shared -fPIC -o mounts.so mounts.c $(python-config --includes) $(python-config --libs))

Danach kann man es wunderbar in Python benutzen:

>>> import mounts

>>> m = mounts.Mounts("/proc/mounts")

>>> [mnt.dir for mnt in m]

['/', '/', '/proc', '/lib/rc/init.d', '/sys', '/dev', '/dev/pts', '/dev/shm', '/home', '/var/tmp/portage', '/usr/portage', '/usr/local/layman', '/data', '/home/necoro/rip']

Das ist nur schnell runtergecodet ... kann man sicherlich noch dran bauen  :Smile: 

/edit: Beachte die Besonderheiten von getmntent. Insbesondere, dass du nicht die Aufrufe von zwei Dateien mixen solltest, da er sich das zuletzt aufgerufene merkt.

----------

## root_tux_linux

Mal testen... thx

----------

## root_tux_linux

Btw...

Kleine Frage die jetzt nix mit Python zu tun hat...

Ich hab mir jetzt nochmal  libdevmapper.h und libcryptsetup.h angeguckt obwohl ich mich entschloss das Programm lieber in PyQt zu schreiben....

In der libcryptsetup.h find ich folgendes...

```
 * Various crypt device info functions

 *

 * @cd - crypt device handle

 *

 * cipher - used cipher, e.g. "aes" or NULL otherwise

 * cipher_mode - used cipher mode including IV, e.g. "xts-plain" or NULL otherwise

 * uuid - device UUID or NULL if not set

 * data_offset - device offset in sectors where real data starts on underlying device)

 * volume_key_size - size (in bytes) of volume key for crypt device

 */

const char *crypt_get_cipher(struct crypt_device *cd);

const char *crypt_get_cipher_mode(struct crypt_device *cd);

const char *crypt_get_uuid(struct crypt_device *cd);

uint64_t crypt_get_data_offset(struct crypt_device *cd);

int crypt_get_volume_key_size(struct crypt_device *cd);
```

Ich weiss jetzt ned obs mir an Ahnung fehlt aber wie kommt man denn an die Infos? oO

Weil mit nem einfachen

crypt_device *cd;

crypt_get_cipher(cd);

Ist es ned getan...

Irgendwie tu ich mich mit  cryptsetup/dmsetup/lvm schwer, im gegensatz zu reinem Qt oO

----------

## schmutzfinger

Getmntent wurschtelt auch einfach nur in /proc/mounts rum. Guck dir die glibc an und enscheide selbst ob du die datei nicht doch lieber selber parsen willst. In python dürfte das in 5 zeilen machbar sein, wenn ich das mit dem C binding vergleiche ... dann musst du plötzlich was kompilieren und willst früher oder später noch make oder scons nutzen.

----------

