initial commit
This commit is contained in:
commit
040d3bbc10
22
.devcontainer/devcontainer.json
Normal file
22
.devcontainer/devcontainer.json
Normal file
@ -0,0 +1,22 @@
|
||||
// For format details, see https://aka.ms/devcontainer.json. For config options, see the
|
||||
// README at: https://github.com/devcontainers/templates/tree/main/src/go
|
||||
{
|
||||
"name": "Go",
|
||||
// Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile
|
||||
"image": "mcr.microsoft.com/devcontainers/go:0-1-bullseye"
|
||||
|
||||
// Features to add to the dev container. More info: https://containers.dev/features.
|
||||
// "features": {},
|
||||
|
||||
// Use 'forwardPorts' to make a list of ports inside the container available locally.
|
||||
// "forwardPorts": [],
|
||||
|
||||
// Use 'postCreateCommand' to run commands after the container is created.
|
||||
// "postCreateCommand": "go version",
|
||||
|
||||
// Configure tool-specific properties.
|
||||
// "customizations": {},
|
||||
|
||||
// Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root.
|
||||
// "remoteUser": "root"
|
||||
}
|
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
build/
|
15
build.sh
Executable file
15
build.sh
Executable file
@ -0,0 +1,15 @@
|
||||
#!/bin/sh
|
||||
|
||||
userID=$(id -u)
|
||||
groupID=$(id -g)
|
||||
|
||||
mkdir -p ./build
|
||||
|
||||
echo "Building Docker image"
|
||||
imageID=$(docker build -f docker/Dockerfile --build-arg UID="${userID}" --build-arg GID="${groupID}" -q .)
|
||||
|
||||
echo "Running build"
|
||||
docker run --rm -v ./build:/build "$imageID"
|
||||
|
||||
echo "Removing image"
|
||||
docker image rm "$imageID"
|
17
docker/Dockerfile
Normal file
17
docker/Dockerfile
Normal file
@ -0,0 +1,17 @@
|
||||
FROM golang:latest
|
||||
|
||||
ARG UID=1000
|
||||
ARG GID=1000
|
||||
|
||||
RUN addgroup --gid ${GID} bobthebuilder && adduser --gid ${GID} --uid ${UID} bobthebuilder
|
||||
|
||||
RUN mkdir /build
|
||||
RUN chown -Rv bobthebuilder:bobthebuilder /build
|
||||
|
||||
COPY . /workspace
|
||||
RUN chown -Rv bobthebuilder:bobthebuilder /workspace
|
||||
|
||||
USER bobthebuilder
|
||||
WORKDIR /workspace
|
||||
|
||||
CMD [ "go", "build", "-o", "/build/docker_launcher", "." ]
|
99
main.go
Normal file
99
main.go
Normal file
@ -0,0 +1,99 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"flag"
|
||||
"log"
|
||||
"os"
|
||||
"regexp"
|
||||
)
|
||||
|
||||
type config struct {
|
||||
Files []string
|
||||
VariableRegex string
|
||||
RegexGroup int
|
||||
}
|
||||
|
||||
var defaultVariableRegex = `\$\{([a-zA-Z0-9_-]+)\}`
|
||||
|
||||
func loadConfig(path string) (*config, error) {
|
||||
raw, err := os.ReadFile(path)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
var config config
|
||||
err = json.Unmarshal(raw, &config)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &config, nil
|
||||
}
|
||||
|
||||
func filterFile(path string, regex regexp.Regexp, regexGroup int) error {
|
||||
data, err := os.ReadFile(path)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
text := string(data)
|
||||
|
||||
text = regex.ReplaceAllStringFunc(text, func(s string) string {
|
||||
matches := regex.FindStringSubmatch(text)
|
||||
log.Println(matches)
|
||||
return os.Getenv(matches[regexGroup])
|
||||
})
|
||||
|
||||
log.Println(text)
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func filterFiles(config config) error {
|
||||
var regexString string
|
||||
if len(config.VariableRegex) == 0 {
|
||||
regexString = defaultVariableRegex
|
||||
} else {
|
||||
regexString = config.VariableRegex
|
||||
}
|
||||
|
||||
var regexGroup int
|
||||
if config.RegexGroup == 0 {
|
||||
regexGroup = 1
|
||||
} else {
|
||||
regexGroup = config.RegexGroup
|
||||
}
|
||||
|
||||
log.Println("Regex is:", regexString)
|
||||
|
||||
regex, err := regexp.Compile(regexString)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
for _, file := range config.Files {
|
||||
log.Println("Filtering file:", file)
|
||||
err := filterFile(file, *regex, regexGroup)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func main() {
|
||||
configPath := flag.String("config", "config.json", "Path to config file")
|
||||
flag.Parse()
|
||||
|
||||
config, err := loadConfig(*configPath)
|
||||
if err != nil {
|
||||
log.Fatalln("Failed to load config:", err)
|
||||
}
|
||||
|
||||
err = filterFiles(*config)
|
||||
if err != nil {
|
||||
log.Fatalln(err)
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user