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)
Python job scheduling for humans.

schedule Python job scheduling for humans. Run Python functions (or any other callable) periodically using a friendly syntax. A simple to use API for

Dan Bader 10.4k Jan 2, 2023
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 5, 2022
Honcho: a python clone of Foreman. For managing Procfile-based applications.

___ ___ ___ ___ ___ ___ /\__\ /\ \ /\__\ /\ \ /\__\ /\

Nick Stenning 1.5k Jan 3, 2023
A system for managing CI data for Mozilla projects

Treeherder Description Treeherder is a reporting dashboard for Mozilla checkins. It allows users to see the results of automatic builds and their resp

Mozilla 235 Dec 22, 2022
pyinfra automates infrastructure super fast at massive scale. It can be used for ad-hoc command execution, service deployment, configuration management and more.

pyinfra automates/provisions/manages/deploys infrastructure super fast at massive scale. It can be used for ad-hoc command execution, service deployme

Nick Barrett 2.1k Dec 29, 2022
gunicorn 'Green Unicorn' is a WSGI HTTP Server for UNIX, fast clients and sleepy applications.

Gunicorn Gunicorn 'Green Unicorn' is a Python WSGI HTTP Server for UNIX. It's a pre-fork worker model ported from Ruby's Unicorn project. The Gunicorn

Benoit Chesneau 8.7k Jan 8, 2023
Dynamic DNS service

About nsupdate.info https://nsupdate.info is a free dynamic DNS service. nsupdate.info is also the name of the software used to implement it. If you l

nsupdate.info development 880 Jan 4, 2023
Glances an Eye on your system. A top/htop alternative for GNU/Linux, BSD, Mac OS and Windows operating systems.

Glances - An eye on your system Summary Glances is a cross-platform monitoring tool which aims to present a large amount of monitoring information thr

Nicolas Hennion 22k Jan 8, 2023
Ganeti is a virtual machine cluster management tool built on top of existing virtualization technologies such as Xen or KVM and other open source software.

Ganeti 3.0 =========== For installation instructions, read the INSTALL and the doc/install.rst files. For a brief introduction, read the ganeti(7) m

null 395 Jan 4, 2023
Chef-like functionality for Fabric

/ / ___ ___ ___ ___ | | )| |___ | | )|___) |__ |__/ | __/ | | / |__ -- Chef-like functionality for Fabric About Fabric i

Sébastien Pierre 1.3k Dec 21, 2022
Manage your SSH like a boss.

--- storm is a command line tool to manage your ssh connections. features adding, editing, deleting, listing, searching across your SSHConfig. command

Emre Yılmaz 3.9k Jan 3, 2023
Wubes is like Qubes but for Windows.

Qubes containerization on Windows. The idea is to leverage the Windows Sandbox technology to spawn applications in isolation.

NCC Group Plc 124 Dec 16, 2022
This repository contains code examples and documentation for learning how applications can be developed with Kubernetes

BigBitBus KAT Components Click on the diagram to enlarge, or follow this link for detailed documentation Introduction Welcome to the BigBitBus Kuberne

null 51 Oct 16, 2022
Spinnaker is an open source, multi-cloud continuous delivery platform for releasing software changes with high velocity and confidence.

Welcome to the Spinnaker Project Spinnaker is an open-source continuous delivery platform for releasing software changes with high velocity and confid

null 8.8k Jan 7, 2023
A tool to convert AWS EC2 instances back and forth between On-Demand and Spot billing models.

ec2-spot-converter This tool converts existing AWS EC2 instances back and forth between On-Demand and 'persistent' Spot billing models while preservin

jcjorel 152 Dec 29, 2022
Let's Git - Version Control & Open Source Homework

Let's Git - Version Control & Open Source Homework Welcome to this homework for our MOOC: Let's Git! We hope you will learn a lot and have fun working

null 1 Dec 5, 2021
IP address management (IPAM) and data center infrastructure management (DCIM) tool.

NetBox is an IP address management (IPAM) and data center infrastructure management (DCIM) tool. Initially conceived by the network engineering team a

NetBox Community 11.8k Jan 7, 2023
MagTape is a Policy-as-Code tool for Kubernetes that allows for evaluating Kubernetes resources against a set of defined policies to inform and enforce best practice configurations.

MagTape is a Policy-as-Code tool for Kubernetes that allows for evaluating Kubernetes resources against a set of defined policies to inform and enforce best practice configurations. MagTape includes variable policy enforcement, notifications, and targeted metrics.

T-Mobile 143 Dec 27, 2022