first release

This commit is contained in:
2026-05-12 11:04:17 +02:00
parent d49cebf616
commit e8ef2081ed
13 changed files with 1403 additions and 0 deletions
+78
View File
@@ -0,0 +1,78 @@
"""Nextcloud Provisioning API (OCS) Client."""
from typing import Optional
import requests
import urllib3
class NextcloudError(Exception):
pass
class NextcloudClient:
def __init__(self, host: str, *, admin_user: str, admin_password: str,
verify: bool = True, scheme: str = "https"):
if not host:
raise NextcloudError("Nextcloud-Host ist leer")
self.base = f"{scheme}://{host}"
self.session = requests.Session()
self.session.verify = verify
if not verify:
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
self.session.auth = (admin_user, admin_password)
self.session.headers["OCS-APIRequest"] = "true"
self.session.headers["Accept"] = "application/json"
def _meta(self, r: requests.Response, op: str) -> dict:
if not r.ok and r.status_code not in (400, 401, 403, 404):
raise NextcloudError(f"Nextcloud {op} HTTP {r.status_code}: {r.text[:300]}")
try:
data = r.json()
except ValueError:
raise NextcloudError(f"Nextcloud {op}: ungültige Antwort: {r.text[:300]}")
return data.get("ocs", {})
def user_exists(self, userid: str) -> bool:
r = self.session.get(f"{self.base}/ocs/v2.php/cloud/users/{userid}")
ocs = self._meta(r, "user-lookup")
sc = ocs.get("meta", {}).get("statuscode")
return sc in (100, 200)
def ensure_group(self, group: str) -> None:
if not group:
return
r = self.session.post(
f"{self.base}/ocs/v2.php/cloud/groups",
data={"groupid": group},
)
ocs = self._meta(r, "group-create")
sc = ocs.get("meta", {}).get("statuscode")
# 100/200 = ok, 102 = exists already
if sc not in (100, 200, 102):
raise NextcloudError(
f"Nextcloud Gruppe '{group}': {sc} {ocs.get('meta', {}).get('message')}"
)
def create_user(self, *, userid: str, password: str,
email: Optional[str] = None,
display_name: Optional[str] = None,
group: Optional[str] = None,
quota_gb: Optional[int] = None) -> None:
body = [("userid", userid), ("password", password)]
if email:
body.append(("email", email))
if display_name:
body.append(("displayName", display_name))
if group:
body.append(("groups[]", group))
body.append(("quota", f"{quota_gb} GB" if quota_gb else "none"))
r = self.session.post(
f"{self.base}/ocs/v2.php/cloud/users",
data=body,
)
ocs = self._meta(r, "user-create")
sc = ocs.get("meta", {}).get("statuscode")
if sc not in (100, 200):
raise NextcloudError(
f"Nextcloud user-create: {sc} {ocs.get('meta', {}).get('message')}"
)