|
@@ -1,288 +0,0 @@
|
1
|
|
-#!/bin/bash
|
2
|
|
-#
|
3
|
|
-# .---. . .
|
4
|
|
-# | | |
|
5
|
|
-# |--- .--. .-. .-. .-.| .-. .--.--. |.-. .-. .--. .-.
|
6
|
|
-# | | (.-' (.-' ( | ( )| | | | )( )| | (.-'
|
7
|
|
-# ' ' --' --' -' - -' ' ' -' -' -' ' - --'
|
8
|
|
-#
|
9
|
|
-# Freedom in the Cloud
|
10
|
|
-#
|
11
|
|
-# Mirror git repos which the project depends on
|
12
|
|
-#
|
13
|
|
-# License
|
14
|
|
-# =======
|
15
|
|
-#
|
16
|
|
-# Copyright (C) 2015-2016 Bob Mottram <bob@freedombone.net>
|
17
|
|
-#
|
18
|
|
-# This program is free software: you can redistribute it and/or modify
|
19
|
|
-# it under the terms of the GNU Affero General Public License as published by
|
20
|
|
-# the Free Software Foundation, either version 3 of the License, or
|
21
|
|
-# (at your option) any later version.
|
22
|
|
-#
|
23
|
|
-# This program is distributed in the hope that it will be useful,
|
24
|
|
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
25
|
|
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
26
|
|
-# GNU Affero General Public License for more details.
|
27
|
|
-#
|
28
|
|
-# You should have received a copy of the GNU Affero General Public License
|
29
|
|
-# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
30
|
|
-
|
31
|
|
-PROJECT_NAME='freedombone'
|
32
|
|
-
|
33
|
|
-export TEXTDOMAIN=${PROJECT_NAME}-mirrors
|
34
|
|
-export TEXTDOMAINDIR="/usr/share/locale"
|
35
|
|
-
|
36
|
|
-# Minimum number of characters in a password
|
37
|
|
-MINIMUM_PASSWORD_LENGTH=$(cat /usr/share/${PROJECT_NAME}/utils/${PROJECT_NAME}-utils-passwords | grep 'MINIMUM_PASSWORD_LENGTH=' | head -n 1 | awk -F '=' '{print $2}')
|
38
|
|
-
|
39
|
|
-CONFIGURATION_FILE="$HOME/${PROJECT_NAME}.cfg"
|
40
|
|
-
|
41
|
|
-# used to mirror a single application
|
42
|
|
-SYNC_SINGLE_APP=
|
43
|
|
-
|
44
|
|
-# if this is blank then just use the default repos
|
45
|
|
-FRIENDS_MIRRORS_SERVER=
|
46
|
|
-UTILS_REPOS=
|
47
|
|
-INSTALLED_APPS_REPOS=
|
48
|
|
-MY_MIRRORS_PASSWORD=
|
49
|
|
-FRIENDS_MIRRORS_PASSWORD=
|
50
|
|
-NEW_MIRRORS='no'
|
51
|
|
-FRIENDS_MIRRORS_SSH_PORT=2222
|
52
|
|
-
|
53
|
|
-MAIN_COMMAND=/usr/local/bin/${PROJECT_NAME}
|
54
|
|
-if [ ! -f $MAIN_COMMAND ]; then
|
55
|
|
- MAIN_COMMAND=/usr/bin/${PROJECT_NAME}
|
56
|
|
-fi
|
57
|
|
-
|
58
|
|
-# local repos for utils
|
59
|
|
-UTILS_REPOS=($(cat ${MAIN_COMMAND} /usr/share/${PROJECT_NAME}/utils/${PROJECT_NAME}-utils-* /usr/share/${PROJECT_NAME}/apps/${PROJECT_NAME}-app-* | grep "_REPO=\"" | grep -v "(cat " | uniq -u | sed 's|${PROJECT_NAME}|'"${PROJECT_NAME}"'|g'))
|
60
|
|
-
|
61
|
|
-UTILS_FILES=/usr/share/${PROJECT_NAME}/utils/${PROJECT_NAME}-utils-*
|
62
|
|
-for f in $UTILS_FILES
|
63
|
|
-do
|
64
|
|
- source $f
|
65
|
|
-done
|
66
|
|
-
|
67
|
|
-# obtain the mirrors password if it exists
|
68
|
|
-read_config_param MY_MIRRORS_PASSWORD
|
69
|
|
-read_config_param FRIENDS_MIRRORS_SERVER
|
70
|
|
-read_config_param FRIENDS_MIRRORS_PASSWORD
|
71
|
|
-read_config_param FRIENDS_MIRRORS_SSH_PORT
|
72
|
|
-
|
73
|
|
-function show_help {
|
74
|
|
- echo ''
|
75
|
|
- echo $"${PROJECT_NAME}-mirrors --sync [domain/url] -p [password]"
|
76
|
|
- echo ''
|
77
|
|
- echo $'Creates or syncs with a set of git repositories'
|
78
|
|
- echo ''
|
79
|
|
- echo $' --help Show help'
|
80
|
|
- echo $' -n|--new [yes|no] Start a new mirrors'
|
81
|
|
- echo $" -p|--password [password] Friend's mirrors user password"
|
82
|
|
- echo $" -m|--mypassword [password] Local mirrors user password"
|
83
|
|
- echo $" --port [number] Friend's server ssh port number"
|
84
|
|
- echo $" -s|--sync [domain] Friend's server domain to sync with"
|
85
|
|
- echo ''
|
86
|
|
- exit 0
|
87
|
|
-}
|
88
|
|
-
|
89
|
|
-function create_mirrors_user {
|
90
|
|
- if [ -d /home/mirrors ]; then
|
91
|
|
- return
|
92
|
|
- fi
|
93
|
|
-
|
94
|
|
- create_password=1
|
95
|
|
- if [ ${#MY_MIRRORS_PASSWORD} -ge ${MINIMUM_PASSWORD_LENGTH} ]; then
|
96
|
|
- create_password=
|
97
|
|
- fi
|
98
|
|
-
|
99
|
|
- if [ $create_password ]; then
|
100
|
|
- MY_MIRRORS_PASSWORD=$(openssl rand -base64 64 | tr -dc A-Za-z0-9 | head -c 18)
|
101
|
|
- fi
|
102
|
|
-
|
103
|
|
- chmod 600 /etc/shadow
|
104
|
|
- chmod 600 /etc/gshadow
|
105
|
|
- useradd -m -p "$MY_MIRRORS_PASSWORD" -s /bin/bash mirrors
|
106
|
|
- chmod 0000 /etc/shadow
|
107
|
|
- chmod 0000 /etc/gshadow
|
108
|
|
-
|
109
|
|
- # remove any existing user files
|
110
|
|
- rm -rf /home/mirrors/*
|
111
|
|
-
|
112
|
|
- # store the mirrors password
|
113
|
|
- write_config_param "MY_MIRRORS_PASSWORD" "${MY_MIRRORS_PASSWORD}"
|
114
|
|
-}
|
115
|
|
-
|
116
|
|
-function enable_mirrors_via_onion {
|
117
|
|
- if ! grep -q 'Host *.onion' /home/mirrors/.ssh/config; then
|
118
|
|
- if [ ! -d /home/mirrors/.ssh ]; then
|
119
|
|
- mkdir /home/mirrors/.ssh
|
120
|
|
- fi
|
121
|
|
- echo 'Host *.onion' >> /home/mirrors/.ssh/config
|
122
|
|
- echo 'ProxyCommand connect -R remote -5 -S 127.0.0.1:9050 %h %p' >> /home/mirrors/.ssh/config
|
123
|
|
- chown mirrors:mirrors /home/mirrors/.ssh
|
124
|
|
- chown mirrors:mirrors /home/mirrors/.ssh/config
|
125
|
|
- fi
|
126
|
|
-}
|
127
|
|
-
|
128
|
|
-function update_installed_single_repo {
|
129
|
|
- # only deal with a single app
|
130
|
|
- filename=/usr/share/${PROJECT_NAME}/apps/${PROJECT_NAME}-app-${SYNC_SINGLE_APP}
|
131
|
|
- if [ ! -f $filename ]; then
|
132
|
|
- echo $"The app $SYNC_SINGLE_APP was not found"
|
133
|
|
- exit 36822
|
134
|
|
- fi
|
135
|
|
- APP_REPOS=($(cat ${MAIN_COMMAND} $filename | grep "_REPO=\"" | grep -v "(cat " | uniq -u | sed 's|${PROJECT_NAME}|'"${PROJECT_NAME}"'|g'))
|
136
|
|
- for line in "${APP_REPOS[@]}"
|
137
|
|
- do
|
138
|
|
- INSTALLED_APPS_REPOS+=("${line}")
|
139
|
|
- done
|
140
|
|
-}
|
141
|
|
-
|
142
|
|
-function update_installed_apps_repos {
|
143
|
|
- INSTALLED_APPS_REPOS=()
|
144
|
|
-
|
145
|
|
- function_check app_is_installed
|
146
|
|
-
|
147
|
|
- if [ $SYNC_SINGLE_APP ]; then
|
148
|
|
- update_installed_single_repo
|
149
|
|
- return
|
150
|
|
- fi
|
151
|
|
-
|
152
|
|
- # all apps currently installed
|
153
|
|
- FILES=/usr/share/${PROJECT_NAME}/apps/${PROJECT_NAME}-app-*
|
154
|
|
-
|
155
|
|
- # for all the app scripts
|
156
|
|
- for filename in $FILES
|
157
|
|
- do
|
158
|
|
- app_name=$(echo "${filename}" | awk -F '-app-' '{print $2}')
|
159
|
|
- if [[ "$(app_is_installed ${app_name})" == "1" ]]; then
|
160
|
|
- APP_REPOS=($(cat ${MAIN_COMMAND} $filename | grep "_REPO=\"" | grep -v "(cat " | uniq -u | sed 's|${PROJECT_NAME}|'"${PROJECT_NAME}"'|g'))
|
161
|
|
- for line in "${APP_REPOS[@]}"
|
162
|
|
- do
|
163
|
|
- INSTALLED_APPS_REPOS+=("${line}")
|
164
|
|
- done
|
165
|
|
- fi
|
166
|
|
- done
|
167
|
|
-}
|
168
|
|
-
|
169
|
|
-function update_repos_from_friend_base {
|
170
|
|
- syncrepos=${1}
|
171
|
|
- new_repos=()
|
172
|
|
- for line in $syncrepos
|
173
|
|
- do
|
174
|
|
- repo_name=$(echo "$line" | awk -F '=' '{print $1}')
|
175
|
|
- mirrors_name=$(echo "$repo_name" | sed "s|_REPO||g" | awk '{print tolower($0)}')
|
176
|
|
- friends_repo_url="ssh://mirrors@${FRIENDS_MIRRORS_SERVER}:${FRIENDS_MIRRORS_SSH_PORT}/home/mirrors/${mirrors_name}"
|
177
|
|
- new_line="${repo_name}=\"${friends_repo_url}\""
|
178
|
|
- new_repos+=($new_line)
|
179
|
|
- done
|
180
|
|
-}
|
181
|
|
-
|
182
|
|
-function update_repos_from_friend {
|
183
|
|
- if [ ! $FRIENDS_MIRRORS_SERVER ]; then
|
184
|
|
- return
|
185
|
|
- fi
|
186
|
|
- if [ ${#FRIENDS_MIRRORS_SERVER} -lt 2 ]; then
|
187
|
|
- return
|
188
|
|
- fi
|
189
|
|
-
|
190
|
|
- update_repos_from_friend_base "${UTILS_REPOS[@]}"
|
191
|
|
- UTILS_REPOS=("${new_repos[@]}")
|
192
|
|
-
|
193
|
|
- update_repos_from_friend_base "${INSTALLED_APPS_REPOS[@]}"
|
194
|
|
- INSTALLED_APPS_REPOS=("${new_repos[@]}")
|
195
|
|
-}
|
196
|
|
-
|
197
|
|
-function sync_mirrors_base {
|
198
|
|
- syncrepos=${1}
|
199
|
|
- for line in $syncrepos
|
200
|
|
- do
|
201
|
|
- repo_name=$(echo "$line" | awk -F '=' '{print $1}')
|
202
|
|
- repo_url=$(echo "$line" | awk -F '=' '{print $2}' | awk -F '"' '{print $2}')
|
203
|
|
- mirrors_name=$(echo "$repo_name" | sed "s|_REPO||g" | awk '{print tolower($0)}')
|
204
|
|
- if [[ ${mirrors_name} != 'debian' && ${mirrors_name} != 'cmake' ]]; then
|
205
|
|
- if [[ $NEW_MIRRORS == 'yes' ]]; then
|
206
|
|
- if [ -d /home/mirrors/${mirrors_name} ]; then
|
207
|
|
- rm -rf /home/mirrors/${mirrors_name}
|
208
|
|
- fi
|
209
|
|
- fi
|
210
|
|
- if [ ! -d /home/mirrors/${mirrors_name} ]; then
|
211
|
|
- if [[ ${repo_url} != 'ssh:'* ]]; then
|
212
|
|
- git clone --mirror ${repo_url} /home/mirrors/${mirrors_name}
|
213
|
|
- else
|
214
|
|
- sshpass -p "$FRIENDS_MIRRORS_PASSWORD" git clone --mirror ${repo_url} /home/mirrors/${mirrors_name}
|
215
|
|
- fi
|
216
|
|
- if [ ! -d /home/mirrors/${mirrors_name} ]; then
|
217
|
|
- echo $"WARNING: failed to mirror repo ${repo_url}"
|
218
|
|
- fi
|
219
|
|
- else
|
220
|
|
- cd /home/mirrors/${mirrors_name}
|
221
|
|
- git remote set-url origin ${repo_url}
|
222
|
|
- if [[ ${repo_url} != 'ssh:'* ]]; then
|
223
|
|
- git fetch -p origin
|
224
|
|
- else
|
225
|
|
- sshpass -p "$FRIENDS_MIRRORS_PASSWORD" git fetch -p origin
|
226
|
|
- fi
|
227
|
|
- fi
|
228
|
|
- fi
|
229
|
|
- done
|
230
|
|
- chown -R mirrors:mirrors /home/mirrors
|
231
|
|
-}
|
232
|
|
-
|
233
|
|
-function sync_mirrors_repos {
|
234
|
|
- if [ ! $SYNC_SINGLE_APP ]; then
|
235
|
|
- sync_mirrors_base "${UTILS_REPOS[@]}"
|
236
|
|
- fi
|
237
|
|
- sync_mirrors_base "${INSTALLED_APPS_REPOS[@]}"
|
238
|
|
-}
|
239
|
|
-
|
240
|
|
-while [[ $# > 1 ]]
|
241
|
|
-do
|
242
|
|
-key="$1"
|
243
|
|
-
|
244
|
|
-case $key in
|
245
|
|
- --help)
|
246
|
|
- show_help
|
247
|
|
- ;;
|
248
|
|
- -s|--sync)
|
249
|
|
- shift
|
250
|
|
- # use repos on another server
|
251
|
|
- FRIENDS_MIRRORS_SERVER="$1"
|
252
|
|
- ;;
|
253
|
|
- -m|--mypass|--mypassword)
|
254
|
|
- shift
|
255
|
|
- MY_MIRRORS_PASSWORD="$1"
|
256
|
|
- write_config_param "MY_MIRRORS_PASSWORD" "${MY_MIRRORS_PASSWORD}"
|
257
|
|
- ;;
|
258
|
|
- -p|--pass|--password)
|
259
|
|
- shift
|
260
|
|
- FRIENDS_MIRRORS_PASSWORD="$1"
|
261
|
|
- write_config_param "FRIENDS_MIRRORS_PASSWORD" "${FRIENDS_MIRRORS_PASSWORD}"
|
262
|
|
- ;;
|
263
|
|
- -n|--new)
|
264
|
|
- shift
|
265
|
|
- NEW_MIRRORS="$1"
|
266
|
|
- ;;
|
267
|
|
- --port)
|
268
|
|
- shift
|
269
|
|
- FRIENDS_MIRRORS_SSH_PORT=${1}
|
270
|
|
- ;;
|
271
|
|
- -a|--app)
|
272
|
|
- shift
|
273
|
|
- SYNC_SINGLE_APP="${1}"
|
274
|
|
- ;;
|
275
|
|
- *)
|
276
|
|
- # unknown option
|
277
|
|
- ;;
|
278
|
|
-esac
|
279
|
|
-shift
|
280
|
|
-done
|
281
|
|
-
|
282
|
|
-create_mirrors_user
|
283
|
|
-enable_mirrors_via_onion
|
284
|
|
-update_installed_apps_repos
|
285
|
|
-update_repos_from_friend
|
286
|
|
-sync_mirrors_repos
|
287
|
|
-
|
288
|
|
-exit 0
|