cysystemd


Namecysystemd JSON
Version 1.6.2 PyPI version JSON
download
home_pagehttp://github.com/mosquito/cysystemd
Summarysystemd wrapper in Cython
upload_time2024-05-29 10:10:19
maintainerNone
docs_urlNone
authorDmitry Orlov <me@mosquito.su>
requires_python<4,>3.6
licenseApache
keywords systemd python daemon sd_notify cython
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            ![pypi version](https://img.shields.io/pypi/v/cysystemd.svg) ![](https://img.shields.io/pypi/pyversions/cysystemd.svg)  ![License](https://img.shields.io/pypi/l/cysystemd.svg)

# systemd wrapper in Cython

Python systemd wrapper using Cython.


## Installation

All packages available on `github releases <https://github.com/mosquito/cysystemd/releases>`_.

### Installation from binary wheels

* wheels is now available for Python 3.8, 3.9, 3.10, 3.11, 3.12
  for `x86_64` and `arm64`

```shell
python3.10 -m pip install \
  https://github.com/mosquito/cysystemd/releases/download/1.6.2/cysystemd-1.6.2-cp310-cp310-linux_x86_64.whl
```

### Installation from sources

You **must** install **systemd headers**

For Debian/Ubuntu users:

```shell
apt install build-essential libsystemd-dev
```

On older versions of Debian/Ubuntu, you might also need to install:

```shell
apt install libsystemd-daemon-dev libsystemd-journal-dev
```

For CentOS/RHEL

```shell
yum install gcc systemd-devel
```

And install it from pypi

```shell
pip install cysystemd
```

## Usage examples

### Writing to journald

#### Logging handler for python logger

```python
from cysystemd import journal
import logging
import uuid

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

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

#### systemd daemon notification


```python
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:

```python
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

```python

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

```python
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

```python
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` - deprecated alias of `SYSTEM`


```python
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.

```python
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())
```

            

Raw data

            {
    "_id": null,
    "home_page": "http://github.com/mosquito/cysystemd",
    "name": "cysystemd",
    "maintainer": null,
    "docs_url": null,
    "requires_python": "<4,>3.6",
    "maintainer_email": null,
    "keywords": "systemd, python, daemon, sd_notify, cython",
    "author": "Dmitry Orlov <me@mosquito.su>",
    "author_email": "me@mosquito.su",
    "download_url": "https://files.pythonhosted.org/packages/b5/66/25fa2eda48dc9c634a2ae1b8c9879ed842359f2d8f3d2bf7bd88783e278c/cysystemd-1.6.2.tar.gz",
    "platform": "POSIX",
    "description": "![pypi version](https://img.shields.io/pypi/v/cysystemd.svg) ![](https://img.shields.io/pypi/pyversions/cysystemd.svg)  ![License](https://img.shields.io/pypi/l/cysystemd.svg)\n\n# systemd wrapper in Cython\n\nPython systemd wrapper using Cython.\n\n\n## Installation\n\nAll packages available on `github releases <https://github.com/mosquito/cysystemd/releases>`_.\n\n### Installation from binary wheels\n\n* wheels is now available for Python 3.8, 3.9, 3.10, 3.11, 3.12\n  for `x86_64` and `arm64`\n\n```shell\npython3.10 -m pip install \\\n  https://github.com/mosquito/cysystemd/releases/download/1.6.2/cysystemd-1.6.2-cp310-cp310-linux_x86_64.whl\n```\n\n### Installation from sources\n\nYou **must** install **systemd headers**\n\nFor Debian/Ubuntu users:\n\n```shell\napt install build-essential libsystemd-dev\n```\n\nOn older versions of Debian/Ubuntu, you might also need to install:\n\n```shell\napt install libsystemd-daemon-dev libsystemd-journal-dev\n```\n\nFor CentOS/RHEL\n\n```shell\nyum install gcc systemd-devel\n```\n\nAnd install it from pypi\n\n```shell\npip install cysystemd\n```\n\n## Usage examples\n\n### Writing to journald\n\n#### Logging handler for python logger\n\n```python\nfrom cysystemd import journal\nimport logging\nimport uuid\n\nlogging.basicConfig(level=logging.DEBUG)\nlogger = logging.getLogger()\nlogger.addHandler(journal.JournaldLogHandler())\n\ntry:\n    logger.info(\"Trying to do something\")\n    raise Exception('foo')\nexcept:\n    logger.exception(\"Test Exception %s\", 1)\n```\n\n#### systemd daemon notification\n\n\n```python\nfrom cysystemd.daemon import notify, Notification\n\n# Send READY=1\nnotify(Notification.READY)\n\n# Send status\nnotify(Notification.STATUS, \"I'm fine.\")\n\n# Send stopping\nnotify(Notification.STOPPING)\n```\n\nWrite message into systemd journal:\n\n```python\nfrom cysystemd import journal\n\n\njournal.write(\"Hello Lennart\")\n\n# Or send structured data\njournal.send(\n    message=\"Hello Lennart\",\n    priority=journal.Priority.INFO,\n    some_field='some value',\n)\n```\n\n### Reading journald\n\n#### Reading all systemd records\n\n```python\n\nfrom cysystemd.reader import JournalReader, JournalOpenMode\n\njournal_reader = JournalReader()\njournal_reader.open(JournalOpenMode.SYSTEM)\njournal_reader.seek_head()\n\nfor record in journal_reader:\n    print(record.data['MESSAGE'])\n```\n\n#### Read only cron logs\n\n```python\nfrom cysystemd.reader import JournalReader, JournalOpenMode, Rule\n\n\nrules = (\n  Rule(\"SYSLOG_IDENTIFIER\", \"CRON\") &\n  Rule(\"_SYSTEMD_UNIT\", \"crond.service\") |\n  Rule(\"_SYSTEMD_UNIT\", \"cron.service\")\n)\n\ncron_reader = JournalReader()\ncron_reader.open(JournalOpenMode.SYSTEM)\ncron_reader.seek_head()\ncron_reader.add_filter(rules)\n\nfor record in cron_reader:\n    print(record.data['MESSAGE'])\n```\n\n#### Polling records\n\n```python\nfrom cysystemd.reader import JournalReader, JournalOpenMode\n\n\nreader = JournalReader()\nreader.open(JournalOpenMode.SYSTEM)\nreader.seek_tail()\n\npoll_timeout = 255\n\nwhile True:\n    reader.wait(poll_timeout)\n\n    for record in reader:\n       print(record.data['MESSAGE'])\n```\n\n#### journald open modes\n\n* `CURRENT_USER`\n* `LOCAL_ONLY`\n* `RUNTIME_ONLY`\n* `SYSTEM`\n* `SYSTEM_ONLY` - deprecated alias of `SYSTEM`\n\n\n```python\nfrom cysystemd.reader import JournalReader, JournalOpenMode\n\n\nreader = JournalReader()\nreader.open(JournalOpenMode.CURRENT_USER)\n```\n\n#### journald entry\n\nJournalEntry class has some special properties and methods:\n\n* `data` - journal entry content (`dict`)\n* `date` - entry timestamp (`datetime` instance)\n* `cursor` - systemd identification bytes for this entry\n* `boot_id()` - returns bootid\n* `get_realtime_sec()` - entry epoch (`float`)\n* `get_realtime_usec()` - entry epoch (`int` microseconds)\n* `get_monotonic_sec()` - entry monotonic time (`float`)\n* `get_monotonic_usec()` - entry monotonic time (`int` microseconds)\n* `__getitem__(key)` - shoutcut for `entry.data[key]`\n\n\n#### journald reader\n\nJournalReader class has some special properties and methods:\n\n* `open(flags=JournalOpenMode.CURRENT_USER)` - opening journald\n  with selected mode\n* `open_directory(path)` - opening journald from path\n* `open_files(*filename)` - opening journald from files\n* `data_threshold` - may be used to get or set the data field size threshold\n  for data returned by fething entry data.\n* `closed` - returns True when journal reader closed\n* `locked` - returns True when journal reader locked\n* `idle` - returns True when journal reader opened\n* `seek_head` - move reader pointer to the first entry\n* `seek_tail` - move reader pointer to the last entry\n* `seek_monotonic_usec` - seeks to the entry with the specified monotonic\n  timestamp, i.e. CLOCK_MONOTONIC. Since monotonic time restarts on every\n  reboot a boot ID needs to be specified as well.\n* `seek_realtime_usec` - seeks to the entry with the specified realtime\n  (wallclock) timestamp, i.e. CLOCK_REALTIME. Note that the realtime clock\n  is not necessarily monotonic. If a realtime timestamp is ambiguous, it is\n  not defined which position is sought to.\n* `seek_cursor` - seeks to the entry located at the specified cursor\n  (see `JournalEntry.cursor`).\n* `wait(timeout)` - It will synchronously wait until the journal gets\n  changed. The maximum time this call sleeps may be controlled with the\n  timeout_usec parameter.\n* `__iter__` - returns JournalReader object\n* `__next__` - calls `next()` or raise `StopIteration`\n* `next(skip=0)` - returns the next `JournalEntry`. The `skip`\n  parameter skips some entries.\n* `previous(skip=0)` - returns the previous `JournalEntry`.\n  The `skip` parameter skips some entries.\n* `skip_next(skip)` - skips next entries.\n* `skip_previous(skip)` - skips next entries.\n* `add_filter(rule)` - adding filter rule.\n  See `read-only-cron-logs`_ as example.\n* `clear_filter` - reset all filters\n* `fd` - returns a special file descriptor\n* `events` - returns `EPOLL` events\n* `timeout` - returns internal timeout\n* `process_events()` - After each poll() wake-up process_events() needs\n  to be called to process events. This call will also indicate what kind of\n  change has been detected.\n* `get_catalog()` - retrieves a message catalog entry for the current\n  journal entry. This will look up an entry in the message catalog by using\n  the \"MESSAGE_ID=\" field of the current journal entry. Before returning\n  the entry all journal field names in the catalog entry text enclosed in\n  \"@\" will be replaced by the respective field values of the current entry.\n  If a field name referenced in the message catalog entry does not exist,\n  in the current journal entry, the \"@\" will be removed, but the field name\n  otherwise left untouched.\n* `get_catalog_for_message_id(message_id: UUID)` - works similar to\n  `get_catalog()` but the entry is looked up by the specified\n  message ID (no open journal context is necessary for this),\n  and no field substitution is performed.\n\n\n### Asyncio support\n\nInitial `asyncio` support for reading journal asynchronously.\n\n#### AsyncJournalReader\n\nBlocking methods were wrapped by threads.\nMethod `wait()` use epoll on journald file descriptor.\n\n```python\nimport asyncio\nimport json\n\nfrom cysystemd.reader import JournalOpenMode\nfrom cysystemd.async_reader import AsyncJournalReader\n\n\nasync def main():\n    reader = AsyncJournalReader()\n    await reader.open(JournalOpenMode.SYSTEM)\n    await reader.seek_tail()\n\n    while await reader.wait():\n        async for record in reader:\n            print(\n                json.dumps(\n                    record.data,\n                    indent=1,\n                    sort_keys=True\n                )\n            )\n\nif __name__ == '__main__':\n    asyncio.run(main())\n```\n",
    "bugtrack_url": null,
    "license": "Apache",
    "summary": "systemd wrapper in Cython",
    "version": "1.6.2",
    "project_urls": {
        "Homepage": "http://github.com/mosquito/cysystemd"
    },
    "split_keywords": [
        "systemd",
        " python",
        " daemon",
        " sd_notify",
        " cython"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "a2b08049c1f9c70eef2ed9afb67b2525428835a050189d597d98b2466b0faab2",
                "md5": "888eb7af21f0ce8d51da201bc070e956",
                "sha256": "9832d674fe44a729f0046626c9cbe18e6275ce697704817a9d93497a4082d306"
            },
            "downloads": -1,
            "filename": "cysystemd-1.6.2-cp310-cp310-manylinux_2_28_aarch64.whl",
            "has_sig": false,
            "md5_digest": "888eb7af21f0ce8d51da201bc070e956",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": "<4,>3.6",
            "size": 2647823,
            "upload_time": "2024-05-29T10:09:57",
            "upload_time_iso_8601": "2024-05-29T10:09:57.514759Z",
            "url": "https://files.pythonhosted.org/packages/a2/b0/8049c1f9c70eef2ed9afb67b2525428835a050189d597d98b2466b0faab2/cysystemd-1.6.2-cp310-cp310-manylinux_2_28_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "70835e3d6bf5ef96f151fb6cc9c3da441390595907ed12ec4c17db66dcbc3e25",
                "md5": "887b064d9893e9b78acc361ec58d3e18",
                "sha256": "a84a36222a04b610c642738d8181fbdee81097677841f55fbb42ddb70725b104"
            },
            "downloads": -1,
            "filename": "cysystemd-1.6.2-cp310-cp310-manylinux_2_28_x86_64.whl",
            "has_sig": false,
            "md5_digest": "887b064d9893e9b78acc361ec58d3e18",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": "<4,>3.6",
            "size": 2778712,
            "upload_time": "2024-05-29T10:09:59",
            "upload_time_iso_8601": "2024-05-29T10:09:59.436148Z",
            "url": "https://files.pythonhosted.org/packages/70/83/5e3d6bf5ef96f151fb6cc9c3da441390595907ed12ec4c17db66dcbc3e25/cysystemd-1.6.2-cp310-cp310-manylinux_2_28_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "131dbf5afa30acd91a5d75b787121ec56de56d362a76ce0b6e40066c1eecd9d7",
                "md5": "3108eeced742bf9879f68827bb4abf80",
                "sha256": "f01765aaf633ab422d709921533f4091b7b2efd6b7b0ff61aa241fe27cd8e216"
            },
            "downloads": -1,
            "filename": "cysystemd-1.6.2-cp311-cp311-manylinux_2_28_aarch64.whl",
            "has_sig": false,
            "md5_digest": "3108eeced742bf9879f68827bb4abf80",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": "<4,>3.6",
            "size": 2710511,
            "upload_time": "2024-05-29T10:10:02",
            "upload_time_iso_8601": "2024-05-29T10:10:02.865703Z",
            "url": "https://files.pythonhosted.org/packages/13/1d/bf5afa30acd91a5d75b787121ec56de56d362a76ce0b6e40066c1eecd9d7/cysystemd-1.6.2-cp311-cp311-manylinux_2_28_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "2c60974e1399f49ba432192324e9b4a7ed38332b6ff3f8f4c7062407a716efb3",
                "md5": "d855004b0f90ad59da6e256b2ff3e5de",
                "sha256": "3268d560eff2c4542f8a3f3667056e67c044da1fd6e657edbd0b2d9cb36a4874"
            },
            "downloads": -1,
            "filename": "cysystemd-1.6.2-cp311-cp311-manylinux_2_28_x86_64.whl",
            "has_sig": false,
            "md5_digest": "d855004b0f90ad59da6e256b2ff3e5de",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": "<4,>3.6",
            "size": 2839145,
            "upload_time": "2024-05-29T10:10:05",
            "upload_time_iso_8601": "2024-05-29T10:10:05.539371Z",
            "url": "https://files.pythonhosted.org/packages/2c/60/974e1399f49ba432192324e9b4a7ed38332b6ff3f8f4c7062407a716efb3/cysystemd-1.6.2-cp311-cp311-manylinux_2_28_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "1001b93d43f962a8d9c88e04d5db982b7037e12b12b79c9fe4cbb78177dd9536",
                "md5": "461e7195065bd0015da1586e7f34cd32",
                "sha256": "aef6a59b44a810a431266a0d011a1beddefb1ff50287cafc049f3a58a6efef50"
            },
            "downloads": -1,
            "filename": "cysystemd-1.6.2-cp312-cp312-manylinux_2_28_aarch64.whl",
            "has_sig": false,
            "md5_digest": "461e7195065bd0015da1586e7f34cd32",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": "<4,>3.6",
            "size": 2701681,
            "upload_time": "2024-05-29T10:10:07",
            "upload_time_iso_8601": "2024-05-29T10:10:07.888501Z",
            "url": "https://files.pythonhosted.org/packages/10/01/b93d43f962a8d9c88e04d5db982b7037e12b12b79c9fe4cbb78177dd9536/cysystemd-1.6.2-cp312-cp312-manylinux_2_28_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "ab162e24a29913a57bf8c346d4592bc95157d33fca2b11811b04f8a88596db85",
                "md5": "62fb0b2fdf005d874a4de8dca4454918",
                "sha256": "e3f203b4ccd95007e13a1a77d41eb58b4a4f70c3c601f714dae0688b1c09b5ed"
            },
            "downloads": -1,
            "filename": "cysystemd-1.6.2-cp312-cp312-manylinux_2_28_x86_64.whl",
            "has_sig": false,
            "md5_digest": "62fb0b2fdf005d874a4de8dca4454918",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": "<4,>3.6",
            "size": 2840049,
            "upload_time": "2024-05-29T10:10:10",
            "upload_time_iso_8601": "2024-05-29T10:10:10.106344Z",
            "url": "https://files.pythonhosted.org/packages/ab/16/2e24a29913a57bf8c346d4592bc95157d33fca2b11811b04f8a88596db85/cysystemd-1.6.2-cp312-cp312-manylinux_2_28_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "3448d1c720f3ac3220d3ada71e33757ffdc5143a1bcc4dcb5e3a556d6a9f8e3b",
                "md5": "7c18ca090ef7a5dd72f0f2b0473a3662",
                "sha256": "2867e9b3843a024ae08ba1a9618ca35bd024dfcc5d28606abd975616fe494c07"
            },
            "downloads": -1,
            "filename": "cysystemd-1.6.2-cp38-cp38-manylinux_2_28_aarch64.whl",
            "has_sig": false,
            "md5_digest": "7c18ca090ef7a5dd72f0f2b0473a3662",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": "<4,>3.6",
            "size": 2684657,
            "upload_time": "2024-05-29T10:10:12",
            "upload_time_iso_8601": "2024-05-29T10:10:12.713246Z",
            "url": "https://files.pythonhosted.org/packages/34/48/d1c720f3ac3220d3ada71e33757ffdc5143a1bcc4dcb5e3a556d6a9f8e3b/cysystemd-1.6.2-cp38-cp38-manylinux_2_28_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "16e7730ad713ddb2f5dc6be5fdccaaa91b5751dfce97162c5d63f5d64d5687fc",
                "md5": "d0fe226712737ddd6623eb66a12b50aa",
                "sha256": "1d17270f8d8b7920a6a2f2cf3fb8812d42a408e2ceca0599b8734b97ef7004e2"
            },
            "downloads": -1,
            "filename": "cysystemd-1.6.2-cp38-cp38-manylinux_2_28_x86_64.whl",
            "has_sig": false,
            "md5_digest": "d0fe226712737ddd6623eb66a12b50aa",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": "<4,>3.6",
            "size": 2815134,
            "upload_time": "2024-05-29T10:10:14",
            "upload_time_iso_8601": "2024-05-29T10:10:14.549511Z",
            "url": "https://files.pythonhosted.org/packages/16/e7/730ad713ddb2f5dc6be5fdccaaa91b5751dfce97162c5d63f5d64d5687fc/cysystemd-1.6.2-cp38-cp38-manylinux_2_28_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "bff8b086e303ba3b0d77c027bd3f200b55c31535f0f5b2092288a0753edfa9ed",
                "md5": "770fcec556575cdd101ed710bf3ac78d",
                "sha256": "f31fbeafae0699f9ac62c9f071ab4ce5dab2a8ae8a0f0ecad8dcc24df40833b2"
            },
            "downloads": -1,
            "filename": "cysystemd-1.6.2-cp39-cp39-manylinux_2_28_aarch64.whl",
            "has_sig": false,
            "md5_digest": "770fcec556575cdd101ed710bf3ac78d",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": "<4,>3.6",
            "size": 2649254,
            "upload_time": "2024-05-29T10:10:16",
            "upload_time_iso_8601": "2024-05-29T10:10:16.276072Z",
            "url": "https://files.pythonhosted.org/packages/bf/f8/b086e303ba3b0d77c027bd3f200b55c31535f0f5b2092288a0753edfa9ed/cysystemd-1.6.2-cp39-cp39-manylinux_2_28_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "0fa26ffe2ca9403309d9115a990c4332ff14589cc776e78b0bc53aeaef989963",
                "md5": "dc5efbc1213cb65ca7de55c2a776809f",
                "sha256": "d7ded57ed5e0c6d6b7078b1ac496a99b77cfddc6a94b2f062e6400682c9e3022"
            },
            "downloads": -1,
            "filename": "cysystemd-1.6.2-cp39-cp39-manylinux_2_28_x86_64.whl",
            "has_sig": false,
            "md5_digest": "dc5efbc1213cb65ca7de55c2a776809f",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": "<4,>3.6",
            "size": 2778876,
            "upload_time": "2024-05-29T10:10:17",
            "upload_time_iso_8601": "2024-05-29T10:10:17.889476Z",
            "url": "https://files.pythonhosted.org/packages/0f/a2/6ffe2ca9403309d9115a990c4332ff14589cc776e78b0bc53aeaef989963/cysystemd-1.6.2-cp39-cp39-manylinux_2_28_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "b56625fa2eda48dc9c634a2ae1b8c9879ed842359f2d8f3d2bf7bd88783e278c",
                "md5": "3e4b3e9c25281411e57d84132b7c49d2",
                "sha256": "6097e2d1ecbc7f21a90552e8432ed7bb5dfea06ff7a04f1001e949f8ff4756da"
            },
            "downloads": -1,
            "filename": "cysystemd-1.6.2.tar.gz",
            "has_sig": false,
            "md5_digest": "3e4b3e9c25281411e57d84132b7c49d2",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": "<4,>3.6",
            "size": 298936,
            "upload_time": "2024-05-29T10:10:19",
            "upload_time_iso_8601": "2024-05-29T10:10:19.933533Z",
            "url": "https://files.pythonhosted.org/packages/b5/66/25fa2eda48dc9c634a2ae1b8c9879ed842359f2d8f3d2bf7bd88783e278c/cysystemd-1.6.2.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-05-29 10:10:19",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "mosquito",
    "github_project": "cysystemd",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": false,
    "lcname": "cysystemd"
}
        
Elapsed time: 1.66660s