Project

General

Profile

1
##### Configuration
2

    
3
src_server ?= jupiter
4

    
5

    
6
selfDir_NzrNZp := $(dir $(lastword $(MAKEFILE_LIST)))
7
root := $(selfDir_NzrNZp)..
8
include $(root)/lib/common.Makefile
9

    
10

    
11
##### Vars/functions
12

    
13
# Make
14
SHELL := /bin/bash
15

    
16
# OS
17
os := $(shell uname)
18
isMac := $(filter Darwin,$(os))
19

    
20
# System
21
dateFmt := %Y-%m-%d-%H-%M-%S
22
mtime = $(shell $(if $(isMac),stat -f %Sm -t "$(dateFmt)" $(1),date\
23
--reference=$(1) +"$(dateFmt)"))
24

    
25
# Terminal
26
esc := '['
27
reset := $(esc)'0m'
28
emph := $(esc)'7m '
29
endEmph := ' '$(reset)
30

    
31
# User interaction
32

    
33
confirm = $(if $(shell read -p $(emph)"$(1)"$(endEmph)$$'$(if\
34
$(2),\n$(2))\nContinue? (y/n) ' REPLY; test "$$REPLY" = y && echo t),,\
35
$(error Aborting))
36

    
37
# Paths
38
bin := $(root)/bin
39

    
40
# DB
41
psqlVerbose := $(bin)/psql_script_vegbien --echo-all
42
pg_dump := $(bin)/pg_dump_vegbien
43
backup := "time" env data=1 $(pg_dump)
44
restore := "time" $(bin)/postgres_vegbien pg_restore --exit-on-error
45
restoreBien := $(restore) --dbname=vegbien
46
# pg_restore doesn't support PGDATABASE env var
47
rmSchema = 'DROP SCHEMA IF EXISTS "$(1)" CASCADE;'
48

    
49
##### Backups
50

    
51
backups := $(wildcard *.backup)
52

    
53
#### Checksums
54

    
55
md5s: _always $(backups:%=%.md5) ;
56

    
57
%.md5: %
58
	nice -n +5 md5sum $<|cut -d ' ' -f 1 >$@
59

    
60
%.md5/test: %.md5 % _always
61
	echo '$(shell cat $<)  $*'|nice -n +5 md5sum -$(if $(isMac),v)c /dev/stdin
62

    
63
#### SQL
64

    
65
# Must come before %.sql with no prerequisites to be matched first
66
%.sql: %
67
	$(restore) $< >$@
68

    
69
# Full DB
70
# Must come before %.backup to be matched first
71
vegbien.%.backup:
72
	$(backup) all >$@
73
	$(MAKE) $@.md5
74

    
75
backup* = $(backup) $* >$@
76

    
77
# Note: This can't be used for the current (unrotated) public schema because
78
# pg_dump doesn't back up the CREATE SCHEMA statement for it, assuming falsely
79
# that public already exists because it's in template1.
80
%.backup:
81
	$(backup*)
82
	$(MAKE) $@.md5
83

    
84
# When testing, turn off %.sql so make won't skip `%.sql: %` in favor of it
85
ifeq ($(filter %.backup/test,$(MAKECMDGOALS)),)
86
%.sql:
87
	env plain=1 $(backup*)
88
endif
89

    
90
%.backup/restore: %.backup _always
91
	$(restoreBien) $<
92

    
93
%.sql/restore: %.sql _always
94
	$(bin)/psql_script_vegbien <$<
95
# pg_restore only supports "non-plain-text formats"
96
# (http://www.postgresql.org/docs/9.1/static/app-pgrestore.html)
97

    
98
%.backup/test: %.backup.sql _always
99
	rm $<
100

    
101
%.backup/rotate: %.backup _always
102
	mv $< $*.$(call mtime,$<).backup
103

    
104
#### Archived imports
105

    
106
confirmRm = $(call confirm,WARNING: This will delete the archived import $(1)!)
107

    
108
public* = $(*:vegbien.%=public.%)
109

    
110
%.backup/remove: %.backup _always
111
	@$(call confirmRm,$(public*))
112
	echo $(call rmSchema,$(public*))|$(bin)/psql_script_vegbien
113

    
114
%.backup/rm_indexes: %.backup _always
115
	$(pg_dump) $*|$(bin)/mk_rm_indexes|$(psqlVerbose)
116

    
117
##### Synchronization
118

    
119
remote := $(src_user)@$(src_server):/data/dev/aaronmk/VegBIEN.backups/
120

    
121
rsyncBackups := $(rsync) --include="/*.backup" --include="/*.sql"\
122
--include="/*.csv" --include="/*.md5" --exclude="**"
123

    
124
upload: _always
125
	$(rsyncBackups) $(local) $(remote)
126

    
127
%/download: _always
128
	$(rsync) $(remote)$* $(local)$*
129
	-$(if $(filter %.md5,$*),,$(MAKE) $*.md5/download)
130
# ignore errors if $*.md5 does not exist
    (1-1/1)