- |
- {{ object.name }} |
-
- {{ object.history_summary.failed }}/{{ object.history_summary.success}}/{{ object.history_summary.total}}
- |
- {{ object.adhoc.all | length}} |
- {{ object.latest_adhoc.hosts | length}} |
-
- {% if object.latest_history %}
- {% if object.latest_history.is_success %}
-
- {% else %}
-
- {% endif %}
- {% endif %}
- |
- {{ object.latest_history.date_start }} |
-
- {% if object.latest_history %}
- {{ object.latest_history.timedelta|floatformat }} s
- {% endif %}
- |
-
- {% trans "Run" %}
- {% trans "Delete" %}
- |
+{% load i18n static %}
+{% block table_search %}{% endblock %}
+{% block table_container %}
+
{% endblock %}
+{% block content_bottom_left %}{% endblock %}
{% block custom_foot_js %}
-
{% endblock %}
diff --git a/apps/ops/views/adhoc.py b/apps/ops/views/adhoc.py
index 06a9f1932..4df75305b 100644
--- a/apps/ops/views/adhoc.py
+++ b/apps/ops/views/adhoc.py
@@ -2,7 +2,7 @@
from django.utils.translation import ugettext as _
from django.conf import settings
-from django.views.generic import ListView, DetailView
+from django.views.generic import ListView, DetailView, TemplateView
from common.mixins import DatetimeSearchMixin
from common.permissions import PermissionsMixin, IsOrgAdmin
@@ -17,7 +17,7 @@ __all__ = [
]
-class TaskListView(PermissionsMixin, DatetimeSearchMixin, ListView):
+class TaskListView(PermissionsMixin, TemplateView):
paginate_by = settings.DISPLAY_PER_PAGE
model = Task
ordering = ('-date_created',)
@@ -26,27 +26,10 @@ class TaskListView(PermissionsMixin, DatetimeSearchMixin, ListView):
keyword = ''
permission_classes = [IsOrgAdmin]
- def get_queryset(self):
- queryset = super().get_queryset()
- if current_org.is_real():
- queryset = queryset.filter(created_by=current_org.id)
- else:
- queryset = queryset.filter(created_by='')
-
- self.keyword = self.request.GET.get('keyword', '')
- if self.keyword:
- queryset = queryset.filter(
- name__icontains=self.keyword,
- )
- return queryset
-
def get_context_data(self, **kwargs):
context = {
'app': _('Ops'),
'action': _('Task list'),
- 'date_from': self.date_from,
- 'date_to': self.date_to,
- 'keyword': self.keyword,
}
kwargs.update(context)
return super().get_context_data(**kwargs)
diff --git a/apps/static/js/jumpserver.js b/apps/static/js/jumpserver.js
index 03c804da8..96f7a27dd 100644
--- a/apps/static/js/jumpserver.js
+++ b/apps/static/js/jumpserver.js
@@ -1139,7 +1139,10 @@ function timeOffset(a, b) {
var start = safeDate(a);
var end = safeDate(b);
var offset = (end - start) / 1000;
+ return readableSecond(offset)
+}
+function readableSecond(offset) {
var days = offset / 3600 / 24;
var hours = offset / 3600;
var minutes = offset / 60;
diff --git a/apps/templates/_nav.html b/apps/templates/_nav.html
index 8b76e9b5d..5690c961d 100644
--- a/apps/templates/_nav.html
+++ b/apps/templates/_nav.html
@@ -114,6 +114,9 @@
{% endif %}
diff --git a/jms b/jms
index 17c0d8b47..805faac50 100755
--- a/jms
+++ b/jms
@@ -200,9 +200,13 @@ def is_running(s, unlink=True):
def parse_service(s):
- all_services = ['gunicorn', 'celery_ansible', 'celery_default', 'beat']
+ all_services = [
+ 'gunicorn', 'celery_ansible', 'celery_default', 'beat', 'flower'
+ ]
if s == 'all':
return all_services
+ elif s == 'gunicorn':
+ return ['gunicorn', 'flower']
elif s == "celery":
return ["celery_ansible", "celery_default"]
elif "," in s:
@@ -240,17 +244,19 @@ def get_start_gunicorn_kwargs():
def get_start_celery_ansible_kwargs():
- print("\n- Start Celery as Distributed Task Queue")
+ print("\n- Start Celery as Distributed Task Queue: Ansible")
return get_start_worker_kwargs('ansible', 4)
def get_start_celery_default_kwargs():
+ print("\n- Start Celery as Distributed Task Queue: Celery")
return get_start_worker_kwargs('celery', 2)
def get_start_worker_kwargs(queue, num):
# Todo: Must set this environment, otherwise not no ansible result return
os.environ.setdefault('PYTHONOPTIMIZE', '1')
+ os.environ.setdefault('ANSIBLE_FORCE_COLOR', 'True')
if os.getuid() == 0:
os.environ.setdefault('C_FORCE_ROOT', '1')
@@ -261,6 +267,24 @@ def get_start_worker_kwargs(queue, num):
'-l', 'INFO',
'-c', str(num),
'-Q', queue,
+ '-n', '{}@%h'.format(queue)
+ ]
+ return {"cmd": cmd, "cwd": APPS_DIR}
+
+
+def get_start_flower_kwargs():
+ print("\n- Start Flower as Task Monitor")
+ if os.getuid() == 0:
+ os.environ.setdefault('C_FORCE_ROOT', '1')
+
+ cmd = [
+ 'celery', 'flower',
+ '-A', 'ops',
+ '-l', 'INFO',
+ '--url_prefix=flower',
+ '--auto_refresh=False',
+ '--max_tasks=1000',
+ '--tasks_columns=uuid,name,args,state,received,started,runtime,worker'
]
return {"cmd": cmd, "cwd": APPS_DIR}
@@ -333,6 +357,7 @@ def start_service(s):
"celery_ansible": get_start_celery_ansible_kwargs,
"celery_default": get_start_celery_default_kwargs,
"beat": get_start_beat_kwargs,
+ "flower": get_start_flower_kwargs,
}
kwargs = services_kwargs.get(s)()
@@ -449,7 +474,7 @@ if __name__ == '__main__':
)
parser.add_argument(
"service", type=str, default="all", nargs="?",
- choices=("all", "gunicorn", "celery", "beat", "celery,beat"),
+ choices=("all", "gunicorn", "celery", "beat", "celery,beat", "flower"),
help="The service to start",
)
parser.add_argument('-d', '--daemon', nargs="?", const=1)