packages feed

iptadmin-1.0.0: src/IptAdmin/ShowPage.hs

{-# LANGUAGE OverloadedStrings #-}

module IptAdmin.ShowPage where

import Control.Monad.Error
import Happstack.Server.SimpleHTTP
import Template
import IptAdmin.Render
import IptAdmin.ShowPage.Render
import IptAdmin.System
import IptAdmin.Types
import IptAdmin.Utils
import Iptables
import Iptables.Types
import Text.Blaze
import qualified Text.Blaze.Html5 as H
import qualified Text.Blaze.Html5.Attributes as A
import Text.Blaze.Renderer.String (renderHtml)

pageHandlers :: IptAdmin Response
pageHandlers = msum [ methodSP GET pageHandlerGet
                    , methodSP POST pageHandlerPost
                    ]

pageHandlerGet :: IptAdmin Response
pageHandlerGet = do
    table <- getInputOrEmptyString "table"

    iptables <- getIptables

    case table of
        "" -> showFilter iptables
        "filter" -> showFilter iptables
        "nat" -> showNat iptables
        "mangle" -> showMangle iptables
        "raw" -> throwError "We're sorry, the Raw table is not supported yet"
        a -> throwError $ "Invalid table parameter: " ++ a

showFilter :: Iptables -> IptAdmin Response
showFilter iptables = do
    let filter' = renderTable ("filter", "Filter") $ sortFilterTable $ tFilter iptables
    return $ buildResponse $ Template.htmlWrapper $ renderHtml $ do
        header "filter" "Iptables Filter table"
        showPageHtml filter'

showNat :: Iptables -> IptAdmin Response
showNat iptables = do
    let nat = renderTable ("nat", "Nat") $ sortNatTable $ tNat iptables
    return $ buildResponse $ Template.htmlWrapper $ renderHtml $ do
        header "nat" "Iptables Nat table"
        showPageHtml nat

showMangle :: Iptables -> IptAdmin Response
showMangle iptables = do
    let mangle = renderTable ("mangle", "Mangle") $ sortMangleTable $ tMangle iptables
    return $ buildResponse $ Template.htmlWrapper $ renderHtml $ do
        header "mangle" "Iptables Mangle table. Unfortunately rule editing is not supported for Mangle yet."
        showPageHtml mangle

pageHandlerPost :: IptAdmin Response
pageHandlerPost = undefined

showPageHtml :: Html -> Html
showPageHtml table =
    H.div ! A.id "rules" $
        table