Compare commits
9 Commits
533a7993a9
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| efd30e9a28 | |||
| 7a64cfdf66 | |||
| 7c6114ec3c | |||
| 9de772b27d | |||
| b68f11b8cd | |||
| cbd779fd93 | |||
| e521bd0170 | |||
| f217b9d273 | |||
|
|
2e771aa18c |
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
*.swp
|
||||||
|
app/static
|
||||||
|
app/dashboard/migrations/
|
||||||
34
Dockerfile
Normal file
34
Dockerfile
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
### DEV ENV ###
|
||||||
|
FROM python:3.13.1-slim-bookworm AS app_dev
|
||||||
|
|
||||||
|
ARG APP_UID=1000
|
||||||
|
ARG APP_GID=1000
|
||||||
|
|
||||||
|
ENV PYTHONDONTWRITEBYTECODE 1
|
||||||
|
ENV PYTHONUNBUFFERED 1
|
||||||
|
|
||||||
|
WORKDIR /app/
|
||||||
|
|
||||||
|
RUN apt update && apt install -y procps less netcat-traditional libmariadb-dev-compat libmariadb-dev mariadb-client gcc nginx-light pkg-config
|
||||||
|
|
||||||
|
COPY ./docker/nginx/updatesdashboard.conf /etc/nginx/sites-enabled/updatesdashboard.conf
|
||||||
|
RUN rm -f /etc/nginx/sites-enabled/default
|
||||||
|
|
||||||
|
RUN addgroup --system gunicorn --gid ${APP_GID} && adduser --uid ${APP_UID} --system --disabled-login --group gunicorn
|
||||||
|
|
||||||
|
RUN pip install --upgrade pip
|
||||||
|
COPY ./app/requirements.txt .
|
||||||
|
RUN pip install -r requirements.txt
|
||||||
|
|
||||||
|
COPY ./docker/scripts/entrypoint.dev.sh /usr/local/bin/entrypoint
|
||||||
|
RUN chmod +x /usr/local/bin/entrypoint
|
||||||
|
|
||||||
|
COPY ./app/ .
|
||||||
|
COPY ./app/updatesdashboard/.env.dev ./updatesdashboard/.env
|
||||||
|
|
||||||
|
RUN python /app/manage.py makemigrations
|
||||||
|
RUN python /app/manage.py makemigrations dashboard
|
||||||
|
|
||||||
|
RUN rm -f ./updatesdashboard/.env
|
||||||
|
|
||||||
|
ENTRYPOINT ["/usr/local/bin/entrypoint","mysql","3306"]
|
||||||
64
README.md
64
README.md
@ -1,64 +0,0 @@
|
|||||||
# Updates Dashboard
|
|
||||||
|
|
||||||
## Summary
|
|
||||||
|
|
||||||
This is a tool to have a clear view of the which servers are outdated, and keep trace of the updates.
|
|
||||||
|
|
||||||
## Technical information
|
|
||||||
|
|
||||||
It runs with Django. The information are daily generated by an ansible playbook, which is not located in this repo (infrastructure/updates-dashboard-ansible).
|
|
||||||
|
|
||||||
## Install
|
|
||||||
|
|
||||||
Dependencies in case of Debian 10.
|
|
||||||
```
|
|
||||||
apt install python3-venv libmariadb-dev-compat libmariadb-dev mariadb-client python3-dev gcc
|
|
||||||
```
|
|
||||||
Following procedure to install the apps.
|
|
||||||
```
|
|
||||||
useradd -d /var/www/updates-dashboard/ -g www-data -M -s /bin/false www-updash
|
|
||||||
cd /var/www/
|
|
||||||
git clone git@gitlab.infolegale.net:infrastructure/updates-dashboard.git updates-dashboard
|
|
||||||
chown -R www-updash:www-data updates-dashboard
|
|
||||||
touch /var/log/gunicorn.log
|
|
||||||
chown www-updash:www-data /var/log/gunicorn.log
|
|
||||||
cd updates-dashboard
|
|
||||||
python3 -m venv updash-venv
|
|
||||||
source updash-venv/bin/activate
|
|
||||||
(updash-venv) pip install -r requirements.txt
|
|
||||||
mkdir results results-packages
|
|
||||||
cp defaults/settings_local.py updatesdashboard/
|
|
||||||
cp defaults/gunicorn.service /etc/systemd/system/
|
|
||||||
cp defaults/updates-dashboard.conf /etc/nginx/sites-available
|
|
||||||
cd /etc/nginx/sites-enabled
|
|
||||||
ln -s /etc/nginx/sites-avaiable/updates-dashboard.conf .
|
|
||||||
```
|
|
||||||
* Set `settings_local.py` with correct values
|
|
||||||
* Set `gunicorn.service` with correct values
|
|
||||||
* Set `updates-dashboard.conf` with correct values
|
|
||||||
```shell
|
|
||||||
systemctl daemon-reload
|
|
||||||
systemctl enable gunicorn.service
|
|
||||||
nginx -t
|
|
||||||
systemctl reload nginx
|
|
||||||
```
|
|
||||||
To initialize the project:
|
|
||||||
```shell
|
|
||||||
(updash-venv) ./manage.py makemigrations
|
|
||||||
(updash-venv) ./manage.py makemigrations dashboard
|
|
||||||
(updash-venv) ./manage.py collectstatic
|
|
||||||
(updash-venv) ./manage.py migrate
|
|
||||||
(updash-venv) ./manage.py loaddata dashboard/fixtures/os.yaml
|
|
||||||
(updash-venv) ./manage.py loaddata dashboard/fixtures/teams.yaml
|
|
||||||
```
|
|
||||||
Vérifier les flux de mise à jour des données. Ansible->Dashboard
|
|
||||||
Vérifier le sql mode de la base de données
|
|
||||||
```shell
|
|
||||||
set @@global.sql_mode='NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
|
|
||||||
```
|
|
||||||
|
|
||||||
## TODO
|
|
||||||
|
|
||||||
* playbook to install via ansible ?
|
|
||||||
* playbook to update via ansible ?
|
|
||||||
* buttons should be 'previous / next results' instead of 'previous / next day'
|
|
||||||
@ -1,5 +1,5 @@
|
|||||||
from django.contrib import admin
|
from django.contrib import admin
|
||||||
from .models import Os, ServerStatus, Server, PackageStatus, Team
|
from .models import Os, ServerStatus, Server, PackageStatus
|
||||||
|
|
||||||
|
|
||||||
class OsAdmin(admin.ModelAdmin):
|
class OsAdmin(admin.ModelAdmin):
|
||||||
@ -10,4 +10,3 @@ admin.site.register(Os, OsAdmin)
|
|||||||
admin.site.register(ServerStatus)
|
admin.site.register(ServerStatus)
|
||||||
admin.site.register(PackageStatus)
|
admin.site.register(PackageStatus)
|
||||||
admin.site.register(Server)
|
admin.site.register(Server)
|
||||||
admin.site.register(Team)
|
|
||||||
@ -72,6 +72,13 @@
|
|||||||
version: '11',
|
version: '11',
|
||||||
end_of_support: 2026-06-30
|
end_of_support: 2026-06-30
|
||||||
}
|
}
|
||||||
|
- model: dashboard.os
|
||||||
|
pk: null
|
||||||
|
fields: {
|
||||||
|
distribution: Debian,
|
||||||
|
version: '12',
|
||||||
|
end_of_support: 2028-06-30
|
||||||
|
}
|
||||||
|
|
||||||
# Ubuntu Server
|
# Ubuntu Server
|
||||||
- model: dashboard.os
|
- model: dashboard.os
|
||||||
@ -207,6 +214,13 @@
|
|||||||
version: '22.04',
|
version: '22.04',
|
||||||
end_of_support: 2027-04-01
|
end_of_support: 2027-04-01
|
||||||
}
|
}
|
||||||
|
- model: dashboard.os
|
||||||
|
pk: null
|
||||||
|
fields: {
|
||||||
|
distribution: Ubuntu,
|
||||||
|
version: '24.04',
|
||||||
|
end_of_support: 2029-04-01
|
||||||
|
}
|
||||||
|
|
||||||
# CentOS
|
# CentOS
|
||||||
- model: dashboard.os
|
- model: dashboard.os
|
||||||
@ -32,32 +32,9 @@ class Os(models.Model):
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
class Group(models.Model):
|
|
||||||
name = models.CharField(max_length=50, unique=True)
|
|
||||||
full_name = models.CharField(max_length=50, null=True)
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
if self.full_name:
|
|
||||||
return self.full_name
|
|
||||||
else:
|
|
||||||
return self.name
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class Team(models.Model):
|
|
||||||
name = models.CharField(max_length=20)
|
|
||||||
color = models.CharField(max_length=20, unique=True)
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
return self.name
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class Server(models.Model):
|
class Server(models.Model):
|
||||||
hostname = models.CharField(max_length=200, unique=True)
|
hostname = models.CharField(max_length=200, unique=True)
|
||||||
os = models.ForeignKey(Os, null=True, related_name="servers", on_delete=models.SET_NULL)
|
os = models.ForeignKey(Os, null=True, related_name="servers", on_delete=models.SET_NULL)
|
||||||
group = models.ForeignKey(Group, null=True, blank=True, related_name="groups", on_delete=models.SET_NULL)
|
|
||||||
team = models.ForeignKey(Team, null=True, related_name="teams", on_delete=models.SET_NULL)
|
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return self.hostname
|
return self.hostname
|
||||||
|
Before Width: | Height: | Size: 280 KiB After Width: | Height: | Size: 280 KiB |
|
Before Width: | Height: | Size: 106 KiB After Width: | Height: | Size: 106 KiB |
|
Before Width: | Height: | Size: 170 KiB After Width: | Height: | Size: 170 KiB |
@ -20,7 +20,7 @@
|
|||||||
<table id="os-list" class="table table-bordered table-hover table-striped">
|
<table id="os-list" class="table table-bordered table-hover table-striped">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th>Hostname</th>
|
<th>Distribution</th>
|
||||||
<th>Number</th>
|
<th>Number</th>
|
||||||
<th>Percentage</th>
|
<th>Percentage</th>
|
||||||
</tr>
|
</tr>
|
||||||
@ -26,7 +26,7 @@
|
|||||||
<!-- Navigation -->
|
<!-- Navigation -->
|
||||||
<nav class="navbar navbar-inverse navbar-fixed-top" role="navigation">
|
<nav class="navbar navbar-inverse navbar-fixed-top" role="navigation">
|
||||||
<div class="navbar-header">
|
<div class="navbar-header">
|
||||||
<a class="navbar-brand" href="{% url 'index' %}">Infolegale - Servers information</a>
|
<a class="navbar-brand" href="{% url 'index' %}">Hyrule - Servers information</a>
|
||||||
</div>
|
</div>
|
||||||
<div class="nav navbar-right top-nav">
|
<div class="nav navbar-right top-nav">
|
||||||
<!-- <button class="btn btn-lg btn-danger disabled">Confidential information</button> -->
|
<!-- <button class="btn btn-lg btn-danger disabled">Confidential information</button> -->
|
||||||
@ -31,7 +31,7 @@
|
|||||||
<!-- Navigation -->
|
<!-- Navigation -->
|
||||||
<nav class="navbar navbar-inverse navbar-fixed-top" role="navigation">
|
<nav class="navbar navbar-inverse navbar-fixed-top" role="navigation">
|
||||||
<div class="navbar-header">
|
<div class="navbar-header">
|
||||||
<a class="navbar-brand" href="{% url 'index' %}">Infolegale - Servers Informations</a>
|
<a class="navbar-brand" href="{% url 'index' %}">Hyrule - Servers Informations</a>
|
||||||
</div>
|
</div>
|
||||||
<div class="nav navbar-right top-nav">
|
<div class="nav navbar-right top-nav">
|
||||||
<!-- <button class="btn btn-lg btn-danger disabled">Confidential information</button> -->
|
<!-- <button class="btn btn-lg btn-danger disabled">Confidential information</button> -->
|
||||||
@ -8,7 +8,7 @@ from . import views
|
|||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
# home
|
# home
|
||||||
re_path(r'^/?$',
|
re_path(r'^$',
|
||||||
views.index,
|
views.index,
|
||||||
name='index'),
|
name='index'),
|
||||||
|
|
||||||
@ -19,12 +19,6 @@ urlpatterns = [
|
|||||||
re_path(r'^server-list/(?P<year>[0-9]{4})/(?P<month>[0-9]{1,2})/(?P<day>[0-9]{1,2})/?$',
|
re_path(r'^server-list/(?P<year>[0-9]{4})/(?P<month>[0-9]{1,2})/(?P<day>[0-9]{1,2})/?$',
|
||||||
views.server_list,
|
views.server_list,
|
||||||
name='server-list-by-date'),
|
name='server-list-by-date'),
|
||||||
re_path(r'^server-list/(?P<group>[a-z0-9\-_]*)/(?P<year>[0-9]{4})/(?P<month>[0-9]{1,2})/(?P<day>[0-9]{1,2})/?$',
|
|
||||||
views.server_list,
|
|
||||||
name='server-list-by-group'),
|
|
||||||
re_path(r'^server-list/team/(?P<team>[a-z]*)/(?P<year>[0-9]{4})/(?P<month>[0-9]{1,2})/(?P<day>[0-9]{1,2})/?$',
|
|
||||||
views.server_list,
|
|
||||||
name='server-list-by-team'),
|
|
||||||
|
|
||||||
# package list
|
# package list
|
||||||
re_path(r'^packages/?$',
|
re_path(r'^packages/?$',
|
||||||
@ -66,9 +60,9 @@ urlpatterns = [
|
|||||||
re_path(r'^manage/upload_csv_results',
|
re_path(r'^manage/upload_csv_results',
|
||||||
views.upload_csv_results,
|
views.upload_csv_results,
|
||||||
name='upload_csv_results'),
|
name='upload_csv_results'),
|
||||||
# re_path(r'^manage/update-groups/?$',
|
re_path(r'^manage-packages/upload_csv_results_packages',
|
||||||
# views.update_groups,
|
views.upload_csv_results_packages,
|
||||||
# name='update_groups'),
|
name='upload_csv_results_packages'),
|
||||||
|
|
||||||
# manage packages
|
# manage packages
|
||||||
re_path(r'^manage-packages/?$',
|
re_path(r'^manage-packages/?$',
|
||||||
@ -16,7 +16,7 @@ from django.core.cache import cache
|
|||||||
from django.db import IntegrityError
|
from django.db import IntegrityError
|
||||||
from django.contrib.auth.decorators import login_required
|
from django.contrib.auth.decorators import login_required
|
||||||
# project
|
# project
|
||||||
from .models import Os, Group, Server, ServerStatus, PackageStatus, Team, Document_Servers, Document_Packages
|
from .models import Os, Server, ServerStatus, PackageStatus, Document_Servers, Document_Packages
|
||||||
from .forms import DocumentForm
|
from .forms import DocumentForm
|
||||||
|
|
||||||
|
|
||||||
@ -36,7 +36,7 @@ def index(request):
|
|||||||
## -----------------------------------------------------------------------------
|
## -----------------------------------------------------------------------------
|
||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
def server_list(request, year=None, month=None, day=None, group=None, team=None):
|
def server_list(request, year=None, month=None, day=None):
|
||||||
# TODO: use date.today?
|
# TODO: use date.today?
|
||||||
now = datetime.now()
|
now = datetime.now()
|
||||||
if not year or not month or not day:
|
if not year or not month or not day:
|
||||||
@ -64,24 +64,11 @@ def server_list(request, year=None, month=None, day=None, group=None, team=None)
|
|||||||
next_result_date = next_result.date
|
next_result_date = next_result.date
|
||||||
|
|
||||||
results_date = current_date
|
results_date = current_date
|
||||||
if group:
|
# status_list = ServerStatus.objects.filter(date=current_date).order_by('server__hostname')
|
||||||
group = get_object_or_404(Group, name=group)
|
status_list = ServerStatus.objects.filter(date=current_date).order_by('server__hostname').select_related('server', 'server__os')
|
||||||
status_list = ServerStatus.objects.filter(date=current_date, server__group=group).order_by('server__hostname')
|
if previous_result and not status_list:
|
||||||
if previous_result and not status_list:
|
status_list = ServerStatus.objects.filter(date=previous_result_date).order_by('server__hostname').select_related('server', 'server__os')
|
||||||
status_list = ServerStatus.objects.filter(date=previous_result_date, server__group=group).order_by('server__hostname')
|
results_date = previous_result_date
|
||||||
results_date = previous_result_date
|
|
||||||
elif team:
|
|
||||||
team = get_object_or_404(Team, color=team)
|
|
||||||
status_list = ServerStatus.objects.filter(date=current_date, server__team=team).order_by('server__hostname')
|
|
||||||
if previous_result and not status_list:
|
|
||||||
status_list = ServerStatus.objects.filter(date=previous_result_date, server__team=team).order_by('server__hostname')
|
|
||||||
results_date = previous_result_date
|
|
||||||
else:
|
|
||||||
# status_list = ServerStatus.objects.filter(date=current_date).order_by('server__hostname')
|
|
||||||
status_list = ServerStatus.objects.filter(date=current_date).order_by('server__hostname').select_related('server', 'server__group', 'server__os')
|
|
||||||
if previous_result and not status_list:
|
|
||||||
status_list = ServerStatus.objects.filter(date=previous_result_date).order_by('server__hostname').select_related('server', 'server__group', 'server__os')
|
|
||||||
results_date = previous_result_date
|
|
||||||
|
|
||||||
if not status_list:
|
if not status_list:
|
||||||
return render(request, 'generic.html', {
|
return render(request, 'generic.html', {
|
||||||
@ -90,7 +77,6 @@ def server_list(request, year=None, month=None, day=None, group=None, team=None)
|
|||||||
|
|
||||||
return render(request, 'server-list.html',
|
return render(request, 'server-list.html',
|
||||||
{
|
{
|
||||||
'group': group,
|
|
||||||
'status_list': status_list,
|
'status_list': status_list,
|
||||||
'results_date': results_date,
|
'results_date': results_date,
|
||||||
'previous_result_date': previous_result_date,
|
'previous_result_date': previous_result_date,
|
||||||
@ -332,7 +318,6 @@ def purge_all(request):
|
|||||||
ServerStatus.objects.all().delete()
|
ServerStatus.objects.all().delete()
|
||||||
Os.objects.all().delete()
|
Os.objects.all().delete()
|
||||||
PackageStatus.objects.all().delete()
|
PackageStatus.objects.all().delete()
|
||||||
Group.objects.all().delete()
|
|
||||||
|
|
||||||
content = "<div class='alert alert-danger' role='alert'>Everything has been purged.</div>"
|
content = "<div class='alert alert-danger' role='alert'>Everything has been purged.</div>"
|
||||||
|
|
||||||
@ -590,7 +575,7 @@ def manage_packages(request):
|
|||||||
|
|
||||||
## -----------------------------------------------------------------------------
|
## -----------------------------------------------------------------------------
|
||||||
## UPLOAD FILE
|
## UPLOAD FILE
|
||||||
## Upload csv file
|
## Upload csv file for servers informations
|
||||||
## -----------------------------------------------------------------------------
|
## -----------------------------------------------------------------------------
|
||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
@ -616,3 +601,32 @@ def upload_csv_results(request):
|
|||||||
# Render list page with the documents and the form
|
# Render list page with the documents and the form
|
||||||
context = {'documents': documents, 'form': form, 'message': message}
|
context = {'documents': documents, 'form': form, 'message': message}
|
||||||
return render(request, 'manage.html', context)
|
return render(request, 'manage.html', context)
|
||||||
|
|
||||||
|
## -----------------------------------------------------------------------------
|
||||||
|
## UPLOAD FILE
|
||||||
|
## Upload csv file for packages informations
|
||||||
|
## -----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
@login_required
|
||||||
|
def upload_csv_results_packages(request):
|
||||||
|
message = 'File must be name YYYY-MM-DD.csv'
|
||||||
|
# Handle file upload
|
||||||
|
if request.method == 'POST':
|
||||||
|
form = DocumentForm(request.POST, request.FILES)
|
||||||
|
if form.is_valid():
|
||||||
|
newdoc = Document_Packages(docfile=request.FILES['docfile'])
|
||||||
|
newdoc.save()
|
||||||
|
|
||||||
|
# Redirect to the document list after POST
|
||||||
|
return redirect('manage-packages')
|
||||||
|
else:
|
||||||
|
message = 'The form is not valid. Fix the following error:'
|
||||||
|
else:
|
||||||
|
form = DocumentForm() # An empty, unbound form
|
||||||
|
|
||||||
|
# Load documents for the list page
|
||||||
|
documents = Document_Packages.objects.all()
|
||||||
|
|
||||||
|
# Render list page with the documents and the form
|
||||||
|
context = {'documents': documents, 'form': form, 'message': message}
|
||||||
|
return render(request, 'manage-packages.html', context)
|
||||||
@ -37,37 +37,9 @@ INSTALLED_APPS_LOCAL = [
|
|||||||
|
|
||||||
# LDAP AUTH
|
# LDAP AUTH
|
||||||
AUTHENTICATION_BACKENDS = (
|
AUTHENTICATION_BACKENDS = (
|
||||||
'django_python3_ldap.auth.LDAPBackend',
|
|
||||||
'django.contrib.auth.backends.ModelBackend',
|
'django.contrib.auth.backends.ModelBackend',
|
||||||
)
|
)
|
||||||
LDAP_AUTH_URL = "ldaps://SERVER:PORT"
|
|
||||||
LDAP_AUTH_USE_TLS = True
|
|
||||||
LDAP_AUTH_SEARCH_BASE = "ou=USERS,dc=MY,dc=ORG"
|
|
||||||
LDAP_AUTH_OBJECT_CLASS = "inetOrgPerson"
|
|
||||||
LDAP_AUTH_USER_FIELDS = {
|
|
||||||
"username": "uid",
|
|
||||||
"first_name": "givenName",
|
|
||||||
"last_name": "sn",
|
|
||||||
"email": "mail",
|
|
||||||
}
|
|
||||||
LDAP_AUTH_FORMAT_SEARCH_FILTERS = "dashboard.module.custom_format_search_filters"
|
|
||||||
LDAP_AUTH_CUSTOM_OBJECT_CLASS = "ACLASS"
|
|
||||||
LDAP_AUTH_CUSTOM_FILTERS = "(SOMEFIELD=SOMEVALUE)"
|
|
||||||
|
|
||||||
MIDDLEWARE_LOCAL = [
|
MIDDLEWARE_LOCAL = [
|
||||||
'debug_toolbar.middleware.DebugToolbarMiddleware',
|
'debug_toolbar.middleware.DebugToolbarMiddleware',
|
||||||
]
|
]
|
||||||
|
|
||||||
# Static files (CSS, JavaScript, Images)
|
|
||||||
# https://docs.djangoproject.com/en/1.10/howto/static-files/
|
|
||||||
|
|
||||||
STATIC_URL = '/static/'
|
|
||||||
STATIC_ROOT = os.path.join(BASE_DIR, './static')
|
|
||||||
|
|
||||||
# custom
|
|
||||||
RESULT_DIR = os.path.join(BASE_DIR, 'results')
|
|
||||||
RESULT_PACKAGES_DIR = os.path.join(BASE_DIR, 'results-packages')
|
|
||||||
INVENTORY_DIR = os.path.join(BASE_DIR, 'inventory')
|
|
||||||
|
|
||||||
LOGIN_URL = '/login'
|
|
||||||
LOGIN_REDIRECT_URL = 'index'
|
|
||||||
@ -3,6 +3,7 @@ Django
|
|||||||
django-extensions
|
django-extensions
|
||||||
gunicorn
|
gunicorn
|
||||||
django-debug-toolbar
|
django-debug-toolbar
|
||||||
|
django-environ
|
||||||
django-python3-ldap
|
django-python3-ldap
|
||||||
requests
|
requests
|
||||||
mysqlclient
|
mysqlclient
|
||||||
9
app/results/2022-08-17.csv
Normal file
9
app/results/2022-08-17.csv
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
server1;Debian;8;0;5
|
||||||
|
server2;Debian;9;0;9
|
||||||
|
server3;Debian;10;0;147
|
||||||
|
server4;Debian;11;0;147
|
||||||
|
server5;Ubuntu;20.04;0;308
|
||||||
|
server6;Ubuntu;22.04;0;147
|
||||||
|
server7;OpenBSD;6.4;3;119
|
||||||
|
server8;Ubuntu;18.04;0;28
|
||||||
|
server9;Debian;12;0;147
|
||||||
|
10
app/updatesdashboard/.env.dev
Normal file
10
app/updatesdashboard/.env.dev
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
GUNICORN_CMD_ARGS=--bind=127.0.0.1:3001 --workers=3 --timeout=300 --error-logfile=/var/log/gunicorn-error.log
|
||||||
|
DJANGO_SUPERUSER_PASSWORD=admin
|
||||||
|
SECRET_KEY=uv88xpv8kb2r6j7rubtnhkps
|
||||||
|
DATABASE_NAME=infra_dashboard
|
||||||
|
DATABASE_USER=infra_dashboard
|
||||||
|
DATABASE_PASSWORD=sebisdown
|
||||||
|
DATABASE_HOST=mysql
|
||||||
|
DATABASE_PORT=3306
|
||||||
|
DJANGO_ALLOWED_HOSTS=localhost 127.0.0.1
|
||||||
|
DJANGO_CSRF_TRUSTED_ORIGINS=http://localhost
|
||||||
@ -10,11 +10,23 @@ For the full list of settings and their values, see
|
|||||||
https://docs.djangoproject.com/en/1.10/ref/settings/
|
https://docs.djangoproject.com/en/1.10/ref/settings/
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
import os
|
||||||
from .settings_local import *
|
from .settings_local import *
|
||||||
|
|
||||||
|
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
||||||
|
|
||||||
|
# SECURITY WARNING: don't run with debug turned on in production!
|
||||||
|
DEBUG = True
|
||||||
|
|
||||||
|
# for debug_toolbar
|
||||||
|
INTERNAL_IPS = ['127.0.0.1', ]
|
||||||
|
DEBUG_TOOLBAR = True
|
||||||
|
|
||||||
# Application definition
|
# Application definition
|
||||||
|
INSTALLED_APPS_LOCAL = [
|
||||||
|
'debug_toolbar',
|
||||||
|
# 'django_python3_ldap',
|
||||||
|
]
|
||||||
INSTALLED_APPS = [
|
INSTALLED_APPS = [
|
||||||
'dashboard.apps.DashboardConfig',
|
'dashboard.apps.DashboardConfig',
|
||||||
'django.contrib.admin',
|
'django.contrib.admin',
|
||||||
@ -26,6 +38,10 @@ INSTALLED_APPS = [
|
|||||||
'django_extensions',
|
'django_extensions',
|
||||||
] + INSTALLED_APPS_LOCAL
|
] + INSTALLED_APPS_LOCAL
|
||||||
|
|
||||||
|
MIDDLEWARE_LOCAL = [
|
||||||
|
'debug_toolbar.middleware.DebugToolbarMiddleware',
|
||||||
|
]
|
||||||
|
|
||||||
MIDDLEWARE = MIDDLEWARE_LOCAL + [
|
MIDDLEWARE = MIDDLEWARE_LOCAL + [
|
||||||
'django.middleware.security.SecurityMiddleware',
|
'django.middleware.security.SecurityMiddleware',
|
||||||
'django.contrib.sessions.middleware.SessionMiddleware',
|
'django.contrib.sessions.middleware.SessionMiddleware',
|
||||||
@ -74,16 +90,30 @@ AUTH_PASSWORD_VALIDATORS = [
|
|||||||
},
|
},
|
||||||
]
|
]
|
||||||
|
|
||||||
|
# Static files (CSS, JavaScript, Images)
|
||||||
|
# https://docs.djangoproject.com/en/1.10/howto/static-files/
|
||||||
|
|
||||||
|
STATIC_URL = '/static/'
|
||||||
|
STATIC_ROOT = os.path.join(BASE_DIR, './static')
|
||||||
|
|
||||||
|
# custom
|
||||||
|
RESULT_DIR = os.path.join(BASE_DIR, 'results')
|
||||||
|
RESULT_PACKAGES_DIR = os.path.join(BASE_DIR, 'results-packages')
|
||||||
|
INVENTORY_DIR = os.path.join(BASE_DIR, 'inventory')
|
||||||
|
|
||||||
|
LOGIN_URL = '/login'
|
||||||
|
LOGIN_REDIRECT_URL = 'index'
|
||||||
|
|
||||||
|
# for debug_toolbar
|
||||||
|
INTERNAL_IPS = ['127.0.0.1', ]
|
||||||
|
DEBUG_TOOLBAR = True
|
||||||
|
|
||||||
# Internationalization
|
# Internationalization
|
||||||
# https://docs.djangoproject.com/en/1.10/topics/i18n/
|
# https://docs.djangoproject.com/en/1.10/topics/i18n/
|
||||||
|
|
||||||
LANGUAGE_CODE = 'en-us'
|
LANGUAGE_CODE = 'en-us'
|
||||||
|
|
||||||
TIME_ZONE = 'UTC'
|
TIME_ZONE = 'UTC'
|
||||||
|
|
||||||
USE_I18N = True
|
USE_I18N = True
|
||||||
|
|
||||||
USE_L10N = True
|
USE_L10N = True
|
||||||
|
|
||||||
USE_TZ = True
|
USE_TZ = True
|
||||||
|
|
||||||
|
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
|
||||||
19
app/updatesdashboard/settings_local.py
Normal file
19
app/updatesdashboard/settings_local.py
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
import environ
|
||||||
|
|
||||||
|
env = environ.Env()
|
||||||
|
# reading .env file
|
||||||
|
environ.Env.read_env()
|
||||||
|
|
||||||
|
ALLOWED_HOSTS = env("DJANGO_ALLOWED_HOSTS").split(" ")
|
||||||
|
CSRF_TRUSTED_ORIGINS = env("DJANGO_CSRF_TRUSTED_ORIGINS").split(" ")
|
||||||
|
SECRET_KEY = env("SECRET_KEY")
|
||||||
|
DATABASES = {
|
||||||
|
'default': {
|
||||||
|
'ENGINE': 'django.db.backends.mysql',
|
||||||
|
'NAME': env("DATABASE_NAME"),
|
||||||
|
'USER': env("DATABASE_USER"),
|
||||||
|
'PASSWORD': env("DATABASE_PASSWORD"),
|
||||||
|
'HOST': env("DATABASE_HOST"),
|
||||||
|
'PORT': int(env("DATABASE_PORT")),
|
||||||
|
}
|
||||||
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user