-- | Maintainer: Félix Sipma <felix+propellor@gueux.org>

module Propellor.Property.Uwsgi where

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

type ConfigFile = [String]

type AppName = String

appEnabled :: AppName -> ConfigFile -> RevertableProperty DebianLike DebianLike
appEnabled :: AppName
-> ConfigFile
-> RevertableProperty
     (MetaTypes '[ 'Targeting 'OSDebian, 'Targeting 'OSBuntish])
     (MetaTypes '[ 'Targeting 'OSDebian, 'Targeting 'OSBuntish])
appEnabled AppName
an ConfigFile
cf = Property
  (MetaTypes '[ 'Targeting 'OSDebian, 'Targeting 'OSBuntish])
enable Property
  (MetaTypes '[ 'Targeting 'OSDebian, 'Targeting 'OSBuntish])
-> Property
     (MetaTypes '[ 'Targeting 'OSDebian, 'Targeting 'OSBuntish])
-> RevertableProperty
     (MetaTypes '[ 'Targeting 'OSDebian, 'Targeting 'OSBuntish])
     (MetaTypes '[ 'Targeting 'OSDebian, 'Targeting 'OSBuntish])
forall setupmetatypes undometatypes.
Property setupmetatypes
-> Property undometatypes
-> RevertableProperty setupmetatypes undometatypes
<!> Property
  (MetaTypes '[ 'Targeting 'OSDebian, 'Targeting 'OSBuntish])
disable
  where
	enable :: CombinedType
  (Property
     (MetaTypes '[ 'Targeting 'OSDebian, 'Targeting 'OSBuntish]))
  (Property
     (MetaTypes '[ 'Targeting 'OSDebian, 'Targeting 'OSBuntish]))
enable = AppName -> AppName
appVal AppName
an AppName -> LinkTarget -> RevertableProperty UnixLike UnixLike
`File.isSymlinkedTo` AppName -> LinkTarget
appValRelativeCfg AppName
an
		RevertableProperty UnixLike UnixLike
-> AppName -> RevertableProperty UnixLike UnixLike
forall p. IsProp p => p -> AppName -> p
`describe` (AppName
"uwsgi app enabled " AppName -> AppName -> AppName
forall a. [a] -> [a] -> [a]
++ AppName
an)
		RevertableProperty UnixLike UnixLike
-> Property
     (MetaTypes '[ 'Targeting 'OSDebian, 'Targeting 'OSBuntish])
-> CombinedType
     (RevertableProperty UnixLike UnixLike)
     (Property
        (MetaTypes '[ 'Targeting 'OSDebian, 'Targeting 'OSBuntish]))
forall x y. Combines x y => x -> y -> CombinedType x y
`requires` AppName
-> ConfigFile
-> Property
     (MetaTypes '[ 'Targeting 'OSDebian, 'Targeting 'OSBuntish])
appAvailable AppName
an ConfigFile
cf
		Property
  (MetaTypes '[ 'Targeting 'OSDebian, 'Targeting 'OSBuntish])
-> Property
     (MetaTypes '[ 'Targeting 'OSDebian, 'Targeting 'OSBuntish])
-> CombinedType
     (Property
        (MetaTypes '[ 'Targeting 'OSDebian, 'Targeting 'OSBuntish]))
     (Property
        (MetaTypes '[ 'Targeting 'OSDebian, 'Targeting 'OSBuntish]))
forall x y. Combines x y => x -> y -> CombinedType x y
`requires` Property
  (MetaTypes '[ 'Targeting 'OSDebian, 'Targeting 'OSBuntish])
installed
		Property
  (MetaTypes '[ 'Targeting 'OSDebian, 'Targeting 'OSBuntish])
-> Property
     (MetaTypes '[ 'Targeting 'OSDebian, 'Targeting 'OSBuntish])
-> CombinedType
     (Property
        (MetaTypes '[ 'Targeting 'OSDebian, 'Targeting 'OSBuntish]))
     (Property
        (MetaTypes '[ 'Targeting 'OSDebian, 'Targeting 'OSBuntish]))
forall x y. Combines x y => x -> y -> CombinedType x y
`onChange` Property
  (MetaTypes '[ 'Targeting 'OSDebian, 'Targeting 'OSBuntish])
reloaded
	disable :: CombinedType
  (Property
     (MetaTypes '[ 'Targeting 'OSDebian, 'Targeting 'OSBuntish]))
  (Property
     (MetaTypes '[ 'Targeting 'OSDebian, 'Targeting 'OSBuntish]))
disable = AppName -> Property UnixLike
File.notPresent (AppName -> AppName
appVal AppName
an)
		Property UnixLike -> AppName -> Property UnixLike
forall p. IsProp p => p -> AppName -> p
`describe` (AppName
"uwsgi app disable" AppName -> AppName -> AppName
forall a. [a] -> [a] -> [a]
++ AppName
an)
		Property UnixLike
-> Property
     (MetaTypes '[ 'Targeting 'OSDebian, 'Targeting 'OSBuntish])
-> CombinedType
     (Property UnixLike)
     (Property
        (MetaTypes '[ 'Targeting 'OSDebian, 'Targeting 'OSBuntish]))
forall x y. Combines x y => x -> y -> CombinedType x y
`requires` Property
  (MetaTypes '[ 'Targeting 'OSDebian, 'Targeting 'OSBuntish])
installed
		Property
  (MetaTypes '[ 'Targeting 'OSDebian, 'Targeting 'OSBuntish])
-> Property
     (MetaTypes '[ 'Targeting 'OSDebian, 'Targeting 'OSBuntish])
-> CombinedType
     (Property
        (MetaTypes '[ 'Targeting 'OSDebian, 'Targeting 'OSBuntish]))
     (Property
        (MetaTypes '[ 'Targeting 'OSDebian, 'Targeting 'OSBuntish]))
forall x y. Combines x y => x -> y -> CombinedType x y
`onChange` Property
  (MetaTypes '[ 'Targeting 'OSDebian, 'Targeting 'OSBuntish])
reloaded

appAvailable :: AppName -> ConfigFile -> Property DebianLike
appAvailable :: AppName
-> ConfigFile
-> Property
     (MetaTypes '[ 'Targeting 'OSDebian, 'Targeting 'OSBuntish])
appAvailable AppName
an ConfigFile
cf = (AppName
"uwsgi app available " AppName -> AppName -> AppName
forall a. [a] -> [a] -> [a]
++ AppName
an) AppName
-> Property
     (MetaTypes '[ 'Targeting 'OSDebian, 'Targeting 'OSBuntish])
-> Property
     (MetaTypes '[ 'Targeting 'OSDebian, 'Targeting 'OSBuntish])
forall i.
IsProp (Property i) =>
AppName -> Property i -> Property i
==>
	Property UnixLike
-> Property
     (MetaTypes '[ 'Targeting 'OSDebian, 'Targeting 'OSBuntish])
forall (p :: * -> *) (untightened :: [MetaType])
       (tightened :: [MetaType]).
(TightenTargets p, TightenTargetsAllowed untightened tightened,
 SingI tightened) =>
p (MetaTypes untightened) -> p (MetaTypes tightened)
tightenTargets (AppName -> AppName
appCfg AppName
an AppName -> ConfigFile -> Property UnixLike
`File.hasContent` (AppName
comment AppName -> ConfigFile -> ConfigFile
forall a. a -> [a] -> [a]
: ConfigFile
cf))
  where
	comment :: AppName
comment = AppName
"# deployed with propellor, do not modify"

appCfg :: AppName -> FilePath
appCfg :: AppName -> AppName
appCfg AppName
an = AppName
"/etc/uwsgi/apps-available" AppName -> AppName -> AppName
</> AppName
an AppName -> AppName -> AppName
<.> AppName
"ini"

appVal :: AppName -> FilePath
appVal :: AppName -> AppName
appVal AppName
an = AppName
"/etc/uwsgi/apps-enabled/" AppName -> AppName -> AppName
</> AppName
an AppName -> AppName -> AppName
<.> AppName
"ini"

appValRelativeCfg :: AppName -> File.LinkTarget
appValRelativeCfg :: AppName -> LinkTarget
appValRelativeCfg AppName
an = AppName -> LinkTarget
File.LinkTarget (AppName -> LinkTarget) -> AppName -> LinkTarget
forall a b. (a -> b) -> a -> b
$ AppName
"../apps-available" AppName -> AppName -> AppName
</> AppName
an AppName -> AppName -> AppName
<.> AppName
"ini"

installed :: Property DebianLike
installed :: Property
  (MetaTypes '[ 'Targeting 'OSDebian, 'Targeting 'OSBuntish])
installed = ConfigFile
-> Property
     (MetaTypes '[ 'Targeting 'OSDebian, 'Targeting 'OSBuntish])
Apt.installed [AppName
"uwsgi"]

restarted :: Property DebianLike
restarted :: Property
  (MetaTypes '[ 'Targeting 'OSDebian, 'Targeting 'OSBuntish])
restarted = AppName
-> Property
     (MetaTypes '[ 'Targeting 'OSDebian, 'Targeting 'OSBuntish])
Service.restarted AppName
"uwsgi"

reloaded :: Property DebianLike
reloaded :: Property
  (MetaTypes '[ 'Targeting 'OSDebian, 'Targeting 'OSBuntish])
reloaded = AppName
-> Property
     (MetaTypes '[ 'Targeting 'OSDebian, 'Targeting 'OSBuntish])
Service.reloaded AppName
"uwsgi"