U Dg@sUdZddlZddlZddlmZmZddlmZddlm Z ddl m Z ddl m Z ddlmZd d d ge gd Ze ed <eeZddZedddZee eeddddZe edddZdS)z5Grub Dpkg: Configure grub debconf installation deviceN)subputil)Cloud)Config) MetaSchema) PER_INSTANCE)ProcessExecutionErrorZ cc_grub_dpkgZubuntuZdebian)idZdistrosZ frequencyZactivate_by_schema_keysmetac Cshd}g}d}d}trd}d}z tjdd||gdd j}Wnptk r}z4t|jtrht d nd |j kr~t d nW5d }~XYn t k rt tdYnX|rtj|sdSz&tjdddd|gdd j}Wn$t k rt td|YnXt dd|dd|D}t dd||rTt|dn|}t d||S)z Fetches the /dev/disk/by-id device grub is installed to. Falls back to plain disk name if no by-id entry is present. diskz/bootZdevicez /boot/efiz grub-probez-tT)Zcapturez'grub-probe' not found in $PATHzfailed to get canonical pathz)grub-probe 'failed to get canonical path'Nz*grub-probe failed to execute for grub_dpkgZudevadminfoz--rootz--query=symlinkz3udevadm DEVLINKS symlink query failed for disk='%s'z%considering these device symlinks: %s,cSsg|]}d|kr|qS)z disk/by-id).0Zdevrr?/usr/lib/python3/dist-packages/cloudinit/config/cc_grub_dpkg.py Zszfetch_idevs..z)filtered to these disk/by-id symlinks: %srz selected %s) is_efi_bootedrstdoutstripr isinstancereasonFileNotFoundErrorLOGdebugstderr Exceptionrlogexcospathexistssplitjoinsorted)r ZdevicesZ probe_targetZ probe_mounteidevsrrr fetch_idevssP        r&)returnc CsHztjdWStk rB}ztd|WYdSd}~XYnXdS)z4 Check if the system is booted in EFI mode. z/sys/firmware/efiz7Failed to determine if system is booted in EFI mode: %sFN)rrr OSErrorrerror)r$rrrrcs  r)namecfgcloudargsr'c Cs|d|di}|si}|dd}t|rDtd||dSt|}td|ztjdg|dWn0tk r}zttd |W5d}~XYnXdS) NZ grub_dpkgz grub-dpkgenabledTz*%s disabled by config grub_dpkg/enabled=%sz-Setting grub debconf-set-selections with '%s'zdebconf-set-selections)dataz6Failed to run debconf-set-selections for grub_dpkg: %s) getrZis_falserrget_debconf_configrrr)r*r+r,r-mycfgr.Z dconf_selr$rrrhandleos"   r3)r2r'cCstr*t|dd}|dkr"t}d|St|dd}|dkrFt}|d}|dkr`| }nt|tstt|}t| }d||fSdS)zd Returns the debconf config for grub-pc or grub-efi depending on the systems boot mode. zgrub-efi/install_devicesNz+grub-pc grub-efi/install_devices string %s zgrub-pc/install_deviceszgrub-pc/install_devices_emptyz[grub-pc grub-pc/install_devices string %s grub-pc grub-pc/install_devices_empty boolean %s ) rrZget_cfg_option_strr&r0rboolZtranslate_boolstrlower)r2r%Z idevs_emptyrrrr1s,    r1)__doc__ZloggingrZ cloudinitrrZcloudinit.cloudrZcloudinit.configrZcloudinit.config.schemarZcloudinit.settingsrZcloudinit.subprr __annotations__Z getLogger__name__rr&r4rr5listr3r1rrrr s$      D