Run remote propellor --spin with a controlling terminal.
Avoids need for hack to make ansi colors work, but also things like apt-get and wget process bars will be displayed.
This commit is contained in:
parent
973025723c
commit
40f6d06f1a
|
@ -8,6 +8,7 @@ propellor (0.9.3) UNRELEASED; urgency=medium
|
||||||
* DigitalOcean.distroKernel property now reboots into the distribution
|
* DigitalOcean.distroKernel property now reboots into the distribution
|
||||||
kernel when necessary.
|
kernel when necessary.
|
||||||
* Avoid outputting color setting sequences when not run on a terminal.
|
* Avoid outputting color setting sequences when not run on a terminal.
|
||||||
|
* Run remote propellor --spin with a controlling terminal.
|
||||||
|
|
||||||
-- Joey Hess <joeyh@debian.org> Mon, 10 Nov 2014 11:15:27 -0400
|
-- Joey Hess <joeyh@debian.org> Mon, 10 Nov 2014 11:15:27 -0400
|
||||||
|
|
||||||
|
|
|
@ -41,7 +41,7 @@ processCmdLine = go =<< getArgs
|
||||||
where
|
where
|
||||||
go ("--help":_) = usage
|
go ("--help":_) = usage
|
||||||
go ("--spin":h:[]) = return $ Spin h
|
go ("--spin":h:[]) = return $ Spin h
|
||||||
go ("--boot":h:[]) = return $ Boot h
|
go ("--sync":[]) = return $ Sync
|
||||||
go ("--add-key":k:[]) = return $ AddKey k
|
go ("--add-key":k:[]) = return $ AddKey k
|
||||||
go ("--set":f:c:[]) = withprivfield f c Set
|
go ("--set":f:c:[]) = withprivfield f c Set
|
||||||
go ("--dump":f:c:[]) = withprivfield f c Dump
|
go ("--dump":f:c:[]) = withprivfield f c Dump
|
||||||
|
@ -91,7 +91,7 @@ defaultMain hostlist = do
|
||||||
( onlyProcess $ withhost hn mainProperties
|
( onlyProcess $ withhost hn mainProperties
|
||||||
, go True (Spin hn)
|
, go True (Spin hn)
|
||||||
)
|
)
|
||||||
go False (Boot hn) = onlyProcess $ withhost hn boot
|
go False Sync = onlyProcess sync
|
||||||
|
|
||||||
withhost :: HostName -> (Host -> IO ()) -> IO ()
|
withhost :: HostName -> (Host -> IO ()) -> IO ()
|
||||||
withhost hn a = maybe (unknownhost hn hostlist) a (findHost hostlist hn)
|
withhost hn a = maybe (unknownhost hn hostlist) a (findHost hostlist hn)
|
||||||
|
@ -186,6 +186,8 @@ spin hn hst = do
|
||||||
void $ boolSystem "git" [Param "push"]
|
void $ boolSystem "git" [Param "push"]
|
||||||
cacheparams <- toCommand <$> sshCachingParams hn
|
cacheparams <- toCommand <$> sshCachingParams hn
|
||||||
go cacheparams url =<< hostprivdata
|
go cacheparams url =<< hostprivdata
|
||||||
|
unlessM (boolSystem "ssh" (map Param (cacheparams ++ ["-t", user, spincmd]))) $
|
||||||
|
error "remote propellor failed"
|
||||||
where
|
where
|
||||||
hostprivdata = show . filterPrivData hst <$> decryptPrivData
|
hostprivdata = show . filterPrivData hst <$> decryptPrivData
|
||||||
|
|
||||||
|
@ -209,7 +211,9 @@ spin hn hst = do
|
||||||
|
|
||||||
user = "root@"++hn
|
user = "root@"++hn
|
||||||
|
|
||||||
bootstrapcmd = shellWrap $ intercalate " ; "
|
mkcmd = shellWrap . intercalate " ; "
|
||||||
|
|
||||||
|
bootstrapcmd = mkcmd
|
||||||
[ "if [ ! -d " ++ localdir ++ " ]"
|
[ "if [ ! -d " ++ localdir ++ " ]"
|
||||||
, "then " ++ intercalate " && "
|
, "then " ++ intercalate " && "
|
||||||
[ "apt-get update"
|
[ "apt-get update"
|
||||||
|
@ -219,11 +223,14 @@ spin hn hst = do
|
||||||
, "else " ++ intercalate " && "
|
, "else " ++ intercalate " && "
|
||||||
[ "cd " ++ localdir
|
[ "cd " ++ localdir
|
||||||
, "if ! test -x ./propellor; then make deps build; fi"
|
, "if ! test -x ./propellor; then make deps build; fi"
|
||||||
, "./propellor --boot " ++ hn
|
, "./propellor --sync"
|
||||||
]
|
]
|
||||||
, "fi"
|
, "fi"
|
||||||
]
|
]
|
||||||
|
|
||||||
|
spincmd = mkcmd
|
||||||
|
[ "cd " ++ localdir ++ " && ./propellor --spin " ++ hn ]
|
||||||
|
|
||||||
getstatus :: Handle -> IO BootStrapStatus
|
getstatus :: Handle -> IO BootStrapStatus
|
||||||
getstatus h = do
|
getstatus h = do
|
||||||
l <- hGetLine h
|
l <- hGetLine h
|
||||||
|
@ -295,16 +302,14 @@ fromMarked marker s
|
||||||
len = length marker
|
len = length marker
|
||||||
matches = filter (marker `isPrefixOf`) $ lines s
|
matches = filter (marker `isPrefixOf`) $ lines s
|
||||||
|
|
||||||
boot :: Host -> IO ()
|
sync :: IO ()
|
||||||
boot h = do
|
sync = do
|
||||||
sendMarked stdout statusMarker $ show Ready
|
sendMarked stdout statusMarker $ show Ready
|
||||||
reply <- hGetContentsStrict stdin
|
reply <- hGetContentsStrict stdin
|
||||||
|
|
||||||
makePrivDataDir
|
makePrivDataDir
|
||||||
maybe noop (writeFileProtected privDataLocal) $
|
maybe noop (writeFileProtected privDataLocal) $
|
||||||
fromMarked privDataMarker reply
|
fromMarked privDataMarker reply
|
||||||
forceConsoleMode
|
|
||||||
mainProperties h
|
|
||||||
|
|
||||||
getUrl :: IO String
|
getUrl :: IO String
|
||||||
getUrl = maybe nourl return =<< getM get urls
|
getUrl = maybe nourl return =<< getM get urls
|
||||||
|
|
|
@ -6,26 +6,20 @@ import System.Console.ANSI
|
||||||
import System.IO
|
import System.IO
|
||||||
import System.Log.Logger
|
import System.Log.Logger
|
||||||
import "mtl" Control.Monad.Reader
|
import "mtl" Control.Monad.Reader
|
||||||
import Control.Applicative
|
|
||||||
import Data.Maybe
|
|
||||||
|
|
||||||
import Propellor.Types
|
import Propellor.Types
|
||||||
import Utility.Monad
|
import Utility.Monad
|
||||||
import Utility.Env
|
|
||||||
|
|
||||||
data MessageHandle
|
data MessageHandle
|
||||||
= ConsoleMessageHandle
|
= ConsoleMessageHandle
|
||||||
| TextMessageHandle
|
| TextMessageHandle
|
||||||
|
|
||||||
mkMessageHandle :: IO MessageHandle
|
mkMessageHandle :: IO MessageHandle
|
||||||
mkMessageHandle = ifM (hIsTerminalDevice stdout <||> (isJust <$> getEnv "TERM"))
|
mkMessageHandle = ifM (hIsTerminalDevice stdout)
|
||||||
( return ConsoleMessageHandle
|
( return ConsoleMessageHandle
|
||||||
, return TextMessageHandle
|
, return TextMessageHandle
|
||||||
)
|
)
|
||||||
|
|
||||||
forceConsoleMode :: IO ()
|
|
||||||
forceConsoleMode = void $ setEnv "TERM" "vt100" False
|
|
||||||
|
|
||||||
whenConsole :: MessageHandle -> IO () -> IO ()
|
whenConsole :: MessageHandle -> IO () -> IO ()
|
||||||
whenConsole ConsoleMessageHandle a = a
|
whenConsole ConsoleMessageHandle a = a
|
||||||
whenConsole _ _ = return ()
|
whenConsole _ _ = return ()
|
||||||
|
|
|
@ -137,7 +137,6 @@ instance ActionResult Result where
|
||||||
data CmdLine
|
data CmdLine
|
||||||
= Run HostName
|
= Run HostName
|
||||||
| Spin HostName
|
| Spin HostName
|
||||||
| Boot HostName
|
|
||||||
| Set PrivDataField Context
|
| Set PrivDataField Context
|
||||||
| Dump PrivDataField Context
|
| Dump PrivDataField Context
|
||||||
| Edit PrivDataField Context
|
| Edit PrivDataField Context
|
||||||
|
@ -145,5 +144,6 @@ data CmdLine
|
||||||
| AddKey String
|
| AddKey String
|
||||||
| Continue CmdLine
|
| Continue CmdLine
|
||||||
| Chain HostName
|
| Chain HostName
|
||||||
|
| Sync
|
||||||
| Docker HostName
|
| Docker HostName
|
||||||
deriving (Read, Show, Eq)
|
deriving (Read, Show, Eq)
|
||||||
|
|
Loading…
Reference in New Issue