From 3cfa54248ff93654940192df04366a6b273dcca3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A9lix=20MARQUET?= <72651575+BreizhHardware@users.noreply.github.com> Date: Mon, 21 Oct 2024 16:15:01 +0200 Subject: [PATCH 01/10] Add docker-hub compatibility --- .github/workflows/create_release.yml | 51 +++++++++++++++++ CHANGELOG.MD | 3 + Dockerfile | 5 +- README.md | 5 +- entrypoint.sh | 1 + index.html | 77 +++++++++++++++++-------- ntfy.py | 84 ++++++++++++++++++++++++++-- ntfy_api.py | 77 +++++++++++++++++++++++-- script.js | 77 +++++++++++++++++++++++++ test.json | 31 ++++++++++ 10 files changed, 377 insertions(+), 34 deletions(-) create mode 100644 .github/workflows/create_release.yml create mode 100644 CHANGELOG.MD create mode 100644 test.json diff --git a/.github/workflows/create_release.yml b/.github/workflows/create_release.yml new file mode 100644 index 0000000..2b395a6 --- /dev/null +++ b/.github/workflows/create_release.yml @@ -0,0 +1,51 @@ +name: Docker Build and Release + +on: + push: + branches: + - main + +jobs: + build-and-release: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + + - name: Log in to Docker Hub + uses: docker/login-action@v2 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + + - name: Build and push Docker image + uses: docker/build-push-action@v4 + with: + context: . + push: true + tags: ${{ secrets.DOCKER_USERNAME }}/ntfy_alerts:latest + + - name: Create Release + id: create_release + uses: actions/create-release@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + tag_name: ${{ github.sha }} + release_name: Release ${{ github.sha }} + draft: false + prerelease: false + + - name: Upload changelog + uses: actions/upload-release-asset@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ steps.create_release.outputs.upload_url }} + asset_path: ./CHANGELOG.md + asset_name: CHANGELOG.md + asset_content_type: text/markdown \ No newline at end of file diff --git a/CHANGELOG.MD b/CHANGELOG.MD new file mode 100644 index 0000000..0a3e631 --- /dev/null +++ b/CHANGELOG.MD @@ -0,0 +1,3 @@ +**New features**: +- Change database struct to be able to handle docker hub repos +- Now you can add docker hub repo to your watch list diff --git a/Dockerfile b/Dockerfile index cb5d290..ff35da7 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,10 +4,11 @@ LABEL maintainer="BreizhHardware" ADD ntfy.py / ADD ntfy_api.py / +ADD migration.py /migration.py / ADD requirements.txt / ADD entrypoint.sh / -ADD index.html /var/www/html/index.html -ADD script.js /var/www/html/script.js +ADD index.html /var/www/html/index.html / +ADD script.js /var/www/html/script.js / RUN apk add --no-cache sqlite-dev sqlite-libs gcc musl-dev nginx RUN pip install -r requirements.txt diff --git a/README.md b/README.md index ea945b5..2e677d8 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,12 @@ # ntfy_alerts Personal ntfy alerts system -feel free to contribute and to fork +Feel free to contribute and to fork ! # Python ntfy.py ## Description: This script is used to watch the github repos and send a notification to the ntfy server when a new release is published. +It can aloso watch Docker Hub repos and do the same as github. ## Utilisation: auth and ntfy_url are required to be set as environment variables. @@ -44,6 +45,8 @@ Docker Hub repo: https://hub.docker.com/r/breizhhardware/github-ntfy - [x] Add the watched repos list as a parameter - [x] Add the application version as a database - [x] Add the watched repos list as a web interface +- [x] Add Docker Hub compatibility +- [ ] Rework of the web interface # Bash setup-notify.sh ## Description: This script is used to setup the ntfy notification system on ssh login for a new server. diff --git a/entrypoint.sh b/entrypoint.sh index 3940da6..c8db69a 100644 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -7,4 +7,5 @@ echo -n "$USERNAME:$PASSWORD" | base64 > /auth.txt nginx -g 'daemon off;' & # Exécute le script Python +exec python ./migration.py exec python ./ntfy.py diff --git a/index.html b/index.html index 2156d6f..36eae18 100644 --- a/index.html +++ b/index.html @@ -8,36 +8,69 @@ -
-

Github-Ntfy

-

Add a repo

-
-
-
-

Name of the github repo

-
-
-
-
- github.com/ - +

Github-Ntfy

+
+
+

Add a github repo

+ +
+
+

Name of the github repo

+
+
+
+
+ github.com/ + +
+
+ + +
+ +
+

Watched Repositories

+
    + +
-
- - +
+
+

Add a github repo

+
+
+
+

Name of the github repo

+
+
+
+
+ github.com/ + +
+
+
+
+
+
+
+ + +
+
+
+

Watched Repositories

+
    + +
- -
-

Watched Repositories

-
    - -
+

I know this web interface is awfull but I'm not a web designer ^^.

\ No newline at end of file diff --git a/ntfy.py b/ntfy.py index b012139..e030406 100644 --- a/ntfy.py +++ b/ntfy.py @@ -23,6 +23,10 @@ cursor.execute('''CREATE TABLE IF NOT EXISTS versions (repo TEXT PRIMARY KEY, version TEXT, changelog TEXT)''') conn.commit() +cursor.execute('''CREATE TABLE IF NOT EXISTS docker_versions + (repo TEXT PRIMARY KEY, digest TEXT, changelog TEXT)''') +conn.commit() + logger.info("Starting version monitoring...") conn2 = sqlite3.connect('/github-ntfy/watched_repos.db', check_same_thread=False) @@ -32,6 +36,10 @@ cursor2.execute('''CREATE TABLE IF NOT EXISTS watched_repos (id INTEGER PRIMARY KEY, repo TEXT)''') conn2.commit() +cursor2.execute('''CREATE TABLE IF NOT EXISTS docker_watched_repos + (id INTEGER PRIMARY KEY, repo TEXT)''') +conn2.commit() + def get_watched_repos(): cursor2.execute("SELECT * FROM watched_repos") @@ -42,6 +50,15 @@ def get_watched_repos(): return watched_repos +def get_docker_watched_repos(): + cursor2.execute("SELECT * FROM docker_watched_repos") + watched_repos_rows = cursor2.fetchall() + watched_repos = [] + for repo in watched_repos_rows: + watched_repos.append(repo[1]) + return watched_repos + + def start_api(): subprocess.Popen(["python", "ntfy_api.py"]) @@ -67,6 +84,25 @@ def get_latest_releases(watched_repos): logger.error(f"Failed to fetch release info for {repo}") return releases +def get_latest_docker_releases(watched_repos): + releases = [] + for repo in watched_repos: + url = f"https://hub.docker.com/v2/repositories/{repo_name}/tags/latest" + response = requests.get(url) + if response.status_code == 200: + release_info = response.json() + release_date=release_info["last_upated"] + digest = release_date["digest"] + releases.append({ + "repo": repo, + "digest": digest, + "html_url": "https://hub.docker.com/r/" + repo, + "published_at": release_date + }) + else: + logger.error(f"Failed to fetch Docker Hub info for {repo_name}") + return releases + def get_changelog(repo): url = f"https://api.github.com/repos/{repo}/releases" @@ -80,7 +116,7 @@ def get_changelog(repo): return "Changelog not available" -def send_to_ntfy(releases, auth, url): +def github_send_to_ntfy(releases, auth, url): for release in releases: app_name = release['repo'].split('/')[-1] # Getting the application name from the repo version_number = release['tag_name'] # Getting the version number @@ -115,6 +151,40 @@ def send_to_ntfy(releases, auth, url): else: logger.error(f"Failed to send message to Ntfy. Status code: {response.status_code}") +def docker_send_to_ntfy(releases, auth, url): + for release in releases: + app_name = release['repo'].split('/')[-1] # Getting the application name from the repo + digest_number = release['digest'] + app_url = release['html_url'] # Getting the application URL + release_date = release['published_at'] # Getting the release date + release_date = release_date.replace("T", " ").replace("Z", "") # Formatting the release date + + # Checking if the version has changed since the last time + cursor.execute("SELECT digest FROM docker_versions WHERE repo=?", (app_name,)) + previous_digest = cursor.fetchone() + if previous_digest and previous_digest[0] == digest_number: + logger.info(f"The digest of {app_name} has not changed. No notification sent.") + continue # Move on to the next application + + message = f"New version: {digest_number}\nFor: {app_name}\nPublished on: {release_date}\nChangelog:\n{changelog}\n{app_url}" + # Updating the previous digest for this application + cursor.execute("INSERT OR REPLACE INTO docker_versions (repo, digest, changelog) VALUES (?, ?, ?)", + (app_name, digest_number, changelog)) + conn.commit() + + headers = { + "Authorization": f"Basic {auth}", + "Title": f"New version for {app_name}", + "Priority": "urgent", + "Markdown": "yes", + "Actions": f"view, Update {app_name}, {app_url}, clear=true"} + response = requests.post(f"{url}", headers=headers, data=message) + if response.status_code == 200: + logger.info(f"Message sent to Ntfy for {app_name}") + continue + else: + logger.error(f"Failed to send message to Ntfy. Status code: {response.status_code}") + if __name__ == "__main__": start_api() @@ -125,10 +195,14 @@ if __name__ == "__main__": if auth and ntfy_url: while True: - watched_repos_list = get_watched_repos() - latest_release = get_latest_releases(watched_repos_list) - if latest_release: - send_to_ntfy(latest_release, auth, ntfy_url) + github_watched_repos_list = get_watched_repos() + github_latest_release = get_latest_releases(github_watched_repos_list) + if github_latest_release: + github_send_to_ntfy(github_latest_release, auth, ntfy_url) + docker_watched_repos_list = get_docker_watched_repos() + docker_latest_release = get_latest_docker_releases(docker_watched_repos_list) + if docker_latest_release: + docker_send_to_ntfy(docker_latest_release, auth, ntfy_url) time.sleep(timeout) # Wait an hour before checking again else: logger.error("Usage: python ntfy.py") diff --git a/ntfy_api.py b/ntfy_api.py index dc47cca..3a33bb4 100644 --- a/ntfy_api.py +++ b/ntfy_api.py @@ -34,12 +34,41 @@ def app_repo(): cursor.execute("SELECT * FROM watched_repos WHERE repo=?", (repo,)) existing_repo = cursor.fetchone() if existing_repo: - return jsonify({"error": f"The repo {repo} is already in the database."}), 409 + return jsonify({"error": f"The GitHub repo {repo} is already in the database."}), 409 # Ajouter le dépôt à la base de données cursor.execute("INSERT INTO watched_repos (repo) VALUES (?)", (repo,)) conn.commit() - return jsonify({"message": f"The repo {repo} as been added to the watched repos."}) + return jsonify({"message": f"The GitHub repo {repo} as been added to the watched repos."}) + finally: + # Fermer la connexion à la base de données + close_db_connection(conn) + + +@app.route('/app_docker_repo', methods=['POST']) +def app_docker_repo(): + data = request.json + repo = data.get('repo') + + # Vérifier si le champ 'repo' est présent dans les données JSON + if not repo: + return jsonify({"error": "The repo field is required."}), 400 + + # Établir une connexion à la base de données + conn = get_db_connection() + cursor = conn.cursor() + + try: + # Vérifier si le dépôt existe déjà dans la base de données + cursor.execute("SELECT * FROM docker_watched_repos WHERE repo=?", (repo,)) + existing_repo = cursor.fetchone() + if existing_repo: + return jsonify({"error": f"The Docker repo {repo} is already in the database."}), 409 + + # Ajouter le dépôt à la base de données + cursor.execute("INSERT INTO docker_watched_repos (repo) VALUES (?)", (repo,)) + conn.commit() + return jsonify({"message": f"The Docker repo {repo} as been added to the watched repos."}) finally: # Fermer la connexion à la base de données close_db_connection(conn) @@ -56,6 +85,17 @@ def get_watched_repos(): return jsonify(watched_repos) +@app.route('/watched_docker_repos', methods=['GET']) +def get_watched_repos(): + db = get_db_connection() + cursor = db.cursor() + cursor.execute("SELECT repo FROM docker_watched_repos") + watched_repos = [repo[0] for repo in cursor.fetchall()] + cursor.close() + db.close() + return jsonify(watched_repos) + + @app.route('/delete_repo', methods=['POST']) def delete_repo(): data = request.json @@ -74,12 +114,41 @@ def delete_repo(): cursor.execute("SELECT * FROM watched_repos WHERE repo=?", (repo,)) existing_repo = cursor.fetchone() if not existing_repo: - return jsonify({"error": f"The repo {repo} is not in the database."}), 404 + return jsonify({"error": f"The GitHub repo {repo} is not in the database."}), 404 # Supprimer le dépôt de la base de données cursor.execute("DELETE FROM watched_repos WHERE repo=?", (repo,)) conn.commit() - return jsonify({"message": f"The repo {repo} as been deleted from the watched repos."}) + return jsonify({"message": f"The GitHub repo {repo} as been deleted from the watched repos."}) + finally: + # Fermer la connexion à la base de données + close_db_connection(conn) + + +@app.route('/delete_docker_repo', methods=['POST']) +def delete_repo(): + data = request.json + repo = data.get('repo') + + # Vérifier si le champ 'repo' est présent dans les données JSON + if not repo: + return jsonify({"error": "The repo field is required."}), 400 + + # Établir une connexion à la base de données + conn = get_db_connection() + cursor = conn.cursor() + + try: + # Vérifier si le dépôt existe dans la base de données + cursor.execute("SELECT * FROM docker_watched_repos WHERE repo=?", (repo,)) + existing_repo = cursor.fetchone() + if not existing_repo: + return jsonify({"error": f"The Docker repo {repo} is not in the database."}), 404 + + # Supprimer le dépôt de la base de données + cursor.execute("DELETE FROM docker_watched_repos WHERE repo=?", (repo,)) + conn.commit() + return jsonify({"message": f"The Docker repo {repo} as been deleted from the watched repos."}) finally: # Fermer la connexion à la base de données close_db_connection(conn) diff --git a/script.js b/script.js index b038ca8..a21e804 100644 --- a/script.js +++ b/script.js @@ -22,6 +22,30 @@ document.getElementById('addRepoForm').addEventListener('submit', function(event }); }); +document.getElementById('addDockerRepoForm').addEventListener('submit', function(event) { + event.preventDefault(); + let repoName = document.getElementById('dockerRepo').value; + fetch('/app_docker_repo', { + method: 'POST', + headers: { + 'Access-Control-Allow-Origin': '*', + 'Content-Type': 'application/json' + }, + body: JSON.stringify({repo: repoName}) + }) + .then(response => { + if (response.ok) { + // Si la requête s'est bien déroulée, actualiser la liste des dépôts surveillés + refreshWatchedRepos(); + } else { + throw new Error('Erreur lors de l\'ajout du dépôt'); + } + }) + .catch(error => { + console.error('Error:', error); + }); +}); + function refreshWatchedRepos() { fetch('/watched_repos') .then(response => response.json()) @@ -56,6 +80,40 @@ function refreshWatchedRepos() { .catch(error => { console.error('Error:', error); }); + + fetch('/watched_docker_repos') + .then(response => response.json()) + .then(data => { + const watchedDockerReposList = document.getElementById('watchedDockerReposList'); + // Vider la liste actuelle + watchedDockerReposList.innerHTML = ''; + // Ajouter chaque dépôt surveillé à la liste + data.forEach(repo => { + const listItem = document.createElement('li'); + const repoName = document.createElement('span'); + repoName.textContent = repo; + repoName.className = 'repo-name'; + listItem.appendChild(repoName); + + const deleteButton = document.createElement('button'); + deleteButton.textContent = ' X'; + deleteButton.className = 'delete-btn text-red-500 ml-2'; + deleteButton.addEventListener('click', () => { + // Remove the repo from the watched repos + // This is a placeholder. Replace it with your actual code to remove the repo from the watched repos. + removeDockerRepoFromWatchedRepos(repo); + + // Remove the repo from the DOM + listItem.remove(); + }); + listItem.appendChild(deleteButton); + + watchedDockerReposList.appendChild(listItem); + }); + }) + .catch(error => { + console.error('Error:', error); + }); } function removeRepoFromWatchedRepos(repo) { @@ -77,5 +135,24 @@ function removeRepoFromWatchedRepos(repo) { }); } +function removeDockerRepoFromWatchedRepos(repo) { + fetch('/delete_docker_repo', { + method: 'POST', + headers: { + 'Access-Control-Allow-Origin': '*', + 'Content-Type': 'application/json' + }, + body: JSON.stringify({repo: repo}) + }) + .then(response => { + if (!response.ok) { + throw new Error('Erreur lors de la suppression du dépôt'); + } + }) + .catch(error => { + console.error('Error:', error); + }); +} + // Appeler la fonction pour charger les dépôts surveillés au chargement de la page refreshWatchedRepos(); \ No newline at end of file diff --git a/test.json b/test.json new file mode 100644 index 0000000..bdf2cb0 --- /dev/null +++ b/test.json @@ -0,0 +1,31 @@ + {"creator":25459699, + "id":612751277, + "images":[ + { + "architecture":"amd64", + "features":"", + "variant":null, + "digest":"sha256:b73e29720778ec8fb943155c967db8a7d22e531688cf7a226d973de9acf8ce57", + "os":"linux", + "os_features":"", + "os_version":null, + "size":90190069, + "status":"active", + "last_pulled":"2024-09-28T03:48:26.346149Z", + "last_pushed":"2024-06-27T12:20:32.274214Z" + } + ], + "last_updated":"2024-06-27T12:20:32.274214Z", + "last_updater":25459699, + "last_updater_username":"breizhhardware", + "name":"latest", + "repository":23423218, + "full_size":90190069, + "v2":true, + "tag_status":"active", + "tag_last_pulled":"2024-09-28T03:48:26.346149Z", + "tag_last_pushed":"2024-06-27T12:20:32.274214Z", + "media_type":"application/vnd.docker.container.image.v1+json", + "content_type":"image", + "digest":"sha256:b73e29720778ec8fb943155c967db8a7d22e531688cf7a226d973de9acf8ce57" +} \ No newline at end of file From 76de8af42b2182d929fc550fe9e3ba46a6cdba1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A9lix=20MARQUET?= <72651575+BreizhHardware@users.noreply.github.com> Date: Mon, 21 Oct 2024 16:15:52 +0200 Subject: [PATCH 02/10] Change the temp changelog --- CHANGELOG.MD | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.MD b/CHANGELOG.MD index 0a3e631..ca4ea37 100644 --- a/CHANGELOG.MD +++ b/CHANGELOG.MD @@ -1,3 +1,5 @@ **New features**: - Change database struct to be able to handle docker hub repos - Now you can add docker hub repo to your watch list + +**Full Changelog**: https://github.com/BreizhHardware/ntfy_alerts/compare/v1.3...v1.4 \ No newline at end of file From 350ad9bf6a7fbe3a193c68db5e15401dd130da0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A9lix=20MARQUET?= <72651575+BreizhHardware@users.noreply.github.com> Date: Mon, 21 Oct 2024 16:17:13 +0200 Subject: [PATCH 03/10] Update NGINX config with the new route --- README.md | 1 + nginx.conf | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/README.md b/README.md index 2e677d8..5ce68c2 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,7 @@ Feel free to contribute and to fork ! # Python ntfy.py ## Description: This script is used to watch the github repos and send a notification to the ntfy server when a new release is published. + It can aloso watch Docker Hub repos and do the same as github. ## Utilisation: auth and ntfy_url are required to be set as environment variables. diff --git a/nginx.conf b/nginx.conf index 57a8ca7..88d6f7f 100644 --- a/nginx.conf +++ b/nginx.conf @@ -35,5 +35,26 @@ http { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } + location /app_docker_repo { + proxy_pass http://127.0.0.1:5000; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + location /watched_docker_repos { + proxy_pass http://127.0.0.1:5000; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + location /delete_docker_repo { + proxy_pass http://127.0.0.1:5000; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } } } From a14cc1848f9d1ee5d16fabd996d93148a3b68611 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A9lix=20MARQUET?= <72651575+BreizhHardware@users.noreply.github.com> Date: Mon, 21 Oct 2024 16:26:46 +0200 Subject: [PATCH 04/10] Edit CI --- .github/workflows/create_release.yml | 30 ++++++++++++++++++++++----- Dockerfile | 1 + test.json | 31 ---------------------------- 3 files changed, 26 insertions(+), 36 deletions(-) delete mode 100644 test.json diff --git a/.github/workflows/create_release.yml b/.github/workflows/create_release.yml index 2b395a6..12f25e2 100644 --- a/.github/workflows/create_release.yml +++ b/.github/workflows/create_release.yml @@ -6,7 +6,7 @@ on: - main jobs: - build-and-release: + build-and-push-on-docker-hub: runs-on: ubuntu-latest steps: @@ -29,17 +29,33 @@ jobs: push: true tags: ${{ secrets.DOCKER_USERNAME }}/ntfy_alerts:latest + release-on-github: + runs-on: ubuntu-latest + + steps: + - name: Get the latest tag + id: get_latest_tag + run: echo "latest_tag=$(git describe --tags `git rev-list --tags --max-count=1`)" >> $GITHUB_ENV + + - name: Increment version + id: increment_version + run: | + latest_tag=${{ env.latest_tag }} + IFS='.' read -r -a version_parts <<< "$latest_tag" + new_version="${version_parts[0]}.$((version_parts[1] + 1))" + echo "new_version=$new_version" >> $GITHUB_ENV + - name: Create Release id: create_release uses: actions/create-release@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: - tag_name: ${{ github.sha }} - release_name: Release ${{ github.sha }} + tag_name: ${{ env.new_version }} + release_name: Release ${{ env.new_version }} draft: false prerelease: false - + - name: Upload changelog uses: actions/upload-release-asset@v1 env: @@ -48,4 +64,8 @@ jobs: upload_url: ${{ steps.create_release.outputs.upload_url }} asset_path: ./CHANGELOG.md asset_name: CHANGELOG.md - asset_content_type: text/markdown \ No newline at end of file + asset_content_type: text/markdown + + + + \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index ff35da7..2170775 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,7 @@ FROM python:3.11.8-alpine3.19 LABEL maintainer="BreizhHardware" +LABEL version_number="1.4" ADD ntfy.py / ADD ntfy_api.py / diff --git a/test.json b/test.json deleted file mode 100644 index bdf2cb0..0000000 --- a/test.json +++ /dev/null @@ -1,31 +0,0 @@ - {"creator":25459699, - "id":612751277, - "images":[ - { - "architecture":"amd64", - "features":"", - "variant":null, - "digest":"sha256:b73e29720778ec8fb943155c967db8a7d22e531688cf7a226d973de9acf8ce57", - "os":"linux", - "os_features":"", - "os_version":null, - "size":90190069, - "status":"active", - "last_pulled":"2024-09-28T03:48:26.346149Z", - "last_pushed":"2024-06-27T12:20:32.274214Z" - } - ], - "last_updated":"2024-06-27T12:20:32.274214Z", - "last_updater":25459699, - "last_updater_username":"breizhhardware", - "name":"latest", - "repository":23423218, - "full_size":90190069, - "v2":true, - "tag_status":"active", - "tag_last_pulled":"2024-09-28T03:48:26.346149Z", - "tag_last_pushed":"2024-06-27T12:20:32.274214Z", - "media_type":"application/vnd.docker.container.image.v1+json", - "content_type":"image", - "digest":"sha256:b73e29720778ec8fb943155c967db8a7d22e531688cf7a226d973de9acf8ce57" -} \ No newline at end of file From 0be8d008c527f4bfc056e3b5ed002f7b8a5148cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A9lix=20MARQUET?= <72651575+BreizhHardware@users.noreply.github.com> Date: Mon, 21 Oct 2024 16:41:25 +0200 Subject: [PATCH 05/10] Fix entrypoint persmisson --- .github/workflows/create_release.yml | 8 ++++---- Dockerfile | 6 +++--- README.md | 1 - 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/.github/workflows/create_release.yml b/.github/workflows/create_release.yml index 12f25e2..1bdfde5 100644 --- a/.github/workflows/create_release.yml +++ b/.github/workflows/create_release.yml @@ -14,20 +14,20 @@ jobs: uses: actions/checkout@v4 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v2 + uses: docker/setup-buildx-action@v3 - name: Log in to Docker Hub - uses: docker/login-action@v2 + uses: docker/login-action@v3 with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} - name: Build and push Docker image - uses: docker/build-push-action@v4 + uses: docker/build-push-action@v6 with: context: . push: true - tags: ${{ secrets.DOCKER_USERNAME }}/ntfy_alerts:latest + tags: ${{ secrets.DOCKER_USERNAME }}/github-ntfy:latest release-on-github: runs-on: ubuntu-latest diff --git a/Dockerfile b/Dockerfile index 2170775..1793470 100644 --- a/Dockerfile +++ b/Dockerfile @@ -5,13 +5,13 @@ LABEL version_number="1.4" ADD ntfy.py / ADD ntfy_api.py / -ADD migration.py /migration.py / ADD requirements.txt / ADD entrypoint.sh / -ADD index.html /var/www/html/index.html / -ADD script.js /var/www/html/script.js / +ADD index.html /var/www/html/index.html +ADD script.js /var/www/html/script.js RUN apk add --no-cache sqlite-dev sqlite-libs gcc musl-dev nginx RUN pip install -r requirements.txt +RUN chmod 700 /entrypoint.sh # Définir les variables d'environnement pour username et password ENV USERNAME="" \ diff --git a/README.md b/README.md index 5ce68c2..726e06d 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,6 @@ python ntfy.py ## Docker: If you want to use the docker image you can use the following docker-compose file: ````yaml -version: '3' services: github-ntfy: image: breizhhardware/github-ntfy:latest From d796d5b24fd5296244e03485fa157b50c3dd762e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A9lix=20MARQUET?= <72651575+BreizhHardware@users.noreply.github.com> Date: Mon, 21 Oct 2024 16:44:11 +0200 Subject: [PATCH 06/10] Remove migration from entrypoint --- entrypoint.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/entrypoint.sh b/entrypoint.sh index c8db69a..3940da6 100644 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -7,5 +7,4 @@ echo -n "$USERNAME:$PASSWORD" | base64 > /auth.txt nginx -g 'daemon off;' & # Exécute le script Python -exec python ./migration.py exec python ./ntfy.py From b11bc64e5266ec9fa97de3ff63621a26ba4304d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A9lix=20MARQUET?= <72651575+BreizhHardware@users.noreply.github.com> Date: Mon, 21 Oct 2024 15:00:13 +0000 Subject: [PATCH 07/10] Fix --- .gitignore | 6 ++++++ index.html | 16 ++++++++-------- ntfy_api.py | 4 ++-- 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/.gitignore b/.gitignore index 29789c4..98cb172 100644 --- a/.gitignore +++ b/.gitignore @@ -400,3 +400,9 @@ _deps .nfs* # End of https://www.toptal.com/developers/gitignore/api/c++,linux,clion,cmake,clion+all + +docker-compose.yml +github-ntfy/ +github-ntfy/* + +*.db \ No newline at end of file diff --git a/index.html b/index.html index 36eae18..21b9d79 100644 --- a/index.html +++ b/index.html @@ -9,8 +9,8 @@

Github-Ntfy

-
-
+
+

Add a github repo

@@ -34,23 +34,23 @@
-

Watched Repositories

+

Watched Github Repositories

-
-

Add a github repo

+
+

Add a docker repo

-

Name of the github repo

+

Name of the docker repo

- github.com/ + hub.docker.com/r/
@@ -64,7 +64,7 @@
-

Watched Repositories

+

Watched Docker Repositories

diff --git a/ntfy_api.py b/ntfy_api.py index 3a33bb4..ad995dd 100644 --- a/ntfy_api.py +++ b/ntfy_api.py @@ -86,7 +86,7 @@ def get_watched_repos(): @app.route('/watched_docker_repos', methods=['GET']) -def get_watched_repos(): +def get_watched_docker_repos(): db = get_db_connection() cursor = db.cursor() cursor.execute("SELECT repo FROM docker_watched_repos") @@ -126,7 +126,7 @@ def delete_repo(): @app.route('/delete_docker_repo', methods=['POST']) -def delete_repo(): +def delete_docker_repo(): data = request.json repo = data.get('repo') From 694bfcaf6b609b222aa5a4de2eae979efb330b74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A9lix=20MARQUET?= Date: Tue, 22 Oct 2024 09:38:53 +0200 Subject: [PATCH 08/10] Add docker login possibility --- Dockerfile | 2 ++ README.md | 2 ++ ntfy.py | 28 +++++++++++++++++++++++++++- 3 files changed, 31 insertions(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 1793470..0e57811 100644 --- a/Dockerfile +++ b/Dockerfile @@ -19,6 +19,8 @@ ENV USERNAME="" \ NTFY_URL="" \ GHNTFY_TIMEOUT="3600" \ GHNTFY_TOKEN="" \ + DOCKER_USERNAME="" \ + DOCKER_PASSWORD="" \ FLASK_ENV=production # Exposer le port 5000 pour l'API et le port 80 pour le serveur web diff --git a/README.md b/README.md index 726e06d..42358c2 100644 --- a/README.md +++ b/README.md @@ -31,6 +31,8 @@ services: - NTFY_URL=ntfy_url # Required - GHNTFY_TIMEOUT=timeout # Default is 3600 (1 hour) - GHNTFY_TOKEN= # Default is empty (Github token) + - DOCKER_USERNAME= # Default is empty (Docker Hub username) + - DOCKER_PASSWORD= # Default is empty (Docker Hub password) volumes: - /path/to/github-ntfy:/github-ntfy/ ports: diff --git a/ntfy.py b/ntfy.py index e030406..75edf3c 100644 --- a/ntfy.py +++ b/ntfy.py @@ -14,6 +14,32 @@ github_headers = {} if github_token: github_headers['Authorization'] = f"token {github_token}" +docker_username = os.environ.get('DOCKER_USERNAME') +docker_password = os.environ.get('DOCKER_PASSWORD') + + +def create_dockerhub_token(username, password): + url = "https://hub.docker.com//v2/users/login" + headers = {"Content-Type": "application/json"} + data = json.dumps({"username": username, "password": password}) + + response = requests.post(url, headers=headers, data=data) + + if response.status_code == 200: + token = response.json().get("token") + if token: + return token + else: + logger.error("Failed to get Docker Hub token.") + else: + logger.error(f"Failed to get Docker Hub token. Status code: {response.status_code}") + return None + + +docker_token = create_dockerhub_token(docker_username, docker_password) +docker_header = {} +if docker_token: + docker_header['Authorization'] = f"Bearer {docker_token}" # Connecting to the database to store previous versions conn = sqlite3.connect('/github-ntfy/ghntfy_versions.db', check_same_thread=False) cursor = conn.cursor() @@ -88,7 +114,7 @@ def get_latest_docker_releases(watched_repos): releases = [] for repo in watched_repos: url = f"https://hub.docker.com/v2/repositories/{repo_name}/tags/latest" - response = requests.get(url) + response = requests.get(url, headers=docker_header) if response.status_code == 200: release_info = response.json() release_date=release_info["last_upated"] From d218c7a0bc79742dc50ea8f4ae809f622439f152 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A9lix=20MARQUET?= Date: Tue, 22 Oct 2024 09:46:01 +0200 Subject: [PATCH 09/10] Add import for json --- ntfy.py | 1 + 1 file changed, 1 insertion(+) diff --git a/ntfy.py b/ntfy.py index 75edf3c..eef583e 100644 --- a/ntfy.py +++ b/ntfy.py @@ -4,6 +4,7 @@ import os import logging import sqlite3 import subprocess +import json # Configuring the logger logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s') From 7c2b4e545cb717e4f5c804eec8aba810350c6a50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A9lix=20MARQUET?= Date: Tue, 22 Oct 2024 09:49:37 +0200 Subject: [PATCH 10/10] Update changelog --- CHANGELOG.MD | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.MD b/CHANGELOG.MD index ca4ea37..c406737 100644 --- a/CHANGELOG.MD +++ b/CHANGELOG.MD @@ -1,5 +1,9 @@ **New features**: - Change database struct to be able to handle docker hub repos - Now you can add docker hub repo to your watch list +- You can connect your docker account to bypass the rate limit of the docker hub API + +**Breaking changes**: +- Change in the docker-compose file, you need to add the DOCKER_USERNAME and DOCKER_PASSWORD environment variables **Full Changelog**: https://github.com/BreizhHardware/ntfy_alerts/compare/v1.3...v1.4 \ No newline at end of file