Compare commits
	
		
			4 Commits
		
	
	
		
			b027114b6d
			...
			b944d58943
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| b944d58943 | |||
| 4f288f04ff | |||
| 2f3c112e71 | |||
| 3c9c7fcbf3 | 
							
								
								
									
										3
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @ -160,3 +160,6 @@ cython_debug/ | |||||||
| #  option (not recommended) you can uncomment the following to ignore the entire idea folder. | #  option (not recommended) you can uncomment the following to ignore the entire idea folder. | ||||||
| #.idea/ | #.idea/ | ||||||
| 
 | 
 | ||||||
|  | # Project specific | ||||||
|  | **/archives | ||||||
|  | **/media | ||||||
|  | |||||||
							
								
								
									
										0
									
								
								logs_collector/collector/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								logs_collector/collector/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										21
									
								
								logs_collector/collector/admin.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								logs_collector/collector/admin.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,21 @@ | |||||||
|  | from django.contrib import admin | ||||||
|  | 
 | ||||||
|  | from .models import Platform, Archive, Ticket | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # Register your models here. | ||||||
|  | class PlatformAdmin(admin.ModelAdmin): | ||||||
|  |     pass | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class TicketAdmin(admin.ModelAdmin): | ||||||
|  |     pass | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class ArchiveAdmin(admin.ModelAdmin): | ||||||
|  |     pass | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | admin.site.register(Platform, PlatformAdmin) | ||||||
|  | admin.site.register(Ticket, TicketAdmin) | ||||||
|  | admin.site.register(Archive, ArchiveAdmin) | ||||||
							
								
								
									
										6
									
								
								logs_collector/collector/apps.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								logs_collector/collector/apps.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,6 @@ | |||||||
|  | from django.apps import AppConfig | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class CollectorConfig(AppConfig): | ||||||
|  |     default_auto_field = 'django.db.models.BigAutoField' | ||||||
|  |     name = 'collector' | ||||||
							
								
								
									
										52
									
								
								logs_collector/collector/migrations/0001_initial.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								logs_collector/collector/migrations/0001_initial.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,52 @@ | |||||||
|  | # Generated by Django 4.2 on 2023-07-27 02:04 | ||||||
|  | 
 | ||||||
|  | import collector.models | ||||||
|  | from django.conf import settings | ||||||
|  | import django.core.files.storage | ||||||
|  | from django.db import migrations, models | ||||||
|  | import django.db.models.deletion | ||||||
|  | import pathlib | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class Migration(migrations.Migration): | ||||||
|  | 
 | ||||||
|  |     initial = True | ||||||
|  | 
 | ||||||
|  |     dependencies = [ | ||||||
|  |         migrations.swappable_dependency(settings.AUTH_USER_MODEL), | ||||||
|  |     ] | ||||||
|  | 
 | ||||||
|  |     operations = [ | ||||||
|  |         migrations.CreateModel( | ||||||
|  |             name='Platform', | ||||||
|  |             fields=[ | ||||||
|  |                 ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), | ||||||
|  |                 ('name', models.CharField(max_length=20)), | ||||||
|  |             ], | ||||||
|  |         ), | ||||||
|  |         migrations.CreateModel( | ||||||
|  |             name='Ticket', | ||||||
|  |             fields=[ | ||||||
|  |                 ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), | ||||||
|  |                 ('number', models.IntegerField()), | ||||||
|  |                 ('resolved', models.BooleanField(default=False)), | ||||||
|  |                 ('note', models.TextField(blank=True)), | ||||||
|  |                 ('time_create', models.DateTimeField(auto_now_add=True)), | ||||||
|  |                 ('time_update', models.DateTimeField(auto_now=True)), | ||||||
|  |                 ('platform', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='collector.platform')), | ||||||
|  |                 ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), | ||||||
|  |             ], | ||||||
|  |         ), | ||||||
|  |         migrations.CreateModel( | ||||||
|  |             name='Archive', | ||||||
|  |             fields=[ | ||||||
|  |                 ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), | ||||||
|  |                 ('file', models.FileField(blank=True, null=True, storage=django.core.files.storage.FileSystemStorage(base_url='/archives/', location=pathlib.PurePosixPath('/home/stepan/Documents/Dev/ISPsystem/logs-collector/logs_collector/archives')), upload_to=collector.models.logs_dir_path)), | ||||||
|  |                 ('sha1', models.CharField(editable=False, max_length=1024)), | ||||||
|  |                 ('time_create', models.DateTimeField(auto_now_add=True)), | ||||||
|  |                 ('time_update', models.DateTimeField(auto_now=True)), | ||||||
|  |                 ('ticket', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='collector.ticket')), | ||||||
|  |                 ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), | ||||||
|  |             ], | ||||||
|  |         ), | ||||||
|  |     ] | ||||||
							
								
								
									
										0
									
								
								logs_collector/collector/migrations/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								logs_collector/collector/migrations/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										69
									
								
								logs_collector/collector/models.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										69
									
								
								logs_collector/collector/models.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,69 @@ | |||||||
|  | import hashlib | ||||||
|  | from functools import partial | ||||||
|  | 
 | ||||||
|  | from django.contrib.auth.models import User | ||||||
|  | from django.db import models | ||||||
|  | from django.conf import settings | ||||||
|  | from django.core.files.storage import FileSystemStorage | ||||||
|  | from django.db.models import FileField | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # Create a custom storage location, using a value from your settings file | ||||||
|  | sensitive_upload_storage = FileSystemStorage( | ||||||
|  |     location=settings.MEDIA_ROOT_FOR_SENSITIVE_FILES, | ||||||
|  |     base_url=settings.MEDIA_URL_FOR_SENSITIVE_FILES | ||||||
|  | ) | ||||||
|  | # ... and a file field that will use the custom storage | ||||||
|  | AuthenticatedFileField = partial(FileField, storage=sensitive_upload_storage) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def logs_dir_path(instance, filename): | ||||||
|  |     # file will be uploaded to | ||||||
|  |     # MEDIA_ROOT_FOR_SENSITIVE_FILES/<ticket>/<filename> | ||||||
|  |     return f'{instance.ticket}/{filename}' | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class Archive(models.Model): | ||||||
|  |     file = AuthenticatedFileField( | ||||||
|  |         upload_to=logs_dir_path, | ||||||
|  |         blank=True, | ||||||
|  |         null=True | ||||||
|  |     ) | ||||||
|  |     sha1 = models.CharField(max_length=1024, editable=False) | ||||||
|  |     time_create = models.DateTimeField(auto_now_add=True) | ||||||
|  |     time_update = models.DateTimeField(auto_now=True) | ||||||
|  |     ticket = models.ForeignKey('Ticket', on_delete=models.CASCADE) | ||||||
|  |     user = models.ForeignKey(User, on_delete=models.CASCADE) | ||||||
|  | 
 | ||||||
|  |     def save(self, *args, **kwargs): | ||||||
|  |         # calculate sha 1 hash sum and write sha1 field to db | ||||||
|  |         with self.file.open('rb') as f: | ||||||
|  |             sha1 = hashlib.sha1() | ||||||
|  |             for byte_block in iter(lambda: f.read(4096), b""): | ||||||
|  |                 sha1.update(byte_block) | ||||||
|  |             self.sha1 = sha1.hexdigest() | ||||||
|  |             # Call the "real" save() method | ||||||
|  |             super().save(*args, **kwargs) | ||||||
|  | 
 | ||||||
|  |     def __str__(self): | ||||||
|  |         return str(self.file) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class Platform(models.Model): | ||||||
|  |     name = models.CharField(max_length=20) | ||||||
|  | 
 | ||||||
|  |     def __str__(self): | ||||||
|  |         return self.name | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class Ticket(models.Model): | ||||||
|  |     number = models.IntegerField() | ||||||
|  |     resolved = models.BooleanField(default=False) | ||||||
|  |     note = models.TextField(blank=True) | ||||||
|  |     time_create = models.DateTimeField(auto_now_add=True) | ||||||
|  |     time_update = models.DateTimeField(auto_now=True) | ||||||
|  |     platform = models.ForeignKey('Platform', on_delete=models.CASCADE) | ||||||
|  |     user = models.ForeignKey(User, on_delete=models.CASCADE) | ||||||
|  | 
 | ||||||
|  |     def __str__(self): | ||||||
|  |         return str(self.number) | ||||||
							
								
								
									
										3
									
								
								logs_collector/collector/tests.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								logs_collector/collector/tests.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,3 @@ | |||||||
|  | from django.test import TestCase | ||||||
|  | 
 | ||||||
|  | # Create your tests here. | ||||||
							
								
								
									
										9
									
								
								logs_collector/collector/urls.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								logs_collector/collector/urls.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,9 @@ | |||||||
|  | from django.urls import path | ||||||
|  | from . import views | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | urlpatterns = [ | ||||||
|  |     path('', views.index, name='index',), | ||||||
|  |     path('test/<str:path>/', views.test_page, name='test_page'), | ||||||
|  |     path('archives/<ticket>/<archive>', views.download, name="download") | ||||||
|  | ] | ||||||
							
								
								
									
										0
									
								
								logs_collector/collector/utils.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								logs_collector/collector/utils.py
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										25
									
								
								logs_collector/collector/views.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								logs_collector/collector/views.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,25 @@ | |||||||
|  | # from django.shortcuts import render | ||||||
|  | from django.contrib.auth.decorators import login_required | ||||||
|  | from django.http import FileResponse, HttpResponse, Http404 | ||||||
|  | from .models import Archive | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # Create your views here. | ||||||
|  | # handles the url "/archives/{PATH}"". | ||||||
|  | @login_required | ||||||
|  | def download(request, ticket, file): | ||||||
|  |     path = f'{ticket}/{file}' | ||||||
|  |     try: | ||||||
|  |         file = Archive.objects.get(file=path) | ||||||
|  |     except Archive.DoesNotExist: | ||||||
|  |         return Http404 | ||||||
|  | 
 | ||||||
|  |     return FileResponse(file.file) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def index(request): | ||||||
|  |     return HttpResponse('<h1>Index Page</h1>') | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def test_page(request, path): | ||||||
|  |     return HttpResponse(f'<h1>{path} Page</h1>') | ||||||
							
								
								
									
										0
									
								
								logs_collector/logs_collector/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								logs_collector/logs_collector/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										16
									
								
								logs_collector/logs_collector/asgi.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								logs_collector/logs_collector/asgi.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,16 @@ | |||||||
|  | """ | ||||||
|  | ASGI config for logs_collector project. | ||||||
|  | 
 | ||||||
|  | It exposes the ASGI callable as a module-level variable named ``application``. | ||||||
|  | 
 | ||||||
|  | For more information on this file, see | ||||||
|  | https://docs.djangoproject.com/en/4.2/howto/deployment/asgi/ | ||||||
|  | """ | ||||||
|  | 
 | ||||||
|  | import os | ||||||
|  | 
 | ||||||
|  | from django.core.asgi import get_asgi_application | ||||||
|  | 
 | ||||||
|  | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'logs_collector.settings') | ||||||
|  | 
 | ||||||
|  | application = get_asgi_application() | ||||||
							
								
								
									
										128
									
								
								logs_collector/logs_collector/settings.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										128
									
								
								logs_collector/logs_collector/settings.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,128 @@ | |||||||
|  | import environ | ||||||
|  | from pathlib import Path | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | env = environ.Env( | ||||||
|  |     # set casting default value | ||||||
|  |     DEBUG=(bool, False) | ||||||
|  | ) | ||||||
|  | # Build paths inside the project like this: BASE_DIR / 'subdir'. | ||||||
|  | BASE_DIR = Path(__file__).resolve().parent.parent | ||||||
|  | 
 | ||||||
|  | environ.Env.read_env(BASE_DIR / '.env') | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # SECURITY WARNING: keep the secret key used in production secret! | ||||||
|  | SECRET_KEY = env('SECRET_KEY') | ||||||
|  | 
 | ||||||
|  | # SECURITY WARNING: don't run with debug turned on in production! | ||||||
|  | DEBUG = env('DEBUG') | ||||||
|  | 
 | ||||||
|  | ALLOWED_HOSTS = env.list("ALLOWED_HOSTS", default=["*"]) | ||||||
|  | 
 | ||||||
|  | # TODO: required for docker image | ||||||
|  | # CSRF_TRUSTED_ORIGINS = env.list("CSRF_TRUSTED_ORIGINS", default=["*"]) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # Application definition | ||||||
|  | 
 | ||||||
|  | INSTALLED_APPS = [ | ||||||
|  |     'django.contrib.admin', | ||||||
|  |     'django.contrib.auth', | ||||||
|  |     'django.contrib.contenttypes', | ||||||
|  |     'django.contrib.sessions', | ||||||
|  |     'django.contrib.messages', | ||||||
|  |     'django.contrib.staticfiles', | ||||||
|  |     'collector.apps.CollectorConfig',  # main app | ||||||
|  |     'rest_framework', | ||||||
|  |     'django_cleanup.apps.CleanupConfig',  # required bottom | ||||||
|  | ] | ||||||
|  | 
 | ||||||
|  | MIDDLEWARE = [ | ||||||
|  |     'django.middleware.security.SecurityMiddleware', | ||||||
|  |     'django.contrib.sessions.middleware.SessionMiddleware', | ||||||
|  |     'django.middleware.common.CommonMiddleware', | ||||||
|  |     'django.middleware.csrf.CsrfViewMiddleware', | ||||||
|  |     'django.contrib.auth.middleware.AuthenticationMiddleware', | ||||||
|  |     'django.contrib.messages.middleware.MessageMiddleware', | ||||||
|  |     'django.middleware.clickjacking.XFrameOptionsMiddleware', | ||||||
|  | ] | ||||||
|  | 
 | ||||||
|  | ROOT_URLCONF = 'logs_collector.urls' | ||||||
|  | 
 | ||||||
|  | TEMPLATES = [ | ||||||
|  |     { | ||||||
|  |         'BACKEND': 'django.template.backends.django.DjangoTemplates', | ||||||
|  |         'DIRS': [], | ||||||
|  |         'APP_DIRS': True, | ||||||
|  |         'OPTIONS': { | ||||||
|  |             'context_processors': [ | ||||||
|  |                 'django.template.context_processors.debug', | ||||||
|  |                 'django.template.context_processors.request', | ||||||
|  |                 'django.contrib.auth.context_processors.auth', | ||||||
|  |                 'django.contrib.messages.context_processors.messages', | ||||||
|  |             ], | ||||||
|  |         }, | ||||||
|  |     }, | ||||||
|  | ] | ||||||
|  | 
 | ||||||
|  | WSGI_APPLICATION = 'logs_collector.wsgi.application' | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # Database | ||||||
|  | # https://docs.djangoproject.com/en/4.2/ref/settings/#databases | ||||||
|  | 
 | ||||||
|  | DATABASES = { | ||||||
|  |     'default': env.db_url( | ||||||
|  |         'SQLITE_URL', | ||||||
|  |         default=f'sqlite:///{BASE_DIR / "db.sqlite3"}' | ||||||
|  |     ) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # Password validation | ||||||
|  | # https://docs.djangoproject.com/en/4.2/ref/settings/#auth-password-validators | ||||||
|  | 
 | ||||||
|  | AUTH_PASSWORD_VALIDATORS = [ | ||||||
|  |     { | ||||||
|  |         'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',  # noqa:E501 | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',  # noqa:E501 | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',  # noqa:E501 | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',  # noqa:E501 | ||||||
|  |     }, | ||||||
|  | ] | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # Internationalization | ||||||
|  | # https://docs.djangoproject.com/en/4.2/topics/i18n/ | ||||||
|  | 
 | ||||||
|  | LANGUAGE_CODE = 'en-us' | ||||||
|  | 
 | ||||||
|  | TIME_ZONE = 'Asia/Irkutsk' | ||||||
|  | 
 | ||||||
|  | USE_I18N = True | ||||||
|  | 
 | ||||||
|  | USE_TZ = True | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # Static files (CSS, JavaScript, Images) | ||||||
|  | # https://docs.djangoproject.com/en/4.2/howto/static-files/ | ||||||
|  | 
 | ||||||
|  | STATIC_URL = 'static/' | ||||||
|  | 
 | ||||||
|  | # Default primary key field type | ||||||
|  | # https://docs.djangoproject.com/en/4.2/ref/settings/#default-auto-field | ||||||
|  | 
 | ||||||
|  | DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' | ||||||
|  | 
 | ||||||
|  | MEDIA_ROOT = BASE_DIR / 'media' | ||||||
|  | MEDIA_URL = 'media/' | ||||||
|  | 
 | ||||||
|  | MEDIA_ROOT_FOR_SENSITIVE_FILES = BASE_DIR / 'archives' | ||||||
|  | MEDIA_URL_FOR_SENSITIVE_FILES = '/archives/' | ||||||
							
								
								
									
										33
									
								
								logs_collector/logs_collector/urls.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								logs_collector/logs_collector/urls.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,33 @@ | |||||||
|  | """ | ||||||
|  | URL configuration for logs_collector project. | ||||||
|  | 
 | ||||||
|  | The `urlpatterns` list routes URLs to views. For more information please see: | ||||||
|  |     https://docs.djangoproject.com/en/4.2/topics/http/urls/ | ||||||
|  | Examples: | ||||||
|  | Function views | ||||||
|  |     1. Add an import:  from my_app import views | ||||||
|  |     2. Add a URL to urlpatterns:  path('', views.home, name='home') | ||||||
|  | Class-based views | ||||||
|  |     1. Add an import:  from other_app.views import Home | ||||||
|  |     2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home') | ||||||
|  | Including another URLconf | ||||||
|  |     1. Import the include() function: from django.urls import include, path | ||||||
|  |     2. Add a URL to urlpatterns:  path('blog/', include('blog.urls')) | ||||||
|  | """ | ||||||
|  | from django.conf.urls.static import static | ||||||
|  | from django.contrib import admin | ||||||
|  | from django.urls import path, include | ||||||
|  | 
 | ||||||
|  | from logs_collector import settings | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | urlpatterns = [ | ||||||
|  |     path('admin/', admin.site.urls), | ||||||
|  |     path('', include('collector.urls')), | ||||||
|  | ] | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | if settings.DEBUG: | ||||||
|  |     urlpatterns += static( | ||||||
|  |         settings.MEDIA_URL, document_root=settings.MEDIA_ROOT | ||||||
|  |     ) | ||||||
							
								
								
									
										16
									
								
								logs_collector/logs_collector/wsgi.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								logs_collector/logs_collector/wsgi.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,16 @@ | |||||||
|  | """ | ||||||
|  | WSGI config for logs_collector project. | ||||||
|  | 
 | ||||||
|  | It exposes the WSGI callable as a module-level variable named ``application``. | ||||||
|  | 
 | ||||||
|  | For more information on this file, see | ||||||
|  | https://docs.djangoproject.com/en/4.2/howto/deployment/wsgi/ | ||||||
|  | """ | ||||||
|  | 
 | ||||||
|  | import os | ||||||
|  | 
 | ||||||
|  | from django.core.wsgi import get_wsgi_application | ||||||
|  | 
 | ||||||
|  | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'logs_collector.settings') | ||||||
|  | 
 | ||||||
|  | application = get_wsgi_application() | ||||||
							
								
								
									
										22
									
								
								logs_collector/manage.py
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										22
									
								
								logs_collector/manage.py
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,22 @@ | |||||||
|  | #!/usr/bin/env python | ||||||
|  | """Django's command-line utility for administrative tasks.""" | ||||||
|  | import os | ||||||
|  | import sys | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def main(): | ||||||
|  |     """Run administrative tasks.""" | ||||||
|  |     os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'logs_collector.settings') | ||||||
|  |     try: | ||||||
|  |         from django.core.management import execute_from_command_line | ||||||
|  |     except ImportError as exc: | ||||||
|  |         raise ImportError( | ||||||
|  |             "Couldn't import Django. Are you sure it's installed and " | ||||||
|  |             "available on your PYTHONPATH environment variable? Did you " | ||||||
|  |             "forget to activate a virtual environment?" | ||||||
|  |         ) from exc | ||||||
|  |     execute_from_command_line(sys.argv) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | if __name__ == '__main__': | ||||||
|  |     main() | ||||||
							
								
								
									
										224
									
								
								poetry.lock
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										224
									
								
								poetry.lock
									
									
									
										generated
									
									
									
										Normal file
									
								
							| @ -0,0 +1,224 @@ | |||||||
|  | # This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand. | ||||||
|  | 
 | ||||||
|  | [[package]] | ||||||
|  | name = "asgiref" | ||||||
|  | version = "3.7.2" | ||||||
|  | description = "ASGI specs, helper code, and adapters" | ||||||
|  | optional = false | ||||||
|  | python-versions = ">=3.7" | ||||||
|  | files = [ | ||||||
|  |     {file = "asgiref-3.7.2-py3-none-any.whl", hash = "sha256:89b2ef2247e3b562a16eef663bc0e2e703ec6468e2fa8a5cd61cd449786d4f6e"}, | ||||||
|  |     {file = "asgiref-3.7.2.tar.gz", hash = "sha256:9e0ce3aa93a819ba5b45120216b23878cf6e8525eb3848653452b4192b92afed"}, | ||||||
|  | ] | ||||||
|  | 
 | ||||||
|  | [package.dependencies] | ||||||
|  | typing-extensions = {version = ">=4", markers = "python_version < \"3.11\""} | ||||||
|  | 
 | ||||||
|  | [package.extras] | ||||||
|  | tests = ["mypy (>=0.800)", "pytest", "pytest-asyncio"] | ||||||
|  | 
 | ||||||
|  | [[package]] | ||||||
|  | name = "django" | ||||||
|  | version = "4.2" | ||||||
|  | description = "A high-level Python web framework that encourages rapid development and clean, pragmatic design." | ||||||
|  | optional = false | ||||||
|  | python-versions = ">=3.8" | ||||||
|  | files = [ | ||||||
|  |     {file = "Django-4.2-py3-none-any.whl", hash = "sha256:ad33ed68db9398f5dfb33282704925bce044bef4261cd4fb59e4e7f9ae505a78"}, | ||||||
|  |     {file = "Django-4.2.tar.gz", hash = "sha256:c36e2ab12824e2ac36afa8b2515a70c53c7742f0d6eaefa7311ec379558db997"}, | ||||||
|  | ] | ||||||
|  | 
 | ||||||
|  | [package.dependencies] | ||||||
|  | asgiref = ">=3.6.0,<4" | ||||||
|  | sqlparse = ">=0.3.1" | ||||||
|  | tzdata = {version = "*", markers = "sys_platform == \"win32\""} | ||||||
|  | 
 | ||||||
|  | [package.extras] | ||||||
|  | argon2 = ["argon2-cffi (>=19.1.0)"] | ||||||
|  | bcrypt = ["bcrypt"] | ||||||
|  | 
 | ||||||
|  | [[package]] | ||||||
|  | name = "django-cleanup" | ||||||
|  | version = "8.0.0" | ||||||
|  | description = "Deletes old files." | ||||||
|  | optional = false | ||||||
|  | python-versions = "*" | ||||||
|  | files = [ | ||||||
|  |     {file = "django-cleanup-8.0.0.tar.gz", hash = "sha256:c739a05544e1e48dc848871c870dbf1595f8533d24523bc67360e43562edaf0d"}, | ||||||
|  |     {file = "django_cleanup-8.0.0-py2.py3-none-any.whl", hash = "sha256:8cd8872d67fe1501b19a843d006cdb5673cfbb74ac3d6d8f2c60e8e7723a7f5b"}, | ||||||
|  | ] | ||||||
|  | 
 | ||||||
|  | [[package]] | ||||||
|  | name = "django-environ" | ||||||
|  | version = "0.10.0" | ||||||
|  | description = "A package that allows you to utilize 12factor inspired environment variables to configure your Django application." | ||||||
|  | optional = false | ||||||
|  | python-versions = ">=3.5,<4" | ||||||
|  | files = [ | ||||||
|  |     {file = "django-environ-0.10.0.tar.gz", hash = "sha256:b3559a91439c9d774a9e0c1ced872364772c612cdf6dc919506a2b13f7a77225"}, | ||||||
|  |     {file = "django_environ-0.10.0-py2.py3-none-any.whl", hash = "sha256:510f8c9c1d0a38b0815f91504270c29440a0cf44fab07f55942fa8d31bbb9be6"}, | ||||||
|  | ] | ||||||
|  | 
 | ||||||
|  | [package.extras] | ||||||
|  | develop = ["coverage[toml] (>=5.0a4)", "furo (>=2021.8.17b43,<2021.9.dev0)", "pytest (>=4.6.11)", "sphinx (>=3.5.0)", "sphinx-notfound-page"] | ||||||
|  | docs = ["furo (>=2021.8.17b43,<2021.9.dev0)", "sphinx (>=3.5.0)", "sphinx-notfound-page"] | ||||||
|  | testing = ["coverage[toml] (>=5.0a4)", "pytest (>=4.6.11)"] | ||||||
|  | 
 | ||||||
|  | [[package]] | ||||||
|  | name = "djangorestframework" | ||||||
|  | version = "3.14.0" | ||||||
|  | description = "Web APIs for Django, made easy." | ||||||
|  | optional = false | ||||||
|  | python-versions = ">=3.6" | ||||||
|  | files = [ | ||||||
|  |     {file = "djangorestframework-3.14.0-py3-none-any.whl", hash = "sha256:eb63f58c9f218e1a7d064d17a70751f528ed4e1d35547fdade9aaf4cd103fd08"}, | ||||||
|  |     {file = "djangorestframework-3.14.0.tar.gz", hash = "sha256:579a333e6256b09489cbe0a067e66abe55c6595d8926be6b99423786334350c8"}, | ||||||
|  | ] | ||||||
|  | 
 | ||||||
|  | [package.dependencies] | ||||||
|  | django = ">=3.0" | ||||||
|  | pytz = "*" | ||||||
|  | 
 | ||||||
|  | [[package]] | ||||||
|  | name = "djangorestframework-simplejwt" | ||||||
|  | version = "5.2.2" | ||||||
|  | description = "A minimal JSON Web Token authentication plugin for Django REST Framework" | ||||||
|  | optional = false | ||||||
|  | python-versions = ">=3.7" | ||||||
|  | files = [ | ||||||
|  |     {file = "djangorestframework_simplejwt-5.2.2-py3-none-any.whl", hash = "sha256:4c0d2e2513e12587d93501ac091781684a216c3ee614eb3b5a10586aef5ca845"}, | ||||||
|  |     {file = "djangorestframework_simplejwt-5.2.2.tar.gz", hash = "sha256:d27d4bcac2c6394f678dea8b4d0d511c6e18a7f2eb8aaeeb8a7de601aeb77c42"}, | ||||||
|  | ] | ||||||
|  | 
 | ||||||
|  | [package.dependencies] | ||||||
|  | django = "*" | ||||||
|  | djangorestframework = "*" | ||||||
|  | pyjwt = ">=1.7.1,<3" | ||||||
|  | 
 | ||||||
|  | [package.extras] | ||||||
|  | crypto = ["cryptography (>=3.3.1)"] | ||||||
|  | dev = ["Sphinx (>=1.6.5,<2)", "cryptography", "flake8", "ipython", "isort", "pep8", "pytest", "pytest-cov", "pytest-django", "pytest-watch", "pytest-xdist", "python-jose (==3.3.0)", "sphinx-rtd-theme (>=0.1.9)", "tox", "twine", "wheel"] | ||||||
|  | doc = ["Sphinx (>=1.6.5,<2)", "sphinx-rtd-theme (>=0.1.9)"] | ||||||
|  | lint = ["flake8", "isort", "pep8"] | ||||||
|  | python-jose = ["python-jose (==3.3.0)"] | ||||||
|  | test = ["cryptography", "pytest", "pytest-cov", "pytest-django", "pytest-xdist", "tox"] | ||||||
|  | 
 | ||||||
|  | [[package]] | ||||||
|  | name = "flake8" | ||||||
|  | version = "6.0.0" | ||||||
|  | description = "the modular source code checker: pep8 pyflakes and co" | ||||||
|  | optional = false | ||||||
|  | python-versions = ">=3.8.1" | ||||||
|  | files = [ | ||||||
|  |     {file = "flake8-6.0.0-py2.py3-none-any.whl", hash = "sha256:3833794e27ff64ea4e9cf5d410082a8b97ff1a06c16aa3d2027339cd0f1195c7"}, | ||||||
|  |     {file = "flake8-6.0.0.tar.gz", hash = "sha256:c61007e76655af75e6785a931f452915b371dc48f56efd765247c8fe68f2b181"}, | ||||||
|  | ] | ||||||
|  | 
 | ||||||
|  | [package.dependencies] | ||||||
|  | mccabe = ">=0.7.0,<0.8.0" | ||||||
|  | pycodestyle = ">=2.10.0,<2.11.0" | ||||||
|  | pyflakes = ">=3.0.0,<3.1.0" | ||||||
|  | 
 | ||||||
|  | [[package]] | ||||||
|  | name = "mccabe" | ||||||
|  | version = "0.7.0" | ||||||
|  | description = "McCabe checker, plugin for flake8" | ||||||
|  | optional = false | ||||||
|  | python-versions = ">=3.6" | ||||||
|  | files = [ | ||||||
|  |     {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, | ||||||
|  |     {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, | ||||||
|  | ] | ||||||
|  | 
 | ||||||
|  | [[package]] | ||||||
|  | name = "pycodestyle" | ||||||
|  | version = "2.10.0" | ||||||
|  | description = "Python style guide checker" | ||||||
|  | optional = false | ||||||
|  | python-versions = ">=3.6" | ||||||
|  | files = [ | ||||||
|  |     {file = "pycodestyle-2.10.0-py2.py3-none-any.whl", hash = "sha256:8a4eaf0d0495c7395bdab3589ac2db602797d76207242c17d470186815706610"}, | ||||||
|  |     {file = "pycodestyle-2.10.0.tar.gz", hash = "sha256:347187bdb476329d98f695c213d7295a846d1152ff4fe9bacb8a9590b8ee7053"}, | ||||||
|  | ] | ||||||
|  | 
 | ||||||
|  | [[package]] | ||||||
|  | name = "pyflakes" | ||||||
|  | version = "3.0.1" | ||||||
|  | description = "passive checker of Python programs" | ||||||
|  | optional = false | ||||||
|  | python-versions = ">=3.6" | ||||||
|  | files = [ | ||||||
|  |     {file = "pyflakes-3.0.1-py2.py3-none-any.whl", hash = "sha256:ec55bf7fe21fff7f1ad2f7da62363d749e2a470500eab1b555334b67aa1ef8cf"}, | ||||||
|  |     {file = "pyflakes-3.0.1.tar.gz", hash = "sha256:ec8b276a6b60bd80defed25add7e439881c19e64850afd9b346283d4165fd0fd"}, | ||||||
|  | ] | ||||||
|  | 
 | ||||||
|  | [[package]] | ||||||
|  | name = "pyjwt" | ||||||
|  | version = "2.8.0" | ||||||
|  | description = "JSON Web Token implementation in Python" | ||||||
|  | optional = false | ||||||
|  | python-versions = ">=3.7" | ||||||
|  | files = [ | ||||||
|  |     {file = "PyJWT-2.8.0-py3-none-any.whl", hash = "sha256:59127c392cc44c2da5bb3192169a91f429924e17aff6534d70fdc02ab3e04320"}, | ||||||
|  |     {file = "PyJWT-2.8.0.tar.gz", hash = "sha256:57e28d156e3d5c10088e0c68abb90bfac3df82b40a71bd0daa20c65ccd5c23de"}, | ||||||
|  | ] | ||||||
|  | 
 | ||||||
|  | [package.extras] | ||||||
|  | crypto = ["cryptography (>=3.4.0)"] | ||||||
|  | dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.4.0)", "pre-commit", "pytest (>=6.0.0,<7.0.0)", "sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] | ||||||
|  | docs = ["sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] | ||||||
|  | tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] | ||||||
|  | 
 | ||||||
|  | [[package]] | ||||||
|  | name = "pytz" | ||||||
|  | version = "2023.3" | ||||||
|  | description = "World timezone definitions, modern and historical" | ||||||
|  | optional = false | ||||||
|  | python-versions = "*" | ||||||
|  | files = [ | ||||||
|  |     {file = "pytz-2023.3-py2.py3-none-any.whl", hash = "sha256:a151b3abb88eda1d4e34a9814df37de2a80e301e68ba0fd856fb9b46bfbbbffb"}, | ||||||
|  |     {file = "pytz-2023.3.tar.gz", hash = "sha256:1d8ce29db189191fb55338ee6d0387d82ab59f3d00eac103412d64e0ebd0c588"}, | ||||||
|  | ] | ||||||
|  | 
 | ||||||
|  | [[package]] | ||||||
|  | name = "sqlparse" | ||||||
|  | version = "0.4.4" | ||||||
|  | description = "A non-validating SQL parser." | ||||||
|  | optional = false | ||||||
|  | python-versions = ">=3.5" | ||||||
|  | files = [ | ||||||
|  |     {file = "sqlparse-0.4.4-py3-none-any.whl", hash = "sha256:5430a4fe2ac7d0f93e66f1efc6e1338a41884b7ddf2a350cedd20ccc4d9d28f3"}, | ||||||
|  |     {file = "sqlparse-0.4.4.tar.gz", hash = "sha256:d446183e84b8349fa3061f0fe7f06ca94ba65b426946ffebe6e3e8295332420c"}, | ||||||
|  | ] | ||||||
|  | 
 | ||||||
|  | [package.extras] | ||||||
|  | dev = ["build", "flake8"] | ||||||
|  | doc = ["sphinx"] | ||||||
|  | test = ["pytest", "pytest-cov"] | ||||||
|  | 
 | ||||||
|  | [[package]] | ||||||
|  | name = "typing-extensions" | ||||||
|  | version = "4.7.1" | ||||||
|  | description = "Backported and Experimental Type Hints for Python 3.7+" | ||||||
|  | optional = false | ||||||
|  | python-versions = ">=3.7" | ||||||
|  | files = [ | ||||||
|  |     {file = "typing_extensions-4.7.1-py3-none-any.whl", hash = "sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36"}, | ||||||
|  |     {file = "typing_extensions-4.7.1.tar.gz", hash = "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2"}, | ||||||
|  | ] | ||||||
|  | 
 | ||||||
|  | [[package]] | ||||||
|  | name = "tzdata" | ||||||
|  | version = "2023.3" | ||||||
|  | description = "Provider of IANA time zone data" | ||||||
|  | optional = false | ||||||
|  | python-versions = ">=2" | ||||||
|  | files = [ | ||||||
|  |     {file = "tzdata-2023.3-py2.py3-none-any.whl", hash = "sha256:7e65763eef3120314099b6939b5546db7adce1e7d6f2e179e3df563c70511eda"}, | ||||||
|  |     {file = "tzdata-2023.3.tar.gz", hash = "sha256:11ef1e08e54acb0d4f95bdb1be05da659673de4acbd21bf9c69e94cc5e907a3a"}, | ||||||
|  | ] | ||||||
|  | 
 | ||||||
|  | [metadata] | ||||||
|  | lock-version = "2.0" | ||||||
|  | python-versions = "^3.10" | ||||||
|  | content-hash = "82580779974f9b9a09d2b46c9d92491e870b66363e634d34252a31338da1aeff" | ||||||
							
								
								
									
										22
									
								
								pyproject.toml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								pyproject.toml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,22 @@ | |||||||
|  | [tool.poetry] | ||||||
|  | name = "logs-collector" | ||||||
|  | version = "0.1.0" | ||||||
|  | description = "Server side for receiving and storing log files" | ||||||
|  | authors = ["MOIS3Y <s.zhukovskii@ispsystem.com>"] | ||||||
|  | readme = "README.md" | ||||||
|  | packages = [{include = "logs_collector"}] | ||||||
|  | 
 | ||||||
|  | [tool.poetry.dependencies] | ||||||
|  | python = "^3.10" | ||||||
|  | Django = "4.2" | ||||||
|  | djangorestframework = "^3.14.0" | ||||||
|  | djangorestframework-simplejwt = "^5.2.2" | ||||||
|  | django-environ = "^0.10.0" | ||||||
|  | django-cleanup = "^8.0.0" | ||||||
|  | 
 | ||||||
|  | [tool.poetry.group.dev.dependencies] | ||||||
|  | flake8 = "^6.0.0" | ||||||
|  | 
 | ||||||
|  | [build-system] | ||||||
|  | requires = ["poetry-core"] | ||||||
|  | build-backend = "poetry.core.masonry.api" | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user