1616package cmd
1717
1818import (
19+ "database/sql"
1920 "fmt"
2021 log "github.com/Sirupsen/logrus"
22+ _ "github.com/lib/pq"
23+ //"k8s.io/apimachinery/pkg/labels"
2124 //"github.com/crunchydata/postgres-operator/operator/util"
2225 //"github.com/crunchydata/postgres-operator/tpr"
2326 "github.com/spf13/cobra"
@@ -29,6 +32,11 @@ import (
2932 //"strings"
3033)
3134
35+ type PswResult struct {
36+ Rolname string
37+ Rolvaliduntil string
38+ }
39+
3240var pswCmd = & cobra.Command {
3341 Use : "psw" ,
3442 Short : "manage passwords" ,
@@ -78,9 +86,95 @@ func updatePasswords() {
7886
7987 for _ , d := range deployments .Items {
8088 fmt .Println ("deployment : " + d .ObjectMeta .Name )
89+ getExpiredInfo (d .ObjectMeta .Name , "7" )
8190 if ! DryRun {
8291 }
8392
8493 }
8594
8695}
96+
97+ func getExpiredInfo (clusterName , MAX_DAYS string ) {
98+ //var err error
99+
100+ results := callDB (clusterName , MAX_DAYS )
101+ for _ , v := range results {
102+ fmt .Printf ("RoleName %s Role Valid Until %s\n " , v .Rolname , v .Rolvaliduntil )
103+ }
104+
105+ }
106+
107+ func callDB (clusterName , maxdays string ) []PswResult {
108+ var conn * sql.DB
109+
110+ results := []PswResult {}
111+
112+ //get the service for the cluster
113+ service , err := Clientset .CoreV1 ().Services (Namespace ).Get (clusterName , meta_v1.GetOptions {})
114+ if err != nil {
115+ log .Error ("error getting list of services" + err .Error ())
116+ return results
117+ }
118+
119+ //get the secrets for this cluster
120+ lo := meta_v1.ListOptions {LabelSelector : "pg-database=" + clusterName }
121+ secrets , err := Clientset .Secrets (Namespace ).List (lo )
122+ if err != nil {
123+ log .Error ("error getting list of secrets" + err .Error ())
124+ return results
125+ }
126+
127+ //get the postgres user secret info
128+ var username , password , database , hostip string
129+ for _ , s := range secrets .Items {
130+ username = string (s .Data ["username" ][:])
131+ password = string (s .Data ["password" ][:])
132+ database = "postgres"
133+ hostip = service .Spec .ClusterIP
134+ if username == "postgres" {
135+ log .Debug ("got postgres user secrets" )
136+ break
137+ }
138+ }
139+
140+ //query the database for users that have expired
141+ strPort := fmt .Sprint (service .Spec .Ports [0 ].Port )
142+ conn , err = sql .Open ("postgres" , "sslmode=disable user=" + username + " host=" + hostip + " port=" + strPort + " dbname=" + database + " password=" + password )
143+ if err != nil {
144+ log .Debug (err .Error ())
145+ return results
146+ }
147+
148+ var ts string
149+ var rows * sql.Rows
150+
151+ querystr := "SELECT rolname, rolvaliduntil as expiring_soon FROM pg_authid WHERE rolvaliduntil < now() + '" + maxdays + " days'"
152+ log .Debug (querystr )
153+ rows , err = conn .Query (querystr )
154+ if err != nil {
155+ log .Debug (err .Error ())
156+ return results
157+ }
158+
159+ defer func () {
160+ if conn != nil {
161+ conn .Close ()
162+ }
163+ if rows != nil {
164+ rows .Close ()
165+ }
166+ }()
167+
168+ for rows .Next () {
169+ p := PswResult {}
170+ if err = rows .Scan (& p .Rolname , & p .Rolvaliduntil ); err != nil {
171+ log .Debug (err .Error ())
172+ return results
173+ }
174+ results = append (results , p )
175+ log .Debug ("returned " + ts )
176+ }
177+
178+ return results
179+
180+ }
0 commit comments