156 lines
5.2 KiB
Python
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})
|