packages feed

iptadmin-1.0.0: src/IptAdmin/Render.hs

{-# LANGUAGE OverloadedStrings #-}

module IptAdmin.Render where

import Data.List
import Data.Monoid (mempty)
import Data.String (fromString)
import Data.Version
import Iptables.Print
import Iptables.Types
import Paths_iptadmin (version)
import Text.Blaze
import qualified Text.Blaze.Html5 as H
import qualified Text.Blaze.Html5.Attributes as A

header :: String -> String -> Html
header tableName pageHeader = do
    let filterB = tableName == "filter"
    let mangleB = tableName == "mangle"
    let natB = tableName == "nat"
    title
    logout
    links filterB natB mangleB
    H.div ! A.class_ "pageHeader" $
        fromString pageHeader

title :: Html
title =
    H.div ! A.id "title" $ do
        H.a ! A.class_ "title" ! A.href "/" $ "IptAdmin"
        H.span ! A.class_ "version" $
            fromString $ intercalate "." $ map show $ versionBranch version

-- Booleans says which link should be distinguished
links :: Bool -> Bool -> Bool -> Html
links filt nat mangle =
    let
        filtA = H.a ! A.href "/show?table=filter" $ "Filter"
        natA = H.a ! A.href "/show?table=nat" $ "Nat"
        mangleA = H.a ! A.href "/show?table=mangle" $ "Mangle"
    in
        H.div ! A.id "links" $ do
            H.span $
                if filt then filtA ! A.class_ "activeTableLink"
                        else filtA ! A.class_ "tableLink"
            " "
            H.span $
                if nat then natA ! A.class_ "activeTableLink"
                       else natA ! A.class_ "tableLink"
            " "
            H.span $
                if mangle then mangleA ! A.class_ "activeTableLink"
                          else mangleA ! A.class_ "tableLink"

logout :: Html
logout =
    H.div ! A.class_ "logout" $
        H.a ! A.href "/logout" $ "Logout"

renderTarget :: RuleTarget -> (Html, Html)
renderTarget target = case target of
            TAccept -> (H.span ! A.class_ "acceptTarget" $ "ACCEPT", mempty)
            TDrop -> (H.span ! A.class_ "dropTarget" $ "DROP", mempty)
            TReject rejectType ->
                let target' = H.span ! A.class_ "rejectTarget" $ "REJECT"
                    param = case rejectType of
                        RTNetUnreachable -> "icmp-net-unreachable"
                        RTHostUnreachable -> "icmp-host-unreachable"
                        RTPortUnreachable -> "icmp-port-unreachable"
                        RTProtoUnreachable -> "icmp-proto-unreachable"
                        RTNetProhibited -> "icmp-net-prohibited"
                        RTHostProhibited -> "icmp-host-prohibited"
                        RTAdminProhibited -> "icmp-admin-prohibited"
                        RTTcpReset -> "tcp-reset"
                in
                    (target', param)
            TReturn -> (H.span ! A.class_ "returnTarget" $ "RETURN", mempty)
            TSNat natAddr rand persist ->
                let target' = H.span ! A.class_ "snatTarget" $ "SNAT"
                    param = do
                        fromString (printNatAddr natAddr)
                        " "
                        if rand then "random"
                                else mempty :: Html
                        " "
                        if persist then "persist"
                                   else mempty :: Html
                in
                    (target', param)
            TDNat natAddr rand persist ->
                let target' = H.span ! A.class_ "dnatTarget" $ "DNAT"
                    param = do
                        fromString (printNatAddr natAddr)
                        " "
                        if rand then "random"
                                else mempty :: Html
                        " "
                        if persist then "persist"
                                   else mempty :: Html
                in
                    (target', param)
            TMasquerade natPort rand ->
                let target' = H.span ! A.class_ "masqueradeTarget" $ "MASQUERADE"
                    param = do
                        case natPort of
                            NatPortDefault -> mempty :: Html
                            _ -> fromString (printNatPort natPort)
                        if rand then do
                                    " "
                                    "random"
                                else mempty :: Html
                in
                    (target', param)
            TRedirect natPort rand ->
                let target' = H.span ! A.class_ "redirectTarget" $ "REDIRECT"
                    param = do
                        case natPort of
                            NatPortDefault -> mempty :: Html
                            _ -> fromString (printNatPort natPort)
                        if rand then do
                                    " "
                                    "random"
                                else mempty :: Html
                in
                    (target', param)
            TUChain chainName ->
                let target' = H.span ! A.class_ "chainTarget" $ "CHAIN"
                    param = fromString chainName
                in
                    (target', param)
            TUnknown tName params ->
                let target' = H.span ! A.class_ "unknownTarget" $ fromString tName
                    param = fromString $ unwords params
                in (target', param)