diff options
-rwxr-xr-x | Makefile | 207 | ||||
-rwxr-xr-x | dm | 214 |
2 files changed, 218 insertions, 203 deletions
diff --git a/Makefile b/Makefile new file mode 100755 index 0000000..3a7f8ee --- /dev/null +++ b/Makefile @@ -0,0 +1,207 @@ +#!gmake -f +SUBSTS_FILE=SUBSTS.local + +# Files that need changes to work locally or that contain sensitive +# information +LOCAL_FILES = \ + .devscripts \ + .gitconfig \ + .imapfilter/config.lua \ + .msmtprc \ + .mutt/accounts.rc \ + .mutt/score.rc \ + .muttrc \ + .netrc \ + .offlineimaprc \ + .screenrc \ + .xinitrc \ + .xmonad/xmonad.hs \ + .zsh/func/prompt_wunjo_setup \ + .zshrc \ + bin/run-mailcheck + +# GPG encrypted files +GPG_FILES = \ + .mutt/alias.rc \ + .ssh/id_ecdsa \ + .ssh/id_rsa \ + .ssh/id_rsa.lambda + +# Files that are system independent. +# IMPORTANT: directories must have trailing slash +GLOBAL_FILES = \ + .Xdefaults \ + .Xsession \ + .config/nitrogen/ \ + .cmus/ \ + .dput.cf \ + .dzen/ \ + .fonts.conf \ + .gitconfig \ + .imapfilter/ \ + .inputrc \ + .local/share/wallpapers/ \ + .mailcap \ + .mailcheckrc \ + .mutt/ \ + .mutt/alias.rc \ + .muttrc \ + .notmuch-config \ + .offlineimap.py \ + .pythonrc.py \ + .quiltrc-dpkg \ + .reportbugrc \ + .sbuildrc \ + .screenlayout/ \ + .screenrc-mail \ + .signature \ + .ssh/ \ + .urxvt/ \ + .vim/ \ + .vimperatorrc \ + .vimrc \ + .xinitrc \ + .xkb/ \ + .xmobarrc \ + .xmonad/ \ + .zsh/ \ + .zlogout \ + bin/ \ + +get-val = $(shell awk '{if (match($$0, /$1/)) { print $$2 } }' $(SUBSTS_FILE)) +get-sed-args = $(foreach var,$($(1)),-e 's|$(var)|$(call get-val,$(var))|g') + +CURRENT_BRANCH = $(shell git branch --no-color | colrm 1 2) + +SHA256 = $(call get-val,SHA256) +GPG_DISABLED = $(call get-val,GPG_DISABLED) + +VARS_.devscripts = MSMTP_PATH +VARS_.gitconfig = MSMTP_PATH +VARS_.imapfilter/config.lua = LOCAL_PASS PM_EMAIL +VARS_.msmtprc = GMAIL_PASS QUEENSU_PASS LOCALHOST MCGSOCS_PASS MCGILL_PASS +VARS_.mutt/accounts.rc = LOCAL_PASS GMAIL_PASS QUEENSU_PASS MSMTP_PATH MCGILL_PASS +VARS_.mutt/score.rc = MUTT_10_SCORE MUTT_20_SCORE +VARS_.muttrc = MSMTP_PATH +VARS_.netrc = LOCAL_PASS GMAIL_PASS +VARS_.offlineimaprc = LOCAL_PASS GMAIL_PASS QUEENSU_PASS MCGSOCS_PASS MCGILL_PASS +VARS_.screenrc = ZSH_PATH SCREEN_HOST_COLOUR +VARS_.xinitrc = SCREENLAYOUT REDSHIFT_MODE GSD_PATH +VARS_.xmonad/xmonad.hs = XMONAD_DZEN_W XMONAD_DZEN_X XMONAD_DZEN_Y +VARS_.zsh/func/prompt_wunjo_setup = ZSH_HOST_COLOUR +VARS_.zshrc = LOCALE SUBSTS_RM SUBSTS_LS MSMTP_PATH KEYCHAIN +VARS_bin/run-mailcheck = ZSH_PATH GREP_PATH + +all: clean build + +# This target relies on GLOBAL_FILES being before LOCAL_FILES so that the +# build/LOCAL_FILES targets overwrite what was copied in GLOBAL_FILES. +BUILD = $(patsubst %,build/%,$(GLOBAL_FILES) $(LOCAL_FILES) $(GPG_FILES)) + +build: $(BUILD) + +# We must force these with a phony target, otherwise, make will see that they're +# already there (for example, from installing the rest of .mutt or .zsh) and +# will skip them---which means they don't get their substitutions +build/.imapfilter/config.lua: FORCE +build/.mutt/accounts.rc: FORCE +build/.xmonad/xmonad.hs: FORCE +build/.zsh/func/prompt_wunjo_setup: FORCE +FORCE: + +.mutt/alias.rc: gpg/.mutt/alias.rc.gpg +.ssh/id_%: gpg/.ssh/id_%.gpg +# $(patsubst gpg/,,$(wildcard gpg/.* gpg/*)) +$(GPG_FILES): + touch $@ && chmod 600 $@ + [ "$(GPG_DISABLED)" = "True" ] || gpg --decrypt gpg/$@.gpg > $@ + +build/%: % $(SUBSTS_FILE) + [ -d $(dir $@) ] || mkdir -p $(dir $@) + ( [ -d $< ] && rsync -a $</* $@/ ) || rsync -a $< $@ + @# sed will only be called if $* is in LOCAL_FILES. + @# Thought of using ifeq/ifneq, but the gmake manual reads: + @# "make evaluates conditionals when it reads a makefile. Consequently, + @# you cannot use automatic variables in the tests of conditionals + @# because they are not defined until recipes are run (see Automatic + @# Variables)." + [ "$(filter $*,$(LOCAL_FILES))" != "$*" ] || sed $(call get-sed-args,VARS_$*) $< > $@ + +install: $(BUILD) + rsync -a build/ ~ + chmod 600 ~/.msmtprc ~/.netrc ~/.ssh/id_* + chmod 700 ~/.ssh + +sha256sums: .git/refs/heads/$(CURRENT_BRANCH) + $(SHA256) `git ls-files | grep -v $@` > $@ + [ $(SHA256) = 'sha256' ] || awk '{ \ + sum = $$1; \ + $$1 = ""; \ + # We want (filename), not ( filename). \ + gsub(/^ /,""); \ + print "SHA256 (" $$0 ") = " sum; \ + }' $@ > $@.temp + mv $@.temp $@ + +sha256sums.asc: sha256sums + rm -f $@ + gpg --armor --detach-sign $< + +merge: SUBSTS $(SUBSTS_FILE) + # sdiff has exit status 1 if files are different. Ignore + - sdiff -o SUBSTS.merged $^ + @echo "" + @echo "Please review SUBSTS.merged, then run" + @echo "mv SUBSTS.merged $(SUBSTS_FILE)" + +verify: + # BSD sha256 sum command doesn't have a -c option. + # BSD and coreutils sha256 commands have different outputs, however, the + # file is always in field two. The sum's location varies. + awk --posix 'BEGIN {\ + mismatch_count = 0; \ + match_count = 0; \ + } { \ + # The file associated with the sum we`re checking \ + # Appears to be field 2 in BSD and coreutils sum \ + file = $$2; \ + # We want `filename`, not `(filename)` \ + sub(/^\(/, "", file); \ + sub(/\)$$/, "", file); \ + # Generate the sum to compare with \ + cmd = "$(SHA256) " file; \ + cmd | getline gensum; \ + close(cmd); \ + split(gensum, gensum_fields); \ + gensum = ""; \ + for (field in gensum_fields) { \ + if (gensum_fields[field] ~ /[[:xdigit:]]{64}/) { \ + gensum = gensum_fields[field]; \ + } \ + } \ + for (i = 1; i <= NF; i++) { \ + if ($$i ~ /[[:xdigit:]]{64}/) { \ + filesum = $$i; \ + } \ + } \ + if (filesum == gensum) { \ + print "Match: " file; \ + match_count += 1; \ + } else { \ + print "Mismatch: " file; \ + mismatch_count += 1; \ + } \ + } END { \ + print match_count, "matches, ", mismatch_count, "mismatches." \ + }' sha256sums + gpg --verify sha256sums.asc + +udh: + rsync -avz master.debian.org:/var/lib/misc/master.debian.org/ssh_known_hosts .ssh/known_hosts.d/debian + +clean: + rm -fr build + +clobber: clean + rm -f $(GPG_FILES) +.PHONY: build install clean verify merge udh @@ -1,207 +1,15 @@ -#!gmake -f -SUBSTS_FILE=SUBSTS.local +#!/bin/sh -# Files that need changes to work locally or that contain sensitive -# information -LOCAL_FILES = \ - .devscripts \ - .gitconfig \ - .imapfilter/config.lua \ - .msmtprc \ - .mutt/accounts.rc \ - .mutt/score.rc \ - .muttrc \ - .netrc \ - .offlineimaprc \ - .screenrc \ - .xinitrc \ - .xmonad/xmonad.hs \ - .zsh/func/prompt_wunjo_setup \ - .zshrc \ - bin/run-mailcheck +set -e -# GPG encrypted files -GPG_FILES = \ - .mutt/alias.rc \ - .ssh/id_ecdsa \ - .ssh/id_rsa \ - .ssh/id_rsa.lambda +if [ `uname` = "Linux" ]; then + make --version | grep "GNU Make" > /dev/null 2>&1 || { echo "Please install GNU Make"; exit 1; } + MAKE=`command -v make` +else + command -v gmake > /dev/null 2>&1 || { echo "Please install GNU Make"; exit 1; } + MAKE=`command -v gmake` +fi -# Files that are system independent. -# IMPORTANT: directories must have trailing slash -GLOBAL_FILES = \ - .Xdefaults \ - .Xsession \ - .config/nitrogen/ \ - .cmus/ \ - .dput.cf \ - .dzen/ \ - .fonts.conf \ - .gitconfig \ - .imapfilter/ \ - .inputrc \ - .local/share/wallpapers/ \ - .mailcap \ - .mailcheckrc \ - .mutt/ \ - .mutt/alias.rc \ - .muttrc \ - .notmuch-config \ - .offlineimap.py \ - .pythonrc.py \ - .quiltrc-dpkg \ - .reportbugrc \ - .sbuildrc \ - .screenlayout/ \ - .screenrc-mail \ - .signature \ - .ssh/ \ - .urxvt/ \ - .vim/ \ - .vimperatorrc \ - .vimrc \ - .xinitrc \ - .xkb/ \ - .xmobarrc \ - .xmonad/ \ - .zsh/ \ - .zlogout \ - bin/ \ +${MAKE} -f Makefile $@ -get-val = $(shell awk '{if (match($$0, /$1/)) { print $$2 } }' $(SUBSTS_FILE)) -get-sed-args = $(foreach var,$($(1)),-e 's|$(var)|$(call get-val,$(var))|g') - -CURRENT_BRANCH = $(shell git branch --no-color | colrm 1 2) - -SHA256 = $(call get-val,SHA256) -GPG_DISABLED = $(call get-val,GPG_DISABLED) - -VARS_.devscripts = MSMTP_PATH -VARS_.gitconfig = MSMTP_PATH -VARS_.imapfilter/config.lua = LOCAL_PASS PM_EMAIL -VARS_.msmtprc = GMAIL_PASS QUEENSU_PASS LOCALHOST MCGSOCS_PASS MCGILL_PASS -VARS_.mutt/accounts.rc = LOCAL_PASS GMAIL_PASS QUEENSU_PASS MSMTP_PATH MCGILL_PASS -VARS_.mutt/score.rc = MUTT_10_SCORE MUTT_20_SCORE -VARS_.muttrc = MSMTP_PATH -VARS_.netrc = LOCAL_PASS GMAIL_PASS -VARS_.offlineimaprc = LOCAL_PASS GMAIL_PASS QUEENSU_PASS MCGSOCS_PASS MCGILL_PASS -VARS_.screenrc = ZSH_PATH SCREEN_HOST_COLOUR -VARS_.xinitrc = SCREENLAYOUT REDSHIFT_MODE GSD_PATH -VARS_.xmonad/xmonad.hs = XMONAD_DZEN_W XMONAD_DZEN_X XMONAD_DZEN_Y -VARS_.zsh/func/prompt_wunjo_setup = ZSH_HOST_COLOUR -VARS_.zshrc = LOCALE SUBSTS_RM SUBSTS_LS MSMTP_PATH KEYCHAIN -VARS_bin/run-mailcheck = ZSH_PATH GREP_PATH - -all: clean build - -# This target relies on GLOBAL_FILES being before LOCAL_FILES so that the -# build/LOCAL_FILES targets overwrite what was copied in GLOBAL_FILES. -BUILD = $(patsubst %,build/%,$(GLOBAL_FILES) $(LOCAL_FILES) $(GPG_FILES)) - -build: $(BUILD) - -# We must force these with a phony target, otherwise, make will see that they're -# already there (for example, from installing the rest of .mutt or .zsh) and -# will skip them---which means they don't get their substitutions -build/.imapfilter/config.lua: FORCE -build/.mutt/accounts.rc: FORCE -build/.xmonad/xmonad.hs: FORCE -build/.zsh/func/prompt_wunjo_setup: FORCE -FORCE: - -.mutt/alias.rc: gpg/.mutt/alias.rc.gpg -.ssh/id_%: gpg/.ssh/id_%.gpg -# $(patsubst gpg/,,$(wildcard gpg/.* gpg/*)) -$(GPG_FILES): - touch $@ && chmod 600 $@ - [ "$(GPG_DISABLED)" = "True" ] || gpg --decrypt gpg/$@.gpg > $@ - -build/%: % $(SUBSTS_FILE) - [ -d $(dir $@) ] || mkdir -p $(dir $@) - ( [ -d $< ] && rsync -a $</* $@/ ) || rsync -a $< $@ - @# sed will only be called if $* is in LOCAL_FILES. - @# Thought of using ifeq/ifneq, but the gmake manual reads: - @# "make evaluates conditionals when it reads a makefile. Consequently, - @# you cannot use automatic variables in the tests of conditionals - @# because they are not defined until recipes are run (see Automatic - @# Variables)." - [ "$(filter $*,$(LOCAL_FILES))" != "$*" ] || sed $(call get-sed-args,VARS_$*) $< > $@ - -install: $(BUILD) - rsync -a build/ ~ - chmod 600 ~/.msmtprc ~/.netrc ~/.ssh/id_* - chmod 700 ~/.ssh - -sha256sums: .git/refs/heads/$(CURRENT_BRANCH) - $(SHA256) `git ls-files | grep -v $@` > $@ - [ $(SHA256) = 'sha256' ] || awk '{ \ - sum = $$1; \ - $$1 = ""; \ - # We want (filename), not ( filename). \ - gsub(/^ /,""); \ - print "SHA256 (" $$0 ") = " sum; \ - }' $@ > $@.temp - mv $@.temp $@ - -sha256sums.asc: sha256sums - rm -f $@ - gpg --armor --detach-sign $< - -merge: SUBSTS $(SUBSTS_FILE) - # sdiff has exit status 1 if files are different. Ignore - - sdiff -o SUBSTS.merged $^ - @echo "" - @echo "Please review SUBSTS.merged, then run" - @echo "mv SUBSTS.merged $(SUBSTS_FILE)" - -verify: - # BSD sha256 sum command doesn't have a -c option. - # BSD and coreutils sha256 commands have different outputs, however, the - # file is always in field two. The sum's location varies. - awk --posix 'BEGIN {\ - mismatch_count = 0; \ - match_count = 0; \ - } { \ - # The file associated with the sum we`re checking \ - # Appears to be field 2 in BSD and coreutils sum \ - file = $$2; \ - # We want `filename`, not `(filename)` \ - sub(/^\(/, "", file); \ - sub(/\)$$/, "", file); \ - # Generate the sum to compare with \ - cmd = "$(SHA256) " file; \ - cmd | getline gensum; \ - close(cmd); \ - split(gensum, gensum_fields); \ - gensum = ""; \ - for (field in gensum_fields) { \ - if (gensum_fields[field] ~ /[[:xdigit:]]{64}/) { \ - gensum = gensum_fields[field]; \ - } \ - } \ - for (i = 1; i <= NF; i++) { \ - if ($$i ~ /[[:xdigit:]]{64}/) { \ - filesum = $$i; \ - } \ - } \ - if (filesum == gensum) { \ - print "Match: " file; \ - match_count += 1; \ - } else { \ - print "Mismatch: " file; \ - mismatch_count += 1; \ - } \ - } END { \ - print match_count, "matches, ", mismatch_count, "mismatches." \ - }' sha256sums - gpg --verify sha256sums.asc - -udh: - rsync -avz master.debian.org:/var/lib/misc/master.debian.org/ssh_known_hosts .ssh/known_hosts.d/debian - -clean: - rm -fr build - -clobber: clean - rm -f $(GPG_FILES) -.PHONY: build install clean verify merge udh +# vim:ft=sh |