diff --git a/Dockerfile b/Dockerfile index 545d875..e49afc8 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,9 +2,10 @@ FROM python:3-alpine COPY requirements.txt /code/requirements.txt RUN pip install -r /code/requirements.txt -RUN echo '*/5 * * * * python3 /code/main.py' | crontab - +RUN echo '0 1,13 * * * python3 /code/main.py' | crontab - COPY . /code WORKDIR /code -CMD ["/usr/sbin/crond", "-f", "-d", "0"] +EXPOSE 5000 +ENTRYPOINT ["/code/entrypoint.sh"] diff --git a/entrypoint.sh b/entrypoint.sh new file mode 100755 index 0000000..5c18b4e --- /dev/null +++ b/entrypoint.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env sh +crond +flask --app main run -h 0.0.0.0 diff --git a/main.py b/main.py index 160cb1d..093bf30 100755 --- a/main.py +++ b/main.py @@ -1,6 +1,7 @@ #!/usr/bin/env python3 from dolibarrpy import Dolibarrpy +from flask import Flask, abort, request from ldap3 import ALL, Connection, ObjectDef, Reader, Server, WritableEntry, Writer import config @@ -122,5 +123,26 @@ def append_extra_fields_to_ldap_group(ldap_group: WritableEntry, dolibarr_group: setattr(ldap_group, ldap_attr, value) +flask_app = Flask(__name__) + +@flask_app.post('/webhook') +def webhook_receiver(): + data = request.json + if 'triggercode' not in data or 'object' not in data: + abort(400) + triggercode = data['triggercode'] + obj = data['object'] + ldap_server = Server(config.LDAP_HOST, config.LDAP_PORT, get_info=ALL) + if triggercode.startswith('USER_'): + with Connection(ldap_server, config.LDAP_BIND_USER, config.LDAP_BIND_PASSWORD) as ldap_conn: + manage_user_extra_fields(ldap_conn, obj) + elif triggercode.startswith('GROUP_'): + with Connection(ldap_server, config.LDAP_BIND_USER, config.LDAP_BIND_PASSWORD) as ldap_conn: + manage_group_extra_fields(ldap_conn, obj) + else: + abort(400) + return "", 204 + + if __name__ == '__main__': main() diff --git a/requirements.txt b/requirements.txt index 4337eff..739f7c4 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,4 @@ +flask ldap3 dolibarrpy icecream