• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

djangoaddicts / django-hostutils / 7367497413

31 Dec 2023 01:16AM UTC coverage: 99.262%. Remained the same
7367497413

push

github

davidslusser
adding sphinx

35 of 37 branches covered (0.0%)

Branch coverage included in aggregate %.

234 of 234 relevant lines covered (100.0%)

1.0 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

100.0
/src/djangoaddicts/hostutils/views/htmx.py
1
import datetime
1✔
2

3
import psutil
1✔
4
from django.http import HttpResponse
1✔
5
from django.shortcuts import render
1✔
6
from django.template import loader
1✔
7
from django.views.generic import View
1✔
8
from handyhelpers.views.htmx import BuildBootstrapModalView
1✔
9

10
# import forms
11
from djangoaddicts.hostutils.forms import HostProcessFilterForm
1✔
12

13

14
class GetHostCpuStats(BuildBootstrapModalView):
1✔
15
    """Get statistics for a given CPU"""
16

17
    modal_button_submit = None
1✔
18
    modal_size = "modal-lg"
1✔
19
    modal_title = "CPU Details"
1✔
20

21
    def get(self, request, *args, **kwargs):
1✔
22
        context = {}
1✔
23
        self.modal_subtitle = kwargs["cpu"]
1✔
24
        try:
1✔
25
            cpu = kwargs["cpu"]
1✔
26
            context = {
1✔
27
                "time": psutil.cpu_times(percpu=True)[cpu],
28
                "time_percent": psutil.cpu_times_percent(percpu=True)[cpu],
29
                "frequency": psutil.cpu_freq(percpu=True)[cpu],
30
            }
31
        except IndexError:
1✔
32
            return HttpResponse("Invalid request", status=400)
1✔
33
        self.modal_body = loader.render_to_string("hostutils/bs5/htmx/get_cpu_stats.htm", context=context)
1✔
34
        return super().get(request, *args, **kwargs)
1✔
35

36

37
class GetHostNetworkStats(BuildBootstrapModalView):
1✔
38
    """Get statistics for a given network interface"""
39

40
    modal_button_submit = None
1✔
41
    modal_size = "modal-lg"
1✔
42
    modal_title = "Network Interface Details"
1✔
43

44
    def get(self, request, *args, **kwargs):
1✔
45
        context = {}
1✔
46
        self.modal_subtitle = kwargs["interface"]
1✔
47
        try:
1✔
48
            context["data"] = psutil.net_if_stats()[kwargs["interface"]]
1✔
49
        except KeyError:
1✔
50
            return HttpResponse("Invalid request", status=400)
1✔
51
        self.modal_body = loader.render_to_string("hostutils/bs5/htmx/get_interface_stats.htm", context=context)
1✔
52
        return super().get(request, *args, **kwargs)
1✔
53

54

55
class GetHostParitionStats(BuildBootstrapModalView):
1✔
56
    """Get statistics for a given disk partition"""
57

58
    modal_button_submit = None
1✔
59
    modal_title = "Partition Details"
1✔
60

61
    def get(self, request, *args, **kwargs):
1✔
62
        context = {}
1✔
63
        part = request.GET.get("part", None)
1✔
64
        self.modal_subtitle = part
1✔
65
        try:
1✔
66
            context["data"] = psutil.disk_usage(part)
1✔
67
        except FileNotFoundError:
1✔
68
            return HttpResponse("Invalid request", status=400)
1✔
69
        self.modal_body = loader.render_to_string("hostutils/bs5/htmx/get_partition_stats.htm", context=context)
1✔
70
        return super().get(request, *args, **kwargs)
1✔
71

72

73
class GetHostProcesses(View):
1✔
74
    """Get host processes"""
75

76
    def get(self, request):
1✔
77
        """Get host prcesses"""
78
        context = {}
1✔
79
        filter_form = HostProcessFilterForm(request.GET or None)
1✔
80
        counts = {"running": 0, "sleeping": 0, "idle": 0, "stopped": 0, "zombie": 0, "dead": 0, "disk-sleep": 0}
1✔
81

82
        process_list = []
1✔
83
        for process in psutil.process_iter():
1✔
84
            try:
1✔
85
                counts[process.status()] += 1
1✔
86
                process_list.append(
1✔
87
                    {
88
                        "pid": process.pid,
89
                        "name": process.name(),
90
                        "status": process.status(),
91
                        "started_at": process.create_time(),
92
                    }
93
                )
94
            except (psutil.NoSuchProcess, psutil.AccessDenied):
1✔
95
                continue
1✔
96
        context["counts"] = counts
1✔
97

98
        if request.GET.dict().get("clear", None):
1✔
99
            context["clear_filter"] = False
1✔
100

101
        else:
102
            if filter_form.is_valid():
1✔
103
                context["clear_filter"] = True
1✔
104

105
                if filter_form.cleaned_data.get("status", None):
1✔
106
                    filtered_process_list = []
1✔
107
                    for i in process_list:
1✔
108
                        if i["status"] in filter_form.cleaned_data["status"]:
1✔
109
                            filtered_process_list.append(i)
1✔
110
                    process_list = filtered_process_list
1✔
111

112
                if filter_form.cleaned_data.get("created_at__gte", None):
1✔
113
                    filtered_process_list = []
1✔
114
                    for i in process_list:
1✔
115
                        if i["started_at"] > filter_form.cleaned_data["created_at__gte"].timestamp():
1✔
116
                            filtered_process_list.append(i)
1✔
117
                    process_list = filtered_process_list
1✔
118
                if filter_form.cleaned_data.get("created_at__lte", None):
1✔
119
                    filtered_process_list = []
1✔
120
                    for i in process_list:
1✔
121
                        if i["started_at"] < filter_form.cleaned_data["created_at__lte"].timestamp():
1✔
122
                            filtered_process_list.append(i)
1✔
123
                    process_list = filtered_process_list
1✔
124

125
        context["process_list"] = process_list
1✔
126
        context["title"] = "Host Processes"
1✔
127
        context["now"] = datetime.datetime.now()
1✔
128
        context["subtitle"] = psutil.os.uname()[1]
1✔
129
        filter_form = {}
1✔
130
        filter_form["form"] = HostProcessFilterForm(request.GET or None)
1✔
131
        filter_form["modal_name"] = "filter_processes"
1✔
132
        filter_form["modal_size"] = "modal-lg"
1✔
133
        filter_form["modal_title"] = "Filter Host Processes"
1✔
134
        filter_form["hx_method"] = "hx-get"
1✔
135
        filter_form["hx_url"] = "/hostutils/get_host_processes"
1✔
136
        filter_form["hx_target"] = "id_process_list_container"
1✔
137
        filter_form["method"] = "GET"
1✔
138
        filter_form["action"] = "Filter"
1✔
139
        context["filter_form"] = filter_form
1✔
140
        return render(request, template_name="hostutils/bs5/snippets/host_process_card_swap.htm", context=context)
1✔
141

142

143
class GetHostProcessStats(BuildBootstrapModalView):
1✔
144
    """Get statistics for a given process"""
145

146
    modal_button_submit = None
1✔
147
    modal_size = "modal-lg"
1✔
148
    modal_title = "Process Details"
1✔
149

150
    def get(self, request, *args, **kwargs):
1✔
151
        context = {}
1✔
152
        self.modal_subtitle = kwargs["pid"]
1✔
153
        try:
1✔
154
            data = psutil.Process(kwargs["pid"])
1✔
155
            context = {
1✔
156
                "pid": data.pid,
157
                "ppid": data.ppid(),
158
                "name": data.name(),
159
                "status": data.status(),
160
                "create_time": data.create_time(),
161
                "username": data.username(),
162
                "cmdline": data.cmdline(),
163
                "cpu_num": data.cpu_num(),
164
                "cpu_percent": data.cpu_percent(),
165
                "memory_percent": data.memory_percent(),
166
                "num_threads": data.num_threads(),
167
                "threads": data.threads(),
168
            }
169
            context["cwd"] = data.cwd()
1✔
170
            context["exe"] = data.exe()
1✔
171
        except psutil.AccessDenied:
1✔
172
            pass
1✔
173
        except psutil.NoSuchProcess:
1✔
174
            pass
1✔
175
        self.modal_body = loader.render_to_string("hostutils/bs5/htmx/get_process_stats.htm", context=context)
1✔
176
        return super().get(request, *args, **kwargs)
1✔
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc