git-annex/Assistant/Threads/WebApp.hs

110 lines
3.3 KiB
Haskell
Raw Normal View History

{- git-annex assistant webapp thread
-
- Copyright 2012 Joey Hess <joey@kitenet.net>
-
- Licensed under the GNU GPL version 3 or higher.
-}
2013-06-05 01:02:09 +00:00
{-# LANGUAGE TemplateHaskell, MultiParamTypeClasses #-}
{-# LANGUAGE CPP #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
module Assistant.Threads.WebApp where
import Assistant.Common
2012-07-31 05:11:32 +00:00
import Assistant.WebApp
import Assistant.WebApp.Types
2012-07-31 05:11:32 +00:00
import Assistant.WebApp.DashBoard
import Assistant.WebApp.SideBar
import Assistant.WebApp.Notifications
import Assistant.WebApp.RepoList
2012-07-31 05:11:32 +00:00
import Assistant.WebApp.Configurators
2012-08-31 19:17:12 +00:00
import Assistant.WebApp.Configurators.Local
import Assistant.WebApp.Configurators.Ssh
import Assistant.WebApp.Configurators.Pairing
2012-11-24 20:30:15 +00:00
import Assistant.WebApp.Configurators.AWS
import Assistant.WebApp.Configurators.IA
2012-11-17 19:30:11 +00:00
import Assistant.WebApp.Configurators.WebDAV
import Assistant.WebApp.Configurators.XMPP
import Assistant.WebApp.Configurators.Preferences
import Assistant.WebApp.Configurators.Edit
import Assistant.WebApp.Configurators.Delete
import Assistant.WebApp.Configurators.Fsck
import Assistant.WebApp.Configurators.Upgrade
import Assistant.WebApp.Documentation
import Assistant.WebApp.Control
import Assistant.WebApp.OtherRepos
import Assistant.WebApp.Repair
2012-10-29 23:07:10 +00:00
import Assistant.Types.ThreadedMonad
import Utility.WebApp
2013-05-12 23:19:28 +00:00
import Utility.Tmp
import Utility.FileMode
import Git
import Yesod
import Network.Socket (SockAddr, HostName)
2012-07-31 05:11:32 +00:00
import Data.Text (pack, unpack)
2012-07-31 05:11:32 +00:00
mkYesodDispatch "WebApp" $(parseRoutesFile "Assistant/WebApp/routes")
type Url = String
webAppThread
:: AssistantData
-> UrlRenderer
-> Bool
2013-11-17 18:58:35 +00:00
-> Maybe String
-> Maybe HostName
-> Maybe (IO Url)
-> Maybe (Url -> FilePath -> IO ())
-> NamedThread
2013-11-17 18:58:35 +00:00
webAppThread assistantdata urlrenderer noannex cannotrun listenhost postfirstrun onstartup = thread $ liftIO $ do
2013-05-02 20:47:42 +00:00
#ifdef __ANDROID__
when (isJust listenhost) $
-- See Utility.WebApp
error "Sorry, --listen is not currently supported on Android"
#endif
webapp <- WebApp
<$> pure assistantdata
<*> (pack <$> genRandomToken)
<*> getreldir
<*> pure staticRoutes
<*> pure postfirstrun
2013-11-17 18:58:35 +00:00
<*> pure cannotrun
<*> pure noannex
<*> pure listenhost
setUrlRenderer urlrenderer $ yesodRender webapp (pack "")
app <- toWaiAppPlain webapp
app' <- ifM debugEnabled
( return $ httpDebugLogger app
, return app
)
runWebApp listenhost app' $ \addr -> if noannex
2013-05-12 23:19:28 +00:00
then withTmpFile "webapp.html" $ \tmpfile _ ->
go addr webapp tmpfile Nothing
else do
let st = threadState assistantdata
htmlshim <- runThreadState st $ fromRepo gitAnnexHtmlShim
urlfile <- runThreadState st $ fromRepo gitAnnexUrlFile
go addr webapp htmlshim (Just urlfile)
2012-10-29 18:30:10 +00:00
where
-- The webapp thread does not wait for the startupSanityCheckThread
-- to finish, so that the user interface remains responsive while
-- that's going on.
thread = namedThreadUnchecked "WebApp"
2012-10-29 18:30:10 +00:00
getreldir
| noannex = return Nothing
| otherwise = Just <$>
(relHome =<< absPath
=<< runThreadState (threadState assistantdata) (fromRepo repoPath))
go addr webapp htmlshim urlfile = do
let url = myUrl webapp addr
maybe noop (`writeFileProtected` url) urlfile
writeHtmlShim "Starting webapp..." url htmlshim
2012-10-29 18:30:10 +00:00
maybe noop (\a -> a url htmlshim) onstartup
myUrl :: WebApp -> SockAddr -> Url
2013-03-13 02:18:36 +00:00
myUrl webapp addr = unpack $ yesodRender webapp urlbase DashboardR []
2012-10-29 18:30:10 +00:00
where
urlbase = pack $ "http://" ++ show addr