h*=2      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~                                                                                                                                                                                                              2.1.4 Safe-Inferredb6 Safe-Inferred "7 keterAbstract type containing information on a process which will be restarted.keter Since 0.2.1keterRepresents a child process which is currently being tracked by the cleanup child process. Since 0.2.1keter;Represents the child process which handles process cleanup. Since 0.2.1keter1Kill a process by sending it the KILL (9) signal. Since 0.1.0keter#Fork off the child cleanup process.?This will ideally only be run once for your entire application. Since 0.2.1keter)Begin tracking the given process. If the  refers to a closed process, no tracking will occur. If the process is closed, then it will be untracked automatically.Note that you must compile your program with  -threaded; see . Since 0.2.1keterExplicitly remove the given process from the tracked process list in the cleanup process. Since 0.2.1keterFork and execute a subprocess, sending stdout and stderr to the specified rotating log. Since 0.2.1keter6Run the given command, restarting if the process dies.keter:Terminate the process and prevent it from being restarted.ketercommandketerargsketer environmentketerworking directoryketerstdinketer4both stdout and stderr will be sent to this locationketersetuidketer executableketerworking directoryketercommand line parameterketer environmentketershould we restart? Safe-Inferred"<YketerRealm [(username,password)]keterStatus Message       Safe-Inferred"keter&Indicates whether a given label in theketerA data structure for storing a hierarchical set of domain labels from TLD down, supporting wildcards.*Data structure is mutually recursive with , and each level of the tree supports a static assignment for a hostname such as:  example.com0Or a wildcard assignment for a hostname such as:  *.example.com=Or a wildcard assignment with a set of teptions, for example: ! *.example.com admin.example.comAnd lastly, empty labels are supported so that, of course, an assignment for example.com does not necessarily have any subdomains available. As an example suppose we have the following assigned domains:  example.com foo.example.com *.bar.example.com *.qux.example.com baz.qux.example.comThis will resolve to the following value, with some loose pseudocode notation.  Static (map) 'com' -> Unassigned Static (map) 'example' -> Assigned a (map) 'foo' -> Assigned a EmptyLabelMap 'bar' -> Unassigned (Wildcard (Assigned a EmptyLabelMap) 'qux' -> Unassigned (WildcardExcept (Assigned a (map))) 'baz' -> Assigned a EmptyLabelMapNote that the hostname "bar.example.com" is unassigned, only the wildcard was set. Safe-Inferred"%&2keterprefix for folder name$keterbundleketerprefix for folder name"#$"#$ Safe-InferredB'keterA replacement for the standard FromJSON/ typeclass which can handle relative filepaths.)keter7The directory from which we're reading the config file.*keterParse a config file, using the ' typeclass.+keterA replacement for the .: operator which will both parse a file path and apply the relative file logic.,keterA replacement for the .:? operator which will both parse a file path and apply the relative file logic.*+,)'(%&*+,)'(%& Safe-Inferred"7uDketer-A virtual host we want to serve content from.Eketer*A port for an individual app to listen on.FketerUsed for versioning data types.MketerName of the application. Should just be the basename of the application file.14325768BA@?>=<;:9CDEFHGIJLKMNMJLKIFHGEDCN8BA@?>=<;:95761432 Safe-Inferred"%&`agdbcihef[\]^_jklmn`agdbcihef[\]^_jklmn Safe-Inferred"%&keter1Information on an individual PostgreSQL database.{keter9How to create the given user/database. Default: uses the psql command line tool and sudo -u postgres.}keterLoad a set of existing connections from a config file. If the file does not exist, it will be created. Any newly created databases will automatically be saved to this file.z{|}z{|}  Safe-InferredketerThe top-level keter context monad, carrying around the main logger and some locally relevant configuration structure.See this blog post for an explanation of the design philosophy: ?https://www.fpcomplete.com/blog/2017/06/readert-design-pattern/TODO: generalize as contexts instead of configs? Since not every state being passed around can be intuitively thought of as a config per se. Ex. AppManager  Safe-Inferred"*keterControls execution of the nginx thread. Follows the settings type pattern. See:  +http://www.yesodweb.com/book/settings-types.keterWhich ports to assign to apps. Defaults to unassigned ranges from IANAketer4Maximum request time in milliseconds per connection.keter.Default connection time bound in milliseconds.((  Safe-Inferred "%&!o keterprimary host, used for approotketer)all hosts, not including the approot hostketer)how long are connections supposed to lastketerhow long in microseconds the app gets before we expect it to bind to a port (default 90 seconds)keter3An action to be performed for a requested hostname.This datatype is very similar to Stanza, but is necessarily separate since: Webapps will be assigned ports.0Not all stanzas have an associated proxy action.keter1Whether we should force redirect to HTTPS routes.keter,External HTTP port when generating APPROOTs.keter-External HTTPS port when generating APPROOTs.keter/Environment variables to be passed to all apps.keter4Maximum request time in milliseconds per connection.keterPort for the cli to listen onketersettings used for plugins  Safe-Inferred"%&%keterRecord wrapper over a fast logger (log,close) function tuple, just to make it less unwieldy and obscure. The LogType3 is also tracked, in case formatting depends on it.keterCreate a logger based on a . If log rotation is enabled in the config, this will return a rotating file logger; and a stderr logger otherwise.keterThe default total file size before for a log file before it needs to be rotatedketer#The default log message buffer sizeketer Log file name   Safe-Inferred%d  Safe-Inferred%&(!keterGets an unassigned port number.keterReturn a port to the recycled collection of the pool. Note that recycling puts the new 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. Safe-Inferred"(+keterReserve the given hosts so that no other application may use them. Does not yet enable any action. The semantics are: If a requested host is currently actively used or by an app of the same name, it is considered reserved.If a requested host is currently reserved by an app of the same name, it is considered an error in calling this API. Only one app reservation can happen at a time.If any requested host is currently used or reserved by an app with a different name, then those values are returned as Left.9Otherwise, the hosts which were reserved are returned as Right. This does not! include previously active hosts.keter$Forget previously made reservations.keter"Activate a new app. Note that you must- first reserve the hostnames you'll be using.   Safe-Inferred"%&'-keterwithin an stm context we can show a lot more then the show instance can doketer/Gives the log file or log tag name for a given 5keterFormat a log message for an app by tagging it with 'app-$name>' (only when it is being logged to stderr)keterGet the modification time of the bundle file this app was launched from, if relevant.keterFor the forward-env option. From a Set of desired variables, create a Map pulled from the system environment. Safe-Inferred"%&/keterthe next one to tryketerReset which apps are running.Any app not listed here that is currently running will be terminated.?Any app listed here that is currently running will be reloaded.Any app listed here that is not currently running will be started.   Safe-Inferred"%&/ Safe-Inferred0 Safe-Inferred"%&1+keter-Mapping from virtual hostname to port number.keter"Error, no host found in the headerketerWe found a host in the header, but we don't know about the host asked for.keter is secure? Safe-Inferred"%&2keter;Load up Keter config and evaluate a ReaderT context with itketerRunning the Keter logger requires a context with access to a KeterConfig, hence the MonadReader constraint. This is versatile: 0, or use the free ((->) KeterConfig) instance.keterroot directory or config file !"#$%&'()*+,-./0123456789:;<==>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`aabcdefghijklmnopqqrstuuvwxyz{|}~~                                                                                                                                                                                                              2531!keter-2.1.4-C8OC0pDiB9YbXqdrU7XdRKeter.Conduit.Process.UnixKeter.Config.MiddlewareKeter.LabelMapKeter.TempTarballKeter.Yaml.FilePath Keter.Common Keter.RewriteKeter.Plugin.Postgres Keter.ContextKeter.Config.V04Keter.Config.V10 Keter.LoggerKeter.PortPoolKeter.HostManager Keter.AppKeter.AppManager Keter.Cli Keter.Proxy Keter.MainketerKeter.Aeson.KeyHelper Keter.Config Paths_keterMonitoredProcessProcessTrackerinitProcessTrackermonitorProcess printStatusterminateMonitoredProcess"$fExceptionProcessTrackerException$fShowProcessTrackerExceptionMiddlewareConfigAcceptOverrideAutoheadJsonpMethodOverrideMethodOverridePost AddHeaders BasicAuthLocalprocessMiddleware toMiddlewarecomposeMiddleware$fToJSONMiddlewareConfig$fFromJSONMiddlewareConfig$fShowMiddlewareConfig$fGenericMiddlewareConfigLabelMapinsertdeletelookup labelAssignedempty$fShowLabelEntry$fEqLabelEntry$fShowLabelMap $fEqLabelMap TempFoldersetup unpackTempTarNonEmptyVector ParseYamlFile parseYamlFileBaseDirdecodeFileRelative lookupBaselookupBaseMaybe$fParseYamlFileVector$fParseYamlFileSet$fParseYamlFileList$fParseYamlFileNonEmptyVector SSLConfigSSLFalseSSLTrueSSLAppId AIBuiltinAINamedKeterExceptionCannotParsePostgresExitCodeFailureNoPortsAvailableInvalidConfigFileInvalidKeterConfigFileCannotReserveHostsFileNotExecutableExecutableNotFound!EnsureAliveShouldBeBiggerThenZeroketerExceptionGotHostBSHostPort ToCurrentPrevious toCurrentPluginsPlugin pluginGetEnvAppname getAppname$fToCurrentMaybe $fShowAppId$fExceptionKeterException$fFromJSONSSLConfig$fToJSONSSLConfig$fParseYamlFileSSLConfig$fShowSSLConfig $fEqSSLConfig$fOrdSSLConfig$fShowKeterException $fEqAppId $fOrdAppId RewriteRule ruleHeader ruleRegexruleReplacementReverseProxyConfig reversedHost reversedPortreversedUseSSL reversingHostreversingUseSSLreverseTimeoutrewriteResponseRulesrewriteRequestRulesRPEntryconfig httpManagersimpleReverseProxy$fToJSONRewriteRule$fFromJSONRewriteRule$fToJSONReverseProxyConfig$fFromJSONReverseProxyConfig $fShowRPEntry$fEqReverseProxyConfig$fOrdReverseProxyConfig$fShowReverseProxyConfig$fEqRewriteRule$fOrdRewriteRule$fShowRewriteRuleSettings setupDBInfodefaultSettingsload$fFromJSONDBServerInfo$fFromJSONDBInfo$fToJSONDBInfo $fShowDBInfo$fShowDBServerInfoKeterM runKeterMwithMappedConfig$fFunctorKeterM$fApplicativeKeterM $fMonadKeterM$fMonadUnliftIOKeterM$fMonadIOKeterM$fMonadLoggerKeterM$fMonadLoggerIOKeterM$fMonadReadercfgKeterM PortSettings portRange TLSConfig KeterConfig kconfigDirkconfigPortMan kconfigHost kconfigPort kconfigSsl kconfigSetuidkconfigReverseProxykconfigIpFromHeaderkconfigConnectionTimeBoundRedirectredFromredTo StaticHostshHostshRoot BundleConfig bconfigAppbconfigStaticHostsbconfigRedirects AppConfig configExec configArgs configHost configSslconfigExtraHosts configRawdefaultKeterConfig fiveMinutesdefaultPortSettings$fParseYamlFileAppConfig$fParseYamlFileStaticHost$fFromJSONRedirect$fParseYamlFileBundleConfig$fParseYamlFileTLSConfig$fFromJSONPortSettings$fParseYamlFileKeterConfig $fEqRedirect $fOrdRedirect$fEqStaticHost$fOrdStaticHost RestartCountUnlimitedRestartsLimitedRestartsBackgroundConfig bgconfigExec bgconfigArgsbgconfigEnvironmentbgconfigRestartCountbgconfigRestartDelaySecondsbgconfigForwardEnvAppInputAIBundleAIData WebAppConfig waconfigExec waconfigArgswaconfigEnvironmentwaconfigApprootHost waconfigHosts waconfigSsl waconfigPortwaconfigForwardEnvwaconfigTimeoutwaconfigEnsureAliveTimeoutIsSecure RedirectDestRDUrlRDPrefix SourcePathSPAny SPSpecificRedirectActionRedirectConfigredirconfigHostsredirconfigStatusredirconfigActionsredirconfigSslStaticFilesConfig sfconfigRoot sfconfigHostssfconfigListingssfconfigMiddlewaresfconfigTimeout sfconfigSsl ProxyActionProxyActionRawPAPortPAStatic PARedirectPAReverseProxy StanzaRawStanzaStaticFilesStanzaRedirect StanzaWebAppStanzaReverseProxyStanzaBackgroundStanzaRequiresSecurekconfigPortPoolkconfigListenerskconfigBuiltinStanzaskconfigExternalHttpPortkconfigExternalHttpsPortkconfigEnvironmentkconfigCliPortkconfigUnknownHostResponsekconfigMissingHostResponsekconfigProxyExceptionkconfigRotateLogskconfigHealthcheckPath ListeningPortLPSecure LPInsecurebconfigStanzasbconfigPluginsaddRequiresSecure addStanzaType$fParseYamlFileListeningPort$fToJSONStaticFilesConfig $fParseYamlFileStaticFilesConfig$fToCurrentStaticFilesConfig$fToJSONRedirectDest$fFromJSONRedirectDest$fToJSONRedirectAction$fFromJSONRedirectAction$fToJSONRedirectConfig$fParseYamlFileRedirectConfig$fToCurrentRedirectConfig$fToJSONWebAppConfig$fParseYamlFileWebAppConfig$fToCurrentWebAppConfig$fFromJSONRestartCount$fToJSONBackgroundConfig$fParseYamlFileBackgroundConfig$fToJSONStanzaRaw$fToJSONStanza$fParseYamlFileStanza$fToCurrentKeterConfig$fToJSONBundleConfig$fToCurrentBundleConfig$fShowAppInput$fShowBundleConfig $fShowStanza$fShowStanzaRaw$fShowBackgroundConfig$fShowRestartCount$fShowWebAppConfig$fShowProxyActionRaw$fShowRedirectConfig$fShowRedirectAction$fShowRedirectDest$fShowSourcePath$fShowStaticFilesConfigLogger loggerLog loggerClose loggerTypecreateLoggerViaConfigdefaultRotationSpecdefaultMaxTotaldefaultBufferSizePortPoolgetPort releasePortstart Reservations HostManager reserveHostsforgetReservations activateApp deactivateApp reactivateApp lookupActionAppStartConfig ascTempFolder ascSetuidascProcessTrackerascHostManager ascPortPool ascPluginsascKeterConfigAppshowAppreload terminate getTimestamp$fShowRunningWebApp $fShowAppActionReload Terminate AppManager renderApps initialize reloadAppListperformaddApp terminateApp $fShowAction CliStates MkCliStates csAppManagercsPort launchCli ProxySettingsMkProxySettings psHostLookup psManagerpsIpFromHeaderpsConnectionTimeBoundpsHealthcheckPath psUnknownHost psMissingHostpsProxyException makeSettings reverseProxy$aeson-2.2.1.0-1MMIrk3vOVb9inhzGAxO52Data.Aeson.KeyKeyData.Aeson.KeyMapKeyMapfoldrfromListtoListnullsize singletonmemberalterF insertWith mapWithKeyfoldMapWithKeyfoldr'foldlfoldl' foldrWithKeytraversetraverseWithKey fromListWithelems toAscList differenceunion unionWith unionWithKey intersectionintersectionWithintersectionWithKeykeys toHashMap fromHashMaptoMapfromMapcoercionToHashMap coercionToMap mapKeyValfilter filterWithKeymapMaybemapMaybeWithKey!? alignWith alignWithKey toHashMapTextfromHashMapText toMapText fromMapTexttoKeytoTextProcessTrackerExceptionTrackedProcess killProcess trackProcessprocess-1.6.17.0System.Process.Common ProcessHandleSystem.ProcesswaitForProcessuntrackProcessforkExecuteLog LabelEntry getFolderDBInfo appLogName formatAppLoggetForwardedEnv ASStartingversion getBinDir getLibDir getDynLibDir getDataDir getLibexecDirgetDataFileName getSysconfDirmissingHostResponseunknownHostResponse withClientrunKeterConfigReaderrunKeterLogger