Source code for djangoaddicts.hostutils.views.htmx

import datetime

import psutil
from django.http import HttpResponse
from django.shortcuts import render
from django.template import loader
from django.views.generic import View
from handyhelpers.views.htmx import BuildBootstrapModalView

# import forms
from djangoaddicts.hostutils.forms import HostProcessFilterForm


[docs] class GetHostCpuStats(BuildBootstrapModalView): """Get statistics for a given CPU""" modal_button_submit = None modal_size = "modal-lg" modal_title = "CPU Details" def get(self, request, *args, **kwargs): context = {} self.modal_subtitle = kwargs["cpu"] try: cpu = kwargs["cpu"] context = { "time": psutil.cpu_times(percpu=True)[cpu], "time_percent": psutil.cpu_times_percent(percpu=True)[cpu], "frequency": psutil.cpu_freq(percpu=True)[cpu], } except IndexError: return HttpResponse("Invalid request", status=400) self.modal_body = loader.render_to_string("hostutils/bs5/htmx/get_cpu_stats.htm", context=context) return super().get(request, *args, **kwargs)
[docs] class GetHostNetworkStats(BuildBootstrapModalView): """Get statistics for a given network interface""" modal_button_submit = None modal_size = "modal-lg" modal_title = "Network Interface Details" def get(self, request, *args, **kwargs): context = {} self.modal_subtitle = kwargs["interface"] try: context["data"] = psutil.net_if_stats()[kwargs["interface"]] except KeyError: return HttpResponse("Invalid request", status=400) self.modal_body = loader.render_to_string("hostutils/bs5/htmx/get_interface_stats.htm", context=context) return super().get(request, *args, **kwargs)
[docs] class GetHostParitionStats(BuildBootstrapModalView): """Get statistics for a given disk partition""" modal_button_submit = None modal_title = "Partition Details" def get(self, request, *args, **kwargs): context = {} part = request.GET.get("part", None) self.modal_subtitle = part try: context["data"] = psutil.disk_usage(part) except FileNotFoundError: return HttpResponse("Invalid request", status=400) self.modal_body = loader.render_to_string("hostutils/bs5/htmx/get_partition_stats.htm", context=context) return super().get(request, *args, **kwargs)
[docs] class GetHostProcesses(View): """Get host processes"""
[docs] def get(self, request): """Get host prcesses""" context = {} filter_form = HostProcessFilterForm(request.GET or None) counts = {"running": 0, "sleeping": 0, "idle": 0, "stopped": 0, "zombie": 0, "dead": 0, "disk-sleep": 0} process_list = [] for process in psutil.process_iter(): try: counts[process.status()] += 1 process_list.append( { "pid": process.pid, "name": process.name(), "status": process.status(), "started_at": process.create_time(), } ) except (psutil.NoSuchProcess, psutil.AccessDenied): continue context["counts"] = counts if request.GET.dict().get("clear", None): context["clear_filter"] = False else: if filter_form.is_valid(): context["clear_filter"] = True if filter_form.cleaned_data.get("status", None): filtered_process_list = [] for i in process_list: if i["status"] in filter_form.cleaned_data["status"]: filtered_process_list.append(i) process_list = filtered_process_list if filter_form.cleaned_data.get("created_at__gte", None): filtered_process_list = [] for i in process_list: if i["started_at"] > filter_form.cleaned_data["created_at__gte"].timestamp(): filtered_process_list.append(i) process_list = filtered_process_list if filter_form.cleaned_data.get("created_at__lte", None): filtered_process_list = [] for i in process_list: if i["started_at"] < filter_form.cleaned_data["created_at__lte"].timestamp(): filtered_process_list.append(i) process_list = filtered_process_list context["process_list"] = process_list context["title"] = "Host Processes" context["now"] = datetime.datetime.now() context["subtitle"] = psutil.os.uname()[1] filter_form = {} filter_form["form"] = HostProcessFilterForm(request.GET or None) filter_form["modal_name"] = "filter_processes" filter_form["modal_size"] = "modal-lg" filter_form["modal_title"] = "Filter Host Processes" filter_form["hx_method"] = "hx-get" filter_form["hx_url"] = "/hostutils/get_host_processes" filter_form["hx_target"] = "id_process_list_container" filter_form["method"] = "GET" filter_form["action"] = "Filter" context["filter_form"] = filter_form return render(request, template_name="hostutils/bs5/snippets/host_process_card_swap.htm", context=context)
[docs] class GetHostProcessStats(BuildBootstrapModalView): """Get statistics for a given process""" modal_button_submit = None modal_size = "modal-lg" modal_title = "Process Details" def get(self, request, *args, **kwargs): context = {} self.modal_subtitle = kwargs["pid"] try: data = psutil.Process(kwargs["pid"]) context = { "pid": data.pid, "ppid": data.ppid(), "name": data.name(), "status": data.status(), "create_time": data.create_time(), "username": data.username(), "cmdline": data.cmdline(), "cpu_num": data.cpu_num(), "cpu_percent": data.cpu_percent(), "memory_percent": data.memory_percent(), "num_threads": data.num_threads(), "threads": data.threads(), } context["cwd"] = data.cwd() context["exe"] = data.exe() except psutil.AccessDenied: pass except psutil.NoSuchProcess: pass self.modal_body = loader.render_to_string("hostutils/bs5/htmx/get_process_stats.htm", context=context) return super().get(request, *args, **kwargs)