From 60c92b768e53d0e4d65bf4dc194ea3561a76c0e2 Mon Sep 17 00:00:00 2001 From: MarionetkaX Date: Fri, 20 May 2022 07:47:17 +0300 Subject: [PATCH 1/9] ref: update models and migration --- ...dd_columnls.py => 97dde16d6b82_add_columnls.py} | 14 +++++++++++--- models.py | 13 +++++++++---- 2 files changed, 20 insertions(+), 7 deletions(-) rename migrations/versions/{65a007288939_add_columnls.py => 97dde16d6b82_add_columnls.py} (74%) diff --git a/migrations/versions/65a007288939_add_columnls.py b/migrations/versions/97dde16d6b82_add_columnls.py similarity index 74% rename from migrations/versions/65a007288939_add_columnls.py rename to migrations/versions/97dde16d6b82_add_columnls.py index fa5a27e..bf5c446 100644 --- a/migrations/versions/65a007288939_add_columnls.py +++ b/migrations/versions/97dde16d6b82_add_columnls.py @@ -1,8 +1,8 @@ """Add columnls -Revision ID: 65a007288939 +Revision ID: 97dde16d6b82 Revises: -Create Date: 2022-05-18 16:44:06.441247 +Create Date: 2022-05-19 16:42:58.169237 """ from alembic import op @@ -11,7 +11,7 @@ # revision identifiers, used by Alembic. -revision = '65a007288939' +revision = '97dde16d6b82' down_revision = None branch_labels = None depends_on = None @@ -19,10 +19,17 @@ def upgrade(): # ### commands auto generated by Alembic - please adjust! ### + op.create_table('email', + sa.Column('name', sqlmodel.sql.sqltypes.AutoString(), nullable=False), + sa.Column('id', sa.Integer(), nullable=True), + sa.PrimaryKeyConstraint('id') + ) op.create_table('site', sa.Column('identification', sqlmodel.sql.sqltypes.AutoString(), nullable=False), sa.Column('site_name', sqlmodel.sql.sqltypes.AutoString(), nullable=False), + sa.Column('email_id', sa.Integer(), nullable=True), sa.Column('id', sa.Integer(), nullable=True), + sa.ForeignKeyConstraint(['email_id'], ['email.id'], ), sa.PrimaryKeyConstraint('id') ) op.create_table('traffic', @@ -42,4 +49,5 @@ def downgrade(): # ### commands auto generated by Alembic - please adjust! ### op.drop_table('traffic') op.drop_table('site') + op.drop_table('email') # ### end Alembic commands ### diff --git a/models.py b/models.py index 1974cd5..82eed3b 100644 --- a/models.py +++ b/models.py @@ -16,16 +16,21 @@ class Traffic(TrafficBase, table=True): id: int = Field(default=None, primary_key=True) -class TrafficCreate(TrafficBase): - pass - - class SiteBase(SQLModel): # identification: str = Field(sa_column=Column('identification', unique=True), title='Индентификатор сайта') # site_name: str = Field(sa_column=Column('site_name', unique=True), title='URL сайта') identification: str = Field(title='Индентификатор сайта') site_name: str = Field(title='URL сайта') + email_id: int = Field(default=None, foreign_key='email.id') class Site(SiteBase, table=True): id: int = Field(default=None, primary_key=True) + + +class EmailBase(SQLModel): + name: str = Field(title='Список email') + + +class Email(EmailBase, table=True): + id: int = Field(default=None, primary_key=True) From 263a752129bf924f3174b1126b949e89665cfe34 Mon Sep 17 00:00:00 2001 From: MarionetkaX Date: Fri, 20 May 2022 07:48:03 +0300 Subject: [PATCH 2/9] ref: added field for entering email --- templates/post_identification.html | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/templates/post_identification.html b/templates/post_identification.html index 6bd7303..676e0ba 100644 --- a/templates/post_identification.html +++ b/templates/post_identification.html @@ -7,11 +7,15 @@
- +

- + +
+ +
+


From bcb31ed7d68cd7e0250b05222827d1524e930c08 Mon Sep 17 00:00:00 2001 From: MarionetkaX Date: Fri, 20 May 2022 07:48:38 +0300 Subject: [PATCH 3/9] ref: added models --- migrations/env.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/migrations/env.py b/migrations/env.py index f9b3497..018d2a6 100644 --- a/migrations/env.py +++ b/migrations/env.py @@ -27,7 +27,7 @@ # from myapp import mymodel # target_metadata = mymodel.Base.metadata -from models import Traffic +from models import Traffic, Site, Email target_metadata = SQLModel.metadata From 1107e5205eed298270685be686e383cf24e93afe Mon Sep 17 00:00:00 2001 From: MarionetkaX Date: Fri, 20 May 2022 07:49:09 +0300 Subject: [PATCH 4/9] ref: not up to work --- generate_word/generate_file.py | 6 +++--- main.py | 13 ++++++++----- task.py | 15 ++++++++------- 3 files changed, 19 insertions(+), 15 deletions(-) diff --git a/generate_word/generate_file.py b/generate_word/generate_file.py index 0d02cc3..59ca1f2 100644 --- a/generate_word/generate_file.py +++ b/generate_word/generate_file.py @@ -4,7 +4,7 @@ from datetime import date, timedelta -def create_report(counter: int, avg_load: float, max_load: float): +def create_report(counter: int, avg_load: float, max_load: float, site_name: str): template_word = DocxTemplate(join(get_settings().template_dir, 'report.docx')) template_word.render( { @@ -16,5 +16,5 @@ def create_report(counter: int, avg_load: float, max_load: float): } ) current_date = (date.today() - timedelta(days=1)).strftime('%d-%m-%Y') - template_word.save(join(get_settings().static_dir, f'{current_date}.docx')) - return join(get_settings().static_dir, f'{current_date}.docx') + template_word.save(join(get_settings().static_dir, f'{current_date}-{site_name}.docx')) + return join(get_settings().static_dir, f'{current_date}-{site_name}.docx') diff --git a/main.py b/main.py index 3ff4299..bae9c7b 100644 --- a/main.py +++ b/main.py @@ -17,7 +17,8 @@ from database import get_session, engine from models import \ Traffic, \ - Site + Site, \ + Email from settings import SECRET_KEY app = FastAPI() @@ -65,7 +66,7 @@ async def verify_token_access(token_access: str): raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail='У вас нет доступа к запрашиваемой странице') -@app.post('/identification_site/') +@app.get('/identification_site/') async def form_send(request: Request): return templates.TemplateResponse('post_identification.html', {'request': request}) @@ -74,13 +75,15 @@ async def form_send(request: Request): response_model=Site) async def generate_secret_key(website_url: str = Form(...), secret_key: str = Form(...), + list_email: str = Form(...), session: AsyncSession = Depends(get_session)): - print('username', website_url) - print('password', secret_key) verify_site = (await session.execute(select(Site).where(Site.site_name == website_url))).first() if verify_site is None: + email_id = (await session.execute(insert(Email).values(name=list_email))).inserted_primary_key[0] + await session.commit() site_id = (await session.execute(insert(Site).values(site_name=website_url, - identification=secret_key))).inserted_primary_key[0] + identification=secret_key, + email_id=email_id))).inserted_primary_key[0] await session.commit() return JSONResponse(content=jsonable_encoder((await session.execute(select(Site). where(Site.id == site_id))).first())) diff --git a/task.py b/task.py index 2465f14..5e300cf 100644 --- a/task.py +++ b/task.py @@ -7,19 +7,20 @@ from generate_word.generate_file import create_report from send_message.send_email import send_file from database import engine -from models import Traffic +from models import Traffic, Site from settings import CONFIG_EMAIL, NOTIFICATION_SEND_TIME async def send_message(): async with engine.connect() as session: - get_record = (await session.execute( - select(Traffic). - where(Traffic.create_at == date.today() - timedelta(days=1)))).first() - path_report = create_report(get_record.counter, + get_record = (await session.execute(select(Traffic). + where(Traffic.create_at == date.today() - timedelta(days=1)))).first() + site = (await session.execute(select(Site). + where(Site.id == get_record[0].site_id))).first() + path_report = create_report(get_record[0].counter, round(get_record.average_load, 2), - round(get_record.maximum_load, 2) - ) + round(get_record.maximum_load, 2), + site[0].site_name) await send_file(CONFIG_EMAIL['MAIL_FROM'], CONFIG_EMAIL['MAIL_PASSWORD'], CONFIG_EMAIL['MAIL_FROM'], From df16a54f1cfd03cdb63805ba42519f0e57e2a284 Mon Sep 17 00:00:00 2001 From: MarionetkaX Date: Fri, 20 May 2022 19:16:44 +0300 Subject: [PATCH 5/9] fix: fix id when updating record --- main.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/main.py b/main.py index bae9c7b..6083c3d 100644 --- a/main.py +++ b/main.py @@ -44,7 +44,8 @@ async def calculate(identification: str, if traffic: await session.execute(update(Traffic). where(Traffic.id == traffic[0].id). - values(counter=Traffic.counter+1, + values(id=traffic[0].id, + counter=Traffic.counter+1, average_load=Traffic.counter * 0.0184, maximum_load=Traffic.counter * 0.0305, )) From 7146c74765caf2a6ecfe8c6b58a7928ec07dab0f Mon Sep 17 00:00:00 2001 From: MarionetkaX Date: Fri, 20 May 2022 19:17:27 +0300 Subject: [PATCH 6/9] ref: sending reports to all sites --- send_message/send_email.py | 4 ++-- task.py | 48 +++++++++++++++++++++----------------- 2 files changed, 29 insertions(+), 23 deletions(-) diff --git a/send_message/send_email.py b/send_message/send_email.py index e40d476..20724fd 100644 --- a/send_message/send_email.py +++ b/send_message/send_email.py @@ -6,11 +6,11 @@ async def send_file(login: str, password: str, sender: str, receivers: str, - attachment_path: str, smtp_server: str, port: int): + attachment_path: str, smtp_server: str, port: int, site_name: str): current_date = (date.today() - timedelta(days=1)).strftime('%d-%m-%Y') message = MIMEMultipart() message['Subject'] = 'Отчет о состоянии IT-инфраструктуры и результатах ' \ - 'мониторинга инцидентов в области кибербезопасности.' + f'мониторинга инцидентов в области кибербезопасности сайта {site_name}.' message['From'] = sender message['To'] = receivers diff --git a/task.py b/task.py index 5e300cf..7c9c82a 100644 --- a/task.py +++ b/task.py @@ -7,34 +7,40 @@ from generate_word.generate_file import create_report from send_message.send_email import send_file from database import engine -from models import Traffic, Site +from models import Traffic, Site, Email from settings import CONFIG_EMAIL, NOTIFICATION_SEND_TIME +from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy.orm import sessionmaker async def send_message(): - async with engine.connect() as session: - get_record = (await session.execute(select(Traffic). - where(Traffic.create_at == date.today() - timedelta(days=1)))).first() - site = (await session.execute(select(Site). - where(Site.id == get_record[0].site_id))).first() - path_report = create_report(get_record[0].counter, - round(get_record.average_load, 2), - round(get_record.maximum_load, 2), - site[0].site_name) - await send_file(CONFIG_EMAIL['MAIL_FROM'], - CONFIG_EMAIL['MAIL_PASSWORD'], - CONFIG_EMAIL['MAIL_FROM'], - CONFIG_EMAIL['MAIL_TO'], - path_report, - CONFIG_EMAIL['MAIL_SERVER'], - CONFIG_EMAIL['MAIL_PORT'] - ) - remove(path_report) - sleep(1) + async with sessionmaker(engine, class_=AsyncSession, expire_on_commit=False)() as session: + get_records = (await session.execute(select(Traffic). + where(Traffic.create_at == date.today() - timedelta(days=1)))).all() + for get_record in get_records: + site = (await session.execute(select(Site). + where(Site.id == get_record[0].site_id))).first() + email_to = (await session.execute(select(Email). + where(Email.id == site[0].email_id))).first()[0].name + path_report = create_report(get_record[0].counter, + round(get_record[0].average_load, 2), + round(get_record[0].maximum_load, 2), + site[0].site_name) + await send_file(CONFIG_EMAIL['MAIL_FROM'], + CONFIG_EMAIL['MAIL_PASSWORD'], + CONFIG_EMAIL['MAIL_FROM'], + email_to, + path_report, + CONFIG_EMAIL['MAIL_SERVER'], + CONFIG_EMAIL['MAIL_PORT'], + site[0].site_name + ) + remove(path_report) + sleep(1) schedule.every().day.at(f'{NOTIFICATION_SEND_TIME}').do(send_message) -#schedule.every(10).seconds.do(send_message) +#schedule.every(20).seconds.do(send_message) while True: get_event_loop().run_until_complete(schedule.run_pending()) From 6b037bdbb2d053821d4b473e993d8e86b124c385 Mon Sep 17 00:00:00 2001 From: MarionetkaX Date: Fri, 20 May 2022 20:02:07 +0300 Subject: [PATCH 7/9] ref: model fields added --- ...columnls.py => 53b75e1e6be5_add_models.py} | 24 ++++++++++--------- models.py | 20 +++++++--------- 2 files changed, 22 insertions(+), 22 deletions(-) rename migrations/versions/{97dde16d6b82_add_columnls.py => 53b75e1e6be5_add_models.py} (66%) diff --git a/migrations/versions/97dde16d6b82_add_columnls.py b/migrations/versions/53b75e1e6be5_add_models.py similarity index 66% rename from migrations/versions/97dde16d6b82_add_columnls.py rename to migrations/versions/53b75e1e6be5_add_models.py index bf5c446..fb67b92 100644 --- a/migrations/versions/97dde16d6b82_add_columnls.py +++ b/migrations/versions/53b75e1e6be5_add_models.py @@ -1,8 +1,8 @@ -"""Add columnls +"""Add models -Revision ID: 97dde16d6b82 +Revision ID: 53b75e1e6be5 Revises: -Create Date: 2022-05-19 16:42:58.169237 +Create Date: 2022-05-20 19:56:07.821485 """ from alembic import op @@ -11,7 +11,7 @@ # revision identifiers, used by Alembic. -revision = '97dde16d6b82' +revision = '53b75e1e6be5' down_revision = None branch_labels = None depends_on = None @@ -25,19 +25,21 @@ def upgrade(): sa.PrimaryKeyConstraint('id') ) op.create_table('site', - sa.Column('identification', sqlmodel.sql.sqltypes.AutoString(), nullable=False), - sa.Column('site_name', sqlmodel.sql.sqltypes.AutoString(), nullable=False), - sa.Column('email_id', sa.Integer(), nullable=True), + sa.Column('identification', sa.String(), nullable=False), + sa.Column('site_name', sa.String(), nullable=False), + sa.Column('email_id', sa.Integer(), nullable=False), sa.Column('id', sa.Integer(), nullable=True), sa.ForeignKeyConstraint(['email_id'], ['email.id'], ), - sa.PrimaryKeyConstraint('id') + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('identification'), + sa.UniqueConstraint('site_name') ) op.create_table('traffic', sa.Column('counter', sa.Integer(), nullable=True), - sa.Column('average_load', sa.Float(), nullable=True), - sa.Column('maximum_load', sa.Float(), nullable=True), + sa.Column('average_load', sa.Float(), nullable=False), + sa.Column('maximum_load', sa.Float(), nullable=False), sa.Column('create_at', sa.Date(), nullable=False), - sa.Column('site_id', sa.Integer(), nullable=True), + sa.Column('site_id', sa.Integer(), nullable=False), sa.Column('id', sa.Integer(), nullable=True), sa.ForeignKeyConstraint(['site_id'], ['site.id'], ), sa.PrimaryKeyConstraint('id') diff --git a/models.py b/models.py index 82eed3b..33eaaee 100644 --- a/models.py +++ b/models.py @@ -1,15 +1,15 @@ from typing import Optional from sqlmodel import SQLModel, Field from datetime import date -from sqlalchemy import Date, Column +from sqlalchemy import Date, Column, String class TrafficBase(SQLModel): counter: int = Field(default=1, title='Количество запросов в день') - average_load: Optional[float] = Field(title='Средняя нагрузка на сеть за день') - maximum_load: Optional[float] = Field(title='Максимальная нагрузка на сеть за день') - create_at: date = Field(title='Дата') - site_id: int = Field(default=None, foreign_key='site.id') + average_load: Optional[float] = Field(default=0, nullable=False, title='Средняя нагрузка на сеть за день') + maximum_load: Optional[float] = Field(default=0, nullable=False, title='Максимальная нагрузка на сеть за день') + create_at: date = Field(nullable=False, title='Дата') + site_id: int = Field(default=None, foreign_key='site.id', nullable=False) class Traffic(TrafficBase, table=True): @@ -17,11 +17,9 @@ class Traffic(TrafficBase, table=True): class SiteBase(SQLModel): - # identification: str = Field(sa_column=Column('identification', unique=True), title='Индентификатор сайта') - # site_name: str = Field(sa_column=Column('site_name', unique=True), title='URL сайта') - identification: str = Field(title='Индентификатор сайта') - site_name: str = Field(title='URL сайта') - email_id: int = Field(default=None, foreign_key='email.id') + identification: str = Field(sa_column=Column('identification', String, unique=True, nullable=False), title='Индентификатор сайта') + site_name: str = Field(sa_column=Column('site_name', String, unique=True, nullable=False), title='URL сайта') + email_id: int = Field(default=None, foreign_key='email.id', nullable=False) class Site(SiteBase, table=True): @@ -29,7 +27,7 @@ class Site(SiteBase, table=True): class EmailBase(SQLModel): - name: str = Field(title='Список email') + name: str = Field(nullable=False, title='Список email') class Email(EmailBase, table=True): From a0729c722968c0ee1baf42edba3612b513f4014d Mon Sep 17 00:00:00 2001 From: MarionetkaX Date: Fri, 20 May 2022 20:05:31 +0300 Subject: [PATCH 8/9] fix: change template --- templates/post_identification.html | 2 +- templates/statistics.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/templates/post_identification.html b/templates/post_identification.html index 676e0ba..8edd4e9 100644 --- a/templates/post_identification.html +++ b/templates/post_identification.html @@ -2,7 +2,7 @@ - Title + Добавление сайта
diff --git a/templates/statistics.html b/templates/statistics.html index c9a3184..64f1b1a 100644 --- a/templates/statistics.html +++ b/templates/statistics.html @@ -2,7 +2,7 @@ - Title + Сатистика сайта From 5c1fc5ed14e5ced2231439c57009e7d3e1430970 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 20 May 2022 17:11:54 +0000 Subject: [PATCH 9/9] build(deps): bump docker/login-action from 1 to 2 Bumps [docker/login-action](https://github.com/docker/login-action) from 1 to 2. - [Release notes](https://github.com/docker/login-action/releases) - [Commits](https://github.com/docker/login-action/compare/v1...v2) --- updated-dependencies: - dependency-name: docker/login-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index d242ede..4ca9638 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -47,7 +47,7 @@ jobs: - name: set up Docker builder uses: docker/setup-buildx-action@v1 - name: Log in to the Cntainer registry - uses: docker/login-action@v1 + uses: docker/login-action@v2 with: registry: ${{ env.REGISTRY }} username: ${{ github.actor }}