-
-
Notifications
You must be signed in to change notification settings - Fork 291
/
Copy pathpostrename
219 lines (192 loc) · 6.14 KB
/
postrename
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
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
#!/bin/bash
#### Post Rename
####
#### Written by Stephan Wendel aka KwadFan <me@stephanwe.de>
#### Copyright 2021
#### https://github.com/mainsail-crew/MainsailOS
####
#### This File is distributed under GPLv3
####
## Error handling
set -e
# Colored Output
RED="\e[31m"
YEL="\e[33m"
GRE="\e[32m"
WHITE="\e[97m"
NOC="\e[0m"
### Setup
SERVICES=(moonraker klipper nginx sonar crowsnest)
SYSTEMD_DIR="/etc/systemd/system"
DEFAULT_USER="$(grep "1000" /etc/passwd | awk -F ':' '{print $1}')"
## Helper funcs
### Mangle services
function stop_services {
for srv in "${SERVICES[@]}"; do
if [ "$(systemctl is-active "${srv}.service")" != "inactive" ]; then
systemctl stop "${srv}.service"
fi
done
}
function start_services {
for srv in "${SERVICES[@]}"; do
systemctl start "${srv}.service"
done
}
### Clean up
function cleanup {
# Cleanup self
rm -rf "${0}"
# Cleanup rc.local
sed -i '/\/postrename/d' /etc/rc.local
}
### Change nginx root
function change_www_root {
bash -c "
sed -i 's|/home/pi/mainsail|/home/${DEFAULT_USER}/mainsail|g' \
/etc/nginx/sites-available/mainsail
"
}
### change username in service files
function change_service_user {
### Filter nginx service first!
local -a servicefile
servicefile=( "${SERVICES[@]/nginx}" )
for i in "${servicefile[@]}"; do
if [ -n "${i}" ]; then
sed -i 's/pi/'"${DEFAULT_USER}"'/g' "${SYSTEMD_DIR}/${i}.service"
fi
done
}
function relocate_venv {
local -a venvs
venvs=(klippy-env moonraker-env)
for venv in "${venvs[@]}"; do
# Move venv
sudo -u "${DEFAULT_USER}" \
virtualenv --relocatable -p /usr/bin/python3 "/home/${DEFAULT_USER}/${venv}"
# delete pycache (*.pyc files)
find "/home/${DEFAULT_USER}/${venv}" -name "__pycache__" -type d -exec rm -rf {} +
# repair shebangs
while IFS= read -r file ; do
sed -i 's|pi/'"${venv}"'|'"${DEFAULT_USER}"'/'"${venv}"'|g' "${file}"
done < <(grep -iR "pi/${venv}" "/home/${DEFAULT_USER}/${venv}"/* | cut -d":" -f1)
done
}
function patch_polkit_rules {
local polkit_dir polkit_legacy_dir polkit_usr_dir
polkit_legacy_dir="/etc/polkit-1/localauthority/50-local.d"
polkit_dir="/etc/polkit-1/rules.d"
polkit_usr_dir="/usr/share/polkit-1/rules.d"
if [ -f "${polkit_dir}/moonraker.rules" ]; then
sed -i 's/pi/'"${DEFAULT_USER}"'/g' "${polkit_dir}/moonraker.rules"
fi
if [ -f "${polkit_usr_dir}/moonraker.rules" ]; then
sed -i 's/pi/'"${DEFAULT_USER}"'/g' "${polkit_usr_dir}/moonraker.rules"
fi
if [ -f "${polkit_legacy_dir}/10-moonraker.pkla" ]; then
sed -i 's/pi/'"${DEFAULT_USER}"'/g' "${polkit_legacy_dir}/10-moonraker.pkla"
fi
}
function patch_cn_logrotate {
if [ -f "/etc/logrotate.d/crowsnest" ]; then
sed -i 's/pi/'"${DEFAULT_USER}"'/g' "/etc/logrotate.d/crowsnest"
fi
}
## Fix broken links
function fix_broken_links {
local -a brokenlinks
local path
brokenlinks=(crowsnest sonar)
path="/usr/local/bin"
for bl in "${brokenlinks[@]}"; do
if [ -h "${path}/${bl}" ]; then
rm -rf "${path:?}/${bl}"
fi
find "/home/${DEFAULT_USER}" -type f -iname "${bl}" -print0 | \
xargs -0 -I {} ln -s {} "${path}/${bl}"
done
}
function fix_timelapse_links {
local config_dir src_dir target_dir
config_dir="/home/${DEFAULT_USER}/klipper_config"
src_dir="/home/${DEFAULT_USER}/moonraker-timelapse"
target_dir="/home/${DEFAULT_USER}/moonraker/moonraker/components"
sudo -u "${DEFAULT_USER}" \
ln -sf "${src_dir}/component/timelapse.py" "${target_dir}/timelapse.py"
sudo -u "${DEFAULT_USER}" \
ln -sf "${src_dir}/klipper_macro/timelapse.cfg" "${config_dir}/timelapse.cfg"
}
function main {
local cmdltxt
cmdltxt="/boot/cmdline.txt"
## Make sure init_resize.sh and firstrun.sh are finished
if [ "$(grep -c "init" "${cmdltxt}")" != "0" ] && \
[ "$(grep -c "systemd.run.*" "${cmdltxt}")" != "0" ]; then
echo -e "[${RED}ERROR${NOC}] \
${WHITE}Sdcard resize and firtrun are not finished yet ... [ABORT]${NOC}"
## Make sure not failing rc.local
return 0
fi
## Abort if user = pi
if [ "${DEFAULT_USER}" == "pi" ]; then
echo -e "[${YEL}SKIPPED${NOC}] \
${WHITE}User is ${DEFAULT_USER}! Nothing to do ...${NOC}"
cleanup
exit 0
fi
echo -e "\n\t${WHITE}Trying to fix user rename ...${NOC}"
## Stop services
echo -en "${WHITE}Stopping all related services ...${NOC}\r"
stop_services
echo -e "${WHITE}Stopping all related services ...${NOC}[${GRE}OK${NOC}]"
## Change www root
echo -en "${WHITE}Try changing path of nginx root ...${NOC}\r"
change_www_root
echo -e "${WHITE}Try changing path of nginx root ...${NOC}[${GRE}OK${NOC}]"
## patch service files
echo -en "${WHITE}Patching service files ...${NOC}\r"
change_service_user
echo -e "${WHITE}Patching service files ...${NOC}[${GRE}OK${NOC}]"
## relocate venvs
echo -e "${WHITE}Trying to relocate venv's ...${NOC}"
relocate_venv
echo -e "${WHITE}Trying to relocate venv's ...${NOC}[${GRE}OK${NOC}]"
## patch polkit rules
echo -e "${WHITE}Patching moonraker's polkit rules ...${NOC}"
patch_polkit_rules
echo -e "${WHITE}Patching moonraker's polkit rules ...${NOC}[${GRE}OK${NOC}]"
## patch crowsnest logrotate
echo -e "${WHITE}Patching crowsnest logrotate ...${NOC}"
patch_cn_logrotate
echo -e "${WHITE}Patching crowsnest logrotate ...${NOC}[${GRE}OK${NOC}]"
## fix broken links
echo -en "${WHITE}Fix broken symlinks ...${NOC}\r"
fix_broken_links
fix_timelapse_links
echo -e "${WHITE}Fix broken symlinks ...${NOC}[${GRE}OK${NOC}]"
## do a short break
sleep 2
## reload daemons
echo -en "${WHITE}Apply service file changes ...${NOC}\r"
systemctl daemon-reload
echo -e "${WHITE}Apply service file changes ...${NOC}[${GRE}OK${NOC}]"
## do a short break
sleep 2
## restart services
echo -e "${WHITE}Trying to restart services ...${NOC}"
start_services
## wait 30sec to come up
echo -e "${WHITE}Waiting for service restart completed ...${NOC}"
sleep 30
## Cleanup
echo -e "${WHITE}Cleanup files, remove postrename ...${NOC}"
cleanup
sleep 2
## reboot system
echo -e "${WHITE}Reboot system ...${NOC}"
reboot
}
### MAIN
main
exit 0