monitorify 1.0.2__tar.gz → 1.0.3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- monitorify-1.0.3/PKG-INFO +142 -0
- monitorify-1.0.3/README.md +130 -0
- {monitorify-1.0.2 → monitorify-1.0.3}/pyproject.toml +1 -1
- {monitorify-1.0.2 → monitorify-1.0.3}/src/monitorify/__init__.py +1 -1
- {monitorify-1.0.2 → monitorify-1.0.3}/src/monitorify/ui/tui/css/tui.css +18 -0
- {monitorify-1.0.2 → monitorify-1.0.3}/src/monitorify/ui/tui/tui.py +8 -0
- {monitorify-1.0.2 → monitorify-1.0.3}/src/monitorify/ui/tui/widgets/programmListWidget.py +75 -7
- monitorify-1.0.3/src/monitorify.egg-info/PKG-INFO +142 -0
- monitorify-1.0.2/PKG-INFO +0 -62
- monitorify-1.0.2/README.md +0 -50
- monitorify-1.0.2/src/monitorify.egg-info/PKG-INFO +0 -62
- {monitorify-1.0.2 → monitorify-1.0.3}/setup.cfg +0 -0
- {monitorify-1.0.2 → monitorify-1.0.3}/src/monitorify/__main__.py +0 -0
- {monitorify-1.0.2 → monitorify-1.0.3}/src/monitorify/collector/__init__.py +0 -0
- {monitorify-1.0.2 → monitorify-1.0.3}/src/monitorify/collector/manager.py +0 -0
- {monitorify-1.0.2 → monitorify-1.0.3}/src/monitorify/collector/schema.py +0 -0
- {monitorify-1.0.2 → monitorify-1.0.3}/src/monitorify/collector/worker.py +0 -0
- {monitorify-1.0.2 → monitorify-1.0.3}/src/monitorify/config/__init__.py +0 -0
- {monitorify-1.0.2 → monitorify-1.0.3}/src/monitorify/config/configManager.py +0 -0
- {monitorify-1.0.2 → monitorify-1.0.3}/src/monitorify/config.py +0 -0
- {monitorify-1.0.2 → monitorify-1.0.3}/src/monitorify/config_manager.py +0 -0
- {monitorify-1.0.2 → monitorify-1.0.3}/src/monitorify/daemon.py +0 -0
- {monitorify-1.0.2 → monitorify-1.0.3}/src/monitorify/main.py +0 -0
- {monitorify-1.0.2 → monitorify-1.0.3}/src/monitorify/remote/__init__.py +0 -0
- {monitorify-1.0.2 → monitorify-1.0.3}/src/monitorify/remote/connector.py +0 -0
- {monitorify-1.0.2 → monitorify-1.0.3}/src/monitorify/stats/DiskStats.py +0 -0
- {monitorify-1.0.2 → monitorify-1.0.3}/src/monitorify/stats/__init__.py +0 -0
- {monitorify-1.0.2 → monitorify-1.0.3}/src/monitorify/stats/cpuStats.py +0 -0
- {monitorify-1.0.2 → monitorify-1.0.3}/src/monitorify/stats/networkStats.py +0 -0
- {monitorify-1.0.2 → monitorify-1.0.3}/src/monitorify/stats/programmList.py +0 -0
- {monitorify-1.0.2 → monitorify-1.0.3}/src/monitorify/stats/ramStats.py +0 -0
- {monitorify-1.0.2 → monitorify-1.0.3}/src/monitorify/storage/__init__.py +0 -0
- {monitorify-1.0.2 → monitorify-1.0.3}/src/monitorify/storage/db.py +0 -0
- {monitorify-1.0.2 → monitorify-1.0.3}/src/monitorify/ui/__init__.py +0 -0
- {monitorify-1.0.2 → monitorify-1.0.3}/src/monitorify/ui/tui/__init__.py +0 -0
- {monitorify-1.0.2 → monitorify-1.0.3}/src/monitorify/ui/tui/components/menu.py +0 -0
- {monitorify-1.0.2 → monitorify-1.0.3}/src/monitorify/ui/tui/components/widgetManager.py +0 -0
- {monitorify-1.0.2 → monitorify-1.0.3}/src/monitorify/ui/tui/widgets/__init__.py +0 -0
- {monitorify-1.0.2 → monitorify-1.0.3}/src/monitorify/ui/tui/widgets/brailleGraph.py +0 -0
- {monitorify-1.0.2 → monitorify-1.0.3}/src/monitorify/ui/tui/widgets/cpuWidget.py +0 -0
- {monitorify-1.0.2 → monitorify-1.0.3}/src/monitorify/ui/tui/widgets/diskWidget.py +0 -0
- {monitorify-1.0.2 → monitorify-1.0.3}/src/monitorify/ui/tui/widgets/networkWidget.py +0 -0
- {monitorify-1.0.2 → monitorify-1.0.3}/src/monitorify/ui/tui/widgets/procInfoWidget.py +0 -0
- {monitorify-1.0.2 → monitorify-1.0.3}/src/monitorify/ui/tui/widgets/ramWidget.py +0 -0
- {monitorify-1.0.2 → monitorify-1.0.3}/src/monitorify/ui/tui/widgets/statusWidget.py +0 -0
- {monitorify-1.0.2 → monitorify-1.0.3}/src/monitorify.egg-info/SOURCES.txt +0 -0
- {monitorify-1.0.2 → monitorify-1.0.3}/src/monitorify.egg-info/dependency_links.txt +0 -0
- {monitorify-1.0.2 → monitorify-1.0.3}/src/monitorify.egg-info/entry_points.txt +0 -0
- {monitorify-1.0.2 → monitorify-1.0.3}/src/monitorify.egg-info/requires.txt +0 -0
- {monitorify-1.0.2 → monitorify-1.0.3}/src/monitorify.egg-info/top_level.txt +0 -0
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: monitorify
|
|
3
|
+
Version: 1.0.3
|
|
4
|
+
Summary: A lightweight Linux terminal system monitor built with Textual
|
|
5
|
+
Author: Leon
|
|
6
|
+
License: MIT
|
|
7
|
+
Requires-Python: >=3.10
|
|
8
|
+
Description-Content-Type: text/markdown
|
|
9
|
+
Requires-Dist: textual>=0.80.0
|
|
10
|
+
Requires-Dist: platformdirs>=4.0.0
|
|
11
|
+
Requires-Dist: rich>=13.0.0
|
|
12
|
+
|
|
13
|
+
# Monitorify
|
|
14
|
+
### A terminal montioring tool for linux
|
|
15
|
+
|
|
16
|
+
- Features
|
|
17
|
+
- CPU monitoring
|
|
18
|
+
- RAM monitoring
|
|
19
|
+
- Network monitoring
|
|
20
|
+
- Disk monitoring (I/O and storage capacity)
|
|
21
|
+
- Process monitoring
|
|
22
|
+
- Background daemon
|
|
23
|
+
- Customization menu (toggle widgets, set intervals, and change history window)
|
|
24
|
+
- Historical graphs
|
|
25
|
+
|
|
26
|
+
## Requirements
|
|
27
|
+
|
|
28
|
+
* **Python:** 3.10+
|
|
29
|
+
* **OS:** Linux (relies on `/proc` and `/sys` filesystems)
|
|
30
|
+
* **Terminal:** Minimum 80 columns × 24 lines recommended
|
|
31
|
+
|
|
32
|
+
## Installation
|
|
33
|
+
### Using pipx
|
|
34
|
+
```bash
|
|
35
|
+
pipx install git+https://github.com/leonst036/Monitorify.git
|
|
36
|
+
```
|
|
37
|
+
Or from PyPI:
|
|
38
|
+
```bash
|
|
39
|
+
pipx install monitorify
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### Using pip
|
|
43
|
+
```bash
|
|
44
|
+
pip install git+https://github.com/leonst036/Monitorify.git
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### Using source
|
|
48
|
+
```bash
|
|
49
|
+
git clone https://github.com/leonst036/Monitorify.git
|
|
50
|
+
cd Monitorify
|
|
51
|
+
pip install .
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## Usage
|
|
55
|
+
```bash
|
|
56
|
+
monitorify
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## Background Daemon
|
|
60
|
+
|
|
61
|
+
The daemon collects metrics continuously to SQLite, even when the dashboard is closed.
|
|
62
|
+
|
|
63
|
+
### Manually (foreground)
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
monitorify-daemon
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### Always-On via systemd --user
|
|
70
|
+
|
|
71
|
+
Create the service file at `~/.config/systemd/user/monitorify.service`:
|
|
72
|
+
|
|
73
|
+
```ini
|
|
74
|
+
[Unit]
|
|
75
|
+
Description=Monitorify Metrics Collector Daemon
|
|
76
|
+
|
|
77
|
+
[Service]
|
|
78
|
+
ExecStart=%h/.local/bin/monitorify-daemon
|
|
79
|
+
Restart=always
|
|
80
|
+
|
|
81
|
+
[Install]
|
|
82
|
+
WantedBy=default.target
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
Enable and start it:
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
systemctl --user daemon-reload
|
|
89
|
+
systemctl --user enable --now monitorify
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
Check status or logs:
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
systemctl --user status monitorify
|
|
96
|
+
journalctl --user -u monitorify -f
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
Stop or disable:
|
|
100
|
+
|
|
101
|
+
```bash
|
|
102
|
+
systemctl --user stop monitorify
|
|
103
|
+
systemctl --user disable monitorify
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
## File Locations
|
|
107
|
+
|
|
108
|
+
Monitorify follows XDG Base Directory conventions — nothing is written to the install directory.
|
|
109
|
+
|
|
110
|
+
| Purpose | Default Path | Override |
|
|
111
|
+
|---|---|---|
|
|
112
|
+
| **Database** | `~/.local/share/monitorify/monitorify.db` | `MONITORIFY_DB_PATH` env var |
|
|
113
|
+
| **Daemon PID** | `/run/user/<uid>/monitorify/daemon.pid` | `MONITORIFY_PID_PATH` env var |
|
|
114
|
+
| **Collection interval** | `1.0` seconds | `MONITORIFY_INTERVAL` env var |
|
|
115
|
+
| **Data retention** | `604800` s (7 days) | `MONITORIFY_RETENTION` env var |
|
|
116
|
+
|
|
117
|
+
## Remote
|
|
118
|
+
|
|
119
|
+
To use Monitorify remotely over SSH on your server, you can set the following parameters:
|
|
120
|
+
|
|
121
|
+
- `--ip` – Set the target IP address.
|
|
122
|
+
- `--port` – Set the SSH port.
|
|
123
|
+
- `--username` – Set the username for the remote host.
|
|
124
|
+
- `--password` – Set the password for the SSH server.
|
|
125
|
+
- `--key_filename` – Set the path to an SSH key *(optional)*.
|
|
126
|
+
|
|
127
|
+
## Tech Stack
|
|
128
|
+
|
|
129
|
+
* **Language & TUI:** Python, Textual
|
|
130
|
+
* **Database:** SQLite
|
|
131
|
+
* **Target OS:** Linux
|
|
132
|
+
|
|
133
|
+
## Uninstalling
|
|
134
|
+
|
|
135
|
+
```bash
|
|
136
|
+
# If installed via pipx
|
|
137
|
+
pipx uninstall monitorify
|
|
138
|
+
|
|
139
|
+
# Remove stored data
|
|
140
|
+
rm -rf ~/.local/share/monitorify
|
|
141
|
+
rm -rf /run/user/$(id -u)/monitorify
|
|
142
|
+
```
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
# Monitorify
|
|
2
|
+
### A terminal montioring tool for linux
|
|
3
|
+
|
|
4
|
+
- Features
|
|
5
|
+
- CPU monitoring
|
|
6
|
+
- RAM monitoring
|
|
7
|
+
- Network monitoring
|
|
8
|
+
- Disk monitoring (I/O and storage capacity)
|
|
9
|
+
- Process monitoring
|
|
10
|
+
- Background daemon
|
|
11
|
+
- Customization menu (toggle widgets, set intervals, and change history window)
|
|
12
|
+
- Historical graphs
|
|
13
|
+
|
|
14
|
+
## Requirements
|
|
15
|
+
|
|
16
|
+
* **Python:** 3.10+
|
|
17
|
+
* **OS:** Linux (relies on `/proc` and `/sys` filesystems)
|
|
18
|
+
* **Terminal:** Minimum 80 columns × 24 lines recommended
|
|
19
|
+
|
|
20
|
+
## Installation
|
|
21
|
+
### Using pipx
|
|
22
|
+
```bash
|
|
23
|
+
pipx install git+https://github.com/leonst036/Monitorify.git
|
|
24
|
+
```
|
|
25
|
+
Or from PyPI:
|
|
26
|
+
```bash
|
|
27
|
+
pipx install monitorify
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
### Using pip
|
|
31
|
+
```bash
|
|
32
|
+
pip install git+https://github.com/leonst036/Monitorify.git
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
### Using source
|
|
36
|
+
```bash
|
|
37
|
+
git clone https://github.com/leonst036/Monitorify.git
|
|
38
|
+
cd Monitorify
|
|
39
|
+
pip install .
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## Usage
|
|
43
|
+
```bash
|
|
44
|
+
monitorify
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## Background Daemon
|
|
48
|
+
|
|
49
|
+
The daemon collects metrics continuously to SQLite, even when the dashboard is closed.
|
|
50
|
+
|
|
51
|
+
### Manually (foreground)
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
monitorify-daemon
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### Always-On via systemd --user
|
|
58
|
+
|
|
59
|
+
Create the service file at `~/.config/systemd/user/monitorify.service`:
|
|
60
|
+
|
|
61
|
+
```ini
|
|
62
|
+
[Unit]
|
|
63
|
+
Description=Monitorify Metrics Collector Daemon
|
|
64
|
+
|
|
65
|
+
[Service]
|
|
66
|
+
ExecStart=%h/.local/bin/monitorify-daemon
|
|
67
|
+
Restart=always
|
|
68
|
+
|
|
69
|
+
[Install]
|
|
70
|
+
WantedBy=default.target
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
Enable and start it:
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
systemctl --user daemon-reload
|
|
77
|
+
systemctl --user enable --now monitorify
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
Check status or logs:
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
systemctl --user status monitorify
|
|
84
|
+
journalctl --user -u monitorify -f
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
Stop or disable:
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
systemctl --user stop monitorify
|
|
91
|
+
systemctl --user disable monitorify
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
## File Locations
|
|
95
|
+
|
|
96
|
+
Monitorify follows XDG Base Directory conventions — nothing is written to the install directory.
|
|
97
|
+
|
|
98
|
+
| Purpose | Default Path | Override |
|
|
99
|
+
|---|---|---|
|
|
100
|
+
| **Database** | `~/.local/share/monitorify/monitorify.db` | `MONITORIFY_DB_PATH` env var |
|
|
101
|
+
| **Daemon PID** | `/run/user/<uid>/monitorify/daemon.pid` | `MONITORIFY_PID_PATH` env var |
|
|
102
|
+
| **Collection interval** | `1.0` seconds | `MONITORIFY_INTERVAL` env var |
|
|
103
|
+
| **Data retention** | `604800` s (7 days) | `MONITORIFY_RETENTION` env var |
|
|
104
|
+
|
|
105
|
+
## Remote
|
|
106
|
+
|
|
107
|
+
To use Monitorify remotely over SSH on your server, you can set the following parameters:
|
|
108
|
+
|
|
109
|
+
- `--ip` – Set the target IP address.
|
|
110
|
+
- `--port` – Set the SSH port.
|
|
111
|
+
- `--username` – Set the username for the remote host.
|
|
112
|
+
- `--password` – Set the password for the SSH server.
|
|
113
|
+
- `--key_filename` – Set the path to an SSH key *(optional)*.
|
|
114
|
+
|
|
115
|
+
## Tech Stack
|
|
116
|
+
|
|
117
|
+
* **Language & TUI:** Python, Textual
|
|
118
|
+
* **Database:** SQLite
|
|
119
|
+
* **Target OS:** Linux
|
|
120
|
+
|
|
121
|
+
## Uninstalling
|
|
122
|
+
|
|
123
|
+
```bash
|
|
124
|
+
# If installed via pipx
|
|
125
|
+
pipx uninstall monitorify
|
|
126
|
+
|
|
127
|
+
# Remove stored data
|
|
128
|
+
rm -rf ~/.local/share/monitorify
|
|
129
|
+
rm -rf /run/user/$(id -u)/monitorify
|
|
130
|
+
```
|
|
@@ -62,6 +62,24 @@ ProgrammListWidget>Static {
|
|
|
62
62
|
color: #61afef;
|
|
63
63
|
}
|
|
64
64
|
|
|
65
|
+
#programm_list_view ListItem.selected,
|
|
66
|
+
.programm_list_view ListItem.selected {
|
|
67
|
+
background: #284263;
|
|
68
|
+
text-style: bold;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
#programm_list_view ListItem.selected:hover,
|
|
72
|
+
.programm_list_view ListItem.selected:hover {
|
|
73
|
+
background: #32537d;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
#programm_list_view ListItem.selected.--highlight,
|
|
77
|
+
.programm_list_view ListItem.selected.--highlight {
|
|
78
|
+
background: #3d6699;
|
|
79
|
+
color: #ffffff;
|
|
80
|
+
text-style: bold;
|
|
81
|
+
}
|
|
82
|
+
|
|
65
83
|
#network_graph,
|
|
66
84
|
#disk_graph {
|
|
67
85
|
width: 1fr;
|
|
@@ -7,6 +7,7 @@ from textual.app import App, ComposeResult
|
|
|
7
7
|
# pyrefly: ignore [missing-import]
|
|
8
8
|
from textual.widgets import Header, Footer, Label
|
|
9
9
|
from textual.containers import Container, Center, Middle
|
|
10
|
+
from textual.events import Click
|
|
10
11
|
from monitorify.ui.tui.widgets.cpuWidget import CpuWidget
|
|
11
12
|
from monitorify.ui.tui.widgets.ramWidget import RamWidget
|
|
12
13
|
from monitorify.ui.tui.widgets.networkWidget import NetworkWidget
|
|
@@ -200,6 +201,13 @@ class MonitorifyApp(App):
|
|
|
200
201
|
except Exception:
|
|
201
202
|
pass
|
|
202
203
|
|
|
204
|
+
def on_click(self, event: Click) -> None:
|
|
205
|
+
try:
|
|
206
|
+
programm_widget = self.query_one(ProgrammListWidget)
|
|
207
|
+
programm_widget.handle_global_click(event)
|
|
208
|
+
except Exception:
|
|
209
|
+
pass
|
|
210
|
+
|
|
203
211
|
def on_unmount(self) -> None:
|
|
204
212
|
self.db.disconnect()
|
|
205
213
|
|
|
@@ -73,21 +73,20 @@ class ProgrammListWidget(Container):
|
|
|
73
73
|
|
|
74
74
|
@on(ListView.Selected)
|
|
75
75
|
def on_list_view_selected(self, event: ListView.Selected) -> None:
|
|
76
|
-
idx = self.list_view.index
|
|
76
|
+
idx = event.index if getattr(event, "index", None) is not None else self.list_view.index
|
|
77
77
|
if idx is not None and 0 <= idx < len(self.current_sorted_data):
|
|
78
78
|
d = self.current_sorted_data[idx]
|
|
79
79
|
pid = d.get("pid")
|
|
80
80
|
if pid is not None:
|
|
81
|
-
|
|
82
|
-
self.active_info_pid = None
|
|
83
|
-
else:
|
|
84
|
-
self.active_info_pid = pid
|
|
81
|
+
self.active_info_pid = pid
|
|
85
82
|
self.update_details()
|
|
86
83
|
|
|
87
84
|
@on(ListView.Highlighted)
|
|
88
85
|
def on_list_view_highlighted(self, event: ListView.Highlighted) -> None:
|
|
89
86
|
if self.active_info_pid is not None:
|
|
90
|
-
idx =
|
|
87
|
+
idx = getattr(event, "item_index", None)
|
|
88
|
+
if idx is None:
|
|
89
|
+
idx = self.list_view.index
|
|
91
90
|
if idx is not None and 0 <= idx < len(self.current_sorted_data):
|
|
92
91
|
d = self.current_sorted_data[idx]
|
|
93
92
|
pid = d.get("pid")
|
|
@@ -95,10 +94,69 @@ class ProgrammListWidget(Container):
|
|
|
95
94
|
self.active_info_pid = pid
|
|
96
95
|
self.update_details()
|
|
97
96
|
|
|
97
|
+
def is_child_of_proc_info_box(self, widget) -> bool:
|
|
98
|
+
curr = widget
|
|
99
|
+
while curr:
|
|
100
|
+
if curr is getattr(self, "proc_info_box", None) or getattr(curr, "id", None) == "proc_info_box":
|
|
101
|
+
return True
|
|
102
|
+
curr = getattr(curr, "parent", None)
|
|
103
|
+
return False
|
|
104
|
+
|
|
105
|
+
def get_clicked_list_item_index(self, widget) -> int | None:
|
|
106
|
+
if not hasattr(self, "list_view"):
|
|
107
|
+
return None
|
|
108
|
+
curr = widget
|
|
109
|
+
while curr:
|
|
110
|
+
if isinstance(curr, ListItem) and curr.parent is self.list_view:
|
|
111
|
+
try:
|
|
112
|
+
items = list(self.list_view.query(ListItem))
|
|
113
|
+
return items.index(curr)
|
|
114
|
+
except ValueError:
|
|
115
|
+
return None
|
|
116
|
+
curr = getattr(curr, "parent", None)
|
|
117
|
+
return None
|
|
118
|
+
|
|
119
|
+
def is_header(self, widget) -> bool:
|
|
120
|
+
curr = widget
|
|
121
|
+
while curr:
|
|
122
|
+
if getattr(curr, "id", None) == "programm_list_header":
|
|
123
|
+
return True
|
|
124
|
+
curr = getattr(curr, "parent", None)
|
|
125
|
+
return False
|
|
126
|
+
|
|
127
|
+
def handle_global_click(self, event: Click) -> None:
|
|
128
|
+
item_idx = self.get_clicked_list_item_index(event.widget)
|
|
129
|
+
if item_idx is not None:
|
|
130
|
+
if 0 <= item_idx < len(self.current_sorted_data):
|
|
131
|
+
self.active_info_pid = self.current_sorted_data[item_idx].get("pid")
|
|
132
|
+
self.update_details()
|
|
133
|
+
return
|
|
134
|
+
|
|
135
|
+
if self.is_child_of_proc_info_box(event.widget) or self.is_header(event.widget):
|
|
136
|
+
return
|
|
137
|
+
|
|
138
|
+
if self.active_info_pid is not None:
|
|
139
|
+
self.active_info_pid = None
|
|
140
|
+
self.update_details()
|
|
141
|
+
|
|
142
|
+
def update_selection_classes(self) -> None:
|
|
143
|
+
"""Update selected class on ListItems based on active_info_pid."""
|
|
144
|
+
if not hasattr(self, "list_view"):
|
|
145
|
+
return
|
|
146
|
+
items = list(self.list_view.query(ListItem))
|
|
147
|
+
for i, item in enumerate(items):
|
|
148
|
+
is_selected = (
|
|
149
|
+
self.active_info_pid is not None
|
|
150
|
+
and i < len(self.current_sorted_data)
|
|
151
|
+
and self.current_sorted_data[i].get("pid") == self.active_info_pid
|
|
152
|
+
)
|
|
153
|
+
item.set_class(is_selected, "selected")
|
|
154
|
+
|
|
98
155
|
def update_details(self) -> None:
|
|
99
156
|
if not hasattr(self, "info_static") or not hasattr(self, "list_view"):
|
|
100
157
|
return
|
|
101
158
|
|
|
159
|
+
self.update_selection_classes()
|
|
102
160
|
self.info_static.update(f"Processes: {self.total_count}")
|
|
103
161
|
|
|
104
162
|
if not self.display or self.active_info_pid is None:
|
|
@@ -191,9 +249,19 @@ class ProgrammListWidget(Container):
|
|
|
191
249
|
for i in range(update_limit):
|
|
192
250
|
formatted_text = _format_process_item(sliced_data[i])
|
|
193
251
|
existing_items[i].query_one(Static).update(formatted_text)
|
|
252
|
+
is_selected = (
|
|
253
|
+
self.active_info_pid is not None
|
|
254
|
+
and sliced_data[i].get("pid") == self.active_info_pid
|
|
255
|
+
)
|
|
256
|
+
existing_items[i].set_class(is_selected, "selected")
|
|
194
257
|
|
|
195
258
|
if new_count > existing_count:
|
|
196
|
-
new_items = [
|
|
259
|
+
new_items = []
|
|
260
|
+
for d in sliced_data[existing_count:]:
|
|
261
|
+
item = ListItem(Static(_format_process_item(d)))
|
|
262
|
+
if self.active_info_pid is not None and d.get("pid") == self.active_info_pid:
|
|
263
|
+
item.add_class("selected")
|
|
264
|
+
new_items.append(item)
|
|
197
265
|
self.list_view.extend(new_items)
|
|
198
266
|
elif existing_count > new_count:
|
|
199
267
|
for item in existing_items[new_count:]:
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: monitorify
|
|
3
|
+
Version: 1.0.3
|
|
4
|
+
Summary: A lightweight Linux terminal system monitor built with Textual
|
|
5
|
+
Author: Leon
|
|
6
|
+
License: MIT
|
|
7
|
+
Requires-Python: >=3.10
|
|
8
|
+
Description-Content-Type: text/markdown
|
|
9
|
+
Requires-Dist: textual>=0.80.0
|
|
10
|
+
Requires-Dist: platformdirs>=4.0.0
|
|
11
|
+
Requires-Dist: rich>=13.0.0
|
|
12
|
+
|
|
13
|
+
# Monitorify
|
|
14
|
+
### A terminal montioring tool for linux
|
|
15
|
+
|
|
16
|
+
- Features
|
|
17
|
+
- CPU monitoring
|
|
18
|
+
- RAM monitoring
|
|
19
|
+
- Network monitoring
|
|
20
|
+
- Disk monitoring (I/O and storage capacity)
|
|
21
|
+
- Process monitoring
|
|
22
|
+
- Background daemon
|
|
23
|
+
- Customization menu (toggle widgets, set intervals, and change history window)
|
|
24
|
+
- Historical graphs
|
|
25
|
+
|
|
26
|
+
## Requirements
|
|
27
|
+
|
|
28
|
+
* **Python:** 3.10+
|
|
29
|
+
* **OS:** Linux (relies on `/proc` and `/sys` filesystems)
|
|
30
|
+
* **Terminal:** Minimum 80 columns × 24 lines recommended
|
|
31
|
+
|
|
32
|
+
## Installation
|
|
33
|
+
### Using pipx
|
|
34
|
+
```bash
|
|
35
|
+
pipx install git+https://github.com/leonst036/Monitorify.git
|
|
36
|
+
```
|
|
37
|
+
Or from PyPI:
|
|
38
|
+
```bash
|
|
39
|
+
pipx install monitorify
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### Using pip
|
|
43
|
+
```bash
|
|
44
|
+
pip install git+https://github.com/leonst036/Monitorify.git
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### Using source
|
|
48
|
+
```bash
|
|
49
|
+
git clone https://github.com/leonst036/Monitorify.git
|
|
50
|
+
cd Monitorify
|
|
51
|
+
pip install .
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## Usage
|
|
55
|
+
```bash
|
|
56
|
+
monitorify
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## Background Daemon
|
|
60
|
+
|
|
61
|
+
The daemon collects metrics continuously to SQLite, even when the dashboard is closed.
|
|
62
|
+
|
|
63
|
+
### Manually (foreground)
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
monitorify-daemon
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### Always-On via systemd --user
|
|
70
|
+
|
|
71
|
+
Create the service file at `~/.config/systemd/user/monitorify.service`:
|
|
72
|
+
|
|
73
|
+
```ini
|
|
74
|
+
[Unit]
|
|
75
|
+
Description=Monitorify Metrics Collector Daemon
|
|
76
|
+
|
|
77
|
+
[Service]
|
|
78
|
+
ExecStart=%h/.local/bin/monitorify-daemon
|
|
79
|
+
Restart=always
|
|
80
|
+
|
|
81
|
+
[Install]
|
|
82
|
+
WantedBy=default.target
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
Enable and start it:
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
systemctl --user daemon-reload
|
|
89
|
+
systemctl --user enable --now monitorify
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
Check status or logs:
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
systemctl --user status monitorify
|
|
96
|
+
journalctl --user -u monitorify -f
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
Stop or disable:
|
|
100
|
+
|
|
101
|
+
```bash
|
|
102
|
+
systemctl --user stop monitorify
|
|
103
|
+
systemctl --user disable monitorify
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
## File Locations
|
|
107
|
+
|
|
108
|
+
Monitorify follows XDG Base Directory conventions — nothing is written to the install directory.
|
|
109
|
+
|
|
110
|
+
| Purpose | Default Path | Override |
|
|
111
|
+
|---|---|---|
|
|
112
|
+
| **Database** | `~/.local/share/monitorify/monitorify.db` | `MONITORIFY_DB_PATH` env var |
|
|
113
|
+
| **Daemon PID** | `/run/user/<uid>/monitorify/daemon.pid` | `MONITORIFY_PID_PATH` env var |
|
|
114
|
+
| **Collection interval** | `1.0` seconds | `MONITORIFY_INTERVAL` env var |
|
|
115
|
+
| **Data retention** | `604800` s (7 days) | `MONITORIFY_RETENTION` env var |
|
|
116
|
+
|
|
117
|
+
## Remote
|
|
118
|
+
|
|
119
|
+
To use Monitorify remotely over SSH on your server, you can set the following parameters:
|
|
120
|
+
|
|
121
|
+
- `--ip` – Set the target IP address.
|
|
122
|
+
- `--port` – Set the SSH port.
|
|
123
|
+
- `--username` – Set the username for the remote host.
|
|
124
|
+
- `--password` – Set the password for the SSH server.
|
|
125
|
+
- `--key_filename` – Set the path to an SSH key *(optional)*.
|
|
126
|
+
|
|
127
|
+
## Tech Stack
|
|
128
|
+
|
|
129
|
+
* **Language & TUI:** Python, Textual
|
|
130
|
+
* **Database:** SQLite
|
|
131
|
+
* **Target OS:** Linux
|
|
132
|
+
|
|
133
|
+
## Uninstalling
|
|
134
|
+
|
|
135
|
+
```bash
|
|
136
|
+
# If installed via pipx
|
|
137
|
+
pipx uninstall monitorify
|
|
138
|
+
|
|
139
|
+
# Remove stored data
|
|
140
|
+
rm -rf ~/.local/share/monitorify
|
|
141
|
+
rm -rf /run/user/$(id -u)/monitorify
|
|
142
|
+
```
|
monitorify-1.0.2/PKG-INFO
DELETED
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
Metadata-Version: 2.4
|
|
2
|
-
Name: monitorify
|
|
3
|
-
Version: 1.0.2
|
|
4
|
-
Summary: A lightweight Linux terminal system monitor built with Textual
|
|
5
|
-
Author: Leon
|
|
6
|
-
License: MIT
|
|
7
|
-
Requires-Python: >=3.10
|
|
8
|
-
Description-Content-Type: text/markdown
|
|
9
|
-
Requires-Dist: textual>=0.80.0
|
|
10
|
-
Requires-Dist: platformdirs>=4.0.0
|
|
11
|
-
Requires-Dist: rich>=13.0.0
|
|
12
|
-
|
|
13
|
-
# Monitorify
|
|
14
|
-
### A terminal montioring tool for linux
|
|
15
|
-
|
|
16
|
-
- Features
|
|
17
|
-
- CPU monitoring
|
|
18
|
-
- RAM monitoring
|
|
19
|
-
- Network monitoring
|
|
20
|
-
- Disk monitoring (I/O and storage capacity)
|
|
21
|
-
- Process monitoring
|
|
22
|
-
- Background daemon
|
|
23
|
-
- Customization menu (toggle widgets, set intervals, and change history window)
|
|
24
|
-
- Historical graphs
|
|
25
|
-
## Installation
|
|
26
|
-
### Using pipx
|
|
27
|
-
```bash
|
|
28
|
-
pipx install git+https://github.com/leonst036/Monitorify.git
|
|
29
|
-
```
|
|
30
|
-
|
|
31
|
-
### Using pip
|
|
32
|
-
```bash
|
|
33
|
-
pip install git+https://github.com/leonst036/Monitorify.git
|
|
34
|
-
```
|
|
35
|
-
|
|
36
|
-
### Using source
|
|
37
|
-
```bash
|
|
38
|
-
git clone https://github.com/leonst036/Monitorify.git
|
|
39
|
-
cd Monitorify
|
|
40
|
-
pip install .
|
|
41
|
-
```
|
|
42
|
-
|
|
43
|
-
## Usage
|
|
44
|
-
```bash
|
|
45
|
-
monitorify
|
|
46
|
-
```
|
|
47
|
-
|
|
48
|
-
## Tech Stack
|
|
49
|
-
|
|
50
|
-
* **Language & TUI:** Python, Textual
|
|
51
|
-
* **Database:** SQLite
|
|
52
|
-
* **Target OS:** Linux
|
|
53
|
-
|
|
54
|
-
## Remote
|
|
55
|
-
|
|
56
|
-
To use Monitorify remotely over SSH on your server, you can set the following parameters:
|
|
57
|
-
|
|
58
|
-
- `--ip` – Set the target IP address.
|
|
59
|
-
- `--port` – Set the SSH port.
|
|
60
|
-
- `--username` – Set the username for the remote host.
|
|
61
|
-
- `--password` – Set the password for the SSH server.
|
|
62
|
-
- `--key_filename` – Set the path to an SSH key *(optional)*.
|
monitorify-1.0.2/README.md
DELETED
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
# Monitorify
|
|
2
|
-
### A terminal montioring tool for linux
|
|
3
|
-
|
|
4
|
-
- Features
|
|
5
|
-
- CPU monitoring
|
|
6
|
-
- RAM monitoring
|
|
7
|
-
- Network monitoring
|
|
8
|
-
- Disk monitoring (I/O and storage capacity)
|
|
9
|
-
- Process monitoring
|
|
10
|
-
- Background daemon
|
|
11
|
-
- Customization menu (toggle widgets, set intervals, and change history window)
|
|
12
|
-
- Historical graphs
|
|
13
|
-
## Installation
|
|
14
|
-
### Using pipx
|
|
15
|
-
```bash
|
|
16
|
-
pipx install git+https://github.com/leonst036/Monitorify.git
|
|
17
|
-
```
|
|
18
|
-
|
|
19
|
-
### Using pip
|
|
20
|
-
```bash
|
|
21
|
-
pip install git+https://github.com/leonst036/Monitorify.git
|
|
22
|
-
```
|
|
23
|
-
|
|
24
|
-
### Using source
|
|
25
|
-
```bash
|
|
26
|
-
git clone https://github.com/leonst036/Monitorify.git
|
|
27
|
-
cd Monitorify
|
|
28
|
-
pip install .
|
|
29
|
-
```
|
|
30
|
-
|
|
31
|
-
## Usage
|
|
32
|
-
```bash
|
|
33
|
-
monitorify
|
|
34
|
-
```
|
|
35
|
-
|
|
36
|
-
## Tech Stack
|
|
37
|
-
|
|
38
|
-
* **Language & TUI:** Python, Textual
|
|
39
|
-
* **Database:** SQLite
|
|
40
|
-
* **Target OS:** Linux
|
|
41
|
-
|
|
42
|
-
## Remote
|
|
43
|
-
|
|
44
|
-
To use Monitorify remotely over SSH on your server, you can set the following parameters:
|
|
45
|
-
|
|
46
|
-
- `--ip` – Set the target IP address.
|
|
47
|
-
- `--port` – Set the SSH port.
|
|
48
|
-
- `--username` – Set the username for the remote host.
|
|
49
|
-
- `--password` – Set the password for the SSH server.
|
|
50
|
-
- `--key_filename` – Set the path to an SSH key *(optional)*.
|
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
Metadata-Version: 2.4
|
|
2
|
-
Name: monitorify
|
|
3
|
-
Version: 1.0.2
|
|
4
|
-
Summary: A lightweight Linux terminal system monitor built with Textual
|
|
5
|
-
Author: Leon
|
|
6
|
-
License: MIT
|
|
7
|
-
Requires-Python: >=3.10
|
|
8
|
-
Description-Content-Type: text/markdown
|
|
9
|
-
Requires-Dist: textual>=0.80.0
|
|
10
|
-
Requires-Dist: platformdirs>=4.0.0
|
|
11
|
-
Requires-Dist: rich>=13.0.0
|
|
12
|
-
|
|
13
|
-
# Monitorify
|
|
14
|
-
### A terminal montioring tool for linux
|
|
15
|
-
|
|
16
|
-
- Features
|
|
17
|
-
- CPU monitoring
|
|
18
|
-
- RAM monitoring
|
|
19
|
-
- Network monitoring
|
|
20
|
-
- Disk monitoring (I/O and storage capacity)
|
|
21
|
-
- Process monitoring
|
|
22
|
-
- Background daemon
|
|
23
|
-
- Customization menu (toggle widgets, set intervals, and change history window)
|
|
24
|
-
- Historical graphs
|
|
25
|
-
## Installation
|
|
26
|
-
### Using pipx
|
|
27
|
-
```bash
|
|
28
|
-
pipx install git+https://github.com/leonst036/Monitorify.git
|
|
29
|
-
```
|
|
30
|
-
|
|
31
|
-
### Using pip
|
|
32
|
-
```bash
|
|
33
|
-
pip install git+https://github.com/leonst036/Monitorify.git
|
|
34
|
-
```
|
|
35
|
-
|
|
36
|
-
### Using source
|
|
37
|
-
```bash
|
|
38
|
-
git clone https://github.com/leonst036/Monitorify.git
|
|
39
|
-
cd Monitorify
|
|
40
|
-
pip install .
|
|
41
|
-
```
|
|
42
|
-
|
|
43
|
-
## Usage
|
|
44
|
-
```bash
|
|
45
|
-
monitorify
|
|
46
|
-
```
|
|
47
|
-
|
|
48
|
-
## Tech Stack
|
|
49
|
-
|
|
50
|
-
* **Language & TUI:** Python, Textual
|
|
51
|
-
* **Database:** SQLite
|
|
52
|
-
* **Target OS:** Linux
|
|
53
|
-
|
|
54
|
-
## Remote
|
|
55
|
-
|
|
56
|
-
To use Monitorify remotely over SSH on your server, you can set the following parameters:
|
|
57
|
-
|
|
58
|
-
- `--ip` – Set the target IP address.
|
|
59
|
-
- `--port` – Set the SSH port.
|
|
60
|
-
- `--username` – Set the username for the remote host.
|
|
61
|
-
- `--password` – Set the password for the SSH server.
|
|
62
|
-
- `--key_filename` – Set the path to an SSH key *(optional)*.
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|