generated from ryantm/home-manager-template
-
Notifications
You must be signed in to change notification settings - Fork 1
/
scripts.nix
202 lines (180 loc) · 5.54 KB
/
scripts.nix
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
{ lib, pkgs, ...}:
let
#
# CUSTOM GENERIC PACKAGES
#
future-git = pkgs.writeShellScriptBin "future-git" ''
function help {
echo "Usage: $0 <hours> [<git args>]"
exit 1
}
if [ $# -eq 0 ]; then
help
fi
items=( "$@" )
(for e in "''${items[@]}"; do [[ "$e" =~ ^(--)?help$ ]] && exit 0; done; exit 1) && help
HOURS=4
re='^[0-9]+$'
if [[ $1 =~ $re ]]; then
HOURS=$1
shift
fi
DATE="$(date -d +''${HOURS}hours)"
GIT_AUTHOR_DATE="''${DATE}" GIT_COMMITTER_DATE="''${DATE}" git "$@"
'';
jqo = pkgs.writeShellScriptBin "jqo" ''
${pkgs.jq}/bin/jq -R -r 'capture("(?<prefix>[^{]*)(?<json>{.+})?(?<suffix>.*)") | .prefix,(.json|try fromjson catch ""),.suffix | select(length > 0)'
'';
markdown = pkgs.emem.overrideAttrs (oldAttrs: rec {
installPhase = oldAttrs.installPhase + ''
ln -fs $out/bin/emem $out/bin/markdown
'';
});
nix-system = pkgs.writeShellScriptBin "nix-system" ''
echo 'nix-shell -p nix-info --run "nix-info -m"'
nix-shell -p nix-info --run "nix-info -m"
'';
nix-version = pkgs.writeShellScriptBin "nix-version" ''
nix-instantiate --eval -A 'lib.version' '<nixpkgs>' | xargs
'';
#
# CUSTOM DARWIN PACKAGES
#
app-path = pkgs.writeShellScriptBin "app-path" ''
color()(set -o pipefail;"$@" 2>&1>&3|sed $'s,.*,\e[31m&\e[m,'>&2)3>&1
echoerr() { echo "$@" 1>&2; }
function indented() {
(set -o pipefail; { "$@" 2>&3 | sed >&2 's/^/ | /'; } 3>&1 1>&2 | perl -pe 's/^(.*)$/\e[31m | $1\e[0m/')
}
function join_by { local d=$1; shift; local f=$1; shift; printf %s "$f" "''${@/#/$d}"; }
function usage {
echo "Usage: app-path fuzzyname..."
exit 1
}
[[ $# -lt 1 ]] && usage
LOCATIONS=( "$HOME/.nix-profile/Applications" "$HOME/.nix-profile/Applications/Utilities" "$HOME/Applications" "$HOME/Applications/Utilities" "/Applications" "/Applications/Utilities" "/System/Applications" "/System/Applications/Utilities" )
MATCHER=$(join_by '.*' "$@")
APP=""
for l in "''${LOCATIONS[@]}"; do
if ! [ -d $l ]; then
continue;
fi
NAME=$(ls "$l" | grep -i "$MATCHER")
COUNT=$(echo "$NAME" | grep -v -e '^$' | wc -l)
if [[ $COUNT -gt 1 ]]; then
color echoerr "Matches:"
indented echoerr "$NAME"
usage
fi
if [[ $COUNT -eq 1 ]]; then
APP="$l/$NAME"
break
fi
done
if [ -z "$APP" ]; then
usage
else
echo "$APP"
fi
'';
idownload = pkgs.writeShellScriptBin "idownload" ''
if [ "$#" -ne 1 ] || ! [ -e $1 ]; then
echo "Usage: idownload <file|dir>";
return 1;
fi
find . -name '.*icloud' |\
perl -pe 's|(.*)/.(.*).icloud|$1/$2|s' |\
while read file; do brctl download "$file"; done
'';
nix-allow = pkgs.writeShellScriptBin "nix-allow" ''
function usage {
echo "Usage $(basename $0) fuzzyname"
exit 1
}
[[ $# -lt 1 ]] && usage
NAME=$1; shift
APP=$(${app-path}/bin/app-path "$NAME")
if [ -z "$APP" ]; then
usage 1
else
realapp=$(realpath "$APP")
codesign --force --deep --sign - "$realapp"
fi
'';
nix-open = pkgs.writeShellScriptBin "nix-open" ''
function usage {
echo "Usage: nix-open application [args...]"
exit 1
}
[[ $# -lt 1 ]] && usage
NAME=$1; shift
APP=$(${app-path}/bin/app-path "$NAME")
if [ -z "$APP" ]; then
usage
else
open -a "$APP" "$@"
fi
'';
nix-reopen = pkgs.writeShellScriptBin "nix-reopen" ''
function usage {
echo "Usage: nix-reopen application [args...]"
exit 1
}
[[ $# -lt 1 ]] && usage
LOCATIONS=( "~/.nix-profile/Applications" "~/Applications" "/Applications" )
NAME=$1
APP=$(${app-path}/bin/app-path "$NAME")
if [ -z "$APP" ]; then
usage
else
PNAME=$(defaults read "$APP/Contents/Info" CFBundleExecutable)
PIDSCOUNT=$(pgrep -i "$PNAME" | wc -l)
if [[ $PIDSCOUNT -ne 0 ]]; then
pkill -QUIT -i "$PNAME"
fi
${nix-open}/bin/nix-open "$@"
fi
'';
nix-update = pkgs.writeShellScriptBin "nix-update" ''
system="$(nix-instantiate --eval -A 'stdenv.hostPlatform.system' '<nixpkgs>' | xargs)"
if [[ "$system" == *"darwin"* ]]; then
if [ -z "$(${nix-system}/bin/nix-system 2>&1 | grep multi | grep yes)" ]; then
# multi user update
sudo -i sh -c 'nix-channel --update && nix-env --install --attr nixpkgs.nix && launchctl remove org.nixos.nix-daemon && launchctl load /Library/LaunchDaemons/org.nixos.nix-daemon.plist'
else
# single user update
nix-channel --update; nix-env --install --attr nixpkgs.nix nixpkgs.cacert
fi
elif [[ "$system" == *"linux"* ]]; then
nix-channel --update; nix-env --install --attr nixpkgs.nix nixpkgs.cacert; systemctl daemon-reload; systemctl restart nix-daemon
else
echo "Unknown system $system. No upgrade performed."
fi
'';
sudo-with-touch = pkgs.writeShellScriptBin "sudo-with-touch" ''
primary=$(cat /etc/pam.d/sudo | head -2 | tail -1 | awk '{$1=$1}1' OFS=",")
if [ "auth,sufficient,pam_tid.so" != "$primary" ]; then
newsudo=$(mktemp)
awk 'NR==2{print "auth sufficient pam_tid.so"}7' /etc/pam.d/sudo > $newsudo
sudo mv $newsudo /etc/pam.d/sudo
fi
'';
in
{
home.packages = [
future-git
jqo
markdown
nix-system
nix-update
nix-version
]
++ lib.optionals pkgs.stdenv.isDarwin ([
app-path
idownload
nix-allow
nix-open
nix-reopen
sudo-with-touch
]);
}