This is an automated email from the ASF dual-hosted git repository.

rshah pushed a commit to branch 8.0.x
in repository https://gitbox.apache.org/repos/asf/trafficcontrol.git

commit 6cb2bca67c27f926ff4b8f84de7818e7a8191b0d
Author: Joe Pappano <[email protected]>
AuthorDate: Tue Nov 14 13:08:53 2023 -0700

    t3c RPM DB check to work with rocky linux 9 (#7866)
    
    (cherry picked from commit 7a3e1e0f5566b315252ad8bc9bfe195cc8807096)
---
 CHANGELOG.md                            |   1 +
 cache-config/t3c-apply/config/config.go | 110 ++++++++++++++++++++++++--------
 2 files changed, 86 insertions(+), 25 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index da1c64196c..af6c7a096f 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -189,6 +189,7 @@ The format is based on [Keep a 
Changelog](http://keepachangelog.com/en/1.0.0/).
 - [#7688](https://github.com/apache/trafficcontrol/pull/7688) *Traffic Ops*: 
Fixed secured parameters being visible when role has proper permissions.
 - [#7697](https://github.com/apache/trafficcontrol/pull/7697) *Traffic Ops*: 
Fixed `iloPassword` and `xmppPassword` checking for priv-level instead of using 
permissions.
 - [#7817](https://github.com/apache/trafficcontrol/pull/7817) *Traffic Control 
Cache Config (t3c)*: Fixed issue that would cause null ptr panic on client 
fallback.
+- [#7866](https://github.com/apache/trafficcontrol/pull/7866) *Traffic Control 
Cache Config (t3c)*: Fixed rpm db check to work with rocky linux 9.
 
 ### Removed
 - [#7808](https://github.com/apache/trafficcontrol/pull/7808) *Traffic 
Router*: Set SOA `minimum` field to a custom value defined in the 
`tld.soa.minimum` param, and remove the previously added 
`dns.negative.caching.ttl` property.
diff --git a/cache-config/t3c-apply/config/config.go 
b/cache-config/t3c-apply/config/config.go
index e21f9279fd..7f977cec1e 100644
--- a/cache-config/t3c-apply/config/config.go
+++ b/cache-config/t3c-apply/config/config.go
@@ -191,29 +191,6 @@ func directoryExists(dir string) (bool, os.FileInfo) {
        return info.IsDir(), info
 }
 
-const rpmDir = "/var/lib/rpm"
-
-// verifies the rpm database files. if there is any database corruption
-// it will return false
-func verifyRpmDB() bool {
-       exclude := regexp.MustCompile(`(^\.|^__)`)
-       dbFiles, err := os.ReadDir(rpmDir)
-       if err != nil {
-               return false
-       }
-       for _, file := range dbFiles {
-               if exclude.Match([]byte(file.Name())) {
-                       continue
-               }
-               cmd := exec.Command("/usr/lib/rpm/rpmdb_verify", 
rpmDir+"/"+file.Name())
-               err := cmd.Run()
-               if err != nil || cmd.ProcessState.ExitCode() > 0 {
-                       return false
-               }
-       }
-       return true
-}
-
 // derives the ATS Installation directory from
 // the rpm config file list.
 func GetTSPackageHome() string {
@@ -251,6 +228,68 @@ func GetTSPackageHome() string {
        return tsHome
 }
 
+const (
+       rpmDBBdb             = "bdb"
+       rpmDBSquLite         = "sqlite"
+       rpmDBUnknown         = "unknown"
+       rpmDBVerifyCmd       = "/usr/lib/rpm/rpmdb_verify"
+       sqliteRpmDbVerifyCmd = "/bin/sqlite3"
+       rpmDir               = "/var/lib/rpm"
+       sqliteRpmDB          = "rpmdb.sqlite"
+)
+
+// getRpmDBBackend uses "%_db_backend" macro to get the database type
+func getRpmDBBackend() (string, error) {
+       var outBuf bytes.Buffer
+       cmd := exec.Command("/bin/rpm", "-E", "%_db_backend")
+       cmd.Stdout = &outBuf
+       err := cmd.Run()
+       if err != nil {
+               return rpmDBUnknown, err
+       }
+       return strings.TrimSpace(outBuf.String()), nil
+}
+
+// isSqliteInstalled looks to see if the sqlite3 executable
+// is installed which is needed to do the db verify
+func isSqliteInstalled() bool {
+       sqliteUtil := isCommandAvailable("/bin/sqlite3")
+       return sqliteUtil
+}
+
+// verifies the rpm database files. if there is any database corruption
+// it will return false
+func verifyRpmDB(rpmDir string) bool {
+       exclude := regexp.MustCompile(`(^\.|^__)`)
+       dbFiles, err := os.ReadDir(rpmDir)
+       if err != nil {
+               return false
+       }
+       for _, file := range dbFiles {
+               if exclude.Match([]byte(file.Name())) {
+                       continue
+               }
+               cmd := exec.Command(rpmDBVerifyCmd, rpmDir+"/"+file.Name())
+               err := cmd.Run()
+               if err != nil || cmd.ProcessState.ExitCode() > 0 {
+                       return false
+               }
+       }
+       return true
+}
+
+// verifySqliteRpmDB runs PRAGMA quick_check
+// requires /bin/sqlite3
+func verifySqliteRpmDB(sqliteDB string) bool {
+       args := []string{sqliteDB, `PRAGMA quick_check`}
+       cmd := exec.Command(sqliteRpmDbVerifyCmd, args...)
+       err := cmd.Run()
+       if err != nil || cmd.ProcessState.ExitCode() > 0 {
+               return false
+       }
+       return true
+}
+
 func GetCfg(appVersion string, gitRevision string) (Cfg, error) {
        var err error
        toInfoLog := []string{}
@@ -499,7 +538,29 @@ If any of the related flags are also set, they override 
the mode's default behav
                os.Setenv("TO_PASS", toPass)
        }
 
-       rpmDBisOk := verifyRpmDB()
+       rpmDBisOk := true
+       rpmDBType, err := getRpmDBBackend()
+       if err != nil {
+               toInfoLog = append(toInfoLog, fmt.Sprintf("error getting db 
type: %s", err.Error()))
+               rpmDBType = rpmDBUnknown
+       }
+
+       if rpmDBType == rpmDBSquLite {
+               sqliteUtil := isSqliteInstalled()
+               toInfoLog = append(toInfoLog, fmt.Sprintf("RPM database is %s", 
rpmDBSquLite))
+               if sqliteUtil {
+                       rpmDBisOk = verifySqliteRpmDB(rpmDir + "/" + 
sqliteRpmDB)
+                       toInfoLog = append(toInfoLog, fmt.Sprintf("RPM database 
is ok: %t", rpmDBisOk))
+               } else {
+                       toInfoLog = append(toInfoLog, "/bin/sqlite3 not 
available, RPM database not checked")
+               }
+       } else if rpmDBType == rpmDBBdb {
+               toInfoLog = append(toInfoLog, fmt.Sprintf("RPM database is %s", 
rpmDBBdb))
+               rpmDBisOk = verifyRpmDB(rpmDir)
+               toInfoLog = append(toInfoLog, fmt.Sprintf("RPM database is ok: 
%t", rpmDBisOk))
+       } else {
+               toInfoLog = append(toInfoLog, fmt.Sprintf("RPM DB type is %s DB 
check will be skipped", rpmDBUnknown))
+       }
 
        if *installPackagesPtr && !rpmDBisOk {
                if t3cutil.StrToMode(*runModePtr) == t3cutil.ModeBadAss {
@@ -509,7 +570,6 @@ If any of the related flags are also set, they override the 
mode's default behav
                }
        }
 
-       toInfoLog = append(toInfoLog, fmt.Sprintf("rpm database is ok: %t", 
rpmDBisOk))
        // set TSHome
        var tsHome = ""
        if *tsHomePtr != "" {

Reply via email to