mirror of
				https://github.com/ClusterCockpit/cc-backend
				synced 2025-11-04 09:35:07 +01:00 
			
		
		
		
	Add init flag
This commit is contained in:
		@@ -35,6 +35,7 @@ import (
 | 
				
			|||||||
	"github.com/ClusterCockpit/cc-backend/internal/repository"
 | 
						"github.com/ClusterCockpit/cc-backend/internal/repository"
 | 
				
			||||||
	"github.com/ClusterCockpit/cc-backend/internal/routerConfig"
 | 
						"github.com/ClusterCockpit/cc-backend/internal/routerConfig"
 | 
				
			||||||
	"github.com/ClusterCockpit/cc-backend/internal/runtimeEnv"
 | 
						"github.com/ClusterCockpit/cc-backend/internal/runtimeEnv"
 | 
				
			||||||
 | 
						"github.com/ClusterCockpit/cc-backend/internal/util"
 | 
				
			||||||
	"github.com/ClusterCockpit/cc-backend/pkg/archive"
 | 
						"github.com/ClusterCockpit/cc-backend/pkg/archive"
 | 
				
			||||||
	"github.com/ClusterCockpit/cc-backend/pkg/log"
 | 
						"github.com/ClusterCockpit/cc-backend/pkg/log"
 | 
				
			||||||
	"github.com/ClusterCockpit/cc-backend/pkg/schema"
 | 
						"github.com/ClusterCockpit/cc-backend/pkg/schema"
 | 
				
			||||||
@@ -58,15 +59,84 @@ const logoString = `
 | 
				
			|||||||
                                                    |_|
 | 
					                                                    |_|
 | 
				
			||||||
`
 | 
					`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const envString = `
 | 
				
			||||||
 | 
					# Base64 encoded Ed25519 keys (DO NOT USE THESE TWO IN PRODUCTION!)
 | 
				
			||||||
 | 
					# You can generate your own keypair using the gen-keypair tool
 | 
				
			||||||
 | 
					JWT_PUBLIC_KEY="kzfYrYy+TzpanWZHJ5qSdMj5uKUWgq74BWhQG6copP0="
 | 
				
			||||||
 | 
					JWT_PRIVATE_KEY="dtPC/6dWJFKZK7KZ78CvWuynylOmjBFyMsUWArwmodOTN9itjL5POlqdZkcnmpJ0yPm4pRaCrvgFaFAbpyik/Q=="
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Some random bytes used as secret for cookie-based sessions (DO NOT USE THIS ONE IN PRODUCTION)
 | 
				
			||||||
 | 
					SESSION_KEY="67d829bf61dc5f87a73fd814e2c9f629"
 | 
				
			||||||
 | 
					`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const configString = `
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    "addr": "127.0.0.1:8080",
 | 
				
			||||||
 | 
					    "archive": {
 | 
				
			||||||
 | 
					        "kind": "file",
 | 
				
			||||||
 | 
					        "path": "./var/job-archive"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "clusters": [
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            "name": "name",
 | 
				
			||||||
 | 
					            "metricDataRepository": {
 | 
				
			||||||
 | 
					                "kind": "cc-metric-store",
 | 
				
			||||||
 | 
					                "url": "http://localhost:8082",
 | 
				
			||||||
 | 
					                "token": ""
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "filterRanges": {
 | 
				
			||||||
 | 
					                "numNodes": {
 | 
				
			||||||
 | 
					                    "from": 1,
 | 
				
			||||||
 | 
					                    "to": 64
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                "duration": {
 | 
				
			||||||
 | 
					                    "from": 0,
 | 
				
			||||||
 | 
					                    "to": 86400
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                "startTime": {
 | 
				
			||||||
 | 
					                    "from": "2023-01-01T00:00:00Z",
 | 
				
			||||||
 | 
					                    "to": null
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var (
 | 
					var (
 | 
				
			||||||
	date    string
 | 
						date    string
 | 
				
			||||||
	commit  string
 | 
						commit  string
 | 
				
			||||||
	version string
 | 
						version string
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func initEnv() {
 | 
				
			||||||
 | 
						if util.CheckFileExists("var") {
 | 
				
			||||||
 | 
							fmt.Print("Directory ./var already exists. Exiting!\n")
 | 
				
			||||||
 | 
							os.Exit(0)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if err := os.WriteFile("config.json", []byte(configString), 0666); err != nil {
 | 
				
			||||||
 | 
							log.Fatalf("Writing config.json failed: %s", err.Error())
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if err := os.WriteFile(".env", []byte(envString), 0666); err != nil {
 | 
				
			||||||
 | 
							log.Fatalf("Writing .env failed: %s", err.Error())
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if err := os.Mkdir("var", 0777); err != nil {
 | 
				
			||||||
 | 
							log.Fatalf("Mkdir var failed: %s", err.Error())
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						err := repository.MigrateDB("sqlite3", "./var/job.db")
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							log.Fatalf("Initialize job.db failed: %s", err.Error())
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func main() {
 | 
					func main() {
 | 
				
			||||||
	var flagReinitDB, flagServer, flagSyncLDAP, flagGops, flagMigrateDB, flagDev, flagVersion, flagLogDateTime bool
 | 
						var flagReinitDB, flagInit, flagServer, flagSyncLDAP, flagGops, flagMigrateDB, flagDev, flagVersion, flagLogDateTime bool
 | 
				
			||||||
	var flagNewUser, flagDelUser, flagGenJWT, flagConfigFile, flagImportJob, flagLogLevel string
 | 
						var flagNewUser, flagDelUser, flagGenJWT, flagConfigFile, flagImportJob, flagLogLevel string
 | 
				
			||||||
 | 
						flag.BoolVar(&flagInit, "init", false, "Setup var directory, initialize swlite database file, config.json and .env")
 | 
				
			||||||
	flag.BoolVar(&flagReinitDB, "init-db", false, "Go through job-archive and re-initialize the 'job', 'tag', and 'jobtag' tables (all running jobs will be lost!)")
 | 
						flag.BoolVar(&flagReinitDB, "init-db", false, "Go through job-archive and re-initialize the 'job', 'tag', and 'jobtag' tables (all running jobs will be lost!)")
 | 
				
			||||||
	flag.BoolVar(&flagSyncLDAP, "sync-ldap", false, "Sync the 'user' table with ldap")
 | 
						flag.BoolVar(&flagSyncLDAP, "sync-ldap", false, "Sync the 'user' table with ldap")
 | 
				
			||||||
	flag.BoolVar(&flagServer, "server", false, "Start a server, continues listening on port after initialization and argument handling")
 | 
						flag.BoolVar(&flagServer, "server", false, "Start a server, continues listening on port after initialization and argument handling")
 | 
				
			||||||
@@ -96,6 +166,14 @@ func main() {
 | 
				
			|||||||
	// Apply config flags for pkg/log
 | 
						// Apply config flags for pkg/log
 | 
				
			||||||
	log.Init(flagLogLevel, flagLogDateTime)
 | 
						log.Init(flagLogLevel, flagLogDateTime)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if flagInit {
 | 
				
			||||||
 | 
							initEnv()
 | 
				
			||||||
 | 
							fmt.Print("Succesfully setup environment!\n")
 | 
				
			||||||
 | 
							fmt.Print("Please review config.json and .env and adjust it to your needs.\n")
 | 
				
			||||||
 | 
							fmt.Print("Add your job-archive at ./var/job-archive.\n")
 | 
				
			||||||
 | 
							os.Exit(0)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// See https://github.com/google/gops (Runtime overhead is almost zero)
 | 
						// See https://github.com/google/gops (Runtime overhead is almost zero)
 | 
				
			||||||
	if flagGops {
 | 
						if flagGops {
 | 
				
			||||||
		if err := agent.Listen(agent.Options{}); err != nil {
 | 
							if err := agent.Listen(agent.Options{}); err != nil {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,10 +1,10 @@
 | 
				
			|||||||
# Base64 encoded Ed25519 keys (DO NOT USE THESE TWO IN PRODUCTION!)
 | 
					# Base64 encoded Ed25519 keys (DO NOT USE THESE TWO IN PRODUCTION!)
 | 
				
			||||||
# You can generate your own keypair using `go run utils/gen-keypair.go`
 | 
					# You can generate your own keypair using `go run tools/gen-keypair/main.go`
 | 
				
			||||||
JWT_PUBLIC_KEY="kzfYrYy+TzpanWZHJ5qSdMj5uKUWgq74BWhQG6copP0="
 | 
					JWT_PUBLIC_KEY="kzfYrYy+TzpanWZHJ5qSdMj5uKUWgq74BWhQG6copP0="
 | 
				
			||||||
JWT_PRIVATE_KEY="dtPC/6dWJFKZK7KZ78CvWuynylOmjBFyMsUWArwmodOTN9itjL5POlqdZkcnmpJ0yPm4pRaCrvgFaFAbpyik/Q=="
 | 
					JWT_PRIVATE_KEY="dtPC/6dWJFKZK7KZ78CvWuynylOmjBFyMsUWArwmodOTN9itjL5POlqdZkcnmpJ0yPm4pRaCrvgFaFAbpyik/Q=="
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Base64 encoded Ed25519 public key for accepting externally generated JWTs
 | 
					# Base64 encoded Ed25519 public key for accepting externally generated JWTs
 | 
				
			||||||
# Keys in PEM format can be converted, see `tools/convert-pem-pubkey-for-cc/Readme.md`
 | 
					# Keys in PEM format can be converted, see `tools/convert-pem-pubkey/Readme.md`
 | 
				
			||||||
CROSS_LOGIN_JWT_PUBLIC_KEY=""
 | 
					CROSS_LOGIN_JWT_PUBLIC_KEY=""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Some random bytes used as secret for cookie-based sessions (DO NOT USE THIS ONE IN PRODUCTION)
 | 
					# Some random bytes used as secret for cookie-based sessions (DO NOT USE THIS ONE IN PRODUCTION)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -53,6 +53,8 @@ func checkDBVersion(backend string, db *sql.DB) error {
 | 
				
			|||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			return err
 | 
								return err
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
						default:
 | 
				
			||||||
 | 
							log.Fatalf("unsupported database backend: %s", backend)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	v, _, err := m.Version()
 | 
						v, _, err := m.Version()
 | 
				
			||||||
@@ -99,6 +101,8 @@ func MigrateDB(backend string, db string) error {
 | 
				
			|||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			return err
 | 
								return err
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
						default:
 | 
				
			||||||
 | 
							log.Fatalf("unsupported database backend: %s", backend)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if err := m.Up(); err != nil {
 | 
						if err := m.Up(); err != nil {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -15,6 +15,10 @@ import (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
func TestCheckFileExists(t *testing.T) {
 | 
					func TestCheckFileExists(t *testing.T) {
 | 
				
			||||||
	tmpdir := t.TempDir()
 | 
						tmpdir := t.TempDir()
 | 
				
			||||||
 | 
						if !util.CheckFileExists(tmpdir) {
 | 
				
			||||||
 | 
							t.Fatal("expected true, got false")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	filePath := filepath.Join(tmpdir, "version.txt")
 | 
						filePath := filepath.Join(tmpdir, "version.txt")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if err := os.WriteFile(filePath, []byte(fmt.Sprintf("%d", 1)), 0666); err != nil {
 | 
						if err := os.WriteFile(filePath, []byte(fmt.Sprintf("%d", 1)), 0666); err != nil {
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user