Lindenii Project Forge
Login
Commit info
ID5dc1cbdb7f7aa9aad7592595147a36bf7db09187
AuthorRunxi Yu<me@runxiyu.org>
Author dateMon, 17 Feb 2025 11:54:14 +0800
CommitterRunxi Yu<me@runxiyu.org>
Committer dateMon, 17 Feb 2025 11:54:14 +0800
Actions
Get patch
git_hooks_deploy.go: Deploy hooks to filesystem
package main

import (
	"errors"
	"io"
	"os"
	"path/filepath"
)

func deploy_hooks_to_filesystem() (err error) {
	err = func() error {
		src_fd, err := resources_fs.Open("git_hooks_client/git_hooks_client")
		if err != nil {
			return err
		}
		defer src_fd.Close()

		dst_fd, err := os.OpenFile(filepath.Join(config.Hooks.Execs, "git_hooks_client"), os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0o755)
		if err != nil {
			return err
		}
		defer dst_fd.Close()

		_, err = io.Copy(dst_fd, src_fd)
		if err != nil {
			return err
		}

		return nil
	}()
	if err != nil {
		return err
	}

	err = os.Chmod(filepath.Join(config.Hooks.Execs, "git_hooks_client"), 0755)
	if err != nil {
		return err
	}

	for _, hook_name := range []string{
		"pre-receive",
	} {
		err = os.Symlink(filepath.Join(config.Hooks.Execs, "git_hooks_client"), filepath.Join(config.Hooks.Execs, hook_name))
		if err != nil && !errors.Is(err, os.ErrExist) {
			return err
		}
	}

	return nil
}
package main

import (
	"flag"
	"net"
	"net/http"

	"go.lindenii.runxiyu.org/lindenii-common/clog"
)

func main() {
	config_path := flag.String(
		"config",
		"/etc/lindenii/forge.scfg",
		"path to configuration file",
	)
	flag.Parse()

	err := load_config(*config_path)
	if err != nil {
		clog.Fatal(1, "Loading configuration: "+err.Error())
	}

	err = deploy_hooks_to_filesystem()
	if err != nil {
		clog.Fatal(1, "Deploying hooks to filesystem: "+err.Error())
	}

	err = load_templates()
	if err != nil {
		clog.Fatal(1, "Loading templates: "+err.Error())
	}

	ssh_listener, err := net.Listen(config.SSH.Net, config.SSH.Addr)
	if err != nil {
		clog.Fatal(1, "Listening SSH: "+err.Error())
	}

	err = serve_ssh(ssh_listener)
	if err != nil {
		clog.Fatal(1, "Serving SSH: "+err.Error())
	}
	clog.Info("Listening SSH on " + config.SSH.Net + " " + config.SSH.Addr)

	listener, err := net.Listen(config.HTTP.Net, config.HTTP.Addr)
	if err != nil {
		clog.Fatal(1, "Listening HTTP: "+err.Error())
	}
	clog.Info("Listening HTTP on " + config.HTTP.Net + " " + config.HTTP.Addr)

	err = http.Serve(listener, &http_router_t{})
	if err != nil {
		clog.Fatal(1, "Serving HTTP: "+err.Error())
	}
}