#-------------------------------------------------------------------------
#
# Makefile for src/pgcluster/admin
#
#-------------------------------------------------------------------------

top_builddir = ../../..
include $(top_builddir)/src/Makefile.global

subdir = src/pgcluster/admin
admindir := ${prefix}/admin
probedir := ${prefix}/probe
cadir := ${prefix}/ca
certdir := ${prefix}/ca/certs
privatedir := ${prefix}/ca/private

OPENSSL = /usr/bin/openssl
CERTS = root.pem
DHPARAMS = dh512.pem dh1024.pem

# this setup is for V3 protocol
MAIN1=admin_main.o
MAIN2=probe_main.o
MAIN3=admin_init.o
OBJ1=admin_exec.o admin_monitor.o admin_set_cluster_status.o admin_set_pglb_status.o admin_set_pgrp_status.o admin_set_status.o admin_user_req.o
OBJ2=probe_exec.o probe_exec_cluster.o probe_exec_pglb.o probe_exec_pgrp.o probe_get_cluster_status.o probe_get_pglb_status.o probe_get_pgrp_status.o probe_get_status.o probe_info.o probe_init.o probe_set_cluster_status.o probe_set_pglb_status.o probe_set_pgrp_status.o probe_set_status.o
OBJ3=packet.o stop.o show.o ssl.o
OBJ4=set_key.o set_conf.o send_conf.o conf.o

EXTRA_OBJS = $(top_builddir)/src/backend/libpq/replicate_com.o ../libpgc/SUBSYS.o

CFLAGS += -I../ -DPRINT_DEBUG -Wall -pthread -g
LIBS += -lssl -lcrypto

override CPPFLAGS := -I$(libpq_srcdir) $(CPPFLAGS) -DBINDIR=\"$(bindir)\"
all: $(CERTS) $(DHPARAMS) pgc_admin pgc_probe pgc_admin_init

pgc_admin: $(MAIN1) $(OBJ1) $(OBJ2) $(OBJ3) $(OBJ4)
	$(CC) $(CFLAGS) $(MAIN1) $(OBJ1) $(OBJ2) $(OBJ3) $(OBJ4) $(EXTRA_OBJS) $(libpq) $(libpq_builddir)/libpq.a $(LDFLAGS) $(LIBS) -o $@

pgc_probe: $(MAIN2) $(OBJ1) $(OBJ2) $(OBJ3) $(OBJ4)
	$(CC) $(CFLAGS) $(MAIN2) $(OBJ1) $(OBJ2) $(OBJ3) $(OBJ4) $(EXTRA_OBJS) $(libpq) $(libpq_builddir)/libpq.a $(LDFLAGS) $(LIBS) -o $@

pgc_admin_init: $(MAIN3) $(OBJ4)
	$(CC) $(CFLAGS) $(MAIN3) $(OBJ4) $(EXTRA_OBJS) $(libpq) $(libpq_builddir)/libpq.a $(LDFLAGS) $(LIBS) -o $@

install: all installdirs
	$(INSTALL_PROGRAM) pgc_admin$(X) $(DESTDIR)$(bindir)/pgc_admin$(X)
	$(INSTALL_PROGRAM) pgc_probe$(X) $(DESTDIR)$(bindir)/pgc_probe$(X)
	$(INSTALL_PROGRAM) pgc_admin_init$(X) $(DESTDIR)$(bindir)/pgc_admin_init$(X)
	$(INSTALL_DATA) admin.cnf.sample  $(DESTDIR)$(admindir)/admin.cnf.sample
	$(INSTALL_DATA) probe.cnf.sample  $(DESTDIR)$(admindir)/probe.cnf.sample
	$(INSTALL_DATA) root.cnf.sample  $(DESTDIR)$(admindir)/root.cnf.sample
	$(INSTALL_DATA) serverCA.cnf.sample  $(DESTDIR)$(admindir)/serverCA.cnf.sample
	$(INSTALL_DATA) server.conf.sample  $(DESTDIR)$(admindir)/server.conf.sample
	$(INSTALL_DATA) pgc_db.temp  $(DESTDIR)$(admindir)/pgc_db.temp
	$(INSTALL_DATA) pgc_pglb.temp  $(DESTDIR)$(admindir)/pgc_pglb.temp
	$(INSTALL_DATA) pgc_pgrp.temp  $(DESTDIR)$(admindir)/pgc_pgrp.temp
#	$(INSTALL_DATA) adminCA.pem $(DESTDIR)$(admindir)/adminCA.pem
#	$(INSTALL_DATA) adminCAcert.pem $(DESTDIR)$(admindir)/adminCAcert.pem
	$(INSTALL_DATA) rootcert.pem $(DESTDIR)$(admindir)/rootcert.pem
	$(INSTALL_DATA) root.pem $(DESTDIR)$(admindir)/root.pem
	$(INSTALL_DATA) dh512.pem $(DESTDIR)$(admindir)/dh512.pem
	$(INSTALL_DATA) dh1024.pem $(DESTDIR)$(admindir)/dh1024.pem
	echo '01' > $(cadir)/serial
	touch $(cadir)/index.txt

$(CERTS): $(CERTS:.pem=.cnf)
	$(OPENSSL) req -nodes -newkey rsa:1024 -sha1 -keyout rootkey.pem -out rootreq.pem -config root.cnf
	$(OPENSSL) x509 -req -in rootreq.pem -sha1 -extfile root.cnf -extensions certificate_extensions -signkey rootkey.pem -out rootcert.pem
	cat rootcert.pem rootkey.pem > root.pem
#	$(OPENSSL) req -nodes -newkey rsa:1024 -sha1 -keyout adminCAkey.pem -out adminCAreq.pem -config adminCA.cnf
#	$(OPENSSL) x509 -req -in adminCAreq.pem -sha1 -extfile adminCA.cnf -extensions certificate_extensions -CA root.pem -CAkey root.pem -CAcreateserial -out adminCAcert.pem
#	cat adminCAcert.pem adminCAkey.pem rootcert.pem > adminCA.pem

certclean:
	rm -f rootkey.pem rootreq.pem rootcert.pem root.pem root.srl
#	rm -f adminCAkey.pem adminCAreq.pem adminCAcert.pem adminCA.pem adminCA.srl

dh512.pem:
	$(OPENSSL) dhparam -check -text -5 512 -out dh512.pem

dh1024.pem:
	$(OPENSSL) dhparam -check -text -5 1024 -out dh1024.pem

dhparamclean:
	rm -f $(DHPARAMS)

installdirs:
	$(mkinstalldirs) '$(DESTDIR)$(admindir)'
	$(mkinstalldirs) '$(DESTDIR)$(probedir)'
	$(mkinstalldirs) '$(DESTDIR)$(cadir)'
	$(mkinstalldirs) '$(DESTDIR)$(certdir)'
	$(mkinstalldirs) '$(DESTDIR)$(privatedir)'
	chmod g-rwx,o-rwx $(DESTDIR)$(privatedir)

uninstall:
	rm -f $(addprefix $(DESTDIR)$(bindir)/, pgc_admin$(X))
	rm -f $(addprefix $(DESTDIR)$(bindir)/, pgc_probe$(X))
	rm -f $(addprefix $(DESTDIR)$(bindir)/, pgc_admin_init$(X))
	rm -f $(DESTDIR)$(admindir)/server.conf.sample
	rm -f $(DESTDIR)$(admindir)/pgc_db.temp
	rm -f $(DESTDIR)$(admindir)/pgc_pglb.temp
	rm -f $(DESTDIR)$(admindir)/pgc_pgrp.temp

clean distclean maintainer-clean: certclean dhparamclean
	rm -f pgc_admin$(X) pgc_probe$(X) pgc_admin_init$(X) $(MAIN1) $(MAIN2) $(MAIN3) $(OBJ1) $(OBJ2) $(OBJ3) $(OBJ4)

clean_obj:
	rm -f $(MAIN1) $(MAIN2) $(MAIN3) $(OBJ1) $(OBJ2) $(OBJ3) $(OBJ4)
