chore(auth): new port offset calculation
This commit is contained in:
parent
3f5a22c85d
commit
bbeebc641e
64
.ports/assign.hs
Normal file
64
.ports/assign.hs
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
-- SPDX-FileCopyrightText: 2024 David Mosbach <david.mosbach@uniworx.de>
|
||||||
|
--
|
||||||
|
-- SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
|
||||||
|
{-# Language OverloadedStrings, LambdaCase, TypeApplications #-}
|
||||||
|
|
||||||
|
import Data.Text (Text)
|
||||||
|
import qualified Data.Text as T
|
||||||
|
import System.Directory
|
||||||
|
import System.Environment
|
||||||
|
import System.IO
|
||||||
|
|
||||||
|
main :: IO ()
|
||||||
|
main = getArgs >>= \case
|
||||||
|
["--assign", offsetFile] -> parseOffsets offsetFile >>= uncurry nextOffset
|
||||||
|
["--remove", offset] -> removeOffset offset
|
||||||
|
_ -> fail "unsupported args"
|
||||||
|
|
||||||
|
parseOffsets :: FilePath -> IO (Int,Int)
|
||||||
|
parseOffsets offsetFile = do
|
||||||
|
user <- T.pack <$> getEnv "USER"
|
||||||
|
let pred x = "//" `T.isPrefixOf` x || T.null (T.strip x)
|
||||||
|
tokenise = map (filter (not . pred) . T.lines) . T.split (=='#')
|
||||||
|
extract = map tail . filter (\u -> not (null u) && user == (T.strip $ head u))
|
||||||
|
((extract . tokenise . T.pack) <$> readFile offsetFile) >>= \case
|
||||||
|
[[min,max]] -> return (read $ T.unpack min, read $ T.unpack max)
|
||||||
|
x -> print x >> fail "malformed offset file"
|
||||||
|
|
||||||
|
nextOffset :: Int -> Int -> IO ()
|
||||||
|
nextOffset min max
|
||||||
|
| min > max = nextOffset max min
|
||||||
|
| otherwise = do
|
||||||
|
home <- getEnv "HOME"
|
||||||
|
offset <- findFile [home] ".port-offsets" >>= \case
|
||||||
|
Nothing -> writeFile (home ++ "/.port-offsets") (show min) >> return min
|
||||||
|
Just path -> do
|
||||||
|
used <- (map (read @Int) . filter (not . null) . lines) <$> readFile path
|
||||||
|
o <- next min max used
|
||||||
|
appendFile path ('\n' : show o)
|
||||||
|
return o
|
||||||
|
print offset
|
||||||
|
where
|
||||||
|
next :: Int -> Int -> [Int] -> IO Int
|
||||||
|
next min max used
|
||||||
|
| min > max = fail "all offsets currently in use"
|
||||||
|
| min `elem` used = next (min+1) max used
|
||||||
|
| otherwise = return min
|
||||||
|
|
||||||
|
removeOffset :: String -> IO ()
|
||||||
|
removeOffset offset = do
|
||||||
|
home <- getEnv "HOME"
|
||||||
|
findFile [home] ".port-offsets" >>= \case
|
||||||
|
Nothing -> fail "offset file does not exist"
|
||||||
|
Just path -> do
|
||||||
|
remaining <- (filter (/= offset) . lines) <$> readFile path
|
||||||
|
run <- getEnv "XDG_RUNTIME_DIR"
|
||||||
|
(tempPath, fh) <- openTempFile run ".port-offsets"
|
||||||
|
let out = unlines remaining
|
||||||
|
hPutStr fh $ out
|
||||||
|
case T.null (T.strip $ T.pack out) of
|
||||||
|
True -> removeFile path
|
||||||
|
False -> writeFile path $ out
|
||||||
|
removeFile tempPath
|
||||||
|
|
||||||
24
.ports/offsets
Normal file
24
.ports/offsets
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
// SPDX-FileCopyrightText: 2024 David Mosbach <david.mosbach@uniworx.de>
|
||||||
|
//
|
||||||
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
|
||||||
|
# gkleen
|
||||||
|
-1000
|
||||||
|
-950
|
||||||
|
|
||||||
|
# ishka
|
||||||
|
-949
|
||||||
|
-899
|
||||||
|
|
||||||
|
# jost
|
||||||
|
-898
|
||||||
|
-848
|
||||||
|
|
||||||
|
# mosbach
|
||||||
|
-847
|
||||||
|
-797
|
||||||
|
|
||||||
|
# savau
|
||||||
|
-796
|
||||||
|
-746
|
||||||
|
|
||||||
@ -63,6 +63,7 @@ let
|
|||||||
type cleanup_maildev &>/dev/null && cleanup_maildev
|
type cleanup_maildev &>/dev/null && cleanup_maildev
|
||||||
[[ -z "$OAUTH2_PGDIR" ]] || source ${killOauth2DB}/bin/killOauth2DB
|
[[ -z "$OAUTH2_PGDIR" ]] || source ${killOauth2DB}/bin/killOauth2DB
|
||||||
[[ -z "$OAUTH2_PGHOST" ]] || pkill oauth2-mock-ser
|
[[ -z "$OAUTH2_PGHOST" ]] || pkill oauth2-mock-ser
|
||||||
|
[[ -z "$PORT_OFFSET" ]] || runghc .ports/assign.hs --remove $PORT_OFFSET
|
||||||
|
|
||||||
[ -f "''${basePath}/.develop.env" ] && rm -vf "''${basePath}/.develop.env"
|
[ -f "''${basePath}/.develop.env" ] && rm -vf "''${basePath}/.develop.env"
|
||||||
set +x
|
set +x
|
||||||
@ -70,10 +71,13 @@ let
|
|||||||
|
|
||||||
trap cleanup EXIT
|
trap cleanup EXIT
|
||||||
|
|
||||||
export PORT_OFFSET=$(((16#$(sha256sum <<<"$(hostname -f):''${basePath}" | head -c 16)) % 1000))
|
export PORT_OFFSET=$(runghc .ports/assign.hs --assign .ports/offsets)
|
||||||
|
# export PORT_OFFSET=$(((16#$(sha256sum <<<"$(hostname -f):''${basePath}" | head -c 16)) % 1000))
|
||||||
|
|
||||||
if [[ -z "$OAUTH2_PGHOST" ]]; then
|
if [[ -z "$OAUTH2_PGHOST" ]]; then
|
||||||
set -xe
|
set -xe
|
||||||
|
export OAUTH2_SERVER_PORT=$((9443 + $PORT_OFFSET))
|
||||||
|
export OAUTH2_DB_PORT=$((9444 + $PORT_OFFSET))
|
||||||
source ${mkOauth2DB}/bin/mkOauth2DB
|
source ${mkOauth2DB}/bin/mkOauth2DB
|
||||||
${oauth2MockServer}/bin/oauth2-mock-server&
|
${oauth2MockServer}/bin/oauth2-mock-server&
|
||||||
set +xe
|
set +xe
|
||||||
@ -300,8 +304,6 @@ in pkgs.mkShell {
|
|||||||
OAUTH2_HBA = oauth2Hba;
|
OAUTH2_HBA = oauth2Hba;
|
||||||
OAUTH2_DB_SCHEMA = oauth2Schema;
|
OAUTH2_DB_SCHEMA = oauth2Schema;
|
||||||
OAUTH2_TEST_USERS = ./test/Database/test-users.yaml;
|
OAUTH2_TEST_USERS = ./test/Database/test-users.yaml;
|
||||||
OAUTH2_SERVER_PORT = 9443;
|
|
||||||
OAUTH2_DB_PORT = 9444;
|
|
||||||
nativeBuildInputs = [develop inDevelop killallUni2work diffRunning]
|
nativeBuildInputs = [develop inDevelop killallUni2work diffRunning]
|
||||||
++ (with pkgs;
|
++ (with pkgs;
|
||||||
[ stack nodejs-14_x postgresql_12 openldap exiftool memcached minio minio-client
|
[ stack nodejs-14_x postgresql_12 openldap exiftool memcached minio minio-client
|
||||||
|
|||||||
Reference in New Issue
Block a user