strava-offline is a tool to keep a local mirror of Strava activities for further analysis/processing:

Overview

strava-offline

Overview

strava-offline is a tool to keep a local mirror of Strava activities for further analysis/processing:

  • synchronizes metadata about your bikes and activities to an SQLite database

  • downloads all your activities as GPX (and supports not downloading bulk exported activities again)

Example of what you can do with the data:

sample-reports

Installation

Using pipx:

pipx ensurepath
pipx install strava-offline

To keep a local git clone around:

git clone https://github.com/liskin/strava-offline
make -C strava-offline pipx

Alternatively, if you don't need the isolated virtualenv that pipx provides, feel free to just:

pip install strava-offline

Setup and usage

  • Run strava-offline sqlite. The first time you do this, it will open Strava in a browser and ask for permissions. The token is then saved and it proceeds to sync activities metadata (this may take a couple dozen seconds the first time). Next time you run this, it uses the saved token and incrementally syncs latest activities (this takes a few seconds).

  • Now you can use sqlite3 to query the activity database, which is placed at ~/.local/share/strava_offline/strava.sqlite by default. Try for example:

    sqlite3 ~/.local/share/strava_offline/strava.sqlite \
    ​  "SELECT CAST(SUM(distance)/1000 AS INT) || ' km' FROM activity"
    
  • For GPX downloading, you'll need to get the _strava4_session cookie from your web browser session. Open https://strava.com/ in your browser and then follow a guide for your browser to obtain the cookie value:

  • You may also need to obtain your own Client ID and Client Secret from https://www.strava.com/settings/api because the built-in ID/Secret is shared with other users and may hit rate limits (HTTP 429 Too Many Requests). Pass these as --client-id and --client-secret command line arguments or export as STRAVA_CLIENT_ID and STRAVA_CLIENT_SECRET environment variables.

    Alternatively, you may just wait a couple minutes and try again, but the rate limits are rather strict, so in the unlikely event this tool gets popular, serious users will have to get their own API application registered.

    (That settings page also lists Your Access Token but this won't let you download private activities or see names of bikes. Therefore its use is not supported in strava-offline.)

Mirror activities metadata

$ strava-offline sqlite --help
Usage: strava-offline sqlite [OPTIONS]

  Synchronize bikes and activities metadata to local sqlite3 database.
  Unless --full is given, the sync is incremental, i.e. only new activities
  are synchronized and deletions aren't detected.

Options:
  Sync options: 
    --full / --no-full    Perform full sync instead of incremental  [default:
                          False]

  Strava API: 
    --client-id TEXT      Strava OAuth 2 client id  [env var:
                          STRAVA_CLIENT_ID]

    --client-secret TEXT  Strava OAuth 2 client secret  [env var:
                          STRAVA_CLIENT_SECRET]

    --token-file FILE     Strava OAuth 2 token store  [default:
                          /home/user/.config/strava_offline/token.json]

    --http-host TEXT      OAuth 2 HTTP server host  [default: 127.0.0.1]
    --http-port INTEGER   OAuth 2 HTTP server port  [default: 12345]
  Database: 
    --database FILE       Sqlite database file  [default: /home/user/.local/sh
                          are/strava_offline/strava.sqlite]

  -v, --verbose           Logging verbosity (0 = WARNING, 1 = INFO, 2 = DEBUG)
  --config FILE           Read configuration from FILE.  [default:
                          /home/user/.config/strava_offline/config.yaml]

  --help                  Show this message and exit.

Mirror activities as GPX

Important: To avoid overloading Strava servers (and possibly getting noticed), first download all your existing activities using the Bulk Export feature of Strava. Then use --dir-activities-backup at least once to let strava-offline reuse these downloaded files.

$ strava-offline gpx --help
Usage: strava-offline gpx [OPTIONS]

  Download known (previously synced using the "sqlite" command) activities
  in GPX format. It's recommended to only use this incrementally to download
  the latest activities every day or week, and download the bulk of your
  historic activities directly from Strava. Use --dir-activities-backup to
  avoid downloading activities already downloaded in the bulk.

Options:
  GPX storage: 
    --dir-activities DIRECTORY    Directory to store gpx files indexed by
                                  activity id  [default: /home/user/.local/sha
                                  re/strava_offline/activities]

    --dir-activities-backup DIRECTORY
                                  Optional path to activities in Strava backup
                                  (no need to redownload these)

  Strava web: 
    --strava4-session TEXT        '_strava4_session' cookie value  [env var:
                                  STRAVA_COOKIE_STRAVA4_SESSION; required]

  Database: 
    --database FILE               Sqlite database file  [default: /home/user/.
                                  local/share/strava_offline/strava.sqlite]

  -v, --verbose                   Logging verbosity (0 = WARNING, 1 = INFO, 2
                                  = DEBUG)

  --config FILE                   Read configuration from FILE.  [default: /ho
                                  me/user/.config/strava_offline/config.yaml]

  --help                          Show this message and exit.

Reports

$ strava-offline --help | grep report-
  report-bikes         Show all-time report by bike
  report-yearly        Show yearly report by activity type
  report-yearly-bikes  Show yearly report by bike
$ strava-offline report-yearly 2020
Activity type      Distance (km)    Moving time (hour)
---------------  ---------------  --------------------
Ride                        4888                   243
InlineSkate                   76                     4
Walk                          59                    13
Hike                          38                     9
StandUpPaddling                9                     1
Canoeing                       2                     1

Configuration file

Secrets (and other options) can be set permanently in a config file, which is located at ~/.config/strava_offline/config.yaml by default (on Linux; on other platforms see output of --help).

Sample config file can be generated using the --config-sample flag:

$ strava-offline --config-sample
# Perform full sync instead of incremental
full: false

# Strava OAuth 2 client id
strava_client_id: '12345'

# Strava OAuth 2 client secret
strava_client_secret: SECRET

# Strava OAuth 2 token store
strava_token_filename: /home/user/.config/strava_offline/token.json

# OAuth 2 HTTP server host
http_host: 127.0.0.1

# OAuth 2 HTTP server port
http_port: 12345

# Sqlite database file
strava_sqlite_database: /home/user/.local/share/strava_offline/strava.sqlite

# Logging verbosity (0 = WARNING, 1 = INFO, 2 = DEBUG)
verbose: 0

# Directory to store gpx files indexed by activity id
dir_activities: /home/user/.local/share/strava_offline/activities

# Optional path to activities in Strava backup (no need to redownload these)
dir_activities_backup: DIRECTORY

# '_strava4_session' cookie value
strava_cookie_strava4_session: TEXT

Donations ( = €)

If you like this tool and wish to support its development and maintenance, please consider a small donation or recurrent support through GitHub Sponsors.

By donating, you'll also support the development of my other projects. You might like these:

Comments
  • Archive GPX processing fails on activities without GPX data

    Archive GPX processing fails on activities without GPX data

    Hi!

    Thanks for creating and sharing this tool. I have a suspicion it's going to save me from writing a bunch of code on my own.

    I ran into an issue today when trying to process the GPX data from my Strava archives. I have some activities that do not have GPX data. For example, an indoor ride on my trainer or a weight lifting session. Here is one example. When GPX processing tries to download the GPX file for this activity, it understandably cannot find one and throws the below stack trace.

    Oddly, the ride does have has_location_data = 1 in the database, though it lacks a start_latlng and end_latlng (see data below).

    Might excluding activities that do not have a start and end latlng here fix the issue?

    I'd be happy to open a PR if you have a fix in mind.

    Thank you again for sharing this project!

                      id = 461483444
               upload_id = 512650720
                    name = Flywheel
              start_date = 2016-01-02T16:33:25Z
             moving_time = 2692
            elapsed_time = 2692
                distance = 0.0
    total_elevation_gain = 0.0
                 gear_id =
                    type = Ride
                 commute = 0
       has_location_data = 1
                    json = {"resource_state": 2, "athlete": {"id": 4403225, "resource_state": 1}, "name": "Flywheel", "distance": 0.0, "moving_time": 2692, "elapsed_time": 2692, "total_elevation_gain": 0, "type": "Ride", "sport_type": "Ride", "workout_type": null, "id": 461483444, "start_date": "2016-01-02T16:33:25Z", "start_date_local": "2016-01-02T10:33:25Z", "timezone": "(GMT-06:00) America/Chicago", "utc_offset": -21600.0, "location_city": null, "location_state": null, "location_country": "United States", "achievement_count": 0, "kudos_count": 0, "comment_count": 0, "athlete_count": 1, "photo_count": 0, "map": {"id": "a461483444", "summary_polyline": "", "resource_state": 2}, "trainer": true, "commute": false, "manual": false, "private": false, "visibility": "everyone", "flagged": false, "gear_id": null, "start_latlng": [], "end_latlng": [], "average_speed": 0.0, "max_speed": 0.0, "has_heartrate": true, "average_heartrate": 168.0, "max_heartrate": 182.0, "heartrate_opt_out": false, "display_hide_heartrate_option": true, "upload_id": 512650720, "upload_id_str": "512650720", "external_id": "2016-01-02-1033_Spin_Class_WF.tcx", "from_accepted_tag": false, "pr_count": 0, "total_photo_count": 0, "has_kudoed": false}
    

    Here's the full traceback, in case it's helpful.

    (venv) [email protected] running % strava-offline gpx --dir-activities-backup data/strava_archive_20221122 --database data/strava.sqlite --strava4-session 1ggcfckqdog722tg57u55s6nuq0t22au --config co
    nfig.yaml
    Traceback (most recent call last):
      File "/Users/greg/Dropbox/running/venv/lib/python3.9/site-packages/strava_offline/strava.py", line 124, in get_gpx
        return self._get_gpx("original", activity_id)
      File "/Users/greg/Dropbox/running/venv/lib/python3.9/site-packages/strava_offline/strava.py", line 117, in _get_gpx
        raise NotGpx(f"expected gpx attachment, got:\n{r.headers}")
    strava_offline.strava.NotGpx: expected gpx attachment, got:
    {'Content-Type': 'application/octet-stream', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'Date': 'Tue, 06 Dec 2022 05:03:51 GMT', 'Via': '1.1 linkerd, 1.1 linkerd, 1.1 ad82d8a3c91257adecf18541576c7e72.cloudfront.net (CloudFront)', 'ETag': 'W/"f74f19e94a7e22a35f9d1cf12f85aadc"', 'Pragma': 'no-cache', 'Server': 'nginx/1.21.3', 'Status': '200 OK', 'Expires': 'Sat, 01 Jan 2000 00:00:00 GMT', 'X-Request-Id': 'b9c1ec14-68cb-42b4-99c3-0c5c8cd21031', 'Cache-Control': 'no-cache, no-store', 'Referrer-Policy': 'strict-origin-when-cross-origin', 'X-Frame-Options': 'DENY', 'X-XSS-Protection': '1; mode=block', 'X-Download-Options': 'noopen', 'Content-Disposition': 'attachment; filename="Flywheel.tcx"; filename*=UTF-8\'\'Flywheel.tcx', 'X-Content-Type-Options': 'nosniff', 'Content-Transfer-Encoding': 'binary', 'X-Permitted-Cross-Domain-Policies': 'none', 'X-Cache': 'Miss from cloudfront', 'X-Amz-Cf-Pop': 'SFO53-C1', 'X-Amz-Cf-Id': 'oJVUCZfFHkWfzHF8L6utIPCUhTMX2gLpqACYrq0LyvRA7hyCV4Cxmw=='}
    
    During handling of the above exception, another exception occurred:
    
    Traceback (most recent call last):
      File "/Users/greg/Dropbox/running/venv/bin/strava-offline", line 8, in <module>
        sys.exit(cli())
      File "/Users/greg/Dropbox/running/venv/lib/python3.9/site-packages/click/core.py", line 1130, in __call__
        return self.main(*args, **kwargs)
      File "/Users/greg/Dropbox/running/venv/lib/python3.9/site-packages/click/core.py", line 1055, in main
        rv = self.invoke(ctx)
      File "/Users/greg/Dropbox/running/venv/lib/python3.9/site-packages/click/core.py", line 1657, in invoke
        return _process_result(sub_ctx.command.invoke(sub_ctx))
      File "/Users/greg/Dropbox/running/venv/lib/python3.9/site-packages/click/core.py", line 1404, in invoke
        return ctx.invoke(self.callback, **ctx.params)
      File "/Users/greg/Dropbox/running/venv/lib/python3.9/site-packages/click/core.py", line 760, in invoke
        return __callback(*args, **kwargs)
      File "/Users/greg/Dropbox/running/venv/lib/python3.9/site-packages/strava_offline/config.py", line 36, in wrapper
        return f(config_class(**config_kwargs), **f_kwargs)
      File "/Users/greg/Dropbox/running/venv/lib/python3.9/site-packages/strava_offline/cli.py", line 42, in cli_gpx
        gpx.sync(config=config, strava=strava)
      File "/Users/greg/Dropbox/running/venv/lib/python3.9/site-packages/strava_offline/gpx.py", line 75, in sync
        download_activities(db=db, strava=strava, dir_activities=config.dir_activities)
      File "/Users/greg/Dropbox/running/venv/lib/python3.9/site-packages/strava_offline/gpx.py", line 59, in download_activities
        download_gpx(strava=strava, activity_id=activity_id, path=dir_activities)
      File "/Users/greg/Dropbox/running/venv/lib/python3.9/site-packages/strava_offline/gpx.py", line 42, in download_gpx
        gpx = strava.get_gpx(activity_id)
      File "/Users/greg/Dropbox/running/venv/lib/python3.9/site-packages/strava_offline/strava.py", line 126, in get_gpx
        return self._get_gpx("gpx", activity_id)
      File "/Users/greg/Dropbox/running/venv/lib/python3.9/site-packages/strava_offline/strava.py", line 117, in _get_gpx
        raise NotGpx(f"expected gpx attachment, got:\n{r.headers}")
    strava_offline.strava.NotGpx: expected gpx attachment, got:
    {'Content-Type': 'text/html; charset=utf-8', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'Date': 'Tue, 06 Dec 2022 05:03:52 GMT', 'Via': '1.1 linkerd, 1.1 linkerd, 1.1 ad82d8a3c91257adecf18541576c7e72.cloudfront.net (CloudFront)', 'ETag': 'W/"6a683fcb8869821749f7cb424d9bd470"', 'Pragma': 'no-cache', 'Server': 'nginx/1.21.3', 'Status': '200 OK', 'Expires': 'Sat, 01 Jan 2000 00:00:00 GMT', 'X-Request-Id': 'd353cde2-af0b-4179-8957-4e0b13d70fb8', 'Cache-Control': 'no-cache, no-store', 'Referrer-Policy': 'strict-origin-when-cross-origin', 'X-Frame-Options': 'DENY', 'Content-Encoding': 'gzip', 'X-XSS-Protection': '1; mode=block', 'X-Download-Options': 'noopen', 'X-Content-Type-Options': 'nosniff', 'X-Permitted-Cross-Domain-Policies': 'none', 'X-Cache': 'Miss from cloudfront', 'X-Amz-Cf-Pop': 'SFO53-C1', 'X-Amz-Cf-Id': 'W8uwhNS6kMaY0fYQcGzVCjZnPTDK-tfK6KGUjpcpKppD7i_0vfKOqQ=='}
    (venv) [email protected] running % strava-offline gpx --dir-activities-backup data/strava_archive_20221122 --config config.yaml --verbose
    Traceback (most recent call last):
      File "/Users/greg/Dropbox/running/venv/lib/python3.9/site-packages/strava_offline/strava.py", line 124, in get_gpx
        return self._get_gpx("original", activity_id)
      File "/Users/greg/Dropbox/running/venv/lib/python3.9/site-packages/strava_offline/strava.py", line 117, in _get_gpx
        raise NotGpx(f"expected gpx attachment, got:\n{r.headers}")
    strava_offline.strava.NotGpx: expected gpx attachment, got:
    {'Content-Type': 'application/octet-stream', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'Date': 'Tue, 06 Dec 2022 05:05:45 GMT', 'Via': '1.1 linkerd, 1.1 linkerd, 1.1 b014854bd0108b7ed0058504b69ccb5a.cloudfront.net (CloudFront)', 'ETag': 'W/"f74f19e94a7e22a35f9d1cf12f85aadc"', 'Pragma': 'no-cache', 'Server': 'nginx/1.21.3', 'Status': '200 OK', 'Expires': 'Sat, 01 Jan 2000 00:00:00 GMT', 'X-Request-Id': 'd356e70a-cc99-437e-973d-cba5982f2351', 'Cache-Control': 'no-cache, no-store', 'Referrer-Policy': 'strict-origin-when-cross-origin', 'X-Frame-Options': 'DENY', 'X-XSS-Protection': '1; mode=block', 'X-Download-Options': 'noopen', 'Content-Disposition': 'attachment; filename="Flywheel.tcx"; filename*=UTF-8\'\'Flywheel.tcx', 'X-Content-Type-Options': 'nosniff', 'Content-Transfer-Encoding': 'binary', 'X-Permitted-Cross-Domain-Policies': 'none', 'X-Cache': 'Miss from cloudfront', 'X-Amz-Cf-Pop': 'SFO53-C1', 'X-Amz-Cf-Id': 'IZdK7eu8C797NOyHRGJ1KuweMGfd53e0NjIKYqbh4kCMONL65U-aJQ=='}
    
    During handling of the above exception, another exception occurred:
    
    Traceback (most recent call last):
      File "/Users/greg/Dropbox/running/venv/bin/strava-offline", line 8, in <module>
        sys.exit(cli())
      File "/Users/greg/Dropbox/running/venv/lib/python3.9/site-packages/click/core.py", line 1130, in __call__
        return self.main(*args, **kwargs)
      File "/Users/greg/Dropbox/running/venv/lib/python3.9/site-packages/click/core.py", line 1055, in main
        rv = self.invoke(ctx)
      File "/Users/greg/Dropbox/running/venv/lib/python3.9/site-packages/click/core.py", line 1657, in invoke
        return _process_result(sub_ctx.command.invoke(sub_ctx))
      File "/Users/greg/Dropbox/running/venv/lib/python3.9/site-packages/click/core.py", line 1404, in invoke
        return ctx.invoke(self.callback, **ctx.params)
      File "/Users/greg/Dropbox/running/venv/lib/python3.9/site-packages/click/core.py", line 760, in invoke
        return __callback(*args, **kwargs)
      File "/Users/greg/Dropbox/running/venv/lib/python3.9/site-packages/strava_offline/config.py", line 36, in wrapper
        return f(config_class(**config_kwargs), **f_kwargs)
      File "/Users/greg/Dropbox/running/venv/lib/python3.9/site-packages/strava_offline/cli.py", line 42, in cli_gpx
        gpx.sync(config=config, strava=strava)
      File "/Users/greg/Dropbox/running/venv/lib/python3.9/site-packages/strava_offline/gpx.py", line 75, in sync
        download_activities(db=db, strava=strava, dir_activities=config.dir_activities)
      File "/Users/greg/Dropbox/running/venv/lib/python3.9/site-packages/strava_offline/gpx.py", line 59, in download_activities
        download_gpx(strava=strava, activity_id=activity_id, path=dir_activities)
      File "/Users/greg/Dropbox/running/venv/lib/python3.9/site-packages/strava_offline/gpx.py", line 42, in download_gpx
        gpx = strava.get_gpx(activity_id)
      File "/Users/greg/Dropbox/running/venv/lib/python3.9/site-packages/strava_offline/strava.py", line 126, in get_gpx
        return self._get_gpx("gpx", activity_id)
      File "/Users/greg/Dropbox/running/venv/lib/python3.9/site-packages/strava_offline/strava.py", line 117, in _get_gpx
        raise NotGpx(f"expected gpx attachment, got:\n{r.headers}")
    strava_offline.strava.NotGpx: expected gpx attachment, got:
    {'Content-Type': 'text/html; charset=utf-8', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'Date': 'Tue, 06 Dec 2022 05:05:46 GMT', 'Via': '1.1 linkerd, 1.1 linkerd, 1.1 b014854bd0108b7ed0058504b69ccb5a.cloudfront.net (CloudFront)', 'ETag': 'W/"d9eb2cd9cb238fb428e1b5f1b599ce10"', 'Pragma': 'no-cache', 'Server': 'nginx/1.21.3', 'Status': '200 OK', 'Expires': 'Sat, 01 Jan 2000 00:00:00 GMT', 'X-Request-Id': 'dada34b2-6eda-4d0b-bd37-07e5447f6339', 'Cache-Control': 'no-cache, no-store', 'Referrer-Policy': 'strict-origin-when-cross-origin', 'X-Frame-Options': 'DENY', 'Content-Encoding': 'gzip', 'X-XSS-Protection': '1; mode=block', 'X-Download-Options': 'noopen', 'X-Content-Type-Options': 'nosniff', 'X-Permitted-Cross-Domain-Policies': 'none', 'X-Cache': 'Miss from cloudfront', 'X-Amz-Cf-Pop': 'SFO53-C1', 'X-Amz-Cf-Id': 'yarXWXK9_6m_Afsa2TC7HiaIGqjLNrI-Zxt3q4V9MJrDH2cKy5aVDQ=='}
    
    opened by gjreda 4
  • Requires setuptools

    Requires setuptools

    Hi! I installed the package using Poetry 1.2.2 and Python 3.10.6 (macOS, homebrew, pyenv). Running strava-offline results in:

    Traceback (most recent call last):
      File "/Users/honza/Library/Caches/pypoetry/virtualenvs/honzajavorekcz-99qNy8GJ-py3.10/bin/strava-offline", line 5, in <module>
        from strava_offline.cli import cli
      File "/Users/honza/Library/Caches/pypoetry/virtualenvs/honzajavorekcz-99qNy8GJ-py3.10/lib/python3.10/site-packages/strava_offline/__init__.py", line 2, in <module>
        from pkg_resources import get_distribution, DistributionNotFound
    ModuleNotFoundError: No module named 'pkg_resources'
    

    I found this solution:

    $ poetry add setuptools
    $ poetry add strava-offline
    

    Then running strava-offline lists its commands. Not sure whether this is expected behavior or a bug.

    opened by honzajavorek 3
  • Bump actions/setup-python from 2 to 4

    Bump actions/setup-python from 2 to 4

    Bumps actions/setup-python from 2 to 4.

    Release notes

    Sourced from actions/setup-python's releases.

    v4.0.0

    What's Changed

    • Support for python-version-file input: #336

    Example of usage:

    - uses: actions/[email protected]
      with:
        python-version-file: '.python-version' # Read python version from a file
    - run: python my_script.py
    

    There is no default python version for this setup-python major version, the action requires to specify either python-version input or python-version-file input. If the python-version input is not specified the action will try to read required version from file from python-version-file input.

    • Use pypyX.Y for PyPy python-version input: #349

    Example of usage:

    - uses: actions/[email protected]
      with:
        python-version: 'pypy3.9' # pypy-X.Y kept for backward compatibility
    - run: python my_script.py
    
    • RUNNER_TOOL_CACHE environment variable is equal AGENT_TOOLSDIRECTORY: #338

    • Bugfix: create missing pypyX.Y symlinks: #347

    • PKG_CONFIG_PATH environment variable: #400

    • Added python-path output: #405 python-path output contains Python executable path.

    • Updated zeit/ncc to vercel/ncc package: #393

    • Bugfix: fixed output for prerelease version of poetry: #409

    • Made pythonLocation environment variable consistent for Python and PyPy: #418

    • Bugfix for 3.x-dev syntax: #417

    • Other improvements: #318 #396 #384 #387 #388

    Update actions/cache version to 2.0.2

    In scope of this release we updated actions/cache package as the new version contains fixes related to GHES 3.5 (actions/setup-python#382)

    Add "cache-hit" output and fix "python-version" output for PyPy

    This release introduces new output cache-hit (actions/setup-python#373) and fix python-version output for PyPy (actions/setup-python#365)

    The cache-hit output contains boolean value indicating that an exact match was found for the key. It shows that the action uses already existing cache or not. The output is available only if cache is enabled.

    ... (truncated)

    Commits
    • 13ae5bb Merge pull request #517 from rentziass/rentziass/update-actions-core
    • 0c4d7b8 Update @​actions/core to 1.10.0
    • 13a464f Fix typo (#503)
    • b4fe97e upgrade @​actions/cache so it respects SEGMENT_DOWNLOAD_TIMEOUT_MINS (#499)
    • 434aeab Bump @​actions/core from 1.7.0 to 1.9.1 (#495)
    • 98c991d Only use github.token on github.com (#443)
    • 397a35f Merge pull request #492 from al-cheb/al-cheb/update-runner-link
    • 48a0f00 Update runner links
    • 978fd06 Merge pull request #491 from lkfortuna/patch-2
    • 050e616 Update README.md
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    opened by dependabot[bot] 0
  • Bump liskin/gh-problem-matcher-wrap from 1 to 2

    Bump liskin/gh-problem-matcher-wrap from 1 to 2

    Bumps liskin/gh-problem-matcher-wrap from 1 to 2.

    Release notes

    Sourced from liskin/gh-problem-matcher-wrap's releases.

    v2.0.0: Bump runner to node16, bump deps

    What's Changed

    New Contributors

    Full Changelog: https://github.com/liskin/gh-problem-matcher-wrap/compare/v1.0.2...v2.0.0

    v1.0.2: Bump @​actions/core

    What's Changed

    Full Changelog: https://github.com/liskin/gh-problem-matcher-wrap/compare/v1.0.1...v1.0.2

    v1.0.1: More problem matchers, improved docs

    No release notes provided.

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    opened by dependabot[bot] 0
  • Bump actions/checkout from 2 to 3

    Bump actions/checkout from 2 to 3

    Bumps actions/checkout from 2 to 3.

    Release notes

    Sourced from actions/checkout's releases.

    v3.0.0

    • Updated to the node16 runtime by default
      • This requires a minimum Actions Runner version of v2.285.0 to run, which is by default available in GHES 3.4 or later.

    v2.5.0

    What's Changed

    Full Changelog: https://github.com/actions/checkout/compare/v2...v2.5.0

    v2.4.2

    What's Changed

    Full Changelog: https://github.com/actions/checkout/compare/v2...v2.4.2

    v2.4.1

    • Fixed an issue where checkout failed to run in container jobs due to the new git setting safe.directory

    v2.4.0

    • Convert SSH URLs like org-<ORG_ID>@github.com: to https://github.com/ - pr

    v2.3.5

    Update dependencies

    v2.3.4

    v2.3.3

    v2.3.2

    Add Third Party License Information to Dist Files

    v2.3.1

    Fix default branch resolution for .wiki and when using SSH

    v2.3.0

    Fallback to the default branch

    v2.2.0

    Fetch all history for all tags and branches when fetch-depth=0

    v2.1.1

    Changes to support GHES (here and here)

    ... (truncated)

    Changelog

    Sourced from actions/checkout's changelog.

    Changelog

    v3.1.0

    v3.0.2

    v3.0.1

    v3.0.0

    v2.3.1

    v2.3.0

    v2.2.0

    v2.1.1

    • Changes to support GHES (here and here)

    v2.1.0

    v2.0.0

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    opened by dependabot[bot] 0
  • Bump actions/cache from 2 to 3

    Bump actions/cache from 2 to 3

    Bumps actions/cache from 2 to 3.

    Release notes

    Sourced from actions/cache's releases.

    v3.0.0

    • This change adds a minimum runner version(node12 -> node16), which can break users using an out-of-date/fork of the runner. This would be most commonly affecting users on GHES 3.3 or before, as those runners do not support node16 actions and they can use actions from github.com via github connect or manually copying the repo to their GHES instance.

    • Few dependencies and cache action usage examples have also been updated.

    v2.1.7

    Support 10GB cache upload using the latest version 1.0.8 of @actions/cache

    v2.1.6

    • Catch unhandled "bad file descriptor" errors that sometimes occurs when the cache server returns non-successful response (actions/cache#596)

    v2.1.5

    • Fix permissions error seen when extracting caches with GNU tar that were previously created using BSD tar (actions/cache#527)

    v2.1.4

    • Make caching more verbose #650
    • Use GNU tar on macOS if available #701

    v2.1.3

    • Upgrades @actions/core to v1.2.6 for CVE-2020-15228. This action was not using the affected methods.
    • Fix error handling in uploadChunk where 400-level errors were not being detected and handled correctly

    v2.1.2

    • Adds input to limit the chunk upload size, useful for self-hosted runners with slower upload speeds
    • No-op when executing on GHES

    v2.1.1

    • Update @actions/cache package to v1.0.2 which allows cache action to use posix format when taring files.

    v2.1.0

    • Replaces the http-client with the Azure Storage SDK for NodeJS when downloading cache content from Azure. This should help improve download performance and reliability as the SDK downloads files in 4 MB chunks, which can be parallelized and retried independently
    • Display download progress and speed
    Changelog

    Sourced from actions/cache's changelog.

    Releases

    3.0.0

    • Updated minimum runner version support from node 12 -> node 16

    3.0.1

    • Added support for caching from GHES 3.5.
    • Fixed download issue for files > 2GB during restore.

    3.0.2

    • Added support for dynamic cache size cap on GHES.

    3.0.3

    • Fixed avoiding empty cache save when no files are available for caching. (issue)

    3.0.4

    • Fixed tar creation error while trying to create tar with path as ~/ home folder on ubuntu-latest. (issue)

    3.0.5

    • Removed error handling by consuming actions/cache 3.0 toolkit, Now cache server error handling will be done by toolkit. (PR)

    3.0.6

    • Fixed #809 - zstd -d: no such file or directory error
    • Fixed #833 - cache doesn't work with github workspace directory

    3.0.7

    • Fixed #810 - download stuck issue. A new timeout is introduced in the download process to abort the download if it gets stuck and doesn't finish within an hour.

    3.0.8

    • Fix zstd not working for windows on gnu tar in issues #888 and #891.
    • Allowing users to provide a custom timeout as input for aborting download of a cache segment using an environment variable SEGMENT_DOWNLOAD_TIMEOUT_MINS. Default is 60 minutes.

    3.0.9

    • Enhanced the warning message for cache unavailablity in case of GHES.

    3.0.10

    • Fix a bug with sorting inputs.
    • Update definition for restore-keys in README.md

    3.0.11

    • Update toolkit version to 3.0.5 to include @actions/core@^1.10.0
    • Update @actions/cache to use updated saveState and setOutput functions from @actions/core@^1.10.0
    Commits
    • 9b0c1fc Merge pull request #956 from actions/pdotl-version-bump
    • 18103f6 Fix licensed status error
    • 3e383cd Update RELEASES
    • 43428ea toolkit versioon update and version bump for cache
    • 1c73980 3.0.11
    • a3f5edc Merge pull request #950 from rentziass/rentziass/update-actions-core
    • 831ee69 Update licenses
    • b9c8bfe Update @​actions/core to 1.10.0
    • 0f20846 Merge pull request #946 from actions/Phantsure-patch-2
    • 862fc14 Update README.md
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    opened by dependabot[bot] 0
Releases(1.0.3)
Owner
Tomáš Janoušek
Software (free/open-source), cycling (road, gravel, urban, fixed, uni), beer (🇨🇿). Not necessarily in that order. Current @xmonad maintainer.
Tomáš Janoušek
More than 130 check plugins for Icinga and other Nagios-compatible monitoring applications. Each plugin is a standalone command line tool (written in Python) that provides a specific type of check.

Python-based Monitoring Check Plugins Collection This Enterprise Class Check Plugin Collection offers a package of more than 130 Python-based, Nagios-

Linuxfabrik 119 Dec 27, 2022
Nagios status monitor for your desktop.

Nagstamon Nagstamon is a status monitor for the desktop. It connects to multiple Nagios, Icinga, Opsview, Centreon, Op5 Monitor/Ninja, Checkmk Multisi

Henri Wahl 361 Jan 05, 2023
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
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.

Oncall See admin docs for information on how to run and manage Oncall. Development setup Prerequisites Debian/Ubuntu - sudo apt-get install libsasl2-d

LinkedIn 928 Dec 22, 2022
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
Ajenti Core and stock plugins

Ajenti is a Linux & BSD modular server admin panel. Ajenti 2 provides a new interface and a better architecture, developed with Python3 and AngularJS.

Ajenti Project 7k Jan 03, 2023
Phonebook application to manage phone numbers

PhoneBook Phonebook application to manage phone numbers. How to Use run main.py python file. python3 main.py Links Download Source Code: Click Here M

Mohammad Dori 3 Jul 15, 2022
A collection of beginner-friendly DevOps content

mansion Mansion is just a testing repo for learners to commit into open source project. These are the steps you need to learn: Please do not edit thes

Bryan Lim 62 Nov 30, 2022
Asynchronous parallel SSH client library.

parallel-ssh Asynchronous parallel SSH client library. Run SSH commands over many - hundreds/hundreds of thousands - number of servers asynchronously

1.1k Dec 31, 2022
📦 Powerful Package manager which updates plugins & server software for minecraft servers

pluGET A powerful package manager which updates Plugins and Server Software for minecraft servers. Screenshots check all to check installed plugins fo

106 Dec 16, 2022
Bash-based Python-venv convenience wrapper

venvrc Bash-based Python-venv convenience wrapper. Demo Install Copy venvrc file to ~/.venvrc, and add the following line to your ~/.bashrc file: # so

1 Dec 29, 2022
A Python Implementation for Git for learning

A pure Python implementation for Git based on Buliding Git

shidenggui 42 Jul 13, 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
GitGoat enables DevOps and Engineering teams to test security products intending to integrate with GitHub

GitGoat is an open source tool that was built to enable DevOps and Engineering teams to design and implement a sustainable misconfiguration prevention strategy. It can be used to test with products w

Arnica 149 Dec 22, 2022
Honcho: a python clone of Foreman. For managing Procfile-based applications.

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

Nick Stenning 1.5k Jan 03, 2023
This project shows how to serve an TF based image classification model as a web service with TFServing, Docker, and Kubernetes(GKE).

Deploying ML models with CPU based TFServing, Docker, and Kubernetes By: Chansung Park and Sayak Paul This project shows how to serve a TensorFlow ima

Chansung Park 104 Dec 28, 2022
Repository tracking all OpenStack repositories as submodules. Mirror of code maintained at opendev.org.

OpenStack OpenStack is a collection of interoperable components that can be deployed to provide computing, networking and storage resources. Those inf

Mirrors of opendev.org/openstack 4.6k Dec 28, 2022
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 08, 2023
SSH to WebSockets Bridge

wssh wssh is a SSH to WebSockets Bridge that lets you invoke a remote shell using nothing but HTTP. The client connecting to wssh doesn't need to spea

Andrea Luzzardi 1.3k Dec 25, 2022