2025-10-15 17:41:05 +02:00

156 lines
5.2 KiB
Python

from django.contrib.auth.decorators import login_required
from django.shortcuts import render, redirect, get_object_or_404
from django.urls import reverse
from django.utils import timezone
from django.http import JsonResponse, Http404
from .models import RemoteHost, CommandLog, BatchScript, CommandTask
from .forms import RemoteHostForm, BatchScriptForm, CommandTaskForm
import uuid, os, markdown
@login_required
def host_list(request):
hosts = RemoteHost.objects.all()
return render(request, 'remotectl/host_list.html', {'hosts': hosts})
@login_required
def host_create(request):
if request.method == 'POST':
form = RemoteHostForm(request.POST)
if form.is_valid():
form.save()
return redirect('host_list')
else:
form = RemoteHostForm()
return render(request, 'remotectl/host_form.html', {'form': form})
@login_required
def host_edit(request, pk):
host = get_object_or_404(RemoteHost, pk=pk)
if request.method == 'POST':
form = RemoteHostForm(request.POST, instance=host)
if form.is_valid():
form.save()
return redirect('host_list')
else:
form = RemoteHostForm(instance=host)
return render(request, 'remotectl/host_form.html', {'form': form, 'host': host})
@login_required
def console(request):
session_id = uuid.uuid4()
hosts = RemoteHost.objects.all()
tasks = CommandTask.objects.all()
return render(request, 'remotectl/console.html', {'session_id': session_id, 'hosts': hosts, 'tasks': tasks})
@login_required
def log_list(request):
logs = CommandLog.objects.select_related('host','created_by')[:200]
return render(request, 'remotectl/log_list.html', {'logs': logs})
@login_required
def log_detail(request, pk):
log = get_object_or_404(CommandLog, pk=pk)
return render(request, 'remotectl/log_detail.html', {'log': log})
@login_required
def batch_list(request):
scripts = BatchScript.objects.all()
return render(request, 'remotectl/batch_list.html', {'scripts': scripts})
@login_required
def batch_create(request):
if request.method == 'POST':
form = BatchScriptForm(request.POST)
if form.is_valid():
obj = form.save(commit=False)
obj.created_by = request.user
obj.save()
return redirect('batch_list')
else:
form = BatchScriptForm()
return render(request, 'remotectl/batch_form.html', {'form': form})
@login_required
def batch_edit(request, pk):
script = get_object_or_404(BatchScript, pk=pk)
if request.method == 'POST':
form = BatchScriptForm(request.POST, instance=script)
if form.is_valid():
form.save()
return redirect('batch_list')
else:
form = BatchScriptForm(instance=script)
return render(request, 'remotectl/batch_form.html', {'form': form, 'script': script})
@login_required
def batch_delete(request, pk):
script = get_object_or_404(BatchScript, pk=pk)
if request.method == 'POST':
script.delete()
return redirect('batch_list')
return render(request, 'remotectl/batch_delete.html', {'script': script})
@login_required
def batch_list_json(request):
scripts = list(BatchScript.objects.values('id','name','description','updated_at'))
return JsonResponse(scripts, safe=False)
@login_required
def task_list(request):
tasks_db = CommandTask.objects.all()
return render(request, 'remotectl/task_list.html', {'tasks_db': tasks_db})
@login_required
def task_create(request):
if request.method == 'POST':
form = CommandTaskForm(request.POST)
if form.is_valid():
obj = form.save(commit=False)
obj.created_by = request.user
obj.save()
return redirect('task_list')
else:
form = CommandTaskForm()
return render(request, 'remotectl/task_form.html', {'form': form})
@login_required
def task_edit(request, pk):
task = get_object_or_404(CommandTask, pk=pk)
if request.method == 'POST':
form = CommandTaskForm(request.POST, instance=task)
if form.is_valid():
form.save()
return redirect('task_list')
else:
form = CommandTaskForm(instance=task)
return render(request, 'remotectl/task_form.html', {'form': form, 'task': task})
@login_required
def task_delete(request, pk):
task = get_object_or_404(CommandTask, pk=pk)
if request.method == 'POST':
task.delete()
return redirect('task_list')
return render(request, 'remotectl/task_delete.html', {'task': task})
@login_required
def task_list_json(request):
data = list(CommandTask.objects.values('id','name','label','command'))
return JsonResponse(data, safe=False)
@login_required
def manual(request):
return render(request, 'remotectl/manual.html')
@login_required
def readme(request):
base_path = os.path.dirname(os.path.dirname(os.path.dirname(__file__))) # project root
readme_path = os.path.join(base_path, 'README.md')
try:
with open(readme_path, 'r', encoding='utf-8') as f:
md_text = f.read()
except OSError:
md_text = '# README.md not found' # fallback
html = markdown.markdown(md_text, extensions=['fenced_code', 'tables'])
return render(request, 'remotectl/readme.html', {'readme_html': html})