Welcome to mirror list, hosted at ThFree Co, Russian Federation.

letsencrypt-auto - github.com/certbot/certbot.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 44c71883c7a75828a143165acb33718f8ccba518 (plain)
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
#!/bin/sh -e
#
# A script to run the latest release version of the Let's Encrypt in a
# virtual environment
#
# Installs and updates the letencrypt virtualenv, and runs letsencrypt
# using that virtual environment.  This allows the client to function decently
# without requiring specific versions of its dependencies from the operating
# system.

# Note: you can set XDG_DATA_HOME or VENV_PATH before running this script,
# if you want to change where the virtual environment will be installed
XDG_DATA_HOME=${XDG_DATA_HOME:-~/.local/share}
VENV_NAME="letsencrypt"
VENV_PATH=${VENV_PATH:-"$XDG_DATA_HOME/$VENV_NAME"}
VENV_BIN=${VENV_PATH}/bin
# The path to the letsencrypt-auto script.  Everything that uses these might
# at some point be inlined...
LEA_PATH=`dirname "$0"`
BOOTSTRAP=${LEA_PATH}/bootstrap

# This script takes the same arguments as the main letsencrypt program, but it
# additionally responds to --verbose (more output) and --debug (allow support
# for experimental platforms)
for arg in "$@" ; do
  # This first clause is redundant with the third, but hedging on portability
  if [ "$arg" = "-v" ] || [ "$arg" = "--verbose" ] || echo "$arg" | grep -E -- "-v+$" ; then
    VERBOSE=1
  elif [ "$arg" = "--debug" ] ; then
    DEBUG=1
  fi
done

# letsencrypt-auto needs root access to bootstrap OS dependencies, and
# letsencrypt itself needs root access for almost all modes of operation
# The "normal" case is that sudo is used for the steps that need root, but
# this script *can* be run as root (not recommended), or fall back to using
# `su`
if test "`id -u`" -ne "0" ; then
  if command -v sudo 1>/dev/null 2>&1; then
    SUDO=sudo
  else
    echo \"sudo\" is not available, will use \"su\" for installation steps...
    # Because the parameters in `su -c` has to be a string,
    # we need properly escape it
    su_sudo() {
      args=""
      # This `while` loop iterates over all parameters given to this function.
      # For each parameter, all `'` will be replace by `'"'"'`, and the escaped string
      # will be wrap in a pair of `'`, then append to `$args` string
      # For example, `echo "It's only 1\$\!"` will be escaped to:
      #   'echo' 'It'"'"'s only 1$!'
      #     │       │└┼┘│
      #     │       │ │ └── `'s only 1$!'` the literal string
      #     │       │ └── `\"'\"` is a single quote (as a string)
      #     │       └── `'It'`, to be concatenated with the strings followed it
      #     └── `echo` wrapped in a pair of `'`, it's totally fine for the shell command itself
      while [ $# -ne 0 ]; do
        args="$args'$(printf "%s" "$1" | sed -e "s/'/'\"'\"'/g")' "
        shift
      done
      su root -c "$args"
    }
    SUDO=su_sudo
  fi
else
  SUDO=
fi

ExperimentalBootstrap() {
  # Arguments: Platform name, boostrap script name, SUDO command (iff needed)
  if [ "$DEBUG" = 1 ] ; then
    if [ "$2" != "" ]  ; then
      echo "Bootstrapping dependencies for $1..."
      if [ "$3" != "" ] ; then
        "$3" "$BOOTSTRAP/$2"
      else
        "$BOOTSTRAP/$2"
      fi
    fi
  else
    echo "WARNING: $1 support is very experimental at present..."
    echo "if you would like to work on improving it, please ensure you have backups"
    echo "and then run this script again with the --debug flag!"
    exit 1
  fi
}

DeterminePythonVersion() {
  if command -v python2.7 > /dev/null ; then
    export LE_PYTHON=${LE_PYTHON:-python2.7}
  elif command -v python27 > /dev/null ; then
    export LE_PYTHON=${LE_PYTHON:-python27}
  elif command -v python2 > /dev/null ; then
    export LE_PYTHON=${LE_PYTHON:-python2}
  elif command -v python > /dev/null ; then
    export LE_PYTHON=${LE_PYTHON:-python}
  else
    echo "Cannot find any Pythons... please install one!"
  fi

  PYVER=`$LE_PYTHON --version 2>&1 | cut -d" " -f 2 | cut -d. -f1,2 | sed 's/\.//'`
  if [ $PYVER -eq 26 ] ; then
    ExperimentalBootstrap "Python 2.6"
  elif [ $PYVER -lt 26 ] ; then
    echo "You have an ancient version of Python entombed in your operating system..."
    echo "This isn't going to work; you'll need at least version 2.6."
    exit 1
  fi
}


# virtualenv call is not idempotent: it overwrites pip upgraded in
# later steps, causing "ImportError: cannot import name unpack_url"
if [ ! -d $VENV_PATH ]
then
  if [ ! -f $BOOTSTRAP/debian.sh ] ; then
    echo "Cannot find the letsencrypt bootstrap scripts in $BOOTSTRAP"
    exit 1
  fi

  if [ -f /etc/debian_version ] ; then
    echo "Bootstrapping dependencies for Debian-based OSes..."
    $SUDO $BOOTSTRAP/_deb_common.sh
  elif [ -f /etc/redhat-release ] ; then
    echo "Bootstrapping dependencies for RedHat-based OSes..."
    $SUDO $BOOTSTRAP/_rpm_common.sh
  elif `grep -q openSUSE /etc/os-release` ; then
    echo "Bootstrapping dependencies for openSUSE-based OSes..."
    $SUDO $BOOTSTRAP/_suse_common.sh
  elif [ -f /etc/arch-release ] ; then
    if [ "$DEBUG" = 1 ] ; then
      echo "Bootstrapping dependencies for Archlinux..."
      $SUDO $BOOTSTRAP/archlinux.sh
    else
      echo "Please use pacman to install letsencrypt packages:"
      echo "# pacman -S letsencrypt letsencrypt-apache"
      echo
      echo "If you would like to use the virtualenv way, please run the script again with the"
      echo "--debug flag."
      exit 1
    fi
  elif [ -f /etc/manjaro-release ] ; then
    ExperimentalBootstrap "Manjaro Linux" manjaro.sh "$SUDO"
  elif [ -f /etc/gentoo-release ] ; then
    ExperimentalBootstrap "Gentoo" _gentoo_common.sh "$SUDO"
  elif uname | grep -iq FreeBSD ; then
    ExperimentalBootstrap "FreeBSD" freebsd.sh "$SUDO"
  elif uname | grep -iq Darwin ; then
    ExperimentalBootstrap "Mac OS X" mac.sh # homebrew doesn't normally run as root
  elif grep -iq "Amazon Linux" /etc/issue ; then
    ExperimentalBootstrap "Amazon Linux" _rpm_common.sh "$SUDO"
  else
    echo "Sorry, I don't know how to bootstrap Let's Encrypt on your operating system!"
    echo
    echo "You will need to bootstrap, configure virtualenv, and run a pip install manually"
    echo "Please see https://letsencrypt.readthedocs.org/en/latest/contributing.html#prerequisites"
    echo "for more info"
  fi

  DeterminePythonVersion
  echo "Creating virtual environment..."
  if [ "$VERBOSE" = 1 ] ; then
    virtualenv --no-site-packages --python $LE_PYTHON $VENV_PATH
  else
    virtualenv --no-site-packages --python $LE_PYTHON $VENV_PATH > /dev/null
  fi
else
  DeterminePythonVersion
fi


printf "Updating letsencrypt and virtual environment dependencies..."
if [ "$VERBOSE" = 1 ]  ; then
  echo
  $VENV_BIN/pip install -U setuptools
  $VENV_BIN/pip install -U pip
  $VENV_BIN/pip install -r "$LEA_PATH"/py26reqs.txt -U letsencrypt letsencrypt-apache
  # nginx is buggy / disabled for now, but upgrade it if the user has
  # installed it manually
  if $VENV_BIN/pip freeze | grep -q letsencrypt-nginx ; then
    $VENV_BIN/pip install -U letsencrypt letsencrypt-nginx
  fi
else
  $VENV_BIN/pip install -U setuptools > /dev/null
  printf .
  $VENV_BIN/pip install -U pip > /dev/null
  printf .
  # nginx is buggy / disabled for now...
  $VENV_BIN/pip install -r "$LEA_PATH"/py26reqs.txt > /dev/null
  printf .
  $VENV_BIN/pip install -U letsencrypt > /dev/null
  printf .
  $VENV_BIN/pip install -U letsencrypt-apache > /dev/null
  if $VENV_BIN/pip freeze | grep -q letsencrypt-nginx ; then
    printf .
    $VENV_BIN/pip install -U letsencrypt-nginx > /dev/null
  fi
  echo
fi

# Explain what's about to happen, for the benefit of those getting sudo
# password prompts...
echo "Running with virtualenv:" $SUDO $VENV_BIN/letsencrypt "$@"
$SUDO $VENV_BIN/letsencrypt "$@"