class syslinux ( String $kernel = 'linux', String $efi_root = '/boot/efi', String $bootentry = 'syslinux', Hash[String,Syslinux::Bootentry,1] $boot_entries, String $default_boot_entry = $boot_entries.map |$k, $_| { $k }[0], ) { $efi_dev = $facts['mountpoints'][$efi_root] if ! $efi_dev { fail("A device needs to be mounted on efi_root [${efi_root}]") } # $efi_dev['device'] ensure_packages ([ $kernel, mkinitcpio, syslinux, efibootmgr, ], { ensure => installed, }) file { "/etc/mkinitcpio.d/${kernel}.preset": ensure => file, source => "puppet:///modules/${module_name}/mkinitcpio.${kernel}", } # cp -r /usr/lib/syslinux/efi64 ${efi_root}/EFI/syslinux $device = $facts['mountpoints']['/']['device'] $partuuid = $facts['blkid'][$device]['PARTUUID'] $cpus = $facts['processors']['models'] $has_amd = $cpus.any |$i| { $i =~ /AMD/ } $has_intel = $cpus.any |$i| { $i =~ /Intel/ } if $has_amd { ensure_packages(['amd-ucode']) } if $has_intel { ensure_packages(['intel-ucode']) } $entries = $boot_entries.map |$key, $entry| { case $entry['type'] { 'linux': { $extra_args = $entry['extra_args'] $initrd = $entry['initrd'] $initrd_multi = [ if $has_amd { '../amd-ucode.img' }, if $has_intel { '../intel-ucode.img' }, "../arch/${initrd}", ].filter |$i| { $i != undef }.join(',') $hash = { 'APPEND' => "root=PARTUUID=${partuuid} rw ${extra_args}", 'INITRD' => $initrd_multi, 'LINUX' => "../arch/vmlinuz-${kernel}", } } 'com': { $com = $entry['com'] $hash = { 'COM32' => "${com}.c32", } } } $common = { 'MENU LABEL' => $entry['label'], } [$key, $common + $hash] }.convert_to(Hash) file { "${efi_root}/EFI/syslinux/syslinux.cfg": content => epp("${module_name}/syslinux.cfg.epp", { 'default' => $default_boot_entry, 'entries' => $entries, }) } file { "${efi_root}/EFI/arch": ensure => directory, } $has_syslinux = $facts['efi']['boots'].any |$_, $value| { $value == $bootentry } $partition = $facts['partinfo'][basename($efi_dev['device'])] if ! $has_syslinux { $efi_device = $partition['device'] $partid = $partition['partid'] exec { "efibootmgr --disk '/dev/${efi_device}' --part ${partid} --create --label '${bootentry}' --loader /EFI/syslinux/syslinux.efi": path => [ '/usr/bin', '/bin', ], } } file { '/usr/libexec': ensure => directory, } file { '/usr/libexec/move-kernel': ensure => file, mode => '0555', content => @("EOF"/$) #!/bin/sh # File managed by Puppet IFS='\n' read data cp "/\$data" "${efi_root}/EFI/arch/vmlinuz-${kernel}" | EOF } file { '/usr/libexec/move-ucode': ensure => file, mode => '0555', content => @("EOF"/$) #!/bin/sh # File managed by Puppet IFS='\n' read data cp "/\$data" "${efi_root}/EFI/" | EOF } pacman::hook { 'install-kernel': priority => 60, # something less than /usr/share/libalpm/hooks/90-mkinitcpio-install.hook trigger => { type => 'Path', operation => [ 'Install', 'Upgrade' ], target => [ 'usr/lib/modules/*/vmlinuz', ], }, description => 'Moving kernel to EFI', when => 'PostTransaction', exec => '/usr/libexec/move-kernel', needsTargets => true , } pacman::hook { 'install-ucode-initrd': priority => 60, trigger => { type => 'Path', operation => [ 'Install', 'Upgrade' ], target => [ 'boot/*-ucode.img', ], }, description => 'Moving µCode-updates to EFI', when => 'PostTransaction', exec => '/usr/libexec/move-ucode', needsTargets => true , } }