Oncall is a calendar tool designed for scheduling and managing on-call shifts. It can be used as source of dynamic ownership info for paging systems like http://iris.claims.

Overview

Oncall Gitter chat Build Status

See admin docs for information on how to run and manage Oncall.

Development setup

Prerequisites

  • Debian/Ubuntu - sudo apt-get install libsasl2-dev python-dev libldap2-dev libssl-dev python-pip python-setuptools mysql-server mysql-client

Install

python setup.py develop
pip install -e '.[dev]'

Setup mysql schema:

mysql -u root -p < ./db/schema.v0.sql

Setup app config by editing configs/config.yaml.

Optionally, you can import dummy data for testing:

mysql -u root -p -o oncall < ./db/dummy_data.sql

Run

One of the following commands:

  • goreman start
  • procman start
  • make serve
  • oncall-dev ./configs/config.yaml

Test

make test

Check out https://github.com/linkedin/oncall/issues for a list of outstanding issues, and tackle any one that catches your interest. Contributions are expected to be tested thoroughly and submitted with unit/end-to-end tests; look in the e2e directory for our suite of end-to-end tests.

Comments
  • Gui checkbox & global flag not working

    Gui checkbox & global flag not working

    Sooo, I won't lie and say I'm a JS expert, but I have a pretty good understanding of what's going on in oncall.js. But for the life of me, I can't get a checkbox I've added to Browse Teams to work. I need the renderTeams function to be able to interrogate the value of a gui checkbox. So I tried adding a checkbox to index.html. I tacked on a change event and it wouldn't fire unless I put it in a window.onload event. But it worked. Then I tried setting a global flag based on the checkbox and I can't get the renderdata function to read it properly. Sooo I need some help here. What is the recommended way to add a checkbox element onto the browse teams page : and how do I get it's change event to be read.

    opened by UserHIJ 9
  • wrong message of

    wrong message of "user jdoe is already in the roster"

    0 build docker as the ops/packer

    1 run --name mysql -e MYSQL_ROOT_PASSWORD='1234' -d mysql --default-authentication-plugin=mysql_native_password

    2 docker run --name oncall -d --link mysql:mysql -p 8080:8080 -e DOCKER_DB_BOOTSTRAP=1 quay.io/iris/oncall

    3 manually add new user "test" into table user & user_contact or in the oncall docker, setup oncall-admin then create user test (with extra docker param of -p 16652:16652)

    note that: it seems I have to fix https://stackoverflow.com/questions/45368336/error-keyerror-255-when-executing-pymysql-connect https://stackoverflow.com/questions/50156520/cannot-connect-to-a-local-mysql-db-with-sqlalchemy-on-windows-machine in order to make oncall-admin work (so is iris)

    4 log as "test", create team of 'team foo", add roster of 'roster bar', then try to add user of "jdoe" to "roster bar", it complains "user jdoe is already in the roster"

    I have checked out the api code, where the exception is except-ed generally, meaning that any db error would tell user "user * is already in the roster".

    anything I missed?

    opened by liuzhen 7
  • Add Note to Install OpenLDAP

    Add Note to Install OpenLDAP

    Received the following error when running python setup.py develop

        In file included from Modules/LDAPObject.c:9:0:
        Modules/errors.h:8:18: fatal error: lber.h: No such file or directory
        compilation terminated.
        error: command 'x86_64-linux-gnu-gcc' failed with exit status 1
    

    Should save a few minutes by specifying it's a prerequisite. Maybe provide platform specific instruction? apt-get install libldap2-dev ?

    opened by manufacturedba 6
  • LDAP authentication

    LDAP authentication

    Thanks for providing this code! I'm currently trying to implement one of the Docker images available into a Kubernetes cluster, and I'm able to get to the point where the website loads.

    However, after following the guides for the ldap configuration, I run into the error on the login page of 'invalid username or password'.

    The only log that appears to change is var/log/uwsgi/error.log, which mentions the falcon-cors message noted in #204 .

    Is there an example config.yaml containing a 'known good' ldap configuration for AD? The server I use currently accepts ldap (not ldaps) requests.

    Thanks in advance for your help!

    opened by dan2020802 5
  • Allow Users to Edit their Contact Info

    Allow Users to Edit their Contact Info

    I currently use user_sync.py via ldap_sync.py to pull down all users' contact information from LDAP, but many users either do not want their full contact info published in LDAP or want different contact info used for Oncall. This leaves us with a "hybrid" source of user attributes.

    I've been using oncall-admin as a stopgap to edit user contact info that differs from LDAP, but are there any plans/features underway to integrate the same functionality into the user's respective Settings page?

    I would be happy to write such functionality into Oncall if I have your support for the feature.

    opened by p6knewman 5
  • make build fails on MarkupSafe

    make build fails on MarkupSafe

    Running docker build against the Dockerfile results in the same output.

    #13 14.76 Collecting MarkupSafe>=2.0 (from jinja2->oncall==1.4.3)
    #13 14.83   Downloading https://files.pythonhosted.org/packages/bf/10/ff66fea6d1788c458663a84d88787bae15d45daa16f6b3ef33322a51fc7e/MarkupSafe-2.0.1.tar.gz
    #13 14.93     Complete output from command python setup.py egg_info:
    #13 14.93     Traceback (most recent call last):
    #13 14.93       File "<string>", line 1, in <module>
    #13 14.93       File "/tmp/pip-build-ci8_gs00/MarkupSafe/setup.py", line 61, in <module>
    #13 14.93         run_setup(True)
    #13 14.93       File "/tmp/pip-build-ci8_gs00/MarkupSafe/setup.py", line 44, in run_setup
    #13 14.93         ext_modules=ext_modules if with_binary else [],
    #13 14.93       File "/home/oncall/env/lib/python3.6/site-packages/setuptools/__init__.py", line 129, in setup
    #13 14.93         return distutils.core.setup(**attrs)
    #13 14.93       File "/usr/lib/python3.6/distutils/core.py", line 121, in setup
    #13 14.93         dist.parse_config_files()
    #13 14.93       File "/home/oncall/env/lib/python3.6/site-packages/setuptools/dist.py", line 494, in parse_config_files
    #13 14.93         ignore_option_errors=ignore_option_errors)
    #13 14.93       File "/home/oncall/env/lib/python3.6/site-packages/setuptools/config.py", line 106, in parse_configuration
    #13 14.93         meta.parse()
    #13 14.93       File "/home/oncall/env/lib/python3.6/site-packages/setuptools/config.py", line 382, in parse
    #13 14.93         section_parser_method(section_options)
    #13 14.93       File "/home/oncall/env/lib/python3.6/site-packages/setuptools/config.py", line 355, in parse_section
    #13 14.93         self[name] = value
    #13 14.93       File "/home/oncall/env/lib/python3.6/site-packages/setuptools/config.py", line 173, in __setitem__
    #13 14.93         value = parser(value)
    #13 14.93       File "/home/oncall/env/lib/python3.6/site-packages/setuptools/config.py", line 430, in _parse_version
    #13 14.93         version = self._parse_attr(value)
    #13 14.93       File "/home/oncall/env/lib/python3.6/site-packages/setuptools/config.py", line 305, in _parse_attr
    #13 14.93         module = import_module(module_name)
    #13 14.93       File "/usr/lib/python3.6/importlib/__init__.py", line 126, in import_module
    #13 14.93         return _bootstrap._gcd_import(name[level:], package, level)
    #13 14.93       File "<frozen importlib._bootstrap>", line 994, in _gcd_import
    #13 14.93       File "<frozen importlib._bootstrap>", line 971, in _find_and_load
    #13 14.93       File "<frozen importlib._bootstrap>", line 953, in _find_and_load_unlocked
    #13 14.93     ModuleNotFoundError: No module named 'markupsafe'
    #13 14.93
    #13 14.93     ----------------------------------------
    #13 15.04 Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-ci8_gs00/MarkupSafe/
    
    opened by glassrye 4
  • User sync removes already existing users

    User sync removes already existing users

    I think this is a misconfiguration on my part, but every loop of the oncall-user-sync it get the users from LDAP server and tries to add them to the database. But if the user already exists it gives the error for each user: (1062, "Duplicate entry '<my user on ldap server>' for key 'user.username_unique'")

    And then the users gets removed from the database (also its contacts etc). The next iteration it inserts all the users present in the LDAP server. Next time it removes them again for the same reason given above. This does not make sense. I am not being able to understand why it is happening. Can someone give correct configuration example for this features?

    opened by pavanfhw 4
  • Unable to run oncall - throws ModuleNotFoundError

    Unable to run oncall - throws ModuleNotFoundError

    Hi,

    I followed the instructions given to install and run oncall but ran into this issue : Note - python version is 3.6.3, using virtualenv , OS is linux SLES11.

    (venv) $ make serve oncall-dev ./configs/config.yaml Traceback (most recent call last): File "/nfs/user1/workspace/oncall/venv/bin/oncall-dev", line 11, in <module> load_entry_point('oncall', 'console_scripts', 'oncall-dev')() File "/nfs/user1/workspace/oncall/venv/lib/python3.6/site-packages/pkg_resources/__init__.py", line 565, in load_entry_point return get_distribution(dist).load_entry_point(group, name) File "/nfs/user1/workspace/oncall/venv/lib/python3.6/site-packages/pkg_resources/__init__.py", line 2631, in load_entry_point return ep.load() File "/nfs/user1/workspace/oncall/venv/lib/python3.6/site-packages/pkg_resources/__init__.py", line 2291, in load return self.resolve() File "/nfs/user1/workspace/oncall/venv/lib/python3.6/site-packages/pkg_resources/__init__.py", line 2297, in resolve module = __import__(self.module_name, fromlist=['__name__'], level=0) File "/nfs/user1/workspace/oncall/src/oncall/bin/run_server.py", line 11, in <module> import oncall.utils File "/nfs/user1/workspace/oncall/src/oncall/utils.py", line 13, in <module> from constants import ONCALL_REMINDER ModuleNotFoundError: No module named 'constants' make: *** [serve] Error 1

    I tried adding the local directory to the PATH variable, but receive the same error. Can someone please advise ?

    opened by arjunnath 4
  •  libldap2-dev

    libldap2-dev

    Dear Maintainer,

    I'm maybe stupid but I'm not able to install the app. Any of Linux distro I get the same error massage:

    The following packages have unmet dependencies: libldap2-dev : Depends: libldap-2.4-2 (= 2.4.40+dfsg-1+deb8u3) but 2.4.44+dfsg-5+deb9u1~bpo8+1 is to be installed E: Unable to correct problems, you have held broken packages.

    Please help me overcome!

    Many thanks! Zoltan

    opened by jegkiralyfi 4
  • Login info

    Login info

    I have installed everything and it works, but I can not find any username and password to use for login via the web page. Is there a default admin user or how should I make a new one?

    opened by kjetilmjos 4
  • user and password to portal?

    user and password to portal?

    hello, what is the easiest way to create user/pass in the portal?

    i had to load the dummy_data.sql and then login using root/root. any other password would not work? and i did not see the password defined in the sql file.

    once i login, i don't see a way to create additional users? do i have to insert into database or is there a simpler way to add users?

    opened by joshrain 4
  • Is there a way to create users locally without having to put them in via mysql?

    Is there a way to create users locally without having to put them in via mysql?

    would like to be able to create users locally with DB, and not have to use MYSQL to input the new users. We don't want to integrate to company LDAP server, instead local authentication with encrypted password stored in DB. Local authentication module also should be plugged and configured to use before start.

    Thank you in advance!

    opened by alskin96 1
  • fix: notifier state get's never persisted in database

    fix: notifier state get's never persisted in database

    • every time the notification starts, it reports a corrupted state because the state never gets stored in the database. saving the state in the database using UPDATE sql only works when there is already one entry in the table, otherwise the query will run through with zero updated rows. so in the case when the state cannot be loaded, we properly create one record inside the notifier_state table
    opened by roock 0
  • Access denied for user 'root'@'localhost'

    Access denied for user 'root'@'localhost'

    I'm not sure if this is a bug or something I'm doing wrong, but I have a fully up-to-date Ubuntu 20.04 VM that I'm trying to get Oncall to run on, and I'm having issues.

    As it appears many of the python2 packages are either unavailable or simply deprecated in Ubuntu 20.04, I handled with prerequisites with the following command:

    sudo apt-get install libsasl2-dev python3-dev libldap2-dev libssl-dev python3-pip python3-setuptools mysql-server mysql-client

    Then after unpacking version 1.4.5 into /opt, I did cd /opt/oncall-1.4.5 and then ran the following:

    python3 setup.py develop
    pip3 install -e '.[dev]'
    

    The setup finally finished but did complain:

    ERROR: sphinx-rtd-theme 1.0.0 has requirement docutils<0.18, but you'll have docutils 0.18.1 which is incompatible.
    ERROR: sphinx-rtd-theme 1.0.0 has requirement sphinx>=1.6, but you'll have sphinx 1.5.6 which is incompatible.
    ERROR: sphinxcontrib-httpdomain 1.8.0 has requirement Sphinx>=1.6, but you'll have sphinx 1.5.6 which is incompatible.
    

    Set up my MySQL schema:

    mysql -u root -p < ./db/schema.v0.sql
    

    I then start the software (oncall-dev ./configs/config.yaml or make serve) and the page loads correctly on port 8080. However when I attempt to login, I get an error that the username and/or password is invalid. Server side I see this:

    [2022-06-01 15:38:26 -0600] [437216] [INFO] Starting gunicorn 20.1.0
    [2022-06-01 15:38:26 -0600] [437216] [INFO] Listening at: http://0.0.0.0:8080 (437216)
    [2022-06-01 15:38:26 -0600] [437216] [INFO] Using worker: gevent
    [2022-06-01 15:38:26 -0600] [437218] [INFO] Booting worker with pid: 437218
    [2022-06-01 15:38:26 -0600] [437219] [INFO] Booting worker with pid: 437219
    [2022-06-01 15:38:26 -0600] [437220] [INFO] Booting worker with pid: 437220
    [2022-06-01 15:38:26 -0600] [437221] [INFO] Booting worker with pid: 437221
    INFO:oncall.auth:Auth debug turned on.
    INFO:oncall.auth:Auth debug turned on.
    INFO:oncall.auth:Auth debug turned on.
    INFO:oncall.auth:Auth debug turned on.
    Building bundle: bundles/libs.js
    INFO:webassets:Building bundle: bundles/libs.js
    2022-06-01 15:38:26,860 INFO webassets Building bundle: bundles/libs.js
    Building bundle: bundles/oncall.bundle.js
    INFO:webassets:Building bundle: bundles/oncall.bundle.js
    2022-06-01 15:38:26,866 INFO webassets Building bundle: bundles/oncall.bundle.js
    Building bundle: bundles/libs.css
    INFO:webassets:Building bundle: bundles/libs.css
    2022-06-01 15:38:26,868 INFO webassets Building bundle: bundles/libs.css
    Building bundle: bundles/oncall.css
    INFO:webassets:Building bundle: bundles/oncall.css
    2022-06-01 15:38:26,871 INFO webassets Building bundle: bundles/oncall.css
    Building bundle: bundles/loginsplash.css
    INFO:webassets:Building bundle: bundles/loginsplash.css
    2022-06-01 15:38:26,872 INFO webassets Building bundle: bundles/loginsplash.css
    Building bundle: bundles/loginsplash.bundle.js
    INFO:webassets:Building bundle: bundles/loginsplash.bundle.js
    2022-06-01 15:38:26,872 INFO webassets Building bundle: bundles/loginsplash.bundle.js
    10.215.90.86 - - [01/Jun/2022:15:38:29 -0600] "GET / HTTP/1.1" 200 109744 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.63 Safari/537.36 Edg/102.0.1245.30"
    10.215.90.86 - - [01/Jun/2022:15:38:29 -0600] "GET /static/bundles/oncall.css?6fc23d98 HTTP/1.1" 200 0 "http://example.com:8080/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.63 Safari/537.36 Edg/102.0.1245.30"
    10.215.90.86 - - [01/Jun/2022:15:38:29 -0600] "GET /static/bundles/libs.css?d0c82c20 HTTP/1.1" 200 0 "http://example.com:8080/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.63 Safari/537.36 Edg/102.0.1245.30"
    10.215.90.86 - - [01/Jun/2022:15:38:29 -0600] "GET /static/images/oncall_logo_white.png HTTP/1.1" 200 0 "http://example.com:8080/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.63 Safari/537.36 Edg/102.0.1245.30"
    10.215.90.86 - - [01/Jun/2022:15:38:29 -0600] "GET /static/bundles/oncall.bundle.js?261df4d9 HTTP/1.1" 200 0 "http://example.com:8080/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.63 Safari/537.36 Edg/102.0.1245.30"
    10.215.90.86 - - [01/Jun/2022:15:38:29 -0600] "GET /static/bundles/libs.js?fc4ec214 HTTP/1.1" 200 0 "http://example.com:8080/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.63 Safari/537.36 Edg/102.0.1245.30"
    10.215.90.86 - - [01/Jun/2022:15:38:29 -0600] "GET /api/v0/iris_settings HTTP/1.1" 200 354 "http://example.com:8080/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.63 Safari/537.36 Edg/102.0.1245.30"
    10.215.90.86 - - [01/Jun/2022:15:38:29 -0600] "GET /api/v0/timezones/ HTTP/1.1" 200 123 "http://example.com:8080/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.63 Safari/537.36 Edg/102.0.1245.30"
    [2022-06-01 15:38:29 -0600] [437219] [ERROR] Error handling request /api/v0/roles/
    Traceback (most recent call last):
      File "/usr/local/lib/python3.8/dist-packages/SQLAlchemy-1.4.37-py3.8-linux-x86_64.egg/sqlalchemy/engine/base.py", line 3280, in _wrap_pool_connect
        return fn()
      File "/usr/local/lib/python3.8/dist-packages/SQLAlchemy-1.4.37-py3.8-linux-x86_64.egg/sqlalchemy/pool/base.py", line 310, in connect
        return _ConnectionFairy._checkout(self)
      File "/usr/local/lib/python3.8/dist-packages/SQLAlchemy-1.4.37-py3.8-linux-x86_64.egg/sqlalchemy/pool/base.py", line 868, in _checkout
        fairy = _ConnectionRecord.checkout(pool)
      File "/usr/local/lib/python3.8/dist-packages/SQLAlchemy-1.4.37-py3.8-linux-x86_64.egg/sqlalchemy/pool/base.py", line 476, in checkout
        rec = pool._do_get()
      File "/usr/local/lib/python3.8/dist-packages/SQLAlchemy-1.4.37-py3.8-linux-x86_64.egg/sqlalchemy/pool/impl.py", line 146, in _do_get
        self._dec_overflow()
      File "/usr/local/lib/python3.8/dist-packages/SQLAlchemy-1.4.37-py3.8-linux-x86_64.egg/sqlalchemy/util/langhelpers.py", line 70, in __exit__
        compat.raise_(
      File "/usr/local/lib/python3.8/dist-packages/SQLAlchemy-1.4.37-py3.8-linux-x86_64.egg/sqlalchemy/util/compat.py", line 208, in raise_
        raise exception
      File "/usr/local/lib/python3.8/dist-packages/SQLAlchemy-1.4.37-py3.8-linux-x86_64.egg/sqlalchemy/pool/impl.py", line 143, in _do_get
        return self._create_connection()
      File "/usr/local/lib/python3.8/dist-packages/SQLAlchemy-1.4.37-py3.8-linux-x86_64.egg/sqlalchemy/pool/base.py", line 256, in _create_connection
        return _ConnectionRecord(self)
      File "/usr/local/lib/python3.8/dist-packages/SQLAlchemy-1.4.37-py3.8-linux-x86_64.egg/sqlalchemy/pool/base.py", line 371, in __init__
        self.__connect()
      File "/usr/local/lib/python3.8/dist-packages/SQLAlchemy-1.4.37-py3.8-linux-x86_64.egg/sqlalchemy/pool/base.py", line 666, in __connect
        pool.logger.debug("Error on connect(): %s", e)
      File "/usr/local/lib/python3.8/dist-packages/SQLAlchemy-1.4.37-py3.8-linux-x86_64.egg/sqlalchemy/util/langhelpers.py", line 70, in __exit__
        compat.raise_(
      File "/usr/local/lib/python3.8/dist-packages/SQLAlchemy-1.4.37-py3.8-linux-x86_64.egg/sqlalchemy/util/compat.py", line 208, in raise_
        raise exception
      File "/usr/local/lib/python3.8/dist-packages/SQLAlchemy-1.4.37-py3.8-linux-x86_64.egg/sqlalchemy/pool/base.py", line 661, in __connect
        self.dbapi_connection = connection = pool._invoke_creator(self)
      File "/usr/local/lib/python3.8/dist-packages/SQLAlchemy-1.4.37-py3.8-linux-x86_64.egg/sqlalchemy/engine/create.py", line 590, in connect
        return dialect.connect(*cargs, **cparams)
      File "/usr/local/lib/python3.8/dist-packages/SQLAlchemy-1.4.37-py3.8-linux-x86_64.egg/sqlalchemy/engine/default.py", line 597, in connect
        return self.dbapi.connect(*cargs, **cparams)
      File "/usr/local/lib/python3.8/dist-packages/PyMySQL-1.0.2-py3.8.egg/pymysql/connections.py", line 353, in __init__
        self.connect()
      File "/usr/local/lib/python3.8/dist-packages/PyMySQL-1.0.2-py3.8.egg/pymysql/connections.py", line 633, in connect
        self._request_authentication()
      File "/usr/local/lib/python3.8/dist-packages/PyMySQL-1.0.2-py3.8.egg/pymysql/connections.py", line 907, in _request_authentication
        auth_packet = self._read_packet()
      File "/usr/local/lib/python3.8/dist-packages/PyMySQL-1.0.2-py3.8.egg/pymysql/connections.py", line 725, in _read_packet
        packet.raise_for_error()
      File "/usr/local/lib/python3.8/dist-packages/PyMySQL-1.0.2-py3.8.egg/pymysql/protocol.py", line 221, in raise_for_error
        err.raise_mysql_exception(self._data)
      File "/usr/local/lib/python3.8/dist-packages/PyMySQL-1.0.2-py3.8.egg/pymysql/err.py", line 143, in raise_mysql_exception
        raise errorclass(errno, errval)
    pymysql.err.OperationalError: (1698, "Access denied for user 'root'@'localhost'")
    
    The above exception was the direct cause of the following exception:
    
    Traceback (most recent call last):
      File "/usr/local/lib/python3.8/dist-packages/gunicorn/workers/base_async.py", line 55, in handle
        self.handle_request(listener_name, req, client, addr)
      File "/usr/local/lib/python3.8/dist-packages/gunicorn/workers/ggevent.py", line 127, in handle_request
        super().handle_request(listener_name, req, sock, addr)
      File "/usr/local/lib/python3.8/dist-packages/gunicorn/workers/base_async.py", line 108, in handle_request
        respiter = self.wsgi(environ, resp.start_response)
      File "/opt/oncall/src/oncall/app.py", line 118, in __call__
        return self.app(env, start_response)
      File "/usr/local/lib/python3.8/dist-packages/Beaker-1.11.0-py3.8.egg/beaker/middleware.py", line 156, in __call__
        return self.wrap_app(environ, session_start_response)
      File "/usr/local/lib/python3.8/dist-packages/falcon-1.4.1-py3.8.egg/falcon/api.py", line 244, in __call__
        responder(req, resp, **params)
      File "/opt/oncall/src/oncall/api/v0/roles.py", line 97, in on_get
        connection = db.connect()
      File "/usr/local/lib/python3.8/dist-packages/SQLAlchemy-1.4.37-py3.8-linux-x86_64.egg/sqlalchemy/engine/base.py", line 3313, in raw_connection
        return self._wrap_pool_connect(self.pool.connect, _connection)
      File "/usr/local/lib/python3.8/dist-packages/SQLAlchemy-1.4.37-py3.8-linux-x86_64.egg/sqlalchemy/engine/base.py", line 3283, in _wrap_pool_connect
        Connection._handle_dbapi_exception_noconnection(
      File "/usr/local/lib/python3.8/dist-packages/SQLAlchemy-1.4.37-py3.8-linux-x86_64.egg/sqlalchemy/engine/base.py", line 2117, in _handle_dbapi_exception_noconnection
        util.raise_(
      File "/usr/local/lib/python3.8/dist-packages/SQLAlchemy-1.4.37-py3.8-linux-x86_64.egg/sqlalchemy/util/compat.py", line 208, in raise_
        raise exception
      File "/usr/local/lib/python3.8/dist-packages/SQLAlchemy-1.4.37-py3.8-linux-x86_64.egg/sqlalchemy/engine/base.py", line 3280, in _wrap_pool_connect
        return fn()
      File "/usr/local/lib/python3.8/dist-packages/SQLAlchemy-1.4.37-py3.8-linux-x86_64.egg/sqlalchemy/pool/base.py", line 310, in connect
        return _ConnectionFairy._checkout(self)
      File "/usr/local/lib/python3.8/dist-packages/SQLAlchemy-1.4.37-py3.8-linux-x86_64.egg/sqlalchemy/pool/base.py", line 868, in _checkout
        fairy = _ConnectionRecord.checkout(pool)
      File "/usr/local/lib/python3.8/dist-packages/SQLAlchemy-1.4.37-py3.8-linux-x86_64.egg/sqlalchemy/pool/base.py", line 476, in checkout
        rec = pool._do_get()
      File "/usr/local/lib/python3.8/dist-packages/SQLAlchemy-1.4.37-py3.8-linux-x86_64.egg/sqlalchemy/pool/impl.py", line 146, in _do_get
        self._dec_overflow()
      File "/usr/local/lib/python3.8/dist-packages/SQLAlchemy-1.4.37-py3.8-linux-x86_64.egg/sqlalchemy/util/langhelpers.py", line 70, in __exit__
        compat.raise_(
      File "/usr/local/lib/python3.8/dist-packages/SQLAlchemy-1.4.37-py3.8-linux-x86_64.egg/sqlalchemy/util/compat.py", line 208, in raise_
        raise exception
      File "/usr/local/lib/python3.8/dist-packages/SQLAlchemy-1.4.37-py3.8-linux-x86_64.egg/sqlalchemy/pool/impl.py", line 143, in _do_get
        return self._create_connection()
      File "/usr/local/lib/python3.8/dist-packages/SQLAlchemy-1.4.37-py3.8-linux-x86_64.egg/sqlalchemy/pool/base.py", line 256, in _create_connection
        return _ConnectionRecord(self)
      File "/usr/local/lib/python3.8/dist-packages/SQLAlchemy-1.4.37-py3.8-linux-x86_64.egg/sqlalchemy/pool/base.py", line 371, in __init__
        self.__connect()
      File "/usr/local/lib/python3.8/dist-packages/SQLAlchemy-1.4.37-py3.8-linux-x86_64.egg/sqlalchemy/pool/base.py", line 666, in __connect
        pool.logger.debug("Error on connect(): %s", e)
      File "/usr/local/lib/python3.8/dist-packages/SQLAlchemy-1.4.37-py3.8-linux-x86_64.egg/sqlalchemy/util/langhelpers.py", line 70, in __exit__
        compat.raise_(
      File "/usr/local/lib/python3.8/dist-packages/SQLAlchemy-1.4.37-py3.8-linux-x86_64.egg/sqlalchemy/util/compat.py", line 208, in raise_
        raise exception
      File "/usr/local/lib/python3.8/dist-packages/SQLAlchemy-1.4.37-py3.8-linux-x86_64.egg/sqlalchemy/pool/base.py", line 661, in __connect
        self.dbapi_connection = connection = pool._invoke_creator(self)
      File "/usr/local/lib/python3.8/dist-packages/SQLAlchemy-1.4.37-py3.8-linux-x86_64.egg/sqlalchemy/engine/create.py", line 590, in connect
        return dialect.connect(*cargs, **cparams)
      File "/usr/local/lib/python3.8/dist-packages/SQLAlchemy-1.4.37-py3.8-linux-x86_64.egg/sqlalchemy/engine/default.py", line 597, in connect
        return self.dbapi.connect(*cargs, **cparams)
      File "/usr/local/lib/python3.8/dist-packages/PyMySQL-1.0.2-py3.8.egg/pymysql/connections.py", line 353, in __init__
        self.connect()
      File "/usr/local/lib/python3.8/dist-packages/PyMySQL-1.0.2-py3.8.egg/pymysql/connections.py", line 633, in connect
        self._request_authentication()
      File "/usr/local/lib/python3.8/dist-packages/PyMySQL-1.0.2-py3.8.egg/pymysql/connections.py", line 907, in _request_authentication
        auth_packet = self._read_packet()
      File "/usr/local/lib/python3.8/dist-packages/PyMySQL-1.0.2-py3.8.egg/pymysql/connections.py", line 725, in _read_packet
        packet.raise_for_error()
      File "/usr/local/lib/python3.8/dist-packages/PyMySQL-1.0.2-py3.8.egg/pymysql/protocol.py", line 221, in raise_for_error
        err.raise_mysql_exception(self._data)
      File "/usr/local/lib/python3.8/dist-packages/PyMySQL-1.0.2-py3.8.egg/pymysql/err.py", line 143, in raise_mysql_exception
        raise errorclass(errno, errval)
    sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (1698, "Access denied for user 'root'@'localhost'")
    (Background on this error at: https://sqlalche.me/e/14/e3q8)
    

    I can login to the database without issue from the command prompt (e.g. mysql -u root -p) with no password. I've assigned the root user the same password in the config.yaml, but with the same results.

    opened by Th3L1nuxGuy 1
  • User allow/prevent calendar modification by non admin user

    User allow/prevent calendar modification by non admin user

    Add a configuration in config.yaml to authorize or not user that are not admin of a team to modify a team calendar.

    The objective of that mod is to prevent 'simple' user to modify team calendar.

    opened by Bbillyben 0
  • ICal Authentication : 401 / unauthorized

    ICal Authentication : 401 / unauthorized

    Hi there!

    I've setup an beta prod env. with user authentication activated in config.yaml. My oncall app is behind a reverse proxy, everything seems working fined (even with my mods).

    I'm trying to reach ical from thunderbird app after having generated ical key in user conf. TB ask me for user credential, but I always land on a 401 error : 192.168.1.7 - - [25/Apr/2022:21:53:59 +0200] "GET /api/v0/ical/e11ed94a-ac2b-4bd9-b22f-fa52bfdbab56 HTTP/1.1" 401 63 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.5.0"

    Of course, with authentication turned off, everything is reachable.

    I'm learning python with that project, and I do not know where to start to debug it.

    It do not even reach public_ical.py, and i do not know where falcon intercept the request.

    Any help would be greatly appreciated!

    opened by Bbillyben 2
Releases(v1.5.1)
Automatically capture your Ookla Speedtest metrics and display them in a Grafana dashboard

Speedtest All-In-One Automatically capture your Ookla Speedtest metrics and display them in a Grafana dashboard. Getting Started About This Code This

Aaron Melton 2 Feb 22, 2022
A colony of interacting processes

NColony Infrastructure for running "colonies" of processes. Hacking $ tox Should DTRT -- if it passes, it means unit tests are passing, and 100% cover

23 Apr 04, 2022
Ansible for DevOps examples.

Ansible for DevOps Examples This repository contains Ansible examples developed to support different sections of Ansible for DevOps, a book on Ansible

Jeff Geerling 6.6k Jan 08, 2023
Daemon to ban hosts that cause multiple authentication errors

__ _ _ ___ _ / _|__ _(_) |_ ) |__ __ _ _ _ | _/ _` | | |/ /| '_ \/ _` | ' \

Fail2Ban 7.8k Jan 09, 2023
A Simple script to hunt unused Kubernetes resources.

K8SPurger A Simple script to hunt unused Kubernetes resources. Release History Release 0.3 Added Ingress Added Services Account Adding RoleBindding Re

Yogesh Kunjir 202 Nov 19, 2022
Python utility function to communicate with a subprocess using iterables: for when data is too big to fit in memory and has to be streamed

iterable-subprocess Python utility function to communicate with a subprocess using iterables: for when data is too big to fit in memory and has to be

Department for International Trade 5 Jul 10, 2022
Supervisor process control system for UNIX

Supervisor Supervisor is a client/server system that allows its users to control a number of processes on UNIX-like operating systems. Supported Platf

Supervisor 7.6k Dec 31, 2022
A little script and trick to make your heroku app run forever without being concerned about dyno hours.

A little script and trick to make your heroku app run forever without being concerned about dyno hours.

Tiararose Biezetta 152 Dec 25, 2022
Helperpod - A CLI tool to run a Kubernetes utility pod with pre-installed tools that can be used for debugging/testing purposes inside a Kubernetes cluster

Helperpod is a CLI tool to run a Kubernetes utility pod with pre-installed tools that can be used for debugging/testing purposes inside a Kubernetes cluster.

Atakan Tatlı 2 Feb 05, 2022
Cross-platform lib for process and system monitoring in Python

Home Install Documentation Download Forum Blog Funding What's new Summary psutil (process and system utilities) is a cross-platform library for retrie

Giampaolo Rodola 9k Jan 02, 2023
A Python Implementation for Git for learning

A pure Python implementation for Git based on Buliding Git

shidenggui 42 Jul 13, 2022
Lima is an alternative to using Docker Desktop on your Mac.

lima-xbar-plugin Table of Contents Description Installation Dependencies Lima is an alternative to using Docker Desktop on your Mac. Description This

Joe Block 68 Dec 22, 2022
Dockerized service to backup all running database containers

Docker Database Backup Dockerized service to automatically backup all of your database containers. Docker Image Tags: docker.io/jandi/database-backup

Jan Dittrich 16 Dec 31, 2022
Deploy a simple Multi-Node Clickhouse Cluster with docker-compose in minutes.

Simple Multi Node Clickhouse Cluster I hate those single-node clickhouse clusters and manually installation, I mean, why should we: Running multiple c

Nova Kwok 11 Nov 18, 2022
Checkmk kube agent - Checkmk Kubernetes Cluster and Node Collectors

Checkmk Kubernetes Cluster and Node Collectors Checkmk cluster and node collecto

tribe29 GmbH 15 Dec 26, 2022
Let's learn how to build, release and operate your containerized applications to Amazon ECS and AWS Fargate using AWS Copilot.

🚀 Welcome to AWS Copilot Workshop In this workshop, you'll learn how to build, release and operate your containerised applications to Amazon ECS and

Donnie Prakoso 15 Jul 14, 2022
Run your clouds in RAID.

UniKlaud Run your clouds in RAID Table of Contents About The Project Built With Getting Started Installation Usage Roadmap Contributing License Contac

3 Jan 16, 2022
Emissary - open source Kubernetes-native API gateway for microservices built on the Envoy Proxy

Emissary-ingress Emissary-Ingress is an open-source Kubernetes-native API Gateway + Layer 7 load balancer + Kubernetes Ingress built on Envoy Proxy. E

Emissary Ingress 4k Dec 31, 2022
NixOps is a tool for deploying to NixOS machines in a network or cloud.

NixOps NixOps is a tool for deploying to NixOS machines in a network or the cloud. Key features include: Declarative: NixOps determines and carries ou

Nix/Nixpkgs/NixOS 1.2k Jan 02, 2023
Run Oracle on Kubernetes with El Carro

El Carro is a new project that offers a way to run Oracle databases in Kubernetes as a portable, open source, community driven, no vendor lock-in container orchestration system. El Carro provides a p

Google Cloud Platform 205 Dec 30, 2022