The program belows reads the get fields ‘un’ and ‘ip’. If these get fields both exist, the program modifies a firewall script.

The problem is in cgiMain.

The error at the problem line is:  parse error on input `<-'

If I move the line above the ’if’ I get: Couldn't match expected type `CGIT IO t0' with actual type `IO [String]'.   

 

How can I extract values from the IO [String] monad in cgiMain? I don’t want to alter the type of  runRefreshFirewall.

 

Kees

 

module Main(

   main

)

 

where

import Network.CGI

import Text.XHtml

import Text.XHtml.Transitional

import Data.Maybe

 

runRefreshFirewall :: String -> String -> IO [String]

runRefreshFirewall un ip =  do

                                               return ["test" ]

 

inputCgiOkPage :: String -> String -> [String] -> Html

inputCgiOkPage un ip msgs = body << h1 << ("IP: " ++ (show ip))

                               

undefinedFieldsPage :: Html

undefinedFieldsPage = body << h1 << "Undefined Fields"

 

cgiMain :: CGI CGIResult  

cgiMain = do

            maybeUn <- getInput "un"

            maybeIp <- getInput "ip"

            if ((isJust maybeUn) && (isJust maybeIp)) then

               msgs <-runRefreshFirewall (fromJust maybeUn) (fromJust maybeIp)  -- problem

               output $ renderHtml $ inputCgiOkPage (fromJust maybeUn) (fromJust maybeIp) msgs

            else

                output $ renderHtml undefinedFieldsPage

main :: IO ()

main = runCGI $ handleErrors cgiMain