Skip to main content

SystemD wrapper in Cython

Project description

Latest Version https://img.shields.io/pypi/wheel/cysystemd.svg https://img.shields.io/pypi/pyversions/cysystemd.svg https://img.shields.io/pypi/l/cysystemd.svg

Python systemd wrapper using Cython

Installation

All packages available on github releases.

Debian/Ubuntu

Install repository key

wget -qO - 'https://bintray.com/user/downloadSubjectPublicKey?username=bintray' | \
   apt-key add -

Install the repository file

Debian Jessie:

echo "deb http://dl.bintray.com/mosquito/cysystemd jessie main" > /etc/apt/sources.list.d/cysystemd.list
apt-get update
apt-get install python-cysystemd python3-cysystemd

Ubuntu Xenial:

echo "deb http://dl.bintray.com/mosquito/cysystemd xenial main" > /etc/apt/sources.list.d/cysystemd.list
apt-get update
apt-get install python-cysystemd python3-cysystemd

Ubuntu Bionic:

echo "deb http://dl.bintray.com/mosquito/cysystemd bionic main" > /etc/apt/sources.list.d/cysystemd.list
apt-get update
apt-get install python-cysystemd python3-cysystemd

Centos 7

yum localinstall \
   https://github.com/mosquito/cysystemd/releases/download/0.17.1/python-cysystemd-0.17.1-1.centos7.x86_64.rpm

Installation from sources

You should install systemd headers

For debian users:

apt-get install build-essential \
    libsystemd-journal-dev \
    libsystemd-daemon-dev \
    libsystemd-dev

For CentOS/RHEL

yum install gcc systemd-devel

And install it from pypi

pip install cysystemd

Usage examples

Writing to journald

Logging handler for python logger

from cysystemd import journal
import logging
import uuid

logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger()
logger.addHandler(journal.JournaldLogHandler())

try:
    log.info("Trying to do something")
    raise Exception('foo')
except:
    logger.exception("Test Exception %s", 1)

Systemd daemon notification

from cysystemd.daemon import notify, Notification

# Send READY=1
notify(Notification.READY)

# Send status
notify(Notification.STATUS, "I'm fine.")

# Send stopping
notify(Notification.STOPPING)

Write message into Systemd journal

from cysystemd import journal


journal.write("Hello Lennart")

# Or send structured data
journal.send(
    message="Hello Lennart",
    priority=journal.Priority.INFO,
    some_field='some value',
)

Reading journald

Reading all systemd records

from cysystemd.reader import JournalReader, JournalOpenMode

journal_reader = JournalReader()
journal_reader.open(JournalOpenMode.SYSTEM)
journal_reader.seek_head()

for record in journal_reader:
   print(record.data['MESSAGE'])

Read only cron logs

from cysystemd.reader import JournalReader, JournalOpenMode, Rule


rules = (
   Rule("SYSLOG_IDENTIFIER", "CRON") &
   Rule("_SYSTEMD_UNIT", "crond.service") |
   Rule("_SYSTEMD_UNIT", "cron.service")
)

cron_reader = JournalReader()
cron_reader.open(JournalOpenMode.SYSTEM)
cron_reader.seek_head()
cron_reader.add_filter(rules)

for record in cron_reader:
   print(record.data['MESSAGE'])

Polling records

from cysystemd.reader import JournalReader, JournalOpenMode


reader = JournalReader()
reader.open(JournalOpenMode.SYSTEM)
reader.seek_tail()

poll_timeout = 255

while True:
   reader.wait(poll_timeout)

   for record in reader:
      print(record.data['MESSAGE'])

JournalD open modes

  • CURRENT_USER

  • LOCAL_ONLY

  • RUNTIME_ONLY

  • SYSTEM

  • SYSTEM_ONLY

from cysystemd.reader import JournalReader, JournalOpenMode

reader = JournalReader()
reader.open(JournalOpenMode.CURRENT_USER)

JournalD entry

JournalEntry class has some special properties and methods:

  • data - journal entry content (dict)

  • date - entry timestamp (datetime instance)

  • cursor - systemd identification bytes for this entry

  • boot_id() - returns bootid

  • get_realtime_sec() - entry epoch (float)

  • get_realtime_usec() - entry epoch (int microseconds)

  • get_monotonic_sec() - entry monotonic time (float)

  • get_monotonic_usec() - entry monotonic time (int microseconds)

  • __getitem__(key) - shoutcut for entry.data[key]

JournalD reader

JournalReader class has some special properties and methods:

  • open(flags=JournalOpenMode.CURRENT_USER) - opening journald with selected mode

  • open_directory(path) - opening journald from path

  • open_files(*filename) - opening journald from files

  • data_threshold - may be used to get or set the data field size threshold for data returned by fething entry data.

  • closed - returns True when journal reader closed

  • locked - returns True when journal reader locked

  • idle - returns True when journal reader opened

  • seek_head - move reader pointer to the first entry

  • seek_tail - move reader pointer to the last entry

  • seek_monotonic_usec - seeks to the entry with the specified monotonic timestamp, i.e. CLOCK_MONOTONIC. Since monotonic time restarts on every reboot a boot ID needs to be specified as well.

  • seek_realtime_usec - seeks to the entry with the specified realtime (wallclock) timestamp, i.e. CLOCK_REALTIME. Note that the realtime clock is not necessarily monotonic. If a realtime timestamp is ambiguous, it is not defined which position is sought to.

  • seek_cursor - seeks to the entry located at the specified cursor (see JournalEntry.cursor).

  • wait(timeout) - It will synchronously wait until the journal gets changed. The maximum time this call sleeps may be controlled with the timeout_usec parameter.

  • __iter__ - returns JournalReader object

  • __next__ - calls next() or raise StopIteration

  • next(skip=0) - returns the next JournalEntry. The skip parameter skips some entries.

  • previous(skip=0) - returns the previous JournalEntry. The skip parameter skips some entries.

  • skip_next(skip) - skips next entries.

  • skip_previous(skip) - skips next entries.

  • add_filter(rule) - adding filter rule. See read-only-cron-logs as example.

  • clear_filter - reset all filters

  • fd - returns a special file descriptor

  • events - returns EPOLL events

  • timeout - returns internal timeout

  • process_events() - After each poll() wake-up process_events() needs to be called to process events. This call will also indicate what kind of change has been detected.

  • get_catalog() - retrieves a message catalog entry for the current journal entry. This will look up an entry in the message catalog by using the “MESSAGE_ID=” field of the current journal entry. Before returning the entry all journal field names in the catalog entry text enclosed in “@” will be replaced by the respective field values of the current entry. If a field name referenced in the message catalog entry does not exist, in the current journal entry, the “@” will be removed, but the field name otherwise left untouched.

  • get_catalog_for_message_id(message_id: UUID) - works similar to get_catalog() but the entry is looked up by the specified message ID (no open journal context is necessary for this), and no field substitution is performed.

Asyncio support

Initial asyncio support for reading journal asynchronously.

AsyncJournalReader

Blocking methods were wrapped by threads. Method wait() use epoll on journald file descriptor.

import asyncio
import json

from cysystemd.reader import JournalOpenMode
from cysystemd.async_reader import AsyncJournalReader


async def main():
    reader = AsyncJournalReader()
    await reader.open(JournalOpenMode.SYSTEM)
    await reader.seek_tail()

    while await reader.wait():
        async for record in reader:
            print(
                json.dumps(
                    record.data,
                    indent=1,
                    sort_keys=True
                )
            )

if __name__ == '__main__':
    asyncio.run(main())

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

cysystemd-1.4.8.tar.gz (195.8 kB view details)

Uploaded Source

Built Distributions

cysystemd-1.4.8-cp39-cp39-manylinux2014_x86_64.whl (1.7 MB view details)

Uploaded CPython 3.9

cysystemd-1.4.8-cp38-cp38-manylinux2014_x86_64.whl (1.7 MB view details)

Uploaded CPython 3.8

cysystemd-1.4.8-cp37-cp37m-manylinux2014_x86_64.whl (1.6 MB view details)

Uploaded CPython 3.7m

cysystemd-1.4.8-cp36-cp36m-manylinux2014_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.6m

cysystemd-1.4.8-cp35-cp35m-manylinux2014_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.5m

File details

Details for the file cysystemd-1.4.8.tar.gz.

File metadata

  • Download URL: cysystemd-1.4.8.tar.gz
  • Upload date:
  • Size: 195.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.23.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.45.0 CPython/3.8.3

File hashes

Hashes for cysystemd-1.4.8.tar.gz
Algorithm Hash digest
SHA256 1027ef86aba8a484526d33f4d0f96f01a3b2531cc4d20d08cd0271f9dc90a442
MD5 8187a4e5c2f80d201f273c867ac6ddd5
BLAKE2b-256 bdfdf7788bb4fcafcab9d588caa0d6dd2b51a5e2291f5a165fae3f51aa00134b

See more details on using hashes here.

File details

Details for the file cysystemd-1.4.8-cp39-cp39-manylinux2014_x86_64.whl.

File metadata

  • Download URL: cysystemd-1.4.8-cp39-cp39-manylinux2014_x86_64.whl
  • Upload date:
  • Size: 1.7 MB
  • Tags: CPython 3.9
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.23.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.45.0 CPython/3.8.3

File hashes

Hashes for cysystemd-1.4.8-cp39-cp39-manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 fb1d34e7e9711a2406f0a7c5835cdf5e44ede3d4b2da752b5653f8b7b41b19ca
MD5 c15ea2c0a6b92872deb1c184978df7f6
BLAKE2b-256 81c4fd54b45fba2fbc8940ea92b7375b0ee94f5a6e16a93f58c1b40e2584d8fb

See more details on using hashes here.

File details

Details for the file cysystemd-1.4.8-cp38-cp38-manylinux2014_x86_64.whl.

File metadata

  • Download URL: cysystemd-1.4.8-cp38-cp38-manylinux2014_x86_64.whl
  • Upload date:
  • Size: 1.7 MB
  • Tags: CPython 3.8
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.23.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.45.0 CPython/3.8.3

File hashes

Hashes for cysystemd-1.4.8-cp38-cp38-manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 50a31161a1c84c077976cb6279d74b3f3d59f4628a7cdf935c19ad5df038de6f
MD5 a8df672a113623aa998ba542f58787cc
BLAKE2b-256 41992c6b202111114f79673c4e2679c085c5f66fdc7aa44ab1d7c7c890019ef9

See more details on using hashes here.

File details

Details for the file cysystemd-1.4.8-cp37-cp37m-manylinux2014_x86_64.whl.

File metadata

  • Download URL: cysystemd-1.4.8-cp37-cp37m-manylinux2014_x86_64.whl
  • Upload date:
  • Size: 1.6 MB
  • Tags: CPython 3.7m
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.23.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.45.0 CPython/3.8.3

File hashes

Hashes for cysystemd-1.4.8-cp37-cp37m-manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 6ae4e6a00dd40ce83a91428ca3fbc596a0c705cd2d3eb68b8cb585a5be52aaa5
MD5 ce2ba4bf719ab0c7ff25dc1e4d6d0e2a
BLAKE2b-256 e9185fb246726ac21246267cb07265e8d92071ec3225f366f4fbccaa61ed434b

See more details on using hashes here.

File details

Details for the file cysystemd-1.4.8-cp36-cp36m-manylinux2014_x86_64.whl.

File metadata

  • Download URL: cysystemd-1.4.8-cp36-cp36m-manylinux2014_x86_64.whl
  • Upload date:
  • Size: 1.5 MB
  • Tags: CPython 3.6m
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.23.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.45.0 CPython/3.8.3

File hashes

Hashes for cysystemd-1.4.8-cp36-cp36m-manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 799fc792a259ffc57365b8913d94cf78088b902dd61be0c64831cd7d39c44524
MD5 2b3346944d6e916b99a7e1f6d3746dfe
BLAKE2b-256 535a597d3506505a4272775b587f0db71add3e37c5d3a8ed3324cde65ed64db6

See more details on using hashes here.

File details

Details for the file cysystemd-1.4.8-cp35-cp35m-manylinux2014_x86_64.whl.

File metadata

  • Download URL: cysystemd-1.4.8-cp35-cp35m-manylinux2014_x86_64.whl
  • Upload date:
  • Size: 1.5 MB
  • Tags: CPython 3.5m
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.23.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.45.0 CPython/3.8.3

File hashes

Hashes for cysystemd-1.4.8-cp35-cp35m-manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 8873fae6fdc65982d4c5536a07e282b186c726ba341a9b9b24e3e68aa6b70bdc
MD5 f42bbd596d71b17505179b4ed9b724b3
BLAKE2b-256 76d8e4ed3328fc0dbe98c8f2bfe69913ce0e76c5e3cf5ad4560cd59936713d55

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page