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 ...@@ -7,7 +7,7 @@ COPY requirements.txt /app
RUN mod_wsgi-docker-build RUN mod_wsgi-docker-build
COPY manage.py /app COPY manage.py /app
COPY {{ project_name }} /app/{{ project_name }}/ COPY logs_viewer /app/logs_viewer/
COPY .coveragerc /app COPY .coveragerc /app
RUN python manage.py collectstatic --noinput RUN python manage.py collectstatic --noinput
...@@ -16,4 +16,4 @@ EXPOSE 80 ...@@ -16,4 +16,4 @@ EXPOSE 80
ENTRYPOINT [ "mod_wsgi-docker-start" ] ENTRYPOINT [ "mod_wsgi-docker-start" ]
CMD [ "--url-alias", "/static", "static", "{{ project_name }}/wsgi.py" ] CMD [ "--url-alias", "/static", "static", "logs_viewer/wsgi.py" ]
\ No newline at end of file \ No newline at end of file
{{ project_name }} logs_viewer
================== ===========
\ No newline at end of file
This is a simple application to display logs fieles in a web page.
\ No newline at end of file
#!/bin/bash #!/bin/bash
API_IMAGE="{{ project_name | lower }}" API_IMAGE="logs-viewer-img"
API_CONTAINER="{{ project_name | lower }}" API_CONTAINER="logs-viewer"
API_TEST_CONTAINER="{{ project_name | lower }}-test" API_TEST_CONTAINER="logs-viewer-test"
function log_info { function log_info {
echo -e "\e[44m$1\e[49m" echo -e "\e[44m$1\e[49m"
...@@ -55,5 +55,5 @@ remove_container "$API_TEST_CONTAINER" ...@@ -55,5 +55,5 @@ remove_container "$API_TEST_CONTAINER"
remove_container "$API_CONTAINER" remove_container "$API_CONTAINER"
log_info "Run image" 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" 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 = ( ...@@ -29,6 +29,7 @@ INSTALLED_APPS = (
'django.contrib.sessions', 'django.contrib.sessions',
'django.contrib.messages', 'django.contrib.messages',
'django.contrib.staticfiles', 'django.contrib.staticfiles',
'logs_viewer',
) )
MIDDLEWARE_CLASSES = ( MIDDLEWARE_CLASSES = (
...@@ -40,7 +41,6 @@ MIDDLEWARE_CLASSES = ( ...@@ -40,7 +41,6 @@ MIDDLEWARE_CLASSES = (
'django.contrib.messages.middleware.MessageMiddleware', 'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware',
'django.middleware.security.SecurityMiddleware', 'django.middleware.security.SecurityMiddleware',
'corsheaders.middleware.CorsMiddleware',
) )
ROOT_URLCONF = 'logs_viewer.urls' 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 ...@@ -15,7 +15,13 @@ Including another URLconf
""" """
from django.conf.urls import url from django.conf.urls import url
from django.contrib import admin from django.contrib import admin
from . import views
app_name = 'logs_viewer'
urlpatterns = [ 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), 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 ...@@ -11,6 +11,6 @@ import os
from django.core.wsgi import get_wsgi_application 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() application = get_wsgi_application()
#!/bin/bash #!/bin/bash
sed "s|some-secret|$SECRET_KEY|" logs_viewer/local_settings_example.py | \
sed "s|some-secret|$SECRET_KEY|" {{ project_name }}/local_settings_example.py | \
sed "s|DB_ENGINE|$DB_ENGINE|" | \ sed "s|DB_ENGINE|$DB_ENGINE|" | \
sed "s|DB_NAME|$DB_NAME|" | \ sed "s|DB_NAME|$DB_NAME|" | \
sed "s|DB_HOST|$DB_HOST|" | \ sed "s|DB_HOST|$DB_HOST|" | \
sed "s|DB_PASSWD|$DB_PASSWD|" | \ sed "s|DB_PASSWD|$DB_PASSWD|" | \
sed "s|DB_USER|$DB_USER|" | \ sed "s|DB_USER|$DB_USER|" | \
sed "s|DB_PORT|$DB_PORT|" >> {{ project_name }}/local_settings.py sed "s|DB_PORT|$DB_PORT|" >> logs_viewer/local_settings.py
\ No newline at end of file \ 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