90 lines
		
	
	
	
		
			2.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			90 lines
		
	
	
	
		
			2.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
from hashlib import pbkdf2_hmac
 | 
						|
from base64 import b64encode, b64decode
 | 
						|
 | 
						|
defaults = {
 | 
						|
    'apt': {
 | 
						|
        'packages': {
 | 
						|
            'mosquitto': {},
 | 
						|
        },
 | 
						|
    },
 | 
						|
    'mosquitto': {
 | 
						|
        'users': {},
 | 
						|
    },
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
def password_file_entry(username, password, salt):
 | 
						|
    hash = pbkdf2_hmac('sha512', password.encode(), b64decode(salt), 101)
 | 
						|
    return f"{username}:$7$101${salt}${b64encode(hash).decode()}"
 | 
						|
 | 
						|
 | 
						|
@metadata_reactor.provides(
 | 
						|
    'mosquitto/users'
 | 
						|
)
 | 
						|
def passwords_and_salts(metadata):
 | 
						|
    return  {
 | 
						|
        'mosquitto': {
 | 
						|
            'users': {
 | 
						|
                username: {
 | 
						|
                    'password': str(
 | 
						|
                        repo.vault.random_bytes_as_base64_for(
 | 
						|
                            f"{metadata.get('id')} mosquitto {username}",
 | 
						|
                            key='encrypt',
 | 
						|
                            length=24,
 | 
						|
                        )
 | 
						|
                    ),
 | 
						|
                    'salt': str(
 | 
						|
                        repo.vault.random_bytes_as_base64_for(
 | 
						|
                            f"{metadata.get('id')} mosquitto {username}",
 | 
						|
                            key='generate',
 | 
						|
                            length=12,
 | 
						|
                        )
 | 
						|
                    )
 | 
						|
                }
 | 
						|
                    for username in metadata.get('mosquitto/users')
 | 
						|
            },
 | 
						|
        },
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
@metadata_reactor.provides(
 | 
						|
    'mosquitto/users'
 | 
						|
)
 | 
						|
def password_file(metadata):
 | 
						|
    return  {
 | 
						|
        'mosquitto': {
 | 
						|
            'users': {
 | 
						|
                username: {
 | 
						|
                    'password_file': password_file_entry(username, conf['password'], conf['salt']),
 | 
						|
                }
 | 
						|
                    for username, conf in metadata.get('mosquitto/users').items()
 | 
						|
            },
 | 
						|
        },
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
@metadata_reactor.provides(
 | 
						|
    'systemd-mount'
 | 
						|
)
 | 
						|
def mount_certs(metadata):
 | 
						|
    return  {
 | 
						|
        'systemd-mount': {
 | 
						|
            '/etc/mosquitto/certs': {
 | 
						|
                'source': '/var/lib/dehydrated/certs/' + metadata.get('mosquitto/hostname'),
 | 
						|
                'user': 'mosquitto',
 | 
						|
            },
 | 
						|
        },
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
@metadata_reactor.provides(
 | 
						|
    'letsencrypt/domains'
 | 
						|
)
 | 
						|
def letsencrypt(metadata):
 | 
						|
    return  {
 | 
						|
        'letsencrypt': {
 | 
						|
            'domains': {
 | 
						|
                metadata.get('mosquitto/hostname'): {},
 | 
						|
            },
 | 
						|
        },
 | 
						|
    }
 |