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})