summaryrefslogtreecommitdiff
path: root/src/Propellor/Property/Tor.hs
blob: 3623e9c3619cf2b0b6eb969b3aba7276071cf2cc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
module Propellor.Property.Tor where

import Propellor
import qualified Propellor.Property.File as File
import qualified Propellor.Property.Apt as Apt
import qualified Propellor.Property.Service as Service

isBridge :: Property
isBridge = setup `requires` Apt.installed ["tor"]
	`describe` "tor bridge"
  where
	setup = "/etc/tor/torrc" `File.hasContent`
		[ "SocksPort 0"
		, "ORPort 443"
		, "BridgeRelay 1"
		, "Exitpolicy reject *:*"
		] `onChange` restarted

hiddenServiceAvailable :: FilePath -> Int -> Property
hiddenServiceAvailable dir port = hiddenServiceHostName prop
  where
	prop = "/etc/tor/torrc" `File.containsLines`
		[ "HiddenServiceDir " ++ dir
		, "HiddenServicePort " ++ show port ++ " 127.0.0.1:" ++ show port
		]
		`describe` "hidden service available"
		`onChange` Service.reloaded "tor"
	hiddenServiceHostName p =  adjustProperty p $ \satisfy -> do
		r <- satisfy
		h <- liftIO $ readFile (dir </> "hostname")
		warningMessage $ unlines ["hidden service hostname:", h]
		return r

hiddenService :: FilePath -> Int -> Property
hiddenService dir port = "/etc/tor/torrc" `File.containsLines`
	[ "HiddenServiceDir " ++ dir
	, "HiddenServicePort " ++ show port ++ " 127.0.0.1:" ++ show port
	]
	`describe` ("hidden service (" ++ dir ++ " " ++ show port ++ ") available")
	`onChange` Service.reloaded "tor"

restarted :: Property
restarted = Service.restarted "tor"