aboutsummaryrefslogtreecommitdiff
path: root/Assistant/WebApp/DashBoard.hs
diff options
context:
space:
mode:
Diffstat (limited to 'Assistant/WebApp/DashBoard.hs')
-rw-r--r--Assistant/WebApp/DashBoard.hs237
1 files changed, 0 insertions, 237 deletions
diff --git a/Assistant/WebApp/DashBoard.hs b/Assistant/WebApp/DashBoard.hs
deleted file mode 100644
index fc6b8ea1b..000000000
--- a/Assistant/WebApp/DashBoard.hs
+++ /dev/null
@@ -1,237 +0,0 @@
-{- git-annex assistant webapp dashboard
- -
- - Copyright 2012 Joey Hess <joey@kitenet.net>
- -
- - Licensed under the GNU GPL version 3 or higher.
- -}
-
-{-# LANGUAGE CPP, TypeFamilies, QuasiQuotes, MultiParamTypeClasses, TemplateHaskell, OverloadedStrings, RankNTypes #-}
-
-module Assistant.WebApp.DashBoard where
-
-import Assistant.Common
-import Assistant.WebApp
-import Assistant.WebApp.Types
-import Assistant.WebApp.SideBar
-import Assistant.WebApp.Notifications
-import Assistant.WebApp.Configurators
-import Assistant.DaemonStatus
-import Assistant.TransferQueue
-import Assistant.TransferSlots
-import qualified Assistant.Threads.Transferrer as Transferrer
-import Utility.NotificationBroadcaster
-import Utility.Yesod
-import Logs.Transfer
-import Utility.Percentage
-import Utility.DataUnits
-import Types.Key
-import qualified Remote
-import qualified Git
-import Locations.UserConfig
-
-import Yesod
-import Text.Hamlet
-import qualified Data.Map as M
-import Control.Concurrent
-import System.Posix.Signals (signalProcessGroup, sigTERM, sigKILL)
-import System.Posix.Process (getProcessGroupIDOf)
-
-{- A display of currently running and queued transfers.
- -
- - Or, if there have never been any this run, an intro display. -}
-transfersDisplay :: Bool -> Widget
-transfersDisplay warnNoScript = do
- webapp <- lift getYesod
- current <- lift $ M.toList <$> getCurrentTransfers
- queued <- liftIO $ getTransferQueue $ transferQueue webapp
- let ident = "transfers"
- autoUpdate ident NotifierTransfersR (10 :: Int) (10 :: Int)
- let transfers = simplifyTransfers $ current ++ queued
- if null transfers
- then ifM (lift $ showIntro <$> getWebAppState)
- ( introDisplay ident
- , $(widgetFile "dashboard/transfers")
- )
- else $(widgetFile "dashboard/transfers")
- where
- isrunning info = not $
- transferPaused info || isNothing (startedTime info)
-
-{- Simplifies a list of transfers, avoiding display of redundant
- - equivilant transfers. -}
-simplifyTransfers :: [(Transfer, TransferInfo)] -> [(Transfer, TransferInfo)]
-simplifyTransfers [] = []
-simplifyTransfers (x:[]) = [x]
-simplifyTransfers (v@(t1, _):r@((t2, _):l))
- | equivilantTransfer t1 t2 = simplifyTransfers (v:l)
- | otherwise = v : (simplifyTransfers r)
-
-{- Called by client to get a display of currently in process transfers.
- -
- - Returns a div, which will be inserted into the calling page.
- -
- - Note that the head of the widget is not included, only its
- - body is. To get the widget head content, the widget is also
- - inserted onto the getHomeR page.
- -}
-getTransfersR :: NotificationId -> Handler RepHtml
-getTransfersR nid = do
- waitNotifier transferNotifier nid
-
- page <- widgetToPageContent $ transfersDisplay False
- hamletToRepHtml $ [hamlet|^{pageBody page}|]
-
-{- The main dashboard. -}
-dashboard :: Bool -> Widget
-dashboard warnNoScript = do
- sideBarDisplay
- let content = transfersDisplay warnNoScript
- $(widgetFile "dashboard/main")
-
-getHomeR :: Handler RepHtml
-getHomeR = ifM (inFirstRun)
- ( redirect ConfigR
- , bootstrap (Just DashBoard) $ dashboard True
- )
-
-{- Used to test if the webapp is running. -}
-headHomeR :: Handler ()
-headHomeR = noop
-
-{- Same as HomeR, except no autorefresh at all (and no noscript warning). -}
-getNoScriptR :: Handler RepHtml
-getNoScriptR = bootstrap (Just DashBoard) $ dashboard False
-
-{- Same as HomeR, except with autorefreshing via meta refresh. -}
-getNoScriptAutoR :: Handler RepHtml
-getNoScriptAutoR = bootstrap (Just DashBoard) $ do
- let ident = NoScriptR
- let delayseconds = 3 :: Int
- let this = NoScriptAutoR
- toWidgetHead $(hamletFile $ hamletTemplate "dashboard/metarefresh")
- dashboard False
-
-{- The javascript code does a post. -}
-postFileBrowserR :: Handler ()
-postFileBrowserR = void openFileBrowser
-
-{- Used by non-javascript browsers, where clicking on the link actually
- - opens this page, so we redirect back to the referrer. -}
-getFileBrowserR :: Handler ()
-getFileBrowserR = whenM openFileBrowser $ redirectBack
-
-{- Opens the system file browser on the repo, or, as a fallback,
- - goes to a file:// url. Returns True if it's ok to redirect away
- - from the page (ie, the system file browser was opened).
- -
- - Note that the command is opened using a different thread, to avoid
- - blocking the response to the browser on it. -}
-openFileBrowser :: Handler Bool
-openFileBrowser = do
- path <- runAnnex (error "no configured repository") $
- fromRepo Git.repoPath
- ifM (liftIO $ inPath cmd <&&> inPath cmd)
- ( do
- void $ liftIO $ forkIO $ void $
- boolSystem cmd [Param path]
- return True
- , do
- clearUltDest
- setUltDest $ "file://" ++ path
- void $ redirectUltDest HomeR
- return False
- )
- where
-#if OSX
- cmd = "open"
-#else
- cmd = "xdg-open"
-#endif
-
-{- Transfer controls. The GET is done in noscript mode and redirects back
- - to the referring page. The POST is called by javascript. -}
-getPauseTransferR :: Transfer -> Handler ()
-getPauseTransferR t = pauseTransfer t >> redirectBack
-postPauseTransferR :: Transfer -> Handler ()
-postPauseTransferR t = pauseTransfer t
-getStartTransferR :: Transfer -> Handler ()
-getStartTransferR t = startTransfer t >> redirectBack
-postStartTransferR :: Transfer -> Handler ()
-postStartTransferR t = startTransfer t
-getCancelTransferR :: Transfer -> Handler ()
-getCancelTransferR t = cancelTransfer False t >> redirectBack
-postCancelTransferR :: Transfer -> Handler ()
-postCancelTransferR t = cancelTransfer False t
-
-pauseTransfer :: Transfer -> Handler ()
-pauseTransfer = cancelTransfer True
-
-cancelTransfer :: Bool -> Transfer-> Handler ()
-cancelTransfer pause t = do
- webapp <- getYesod
- let dstatus = daemonStatus webapp
- m <- getCurrentTransfers
- liftIO $ do
- unless pause $
- {- remove queued transfer -}
- void $ dequeueTransfers (transferQueue webapp) dstatus $
- equivilantTransfer t
- {- stop running transfer -}
- maybe noop (stop dstatus) (M.lookup t m)
- where
- stop dstatus info = do
- {- When there's a thread associated with the
- - transfer, it's signaled first, to avoid it
- - displaying any alert about the transfer having
- - failed when the transfer process is killed. -}
- maybe noop signalthread $ transferTid info
- maybe noop killproc $ transferPid info
- if pause
- then void $
- alterTransferInfo dstatus t $ \i -> i
- { transferPaused = True }
- else void $
- removeTransfer dstatus t
- signalthread tid
- | pause = throwTo tid PauseTransfer
- | otherwise = killThread tid
- {- In order to stop helper processes like rsync,
- - kill the whole process group of the process running the
- - transfer. -}
- killproc pid = do
- g <- getProcessGroupIDOf pid
- void $ tryIO $ signalProcessGroup sigTERM g
- threadDelay 50000 -- 0.05 second grace period
- void $ tryIO $ signalProcessGroup sigKILL g
-
-startTransfer :: Transfer -> Handler ()
-startTransfer t = do
- m <- getCurrentTransfers
- maybe startqueued go (M.lookup t m)
- where
- go info = maybe (start info) resume $ transferTid info
- startqueued = do
- webapp <- getYesod
- let dstatus = daemonStatus webapp
- let q = transferQueue webapp
- is <- liftIO $ map snd <$> getMatchingTransfers q dstatus (== t)
- maybe noop start $ headMaybe is
- resume tid = do
- webapp <- getYesod
- let dstatus = daemonStatus webapp
- liftIO $ do
- alterTransferInfo dstatus t $ \i -> i
- { transferPaused = False }
- throwTo tid ResumeTransfer
- start info = do
- webapp <- getYesod
- let st = fromJust $ threadState webapp
- let dstatus = daemonStatus webapp
- let slots = transferSlots webapp
- liftIO $ inImmediateTransferSlot dstatus slots $ do
- program <- readProgramFile
- Transferrer.startTransfer st dstatus program t info
-
-getCurrentTransfers :: Handler TransferMap
-getCurrentTransfers = currentTransfers
- <$> (liftIO . getDaemonStatus =<< daemonStatus <$> getYesod)