packages feed

strongswan-sql-1.1.0.0: app/CLI/Commands/PeerCfg.hs

{-# LANGUAGE OverloadedStrings #-}
module CLI.Commands.PeerCfg where

import Control.Lens                        ((.=))
import Control.Monad                       (void, when)
import Control.Monad.IO.Class              (liftIO)
import Control.Monad.Trans.Maybe           (MaybeT(..), runMaybeT)
import CLI.Commands.Common
import CLI.Types
import Data.Default                        (def)
import Data.Maybe                          (fromMaybe)
import Data.Text                           (Text, pack, unpack)
import Control.Monad.State.Strict          (StateT, get, lift)
import StrongSwan.SQL
import System.Console.StructuredCLI hiding (Commands)

certPolicy :: (Monad m) => Validator m CertPolicy
certPolicy = return . fromName

authMethod :: (Monad m) => Validator m AuthMethod
authMethod = return . fromName

eapType :: (Monad m) => Validator m EAPType
eapType = return . fromName

cfgPeer :: Commands ()
cfgPeer = do
  cfgIKEVersion
  cfgIKEConfigId
  cfgLocalId
  cfgRemoteId
  cfgCertPolicy
  cfgUniqueIds
  cfgAuthMethod
  cfgEAPType
  cfgEAPVendor
  cfgKeyingTries
  cfgRekeyTime
  cfgReauthTime
  cfgJitter
  cfgOverTime
  cfgMobike
  cfgDPDDelay
  cfgVirtual
  cfgPool
  cfgMediation
  cfgMediatedBy
  cfgPeerId

setPeerCfg :: Text -> StateT AppState IO Action
setPeerCfg name = do
  peerCfg <- setConfig findPeerConfigByName def { _peerCfgName = name} name
  ipsecSettings . getPeerConfig .= peerCfg
  flush .= Just flushPeerCfg
  return NewLevel

cfgIKEVersion :: Commands ()
cfgIKEVersion =
    param "ike-version" "<IKE version number>" integer $ \val -> do
      ipsecSettings . getPeerConfig . peerCfgIKEVersion .= val
      flushIt

cfgIKEConfigId :: Commands ()
cfgIKEConfigId =
    param "ike-config-id" "<IKE configuration ID>" integer $ \val -> do
      ipsecSettings . getPeerConfig . peerCfgIKEConfigId .= Just val
      flushIt

cfgLocalId :: Commands ()
cfgLocalId =
    param "local-identity-id" "<local identity>" integer $ \val -> do
      ipsecSettings . getPeerConfig . peerCfgLocalId .= Just val
      flushIt

cfgRemoteId :: Commands ()
cfgRemoteId =
    param "remote-identity-id" "<remote identity>" integer $ \val -> do
      ipsecSettings . getPeerConfig . peerCfgRemoteId .= Just val
      flushIt

cfgCertPolicy :: Commands ()
cfgCertPolicy =
    param "cert-policy" "<certificate transmission policy: always-send|send-if-asked|never-send" certPolicy $ \policy -> do
      ipsecSettings . getPeerConfig . peerCfgCertPolicy .= policy
      flushIt

cfgUniqueIds :: Commands ()
cfgUniqueIds =
    param "unique-ids" "<true | false>" readBool $ \val -> do
      ipsecSettings . getPeerConfig . peerCfgUniqueIds .= val
      flushIt

cfgAuthMethod :: Commands ()
cfgAuthMethod =
    param "auth-method" "<any|rsa|psk|eap|xauth>" authMethod $ \method -> do
      ipsecSettings . getPeerConfig . peerCfgAuthMethod .= method
      flushIt

cfgEAPType :: Commands ()
cfgEAPType =
    param "eap-type" "<md5|gtc|tls|sim|ttls|aka|mschapv2|tnc|radius>" eapType $ \t -> do
      ipsecSettings . getPeerConfig . peerCfgEAPType .= t
      flushIt

cfgEAPVendor :: Commands ()
cfgEAPVendor =
    param "eap-vendor" "<EAP vendor id>" integer $ \val -> do
      ipsecSettings . getPeerConfig . peerCfgEAPVendor .= val
      flushIt

cfgKeyingTries :: Commands ()
cfgKeyingTries =
    param "keying-tries" "<number of keying attempts" integer $ \val -> do
      ipsecSettings . getPeerConfig . peerCfgKeyingTries .= val
      flushIt

cfgRekeyTime :: Commands ()
cfgRekeyTime =
    param "rekey-timeout" "<seconds>" integer $ \val -> do
      ipsecSettings . getPeerConfig . peerCfgRekeyTime .= val
      flushIt

cfgReauthTime :: Commands ()
cfgReauthTime =
    param "reauth-timeout" "<seconds>" integer $ \val -> do
      ipsecSettings . getPeerConfig . peerCfgReauthTime .= val
      flushIt

cfgJitter :: Commands ()
cfgJitter =
    param "jitter" "<connection jitter>" integer $ \val -> do
      ipsecSettings . getPeerConfig . peerCfgJitter .= val
      flushIt

cfgOverTime :: Commands ()
cfgOverTime =
    param "overtime" "<seconds>" integer $ \val -> do
      ipsecSettings . getPeerConfig . peerCfgOverTime .= val
      flushIt

cfgMobike :: Commands ()
cfgMobike =
    param "mobike" "<enabled|disabled>" readEnabled $ \val -> do
      ipsecSettings . getPeerConfig . peerCfgMobike .= val
      flushIt

cfgDPDDelay :: Commands ()
cfgDPDDelay =
    param "dpd-delay" "<seconds>" integer $ \val -> do
      ipsecSettings . getPeerConfig . peerCfgDPDDelay .= val
      flushIt

cfgVirtual :: Commands ()
cfgVirtual =
    param "virtual-ip" "<IP address>" ipAddress $ \addr -> do
      ipsecSettings . getPeerConfig . peerCfgVirtual .= (return . pack $ show addr)
      flushIt

cfgPool :: Commands ()
cfgPool =
    param "addr-pool" "<pool name>" string $ \name -> do
      ipsecSettings . getPeerConfig . peerCfgPool .= return name
      flushIt

cfgMediation :: Commands ()
cfgMediation =
    param "mediaton" "<enabled|disabled>" readEnabled $ \val -> do
      ipsecSettings . getPeerConfig . peerCfgMediation .= val
      flushIt

cfgMediatedBy :: Commands ()
cfgMediatedBy =
    param "mediated-by" "<mediator id>" integer $ \val -> do
      ipsecSettings . getPeerConfig . peerCfgMediatedBy .= val
      flushIt

cfgPeerId :: Commands ()
cfgPeerId =
    param "peer-id" "<peer id>" integer $ \val -> do
      ipsecSettings . getPeerConfig . peerCfgPeerId .= val
      flushIt

flushPeerCfg :: StateT AppState IO Action
flushPeerCfg = do
    AppState{_ipsecSettings = IPSecSettings{_getPeerConfig=peer@PeerConfig{..}}, ..} <- get
    Result {response = OK {..}} <- lift $ writePeerConfig peer _dbContext
    when (okAffectedRows /= 1 ) $
      liftIO . putStrLn $ "(1) warning: affected " ++ show okAffectedRows ++ " (expected 1)"
    void . runMaybeT $ do
      peerCfg:xs <- findPeerConfigByName _peerCfgName _dbContext
      when (xs /= []) $
        liftIO . putStrLn $
          "Warning: more than one peer config named " ++ unpack _peerCfgName ++ " found"
      lift $ ipsecSettings . getPeerConfig .= peerCfg
    return NoAction

showPeer :: Commands ()
showPeer =
  command "show" "Show this peer configuration" showPeer'

showPeer' :: StateT AppState IO Action
showPeer' = do
  AppState{_ipsecSettings = IPSecSettings{_getPeerConfig=PeerConfig{..}}} <- get
  let iD = _peerCfgId >>= return . show
  liftIO $ do
    putStr "Peer Config "
    when (_peerCfgName /= "") $ putStr $ '\'': unpack _peerCfgName ++ "' "
    putStrLn $ "(ID: " ++ fromMaybe "*uncommitted*" iD ++ ")"
    putStrLn $ "==================================";
    putStrLn $ "IKE version:     " ++ show _peerCfgIKEVersion
    putStrLn $ "IKE config ID:   " ++ show _peerCfgIKEConfigId
    putStrLn $ "Local identity:  " ++ show _peerCfgLocalId
    putStrLn $ "Remote identity: " ++ show _peerCfgRemoteId
    putStrLn $ "Cert. policy:    " ++ nameOf _peerCfgCertPolicy
    putStrLn $ "Unique Ids:      " ++ nameOf _peerCfgUniqueIds
    putStrLn $ "Auth method:     " ++ nameOf _peerCfgAuthMethod
    putStrLn $ "EAP type:        " ++ nameOf _peerCfgEAPType
    putStrLn $ "EAP vendor:      " ++ show _peerCfgEAPVendor
    putStrLn $ "Keying tries:    " ++ show _peerCfgKeyingTries
    putStrLn $ "Rekey timeout:   " ++ show _peerCfgRekeyTime ++ " secs"
    putStrLn $ "Reauth timeout:  " ++ show _peerCfgReauthTime ++ " secs"
    putStrLn $ "Jitter:          " ++ show _peerCfgJitter ++ " secs"
    putStrLn $ "Overtime:        " ++ show _peerCfgOverTime ++ " secs"
    putStrLn $ "MobIKE:          " ++ showEnabled _peerCfgMobike
    putStrLn $ "DPD delay:       " ++ show _peerCfgDPDDelay ++ " secs"
    putStrLn $ "Virtual IP:      " ++ maybe "<none>" unpack _peerCfgVirtual
    putStrLn $ "Address pool:    " ++ maybe "<none>" unpack _peerCfgPool
    putStrLn $ "Mediation:       " ++ showEnabled _peerCfgMediation
    putStrLn $ "Mediated by:     " ++ show _peerCfgMediatedBy
    putStrLn $ "Peer ID:         " ++ show _peerCfgPeerId
  return NoAction