Add SHAREPOINT_CERTIFICATE_PATH as a secure alternative to
SHAREPOINT_CLIENT_SECRET for authenticating with SharePoint via
Microsoft Graph API.
- JWT assertion flow using cryptography + PyJWT
- SHAREPOINT_CERTIFICATE_PASSWORD for encrypted PEM keys
- Mutual exclusivity validation (secret vs cert)
- New optional extra: pip install oikb[sharepoint-cert]
Closes#3
2KB inline HTML page, monospace, dark background. Polls /health
every 10s and renders source statuses with colored dots, last
sync time, duration, file counts. Zero dependencies.
validate --deep pings Open WebUI API to verify connectivity, API key
validity, and that each KB ID exists. Catches config errors before
deployment. Also applies defaults and env var interpolation in
validate (was missing).
docker-compose.yaml updated from stale watch mode to production
daemon mode with healthcheck, LOG_FORMAT, and OIKB_API_KEY.
Generates .oikb.yaml by prompting for source, KB ID, name, and
interval. Outputs next-step commands (validate, sync, daemon).
Updated README Quick Start to lead with init.
defaults: key in .oikb.yaml sets interval, concurrency, filter,
notify, etc. once for all entries — per-entry values override.
Deep merges nested dicts. Added standalone docker run example
and LOG_FORMAT=json to Docker Compose.
- Per-KB asyncio.Lock prevents overlapping syncs from scheduler,
webhook, and API triggers running simultaneously
- POST /sync/{id}?dry_run=true previews changes without uploading
- ${VAR} and ${VAR:-default} interpolation in all .oikb.yaml strings
for GitOps workflows where secrets come from the runtime
notify key in .oikb.yaml entries POSTs JSON to any HTTP endpoint on
sync error. Includes a text field for native Slack incoming webhook
support. Configurable: on: error (default) or on: always.
filter.max-size in .oikb.yaml (or --max-file-size CLI flag) skips
files exceeding the limit before they reach the diff endpoint.
Supports human-readable sizes: 50mb, 1gb, 500kb. Warns per file.
oikb daemon --log-format json (or LOG_FORMAT=json env var) outputs
one JSON object per line with ts, level, logger, msg, and optional
sync-specific fields. Compatible with Datadog, Splunk, ELK,
CloudWatch, and Loki.
interval key now accepts both simple intervals (30m, 1h) and
standard cron expressions (0 6 * * 1-5). Auto-detected based on
field count — no config flag needed. Adds croniter>=2.0 dep.
GET /metrics exposes sync counters (total, errors), duration
histogram, and file upload/delete counters — all labeled by source.
Includes oikb_info with build version. Adds prometheus-client dep.
Spinner during scan/diff phases, progress bar with file count and
elapsed time during uploads. Output goes to stderr, respects --quiet
(daemon) and --verbose modes. Adds rich>=13.0 as core dependency.
Drop the ambiguous 'routes' key from .oikb.yaml. Multi-KB from a
single source is now done with multiple entries + filter.include.
Every entry is strictly source + kb-id, no branching logic.
- Add env.py with _resolve_file_env for Docker secrets _FILE support
- HTTPBearer + Depends(verify_api_key) per route instead of middleware
- hmac.compare_digest for timing-safe key comparison
- Health endpoints public, /history and /sync require auth
Match ServiceNow's configurability: custom JQL, field selection,
markdown/json format, and limit. Supports query string params:
jira:PROJ?jql=status=open&fields=summary,status&format=json&limit=50