140 lines
		
	
	
	
		
			3.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			140 lines
		
	
	
	
		
			3.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
# TODO pin repo: https://superuser.com/a/1595920
 | 
						|
 | 
						|
from os.path import join, basename
 | 
						|
 | 
						|
directories = {
 | 
						|
    '/etc/apt': {
 | 
						|
        'purge': True,
 | 
						|
        'triggers': {
 | 
						|
            'action:apt_update',
 | 
						|
        },
 | 
						|
    },
 | 
						|
    '/etc/apt/apt.conf.d': {
 | 
						|
        # existance is expected
 | 
						|
        'purge': True,
 | 
						|
        'triggers': {
 | 
						|
            'action:apt_update',
 | 
						|
        },
 | 
						|
    },
 | 
						|
    '/etc/apt/keyrings': {
 | 
						|
        # https://askubuntu.com/a/1307181
 | 
						|
        'purge': True,
 | 
						|
        'triggers': {
 | 
						|
            'action:apt_update',
 | 
						|
        },
 | 
						|
    },
 | 
						|
    # '/etc/apt/listchanges.conf.d': {
 | 
						|
    #     'purge': True,
 | 
						|
    #     'triggers': {
 | 
						|
    #         'action:apt_update',
 | 
						|
    #     },
 | 
						|
    # },
 | 
						|
    '/etc/apt/preferences.d': {
 | 
						|
        'purge': True,
 | 
						|
        'triggers': {
 | 
						|
            'action:apt_update',
 | 
						|
        },
 | 
						|
    },
 | 
						|
    '/etc/apt/sources.list.d': {
 | 
						|
        'purge': True,
 | 
						|
        'triggers': {
 | 
						|
            'action:apt_update',
 | 
						|
        },
 | 
						|
    },
 | 
						|
}
 | 
						|
 | 
						|
files = {
 | 
						|
    '/etc/apt/apt.conf': {
 | 
						|
        'content': repo.libs.apt.render_apt_conf(node.metadata.get('apt/config')),
 | 
						|
        'triggers': {
 | 
						|
            'action:apt_update',
 | 
						|
        },
 | 
						|
    },
 | 
						|
    '/etc/apt/sources.list': {
 | 
						|
        'content': '# managed by bundlewrap\n',
 | 
						|
        'triggers': {
 | 
						|
            'action:apt_update',
 | 
						|
        },
 | 
						|
    },
 | 
						|
    # '/etc/apt/listchanges.conf': {
 | 
						|
    #     'content': repo.libs.ini.dumps(node.metadata.get('apt/list_changes')),
 | 
						|
    # },
 | 
						|
    '/usr/lib/nagios/plugins/check_apt_upgradable': {
 | 
						|
        'mode': '0755',
 | 
						|
    },
 | 
						|
    # /etc/kernel/postinst.d/apt-auto-removal
 | 
						|
}
 | 
						|
 | 
						|
actions = {
 | 
						|
    'apt_update': {
 | 
						|
        'command': 'apt-get update',
 | 
						|
        'needed_by': {
 | 
						|
            'pkg_apt:',
 | 
						|
        },
 | 
						|
        'triggered': True,
 | 
						|
        'cascade_skip': False,
 | 
						|
    },
 | 
						|
}
 | 
						|
 | 
						|
# create sources.lists and respective keyfiles
 | 
						|
 | 
						|
for name, config in node.metadata.get('apt/sources').items():
 | 
						|
    # place keyfile
 | 
						|
    keyfile_destination_path = repo.libs.apt.format_variables(node, config['options']['Signed-By'])
 | 
						|
    files[keyfile_destination_path] = {
 | 
						|
        'source': join(repo.path, 'data', 'apt', 'keys', basename(keyfile_destination_path)),
 | 
						|
        'content_type': 'binary',
 | 
						|
        'triggers': {
 | 
						|
            'action:apt_update',
 | 
						|
        },
 | 
						|
    }
 | 
						|
 | 
						|
    # place sources.list
 | 
						|
    files[f'/etc/apt/sources.list.d/{name}.sources'] = {
 | 
						|
        'content': repo.libs.apt.render_source(node, name),
 | 
						|
        'triggers': {
 | 
						|
            'action:apt_update',
 | 
						|
        },
 | 
						|
    }
 | 
						|
 | 
						|
# create backport pinnings
 | 
						|
 | 
						|
for package, options in node.metadata.get('apt/packages', {}).items():
 | 
						|
    pkg_apt[package] = options
 | 
						|
 | 
						|
    if pkg_apt[package].pop('backports', False):
 | 
						|
        files[f'/etc/apt/preferences.d/{package}'] = {
 | 
						|
            'content': '\n'.join([
 | 
						|
                f"Package: {package}",
 | 
						|
                f"Pin: release a={node.metadata.get('os_codename')}-backports",
 | 
						|
                f"Pin-Priority: 900",
 | 
						|
            ]),
 | 
						|
            'needed_by': [
 | 
						|
                f'pkg_apt:{package}',
 | 
						|
            ],
 | 
						|
            'triggers': {
 | 
						|
                'action:apt_update',
 | 
						|
            },
 | 
						|
        }
 | 
						|
 | 
						|
# unattended upgrades
 | 
						|
#
 | 
						|
# unattended-upgrades.service: delays shutdown if necessary
 | 
						|
# apt-daily.timer: performs apt update
 | 
						|
# apt-daily-upgrade.timer: performs apt upgrade
 | 
						|
 | 
						|
svc_systemd['unattended-upgrades.service'] = {
 | 
						|
    'needs': [
 | 
						|
        'pkg_apt:unattended-upgrades',
 | 
						|
    ],
 | 
						|
}
 | 
						|
svc_systemd['apt-daily.timer'] = {
 | 
						|
    'needs': [
 | 
						|
        'pkg_apt:unattended-upgrades',
 | 
						|
    ],
 | 
						|
}
 | 
						|
svc_systemd['apt-daily-upgrade.timer'] = {
 | 
						|
    'needs': [
 | 
						|
        'pkg_apt:unattended-upgrades',
 | 
						|
    ],
 | 
						|
}
 |