๚ฮD :ทค      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ กขฃ None;ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnoคฅฆงจฉชซฌญฎฏp  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopU  &*GSRQPONMLKJIHVXTFY[WZcdg"#h E) ADCBj21-+' $mn! .%0/,(o><38946@7?;=5:\]^_`abefikl*ADCBG SRQPONMLKJIHTUVWXYZ[\]^_`abcdefghijklmnoคฅฆงจฉชซฌญฎฏ Safe-Inferedp8Abstract type allowing access to config information via q q$Get information on an individual app's database information. If no E information exists, it will create a random database, add it to the  config file, and return it. r2Information on an individual PostgreSQL database. wHName of the application. Should just be the basename of the application  file. yHow to create the given user/database. Default: uses the psql  command line tool and sudo -u postgres. zHLoad a set of existing connections from a config file. If the file does A not exist, it will be created. Any newly created databases will & automatically be saved to this file. pqrstuvwxyzฐฑฒ pqrstuvwxyz wrstuvpqxyyzqpqrstuvwxyzฐฑฒ Safe-Infered{|}{|}{|}{|}None~€folder to contain logs ~€~€~€None ‚ƒ„…†‡ˆstdout stderr ‰Š‹ ‚ƒ„…†‡ˆ‰Š‹ ‚ˆ‰Šƒ„…†‡‹‚ƒ„…†‡ˆ‰Š‹NoneŒKAbstract type containing information on a process which will be restarted. 7Run the given command, restarting if the process dies. Ž;Terminate the process and prevent it from being restarted. Œ executable working directory command line parameter  environment ŽŒŽŽŒŒŽNoneKControls execution of the nginx thread. Follows the settings type pattern.  See:  +http://www.yesodweb.com/book/settings-types. "Location of config file. Default: /etc/nginx/ sites-enabled/keter ‘2How to tell Nginx to reload config file. Default: /etc/init.d/ nginx reload ’-How to tell Nginx to start running. Default: /etc/init.d/ nginx start “2Which ports to assign to apps. Default: 4000-4999 ”JAn abstract type which can accept commands and sends them to a background  nginx thread. •CAn individual virtual host may either be a reverse proxy to an app  (AppEntry), or may serve static files ( StaticEntry). ˜.A virtual host we want to serve content from. ™+A port for an individual app to listen on. šFStart running a separate thread which will accept commands and modify  Nginx's behavior accordingly. › Gets an unassigned port number. œFInform the nginx thread that the given port number is no longer being L used, and may be reused by a new process. Note that recycling puts the new L ports at the end of the queue (FIFO), so that if an application holds onto ; the port longer than expected, there should be no issues. GAdd a new entry to the configuration for the given hostname and reload J nginx. Will overwrite any existing configuration for the given host. The K second point is important: it is how we achieve zero downtime transitions + between an old and new version of an app. ž9Remove an entry from the configuration and reload nginx. ‘’“”•–—˜™š›œžณด‘’“”•–—˜™š›œž™˜•—–”‘’“‘’“›œžš ‘’“”•—–˜™š›œžณดNoneŸ  app bundle :action to perform to remove this App from list of actives กขตŸ กขŸ กขŸ กขต Noneฃroot directory or config file ถฃฃฃถท             ! " #$ % & #' #( ) *+,-. */ 01 23 #4 56 78 9: 9; <= <> ?@ ?A B *C *D E F G HIJKLMNOPQOPRSTUVWXVWYVWZVW[VW\VW]S^_S^`SabSacSadSaeSafghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜˜™š›œžŸ กขฃคฅฆงจจฉชซฆฌญฎฏฐฑฒณดตถทธนบปฆผฝพฟภฆมฑ ยรฤลฦวศษสหฬอฮฯะัาัำ ำิ keter-0.1.0.1 Keter.PreludeKeter.PostgresKeter.TempFolder Keter.LogFile Keter.Logger Keter.Process Keter.Nginx Keter.App Keter.MainbaseGHC.ListfilterGHC.Base otherwisemap$GHC.Num-ghc-prim GHC.Classes==fail>>=>>fmapreturnGHC.Real fromIntegralMonadGHC.ShowShow GHC.TypesBoolInt Data.EitherEitherFalseTrueLeftRightid Data.MaybeNothing text-0.11.2.2Data.Text.InternalTextMaybe Control.Arrow***Control.Concurrent.ChanChaneither GHC.IORefIORefGHC.MVarMVar GHC.Exception SomeException toException Control.MonadwhenmapM_GHC.EnumminBoundsuccreversemaybeJust*+flip./=<=&&not<>data-default-0.5.0 Data.DefaultdefDefaultsystem-filepath-0.4.6Filesystem.Path.InternalFilePathsystem-fileio-0.3.8 Filesystem removeTree listDirectory createTreerename isDirectoryisFileFilesystem.Path.CurrentOS decodeStringtoTextFilesystem.Path<.> hasExtensionbasename directoryKeterExceptionNoPortsAvailableExitCodeFailureCannotParsePostgresfromTexttoString LogMessageProcessWaitingReceivedInotifyEventRemovingOldFolderTerminatingOldProcessFinishedReloadingTerminatingAppUnpackingBundle RemovingPortExceptionThrownProcessDidNotStart InvalidBundleProcessCreatedKIOStringlogvoidlogEx readFileLBSliftIOrunKIOnewMVar newEmptyMVar modifyMVar modifyMVar_swapMVartakeMVarputMVarforkKIOforkKIO'newIORefatomicModifyIORef++shownewChan newStdGenreadChan writeChantimeout threadDelaygetCurrentTimePostgresgetInfoDBInfodbiNamedbiUserdbiPassAppnameSettings setupDBInfoload TempFoldersetup getFolderLogFileaddChunkclosestartLoggerHandlesstdInstdOutstdErrattachdetachdummyProcessrun terminate configFile reloadAction startAction portRangeNginxEntry StaticEntryAppEntryHostPortgetPort releasePortaddEntry removeEntryAppreloadketer$fExceptionKeterException$fFromTextBuilder$fFromTextBuilder0$fFromTextFilePath$fFromTextText$fToStringFilePath$fToStringText $fToString[]$fShowLogMessage$fApplicativeKIO $fFunctorKIO $fMonadKIO$fFromJSONDBInfo$fToJSONDBInfo$fDefaultSettings$fFromJSONSettings$fFromJSONConfig