diff --git a/apps/assets/const.py b/apps/assets/const.py index 1dc9e5a20..3de19c99a 100644 --- a/apps/assets/const.py +++ b/apps/assets/const.py @@ -39,7 +39,7 @@ TEST_ASSET_CONN_TASK_NAME = "ASSET_CONN_TEST_MANUAL" TEST_SYSTEM_USER_CONN_PERIOD_LOCK_KEY = "TEST_SYSTEM_USER_CONN_PERIOD_KEY" TEST_SYSTEM_USER_CONN_PERIOD_TASK_NAME = "TEST-SYSTEM-USER-CONN-PERIOD-TASK" TEST_SYSTEM_USER_CONN_CACHE_KEY_PREFIX = "SYSTEM_USER_CONN_" -TEST_SYSTEM_USER_CONN_TASK_NAME = "TEST-ADMIN-USER-CONN-{}" +TEST_SYSTEM_USER_CONN_TASK_NAME = "TEST-SYSTEM-USER-CONN-{}" TEST_SYSTEM_USER_CONN_LOCK_KEY = "TEST_SYSTEM_USER_CONN_{}" SYSTEM_USER_CONN_CACHE_KEY = "SYSTEM_USER_CONN_{}" TEST_SYSTEM_USER_CONN_TASKS = [ @@ -52,6 +52,6 @@ TEST_SYSTEM_USER_CONN_TASKS = [ ] TASK_OPTIONS = { - 'timeout': 60, + 'timeout': 10, 'forks': 10, } diff --git a/apps/assets/models/user.py b/apps/assets/models/user.py index c1c87c9fd..03fcf3068 100644 --- a/apps/assets/models/user.py +++ b/apps/assets/models/user.py @@ -114,6 +114,16 @@ class AssetUser(models.Model): private_key=private_key, public_key=public_key) + def _to_secret_json(self): + """Push system user use it""" + return { + 'name': self.name, + 'username': self.username, + 'password': self.password, + 'public_key': self.public_key, + 'private_key': self.private_key_file, + } + class Meta: abstract = True @@ -195,18 +205,6 @@ class SystemUser(AssetUser): def __str__(self): return self.name - def _to_secret_json(self): - """Push system user use it""" - return { - 'name': self.name, - 'username': self.username, - 'shell': self.shell, - 'sudo': self.sudo, - 'password': self.password, - 'public_key': self.public_key, - 'private_key_file': self.private_key_file, - } - def get_clusters_assets(self): from .asset import Asset clusters = self.cluster.all() diff --git a/apps/assets/tasks.py b/apps/assets/tasks.py index ddd5436d1..3370470df 100644 --- a/apps/assets/tasks.py +++ b/apps/assets/tasks.py @@ -173,7 +173,10 @@ def test_admin_user_connectability_manual(asset, task_name=None): task_name = const.TEST_ASSET_CONN_TASK_NAME hosts = [asset.hostname] tasks = const.TEST_ADMIN_USER_CONN_TASKS - task = create_or_update_task(task_name, tasks=tasks, hosts=hosts) + task = create_or_update_task( + task_name, tasks=tasks, hosts=hosts, run_as_admin=True, + created_by='System', options=const.TASK_OPTIONS, pattern='all', + ) result = task.run() if result.results_summary['dark']: @@ -194,7 +197,7 @@ def test_system_user_connectability(system_user, force=False): """ from ops.utils import create_or_update_task lock_key = const.TEST_SYSTEM_USER_CONN_LOCK_KEY.format(system_user.name) - task_name = const.TEST_SYSTEM_USER_CONN_TASK_NAME + task_name = const.TEST_SYSTEM_USER_CONN_TASK_NAME.format(system_user.name) if cache.get(lock_key, 0) == 1 and not force: logger.debug("Task {} is running or before long, passed this time".format(task_name)) return {} @@ -202,7 +205,8 @@ def test_system_user_connectability(system_user, force=False): hosts = [asset.hostname for asset in assets] tasks = const.TEST_SYSTEM_USER_CONN_TASKS task = create_or_update_task( - task_name, hosts=hosts, tasks=tasks, options=const.TASK_OPTIONS, + task_name, hosts=hosts, tasks=tasks, pattern='all', + options=const.TASK_OPTIONS, run_as=system_user.name, created_by="System", ) cache.set(lock_key, 1, CACHE_MAX_TIME) diff --git a/apps/common/templatetags/common_tags.py b/apps/common/templatetags/common_tags.py index 12a30927d..324766aa7 100644 --- a/apps/common/templatetags/common_tags.py +++ b/apps/common/templatetags/common_tags.py @@ -57,7 +57,7 @@ def int_to_str(value): def ts_to_date(ts): try: ts = float(ts) - except TypeError: + except ValueError: ts = 0 dt = timezone.datetime.fromtimestamp(ts).\ replace(tzinfo=timezone.get_current_timezone()) diff --git a/apps/ops/models.py b/apps/ops/models.py index efc7e3a6e..4cbdc8dc1 100644 --- a/apps/ops/models.py +++ b/apps/ops/models.py @@ -23,7 +23,7 @@ class Task(models.Model): id = models.UUIDField(default=uuid.uuid4, primary_key=True) name = models.CharField(max_length=128, unique=True, verbose_name=_('Name')) is_deleted = models.BooleanField(default=False) - created_by = models.CharField(max_length=128, blank=True, default='') + created_by = models.CharField(max_length=128, blank=True, null=True, default='') date_created = models.DateTimeField(auto_now_add=True) __latest_adhoc = None @@ -93,13 +93,13 @@ class AdHoc(models.Model): id = models.UUIDField(default=uuid.uuid4, primary_key=True) task = models.ForeignKey(Task, related_name='adhoc', on_delete=models.CASCADE) _tasks = models.TextField(verbose_name=_('Tasks')) - pattern = models.CharField(max_length=64, default='', verbose_name=_('Pattern')) + pattern = models.CharField(max_length=64, default='{}', verbose_name=_('Pattern')) _options = models.CharField(max_length=1024, default='', verbose_name=_('Options')) _hosts = models.TextField(blank=True, verbose_name=_('Hosts')) # ['hostname1', 'hostname2'] run_as_admin = models.BooleanField(default=False, verbose_name=_('Run as admin')) run_as = models.CharField(max_length=128, default='', verbose_name=_("Run as")) _become = models.CharField(max_length=1024, default='', verbose_name=_("Become")) - created_by = models.CharField(max_length=64, default='', verbose_name=_('Create by')) + created_by = models.CharField(max_length=64, default='', null=True, verbose_name=_('Create by')) date_created = models.DateTimeField(auto_now_add=True) @property @@ -147,9 +147,10 @@ class AdHoc(models.Model): @property def options(self): if self._options: - return json.loads(self._options) - else: - return {} + _options = json.loads(self._options) + if isinstance(_options, dict): + return _options + return {} @options.setter def options(self, item): diff --git a/apps/terminal/views/session.py b/apps/terminal/views/session.py index a47dca6eb..5279a2e26 100644 --- a/apps/terminal/views/session.py +++ b/apps/terminal/views/session.py @@ -124,8 +124,11 @@ class SessionDetailView(SingleObjectMixin, ListView): model = Session object = None + def get(self, request, *args, **kwargs): + self.object = self.get_object(queryset=self.model.objects.all()) + return super().get(request, *args, **kwargs) + def get_queryset(self): - self.object = self.get_object() return command_store.filter(session=self.object.id) def get_context_data(self, **kwargs):