Installer: matrix with hydra maester to auto-register oauth2 client
diff --git a/apps/matrix/capture-config/main.go b/apps/matrix/capture-config/main.go
index b031fbb..08d7be2 100644
--- a/apps/matrix/capture-config/main.go
+++ b/apps/matrix/capture-config/main.go
@@ -10,9 +10,13 @@
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/client-go/kubernetes"
 	"k8s.io/client-go/rest"
+
+	"github.com/miracl/conflate"
 )
 
 var configFile = flag.String("config", "", "Path to the homeserver.yaml config file.")
+var configToMerge = flag.String("config-to-merge", "", "Name of the configmap to merge with generated one.")
+var toMergeFilename = flag.String("to-merge-filename", "", "Name of the file from config to merge.")
 var namespace = flag.String("namespace", "", "Namespace name.")
 var configMapName = flag.String("config-map-name", "", "Name of the ConfigMap to create.")
 
@@ -28,11 +32,7 @@
 	return cs
 }
 
-func createConfigFromFile() *v1.ConfigMap {
-	f, err := ioutil.ReadFile(*configFile)
-	if err != nil {
-		panic(err)
-	}
+func createConfig(data []byte) *v1.ConfigMap {
 	return &v1.ConfigMap{
 		TypeMeta: metav1.TypeMeta{
 			Kind:       "ConfigMap",
@@ -42,17 +42,35 @@
 			Name: *configMapName,
 		},
 		Data: map[string]string{
-			path.Base(*configFile): string(f),
+			path.Base(*configFile): string(data),
 		},
 	}
 }
 
 func main() {
 	flag.Parse()
-	config := createConfigFromFile()
 	client := createClient().CoreV1().ConfigMaps(*namespace)
-	_, err := client.Create(context.TODO(), config, metav1.CreateOptions{})
+	conf := conflate.New()
+	generated, err := ioutil.ReadFile(*configFile)
 	if err != nil {
 		panic(err)
 	}
+	if err := conf.AddData(generated); err != nil {
+		panic(err)
+	}
+	toMerge, err := client.Get(context.TODO(), *configToMerge, metav1.GetOptions{})
+	if err != nil {
+		panic(err)
+	}
+	if err := conf.AddData([]byte(toMerge.Data[*toMergeFilename])); err != nil {
+		panic(err)
+	}
+	merged, err := conf.MarshalYAML()
+	if err != nil {
+		panic(err)
+	}
+	config := createConfig(merged)
+	if _, err := client.Create(context.TODO(), config, metav1.CreateOptions{}); err != nil {
+		panic(err)
+	}
 }