Commit 424a4bf7 by Maxime

Simple display of logs files

parent 80c9e24b
Pipeline #103 passed with stage
in 22 seconds
......@@ -7,7 +7,7 @@ COPY requirements.txt /app
RUN mod_wsgi-docker-build
COPY manage.py /app
COPY {{ project_name }} /app/{{ project_name }}/
COPY logs_viewer /app/logs_viewer/
COPY .coveragerc /app
RUN python manage.py collectstatic --noinput
......@@ -16,4 +16,4 @@ EXPOSE 80
ENTRYPOINT [ "mod_wsgi-docker-start" ]
CMD [ "--url-alias", "/static", "static", "{{ project_name }}/wsgi.py" ]
\ No newline at end of file
CMD [ "--url-alias", "/static", "static", "logs_viewer/wsgi.py" ]
\ No newline at end of file
{{ project_name }}
==================
\ No newline at end of file
logs_viewer
===========
This is a simple application to display logs fieles in a web page.
\ No newline at end of file
#!/bin/bash
API_IMAGE="{{ project_name | lower }}"
API_CONTAINER="{{ project_name | lower }}"
API_TEST_CONTAINER="{{ project_name | lower }}-test"
API_IMAGE="logs-viewer-img"
API_CONTAINER="logs-viewer"
API_TEST_CONTAINER="logs-viewer-test"
function log_info {
echo -e "\e[44m$1\e[49m"
......@@ -55,5 +55,5 @@ remove_container "$API_TEST_CONTAINER"
remove_container "$API_CONTAINER"
log_info "Run image"
docker run -d -p 8000:80 --name $API_CONTAINER $API_IMAGE
docker run -d -p 8000:80 -v $LOGS_DIR:/tmp/log --name $API_CONTAINER $API_IMAGE
stop_on_error $? "Docker run failed"
from django.contrib import admin
from logs_viewer.models import LogViewer, LoggedApplication
class LogViewerInline(admin.TabularInline):
model = LogViewer
extra = 2
class LoggedApplicationAdmin(admin.ModelAdmin):
inlines = [LogViewerInline]
admin.site.register(LoggedApplication, LoggedApplicationAdmin)
\ No newline at end of file
# -*- coding: utf-8 -*-
# Generated by Django 1.9.6 on 2016-06-03 21:50
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='LogViewer',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('path', models.CharField(max_length=300)),
('name', models.CharField(max_length=80)),
],
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.6 on 2016-06-04 08:50
from __future__ import unicode_literals
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('logs_viewer', '0001_initial'),
]
operations = [
migrations.CreateModel(
name='LoggedApplication',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=80)),
],
),
migrations.AddField(
model_name='logviewer',
name='application',
field=models.ForeignKey(default=None, on_delete=django.db.models.deletion.CASCADE, to='logs_viewer.LoggedApplication'),
preserve_default=False,
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.6 on 2016-06-04 09:09
from __future__ import unicode_literals
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('logs_viewer', '0002_auto_20160604_0850'),
]
operations = [
migrations.AlterField(
model_name='logviewer',
name='application',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='logs', to='logs_viewer.LoggedApplication'),
),
]
from django.db import models
class LoggedApplication(models.Model):
name = models.CharField(blank=False, max_length=80)
class LogViewer(models.Model):
application = models.ForeignKey('LoggedApplication', on_delete=models.CASCADE, related_name='logs')
path = models.CharField(blank=False, max_length=300)
name = models.CharField(blank=False, max_length=80)
def set_content(self):
f = open(self.path, 'r')
self.content = list(f)
\ No newline at end of file
......@@ -29,6 +29,7 @@ INSTALLED_APPS = (
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'logs_viewer',
)
MIDDLEWARE_CLASSES = (
......@@ -40,7 +41,6 @@ MIDDLEWARE_CLASSES = (
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'django.middleware.security.SecurityMiddleware',
'corsheaders.middleware.CorsMiddleware',
)
ROOT_URLCONF = 'logs_viewer.urls'
......
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" integrity="sha384-1q8mTJOASx8j1Au+a5WDVnPi2lkFfwwEAa8hDDdjZlpLegxhjVME1fgjWPGmkzs7" crossorigin="anonymous">
</head>
<body>
<nav class="navbar navbar-default">
<div class="container-fluid">
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="/">LogsViewer</a>
</div>
<!-- Collect the nav links, forms, and other content for toggling -->
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
<ul class="nav navbar-nav navbar-right">
<li><a href="/admin">Admin</a></li>
<li><a href="#">Logout</a></li>
</ul>
</div><!-- /.navbar-collapse -->
</div>
</nav>
<div class="container-fluid">
{% block content %}
{% endblock %}
</div>
</body>
</html>
\ No newline at end of file
{% extends 'logs_viewer/base.html' %}
{% block content %}
<h1>{{ object.name}}</h1>
{% for log in logs %}
<div class="panel panel-default">
<div class="panel-heading">{{ log.path }}</div>
<div class="panel-body">
{% for line in log.content %}
<p>{{ line }}</p>
{% endfor %}
</div>
</div>
{% endfor %}
{% endblock content %}
\ No newline at end of file
{% extends 'logs_viewer/base.html' %}
{% block content %}
{% if logged_application %}
<ul>
{% for log_viewer in logged_application %}
<li><a href="{% url 'detail' log_viewer.id %}">{{ log_viewer.name }}</a></li>
{% endfor %}
</ul>
{% else %}
<p>No logs are available.</p>
{% endif %}
{% endblock content %}
\ No newline at end of file
......@@ -15,7 +15,13 @@ Including another URLconf
"""
from django.conf.urls import url
from django.contrib import admin
from . import views
app_name = 'logs_viewer'
urlpatterns = [
url(r'^$', views.IndexView.as_view(), name='index'),
url(r'^(?P<pk>[0-9]+)/$', views.DetailView.as_view(), name='detail'),
url(r'^admin/', admin.site.urls),
]
]
\ No newline at end of file
from django.views import generic
from .models import LogViewer, LoggedApplication
class IndexView(generic.ListView):
template_name = 'logs_viewer/index.html'
context_object_name = 'logged_application'
def get_queryset(self):
return LoggedApplication.objects.all()
class DetailView(generic.DetailView):
model = LoggedApplication
template_name = 'logs_viewer/detail.html'
def get(self, request, *args, **kwargs):
self.object = self.get_object()
context = self.get_context_data(object=self.object)
logs = self.object.logs.all()
for log in logs:
log.set_content()
context['logs'] = logs
return self.render_to_response(context)
\ No newline at end of file
......@@ -11,6 +11,6 @@ import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "project_name.settings")
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "logs_viewer.settings")
application = get_wsgi_application()
#!/bin/bash
sed "s|some-secret|$SECRET_KEY|" {{ project_name }}/local_settings_example.py | \
sed "s|some-secret|$SECRET_KEY|" logs_viewer/local_settings_example.py | \
sed "s|DB_ENGINE|$DB_ENGINE|" | \
sed "s|DB_NAME|$DB_NAME|" | \
sed "s|DB_HOST|$DB_HOST|" | \
sed "s|DB_PASSWD|$DB_PASSWD|" | \
sed "s|DB_USER|$DB_USER|" | \
sed "s|DB_PORT|$DB_PORT|" >> {{ project_name }}/local_settings.py
\ No newline at end of file
sed "s|DB_PORT|$DB_PORT|" >> logs_viewer/local_settings.py
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment