comment
This commit is contained in:
parent
12170c3d5c
commit
e49af37fe8
|
@ -0,0 +1,59 @@
|
||||||
|
[[!comment format=mdwn
|
||||||
|
username="joey"
|
||||||
|
subject="""comment 1"""
|
||||||
|
date="2015-04-19T16:07:24Z"
|
||||||
|
content="""
|
||||||
|
Propellor makes it very easy to put together a property like this.
|
||||||
|
|
||||||
|
Let's start with a property that combines the two properties you mentioned:
|
||||||
|
|
||||||
|
hasLoginShell :: UserName -> FilePath -> Property
|
||||||
|
hasLoginShell user shell = shellSetTo user shell `requires` shellEnabled shell
|
||||||
|
|
||||||
|
The shellEnabled property can be easily written using propellor's file
|
||||||
|
manipulation properties.
|
||||||
|
|
||||||
|
-- Need to add an import to the top of the source file.
|
||||||
|
import qualified Propellor.Property.File as File
|
||||||
|
|
||||||
|
shellEnabled :: FilePath -> Property
|
||||||
|
shellEnabled shell = "/etc/shells" `File.containsLine` shell
|
||||||
|
|
||||||
|
And then, we want to actually change the user's shell. The `chsh(1)`
|
||||||
|
program can do that, so we can simply tell propellor the command line to
|
||||||
|
run:
|
||||||
|
|
||||||
|
shellSetTo :: UserName -> FilePath -> Property
|
||||||
|
shellSetTo user shell = cmdProperty "chsh" ["--shell", shell, user]
|
||||||
|
|
||||||
|
The only remaining problem with this is that shellSetTo runs chsh every
|
||||||
|
time, and propellor will always display that it's made a change each time
|
||||||
|
it runs, even when it didn't really do much. Now, there's an easy way to
|
||||||
|
avoid that problem, we could just tell propellor that it's a trivial
|
||||||
|
property, and then it will run chsh every time and not think it made any
|
||||||
|
change:
|
||||||
|
|
||||||
|
shellSetTo :: UserName -> FilePath -> Property
|
||||||
|
shellSetTo user shell = trivial $
|
||||||
|
cmdProperty "chsh" ["--shell", shell, user]
|
||||||
|
|
||||||
|
But, it's not much harder to do this right. Let's make the property
|
||||||
|
check if the user's shell is already set to the desired value and avoid
|
||||||
|
doing anything in that case.
|
||||||
|
|
||||||
|
shellSetTo :: UserName -> FilePath -> Property
|
||||||
|
shellSetTo user shell = check needchangeshell $
|
||||||
|
cmdProperty "chsh" ["--shell", shell, user]
|
||||||
|
where
|
||||||
|
needchangeshell = do
|
||||||
|
currshell <- userShell <$> getUserEntryForName user
|
||||||
|
return (currshell /= shell)
|
||||||
|
|
||||||
|
And that will probably all work, although I've not tested it. You might
|
||||||
|
want to throw in some uses of `describe` to give the new properties
|
||||||
|
more useful descriptions.
|
||||||
|
|
||||||
|
I hope this has been helpful as an explanation of how to add properties to
|
||||||
|
Propellor, and if you get these properties to work, a patch adding them
|
||||||
|
to Propellor.User would be happily merged.
|
||||||
|
"""]]
|
Loading…
Reference in New Issue