#! /usr/bin/python3 import sys import os import re from argparse import ArgumentParser, RawTextHelpFormatter from configparser import ConfigParser from nextcloud_export import read_config, nextcloud_connect, sql_groups CONFIG_PATH = '/var/www/nextcloud/config/config.php' def fetch_data(conn, config): sql = """ SELECT carddata FROM oc_cards JOIN oc_addressbooks ON addressbookid = oc_addressbooks.id WHERE displayname IN ({0}) """.format(sql_groups(config, 'lbdb')) cursor = conn.cursor() cursor.execute(sql) data = [] pattern = re.compile(r"(TEL|ORG|FN)(;TYPE=(.*))?:(.*)") for row in cursor.fetchall(): name = None phone = [] org = None for line in row[0].decode().split('\r\n'): match = pattern.match(line) if match: if match.group(1) == 'FN': name = match.group(4) if match.group(1) == 'ORG': org = match.group(4) if match.group(1) == 'TEL': phone.append((match.group(4), match.group(3).replace(',VOICE', '').lower())) else: for tel, typ in phone: data.append(dict(fn=name, org=org, typ=typ, tel=tel)) return data def print_data(rows): for row in rows: name = row['fn'] if row['org'] and len(row['org']): name += ', ' + row['org'] try: print("{}: {} ({})".format(row['tel'], name, row['typ'])) except UnicodeEncodeError: pass def parse_arguments(): epilog = [] parser = ArgumentParser(description='Nextcloud export utility', formatter_class=RawTextHelpFormatter, epilog='\r\n'.join(epilog)) parser.add_argument('--config', '-c', dest='config', action='store', default=CONFIG_PATH, help='Path to Nextcloud configuration') parser.add_argument('--with-exception', dest='exception', default=False, action='store_true', help='display full exception') return parser.parse_args() def main(args): config = ConfigParser() config.read(os.path.expanduser(args.config), encoding='UTF-8') nextcloud_config = read_config(config.get('nextcloud', 'config')) conn = nextcloud_connect(nextcloud_config) data = fetch_data(conn, config) print_data(data) if __name__ == '__main__': args = parse_arguments() try: main(args) except Exception as e: if args.exception: from traceback import format_exc print(e, file=sys.stderr) print(format_exc(), file=sys.stderr) else: print("An error occurred:", e)