This commit is contained in:
jokob-sk
2026-01-28 21:56:24 +11:00
4 changed files with 39 additions and 41 deletions

View File

@@ -1,8 +1,7 @@
name: Enforce Issue Templates name: Enforce Issue Templates
on: on:
issues: workflow_dispatch:
types: [opened]
permissions: permissions:
issues: write issues: write
@@ -15,19 +14,26 @@ jobs:
uses: actions/github-script@v7 uses: actions/github-script@v7
with: with:
script: | script: |
const body = (context.payload.issue.body || "").toLowerCase(); const body = (context.payload.issue?.body || "").toLowerCase();
const title = (context.payload.issue.title || "").toLowerCase(); const title = (context.payload.issue?.title || "").toLowerCase();
// Manual runs don't have an issue context
if (!context.payload.issue) {
console.log("No issue context (manual run) nothing to enforce.");
return;
}
// 1. Check for template marker // 1. Check for template marker
const usedTemplate = body.includes('netalertx_template'); const usedTemplate = body.includes('netalertx_template');
// 2. Security Bypass: Don't close if it looks like a security report // 2. Security bypass
const isSecurity = title.includes('security') || title.includes('vulnerability'); const isSecurity =
title.includes('security') ||
title.includes('vulnerability');
if (!usedTemplate && !isSecurity) { if (!usedTemplate && !isSecurity) {
const warningLabel = 'missing-template 📋'; const warningLabel = 'missing-template 📋';
// Add descriptive label
await github.rest.issues.addLabels({ await github.rest.issues.addLabels({
owner: context.repo.owner, owner: context.repo.owner,
repo: context.repo.repo, repo: context.repo.repo,
@@ -35,17 +41,15 @@ jobs:
labels: [warningLabel] labels: [warningLabel]
}); });
// Post polite comment with direct link to new issue
const commentMessage = ` const commentMessage = `
Hi there! 👋 Thanks for reaching out. Hi there! 👋 Thanks for reaching out.
To help the maintainers triage issues effectively, we **enforce the use of issue templates**. This helps us resolve problems much faster! To help the maintainers triage issues effectively, we **enforce the use of issue templates**.
**This issue has been closed** because it is missing the required template. Please [open a new issue here](https://github.com/${context.repo.owner}/${context.repo.repo}/issues/new/choose)
and select the appropriate template.
Please [open a new issue here](https://github.com/${context.repo.owner}/${context.repo.repo}/issues/new/choose) and select the appropriate template. Thank you! 🙏
Thank you for your understanding! 🙏
`; `;
await github.rest.issues.createComment({ await github.rest.issues.createComment({
@@ -55,15 +59,9 @@ jobs:
body: commentMessage body: commentMessage
}); });
// Close the issue (but do NOT lock it) // Intentionally NOT closing issues in manual mode
await github.rest.issues.update({ console.log("Issue missing template labeled and commented.");
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.issue.number,
state: 'closed'
});
return; return;
} }
console.log("Template detected or security keyword found ✅. Proceeding."); console.log("Template detected or security issue no action taken.");

View File

@@ -206,7 +206,7 @@
"Device_Save_Failed": "Erreur à l'enregistrement de l'appareil", "Device_Save_Failed": "Erreur à l'enregistrement de l'appareil",
"Device_Save_Unauthorized": "Non autorisé - Jeton d'API invalide", "Device_Save_Unauthorized": "Non autorisé - Jeton d'API invalide",
"Device_Saved_Success": "Appareil enregistré avec succès", "Device_Saved_Success": "Appareil enregistré avec succès",
"Device_Saved_Unexpected": "", "Device_Saved_Unexpected": "La mise à jour de l'appareil a renvoyé une réponse inattendue",
"Device_Searchbox": "Rechercher", "Device_Searchbox": "Rechercher",
"Device_Shortcut_AllDevices": "Mes appareils", "Device_Shortcut_AllDevices": "Mes appareils",
"Device_Shortcut_AllNodes": "Tous les nœuds", "Device_Shortcut_AllNodes": "Tous les nœuds",
@@ -296,14 +296,14 @@
"Events_Tablelenght": "Afficher _MENU_ entrées", "Events_Tablelenght": "Afficher _MENU_ entrées",
"Events_Tablelenght_all": "Tous", "Events_Tablelenght_all": "Tous",
"Events_Title": "Évènements", "Events_Title": "Évènements",
"FakeMAC_hover": "Autodétecté - indique si l'appareil utilise une fausse adresse MAC (qui commence par FA:CE ou 00:1A), typiquement générée par un plugin qui ne peut pas détecter la vraie adresse MAC, ou en créant un appareil factice.", "FakeMAC_hover": "Cet appareil a une adresse MAC fausse ou falsifiée",
"FieldLock_Error": "", "FieldLock_Error": "Erreur de mise à jour du statut de verrouillage du champ",
"FieldLock_Lock_Tooltip": "", "FieldLock_Lock_Tooltip": "Verrouiller le champ (empêche les surcharges de plugin)",
"FieldLock_Locked": "", "FieldLock_Locked": "Champ verrouillé",
"FieldLock_SaveBeforeLocking": "", "FieldLock_SaveBeforeLocking": "Enregistrez vos changements avant de verrouiller",
"FieldLock_Source_Label": "", "FieldLock_Source_Label": "Source : ",
"FieldLock_Unlock_Tooltip": "", "FieldLock_Unlock_Tooltip": "Déverrouiller le champ (autorise les surcharges de plugin)",
"FieldLock_Unlocked": "", "FieldLock_Unlocked": "Champ déverrouillé",
"GRAPHQL_PORT_description": "Le numéro de port du serveur GraphQL. Assurez vous sue le port est unique a l'échelle de toutes les applications sur cet hôte et vos instances NetAlertX.", "GRAPHQL_PORT_description": "Le numéro de port du serveur GraphQL. Assurez vous sue le port est unique a l'échelle de toutes les applications sur cet hôte et vos instances NetAlertX.",
"GRAPHQL_PORT_name": "Port GraphQL", "GRAPHQL_PORT_name": "Port GraphQL",
"Gen_Action": "Action", "Gen_Action": "Action",
@@ -466,8 +466,8 @@
"Maintenance_Tool_restore_noti": "Restauration de la base de données", "Maintenance_Tool_restore_noti": "Restauration de la base de données",
"Maintenance_Tool_restore_noti_text": "Êtes-vous sûr de vouloir lancer la restauration de la base données? Assurez-vous qu'aucun scan ne soit en cours.", "Maintenance_Tool_restore_noti_text": "Êtes-vous sûr de vouloir lancer la restauration de la base données? Assurez-vous qu'aucun scan ne soit en cours.",
"Maintenance_Tool_restore_text": "La dernière sauvegarde peut être restaurée à l'aide du bouton, mais les sauvegardes plus anciennes ne peuvent être restaurées que manuellement. Après la restauration, faites un contrôle d'intégrité de la base de donnes par sécurité, au cas où elle était en cours d'ecriture lorsque la sauvegarde a été réalisée.", "Maintenance_Tool_restore_text": "La dernière sauvegarde peut être restaurée à l'aide du bouton, mais les sauvegardes plus anciennes ne peuvent être restaurées que manuellement. Après la restauration, faites un contrôle d'intégrité de la base de donnes par sécurité, au cas où elle était en cours d'ecriture lorsque la sauvegarde a été réalisée.",
"Maintenance_Tool_unlockFields_selecteddev": "", "Maintenance_Tool_unlockFields_selecteddev": "Déverrouiller les champs de l'appareil",
"Maintenance_Tool_unlockFields_selecteddev_noti": "", "Maintenance_Tool_unlockFields_selecteddev_noti": "Déverrouiller les champs",
"Maintenance_Tool_upgrade_database_noti": "Mise à jour de la base de données", "Maintenance_Tool_upgrade_database_noti": "Mise à jour de la base de données",
"Maintenance_Tool_upgrade_database_noti_text": "Êtes-vous sûr de vouloir mettre à jour la base de données?<br>(il peut être préférable de l'archiver)", "Maintenance_Tool_upgrade_database_noti_text": "Êtes-vous sûr de vouloir mettre à jour la base de données?<br>(il peut être préférable de l'archiver)",
"Maintenance_Tool_upgrade_database_text": "Ce bouton va mettre à jour la base de données pour activer le graphique de l'activité réseau sur les 12 dernières heures. Veillez à faire une sauvegarde de la base de données en cas de problème.", "Maintenance_Tool_upgrade_database_text": "Ce bouton va mettre à jour la base de données pour activer le graphique de l'activité réseau sur les 12 dernières heures. Veillez à faire une sauvegarde de la base de données en cas de problème.",
@@ -609,7 +609,7 @@
"REPORT_MAIL_description": "Si activé, un courriel est envoyé, avec la liste des changements pour lesquels on a souscrit. Cela nécessite de renseigner les paramètres associés au paramétrage SMTP plus bas. Si vous rencontrez des problèmes, positionnez le <code>LOG_LEVEL</code> au niveau <code>debug</code> et vérifiez les <a href=\"/maintenance.php#tab_Logging\">journaux d'erreurs</a>.", "REPORT_MAIL_description": "Si activé, un courriel est envoyé, avec la liste des changements pour lesquels on a souscrit. Cela nécessite de renseigner les paramètres associés au paramétrage SMTP plus bas. Si vous rencontrez des problèmes, positionnez le <code>LOG_LEVEL</code> au niveau <code>debug</code> et vérifiez les <a href=\"/maintenance.php#tab_Logging\">journaux d'erreurs</a>.",
"REPORT_MAIL_name": "Activer les courriels", "REPORT_MAIL_name": "Activer les courriels",
"REPORT_TITLE": "Rapport", "REPORT_TITLE": "Rapport",
"RandomMAC_hover": "Détecté automatiquement - indique si l'appareil dispose d'une adresse MAC générée aléatoirement. Vous pouvez exclure des adresses MAC spécifiques via le paramètre UI_NOT_RANDOM_MAC. Cliquez pour plus d'informations.", "RandomMAC_hover": "Cet appareil a une adresse MAC aléatoire",
"Reports_Sent_Log": "Rapports de log transmis", "Reports_Sent_Log": "Rapports de log transmis",
"SCAN_SUBNETS_description": "La plupart des scanners sur le réseau (scan ARP, NMAP, Nslookup, DIG) se base sur le scan d'une partie spécifique des interfaces réseau ou de sous-réseau. Consulter la <a href=\"https://docs.netalertx.com/SUBNETS\" target=\"_blank\">documentation des sous-réseaux</a> pour plus d'aide sur ce paramètre, notamment pour des VLAN, lesquels sont supportés ou sur comment identifier le masque réseau et votre interface réseau. <br/> <br/> Une alternative à ces scanner sur le réseau et d'activer d'autres scanners d'appareils ou des importe, qui ne dépendent pas du fait de laisser NetAlert<sup>X</sup> accéder au réseau (Unifié, baux DHCP, Pi-hole, etc.).<br/><br/> Remarque : la durée du scan en lui-même dépend du nombre d'adresses IP à scanner, renseignez donc soigneusement avec le bon masque réseau et la bonne interface réseau.", "SCAN_SUBNETS_description": "La plupart des scanners sur le réseau (scan ARP, NMAP, Nslookup, DIG) se base sur le scan d'une partie spécifique des interfaces réseau ou de sous-réseau. Consulter la <a href=\"https://docs.netalertx.com/SUBNETS\" target=\"_blank\">documentation des sous-réseaux</a> pour plus d'aide sur ce paramètre, notamment pour des VLAN, lesquels sont supportés ou sur comment identifier le masque réseau et votre interface réseau. <br/> <br/> Une alternative à ces scanner sur le réseau et d'activer d'autres scanners d'appareils ou des importe, qui ne dépendent pas du fait de laisser NetAlert<sup>X</sup> accéder au réseau (Unifié, baux DHCP, Pi-hole, etc.).<br/><br/> Remarque : la durée du scan en lui-même dépend du nombre d'adresses IP à scanner, renseignez donc soigneusement avec le bon masque réseau et la bonne interface réseau.",
"SCAN_SUBNETS_name": "Réseaux à scanner", "SCAN_SUBNETS_name": "Réseaux à scanner",
@@ -617,7 +617,7 @@
"Setting_Override": "Remplacer la valeur", "Setting_Override": "Remplacer la valeur",
"Setting_Override_Description": "Activer cette option va remplacer la valeur fournie par défaut par une application par la valeur renseignée au-dessus.", "Setting_Override_Description": "Activer cette option va remplacer la valeur fournie par défaut par une application par la valeur renseignée au-dessus.",
"Settings_Metadata_Toggle": "Afficher/masquer les méta données pour le paramètre sélectionné.", "Settings_Metadata_Toggle": "Afficher/masquer les méta données pour le paramètre sélectionné.",
"Settings_Show_Description": "Montrer la description de la configuration.", "Settings_Show_Description": "Afficher la description",
"Settings_device_Scanners_desync": "⚠ La planification des différents scanners d'appareils est désynchronisée.", "Settings_device_Scanners_desync": "⚠ La planification des différents scanners d'appareils est désynchronisée.",
"Settings_device_Scanners_desync_popup": "La planification des scanners (<code>*_RUN_SCHD</code>) n'est pas identique entre scanners. Cela va entraîner des notifications en ligne/hors-ligne non cohérentes. À moins que cela soit attendu, utilisez la même planification pour tous les <b>🔍scanners d'appareils</b> activés.", "Settings_device_Scanners_desync_popup": "La planification des scanners (<code>*_RUN_SCHD</code>) n'est pas identique entre scanners. Cela va entraîner des notifications en ligne/hors-ligne non cohérentes. À moins que cela soit attendu, utilisez la même planification pour tous les <b>🔍scanners d'appareils</b> activés.",
"Speedtest_Results": "Résultats du test de débit", "Speedtest_Results": "Résultats du test de débit",
@@ -783,4 +783,4 @@
"settings_system_label": "Système", "settings_system_label": "Système",
"settings_update_item_warning": "Mettre à jour la valeur ci-dessous. Veillez à bien suivre le même format qu'auparavant. <b>Il n'y a pas de pas de contrôle.</b>", "settings_update_item_warning": "Mettre à jour la valeur ci-dessous. Veillez à bien suivre le même format qu'auparavant. <b>Il n'y a pas de pas de contrôle.</b>",
"test_event_tooltip": "Enregistrer d'abord vos modifications avant de tester vôtre paramétrage." "test_event_tooltip": "Enregistrer d'abord vos modifications avant de tester vôtre paramétrage."
} }

View File

@@ -300,7 +300,7 @@
"FieldLock_Error": "Errore durante l'aggiornamento dello stato di blocco del campo", "FieldLock_Error": "Errore durante l'aggiornamento dello stato di blocco del campo",
"FieldLock_Lock_Tooltip": "Blocca campo (impedisci sovrascrittura plugin)", "FieldLock_Lock_Tooltip": "Blocca campo (impedisci sovrascrittura plugin)",
"FieldLock_Locked": "Campo bloccato", "FieldLock_Locked": "Campo bloccato",
"FieldLock_SaveBeforeLocking": "", "FieldLock_SaveBeforeLocking": "Salva modifiche prima di bloccare",
"FieldLock_Source_Label": "Sorgente: ", "FieldLock_Source_Label": "Sorgente: ",
"FieldLock_Unlock_Tooltip": "Sblocca campo (consenti sovrascritture plugin)", "FieldLock_Unlock_Tooltip": "Sblocca campo (consenti sovrascritture plugin)",
"FieldLock_Unlocked": "Campo sbloccato", "FieldLock_Unlocked": "Campo sbloccato",
@@ -783,4 +783,4 @@
"settings_system_label": "Sistema", "settings_system_label": "Sistema",
"settings_update_item_warning": "Aggiorna il valore qui sotto. Fai attenzione a seguire il formato precedente. <b>La convalida non viene eseguita.</b>", "settings_update_item_warning": "Aggiorna il valore qui sotto. Fai attenzione a seguire il formato precedente. <b>La convalida non viene eseguita.</b>",
"test_event_tooltip": "Salva le modifiche prima di provare le nuove impostazioni." "test_event_tooltip": "Salva le modifiche prima di provare le nuove impostazioni."
} }

View File

@@ -300,7 +300,7 @@
"FieldLock_Error": "Помилка оновлення стану блокування поля", "FieldLock_Error": "Помилка оновлення стану блокування поля",
"FieldLock_Lock_Tooltip": "Заблокувати поле (запобігти перезапису плагіном)", "FieldLock_Lock_Tooltip": "Заблокувати поле (запобігти перезапису плагіном)",
"FieldLock_Locked": "Поле заблоковано", "FieldLock_Locked": "Поле заблоковано",
"FieldLock_SaveBeforeLocking": "", "FieldLock_SaveBeforeLocking": "Збережіть зміни перед блокуванням",
"FieldLock_Source_Label": "Джерело: ", "FieldLock_Source_Label": "Джерело: ",
"FieldLock_Unlock_Tooltip": "Поле розблокування (дозволити перезапис плагіна)", "FieldLock_Unlock_Tooltip": "Поле розблокування (дозволити перезапис плагіна)",
"FieldLock_Unlocked": "Поле розблоковано", "FieldLock_Unlocked": "Поле розблоковано",
@@ -783,4 +783,4 @@
"settings_system_label": "Система", "settings_system_label": "Система",
"settings_update_item_warning": "Оновіть значення нижче. Слідкуйте за попереднім форматом. <b>Перевірка не виконана.</b>", "settings_update_item_warning": "Оновіть значення нижче. Слідкуйте за попереднім форматом. <b>Перевірка не виконана.</b>",
"test_event_tooltip": "Перш ніж перевіряти налаштування, збережіть зміни." "test_event_tooltip": "Перш ніж перевіряти налаштування, збережіть зміни."
} }