1
0
mirror of https://gitlab.crans.org/bde/nk20-scripts synced 2025-07-02 02:48:29 +02:00

Compare commits

1 Commits

Author SHA1 Message Date
d1990cc63d Merge branch 'l_eveil_du_nanax' into 'master'
L'eveil du nanax

See merge request bde/nk20-scripts!2
2022-08-31 08:24:20 +02:00
6 changed files with 23 additions and 99 deletions

1
.gitignore vendored
View File

@ -33,7 +33,6 @@ coverage
# Local data # Local data
secrets.py secrets.py
*/.env_borg
*.log *.log
# Virtualenv # Virtualenv

View File

@ -1,4 +1,4 @@
# Copyright (C) 2018-2023 by BDE ENS Paris-Saclay # Copyright (C) 2018-2021 by BDE ENS Paris-Saclay
# SPDX-License-Identifier: GPL-3.0-or-later # SPDX-License-Identifier: GPL-3.0-or-later
from django.core.management.base import BaseCommand from django.core.management.base import BaseCommand
@ -7,87 +7,27 @@ from django.db import connection
class Command(BaseCommand): class Command(BaseCommand):
""" """
Command to protect sensitive data during the beta phase or after WEI. Command to protect sensitive data during the beta phase, to prevent a right escalation.
Phone number, email address, postal address, first and last name, Phone number, email address, postal address, first and last name are removed.
IP addresses, health issues, gender and birth date are removed.
""" """
def add_arguments(self, parser): def add_arguments(self, parser):
parser.add_argument('--force', '-f', action='store_true', help="Actually anonymize data.") parser.add_argument('--force', '-f', action='store_true', help="Actually anonymize data.")
parser.add_argument('--type', '-t', choices=["all", "wei", "user"], default="",
help='Select the type of data to anonyze (default None)')
def handle(self, *args, **options): def handle(self, *args, **kwargs):
if not options['force']: if not kwargs['force']:
if options['type'] == "all": self.stderr.write("CAUTION: This is a dangerous script. This will reset all personal data with "
self.stderr.write("CAUTION: This is a dangerous script. This will reset ALL personal data with " "sample data. Don't use this in production! If you know what you are doing, "
"sample data. Don't use in production! If you know what you are doing, please "
"add --force option.")
elif options['type'] == "wei":
self.stderr.write("CAUTION: This is a dangerous script. This will reset WEI personal data with "
"sample data. Use it in production only after WEI. If you know what you are doing,"
"please add --force option.") "please add --force option.")
elif options['type'] == "user":
self.stderr.write("CAUTION: This is a dangerous script. This will reset all personal data "
"visible by user (not admin or trez BDE) with sample data. Don't use in "
"production! If you know what you are doing, please add --force option.")
else:
self.stderr.write("CAUTION: This is a dangerous script. This will reset all personal data with "
"sample data. Don't use in production ('wei' can be use in production after "
"the WEI)! If you know what you are doing, please choose a type.")
exit(1) exit(1)
cur = connection.cursor() cur = connection.cursor()
if options['type'] in ("all","user"): cur.execute("UPDATE member_profile SET "
if options['verbosity'] != 0:
self.stdout.write("Anonymize profile, user club and guest data")
cur.execute("UPDATE member_profile SET "
"phone_number = '0123456789', " "phone_number = '0123456789', "
"address = '4 avenue des Sciences, 91190 GIF-SUR-YVETTE';") "address = '4 avenue des Sciences, 91190 GIF-SUR-YVETTE';")
cur.execute("UPDATE auth_user SET " cur.execute("UPDATE auth_user SET "
"first_name = 'Anne', " "first_name = 'Anne', "
"last_name = 'Onyme', " "last_name = 'Onyme', "
"email = 'anonymous@example.com';") "email = 'anonymous@example.com';")
cur.execute("UPDATE member_club SET " cur.execute("UPDATE member_club SET "
"email = 'anonymous@example.com';") "email = 'anonymous@example.com';")
cur.execute("UPDATE activity_guest SET "
"first_name = 'Anne', "
"last_name = 'Onyme';")
if options['type'] in ("all","wei","user"):
if options['verbosity'] != 0:
self.stdout.write("Anonymize WEI data")
cur.execute("UPDATE wei_weiregistration SET "
"birth_date = '1998-01-08', "
"emergency_contact_name = 'Anne Onyme', "
"emergency_contact_phone = '0123456789', "
"gender = 'nonbinary', "
"health_issues = 'Tout va bien';")
if options['type'] == "all":
if options['verbosity'] != 0:
self.stdout.write("Anonymize invoice, special transaction, log, mailer and oauth data")
cur.execute("UPDATE treasury_invoice SET "
"name = 'Anne Onyme', "
"object = 'Rends nous riches', "
"description = 'Donne nous plein de sous', "
"address = '4 avenue des Sciences, 91190 GIF-SUR-YVETTE';")
cur.execute("UPDATE treasury_product SET "
"designation = 'un truc inutile';")
cur.execute("UPDATE note_specialtransaction SET "
"bank = 'le matelas', "
"first_name = 'Anne', "
"last_name = 'Onyme';")
cur.execute("UPDATE logs_changelog SET "
"ip = '127.0.0.1', "
"data = 'new data', "
"previous = 'old data';")
cur.execute("UPDATE mailer_messagelog SET "
"log_message = 'log message', "
"message_data = 'message data';")
cur.execute("UPDATE mailer_dontsendentry SET "
"to_address = 'anonymous@example.com';")
cur.execute("UPDATE oauth2_provider_application SET "
"name = 'external app', "
"redirect_uris = 'http://external.app', "
"client_secret = 'abcdefghijklmnopqrstuvwxyz';")
cur.close() cur.close()

View File

@ -1,4 +1,4 @@
# Copyright (C) 2018-2024 by BDE ENS Paris-Saclay # Copyright (C) 2018-2021 by BDE ENS Paris-Saclay
# SPDX-License-Identifier: GPL-3.0-or-later # SPDX-License-Identifier: GPL-3.0-or-later
from datetime import date from datetime import date
@ -10,7 +10,7 @@ from member.models import Club, Membership
class Command(BaseCommand): class Command(BaseCommand):
help = "Get mailing list registrations from the last wei. " \ help = "Get mailing list registrations from the last wei. " \
"Usage: manage.py extract_ml_registrations -t {events,art,sport} -l {fr, en} -y {0, 1, ...}. " \ "Usage: manage.py extract_ml_registrations -t {events,art,sport} -t {fr, en}. " \
"You can write this into a file with a pipe, then paste the document into your mail manager." "You can write this into a file with a pipe, then paste the document into your mail manager."
def add_arguments(self, parser): def add_arguments(self, parser):
@ -19,8 +19,6 @@ class Command(BaseCommand):
parser.add_argument('--lang', '-l', type=str, choices=['fr', 'en'], default='fr', parser.add_argument('--lang', '-l', type=str, choices=['fr', 'en'], default='fr',
help='Select the registred users of the ML of the given language. Useful only for the ' help='Select the registred users of the ML of the given language. Useful only for the '
'events mailing list.') 'events mailing list.')
parser.add_argument('--years', '-y', type=int, default=0,
help='Select the cumulative registred users of a membership from years ago. 0 means the current users')
def handle(self, *args, **options): def handle(self, *args, **options):
# TODO: Improve the mailing list extraction system, and link it automatically with Mailman. # TODO: Improve the mailing list extraction system, and link it automatically with Mailman.
@ -30,12 +28,10 @@ class Command(BaseCommand):
return return
if options["type"] == "members": if options["type"] == "members":
today_date = date.today()
selected_date = date(today_date.year - options["years"], today_date.month, today_date.day)
for membership in Membership.objects.filter( for membership in Membership.objects.filter(
club__name="BDE", club__name="BDE",
date_start__lte=today_date, date_start__lte=date.today(),
date_end__gte=selected_date, date_end__gte=date.today(),
).all(): ).all():
self.stdout.write(membership.user.email) self.stdout.write(membership.user.email)
return return
@ -53,11 +49,8 @@ class Command(BaseCommand):
return return
if options["type"] == "art": if options["type"] == "art":
nb=0
for user in User.objects.filter(profile__ml_art_registration=True).all(): for user in User.objects.filter(profile__ml_art_registration=True).all():
self.stdout.write(user.email) self.stdout.write(user.email)
nb+=1
self.stdout.write(str(nb))
return return
if options["type"] == "sport": if options["type"] == "sport":

View File

@ -31,7 +31,7 @@ class Command(BaseCommand):
notes = Note.objects.filter( notes = Note.objects.filter(
Q(noteuser__user__memberships__date_end__gte= Q(noteuser__user__memberships__date_end__gte=
date.today() - timedelta(days=int(365.25 * options['add_years']))) date.today() - timedelta(days=int(365.25 * options['add_years'])))
| (Q(noteclub__isnull=False) & ~Q(noteclub__club__name__icontains='- BDE')), | Q(noteclub__isnull=False),
balance__lte=-options["negative_amount"], balance__lte=-options["negative_amount"],
is_active=True, is_active=True,
).order_by('balance').distinct().all() ).order_by('balance').distinct().all()

View File

@ -1,3 +0,0 @@
BORG_PASSPHRASE='CHANGE_ME'
BORG_REPO='USER@SERVER:PATH'
BACKUP_FILE='PATH'

View File

@ -1,14 +1,9 @@
#!/bin/bash #!/bin/bash
export $(cat .env_borg | xargs)
# Create temporary backups directory # Create temporary backups directory
mkdir -p /tmp/note-backups [[ -d /tmp/note-backups ]] || mkdir /tmp/note-backups
date=$(date +%Y-%m-%d)
# Backup database # Backup database and save it as tar archive
sudo -u postgres pg_dump -F t note_db > $BACKUP_FILE su postgres -c "pg_dump -F t note_db" | tee "/tmp/note-backups/$date.tar" > /dev/null
# Compress backup as gzip
# Keep the last 30 backups gzip "/tmp/note-backups/$date.tar"
borg prune --keep-last 30 scp "/tmp/note-backups/$date.tar.gz" "club-bde@zamok.crans.org:backup/$date.tar.gz"
# Save backup
borg create --compression lz4 ::backup-{now} $BACKUP_FILE