commit 49e918a9146cdcba451ce758ebcf42a1ff7ef242 Author: spla Date: Wed Aug 17 15:07:51 2022 +0200 first release diff --git a/blocker.py b/blocker.py new file mode 100644 index 0000000..18ef5c6 --- /dev/null +++ b/blocker.py @@ -0,0 +1,121 @@ +import os +import sys +from mastodon import Mastodon +from mastodon.Mastodon import MastodonNotFoundError, MastodonNetworkError, MastodonReadTimeout, MastodonAPIError +import psycopg2 +import requests +import pdb + +def get_servers(software): + + servers_list = [] + + try: + + conn = None + + conn = psycopg2.connect(database = fediverse_db, user = fediverse_db_user, password = "", host = "/var/run/postgresql", port = "5432") + + cur = conn.cursor() + + cur.execute("select server from fediverse where software=(%s)", (software,)) + + rows = cur.fetchall() + + for row in rows: + + servers_list.append(row[0]) + + cur.close() + + return (servers_list) + + except (Exception, psycopg2.DatabaseError) as error: + + sys.exit(error) + + finally: + + if conn is not None: + + conn.close() + +def mastodon(): + + # Load secrets from secrets file + secrets_filepath = "secrets/secrets.txt" + uc_client_id = get_parameter("uc_client_id", secrets_filepath) + uc_client_secret = get_parameter("uc_client_secret", secrets_filepath) + uc_access_token = get_parameter("uc_access_token", secrets_filepath) + + # Load configuration from config file + config_filepath = "config/config.txt" + mastodon_hostname = get_parameter("mastodon_hostname", config_filepath) + + # Initialise Mastodon API + mastodon = Mastodon( + client_id = uc_client_id, + client_secret = uc_client_secret, + access_token = uc_access_token, + api_base_url = 'https://' + mastodon_hostname, + ) + + # Initialise access headers + headers={ 'Authorization': 'Bearer %s'%uc_access_token } + + return (mastodon, mastodon_hostname, headers) + +def db_config(): + + # Load db configuration from config file + config_filepath = "config/db_config.txt" + fediverse_db = get_parameter("fediverse_db", config_filepath) + fediverse_db_user = get_parameter("fediverse_db_user", config_filepath) + + return (fediverse_db, fediverse_db_user) + +def get_parameter( parameter, file_path ): + + if not os.path.isfile(file_path): + print("File %s not found, exiting."%file_path) + sys.exit(0) + + with open( file_path ) as f: + for line in f: + if line.startswith( parameter ): + return line.replace(parameter + ":", "").strip() + + print(file_path + " Missing parameter %s "%parameter) + + sys.exit(0) + +############################################################################### +# main + +if __name__ == '__main__': + + mastodon, mastodon_hostname, headers= mastodon() + + fediverse_db, fediverse_db_user = db_config() + + software = 'birdsitelive' + + servers_list = get_servers(software) + + pdb.set_trace() + for server in servers_list: + + print(f'blocking server {server}') + + #https://mastodont.cat/admin/domain_blocks/new?_domain=pawoo.net + data = { + 'domain': server + } + url = 'https://mastodont.cat/api/v1/domain_blocks' + + re_post = requests.post(url, headers=headers, data=data) + + print(f'status code: {re_post.status_code}') + + + diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..8dc3d82 --- /dev/null +++ b/setup.py @@ -0,0 +1,249 @@ +import getpass +from mastodon import Mastodon +from mastodon.Mastodon import MastodonMalformedEventError, MastodonNetworkError, MastodonReadTimeout, MastodonAPIError, MastodonIllegalArgumentError +import fileinput,re +import os +import sys + +def create_dir(): + if not os.path.exists('secrets'): + os.makedirs('secrets') + +def create_file(): + if not os.path.exists('secrets/secrets.txt'): + with open('secrets/secrets.txt', 'w'): pass + print(secrets_filepath + " created!") + +def create_config(): + if not os.path.exists('config'): + os.makedirs('config') + if not os.path.exists(config_filepath): + print(config_filepath + " created!") + with open('config/config.txt', 'w'): pass + +def write_params(): + with open(secrets_filepath, 'a') as the_file: + print("Writing secrets parameter names to " + secrets_filepath) + the_file.write('uc_client_id: \n'+'uc_client_secret: \n'+'uc_access_token: \n') + +def write_config(): + + with open(config_filepath, 'a') as the_file: + + the_file.write('mastodon_hostname: \n') + the_file.write('bot_username: \n') + print("adding parameters 'mastodon_hostname' & 'bot_username' to "+ config_filepath) + +def read_client_lines(self): + + client_path = 'app_clientcred.txt' + + with open(client_path) as fp: + + line = fp.readline() + cnt = 1 + + while line: + + if cnt == 1: + + print("Writing client id to " + secrets_filepath) + modify_file(secrets_filepath, "uc_client_id: ", value=line.rstrip()) + + elif cnt == 2: + + print("Writing client secret to " + secrets_filepath) + modify_file(secrets_filepath, "uc_client_secret: ", value=line.rstrip()) + + line = fp.readline() + cnt += 1 + +def read_token_line(self): + + token_path = 'app_usercred.txt' + + with open(token_path) as fp: + + line = fp.readline() + print("Writing access token to " + secrets_filepath) + modify_file(secrets_filepath, "uc_access_token: ", value=line.rstrip()) + +def read_config_line(): + + with open(config_filepath) as fp: + + line = fp.readline() + modify_file(config_filepath, "mastodon_hostname: ", value=hostname) + modify_file(config_filepath, "bot_username: ", value=bot_username) + +def remove_secrets(): + + if os.path.exists("secrets/secrets.txt"): + + print("Removing secrets/secrets.txt file..") + + os.remove("secrets/secrets.txt") + +def log_in(): + + error = 0 + + try: + + global hostname + global bot_username + + hostname = input("Enter Mastodon hostname: ") + user_name = input("User name, ex. user@" + hostname +"? ") + user_password = getpass.getpass("User password? ") + bot_username = input("Bot's username, ex. wikibot: ") + app_name = input("This app name? ") + + Mastodon.create_app(app_name, scopes=["read","write"], + + to_file="app_clientcred.txt", api_base_url=hostname) + + mastodon = Mastodon(client_id = "app_clientcred.txt", api_base_url = hostname) + + mastodon.log_in( + user_name, + user_password, + scopes = ["read", "write"], + to_file = "app_usercred.txt" + ) + + except MastodonIllegalArgumentError as i_error: + + error = 1 + + sys.stdout.write(f'\n{str(i_error)}\n') + + except MastodonNetworkError as n_error: + + error = 1 + + sys.stdout.write(f'\n{str(n_error)}\n') + + except MastodonReadTimeout as r_error: + + error = 1 + + sys.stdout.write(f'\n{str(r_error)}\n') + + except MastodonAPIError as a_error: + + error = 1 + + sys.stdout.write(f'\n{str(a_error)}\n') + + finally: + + if error == 0: + + create_dir() + create_file() + write_params() + + client_path = 'app_clientcred.txt' + read_client_lines(client_path) + + token_path = 'app_usercred.txt' + read_token_line(token_path) + + if os.path.exists("app_clientcred.txt"): + + print("Removing app_clientcred.txt temp file..") + os.remove("app_clientcred.txt") + + if os.path.exists("app_usercred.txt"): + + print("Removing app_usercred.txt temp file..") + os.remove("app_usercred.txt") + + print("Secrets setup done!\n") + + else: + + remove_secrets() + + if os.path.exists("app_clientcred.txt"): + + print("Removing app_clientcred.txt file..") + os.remove("app_clientcred.txt") + + sys.exit() + +def modify_file(file_name,pattern,value=""): + + fh=fileinput.input(file_name,inplace=True) + + for line in fh: + + replacement=pattern + value + line=re.sub(pattern,replacement,line) + sys.stdout.write(line) + + fh.close() + +def get_parameter( parameter, file_path ): + + # Check if secrets file exists + if not os.path.isfile(file_path): + + print("File %s not found, creating it."%file_path) + log_in() + + # Find parameter in file + with open( file_path ) as f: + + for line in f: + + if line.startswith( parameter ): + + return line.replace(parameter + ":", "").strip() + + # Cannot find parameter, exit + print(file_path + " Missing parameter %s "%parameter) + sys.exit(0) + +def get_bot_host( parameter, config_filepath ): + + # Check if secrets file exists + if not os.path.isfile(config_filepath): + + print("File %s not found, creating it."%config_filepath) + create_config() + + # Find parameter in file + with open( config_filepath ) as f: + + for line in f: + + if line.startswith( parameter ): + + return line.replace(parameter + ":", "").strip() + + # Cannot find parameter, exit + print(config_filepath + " Missing parameter %s "%parameter) + + write_config() + read_config_line() + + print("hostname & bot_username setup done!") + sys.exit(0) + +############################################################################### +# main + +if __name__ == '__main__': + + # Load secrets from secrets file + secrets_filepath = "secrets/secrets.txt" + uc_client_id = get_parameter("uc_client_id", secrets_filepath) + uc_client_secret = get_parameter("uc_client_secret", secrets_filepath) + uc_access_token = get_parameter("uc_access_token", secrets_filepath) + + # Load configuration from config file + config_filepath = "config/config.txt" + mastodon_hostname = get_bot_host("mastodon_hostname", config_filepath) + bot_username = get_bot_host("bot_username", config_filepath)