UI for configuring fscks of remotes
This commit is contained in:
		
					parent
					
						
							
								1ffb3bb0ba
							
						
					
				
			
			
				commit
				
					
						42c4a86d16
					
				
			
		
					 4 changed files with 69 additions and 43 deletions
				
			
		| 
						 | 
				
			
			@ -13,7 +13,6 @@ module Assistant.WebApp.Configurators.Fsck where
 | 
			
		|||
import qualified Data.Map as M
 | 
			
		||||
import qualified Data.Set as S
 | 
			
		||||
import qualified Data.Text as T
 | 
			
		||||
import qualified Text.Hamlet as Hamlet
 | 
			
		||||
 | 
			
		||||
import Assistant.WebApp.Common
 | 
			
		||||
import Types.ScheduledActivity
 | 
			
		||||
| 
						 | 
				
			
			@ -21,17 +20,19 @@ import Utility.HumanTime
 | 
			
		|||
import Utility.Scheduled
 | 
			
		||||
import Logs.Schedule
 | 
			
		||||
import Annex.UUID
 | 
			
		||||
import qualified Remote
 | 
			
		||||
import Assistant.DaemonStatus
 | 
			
		||||
 | 
			
		||||
{- This adds a form to the page. It does not handle posting of the form,
 | 
			
		||||
 - because unlike a typical yesod form that posts using the same url
 | 
			
		||||
 - that generated it, this form posts using one of two other routes. -}
 | 
			
		||||
fsckForm :: Bool -> ScheduledActivity -> Widget
 | 
			
		||||
fsckForm new activity = do
 | 
			
		||||
showFsckForm :: Bool -> ScheduledActivity -> Widget
 | 
			
		||||
showFsckForm new activity = do
 | 
			
		||||
	u <- liftAnnex getUUID
 | 
			
		||||
	let action = if new
 | 
			
		||||
		then AddActivityR u
 | 
			
		||||
		else ChangeActivityR u activity
 | 
			
		||||
	((res, form), enctype) <- liftH $ runFormPost $ fsckForm' new activity
 | 
			
		||||
	((res, form), enctype) <- liftH $ runFsckForm new activity
 | 
			
		||||
	case res of
 | 
			
		||||
		FormSuccess _ -> noop
 | 
			
		||||
		_ -> $(widgetFile "configurators/fsck/form")
 | 
			
		||||
| 
						 | 
				
			
			@ -40,49 +41,73 @@ fsckForm new activity = do
 | 
			
		|||
 - some Annex action on it. -}
 | 
			
		||||
withFsckForm :: (ScheduledActivity -> Annex ()) -> Handler ()
 | 
			
		||||
withFsckForm a = do
 | 
			
		||||
	((res, _form), _enctype) <- runFormPost $ fsckForm' False defaultFsck
 | 
			
		||||
	((res, _form), _enctype) <- runFsckForm False defaultFsck
 | 
			
		||||
	case res of
 | 
			
		||||
		FormSuccess activity -> liftAnnex $ a activity
 | 
			
		||||
		_ -> noop
 | 
			
		||||
 | 
			
		||||
fsckForm' :: Bool -> ScheduledActivity -> Hamlet.Html -> MkMForm ScheduledActivity
 | 
			
		||||
fsckForm' new activity@(ScheduledSelfFsck (Schedule r t) d) msg = do
 | 
			
		||||
	(durationRes, durationView) <- mreq intField "" (Just $ durationSeconds d `quot` 60 )
 | 
			
		||||
	(timeRes, timeView) <- mreq (selectFieldList times) "" (Just t)
 | 
			
		||||
	(recurranceRes, recurranceView) <- mreq (selectFieldList recurrances) "" (Just r)
 | 
			
		||||
	let form = do
 | 
			
		||||
		webAppFormAuthToken
 | 
			
		||||
		u <- liftAnnex getUUID
 | 
			
		||||
		$(widgetFile "configurators/fsck/formcontent")
 | 
			
		||||
	let formresult = ScheduledSelfFsck
 | 
			
		||||
		<$> (Schedule <$> recurranceRes <*> timeRes)
 | 
			
		||||
		<*> (Duration <$> ((60 *) <$> durationRes))
 | 
			
		||||
	return (formresult, form)
 | 
			
		||||
mkFsck :: UUID -> UUID -> Schedule -> Duration -> ScheduledActivity
 | 
			
		||||
mkFsck hereu u s d
 | 
			
		||||
	| u == hereu = ScheduledSelfFsck s d 
 | 
			
		||||
	| otherwise = ScheduledRemoteFsck u s d
 | 
			
		||||
 | 
			
		||||
runFsckForm :: Bool -> ScheduledActivity -> Handler ((FormResult ScheduledActivity, Widget), Enctype)
 | 
			
		||||
runFsckForm new activity = case activity of
 | 
			
		||||
	ScheduledSelfFsck s d -> go s d =<< liftAnnex getUUID
 | 
			
		||||
	ScheduledRemoteFsck ru s d -> go s d ru
 | 
			
		||||
  where
 | 
			
		||||
	times :: [(Text, ScheduledTime)]
 | 
			
		||||
	times = ensurevalue t (T.pack $ fromScheduledTime t) $
 | 
			
		||||
		map (\x -> (T.pack $ fromScheduledTime x, x)) $
 | 
			
		||||
			AnyTime : map (\h -> SpecificTime h 0) [0..23]
 | 
			
		||||
	recurrances :: [(Text, Recurrance)]
 | 
			
		||||
	recurrances = ensurevalue r (T.pack $ fromRecurrance r) $
 | 
			
		||||
		[ ("every day", Daily)
 | 
			
		||||
		, ("every Sunday", Weekly 1)
 | 
			
		||||
		, ("every Monday", Weekly 2)
 | 
			
		||||
		, ("every Tuesday", Weekly 3)
 | 
			
		||||
		, ("every Wednesday", Weekly 4)
 | 
			
		||||
		, ("every Thursday", Weekly 5)
 | 
			
		||||
		, ("every Friday", Weekly 6)
 | 
			
		||||
		, ("every Saturday", Weekly 7)
 | 
			
		||||
		, ("on the 1st of the month", Monthly 1)
 | 
			
		||||
		, ("mid-month", Monthly 15)
 | 
			
		||||
		, ("once a year", Yearly 1)
 | 
			
		||||
		, ("twice a year", (Divisible 6 $ Monthly 1))
 | 
			
		||||
		, ("quarterly", (Divisible 4 $ Monthly 1))
 | 
			
		||||
		]
 | 
			
		||||
  	go (Schedule r t) d ru = do
 | 
			
		||||
		u <- liftAnnex getUUID
 | 
			
		||||
		repolist <- liftAssistant (getrepolist ru)
 | 
			
		||||
		runFormPost $ \msg -> do
 | 
			
		||||
			(reposRes, reposView) <- mreq (selectFieldList repolist) "" (Just ru)
 | 
			
		||||
			(durationRes, durationView) <- mreq intField "" (Just $ durationSeconds d `quot` 60 )
 | 
			
		||||
			(timeRes, timeView) <- mreq (selectFieldList times) "" (Just t)
 | 
			
		||||
			(recurranceRes, recurranceView) <- mreq (selectFieldList recurrances) "" (Just r)
 | 
			
		||||
			let form = do
 | 
			
		||||
				webAppFormAuthToken
 | 
			
		||||
				$(widgetFile "configurators/fsck/formcontent")
 | 
			
		||||
			let formresult = mkFsck
 | 
			
		||||
				<$> pure u
 | 
			
		||||
				<*> reposRes
 | 
			
		||||
				<*> (Schedule <$> recurranceRes <*> timeRes)
 | 
			
		||||
				<*> (Duration <$> ((60 *) <$> durationRes))
 | 
			
		||||
			return (formresult, form)
 | 
			
		||||
	  where
 | 
			
		||||
		times :: [(Text, ScheduledTime)]
 | 
			
		||||
		times = ensurevalue t (T.pack $ fromScheduledTime t) $
 | 
			
		||||
			map (\x -> (T.pack $ fromScheduledTime x, x)) $
 | 
			
		||||
				AnyTime : map (\h -> SpecificTime h 0) [0..23]
 | 
			
		||||
		recurrances :: [(Text, Recurrance)]
 | 
			
		||||
		recurrances = ensurevalue r (T.pack $ fromRecurrance r) $
 | 
			
		||||
			[ ("every day", Daily)
 | 
			
		||||
			, ("every Sunday", Weekly 1)
 | 
			
		||||
			, ("every Monday", Weekly 2)
 | 
			
		||||
			, ("every Tuesday", Weekly 3)
 | 
			
		||||
			, ("every Wednesday", Weekly 4)
 | 
			
		||||
			, ("every Thursday", Weekly 5)
 | 
			
		||||
			, ("every Friday", Weekly 6)
 | 
			
		||||
			, ("every Saturday", Weekly 7)
 | 
			
		||||
			, ("monthly", Monthly 1)
 | 
			
		||||
			, ("twice a month", Divisible 2 (Weekly 1))
 | 
			
		||||
			, ("yearly", Yearly 1)
 | 
			
		||||
			, ("twice a year", Divisible 6 (Monthly 1))
 | 
			
		||||
			, ("quarterly", Divisible 4 (Monthly 1))
 | 
			
		||||
			]
 | 
			
		||||
	ensurevalue v desc l = case M.lookup v (M.fromList $ map (\(x,y) -> (y,x)) l) of
 | 
			
		||||
		Just _ -> l
 | 
			
		||||
		Nothing -> (desc, v) : l
 | 
			
		||||
fsckForm' new (ScheduledRemoteFsck u s d) _msg = error "TODO"
 | 
			
		||||
	getrepolist :: UUID -> Assistant [(Text, UUID)]
 | 
			
		||||
	getrepolist ensureu = do
 | 
			
		||||
		-- It is possible to have fsck jobs for remotes that
 | 
			
		||||
		-- do not implement remoteFsck, but it's not too useful,
 | 
			
		||||
		-- so omit them from the UI normally.
 | 
			
		||||
		remotes <- filter (\r -> Remote.uuid r == ensureu || isJust (Remote.remoteFsck r)) . syncRemotes
 | 
			
		||||
			<$> getDaemonStatus
 | 
			
		||||
		u <- liftAnnex getUUID
 | 
			
		||||
		let us = u : (map Remote.uuid remotes)
 | 
			
		||||
		liftAnnex $ 
 | 
			
		||||
			zip <$> (map T.pack <$> Remote.prettyListUUIDs us) <*> pure us
 | 
			
		||||
 | 
			
		||||
defaultFsck :: ScheduledActivity
 | 
			
		||||
defaultFsck = ScheduledSelfFsck (Schedule Daily AnyTime) (Duration $ 60*60)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,2 +1,4 @@
 | 
			
		|||
input[type=number]
 | 
			
		||||
  width: 5em
 | 
			
		||||
select
 | 
			
		||||
  width: 10em
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -13,7 +13,7 @@
 | 
			
		|||
    <p>
 | 
			
		||||
      Currently scheduled checks:
 | 
			
		||||
      $forall check <- checks
 | 
			
		||||
        ^{fsckForm False check}
 | 
			
		||||
        ^{showFsckForm False check}
 | 
			
		||||
  <p>
 | 
			
		||||
    Add a check:
 | 
			
		||||
    ^{fsckForm True defaultFsck}
 | 
			
		||||
    ^{showFsckForm True defaultFsck}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,7 +1,7 @@
 | 
			
		|||
#{msg}
 | 
			
		||||
<p>
 | 
			
		||||
  <div .input-prepend .input-append>
 | 
			
		||||
    Check this repository for #
 | 
			
		||||
    Check ^{fvInput reposView} for #
 | 
			
		||||
    ^{fvInput durationView} minutes #
 | 
			
		||||
    ^{fvInput recurranceView} #
 | 
			
		||||
    starting at ^{fvInput timeView} #
 | 
			
		||||
| 
						 | 
				
			
			@ -13,4 +13,3 @@
 | 
			
		|||
        Save
 | 
			
		||||
      <a .btn href="@{RemoveActivityR u activity}">
 | 
			
		||||
        Remove
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue