include cauldron.env
export

# dependencies: perl carton
SANDBOXES := bwrap-sandbox
MODULES := local

DIRS := $$CLDRN_ROOT $$CLDRN_EDITS $$CLDRN_SUBMITTED $$CLDRN_RESULTS $$CLDRN_COURSES $$CLDRN_CONFIGS $$CLDRN_TEACHER_DATA $$CLDRN_LOGS $$CLDRN_SYSERROR_SUBS $$CLDRN_CONFIG_CACHE $$CLDRN_EXECS

UPLOAD_SCRIPT = upload_config.pl
MAIN_SCRIPT = load_task.pl

LIBS := lib $(MODULES)
SCRIPTS := $(UPLOAD_SCRIPT) run_stage.pl run_task.pl $(MAIN_SCRIPT)
CONFIG := cauldron.env

DEFAULT_DATA := $$CLDRN_TEACHER_DATA/$$CLDRN_DEFAULT
DEFAULT_CONFIGS := $$CLDRN_CONFIGS/$$CLDRN_DEFAULT
DEFAULT_DIRS := $(DEFAULT_DATA) $(DEFAULT_CONFIGS)

# TODO
LOGIN := iva
ID := 4242

KEEP_USER := 1 # preserve the user after uninstallation
NEW_USER := 0 # create new user for installation

all: install

install: user install_data $(SANDBOXES) symlinks prepare_units
	systemctl enable cauldron.target
	systemctl enable cauldron-core@$(LOGIN).service
	systemctl restart cauldron-core@$(LOGIN).service
	systemctl restart cauldron.target

$(SANDBOXES): user $(DEFAULT_DATA) install_data
	$(MAKE) -C $@ install LOGIN=$(LOGIN) DIR=$(DEFAULT_DATA)

$(MODULES): user
	runuser -u $(LOGIN) -- carton install

prepare_units:
	install cauldron-core@.service /etc/systemd/system/
	install cauldron.target /etc/systemd/system/
	systemctl daemon-reload

install_data: pathes $(DEFAULT_DIRS) $(MODULES)
	cp -r $(LIBS) $(SCRIPTS) $(CONFIG) $$CLDRN_ROOT
	cp -r CLDRN $(DEFAULT_CONFIGS)
	chown -R $(LOGIN):$(LOGIN) $$CLDRN_ROOT
	cd $$CLDRN_ROOT && chmod +x $(SCRIPTS)

$(DEFAULT_DIRS): pathes
	mkdir -p $@

pathes: user
	mkdir -p $(DIRS)
	chown -R $(LOGIN):$(LOGIN) $(DIRS)

user:
ifeq ($(NEW_USER), 1)
	-useradd --uid $(ID) $(LOGIN) # needs home for carton ...
endif

symlinks:
	ln -fs $$CLDRN_ROOT/$(UPLOAD_SCRIPT) /usr/local/bin/cauldron-config
	ln -fs $$CLDRN_ROOT/$(MAIN_SCRIPT) /usr/local/bin/cauldron-core
	ln -fs $$CLDRN_LOGS/ /var/log/cauldron
	ln -fs $$CLDRN_ROOT /usr/local/lib/cauldron

clean:
	@for d in $(SANDBOXES); do $(MAKE) -C $$d $@ || exit $$?; done

clean-more: clean
	@for d in $(SANDBOXES); do $(MAKE) -C $$d $@ || exit $$?; done
	rm -r $(MODULES)

userdel:
ifeq ($(KEEP_USER), 0)
	-userdel -r $(LOGIN)
endif

uninstall: userdel
	systemctl stop cauldron-core@$(LOGIN).service
	systemctl disable cauldron-core@$(LOGIN).service
	systemctl disable cauldron.target
	systemctl daemon-reload
	systemctl reset-failed
	-rm /etc/systemd/system/cauldron-core@.service
	-rm /etc/systemd/system/cauldron.target
	-rm -r $(DIRS)
	-rm /usr/local/bin/cauldron-config
	-rm /usr/local/bin/cauldron-core
	-rm /var/log/cauldron
	-rm /usr/local/lib/cauldron

.PHONY: all install uninstall $(SANDBOXES) clean clean-more symlinks user pathes install_data prepare_units userdel
