-- | Maintainer: Sean Whitton <spwhitton@spwhitton.name>
--
-- Properties for use on <https://www.exoscale.ch/>

module Propellor.Property.HostingProvider.Exoscale (
        distroKernel,
) where

import Propellor.Base
import qualified Propellor.Property.File as File
import qualified Propellor.Property.Grub as Grub
import qualified Propellor.Property.Apt as Apt
import qualified Propellor.Property.Reboot as Reboot

-- | Flavor of kernel, eg "amd64" or "686"
type KernelFlavor = String

-- | The current Exoshare Debian image doesn't install GRUB, so this property
-- makes sure GRUB is installed and correctly configured
--
-- In case an old, insecure kernel is running, we check for an old kernel
-- version and reboot immediately if one is found.
--
-- Note that we ignore anything after the first hyphen when considering
-- whether the running kernel's version is older than the Debian-supplied
-- kernel's version.
distroKernel :: KernelFlavor -> Property DebianLike
distroKernel kernelflavor = go `flagFile` theFlagFile
  where
        go = combineProperties "boots distro kernel" $ props
                & Apt.installed ["grub2", "linux-image-" ++ kernelflavor]
                & Grub.boots "/dev/vda"
                & Grub.mkConfig
                -- Since we're rebooting we have to manually create the flagfile
                & File.hasContent theFlagFile [""]
                & Reboot.toDistroKernel
        theFlagFile = "/etc/propellor-distro-kernel"