mirror of
				https://github.com/optim-enterprises-bv/vault.git
				synced 2025-11-03 20:17:59 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			76 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			76 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package postgresql
 | 
						|
 | 
						|
import (
 | 
						|
	"database/sql"
 | 
						|
	"fmt"
 | 
						|
 | 
						|
	"github.com/hashicorp/vault/logical"
 | 
						|
	"github.com/hashicorp/vault/logical/framework"
 | 
						|
	_ "github.com/lib/pq"
 | 
						|
)
 | 
						|
 | 
						|
func pathConfigConnection(b *backend) *framework.Path {
 | 
						|
	return &framework.Path{
 | 
						|
		Pattern: "config/connection",
 | 
						|
		Fields: map[string]*framework.FieldSchema{
 | 
						|
			"value": &framework.FieldSchema{
 | 
						|
				Type:        framework.TypeString,
 | 
						|
				Description: "DB connection string",
 | 
						|
			},
 | 
						|
		},
 | 
						|
 | 
						|
		Callbacks: map[logical.Operation]framework.OperationFunc{
 | 
						|
			logical.WriteOperation: b.pathConnectionWrite,
 | 
						|
		},
 | 
						|
 | 
						|
		HelpSynopsis:    pathConfigConnectionHelpSyn,
 | 
						|
		HelpDescription: pathConfigConnectionHelpDesc,
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func (b *backend) pathConnectionWrite(
 | 
						|
	req *logical.Request, data *framework.FieldData) (*logical.Response, error) {
 | 
						|
	connString := data.Get("value").(string)
 | 
						|
 | 
						|
	// Verify the string
 | 
						|
	db, err := sql.Open("postgres", connString)
 | 
						|
	if err != nil {
 | 
						|
		return logical.ErrorResponse(fmt.Sprintf(
 | 
						|
			"Error validating connection info: %s", err)), nil
 | 
						|
	}
 | 
						|
	defer db.Close()
 | 
						|
	if err := db.Ping(); err != nil {
 | 
						|
		return logical.ErrorResponse(fmt.Sprintf(
 | 
						|
			"Error validating connection info: %s", err)), nil
 | 
						|
	}
 | 
						|
 | 
						|
	// Store it
 | 
						|
	entry, err := logical.StorageEntryJSON("config/connection", connString)
 | 
						|
	if err != nil {
 | 
						|
		return nil, err
 | 
						|
	}
 | 
						|
	if err := req.Storage.Put(entry); err != nil {
 | 
						|
		return nil, err
 | 
						|
	}
 | 
						|
 | 
						|
	// Reset the DB connection
 | 
						|
	b.ResetDB()
 | 
						|
 | 
						|
	return nil, nil
 | 
						|
}
 | 
						|
 | 
						|
const pathConfigConnectionHelpSyn = `
 | 
						|
Configure the connection string to talk to PostgreSQL.
 | 
						|
`
 | 
						|
 | 
						|
const pathConfigConnectionHelpDesc = `
 | 
						|
This path configures the connection string used to connect to PostgreSQL.
 | 
						|
The value of the string can be a URL, or a PG style string in the
 | 
						|
format of "user=foo host=bar" etc.
 | 
						|
 | 
						|
The URL looks like:
 | 
						|
"postgresql://user:pass@host:port/dbname"
 | 
						|
 | 
						|
When configuring the connection string, the backend will verify its validity.
 | 
						|
`
 |