# should work with any shell, but we have only tested bash
SHELL=/bin/bash
+.DELETE_ON_ERROR:
+
# run make CONF=anotherconfig.mk if you need several configs
CONF ?= conf.mk
cache/db.%:
@echo "Starting db server on $(call display,$*) - logs in $(call log,$@)"
- @$(SSH) $(HOST_$*) $(SUDO) sliver-ovs start-db > $(call log,$@) 2>&1 && touch $@
+ @$(SSH) $(HOST_$*) $(SUDO) sliver-ovs start-db > $(call log,$@) 2>&1
+ @touch $@
cache/switch.%: | cache/db.%
@echo "Starting vswitchd on $(call display,$*) - logs in $(call log,$@)"
- @$(SSH) $(HOST_$*) $(SUDO) sliver-ovs start-switch > $(call log,$@) 2>&1 && touch $@
+ @$(SSH) $(HOST_$*) $(SUDO) sliver-ovs start-switch > $(call log,$@) 2>&1
+ @touch $@
cache/bridge.%: | cache/db.%
@echo "Creating bridge on $(call display,$*) - logs in $(call log,$@)"
@$(SSH) $(HOST_$*) $(SUDO) \
- sliver-ovs create-bridge $(BRIDGE) $(IP_$*) $(call default,BROPTIONS,$*) > $(call log,$@) 2>&1 \
- && { echo "IP_$*=$(IP_$*)"; echo "BROPTIONS_$*=$(call default,BROPTIONS,$*)"; } > $@
+ sliver-ovs create-bridge $(BRIDGE) $(IP_$*) $(call default,BROPTIONS,$*) > $(call log,$@) 2>&1
+ @{ echo "IP_$*=$(IP_$*)"; echo "BROPTIONS_$*=$(call default,BROPTIONS,$*)"; } > $@
cache/controller.%: cache/bridge.%
@echo "Setting controller $(call default,CONTROLLER,$*) on $(call display,$*) - logs in $(call log,$@)"
- @$(SSH) $(HOST_$*) $(SUDO) ovs-vsctl set-controller $(BRIDGE) $(call default,CONTROLLER,$*) > $(call log,$@) 2>&1 \
- && echo "CONTROLLER_$*=$(call default,CONTROLLER,$*)" > $@
+ @$(SSH) $(HOST_$*) $(SUDO) ovs-vsctl set-controller $(BRIDGE) $(call default,CONTROLLER,$*) > $(call log,$@) 2>&1
+ @echo "CONTROLLER_$*=$(call default,CONTROLLER,$*)" > $@
# xxx this probably needs a more thorough cleanup in cache/
cache/stop.%: del-bridge.%
# We invalidate the cache accordingly.
del-bridge.%: | cache/db.%
@echo "Deleting bridge on $(call display,$*)"
- @$(SSH) $(HOST_$*) $(SUDO) sliver-ovs del-bridge $(BRIDGE);
+ @$(SSH) $(HOST_$*) $(SUDO) sliver-ovs del-bridge $(BRIDGE)
@rm -f cache/bridge.$* \
cache/iface.$*$(SEP)*@1 cache/iface.*$(SEP)$*@2 \
cache/port.$*$(SEP)*@1 cache/port.*$(SEP)$*@2 \
cache/rsnap.ip.%: FORCE
@$(SSH) $(HOST_$*) $(SUDO) \
- sliver-ovs get-local-ip $(BRIDGE) | sed 's/^/IP_$*=/' > $@ \
- || { rm $@; exit 1; }
+ sliver-ovs get-local-ip $(BRIDGE) | sed 's/^/IP_$*=/' > $@
cache/rsnap.links.%: FORCE
@$(SSH) $(HOST_$*) $(SUDO) \
- sliver-ovs get-local-links $(BRIDGE) | sed -n 's/^L/LINKS += /p' > $@ \
- || { rm $@; exit 1; }
+ sliver-ovs get-local-links $(BRIDGE) | sed -n 's/^L/LINKS += /p' > $@
### update sliver-ovs
update: $(addprefix update-,$(CONF_NODE_IDS))
cache/iface.%: cache/bridge.$$(call get,%) | cache/db.$$(call get,%)
@echo "Creating interface for link $(call linkpart,$(*F)) on $(call display,$(call get,$(*F))) - logs in $(call log,$@)"
@$(SSH) $(call solve,$(call get,$(*F))) $(SUDO) sliver-ovs create-port $(BRIDGE) \
- L$(call linkpart,$(*F)) > $(call log,$@) 2>&1 \
- && touch $@
+ L$(call linkpart,$(*F)) > $(call log,$@) 2>&1
+ @touch $@
# cache/port.<node_id1>-<node_id2>@<endpoint>:
# Retrieves the local port of link <node_id1>-<node_id2> on
cache/port.%: cache/iface.% cache/switch.$$(call get,%)
@echo "Getting port number for link $(call linkpart,$(*F)) on $(call display,$(call get,$(*F))) - logs in $(call log,$@)"
@$(SSH) $(call solve,$(call get,$(*F))) $(SUDO) \
- sliver-ovs get-local-endpoint L$(call linkpart,$(*F)) > $@ 2> $(call log,$@) \
- || { rm $@; exit 1; }
+ sliver-ovs get-local-endpoint L$(call linkpart,$(*F)) > $@ 2> $(call log,$@)
# linkid=$(call linkpart,%)
@echo "Setting port number of link $(call linkpart,$(*F)) on $(call display,$(call get,$(*F))) - logs in $(call log,$@)"
@$(SSH) $(call solve,$(call get,$(*F))) $(SUDO) sliver-ovs set-remote-endpoint L$(call linkpart,$(*F)) \
$$(cat cache/host.$(call rget,$(*F))) \
- $$(cat cache/port.$(call opp,$(*F))) 2> $(call log,$@) \
- && touch $@
+ $$(cat cache/port.$(call opp,$(*F))) 2> $(call log,$@)
+ @touch $@
####################
CLEANTARGETS=$(addprefix del-,$(notdir $(wildcard cache/bridge.*)))
+%: varname=$(subst +,,$@)
+%:
@echo "$($(varname))"
+
+# external nodes and links
+#
+ALL_LINKS := $(LINKS) $(patsubst L/%,%,$(filter L/%,$(MAKECMDGOALS)))
+EXTERNAL_LINKS := $(filter $(foreach host,$(EXTERNAL_HOSTS),%-$(host)),$(ALL_LINKS))
+
+$(foreach host,$(EXTERNAL_HOSTS),sshcheck-$(host)): ;
+$(foreach host,$(EXTERNAL_HOSTS),ovsversion-$(host)): ;
+$(foreach host,$(EXTERNAL_HOSTS),showdpid-$(host)): ;
+$(foreach host,$(EXTERNAL_HOSTS),showmac-$(host)): ;
+$(foreach host,$(EXTERNAL_HOSTS),showports-$(host)): ;
+$(foreach host,$(EXTERNAL_HOSTS),update-$(host)): ;
+$(foreach host,$(EXTERNAL_HOSTS),del-controller-$(host)): ;
+$(foreach host,$(EXTERNAL_HOSTS),cache/status.$(host)): ;
+$(foreach host,$(EXTERNAL_HOSTS),cache/db.$(host)): ;
+$(foreach host,$(EXTERNAL_HOSTS),cache/bridge.$(host)): ;
+$(foreach host,$(EXTERNAL_HOSTS),cache/switch.$(host)): ;
+$(foreach host,$(EXTERNAL_HOSTS),cache/controller.$(host)): ;
+$(foreach link,$(EXTERNAL_LINKS),cache/iface.$(link)@2): ;
+$(foreach link,$(EXTERNAL_LINKS),cache/port.$(link)@2): ;
+$(foreach link,$(EXTERNAL_LINKS),del-iface.$(link)@2): ;
+
+# we assume that a program called tunproxy is available on the
+# external nodes.
+
+.SECONDEXPANSION:
+$(foreach link,$(EXTERNAL_LINKS),cache/endpoint.$(link)@2): cache/endpoint.%@2: cache/port.%@1 cache/host.$$(call leftnode,%)
+ @#echo $* [$<] [$^] $(call rightnode,$*)
+ @echo $(call default,EXTERNAL_PORT,$(call rightnode,$*)) > $@
+ @echo "===>" $(call rightnode,$*): \
+ ./tunproxy -t $$(cat cache/host.$(call leftnode,$*)):$$(cat cache/port.$*@1) \
+ -p $(call default,EXTERNAL_PORT,$(call rightnode,$*)) -e -d
+