in traffic_ops/app/db/traffic_vault_migrate/traffic_vault_migrate.go [114:299]
func main() {
getopt.ParseV2()
initConfig()
var fromSrv TVBackend
var toSrv TVBackend
importData := keyFile != ""
toSrvUsed := !dump && !dry || keyFile != ""
if !importData {
log.Infof("Initiating fromSrv %s...\n", fromType)
if !validateType(fromType) {
log.Errorln("Unknown fromType " + fromType)
os.Exit(1)
}
fromSrv = getBackendFromType(fromType)
if err := fromSrv.ReadConfigFile(fromCfgPath); err != nil {
log.Errorf("Unable to read fromSrv cfg: %v", err)
os.Exit(1)
}
if err := fromSrv.Start(); err != nil {
log.Errorf("issue starting fromSrv: %v", err)
os.Exit(1)
}
defer log.Close(fromSrv, "closing fromSrv")
if err := fromSrv.Ping(); err != nil {
log.Errorf("Unable to ping fromSrv: %v", err)
os.Exit(1)
}
}
if toSrvUsed {
log.Infof("Initiating toSrv %s...\n", toType)
if !validateType(toType) {
log.Errorln("Unknown toType " + toType)
os.Exit(1)
}
toSrv = getBackendFromType(toType)
if err := toSrv.ReadConfigFile(toCfgPath); err != nil {
log.Errorf("Unable to read toSrv cfg: %v", err)
os.Exit(1)
}
if err := toSrv.Start(); err != nil {
log.Errorf("issue starting toSrv: %v", err)
os.Exit(1)
}
defer log.Close(toSrv, "closing toSrv")
if err := toSrv.Ping(); err != nil {
log.Errorf("Unable to ping toSrv: %v", err)
os.Exit(1)
}
}
var fromSecret Secrets
if !importData {
var err error
log.Infof("Fetching data from %s...\n", fromSrv.Name())
if err = fromSrv.Fetch(); err != nil {
log.Errorf("Unable to fetch fromSrv data: %v", err)
os.Exit(1)
}
if fromSecret, err = GetKeys(fromSrv); err != nil {
log.Errorln(err)
os.Exit(1)
}
if err := Validate(fromSrv); err != nil {
log.Errorln(err)
os.Exit(1)
}
} else {
err := fromSecret.fill(keyFile)
if err != nil {
log.Errorln("error reading " + keyFile + ": " + err.Error())
os.Exit(1)
}
}
if dump {
log.Infof("Dumping data from %s...\n", fromSrv.Name())
fromSecret.dump("dump")
return
}
if compare {
log.Infof("Fetching data from %s...\n", toSrv.Name())
if err := toSrv.Fetch(); err != nil {
log.Errorf("Unable to fetch toSrv data: %v\n", err)
os.Exit(1)
}
toSecret, err := GetKeys(toSrv)
if err != nil {
log.Errorln(err)
os.Exit(1)
}
log.Infoln("Validating " + toSrv.Name())
if err := toSrv.ValidateKey(); err != nil && len(err) > 0 {
log.Errorln(strings.Join(err, "\n"))
os.Exit(1)
}
fromSecret.sort()
toSecret.sort()
if !importData {
log.Infoln(fromSrv.String())
} else {
log.Infof("Disk backup:\n\tSSL Keys: %d\n\tDNSSec Keys: %d\n\tURI Keys: %d\n\tURL Keys: %d\n", len(fromSecret.sslkeys), len(fromSecret.dnssecKeys), len(fromSecret.uriKeys), len(fromSecret.urlKeys))
}
log.Infoln(toSrv.String())
if !reflect.DeepEqual(fromSecret.sslkeys, toSecret.sslkeys) {
log.Errorln("from sslkeys and to sslkeys don't match")
os.Exit(1)
}
if !reflect.DeepEqual(fromSecret.dnssecKeys, toSecret.dnssecKeys) {
log.Errorln("from dnssec and to dnssec don't match")
os.Exit(1)
}
if !reflect.DeepEqual(fromSecret.uriKeys, toSecret.uriKeys) {
log.Errorln("from uri and to uri don't match")
os.Exit(1)
}
if !reflect.DeepEqual(fromSecret.urlKeys, toSecret.urlKeys) {
log.Errorln("from url and to url don't match")
os.Exit(1)
}
log.Infoln("Both data sources have the same keys")
return
}
if toSrvUsed {
log.Infof("Setting %s keys...\n", toSrv.Name())
if err := SetKeys(toSrv, fromSecret); err != nil {
log.Errorln(err)
os.Exit(1)
}
if err := Validate(toSrv); err != nil {
log.Errorln(err)
os.Exit(1)
}
}
if !importData {
log.Infoln(fromSrv.String())
} else {
log.Infof("Disk backup:\n\tSSL Keys: %d\n\tDNSSec Keys: %d\n\tURI Keys: %d\n\tURL Keys: %d\n", len(fromSecret.sslkeys), len(fromSecret.dnssecKeys), len(fromSecret.uriKeys), len(fromSecret.urlKeys))
}
if dry {
return
}
if !noConfirm {
ans := "q"
for {
fmt.Print("Confirm data insertion (y/n): ")
if _, err := fmt.Scanln(&ans); err != nil {
log.Errorln("unable to get user input")
os.Exit(1)
}
if ans == "y" {
break
} else if ans == "n" {
return
}
}
}
log.Infof("Inserting data into %s...\n", toSrv.Name())
if err := toSrv.Insert(); err != nil {
log.Errorln(err)
os.Exit(1)
}
}