{-# LANGUAGE OverloadedStrings #-}
module Main where
import qualified Configuration.Dotenv as Dotenv
import Control.Monad (when)
import qualified Data.Text as T
import Network.Octohat (keysOfTeamInOrganization)
import Network.Octohat.Types (OrganizationName (..),
TeamName (..), runGitHub)
import Options.Applicative
import System.OpensshGithubKeys (formatKey)
import System.OpensshGithubKeys.Config (options, readFileOptions)
import System.OpensshGithubKeys.Types (Options (..))
import System.Timeout (timeout)
fetchKeys :: Options -> IO ()
fetchKeys os = when (any (\u -> localUser os == u) (users os)) $ do
res <- runGitHub $ keysOfTeamInOrganization
(OrganizationName $ T.pack $ organization os)
(TeamName $ T.pack $ team os)
case res of
Right membersWithKeys -> putStrLn $ unlines $ concatMap formatKey membersWithKeys
Left e -> error $ "Error retrieving keys for organization '" ++ show e
main :: IO ()
main = do
d <- readFileOptions "/etc/openssh-github-keys/login.conf"
opts <- execParser $ options d
readDotenvFile opts
res <- timeout allowedTime (fetchKeys opts)
case res of
Nothing -> error $ "Allowed time of " ++ show allowedTime ++
" microseconds exceeded while fetching keys from GitHub."
Just _ -> return ()
where
allowedTime = 5 * 1000000 -- Allowed time in microseconds for fetching keys
-- | Conditionally reads the ~/.github_token file if it exists.
readDotenvFile :: Options -> IO ()
readDotenvFile = Dotenv.loadFile False . dotfile