mirror of
https://github.com/BreizhHardware/ntfy_alerts.git
synced 2026-01-18 16:37:28 +01:00
Add docker-hub compatibility
This commit is contained in:
51
.github/workflows/create_release.yml
vendored
Normal file
51
.github/workflows/create_release.yml
vendored
Normal file
@@ -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
|
||||
3
CHANGELOG.MD
Normal file
3
CHANGELOG.MD
Normal file
@@ -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
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
77
index.html
77
index.html
@@ -8,36 +8,69 @@
|
||||
<script src="./script.js" defer></script>
|
||||
</head>
|
||||
<body class="bg-gradient-to-b from-stone-500 to-green-700">
|
||||
<div class="flex flex-col gap-2 justify-center items-center my-2 h-screen">
|
||||
<h1 class="text-4xl font-semibold leading-10 text-gray-900">Github-Ntfy</h1>
|
||||
<h1>Add a repo</h1>
|
||||
<form id="addRepoForm">
|
||||
<div class="space-y-12">
|
||||
<div class="border-b border-gray-900/10 pb-12">
|
||||
<h2 class="text-base font-semibold leading-7 text-gray-900">Name of the github repo</h2>
|
||||
<div class="mt-10 grid grid-cols-1 gap-x-6 gap-y-8 sm:grid-cols-6">
|
||||
<div class="sm:col-span-4">
|
||||
<div class="mt-2">
|
||||
<div class="flex rounded-md shadow-sm ring-1 ring-inset ring-gray-300 focus-within:ring-2 focus-within:ring-inset focus-within:ring-indigo-600 sm:max-w-md">
|
||||
<span class="flex select-none items-center pl-3 sm:text-sm">github.com/</span>
|
||||
<input type="text" name="repo" id="repo" autocomplete="repo" class="block flex-1 border-0 bg-transparent py-1.5 pl-1 placeholder:text-gray-600 focus:ring-0 sm:text-sm sm:leading-6" placeholder="BreizhHardware/ntfy_alerts">
|
||||
<h1 class="text-4xl font-semibold leading-10 text-gray-900 text-center">Github-Ntfy</h1>
|
||||
<div class="flex flex-row gap-2 justify-center items-center my-2 h-screen border-double border-2 border-white">
|
||||
<div class="flex flex-col gap-2 justify-center items-center my-2 h-screen" id="github">
|
||||
<h1>Add a github repo</h1>
|
||||
<form id="addRepoForm">
|
||||
<div class="space-y-12">
|
||||
<div class="border-b border-gray-900/10 pb-12">
|
||||
<h2 class="text-base font-semibold leading-7 text-gray-900">Name of the github repo</h2>
|
||||
<div class="mt-10 grid grid-cols-1 gap-x-6 gap-y-8 sm:grid-cols-6">
|
||||
<div class="sm:col-span-4">
|
||||
<div class="mt-2">
|
||||
<div class="flex rounded-md shadow-sm ring-1 ring-inset ring-gray-300 focus-within:ring-2 focus-within:ring-inset focus-within:ring-indigo-600 sm:max-w-md">
|
||||
<span class="flex select-none items-center pl-3 sm:text-sm">github.com/</span>
|
||||
<input type="text" name="repo" id="repo" autocomplete="repo" class="block flex-1 border-0 bg-transparent py-1.5 pl-1 placeholder:text-gray-600 focus:ring-0 sm:text-sm sm:leading-6" placeholder="BreizhHardware/ntfy_alerts">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mt-6 flex items-center justify-end gap-x-6">
|
||||
<button type="button" class="text-sm font-semibold leading-6 text-gray-900">Cancel</button>
|
||||
<button type="submit" class="rounded-md bg-indigo-600 px-3 py-2 text-sm font-semibold text-white shadow-sm hover:bg-indigo-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-600">Save</button>
|
||||
</div>
|
||||
</form>
|
||||
<div class="mt-8">
|
||||
<h2 class="text-base font-semibold leading-7 text-gray-900">Watched Repositories</h2>
|
||||
<ul id="watchedReposList" class="mt-4">
|
||||
<!-- Dynamically populated with JavaScript -->
|
||||
</ul>
|
||||
</div>
|
||||
<div class="mt-6 flex items-center justify-end gap-x-6">
|
||||
<button type="button" class="text-sm font-semibold leading-6 text-gray-900">Cancel</button>
|
||||
<button type="submit" class="rounded-md bg-indigo-600 px-3 py-2 text-sm font-semibold text-white shadow-sm hover:bg-indigo-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-600">Save</button>
|
||||
</div>
|
||||
<div class="flex flex-col gap-2 justify-center items-center my-2 h-screen" id="docker">
|
||||
<h1>Add a github repo</h1>
|
||||
<form id="addDockerRepoForm">
|
||||
<div class="space-y-12">
|
||||
<div class="border-b border-gray-900/10 pb-12">
|
||||
<h2 class="text-base font-semibold leading-7 text-gray-900">Name of the github repo</h2>
|
||||
<div class="mt-10 grid grid-cols-1 gap-x-6 gap-y-8 sm:grid-cols-6">
|
||||
<div class="sm:col-span-4">
|
||||
<div class="mt-2">
|
||||
<div class="flex rounded-md shadow-sm ring-1 ring-inset ring-gray-300 focus-within:ring-2 focus-within:ring-inset focus-within:ring-indigo-600 sm:max-w-md">
|
||||
<span class="flex select-none items-center pl-3 sm:text-sm">github.com/</span>
|
||||
<input type="text" name="dockerRepo" id="dockerRepo" autocomplete="dockerRepo" class="block flex-1 border-0 bg-transparent py-1.5 pl-1 placeholder:text-gray-600 focus:ring-0 sm:text-sm sm:leading-6" placeholder="breizhhardware/github-ntfy">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mt-6 flex items-center justify-end gap-x-6">
|
||||
<button type="button" class="text-sm font-semibold leading-6 text-gray-900">Cancel</button>
|
||||
<button type="submit" class="rounded-md bg-indigo-600 px-3 py-2 text-sm font-semibold text-white shadow-sm hover:bg-indigo-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-600">Save</button>
|
||||
</div>
|
||||
</form>
|
||||
<div class="mt-8">
|
||||
<h2 class="text-base font-semibold leading-7 text-gray-900">Watched Repositories</h2>
|
||||
<ul id="watchedDockerReposList" class="mt-4">
|
||||
<!-- Dynamically populated with JavaScript -->
|
||||
</ul>
|
||||
</div>
|
||||
</form>
|
||||
<div class="mt-8">
|
||||
<h2 class="text-base font-semibold leading-7 text-gray-900">Watched Repositories</h2>
|
||||
<ul id="watchedReposList" class="mt-4">
|
||||
<!-- Dynamically populated with JavaScript -->
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<p class="font-semibold leading-10 text-gray-900 text-center">I know this web interface is awfull but I'm not a web designer ^^.</p>
|
||||
</body>
|
||||
</html>
|
||||
84
ntfy.py
84
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")
|
||||
|
||||
77
ntfy_api.py
77
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)
|
||||
|
||||
77
script.js
77
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();
|
||||
31
test.json
Normal file
31
test.json
Normal file
@@ -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"
|
||||
}
|
||||
Reference in New Issue
Block a user