#!/usr/bin/env python3 from json import loads from os import environ from subprocess import check_output from sys import exit import psycopg2 PSQL_HOST = environ['DB_HOSTNAME'] PSQL_USER = environ['DB_USERNAME'] PSQL_PASS = environ['DB_PASSWORD'] PSQL_DB = environ['DB_DATABASE_NAME'] docker_networks = loads(check_output(['docker', 'network', 'inspect', 'aaarghhh'])) container_ip = None # why the fuck is this a list of networks, even though we have to provide # a network name to inspect ... for network in docker_networks: if network['Name'] != 'aaarghhh': continue for _, container in network['Containers'].items(): if container['Name'] == PSQL_HOST: container_ip = container['IPv4Address'].split('/')[0] if not container_ip: print(f'could not find ip address for container {PSQL_HOST=} in json') print(docker_networks) exit(1) print(f'{PSQL_HOST=} {container_ip=}') conn = psycopg2.connect( dbname=PSQL_DB, host=container_ip, password=PSQL_PASS, user=PSQL_USER, ) with conn: with conn.cursor() as cur: cur.execute('SELECT "id","ownerId","albumName" FROM albums;') albums = { i[0]: { 'owner': i[1], 'name': i[2], } for i in cur.fetchall() } with conn.cursor() as cur: cur.execute('SELECT "id","name" FROM users;') users = { i[0]: i[1] for i in cur.fetchall() } for album_id, album in albums.items(): print(f'----- working on album: {album["name"]}') with conn: with conn.cursor() as cur: cur.execute('SELECT "usersId" FROM albums_shared_users_users WHERE "albumsId" = %s;', (album_id,)) album_shares = [i[0] for i in cur.fetchall()] print(f' album is shared with {len(album_shares)} users: {album_shares}') for user_id, user_name in users.items(): if user_id == album['owner'] or user_id in album_shares: continue print(f' sharing album with user {user_name} ... ', end='') with conn.cursor() as cur: cur.execute( 'INSERT INTO albums_shared_users_users ("albumsId","usersId","role") VALUES (%s, %s, %s);', (album_id, user_id, 'viewer'), ) print('done') print() conn.close()