{"id":34055051,"url":"https://github.com/univention/python-udm-rest-api-client","last_synced_at":"2026-04-04T12:58:59.606Z","repository":{"id":36335916,"uuid":"222647035","full_name":"univention/python-udm-rest-api-client","owner":"univention","description":"Python library to interact with the Univention UDM REST API.","archived":false,"fork":false,"pushed_at":"2025-11-20T09:28:13.000Z","size":415,"stargazers_count":2,"open_issues_count":2,"forks_count":1,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-12-15T21:26:40.424Z","etag":null,"topics":["aiohttp","aiohttp-client","openapi-client","python","python3","rest-client","ucs","univention","univention-corporate-server"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/univention.png","metadata":{"files":{"readme":"README.rst","changelog":"HISTORY.rst","contributing":"CONTRIBUTING.rst","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2019-11-19T08:32:57.000Z","updated_at":"2025-11-20T09:28:17.000Z","dependencies_parsed_at":"2023-01-17T01:15:46.468Z","dependency_job_id":"f2b9b2c9-799f-41d7-bb8d-54b0bafdd4f0","html_url":"https://github.com/univention/python-udm-rest-api-client","commit_stats":{"total_commits":169,"total_committers":9,"mean_commits":18.77777777777778,"dds":"0.47337278106508873","last_synced_commit":"384611a09a451bb0c94dccb2222840f50620bc68"},"previous_names":[],"tags_count":16,"template":false,"template_full_name":null,"purl":"pkg:github/univention/python-udm-rest-api-client","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/univention%2Fpython-udm-rest-api-client","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/univention%2Fpython-udm-rest-api-client/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/univention%2Fpython-udm-rest-api-client/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/univention%2Fpython-udm-rest-api-client/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/univention","download_url":"https://codeload.github.com/univention/python-udm-rest-api-client/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/univention%2Fpython-udm-rest-api-client/sbom","scorecard":{"id":910395,"data":{"date":"2025-08-18","repo":{"name":"github.com/univention/python-udm-rest-api-client","commit":"716a0a21b557f627fad9701fb6512ad61877b8e6"},"scorecard":{"version":"v5.2.1-41-g40576783","commit":"40576783fda6698350fcbbeaea760ff827433034"},"score":1.7,"checks":[{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/40576783fda6698350fcbbeaea760ff827433034/docs/checks.md#packaging"}},{"name":"Code-Review","score":0,"reason":"Found 0/30 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/40576783fda6698350fcbbeaea760ff827433034/docs/checks.md#code-review"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/40576783fda6698350fcbbeaea760ff827433034/docs/checks.md#token-permissions"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/40576783fda6698350fcbbeaea760ff827433034/docs/checks.md#dangerous-workflow"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/40576783fda6698350fcbbeaea760ff827433034/docs/checks.md#maintained"}},{"name":"SAST","score":0,"reason":"no SAST tool detected","details":["Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/40576783fda6698350fcbbeaea760ff827433034/docs/checks.md#sast"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/40576783fda6698350fcbbeaea760ff827433034/docs/checks.md#binary-artifacts"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/40576783fda6698350fcbbeaea760ff827433034/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/40576783fda6698350fcbbeaea760ff827433034/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/40576783fda6698350fcbbeaea760ff827433034/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/40576783fda6698350fcbbeaea760ff827433034/docs/checks.md#fuzzing"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/40576783fda6698350fcbbeaea760ff827433034/docs/checks.md#signed-releases"}},{"name":"License","score":9,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Warn: project license file does not contain an FSF or OSI license."],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/40576783fda6698350fcbbeaea760ff827433034/docs/checks.md#license"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/40576783fda6698350fcbbeaea760ff827433034/docs/checks.md#branch-protection"}},{"name":"Vulnerabilities","score":0,"reason":"20 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: PYSEC-2023-120 / GHSA-45c4-8wx5-qw6w","Warn: Project is vulnerable to: GHSA-5m98-qgg9-wh84","Warn: Project is vulnerable to: GHSA-7gpw-8wmc-pm8g","Warn: Project is vulnerable to: GHSA-8495-4g3g-x7pr","Warn: Project is vulnerable to: PYSEC-2024-26 / GHSA-8qpw-xqxj-h4r2","Warn: Project is vulnerable to: GHSA-9548-qrrj-x5pj","Warn: Project is vulnerable to: PYSEC-2023-246 / GHSA-gfw2-4jvh-wgfg","Warn: Project is vulnerable to: GHSA-pjjw-qhg8-p2p9","Warn: Project is vulnerable to: PYSEC-2023-250 / GHSA-q3qx-c6g2-7pw2","Warn: Project is vulnerable to: PYSEC-2023-251 / GHSA-qvrw-v9rv-5rjx","Warn: Project is vulnerable to: PYSEC-2021-76 / GHSA-v6wp-4m6f-gcjg","Warn: Project is vulnerable to: PYSEC-2023-247 / GHSA-xx9p-xxvh-7g8j","Warn: Project is vulnerable to: PYSEC-2014-14 / GHSA-652x-xj99-gmcc","Warn: Project is vulnerable to: GHSA-9hjg-9r4m-mvj7","Warn: Project is vulnerable to: GHSA-9wx4-h78v-vm56","Warn: Project is vulnerable to: PYSEC-2014-13 / GHSA-cfj3-7x9c-4p3h","Warn: Project is vulnerable to: PYSEC-2018-28 / GHSA-x84v-xcm2-53pg","Warn: Project is vulnerable to: PYSEC-2015-17","Warn: Project is vulnerable to: PYSEC-2023-74","Warn: Project is vulnerable to: PYSEC-2022-43017 / GHSA-qwmp-2cf2-g9g6"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/40576783fda6698350fcbbeaea760ff827433034/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-24T18:54:12.441Z","repository_id":36335916,"created_at":"2025-08-24T18:54:12.442Z","updated_at":"2025-08-24T18:54:12.442Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31400460,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-04T10:20:44.708Z","status":"ssl_error","status_checked_at":"2026-04-04T10:20:06.846Z","response_time":60,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["aiohttp","aiohttp-client","openapi-client","python","python3","rest-client","ucs","univention","univention-corporate-server"],"created_at":"2025-12-14T02:38:24.276Z","updated_at":"2026-04-04T12:58:59.600Z","avatar_url":"https://github.com/univention.png","language":"Python","readme":".. image:: https://img.shields.io/badge/renovate-enabled-brightgreen.svg\n    :target: ../issues/?search=Dependency%20Dashboard\n\n.. image:: https://img.shields.io/badge/renovate-pipeline-brightgreen.svg\n    :target: ../pipelines/new?var[RUN_RENOVATE]=yes\n\n######################\nPython UDM REST Client\n######################\n\nPython library to interact with the Univention `UDM REST API`_,\nimplements the interface of the `Python UDM API`_.\n\nRead the `PyPi README \u003cPYPI_README.rst\u003e`_ for in introduction to this Python package.\n\nFor more detailed information, read the official `docs`_.\n\nRepo permissions\n================\n\n* **GitHub**:\n   * @dansan (Daniel Tröder)\n   * @JuergenBS (Sönke)\n* **GitLab**: UCS developers\n* **PyPI**:\n   * @botner (Felix Botner)\n   * @brodersen4univention (Jürn Brodersen)\n   * @dansan (Daniel Tröder)\n   * @jleadbetter-univention (J Leadbetter)\n   * @SamualYaron (Ole Schwiegert)\n   * @twenzel (Tobias Wenzel)\n* **RTD**: @dansan and @SamuelYaron\n   * @dansan (Daniel Tröder)\n   * @SamualYaron (Ole Schwiegert)\n   * @jleadbetter-univention (J Leadbetter)\n\nTests\n=====\n\nThere are some isolated unittests, but most tests run against a real UDM REST API.\nEither an existing UCS installation can be used, or a LXD container started.\n\nRun tests with the current Python interpreter::\n\n    make test\n\nUsing `tox`_ the tests can be executed with all supported Python versions::\n\n    make test-all\n\nUsing the UCS LXD container is automated in the ``Makefile``.\nIt has commands to download and start the LXD image (1 GB) and running the tests::\n\n    make create-lxd-test-server-config\n    make test\n\nInitializing LXD is however left up to the developer (see https://linuxcontainers.org/lxd/).\nUsing storage backend ``lvm``, ``btrfs`` or ``zfs`` is recommended for repeated use.\nTo run the tests only once, the storage backend ``dir`` is the easiest to use.\nIt is very slow though, as it requires unpacking the image every time the container is started.\n\nThe ``Makefile`` also needs ``yq`` to be installed: https://github.com/mikefarah/yq\n\nIt is also possible to use an existing UCS server for the tests. Export ``UCS_HOST`` (the servers IP/FQDN), ``UCS_USERDN`` (the DN of an administrator account, usually ``uid=Administrator,cn=users,dc=...``) and ``UCS_PASSWORD`` (the accounts password), before starting the tests::\n\n    export UCS_HOST=\"my.server.local\"\n    export UCS_USERDN=\"uid=Administrator,cn=users,dc=domain,dc=local\"\n    export UCS_PASSWORD=\"s3cr3t\"\n    make test\n\nMuch more comfortable (especially for repeated use) is creating a file ``test_server.yaml`` in the ``tests`` directory,\nwhich will automatically be used by the tests::\n\n    cp test_server_example.yaml test/test_server.yaml\n    $EDITOR test_server.yaml\n\nDon't forget to update the OpenAPI client library before running the test against a new server::\n\n    update_openapi_client --generator \u003cdocker|java\u003e --username Administrator --password s3cr3t $UCS_HOST\n\nRun ``update_openapi_client --help`` to see further options.\n\nTo get the IP address of the running UCS LXD container execute::\n\n    . lxd.sh ; lxd_container_ip\n\nReleases\n========\n\nPrerequisites\n-------------\n\nYou need a maintainer account with permissions for the ``udm-rest-client`` for:\n\n* `PyPI Test`_\n* `PyPI`_\n* `ReadTheDocs`_ (community)\n\nFor the PypI Test and PyPI accounts,\ngenerate an API token and add it to your ``.pypirc``\nwith the username ``__token__``.\n\nInstall ``twine``:\n\n.. code:: bash\n\n   sudo apt install twine -y\n\nBefore the release\n------------------\n\n* Verify the `daily tests`_.\n* Create and merge a release commit:\n  * Increment the Python package version in ``udm_rest_client/__init__py`` and ``setup.py``\n  * Update ``HISTORY.rst`` with changelog notes.\n* Tag the release commit with the new version.\n\nPyPI Test Release\n-----------------\n\nWe want to make sure everything looks as expected on PyPI Test\nbefore pushing to production.\n\n* Push the package to test PyPi:\n\n  .. code:: bash\n\n     make release-test\n\n* Verify the updated changelog in `PyPI Test`_.\n* Do a smoke test install on a UCS\\@school VM.\n  Sync the ``python-udm-rest-api-client`` folder to the VM,\n  ``cd`` to the folder, and then:\n\n  .. code:: bash\n\n     pip3 install --upgrade urllib3\n     pip3 install -r requirements.txt\n     pip3 install -i https://test.pypi.org/simple/ udm-rest-client\n\n  The installation of ``requirements.txt`` is required,\n  because not all needed packages have a PyPI Test version.\n* Verify the installed version:\n\n  .. code:: bash\n\n     pip3 freeze | grep udm\n\nPyPI Release\n------------\n\nThese steps push the newest version of the ``udm-rest-client``.\n\n* Push the package to production PyPi:\n\n  .. code:: bash\n\n     make release\n\n* Verify the updated changelog in `PyPI`_.\n* Do a smoke test install on a UCS\\@School VM:\n\n  .. code:: bash\n\n     pip3 install --upgrade urllib3\n     pip3 install udm-rest-client\n\n* Verify the installed version:\n\n  .. code:: bash\n\n     pip3 freeze | grep udm\n\nRead the Docs\n-------------\n\n* Visit the `ReadTheDocs`_ dashboard.\n* Verify that the builds for ``latest`` and ``stable`` passed.\n* Do a visual inspection of the published `docs`_,\n  ``latest`` and ``stable``,\n  paying particular attention that the changelog is up to date on both.\n\n\n.. _`daily tests`: https://jenkins2022.knut.univention.de/job/UCSschool-5.0/job/UDM-REST-API-client-daily/\n.. _`tox`: http://tox.readthedocs.org/\n.. _`UDM REST API`: https://docs.software-univention.de/developer-reference-4.4.html#udm:rest_api\n.. _`Python UDM API`: https://github.com/univention/univention-corporate-server/blob/4.4-8/management/univention-directory-manager-modules/modules/univention/udm/__init__.py\n.. _`OpenAPI Generator`: https://github.com/OpenAPITools/openapi-generator\n.. _`docs`: https://udm-rest-client.readthedocs.io\n.. _`ReadTheDocs`: https://readthedocs.org/projects/udm-rest-client/\n.. _`PyPI`: https://pypi.org/project/udm-rest-client/\n.. _`PyPI Test`: https://test.pypi.org/project/udm-rest-client/\n.. |license| image:: https://img.shields.io/badge/License-AGPL%20v3-orange.svg\n    :alt: GNU AGPL V3 license\n    :target: https://www.gnu.org/licenses/agpl-3.0\n.. |python| image:: https://img.shields.io/badge/python-3.9+-blue.svg\n    :alt: Python 3.9+\n    :target: https://www.python.org/\n.. |code style| image:: https://img.shields.io/badge/code%20style-black-000000.svg\n    :alt: Code style: black\n    :target: https://github.com/psf/black\n.. |codecov| image:: https://codecov.io/gh/univention/python-udm-rest-api-client/branch/master/graph/badge.svg\n    :alt: Code coverage\n    :target: https://codecov.io/gh/univention/python-udm-rest-api-client\n.. |docspassing| image:: https://readthedocs.org/projects/udm-rest-client/badge/?version=latest\n    :alt: Documentation Status\n    :target: https://udm-rest-client.readthedocs.io/en/latest/?badge=latest\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Funivention%2Fpython-udm-rest-api-client","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Funivention%2Fpython-udm-rest-api-client","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Funivention%2Fpython-udm-rest-api-client/lists"}