103 lines
		
	
	
	
		
			2.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			103 lines
		
	
	
	
		
			2.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
from hashlib import sha3_256
 | 
						|
from base64 import b64decode, b64encode
 | 
						|
from binascii import hexlify
 | 
						|
from uuid import UUID
 | 
						|
 | 
						|
defaults = {
 | 
						|
    'apt': {
 | 
						|
        'packages': {
 | 
						|
            'gocryptfs': {},
 | 
						|
            'fuse': {},
 | 
						|
            'socat': {},
 | 
						|
        },
 | 
						|
    },
 | 
						|
    'gocryptfs': {
 | 
						|
        'paths': {},
 | 
						|
    },
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
@metadata_reactor.provides(
 | 
						|
    'gocryptfs',
 | 
						|
)
 | 
						|
def config(metadata):
 | 
						|
    return {
 | 
						|
        'gocryptfs': {
 | 
						|
            'masterkey': hexlify(b64decode(
 | 
						|
                str(repo.vault.random_bytes_as_base64_for(metadata.get('id'), length=32))
 | 
						|
            )).decode(),
 | 
						|
            'salt': b64encode(
 | 
						|
                sha3_256(UUID(metadata.get('id')).bytes).digest()
 | 
						|
            ).decode(),
 | 
						|
        },
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
@metadata_reactor.provides(
 | 
						|
    'gocryptfs',
 | 
						|
)
 | 
						|
def paths(metadata):
 | 
						|
    paths = {}
 | 
						|
    
 | 
						|
    for path, options in metadata.get('gocryptfs/paths').items():
 | 
						|
        paths[path] = {
 | 
						|
            'id': hexlify(sha3_256(path.encode()).digest()[:8]).decode(),
 | 
						|
        }
 | 
						|
    
 | 
						|
    return {
 | 
						|
        'gocryptfs': {
 | 
						|
            'paths': paths,
 | 
						|
        },
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
 | 
						|
@metadata_reactor.provides(
 | 
						|
    'systemd/services',
 | 
						|
)
 | 
						|
def systemd(metadata):
 | 
						|
    services = {}
 | 
						|
    
 | 
						|
    for path, options in metadata.get('gocryptfs/paths').items():
 | 
						|
        services[f'gocryptfs-{options["id"]}'] = {
 | 
						|
            'content': {
 | 
						|
                'Unit': {
 | 
						|
                    'Description': f'gocryptfs@{path} ({options["id"]})',
 | 
						|
                    'After': {
 | 
						|
                      'filesystem.target',
 | 
						|
                      'zfs.target',
 | 
						|
                    },
 | 
						|
                },
 | 
						|
                'Service': {
 | 
						|
                    'RuntimeDirectory': 'gocryptfs',
 | 
						|
                    'Environment': {
 | 
						|
                        'MASTERKEY': metadata.get('gocryptfs/masterkey'),
 | 
						|
                        'SOCKET': f'/var/run/gocryptfs/{options["id"]}',
 | 
						|
                        'PLAIN': path,
 | 
						|
                        'CIPHER': options["mountpoint"]
 | 
						|
                    },
 | 
						|
                    'ExecStart': [
 | 
						|
                        '/usr/bin/gocryptfs -fg -plaintextnames -reverse -masterkey $MASTERKEY -ctlsock $SOCKET $PLAIN $CIPHER',
 | 
						|
                    ],
 | 
						|
                    'ExecStopPost': [
 | 
						|
                        '/usr/bin/umount $CIPHER'
 | 
						|
                    ],
 | 
						|
                },
 | 
						|
            },
 | 
						|
            'needs': [
 | 
						|
                'pkg_apt:gocryptfs',
 | 
						|
                'pkg_apt:fuse',
 | 
						|
                'pkg_apt:socat',
 | 
						|
                'file:/etc/gocryptfs/masterkey',
 | 
						|
                'file:/etc/gocryptfs/gocryptfs.conf',
 | 
						|
            ],
 | 
						|
            'triggers': [
 | 
						|
                f'svc_systemd:gocryptfs-{options["id"]}:restart',
 | 
						|
            ],
 | 
						|
        }
 | 
						|
 | 
						|
    return {
 | 
						|
        'systemd': {
 | 
						|
            'services': services,
 | 
						|
        },
 | 
						|
    }
 |