Skip to content

Commit 9af7cdc

Browse files
committed
Add ability to configure pg_ident in clusterspec
1 parent 2ae5e0f commit 9af7cdc

File tree

4 files changed

+65
-0
lines changed

4 files changed

+65
-0
lines changed

cmd/keeper/cmd/keeper.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1058,6 +1058,7 @@ func (p *PostgresKeeper) postgresKeeperSM(pctx context.Context) {
10581058

10591059
// Generate hba auth from clusterData
10601060
pgm.SetHba(p.generateHBA(cd, db, p.waitSyncStandbysSynced))
1061+
pgm.SetIdent(db.Spec.PgIdent)
10611062

10621063
var pgParameters common.Parameters
10631064

@@ -1475,6 +1476,7 @@ func (p *PostgresKeeper) postgresKeeperSM(pctx context.Context) {
14751476
p.waitSyncStandbysSynced = true
14761477
log.Infow("not allowing connection as normal users since synchronous replication is enabled and instance was down")
14771478
pgm.SetHba(p.generateHBA(cd, db, true))
1479+
pgm.SetIdent(db.Spec.PgIdent)
14781480
}
14791481

14801482
if err = pgm.Start(); err != nil {
@@ -1657,6 +1659,15 @@ func (p *PostgresKeeper) postgresKeeperSM(pctx context.Context) {
16571659
// for tests
16581660
log.Infow("postgres hba entries not changed")
16591661
}
1662+
newIdent := db.Spec.PgIdent
1663+
if !reflect.DeepEqual(newIdent, pgm.CurIdent()) {
1664+
log.Infow("postgres ident entries changed, reloading postgres instance")
1665+
pgm.SetIdent(newIdent)
1666+
needsReload = true
1667+
} else {
1668+
// for tests
1669+
log.Infow("postgres ident entries not changed")
1670+
}
16601671

16611672
if needsReload {
16621673
needsReloadGauge.Set(1) // mark as reload needed

cmd/sentinel/cmd/sentinel.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -381,6 +381,7 @@ func (s *Sentinel) setDBSpecFromClusterSpec(cd *cluster.ClusterData) {
381381
db.Spec.UsePgrewind = *clusterSpec.UsePgrewind
382382
db.Spec.PGParameters = clusterSpec.PGParameters
383383
db.Spec.PGHBA = clusterSpec.PGHBA
384+
db.Spec.PgIdent = clusterSpec.PgIdent
384385
if db.Spec.FollowConfig != nil && db.Spec.FollowConfig.Type == cluster.FollowTypeExternal {
385386
db.Spec.FollowConfig.StandbySettings = clusterSpec.StandbyConfig.StandbySettings
386387
db.Spec.FollowConfig.ArchiveRecoverySettings = clusterSpec.StandbyConfig.ArchiveRecoverySettings

internal/cluster/cluster.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -286,6 +286,8 @@ type ClusterSpec struct {
286286
// Additional pg_hba.conf entries
287287
// we don't set omitempty since we want to distinguish between null or empty slice
288288
PGHBA []string `json:"pgHBA"`
289+
// pg_ident.conf entries
290+
PgIdent util.PgIdent `json:"pgIdent"`
289291
// Enable automatic pg restart when pg parameters that requires restart changes
290292
AutomaticPgRestart *bool `json:"automaticPgRestart"`
291293
}
@@ -625,6 +627,8 @@ type DBSpec struct {
625627
// Additional pg_hba.conf entries
626628
// We don't set omitempty since we want to distinguish between null or empty slice
627629
PGHBA []string `json:"pgHBA"`
630+
// pg_ident.conf entries
631+
PgIdent util.PgIdent `json:"pgIdent"`
628632
// DB Role (master or standby)
629633
Role common.Role `json:"role,omitempty"`
630634
// FollowConfig when Role is "standby"

internal/postgresql/postgresql.go

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,13 @@ var (
5959

6060
var log = slog.S()
6161

62+
type PgIdent map[string][]UserMaps
63+
64+
type UserMaps struct {
65+
SystemUsername string `json:"systemUsername"`
66+
DBUsername string `json:"databaseUsername"`
67+
}
68+
6269
type PGManager interface {
6370
GetTimelinesHistory(timeline uint64) ([]*TimelineHistory, error)
6471
}
@@ -69,6 +76,8 @@ type Manager struct {
6976
parameters common.Parameters
7077
recoveryOptions *RecoveryOptions
7178
hba []string
79+
ident PgIdent
80+
currentIdent PgIdent
7281
curParameters common.Parameters
7382
curRecoveryOptions *RecoveryOptions
7483
curHba []string
@@ -178,10 +187,18 @@ func (p *Manager) SetHba(hba []string) {
178187
p.hba = hba
179188
}
180189

190+
func (p *Manager) SetIdent(ident PgIdent) {
191+
p.ident = ident
192+
}
193+
181194
func (p *Manager) CurHba() []string {
182195
return p.curHba
183196
}
184197

198+
func (p *Manager) CurIdent() PgIdent {
199+
return p.currentIdent
200+
}
201+
185202
func (p *Manager) UpdateCurParameters() {
186203
n, err := copystructure.Copy(p.parameters)
187204
if err != nil {
@@ -202,6 +219,14 @@ func (p *Manager) UpdateCurHba() {
202219
p.curHba = n.([]string)
203220
}
204221

222+
func (p *Manager) UpdateCurIdent() {
223+
n, err := copystructure.Copy(p.ident)
224+
if err != nil {
225+
panic(err)
226+
}
227+
p.currentIdent = n.(PgIdent)
228+
}
229+
205230
func (p *Manager) Init(initConfig *InitConfig) error {
206231
// ioutil.Tempfile already creates files with 0600 permissions
207232
pwfile, err := ioutil.TempFile("", "pwfile")
@@ -374,6 +399,7 @@ func (p *Manager) start(args ...string) error {
374399
p.UpdateCurParameters()
375400
p.UpdateCurRecoveryOptions()
376401
p.UpdateCurHba()
402+
p.UpdateCurIdent()
377403

378404
return nil
379405
}
@@ -438,6 +464,7 @@ func (p *Manager) Reload() error {
438464
p.UpdateCurParameters()
439465
p.UpdateCurRecoveryOptions()
440466
p.UpdateCurHba()
467+
p.UpdateCurIdent()
441468

442469
return nil
443470
}
@@ -767,6 +794,9 @@ func (p *Manager) writeConfs(useTmpPostgresConf bool) error {
767794
return fmt.Errorf("error writing %s file: %v", postgresRecoverySignal, err)
768795
}
769796
}
797+
if err := p.writePgIdent(); err != nil {
798+
return fmt.Errorf("error writing pg_ident.conf file: %v", err)
799+
}
770800
return nil
771801
}
772802

@@ -877,6 +907,25 @@ func (p *Manager) writePgHba() error {
877907
})
878908
}
879909

910+
func (p *Manager) writePgIdent() error {
911+
return common.WriteFileAtomicFunc(filepath.Join(p.dataDir, "pg_ident.conf"), 0600,
912+
func(f io.Writer) error {
913+
if p.ident != nil && len(p.ident) > 0 {
914+
if _, err := f.Write([]byte("# MAPNAME\tSYSTEM-USERNAME\tPG-USERNAME" + "\n")); err != nil {
915+
return err
916+
}
917+
for key, value := range p.ident {
918+
for _, v := range value {
919+
if _, err := f.Write([]byte(fmt.Sprintf("%s\t%s\t%s", key, v.SystemUsername, v.DBUsername) + "\n")); err != nil {
920+
return err
921+
}
922+
}
923+
}
924+
}
925+
return nil
926+
})
927+
}
928+
880929
// createPostgresqlAutoConf creates postgresql.auto.conf as a symlink to
881930
// /dev/null to block alter systems commands (they'll return an error)
882931
func (p *Manager) createPostgresqlAutoConf() error {

0 commit comments

Comments
 (0)