|  | @@ -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
 |