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

djangoaddicts / django-hostutils / 8075260951

28 Feb 2024 04:24AM UTC coverage: 99.32% (+0.02%) from 99.298%
8075260951

push

github

web-flow
adding rbac option (#21)

35 of 37 branches covered (94.59%)

Branch coverage included in aggregate %.

257 of 257 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.get("cpu", None)
1✔
24
        try:
1✔
25
            cpu = kwargs.get("cpu", None)
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
            print('TEST: ', kwargs)
1✔
32
        except IndexError:
1✔
33
            return HttpResponse("Invalid request", status=400)
1✔
34
        self.modal_body = loader.render_to_string("hostutils/bs5/htmx/get_cpu_stats.htm", context=context)
1✔
35
        return super().get(request, *args, **kwargs)
1✔
36

37

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

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

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

55

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

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

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

73

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

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

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

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

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

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

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

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

145

146
class GetHostProcessStats(BuildBootstrapModalView):
1✔
147
    """Get statistics for a given process"""
148

149
    modal_button_submit = None
1✔
150
    modal_size = "modal-lg"
1✔
151
    modal_title = "Process Details"
1✔
152

153
    def get(self, request, *args, **kwargs):
1✔
154
        context = {}
1✔
155
        self.modal_subtitle = kwargs["pid"]
1✔
156
        try:
1✔
157
            data = psutil.Process(kwargs["pid"])
1✔
158
            context = {
1✔
159
                "pid": data.pid,
160
                "ppid": data.ppid(),
161
                "name": data.name(),
162
                "status": data.status(),
163
                "create_time": data.create_time(),
164
                "username": data.username(),
165
                "cmdline": data.cmdline(),
166
                "cpu_num": data.cpu_num(),
167
                "cpu_percent": data.cpu_percent(),
168
                "memory_percent": data.memory_percent(),
169
                "num_threads": data.num_threads(),
170
                "threads": data.threads(),
171
            }
172
            context["cwd"] = data.cwd()
1✔
173
            context["exe"] = data.exe()
1✔
174
        except psutil.AccessDenied:
1✔
175
            pass
1✔
176
        except psutil.NoSuchProcess:
1✔
177
            pass
1✔
178
        self.modal_body = loader.render_to_string("hostutils/bs5/htmx/get_process_stats.htm", context=context)
1✔
179
        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