diff --git a/__init__.py b/__init__.py index 5f94f95..ba2ec6d 100644 --- a/__init__.py +++ b/__init__.py @@ -82,7 +82,13 @@ def load(app): @page_blueprint.route("/admin/containers") @admins_only def admin_list_containers(): - result = AdminContainers.get() + page_type = request.args.get("type", "instances") + if page_type == "logs": + result = AdminContainers.logs() + session['page_type'] = 'logs' + else: + result = AdminContainers.get() + session['page_type'] = 'containers' view_mode = request.args.get('mode', session.get('view_mode', 'list')) session['view_mode'] = view_mode return render_template("whale_containers.html", diff --git a/api.py b/api.py index 3944939..9e3a1e3 100644 --- a/api.py +++ b/api.py @@ -46,6 +46,25 @@ class AdminContainers(Resource): 'page_start': page_start, }} + @staticmethod + @admins_only + def logs(): + page = abs(request.args.get("page", 1, type=int)) + results_per_page = abs(request.args.get("per_page", 20, type=int)) + page_start = results_per_page * (page - 1) + page_end = results_per_page * (page - 1) + results_per_page + + count = DBContainer.get_all_container_logs_count() + containers = DBContainer.get_all_container_logs_page( + page_start, page_end) + + return {'success': True, 'data': { + 'containers': containers, + 'total': count, + 'pages': int(count / results_per_page) + (count % results_per_page > 0), + 'page_start': page_start, + }} + @staticmethod @admins_only def patch(): diff --git a/models.py b/models.py index f9263be..36d467c 100644 --- a/models.py +++ b/models.py @@ -103,3 +103,31 @@ class WhaleContainer(db.Model): def __repr__(self): return "".format(self.id, self.user_id, self.challenge_id, self.start_time, self.renew_count) + +class WhaleContainerLog(db.Model): + id = db.Column(db.Integer, primary_key=True, autoincrement=True) + user_id = db.Column(None, db.ForeignKey("users.id")) + challenge_id = db.Column(None, db.ForeignKey("challenges.id")) + start_time = db.Column(db.DateTime, nullable=False, default=datetime.utcnow) + uuid = db.Column(db.String(256)) + port = db.Column(db.Integer, nullable=True, default=0) + flag = db.Column(db.String(128), nullable=False) + + # Relationships + user = db.relationship( + "Users", foreign_keys="WhaleContainerLog.user_id", lazy="select") + challenge = db.relationship( + "DynamicDockerChallenge", foreign_keys="WhaleContainerLog.challenge_id", lazy="select" + ) + + def __init__(self, container): + self.user_id = container.user_id + self.challenge_id = container.challenge_id + self.start_time = container.start_time + self.uuid = container.uuid + self.port = container.port + self.flag = container.flag + + def __repr__(self): + return "".format(self.id, self.user_id, self.challenge_id, + self.start_time, self.uuid, self.port) diff --git a/templates/containers/card.logs.html b/templates/containers/card.logs.html new file mode 100644 index 0000000..527cfae --- /dev/null +++ b/templates/containers/card.logs.html @@ -0,0 +1,44 @@ + + +
+ {% for container in containers %} +
+
+
+
+ {{ container.challenge.name | truncate(15) }} + +
+
+ {{ container.user.name | truncate(5) }} + +
+

Container: {{ container.uuid }}

+

{{ container.flag }}

+ Time Started: {{ container.start_time }} + Log Record +
+
+
+ {% endfor %} +
diff --git a/templates/containers/list.logs.html b/templates/containers/list.logs.html new file mode 100644 index 0000000..e92e513 --- /dev/null +++ b/templates/containers/list.logs.html @@ -0,0 +1,63 @@ +
+
+ + + + + + + + {% for container in containers %} + + + + + + + + + + + {% endfor %} + +
+
  + +
+
ID + User + Challenge + Container + Port + Flag + Startup Time +
+
  + +
+
+ {{ container.id }} + + + {{ container.user.name | truncate(12) }} + + + + {{ container.challenge.name }} + + + {{ container.uuid }} + + + {{ container.port if container.port else '-' }} + + + + +
+
+
diff --git a/templates/whale_containers.html b/templates/whale_containers.html index 8e2bdeb..967ac7c 100644 --- a/templates/whale_containers.html +++ b/templates/whale_containers.html @@ -5,7 +5,12 @@ 🔗 Settings +