2021-06-10 21:32:11 +02:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
2021-07-13 18:07:29 +02:00
|
|
|
"context"
|
2021-10-25 06:20:03 +02:00
|
|
|
"entgo.io/ent/dialect"
|
|
|
|
"entgo.io/ent/dialect/sql"
|
2021-09-12 17:25:33 +02:00
|
|
|
"flag"
|
2021-06-10 21:32:11 +02:00
|
|
|
"github.com/Jguer/go-alpm/v2"
|
2021-10-25 06:20:03 +02:00
|
|
|
_ "github.com/jackc/pgx/v4/stdlib"
|
2021-06-10 21:32:11 +02:00
|
|
|
log "github.com/sirupsen/logrus"
|
2021-08-30 11:05:11 +02:00
|
|
|
"github.com/wercker/journalhook"
|
2023-12-15 18:54:57 +01:00
|
|
|
"gopkg.in/yaml.v2"
|
2021-06-10 21:32:11 +02:00
|
|
|
"os"
|
|
|
|
"os/signal"
|
|
|
|
"path/filepath"
|
2023-03-14 00:39:15 +01:00
|
|
|
"somegit.dev/ALHP/ALHP.GO/ent"
|
|
|
|
"somegit.dev/ALHP/ALHP.GO/ent/migrate"
|
2021-11-19 23:01:19 +01:00
|
|
|
"sync"
|
2021-06-10 21:32:11 +02:00
|
|
|
"syscall"
|
|
|
|
)
|
|
|
|
|
|
|
|
var (
|
2021-11-04 11:59:57 +01:00
|
|
|
conf *Conf
|
2021-09-12 17:35:45 +02:00
|
|
|
repos []string
|
|
|
|
alpmHandle *alpm.Handle
|
2021-11-04 11:59:57 +01:00
|
|
|
buildManager *BuildManager
|
2021-09-12 17:35:45 +02:00
|
|
|
db *ent.Client
|
|
|
|
journalLog = flag.Bool("journal", false, "Log to systemd journal instead of stdout")
|
|
|
|
checkInterval = flag.Int("interval", 5, "How often svn2git should be checked in minutes (default: 5)")
|
2023-12-09 17:05:29 +01:00
|
|
|
configFile = flag.String("config", "config.yaml", "set config file name/path")
|
2021-06-10 21:32:11 +02:00
|
|
|
)
|
|
|
|
|
|
|
|
func main() {
|
|
|
|
killSignals := make(chan os.Signal, 1)
|
|
|
|
signal.Notify(killSignals, syscall.SIGINT, syscall.SIGTERM)
|
|
|
|
|
2021-11-22 16:50:12 +01:00
|
|
|
reloadSignals := make(chan os.Signal, 1)
|
|
|
|
signal.Notify(reloadSignals, syscall.SIGUSR1)
|
|
|
|
|
2021-09-12 17:25:33 +02:00
|
|
|
flag.Parse()
|
|
|
|
|
2023-12-09 17:05:29 +01:00
|
|
|
confStr, err := os.ReadFile(*configFile)
|
2022-02-16 08:11:34 +01:00
|
|
|
if err != nil {
|
2023-05-21 20:28:23 +02:00
|
|
|
log.Fatalf("error reading config file: %v", err)
|
2022-02-16 08:11:34 +01:00
|
|
|
}
|
2021-06-10 21:32:11 +02:00
|
|
|
|
|
|
|
err = yaml.Unmarshal(confStr, &conf)
|
2022-02-16 08:11:34 +01:00
|
|
|
if err != nil {
|
2023-05-21 20:28:23 +02:00
|
|
|
log.Fatalf("error parsing config file: %v", err)
|
2022-02-16 08:11:34 +01:00
|
|
|
}
|
2021-06-10 21:32:11 +02:00
|
|
|
|
|
|
|
lvl, err := log.ParseLevel(conf.Logging.Level)
|
2022-02-16 08:11:34 +01:00
|
|
|
if err != nil {
|
2023-05-21 20:28:23 +02:00
|
|
|
log.Fatalf("error parsing log level from config: %v", err)
|
2022-02-16 08:11:34 +01:00
|
|
|
}
|
2021-06-10 21:32:11 +02:00
|
|
|
log.SetLevel(lvl)
|
2021-09-12 17:25:33 +02:00
|
|
|
if *journalLog {
|
|
|
|
journalhook.Enable()
|
|
|
|
}
|
2021-06-10 21:32:11 +02:00
|
|
|
|
2021-06-30 17:41:50 +02:00
|
|
|
err = syscall.Setpriority(syscall.PRIO_PROCESS, 0, 5)
|
|
|
|
if err != nil {
|
2023-05-21 20:28:23 +02:00
|
|
|
log.Infof("failed to drop priority: %v", err)
|
2021-06-30 17:41:50 +02:00
|
|
|
}
|
2021-06-14 13:04:06 +02:00
|
|
|
|
2022-11-20 19:19:16 +01:00
|
|
|
err = os.MkdirAll(conf.Basedir.Repo, 0o755)
|
2022-02-16 08:11:34 +01:00
|
|
|
if err != nil {
|
2023-05-21 20:28:23 +02:00
|
|
|
log.Fatalf("error creating repo dir: %v", err)
|
2022-02-16 08:11:34 +01:00
|
|
|
}
|
2021-07-14 19:21:58 +02:00
|
|
|
|
2022-11-20 19:19:16 +01:00
|
|
|
if conf.DB.Driver == "pgx" {
|
|
|
|
pdb, err := sql.Open("pgx", conf.DB.ConnectTo)
|
2021-10-25 06:20:03 +02:00
|
|
|
if err != nil {
|
2023-05-21 20:28:23 +02:00
|
|
|
log.Fatalf("failed to open database %s: %v", conf.DB.ConnectTo, err)
|
2021-10-25 06:20:03 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
drv := sql.OpenDB(dialect.Postgres, pdb.DB())
|
|
|
|
db = ent.NewClient(ent.Driver(drv))
|
|
|
|
} else {
|
2022-11-20 19:19:16 +01:00
|
|
|
db, err = ent.Open(conf.DB.Driver, conf.DB.ConnectTo)
|
2021-10-25 06:20:03 +02:00
|
|
|
if err != nil {
|
2023-05-21 20:28:23 +02:00
|
|
|
log.Panicf("failed to open database %s: %v", conf.DB.ConnectTo, err)
|
2021-10-25 06:20:03 +02:00
|
|
|
}
|
|
|
|
defer func(Client *ent.Client) {
|
|
|
|
_ = Client.Close()
|
|
|
|
}(db)
|
2021-07-13 18:07:29 +02:00
|
|
|
}
|
|
|
|
|
2021-07-26 16:38:12 +02:00
|
|
|
if err := db.Schema.Create(context.Background(), migrate.WithDropIndex(true), migrate.WithDropColumn(true)); err != nil {
|
2023-05-21 20:28:23 +02:00
|
|
|
log.Panicf("automigrate failed: %v", err)
|
2021-07-13 18:07:29 +02:00
|
|
|
}
|
|
|
|
|
2021-11-04 11:59:57 +01:00
|
|
|
buildManager = &BuildManager{
|
2023-03-14 00:39:15 +01:00
|
|
|
repoPurge: make(map[string]chan []*ProtoPackage),
|
|
|
|
repoAdd: make(map[string]chan []*ProtoPackage),
|
|
|
|
queueSignal: make(chan struct{}),
|
|
|
|
alpmMutex: new(sync.RWMutex),
|
|
|
|
building: []*ProtoPackage{},
|
|
|
|
buildingLock: new(sync.RWMutex),
|
|
|
|
repoWG: new(sync.WaitGroup),
|
2021-06-10 21:32:11 +02:00
|
|
|
}
|
|
|
|
|
2021-11-02 08:43:50 +01:00
|
|
|
err = setupChroot()
|
|
|
|
if err != nil {
|
2023-05-21 20:28:23 +02:00
|
|
|
log.Panicf("unable to setup chroot: %v", err)
|
2021-11-02 08:43:50 +01:00
|
|
|
}
|
2022-02-16 08:11:34 +01:00
|
|
|
err = syncMarchs()
|
|
|
|
if err != nil {
|
2023-05-21 20:28:23 +02:00
|
|
|
log.Panicf("error syncing marchs: %v", err)
|
2022-02-16 08:11:34 +01:00
|
|
|
}
|
2021-06-10 21:32:11 +02:00
|
|
|
|
2022-11-20 19:19:16 +01:00
|
|
|
alpmHandle, err = initALPM(filepath.Join(conf.Basedir.Work, chrootDir, pristineChroot),
|
|
|
|
filepath.Join(conf.Basedir.Work, chrootDir, pristineChroot, "/var/lib/pacman"))
|
2022-02-16 08:11:34 +01:00
|
|
|
if err != nil {
|
2023-05-21 20:28:23 +02:00
|
|
|
log.Panicf("error while ALPM-init: %v", err)
|
2022-02-16 08:11:34 +01:00
|
|
|
}
|
2021-07-27 02:43:30 +02:00
|
|
|
|
2022-02-19 18:03:55 +01:00
|
|
|
ctx, cancel := context.WithCancel(context.Background())
|
|
|
|
|
|
|
|
go func() {
|
|
|
|
_ = buildManager.syncWorker(ctx)
|
|
|
|
}()
|
2021-06-10 21:32:11 +02:00
|
|
|
|
2021-11-22 16:50:12 +01:00
|
|
|
killLoop:
|
|
|
|
for {
|
|
|
|
select {
|
|
|
|
case <-killSignals:
|
|
|
|
break killLoop
|
|
|
|
case <-reloadSignals:
|
2023-12-09 17:06:15 +01:00
|
|
|
confStr, err := os.ReadFile(*configFile)
|
2021-11-22 16:50:12 +01:00
|
|
|
if err != nil {
|
2023-05-21 20:28:23 +02:00
|
|
|
log.Panicf("unable to open config: %v", err)
|
2021-11-22 16:50:12 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
err = yaml.Unmarshal(confStr, &conf)
|
|
|
|
if err != nil {
|
2023-05-21 20:28:23 +02:00
|
|
|
log.Panicf("unable to parse config: %v", err)
|
2021-11-22 16:50:12 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
lvl, err := log.ParseLevel(conf.Logging.Level)
|
|
|
|
if err != nil {
|
2023-05-21 20:28:23 +02:00
|
|
|
log.Panicf("failure setting logging level: %v", err)
|
2021-11-22 16:50:12 +01:00
|
|
|
}
|
|
|
|
log.SetLevel(lvl)
|
2023-05-21 20:28:23 +02:00
|
|
|
log.Infof("config reloaded")
|
2021-11-22 16:50:12 +01:00
|
|
|
}
|
|
|
|
}
|
2021-06-10 21:32:11 +02:00
|
|
|
|
2022-02-19 18:03:55 +01:00
|
|
|
cancel()
|
2021-07-09 14:12:43 +02:00
|
|
|
buildManager.repoWG.Wait()
|
2022-02-16 08:11:34 +01:00
|
|
|
_ = alpmHandle.Release()
|
2021-06-10 21:32:11 +02:00
|
|
|
}
|