summaryrefslogtreecommitdiffstats
path: root/src/tiptop/_app.py
blob: 2a53505aa2df97d524a690f44d9838e7aedeed0c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
from __future__ import annotations

import argparse
from sys import version_info

import psutil
from textual.app import App

from .__about__ import __version__
from ._battery import Battery
from ._cpu import CPU
from ._disk import Disk
from ._info import InfoLine
from ._mem import Mem
from ._net import Net
from ._procs_list import ProcsList

# class TiptopApp(App):
#     async def on_mount(self) -> None:
#         await self.view.dock(InfoLine(), edge="top", size=1, name="info")
#         await self.view.dock(CPU(), edge="top", size=14, name="cpu")
#         await self.view.dock(ProcsList(), edge="right", size=70, name="proc")
#         await self.view.dock(Mem(), edge="top", size=20, name="mem")
#         await self.view.dock(Net(), edge="bottom", name="net")
#
#     async def on_load(self, _):
#         await self.bind("i", "view.toggle('info')", "Toggle info")
#         await self.bind("c", "view.toggle('cpu')", "Toggle cpu")
#         await self.bind("m", "view.toggle('mem')", "Toggle mem")
#         await self.bind("n", "view.toggle('net')", "Toggle net")
#         await self.bind("p", "view.toggle('proc')", "Toggle proc")
#         await self.bind("q", "quit", "quit")


def run(argv=None):
    parser = argparse.ArgumentParser(
        description="Command-line system monitor.",
        formatter_class=argparse.RawTextHelpFormatter,
    )

    parser.add_argument(
        "--version",
        "-v",
        action="version",
        version=_get_version_text(),
        help="display version information",
    )

    parser.add_argument(
        "--log",
        "-l",
        type=str,
        default=None,
        help="debug log file",
    )

    parser.add_argument(
        "--net",
        "-n",
        type=str,
        default=None,
        help="network interface to display (default: auto)",
    )

    args = parser.parse_args(argv)

    # with a grid
    class TiptopApp(App):
        async def on_mount(self) -> None:
            grid = await self.view.dock_grid(edge="left")

            # 34/55: approx golden ratio. See
            # <https://gist.github.com/nschloe/ab6c3c90b4a6bc02c40405803fa8fa35>
            # for the error.
            grid.add_column(fraction=55, name="left")
            grid.add_column(fraction=34, name="right")

            if psutil.sensors_battery() is None:
                grid.add_row(size=1, name="topline")
                grid.add_row(fraction=1, name="top")
                grid.add_row(fraction=1, name="center")
                grid.add_row(fraction=1, name="bottom")
                grid.add_areas(
                    area0="left-start|right-end,topline",
                    area1="left-start|right-end,top",
                    area2a="left,center",
                    area2b="left,bottom",
                    area3="right,center-start|bottom-end",
                )
                grid.place(
                    area0=InfoLine(),
                    area1=CPU(),
                    area2a=Mem(),
                    area2b=Net(args.net),
                    area3=ProcsList(),
                )
            else:
                grid.add_row(size=1, name="r0")
                grid.add_row(fraction=17, name="r1")
                grid.add_row(fraction=4, name="r2")
                grid.add_row(fraction=15, name="r3")
                grid.add_row(fraction=15, name="r4")
                grid.add_areas(
                    area0="left-start|right-end,r0",
                    area1="left,r1",
                    area2a="right,r1",
                    area2b="right,r2",
                    area2c="right,r3",
                    area2d="right,r4",
                    area3="left,r2-start|r4-end",
                )
                grid.place(
                    area0=InfoLine(),
                    area1=CPU(),
                    area2a=Mem(),
                    area2b=Battery(),
                    area2c=Disk(),
                    area2d=Net(args.net),
                    area3=ProcsList(),
                )

        async def on_load(self, _):
            await self.bind("q", "quit", "quit")

    TiptopApp.run(log=args.log)


def _get_version_text():
    python_version = f"{version_info.major}.{version_info.minor}.{version_info.micro}"

    return "\n".join(
        [
            f"tiptop {__version__} [Python {python_version}]",
            "Copyright (c) 2021-2022 Nico Schlömer",
        ]
    )