packages feed

craft-0.0.0.1: src/Craft/Hostname.hs

module Craft.Hostname where

import           Control.Monad.Logger (logInfo)
import qualified Data.Text            as T

import           Craft
import qualified Craft.Hosts          as Hosts


data Hostname = Hostname String
  deriving (Eq, Show)


get :: Craft Hostname
get = Hostname <$> ($stdoutOrError =<< exec "hostname" [])

hostnamePath :: Path Abs FileP
hostnamePath = $(mkAbsFile "/etc/hostname")


instance Craftable Hostname Hostname where
  watchCraft (Hostname hn) = do
    (Hostname oldhn) <- get
    hosts <- Hosts.get
    if oldhn /= hn then do
      $logInfo . T.pack $ "Hostname " ++ oldhn ++ " /= " ++ hn
      hosts' <- craft $ Hosts.set (Hosts.Name hn) (Hosts.IP "127.0.1.1") hosts
      craft_ $ file hostnamePath & strContent .~ hn
      exec_ "hostname" [hn]
      craft_ $ Hosts.deleteName (Hosts.Name oldhn) hosts'
      (Hostname newhn) <- get
      when (newhn /= hn) $
        $craftError $ "craft Hostname failed! Expected: " ++ hn
                                         ++ " Got: " ++ newhn
      return (Updated, Hostname hn)
    else do
      craft_ $ file hostnamePath & strContent .~ hn
      case Hosts.lookup (Hosts.IP "127.0.1.1") hosts of
        Just names ->
          if Hosts.Name hn `elem` names then
            return (Unchanged, Hostname hn)
          else do
            w <- watchCraft_ $ Hosts.set (Hosts.Name hn) (Hosts.IP "127.0.1.1") hosts
            return (w, Hostname hn)
        Nothing -> do
          w <- watchCraft_ $ Hosts.set (Hosts.Name hn) (Hosts.IP "127.0.1.1") hosts
          return (w, Hostname hn)