mirror of
https://github.com/j3ssie/osmedeus.git
synced 2026-08-20 22:52:32 +02:00
91 lines
3.1 KiB
Python
91 lines
3.1 KiB
Python
from rest_framework.views import APIView
|
|
from rest_framework.permissions import IsAuthenticated, IsAdminUser
|
|
from rest_framework import serializers
|
|
from api.models import Commands, Activities, Workspaces, Logs
|
|
|
|
# import utils
|
|
from core import utils
|
|
from core import common
|
|
from core import execute
|
|
|
|
|
|
def parse_data(data):
|
|
item = {
|
|
'cmd': data.get('cmd'),
|
|
'output_path': data.get('output_path'),
|
|
'std_path': data.get('std_path'),
|
|
'module': data.get('module'),
|
|
'status': data.get('status'),
|
|
'cmd_type': data.get('cmd_type'),
|
|
'workspace': data.get('workspace'),
|
|
'resources': data.get('resources'),
|
|
'chunk': data.get('chunk'),
|
|
'delay': data.get('delay'),
|
|
}
|
|
return item
|
|
|
|
|
|
class ExecuteSerializer(serializers.Serializer):
|
|
cmd = serializers.CharField(default='')
|
|
output_path = serializers.CharField(allow_blank=True, default='')
|
|
std_path = serializers.CharField(allow_blank=True, default='')
|
|
# alias = serializers.CharField(default=None)
|
|
workspace = serializers.CharField(required=True)
|
|
module = serializers.CharField(default='default')
|
|
cmd_type = serializers.CharField(default='single')
|
|
forced = serializers.BooleanField(default=False)
|
|
nolog = serializers.BooleanField(default=False)
|
|
resources = serializers.CharField(allow_blank=True, default=False)
|
|
chunk = serializers.IntegerField(default=1)
|
|
delay = serializers.IntegerField(default=1)
|
|
|
|
|
|
class ExecuteView(APIView):
|
|
serializer_class = ExecuteSerializer
|
|
permission_classes = (IsAuthenticated, IsAdminUser)
|
|
|
|
def post(self, request, *args, **kwargs):
|
|
serializer = ExecuteSerializer(data=request.data)
|
|
serializer.is_valid(raise_exception=True)
|
|
data = serializer.data
|
|
forced = data.get('forced')
|
|
cmd = data.get('cmd')
|
|
output_path = data.get('output_path')
|
|
cmd_type = data.get('cmd_type')
|
|
# don't care about the status
|
|
nolog = data.get('nolog')
|
|
|
|
# forced check if output path exist
|
|
if not forced:
|
|
if utils.not_empty_file(output_path):
|
|
return common.message(500, "Commands is already done")
|
|
|
|
# set idle status
|
|
if nolog:
|
|
data['status'] = 'Done'
|
|
else:
|
|
data['status'] = 'Running'
|
|
|
|
item = parse_data(data)
|
|
instance = Activities.objects.create(**item)
|
|
Logs.objects.create(**item)
|
|
|
|
command_record = instance.as_json()
|
|
|
|
# really run the command
|
|
if cmd_type == 'single':
|
|
utils.print_info("Execute: {0} ".format(cmd))
|
|
execute.run_single(command_record)
|
|
elif cmd_type == 'list':
|
|
utils.print_info("Execute chunk: {0} ".format(cmd))
|
|
commands = execute.get_chunk_commands(command_record)
|
|
execute.run_chunk(commands, command_record.get(
|
|
'chunk'), command_record.get('delay'))
|
|
|
|
# update status after done
|
|
if instance.status != 'Done':
|
|
instance.status = 'Done'
|
|
instance.save()
|
|
|
|
return common.message(200, "Commands is done")
|