Skip to content

Commit 2040fe3

Browse files
author
muhammad-asn
committed
initial commit
0 parents  commit 2040fe3

File tree

12 files changed

+235
-0
lines changed

12 files changed

+235
-0
lines changed

.dockerignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
venv
2+
__pycache__

.env.docker.example

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
TELEGRAM_CHANNEL_ID=-10xxxx
2+
TELEGRAM_BOT_TOKEN=1999xxxx5:AAGxxxxxx
3+
TELEGRAM_TOPIC_ID=1

.env.example

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export TELEGRAM_CHANNEL_ID=-10xxxx
2+
export TELEGRAM_BOT_TOKEN=1999xxxx5:AAGxxxxxx
3+
export TELEGRAM_TOPIC_ID=1

.gitignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
.env
2+
.env.docker
3+
__pycache__
4+
venv

Dockerfile

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
FROM python:3.10
2+
3+
RUN mkdir /app
4+
5+
WORKDIR /app
6+
7+
COPY requirements.txt /app
8+
9+
RUN pip install -r requirements.txt
10+
11+
COPY . /app
12+
13+
EXPOSE 8000
14+
15+
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
16+

README.md

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
## KubeWatch Webhook for Telegram
2+
3+
Kubewatch: https://github.com/robusta-dev/kubewatch
4+
5+
## Notes
6+
This kubewatch is reduced only for **Created** and **Deleted** resource
7+
8+
### Prerequisites
9+
1. Docker
10+
2. Python >=3.10
11+
12+
13+
### How to run
14+
15+
1. Build the docker image
16+
```bash
17+
$ docker build -t kubewatch-telegram-webhook .
18+
```
19+
2. Set the Telegram environment variable, save as file called `.env.docker`
20+
```bash
21+
TELEGRAM_CHANNEL_ID=-10xxxx
22+
TELEGRAM_BOT_TOKEN=1999xxxx5:AAGxxxxxx
23+
TELEGRAM_TOPIC_ID=1
24+
```
25+
3. Run the docker compose
26+
This will run on port 8000
27+
```bash
28+
$ docker compose up -d
29+
30+
$ docker ps
31+
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
32+
e081d433cc3f 4a60b6e1a206 "uvicorn main:app --…" 8 minutes ago Up 8 minutes 0.0.0.0:8000->8000/tcp, :::8000->8000/tcp kubewatch-telegram-webhook-kubewatch-telegram-webhook-1
33+
```
34+
4. Setup https (self-signed, ngrok, etc)
35+
```bash
36+
$ ngrok http 8000
37+
```
38+
5. Set the kubewatch config, for this example we use Helm (deployed on Kubernetes)
39+
```yaml
40+
namespace: ""
41+
rbac:
42+
create: true
43+
slack:
44+
enabled: false
45+
webhook:
46+
enabled: true
47+
url: "https://9e7c-2001-df0-9e00-00-1321-64-119.ngrok-free.app/webhook-telegram"
48+
tlsskip: true
49+
resourcesToWatch:
50+
deployment: true
51+
replicationcontroller: false
52+
replicaset: false
53+
daemonset: true
54+
services: true
55+
pod: true
56+
job: true
57+
persistentvolume: true
58+
namespace: true
59+
secret: true
60+
ingress: true
61+
event: false
62+
```
63+
64+
65+
### Screenshot
66+
![screenshot](assets/telegram-screenshot.png)

assets/telegram-screenshot.png

375 KB
Loading

docker-compose.yml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
services:
2+
kubewatch-telegram-webhook:
3+
image: kubewatch-telegram-webhook
4+
ports:
5+
- "8000:8000"
6+
env_file:
7+
- .env
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
namespace: ""
2+
rbac:
3+
create: true
4+
slack:
5+
enabled: false
6+
webhook:
7+
enabled: true
8+
url: "https://9e7c-2001-df0-9e00-00-1321-64-119.ngrok-free.app/webhook-telegram"
9+
tlsskip: true
10+
resourcesToWatch:
11+
deployment: true
12+
replicationcontroller: false
13+
replicaset: false
14+
daemonset: true
15+
services: true
16+
pod: true
17+
job: true
18+
persistentvolume: true
19+
namespace: true
20+
secret: true
21+
ingress: true
22+
event: false

handlers/telegram.py

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
import os
2+
import requests
3+
import json
4+
5+
TELEGRAM_BOT_TOKEN = os.getenv("TELEGRAM_BOT_TOKEN")
6+
TELEGRAM_CHAT_ID = os.getenv("TELEGRAM_CHAT_ID")
7+
TELEGRAM_TOPIC_ID = os.getenv("TELEGRAM_TOPIC_ID")
8+
TELEGRAM_URL = "https://api.telegram.org"
9+
10+
if not (TELEGRAM_BOT_TOKEN and TELEGRAM_CHAT_ID and TELEGRAM_TOPIC_ID):
11+
raise EnvironmentError("The Telegram environment variables are not set.")
12+
13+
14+
class Telegram:
15+
def __init__(self):
16+
self.telegram_bot_token = TELEGRAM_BOT_TOKEN
17+
self.telegram_chat_id = TELEGRAM_CHAT_ID
18+
self.telegram_topic_id = TELEGRAM_TOPIC_ID
19+
20+
def send_message(self, message):
21+
msg = ""
22+
try:
23+
if message.eventmeta.reason == "Created":
24+
msg = f"""
25+
"✅ *Info: Resource Created* ✅"
26+
*Name:* {message.eventmeta.name}
27+
*Namespace:* {message.eventmeta.namespace}
28+
*Reason:* {message.eventmeta.reason}
29+
*Message:* {message.text}
30+
"""
31+
32+
elif message.eventmeta.reason == "Deleted":
33+
msg = f"""
34+
🚨 *Alert: Resource Deleted* 🚨
35+
*Name:* {message.eventmeta.name}
36+
*Namespace:* {message.eventmeta.namespace}
37+
*Reason:* {message.eventmeta.reason}
38+
*Message:* {message.text}
39+
"""
40+
41+
data = {
42+
"chat_id": self.telegram_chat_id,
43+
"text": msg,
44+
"message_thread_id": self.telegram_topic_id,
45+
"parse_mode": "Markdown",
46+
}
47+
headers = {"Content-Type": "application/json"}
48+
requests.post(
49+
f"{TELEGRAM_URL}/bot{TELEGRAM_BOT_TOKEN}/sendMessage",
50+
headers=headers,
51+
data=json.dumps(data),
52+
)
53+
54+
except Exception as e:
55+
print(f"Error sending message: {e}")

0 commit comments

Comments
 (0)