![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"
}