mirror of
https://github.com/louislam/uptime-kuma.git
synced 2024-12-16 11:14:38 -05:00
Merge branch 'master' into public-dashboard
This commit is contained in:
commit
2ab06f87b8
@ -10,5 +10,6 @@ currently being supported with security updates.
|
||||
| 1.x.x | :white_check_mark: |
|
||||
|
||||
## Reporting a Vulnerability
|
||||
Please report security issues to uptime@kuma.pet.
|
||||
|
||||
https://github.com/louislam/uptime-kuma/issues
|
||||
Do not use the issue tracker or discuss it in the public as it will cause more damage.
|
||||
|
124
server/notification-providers/teams.js
Normal file
124
server/notification-providers/teams.js
Normal file
@ -0,0 +1,124 @@
|
||||
const NotificationProvider = require("./notification-provider");
|
||||
const axios = require("axios");
|
||||
const { DOWN, UP } = require("../../src/util");
|
||||
|
||||
class Teams extends NotificationProvider {
|
||||
name = "teams";
|
||||
|
||||
_statusMessageFactory = (status, monitorName) => {
|
||||
if (status === DOWN) {
|
||||
return `🔴 Application [${monitorName}] went down`;
|
||||
} else if (status === UP) {
|
||||
return `✅ Application [${monitorName}] is back online`;
|
||||
}
|
||||
return "Notification";
|
||||
};
|
||||
|
||||
_getThemeColor = (status) => {
|
||||
if (status === DOWN) {
|
||||
return "ff0000";
|
||||
}
|
||||
if (status === UP) {
|
||||
return "00e804";
|
||||
}
|
||||
return "008cff";
|
||||
};
|
||||
|
||||
_notificationPayloadFactory = ({
|
||||
status,
|
||||
monitorMessage,
|
||||
monitorName,
|
||||
monitorUrl,
|
||||
}) => {
|
||||
const notificationMessage = this._statusMessageFactory(
|
||||
status,
|
||||
monitorName
|
||||
);
|
||||
|
||||
const facts = [];
|
||||
|
||||
if (monitorName) {
|
||||
facts.push({
|
||||
name: "Monitor",
|
||||
value: monitorName,
|
||||
});
|
||||
}
|
||||
|
||||
if (monitorUrl) {
|
||||
facts.push({
|
||||
name: "URL",
|
||||
value: monitorUrl,
|
||||
});
|
||||
}
|
||||
|
||||
return {
|
||||
"@context": "https://schema.org/extensions",
|
||||
"@type": "MessageCard",
|
||||
themeColor: this._getThemeColor(status),
|
||||
summary: notificationMessage,
|
||||
sections: [
|
||||
{
|
||||
activityImage:
|
||||
"https://raw.githubusercontent.com/louislam/uptime-kuma/master/public/icon.png",
|
||||
activityTitle: "**Uptime Kuma**",
|
||||
},
|
||||
{
|
||||
activityTitle: notificationMessage,
|
||||
},
|
||||
{
|
||||
activityTitle: "**Description**",
|
||||
text: monitorMessage,
|
||||
facts,
|
||||
},
|
||||
],
|
||||
};
|
||||
};
|
||||
|
||||
_sendNotification = async (webhookUrl, payload) => {
|
||||
await axios.post(webhookUrl, payload);
|
||||
};
|
||||
|
||||
_handleGeneralNotification = (webhookUrl, msg) => {
|
||||
const payload = this._notificationPayloadFactory({
|
||||
monitorMessage: msg
|
||||
});
|
||||
|
||||
return this._sendNotification(webhookUrl, payload);
|
||||
};
|
||||
|
||||
async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
|
||||
let okMsg = "Sent Successfully. ";
|
||||
|
||||
try {
|
||||
if (heartbeatJSON == null) {
|
||||
await this._handleGeneralNotification(notification.webhookUrl, msg);
|
||||
return okMsg;
|
||||
}
|
||||
|
||||
let url;
|
||||
|
||||
if (monitorJSON["type"] === "port") {
|
||||
url = monitorJSON["hostname"];
|
||||
if (monitorJSON["port"]) {
|
||||
url += ":" + monitorJSON["port"];
|
||||
}
|
||||
} else {
|
||||
url = monitorJSON["url"];
|
||||
}
|
||||
|
||||
const payload = this._notificationPayloadFactory({
|
||||
monitorMessage: heartbeatJSON.msg,
|
||||
monitorName: monitorJSON.name,
|
||||
monitorUrl: url,
|
||||
status: heartbeatJSON.status,
|
||||
});
|
||||
|
||||
await this._sendNotification(notification.webhookUrl, payload);
|
||||
return okMsg;
|
||||
} catch (error) {
|
||||
this.throwGeneralAxiosError(error);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = Teams;
|
@ -13,6 +13,7 @@ const RocketChat = require("./notification-providers/rocket-chat");
|
||||
const Signal = require("./notification-providers/signal");
|
||||
const Slack = require("./notification-providers/slack");
|
||||
const SMTP = require("./notification-providers/smtp");
|
||||
const Teams = require("./notification-providers/teams");
|
||||
const Telegram = require("./notification-providers/telegram");
|
||||
const Webhook = require("./notification-providers/webhook");
|
||||
|
||||
@ -28,6 +29,7 @@ class Notification {
|
||||
const list = [
|
||||
new Apprise(),
|
||||
new Discord(),
|
||||
new Teams(),
|
||||
new Gotify(),
|
||||
new Line(),
|
||||
new LunaSea(),
|
||||
|
@ -17,6 +17,7 @@
|
||||
<option value="webhook">Webhook</option>
|
||||
<option value="smtp">{{ $t("Email") }} (SMTP)</option>
|
||||
<option value="discord">Discord</option>
|
||||
<option value="teams">Microsoft Teams</option>
|
||||
<option value="signal">Signal</option>
|
||||
<option value="gotify">Gotify</option>
|
||||
<option value="slack">Slack</option>
|
||||
@ -400,6 +401,8 @@
|
||||
|
||||
<!-- DEPRECATED! Please create vue component in "./src/components/notifications/{notification name}.vue" -->
|
||||
|
||||
<Teams v-if="notification.type === 'teams'" />
|
||||
|
||||
<div class="mb-3 mt-4">
|
||||
<hr class="dropdown-divider mb-4">
|
||||
|
||||
@ -449,6 +452,7 @@ import { ucfirst } from "../util.ts"
|
||||
import Confirm from "./Confirm.vue";
|
||||
import HiddenInput from "./HiddenInput.vue";
|
||||
import Telegram from "./notifications/Telegram.vue";
|
||||
import Teams from "./notifications/Teams.vue";
|
||||
import SMTP from "./notifications/SMTP.vue";
|
||||
|
||||
export default {
|
||||
@ -456,6 +460,7 @@ export default {
|
||||
Confirm,
|
||||
HiddenInput,
|
||||
Telegram,
|
||||
Teams,
|
||||
SMTP,
|
||||
},
|
||||
props: {},
|
||||
|
29
src/components/notifications/Teams.vue
Normal file
29
src/components/notifications/Teams.vue
Normal file
@ -0,0 +1,29 @@
|
||||
<template>
|
||||
<div class="mb-3">
|
||||
<label for="teams-webhookurl" class="form-label">Webhook URL</label>
|
||||
<input
|
||||
id="teams-webhookurl"
|
||||
v-model="$parent.notification.webhookUrl"
|
||||
type="text"
|
||||
class="form-control"
|
||||
required
|
||||
/>
|
||||
<div class="form-text">
|
||||
You can learn how to create a webhook url
|
||||
<a
|
||||
href="https://docs.microsoft.com/en-us/microsoftteams/platform/webhooks-and-connectors/how-to/add-incoming-webhook"
|
||||
target="_blank"
|
||||
>here</a>.
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
name: "teams",
|
||||
};
|
||||
},
|
||||
};
|
||||
</script>
|
@ -13,6 +13,7 @@ import pl from "./languages/pl";
|
||||
import ruRU from "./languages/ru-RU";
|
||||
import sr from "./languages/sr";
|
||||
import srLatn from "./languages/sr-latn";
|
||||
import trTR from "./languages/tr-TR";
|
||||
import svSE from "./languages/sv-SE";
|
||||
import zhCN from "./languages/zh-CN";
|
||||
import zhHK from "./languages/zh-HK";
|
||||
@ -30,6 +31,7 @@ const languageList = {
|
||||
"sr": sr,
|
||||
"sr-latn": srLatn,
|
||||
"sv-SE": svSE,
|
||||
"tr-TR": trTR,
|
||||
"ko-KR": koKR,
|
||||
"ru-RU": ruRU,
|
||||
"zh-CN": zhCN,
|
||||
|
@ -157,4 +157,5 @@ export default {
|
||||
Indigo: "Indigo",
|
||||
Purple: "Lila",
|
||||
Pink: "Pink",
|
||||
"Search...": "Suchen...",
|
||||
}
|
||||
|
@ -157,4 +157,5 @@ export default {
|
||||
Indigo: "Indigo",
|
||||
Purple: "Purple",
|
||||
Pink: "Pink",
|
||||
"Search...": "Search...",
|
||||
}
|
||||
|
@ -20,6 +20,10 @@ export default {
|
||||
clearEventsMsg: "Si è certi di voler eliminare tutti gli eventi per questo servizio?",
|
||||
clearHeartbeatsMsg: "Si è certi di voler eliminare tutti gli intervalli di controllo per questo servizio?",
|
||||
confirmClearStatisticsMsg: "Si è certi di voler eliminare TUTTE le statistiche?",
|
||||
twoFAVerifyLabel: "Scrivi il token per verificare che l'autenticazione a due fattori funzioni",
|
||||
tokenValidSettingsMsg: "Il token è valido! È ora possibile salvare le impostazioni.",
|
||||
confirmEnableTwoFAMsg: "Si è certi di voler abilitare l'autenticazione a due fattori?",
|
||||
confirmDisableTwoFAMsg: "Si è certi di voler disabilitare l'autenticazione a due fattori?",
|
||||
Settings: "Impostazioni",
|
||||
Dashboard: "Cruscotto",
|
||||
"New Update": "Nuovo Aggiornamento Disponibile",
|
||||
@ -117,7 +121,7 @@ export default {
|
||||
respTime: "Tempo di Risposta (ms)",
|
||||
notAvailableShort: "N/D",
|
||||
"Default enabled": "Abilitato di default",
|
||||
"Also apply to existing monitors": "Applica anche ai monitoraggi esistenti",
|
||||
"Apply on all existing monitors": "Applica su tutti i monitoraggi",
|
||||
Create: "Crea",
|
||||
"Clear Data": "Cancella dati",
|
||||
Events: "Eventi",
|
||||
@ -128,20 +132,30 @@ export default {
|
||||
backupDescription3: "Dati sensibili come i token di autenticazione saranno inclusi nel backup, tenere quindi in un luogo sicuro.",
|
||||
alertNoFile: "Selezionare il file da importare.",
|
||||
alertWrongFileType: "Selezionare un file JSON.",
|
||||
"Clear all statistics": "Pulisci tutte le statistiche",
|
||||
twoFAVerifyLabel: "Please type in your token to verify that 2FA is working",
|
||||
tokenValidSettingsMsg: "Token is valid! You can now save the 2FA settings.",
|
||||
confirmEnableTwoFAMsg: "Are you sure you want to enable 2FA?",
|
||||
confirmDisableTwoFAMsg: "Are you sure you want to disable 2FA?",
|
||||
"Apply on all existing monitors": "Apply on all existing monitors",
|
||||
"Verify Token": "Verify Token",
|
||||
"Setup 2FA": "Setup 2FA",
|
||||
"Enable 2FA": "Enable 2FA",
|
||||
"Disable 2FA": "Disable 2FA",
|
||||
"2FA Settings": "2FA Settings",
|
||||
"Two Factor Authentication": "Two Factor Authentication",
|
||||
Active: "Active",
|
||||
Inactive: "Inactive",
|
||||
"Verify Token": "Verifica Token",
|
||||
"Setup 2FA": "Imposta l'autenticazione a due fattori",
|
||||
"Enable 2FA": "Abilita l'autenticazione a due fattori",
|
||||
"Disable 2FA": "Disabilita l'autenticazione a due fattori",
|
||||
"2FA Settings": "Impostazioni autenticazione a due fattori",
|
||||
"Two Factor Authentication": "Autenticazione a due fattori",
|
||||
Active: "Attivata",
|
||||
Inactive: "Disattivata",
|
||||
Token: "Token",
|
||||
"Show URI": "Show URI",
|
||||
"Show URI": "Mostra URI",
|
||||
"Clear all statistics": "Pulisci tutte le statistiche",
|
||||
Tags: "Etichette",
|
||||
"Add New below or Select...": "Aggiungine una oppure scegli...",
|
||||
"Tag with this name already exist.": "Un'etichetta con questo nome già esiste.",
|
||||
"Tag with this value already exist.": "Un'etichetta con questo valore già esiste.",
|
||||
color: "colori",
|
||||
"value (optional)": "valore (opzionale)",
|
||||
Gray: "Grigio",
|
||||
Red: "Rosso",
|
||||
Orange: "Arancione",
|
||||
Green: "Verde",
|
||||
Blue: "Blu",
|
||||
Indigo: "Indigo",
|
||||
Purple: "Viola",
|
||||
Pink: "Rosa",
|
||||
"Search...": "Cerca...",
|
||||
}
|
||||
|
120
src/languages/tr-TR.js
Normal file
120
src/languages/tr-TR.js
Normal file
@ -0,0 +1,120 @@
|
||||
export default {
|
||||
languageName: "Türkçe",
|
||||
checkEverySecond: "{0} Saniyede bir kontrol et.",
|
||||
"Avg.": "Ortalama",
|
||||
retriesDescription: "Servisin kapalı olarak işaretlenmeden ve bir bildirim gönderilmeden önce maksimum yeniden deneme sayısı",
|
||||
ignoreTLSError: "HTTPS web siteleri için TLS/SSL hatasını yoksay",
|
||||
upsideDownModeDescription: "Servisin durumunu tersine çevirir. Servis çalışıyorsa kapalı olarak işaretler.",
|
||||
maxRedirectDescription: "İzlenecek maksimum yönlendirme sayısı. Yönlendirmeleri devre dışı bırakmak için 0'a ayarlayın.",
|
||||
acceptedStatusCodesDescription: "Servisin çalıştığını hangi durum kodları belirlesin?",
|
||||
passwordNotMatchMsg: "Şifre eşleşmiyor.",
|
||||
notificationDescription: "Servislerin bildirim gönderebilmesi için bir bildirim yöntemi belirleyin.",
|
||||
keywordDescription: "Anahtar kelimeyi düz html veya JSON yanıtında arayın ve büyük/küçük harfe duyarlıdır",
|
||||
pauseDashboardHome: "Durdur",
|
||||
deleteMonitorMsg: "Servisi silmek istediğinden emin misin?",
|
||||
deleteNotificationMsg: "Bu bildirimi tüm servisler için silmek istediğinden emin misin?",
|
||||
resoverserverDescription: "Cloudflare varsayılan sunucudur, çözümleyici sunucusunu istediğiniz zaman değiştirebilirsiniz.",
|
||||
rrtypeDescription: "İzlemek istediğiniz servisin RR-Tipini seçin",
|
||||
pauseMonitorMsg: "Durdurmak istediğinden emin misin?",
|
||||
clearEventsMsg: "Bu servisin bütün kayıtlarını silmek istediğinden emin misin?",
|
||||
clearHeartbeatsMsg: "Bu servis için tüm sağlık durumunu silmek istediğinden emin misin?",
|
||||
confirmClearStatisticsMsg: "Tüm istatistikleri silmek istediğinden emin misin?",
|
||||
Settings: "Ayarlar",
|
||||
Dashboard: "Panel",
|
||||
"New Update": "Yeni Güncelleme",
|
||||
Language: "Dil",
|
||||
Appearance: "Görünüm",
|
||||
Theme: "Tema",
|
||||
General: "Genel",
|
||||
Version: "Versiyon",
|
||||
"Check Update On GitHub": "GitHub'da Güncellemeyi Kontrol Edin",
|
||||
List: "Liste",
|
||||
Add: "Ekle",
|
||||
"Add New Monitor": "Yeni Servis Ekle",
|
||||
"Quick Stats": "Servis istatistikleri",
|
||||
Up: "Normal",
|
||||
Down: "Hatalı",
|
||||
Pending: "Bekliyor",
|
||||
Unknown: "Bilinmeyen",
|
||||
Pause: "Durdur",
|
||||
Name: "Servis ismi",
|
||||
Status: "Durum",
|
||||
DateTime: "Zaman",
|
||||
Message: "Mesaj",
|
||||
"No important events": "Önemli olay yok",
|
||||
Resume: "Devam et",
|
||||
Edit: "Düzenle",
|
||||
Delete: "Sil",
|
||||
Current: "Şu anda",
|
||||
Uptime: "Çalışma zamanı",
|
||||
"Cert Exp.": "Sertifika Süresi",
|
||||
days: "günler",
|
||||
day: "gün",
|
||||
"-day": "-gün",
|
||||
hour: "saat",
|
||||
"-hour": "-saat",
|
||||
Response: "Cevap Süresi",
|
||||
Ping: "Ping",
|
||||
"Monitor Type": "Servis Tipi",
|
||||
Keyword: "Anahtar Kelime",
|
||||
"Friendly Name": "Panelde görünecek isim",
|
||||
URL: "URL",
|
||||
Hostname: "IP Adresi",
|
||||
Port: "Port",
|
||||
"Heartbeat Interval": "Servis Test Aralığı",
|
||||
Retries: "Yeniden deneme",
|
||||
Advanced: "Gelişmiş",
|
||||
"Upside Down Mode": "Ters/Düz Modu",
|
||||
"Max. Redirects": "Maksimum Yönlendirme",
|
||||
"Accepted Status Codes": "Kabul Edilen Durum Kodları",
|
||||
Save: "Kaydet",
|
||||
Notifications: "Bildirimler",
|
||||
"Not available, please setup.": "Atanmış bildirim yöntemi yok. Ayarlardan belirleyebilirsiniz.",
|
||||
"Setup Notification": "Bildirim yöntemi kur",
|
||||
Light: "Açık",
|
||||
Dark: "Koyu",
|
||||
Auto: "Oto",
|
||||
"Theme - Heartbeat Bar": "Servis Bar Konumu",
|
||||
Normal: "Normal",
|
||||
Bottom: "Aşağıda",
|
||||
None: "Gösterme",
|
||||
Timezone: "Zaman Dilimi",
|
||||
"Search Engine Visibility": "Arama Motoru Görünürlüğü",
|
||||
"Allow indexing": "İndekslemeye izin ver",
|
||||
"Discourage search engines from indexing site": "İndekslemeyi reddet",
|
||||
"Change Password": "Şifre Değiştir",
|
||||
"Current Password": "Şuan ki Şifre",
|
||||
"New Password": "Yeni Şifre",
|
||||
"Repeat New Password": "Yeni Şifreyi Tekrar Girin",
|
||||
"Update Password": "Şifreyi Değiştir",
|
||||
"Disable Auth": "Şifreli girişi iptal et.",
|
||||
"Enable Auth": "Şifreli girişi aktif et.",
|
||||
Logout: "Çıkış yap",
|
||||
Leave: "Ayrıl",
|
||||
"I understand, please disable": "Evet farkındayım, iptal et",
|
||||
Confirm: "Onayla",
|
||||
Yes: "Evet",
|
||||
No: "Hayır",
|
||||
Username: "Kullanıcı Adı",
|
||||
Password: "Şifre",
|
||||
"Remember me": "Beni Hatırla",
|
||||
Login: "Giriş yap",
|
||||
"No Monitors, please": "Servis yok, lütfen",
|
||||
"add one": "bir servis ekleyin",
|
||||
"Notification Type": "Bildirim Yöntemi",
|
||||
Email: "E-mail",
|
||||
Test: "Test",
|
||||
"Certificate Info": "Sertifika Bilgisi",
|
||||
"Resolver Server": "Çözümleyici Sunucu",
|
||||
"Resource Record Type": "Kaynak Kayıt Türü",
|
||||
"Last Result": "En son sonuçlar",
|
||||
"Create your admin account": "Yönetici hesabınızı oluşturun",
|
||||
"Repeat Password": "Şifrenizi tekrar girin",
|
||||
respTime: "Cevap Süresi (ms)",
|
||||
notAvailableShort: "N/A",
|
||||
Create: "Yarat",
|
||||
"Clear Data": "Verileri Temizle",
|
||||
Events: "Olaylar",
|
||||
Heartbeats: "Sağlık Durumları",
|
||||
"Auto Get": "Otomatik Al"
|
||||
}
|
@ -232,6 +232,12 @@
|
||||
<p>Molim Vas koristite ovo sa pažnjom.</p>
|
||||
</template>
|
||||
|
||||
<template v-else-if="$i18n.locale === 'tr-TR' ">
|
||||
<p><strong>Şifreli girişi devre dışı bırakmak istediğinizden</strong>emin misiniz?</p>
|
||||
<p>Bu, Uptime Kuma'nın önünde Cloudflare Access gibi <strong>üçüncü taraf yetkilendirmesi olan</strong> kişiler içindir.</p>
|
||||
<p>Lütfen dikkatli kullanın.</p>
|
||||
</template>
|
||||
|
||||
<template v-else-if="$i18n.locale === 'ko-KR' ">
|
||||
<p>정말로 <strong>인증 기능을 끌까요</strong>?</p>
|
||||
<p>이 기능은 <strong>Cloudflare Access와 같은 서드파티 인증</strong>을 Uptime Kuma 앞에 둔 사용자를 위한 기능이에요.</p>
|
||||
|
Loading…
Reference in New Issue
Block a user