| 275 | } |
| 276 | |
| 277 | func (ash Handler) openDatabase() (*db.AuthDB, error) { |
| 278 | key := ash.getDatabaseKey() |
| 279 | database, loaded, err := databasePool.LoadOrNew(key, func() (caddy.Destructor, error) { |
| 280 | dbFolder := filepath.Join(caddy.AppDataDir(), "acme_server", key) |
| 281 | dbPath := filepath.Join(dbFolder, "db") |
| 282 | |
| 283 | err := os.MkdirAll(dbFolder, 0o755) |
| 284 | if err != nil { |
| 285 | return nil, fmt.Errorf("making folder for CA database: %v", err) |
| 286 | } |
| 287 | |
| 288 | dbConfig := &db.Config{ |
| 289 | Type: "bbolt", |
| 290 | DataSource: dbPath, |
| 291 | } |
| 292 | database, err := db.New(dbConfig) |
| 293 | return databaseCloser{&database}, err |
| 294 | }) |
| 295 | |
| 296 | if loaded { |
| 297 | if c := ash.logger.Check(zapcore.DebugLevel, "loaded preexisting CA database"); c != nil { |
| 298 | c.Write(zap.String("db_key", key)) |
| 299 | } |
| 300 | } |
| 301 | |
| 302 | return database.(databaseCloser).DB, err |
| 303 | } |
| 304 | |
| 305 | // makeClient creates an ACME client which will use a custom |
| 306 | // resolver instead of net.DefaultResolver. |