passenger 4.0.53 → 4.0.55

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of passenger might be problematic. Click here for more details.

checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- NjExNzc1ZGFkYzExOGNhMDA5NmUyNzcxNmQwYzUwNDg5NjMwM2VlMA==
4
+ N2UzYzkxNTRiNjUxOTE2ODg4ZjE2NzcxNzU2ZGUyNTBjNmQ0OGUyZA==
5
5
  data.tar.gz: !binary |-
6
- Y2MxMzRkOTM4NzY4YzJjYTVlNzJiNzI5MmI3MzFlZjVhZDRjMWU2Yw==
6
+ MDc2ZDYyNTIzN2Y0MGMyYWJiMDBjOTg1ZTc5NjI3ZmFhZTgzMDgxOQ==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- YTgyNTE1MjExOWQ0NTA1ZGI2Y2Q3OWEwMTkyY2UwZDkzZGU5MjM4ZjA2OGRk
10
- OTU3NmU1NDM0ZmUwMDBlOTgzZTUzMDM0OWI4MTVkNDdjYzcxOWVlZGEwN2U0
11
- OWRlODZhM2IzOWRkN2YxMzVhOWVlY2M2NDJjMWU0MGNlNmIwODg=
9
+ ZGU5ZThlOGMxZmExYmFlZGVlZjhlMWI5MTA4ZjkwMDMwNWRmNzhkZjc5YmVl
10
+ N2QzZjgxNDI2Nzc1NjY2ZmJlYjZkMjIxYjQzMDg0MWQ1YmIxOWJhYjMzODNj
11
+ ZGMyNWRlNTkxNWFkZTExZGU5MDhlMjNjMGMyYzc1MTQwODY1ZWM=
12
12
  data.tar.gz: !binary |-
13
- OTMxYTJkN2YwN2I5NTM0MDU1YWUwNDU3MDQ3MDY0OTUyMTdkNGU5MzJhYTY4
14
- NmE0NWNmNDcwODM5Yzg4NzRiNWQwNGZhZjVhN2Y4NjliOWQ2NGRjZjA3YjQ5
15
- NWMzMWU4NmY3ZjJmOWZmYTYzMGY1MTY3Y2NiODJhZWNiMGQ5ZTI=
13
+ NzJhYWYwYjA3YTFiMjcwNDhiOGEwYjY2NWU4MTI2ZGY3NmMyMzg0YTBlOThl
14
+ ZDdhMjk1MDI3YzExYzc4NDNiMzJhYjEzNzllNjY2MGM2YWM3MzZjMjI2YmQ4
15
+ NjM0MzJkMDdmYzVkM2EzOTQzODFlNzIzZDRjNjgwOTgyOWYzMTM=
@@ -2,11 +2,11 @@
2
2
  Version: GnuPG/MacGPG2 v2.0.17 (Darwin)
3
3
  Comment: GPGTools - http://gpgtools.org
4
4
 
5
- iQEcBAABAgAGBQJUK9ckAAoJECrHRaUKISqMwkUH/292jpZG5srKKCIySJcDRYz5
6
- Putx9SR98up1JzG5n/gNERdHMp+IHoK8mlwSYP0+oMN1KSX5uRsEKJbkxKR1BGYg
7
- aP2jVpJ1g8l8H73FCdA3SI50/q0xB+WnebuTcJdZ/NaJmI1m19YmFxD2NGbY84+W
8
- c0Z+r6ck2FmwsQEklwM1Sy9gh8ZcfXsey7ve3a4jVgc01J12cFIsOExEgnu4WM/F
9
- 2+4ZodzFIjmF9wDB8AHlG9RK8JkXjNiCdxjxAqf/kb+MzebioB75BsX38TPACbje
10
- SLAElIgmyjKec33NDDtH6GiJxz51z0V0qha9OMXMtucvTD0rEj/DzbCGupOVUm0=
11
- =4g5+
5
+ iQEcBAABAgAGBQJUiwJyAAoJECrHRaUKISqMAsAIALMntU8zBAVLqJm3qOAV1NkC
6
+ PKc+2BaDSKQfLm81y5Yzsh0sCiq9aCqpITGh6fC6qUUup6o/1dOeZAQlTADm0XoS
7
+ b2ndeWob5zN+06AVB7awyffOjrn4kW3IZkfWa4iR5uSwoAOo3m9uGjE8nK5QIb7v
8
+ YzRm5uCKRa6LI2sbfblr1TrQU5ybVjbQV4ZIwz4CFnw3QgGbYIy6Mz+lVGaET9zv
9
+ CXH7DJYiPSSWveWtKA4l3wWXKTQQniOxFYq7EWo7Uh9YX0ZoI0pUPXNepwb9CuSN
10
+ HqKNR5tdJzXCR6EpQE/FtvsSEJFBuu6NaqcreFIJGBUr1YXVYRErA2H68tc4W3A=
11
+ =E9js
12
12
  -----END PGP SIGNATURE-----
data.tar.gz.asc CHANGED
@@ -2,11 +2,11 @@
2
2
  Version: GnuPG/MacGPG2 v2.0.17 (Darwin)
3
3
  Comment: GPGTools - http://gpgtools.org
4
4
 
5
- iQEcBAABAgAGBQJUK9ckAAoJECrHRaUKISqM4l0IAIxyvBpZ6hszbK0nKNQupO3Z
6
- /NkSYS79zUOJ9EMjHFNFxeVEG0IdYxLWyPNsqns1DUMg0t7aJdMV8sotoM+jsxuY
7
- mJ7DZNG+3nNbxeS3p80fzF7PbicyvcqTLOiWnX/r47EbkQCvLpTHk+NI8JKasW/Y
8
- 3z6RQ7qwcds2UPw9kh/Yhm0m1INQl4tUFz+hfKfPIk3/pixfrnEZWVZSUF7B+CP2
9
- cTsTriX5kRUP2oXW3SFSoGAiY3xSilnGhG1JdzG05WLdaDyrRn6ibYxEuX2hrXXN
10
- FfDrv0ntvcZ1FRybJMGjejcRp8Z8/Xb2kvLL2Xyu32qDexfmqtr9FQkQU8dZjt8=
11
- =Galp
5
+ iQEcBAABAgAGBQJUiwJyAAoJECrHRaUKISqMJiAH/0J2j3e4PfWQMqZUbBj64M7J
6
+ uEJqycYmBPBhVe2SyRuJnflnZwiIGFpFfDY32XUqAXEJl+lJmZ7Yu+eqfdhHKVMG
7
+ T0iEkBMSBCAOXkT9jEHwgph5uF4qh77TdO+YWS1lYKYUwsoK+rG2iLHieaFKyNzu
8
+ c6UhLKiz4j7xbnHv0SU6uxBWq8tuihKxvMGksuaBe7paegXYCEo/v2zl3EXlliEc
9
+ QVd97e2uxgxwCDc0zvlS8mznv+XVKRQz0fGs8oYYBe2Kv8Zi1S+QX3Cz6Btb0Ll6
10
+ nd0fEvNI4j8QvhrhOVKaN4RkYlMpGSx1xYu6jUe4kQ6+AIvR6yN315coCEKa5UY=
11
+ =keF3
12
12
  -----END PGP SIGNATURE-----
data/CHANGELOG CHANGED
@@ -1,3 +1,16 @@
1
+ Release 4.0.55
2
+ --------------
3
+
4
+ * Supports Ruby 2.2. Closes GH-1314.
5
+ * Fixed Linux OS name detection.
6
+
7
+
8
+ Release 4.0.54
9
+ --------------
10
+
11
+ * Contains a licensing-related hot fix for Enterprise customers.
12
+
13
+
1
14
  Release 4.0.53
2
15
  --------------
3
16
 
@@ -139,13 +139,15 @@ if USE_VENDORED_LIBEV
139
139
 
140
140
  libev_sources = Dir["ext/libev/{*.c,*.h}"]
141
141
  file LIBEV_OUTPUT_DIR + ".libs/libev.a" => [LIBEV_OUTPUT_DIR + "Makefile"] + libev_sources do
142
- sh "rm -f #{LIBEV_OUTPUT_DIR}/libev.la"
142
+ sh "rm -f #{LIBEV_OUTPUT_DIR}libev.la"
143
143
  sh "cd #{LIBEV_OUTPUT_DIR} && make libev.la"
144
144
  end
145
145
 
146
146
  task 'libev:clean' do
147
- if File.exist?(LIBEV_OUTPUT_DIR + "Makefile")
148
- sh "cd #{LIBEV_OUTPUT_DIR} && make maintainer-clean"
147
+ patterns = %w(Makefile config.h config.log config.status libtool
148
+ stamp-h1 *.o *.lo *.la .libs .deps)
149
+ patterns.each do |pattern|
150
+ sh "rm -rf #{LIBEV_OUTPUT_DIR}#{pattern}"
149
151
  end
150
152
  end
151
153
 
@@ -196,11 +198,15 @@ if USE_VENDORED_LIBEIO
196
198
  sh "cd #{LIBEIO_OUTPUT_DIR} && make libeio.la"
197
199
  end
198
200
 
199
- task :clean do
200
- if File.exist?(LIBEIO_OUTPUT_DIR + "Makefile")
201
- sh "cd #{LIBEIO_OUTPUT_DIR} && make maintainer-clean"
201
+ task 'libeio:clean' do
202
+ patterns = %w(Makefile config.h config.log config.status libtool
203
+ stamp-h1 *.o *.lo *.la .libs .deps)
204
+ patterns.each do |pattern|
205
+ sh "rm -rf #{LIBEIO_OUTPUT_DIR}#{pattern}"
202
206
  end
203
207
  end
208
+
209
+ task :clean => 'libeio:clean'
204
210
  else
205
211
  LIBEIO_CFLAGS = string_option('LIBEIO_CFLAGS', '-I/usr/include/libeio')
206
212
  LIBEIO_LIBS = string_option('LIBEIO_LIBS', '-leio')
@@ -69,7 +69,7 @@ def create_markdown_compilation_task(target)
69
69
  puts "Creating #{target}"
70
70
  require 'erb'
71
71
  template = ERB.new(File.read('doc/templates/markdown.html.erb'))
72
- title = File.basename(target, '.html')
72
+ title = File.basename(target, '.html').gsub(/([A-Z])/, ' \1').strip
73
73
  content = File.read("#{target}.tmp")
74
74
  css = File.read('doc/templates/bootstrap.min.css')
75
75
  data = template.result(binding)
@@ -91,6 +91,7 @@ def create_markdown_compilation_task(target)
91
91
  end
92
92
 
93
93
  create_markdown_compilation_task('doc/Packaging.html')
94
+ create_markdown_compilation_task('doc/CloudLicensingConfiguration.html')
94
95
 
95
96
  desc "Upload documentation to the Phusion web server"
96
97
  task 'doc:rsync' => :doc do
@@ -7,6 +7,9 @@
7
7
 
8
8
  #if ['1', 'true', 'on', 'yes'].include?(ENV['USE_CCACHE'])
9
9
  export USE_CCACHE=1
10
+ NGINX_CONFIGURE_OPTIONS = CC=/usr/lib/ccache/cc CXX=/usr/lib/ccache/c++
11
+ #else
12
+ NGINX_CONFIGURE_OPTIONS =
10
13
  #endif
11
14
 
12
15
  # Speed up ccache (reduce I/O) by lightly compressing things.
@@ -34,7 +37,7 @@ override_dh_auto_build:
34
37
  mv pkg/fakeroot pkg/fakeroot2.0
35
38
  #endif
36
39
  cd nginx-<%= PhusionPassenger::PREFERRED_NGINX_VERSION %> && \
37
- ./configure --prefix=/tmp \
40
+ env $(NGINX_CONFIGURE_OPTIONS) ./configure --prefix=/tmp \
38
41
  <%= PhusionPassenger::STANDALONE_NGINX_CONFIGURE_OPTIONS %> \
39
42
  --add-module=`pwd`/../ext/nginx && \
40
43
  make && \
@@ -11,12 +11,31 @@ if [[ "$WORKSPACE" = "" ]]; then
11
11
  exit 1
12
12
  fi
13
13
 
14
- JENKINS_CACHE_DIR="$WORKSPACE/jenkins_cache"
14
+ JENKINS_CACHE_DIR="$WORKSPACE/.jenkins_cache"
15
15
  mkdir -p "$JENKINS_CACHE_DIR"
16
16
  if [[ "$TEST_RPM_BUILDING" != 0 ]]; then
17
17
  rm -rf "$JENKINS_CACHE_DIR/passenger_rpm/output"
18
18
  fi
19
19
 
20
+ # run_travis.sh defaults COMPILE_CONCURRENCY to 2, but
21
+ # Jenkins jobs are run on a single machine so we'll want
22
+ # a COMPILE_CONCURRENCY of 1.
23
+ COMPILE_CONCURRENCY=${COMPILE_CONCURRENCY:-1}
24
+
25
+ # Relax permissions. Necessary for unit tests which test permissions.
26
+ echo "Relaxing permissions"
27
+ umask u=rwx,g=rx,o=rx
28
+ (
29
+ set -x
30
+ chmod g+rx,o+rx .
31
+ find * -type f -print0 | xargs -0 -n 512 chmod g+r,o+r
32
+ find * -type d -print0 | xargs -0 -n 512 chmod g+rx,o+rx
33
+
34
+ # Create this file now because otherwise it would be owned by root,
35
+ # which Jenkins cannot remove.
36
+ touch test/test.log
37
+ )
38
+
20
39
  function run_exec()
21
40
  {
22
41
  echo "$ $@"
@@ -37,6 +56,7 @@ run_exec docker run --rm \
37
56
  -e "APP_UID=`id -u`" \
38
57
  -e "APP_GID=`id -g`" \
39
58
  -e "SUDO=$SUDO" \
59
+ -e "COMPILE_CONCURRENCY=$COMPILE_CONCURRENCY" \
40
60
  -e "TEST_CXX=$TEST_CXX" \
41
61
  -e "TEST_RUBY=$TEST_RUBY" \
42
62
  -e "TEST_NODE=$TEST_NODE" \
@@ -18,6 +18,7 @@ export VERBOSE=1
18
18
  export TRACE=1
19
19
  export DEVDEPS_DEFAULT=no
20
20
  export rvmsudo_secure_path=1
21
+ export LC_CTYPE=C.UTF-8
21
22
 
22
23
  if [[ -e /etc/workaround-docker-2267/hosts ]]; then
23
24
  HOSTS_FILE=/etc/workaround-docker-2267/hosts
@@ -111,10 +112,6 @@ function install_node_and_modules()
111
112
  fi
112
113
  }
113
114
 
114
- if [[ "$MAGNUM" != "" ]]; then
115
- run sudo sh -c "echo 127.0.0.1 magnum >> /etc/hosts"
116
- fi
117
-
118
115
  run uname -a
119
116
  run lsb_release -a
120
117
  run sudo tee /etc/dpkg/dpkg.cfg.d/02apt-speedup >/dev/null <<<"force-unsafe-io"
@@ -185,8 +182,14 @@ if [[ "$TEST_DEBIAN_PACKAGING" = 1 ]]; then
185
182
  apt_get_update
186
183
  run sudo apt-get install -y --no-install-recommends \
187
184
  devscripts debhelper rake apache2-mpm-worker apache2-threaded-dev \
188
- ruby1.8 ruby1.8-dev ruby1.9.1 ruby1.9.1-dev rubygems libev-dev gdebi-core \
189
- source-highlight
185
+ libev-dev gdebi-core source-highlight
186
+ if [[ `lsb_release -r -s` = 12.04 ]]; then
187
+ sudo apt-get install -y --no-install-recommends \
188
+ ruby1.8 ruby1.8-dev ruby1.9.1 ruby1.9.1-dev rubygems
189
+ else
190
+ sudo apt-get install -y --no-install-recommends \
191
+ ruby1.9.1 ruby1.9.1-dev ruby2.0 ruby2.0-dev
192
+ fi
190
193
  install_test_deps_with_doctools
191
194
  install_node_and_modules
192
195
  run rake debian:dev debian:dev:reinstall
@@ -0,0 +1,194 @@
1
+ # Phusion Passenger Enterprise cloud licensing configuration
2
+
3
+ When using the [Phusion Passenger Enterprise](https://www.phusionpassenger.com/enterprise) cloud license, you are billed per server per hour. There is a mechanism which automatically reports usage to the Phusion licensing server. This is implemented by sending a certain HTTPS request to the Phusion Passenger website, https://www.phusionpassenger.com, every 15 minutes, on every server that Phusion Passenger Enterprise is running with a cloud license.
4
+
5
+ Sometimes, this manner of reporting usage data is not desirable, e.g. because of organizational security policies. For example, the servers that run Phusion Passenger Enterprise might block all outgoing traffic, or the network intrusion detection system might flag the usage reports as suspicious. To address these concerns, Phusion Passenger Enterprise 4.0.54 and later provide the ability to report usage through periodic batch jobs.
6
+
7
+ ## Conceptual overview
8
+
9
+ The setup works as follows:
10
+
11
+ 1. Phusion Passenger Enterprise stores usage data on the local disk, but does not send them to the Phusion licensing server.
12
+ 2. On each server that runs Phusion Passenger Enterprise, a batch job A generates a package from the usage data that's stored on disk.
13
+ 3. All these packages are copied to another machine (let's call this "Reporter"), e.g. through SCP, USB stick, etc. The reporter machine may be any machine that you choose, as long as it can access the Phusion licensing server. The method of copying does not matter.
14
+ 4. On the reporter machine, a batch job B uploads all these packages to the Phusion licensing server.
15
+
16
+ ![Conceptual overview](images/cloud_licensing_batch_job.png)
17
+
18
+ ## Phase 1: setting up web servers
19
+
20
+ Follow these instructions on each server running Phusion Passenger Enterprise with a cloud license.
21
+
22
+ 1. Login to the web server and open a superuser shell. For example:
23
+
24
+ bash$ sudo -H bash
25
+
26
+ Or, if you're an RVM user, use rvmsudo instead of sudo:
27
+
28
+ bash$ rvmsudo -H bash
29
+
30
+ 2. Add the following configuration to your Apache or Nginx configuration file:
31
+
32
+ # Apache
33
+ PassengerCtl licensing_data_points_auto_send false
34
+
35
+ # Nginx
36
+ passenger_ctl licensing_data_points_auto_send false;
37
+
38
+ Then restart Apache/Nginx. This configuration tells Phusion Passenger Enterprise not to automatically send usage data to the Phusion licensing server.
39
+
40
+ 3. Find out what user the PassengerHelperAgent process is running as.
41
+
42
+ First, look for the PID of the PassengerHelperAgent process.
43
+
44
+ bash# passenger-memory-stats
45
+ ...
46
+ ------ Passenger processes ------
47
+ PID VMSize Resident Name
48
+ ---------------------------------
49
+ 11243 2405.8 MB 2.7 MB PassengerHelperAgent
50
+ ...
51
+
52
+ Then use `ps` to determine what user it's running as. Usually, it's running as root.
53
+
54
+ bash# ps -o pid,user -p 11243
55
+ PID USER
56
+ 11245 root
57
+
58
+ 4. Create a directory in which to store usage data packages. For example:
59
+
60
+ bash# mkdir /var/lib/passenger-enterprise-usage
61
+
62
+ Ensure that it's owned by the user that PassengerHelperAgent runs as, and make it owner-accessible only:
63
+
64
+ bash# chown root: /var/lib/passenger-enterprise-usage
65
+ bash# chmod 700 /var/lib/passenger-enterprise-usage
66
+
67
+ 5. Create a script inside the previous directory for generating a usage data package, and for copying packages to the reporter machine. This script is part of batch job A.
68
+
69
+ bash# touch /var/lib/passenger-enterprise-usage/script
70
+ bash# chmod +x /var/lib/passenger-enterprise-usage/script
71
+ bash# editor /var/lib/passenger-enterprise-usage/script
72
+
73
+ The script should contain:
74
+
75
+ #!/bin/bash
76
+ set -e
77
+
78
+ REPORTER_MACHINE=foo@reporter-machine-host-name
79
+ HOSTNAME=`hostname`
80
+ DATE=`date +%s`
81
+
82
+ set -x
83
+ passenger-config package-cloud-usage /var/lib/passenger-enterprise-usage/$HOSTNAME-$DATE.tar.gz
84
+ scp /var/lib/passenger-enterprise-usage/*.tar.gz $REPORTER_MACHINE:passenger-enterprise-usage/
85
+ rm -f /var/lib/passenger-enterprise-usage/*.tar.gz
86
+
87
+ Here, `foo@reporter-machine-host-name` specifies which reporter machine you want to copy the package to, and which username you want to use to login to the reporter machine. Replace this with an appropriate value.
88
+
89
+ **Notes about SSH keys**: don't forget to setup SSH keys so that the script can scp to the reporter machine. The script will be run as the user that PassengerHelperAgent is running as.
90
+
91
+ **Notes about PATH**: the above script assumes that the `passenger-config` command is in PATH. This is always the case if you installed Passenger Enterprise using Debian or RPM packages, but may not be the case if you installed it using RubyGems or tarball. If it's not in PATH, or when in doubt, you should specify the full path to passenger-config. You can find out where passenger-config is using `which`. For example:
92
+
93
+ bash# which passenger-config
94
+ /opt/passenger-enterprise-x.x.x/bin/passenger-config
95
+
96
+ Then the script should call:
97
+
98
+ /opt/passenger-enterprise-x.x.x/bin/passenger-config package-cloud-usage ...
99
+
100
+ 6. Open the crontab of the user that PassengerHelperAgent is running as. For example, if PassengerHelperAgent is running as root:
101
+
102
+ bash# sudo -u root -H crontab -e
103
+
104
+ 7. Insert the following entry into the crontab, so that the script is invoked on the 1st of every month:
105
+
106
+ 0 0 1 * * /var/lib/passenger-enterprise-usage/script
107
+
108
+ 8. Ensure that `/var/lib/passenger-enterprise-usage/script` is run during system shutdown, as the user that PassengerHelperAgent is running as. On most Linux systems, this can be achieved by as follows:
109
+
110
+ bash# touch /etc/init.d/passenger-enterprise-cloud-license
111
+ bash# chmod +x /etc/init.d/passenger-enterprise-cloud-license
112
+ bash# ln -s /etc/init.d/passenger-enterprise-cloud-license /etc/rc0.d/K00passenger-enterprise-cloud-license
113
+ bash# ln -s /etc/init.d/passenger-enterprise-cloud-license /etc/rc6.d/K00passenger-enterprise-cloud-license
114
+ bash# editor /etc/init.d/passenger-enterprise-cloud-license
115
+
116
+ If PassengerHelperAgent is running as root, then `/etc/init.d/passenger-enterprise-cloud-license` should contain:
117
+
118
+ #!/bin/bash
119
+ set -e
120
+ exec /var/lib/passenger-enterprise-usage/script
121
+
122
+ If PassengerHelperAgent is not running as root, then it should contain:
123
+
124
+ #!/bin/bash
125
+ set -e
126
+ exec sudo -u PROPER_USERNAME_HERE -H /var/lib/passenger-enterprise-usage/script
127
+
128
+ Or, if you're an RVM user, use rvmsudo instead of sudo:
129
+
130
+ #!/bin/bash
131
+ set -e
132
+ exec rvmsudo -u PROPER_USERNAME_HERE -H /var/lib/passenger-enterprise-usage/script
133
+
134
+ **Note:** If your operating system does not respect /etc/rcX.d, please consult your operating system's manual to learn how to run `/var/lib/passenger-enterprise-usage/script` during system shutdown.
135
+
136
+ ## Phase 2: setting up the "reporter" machine
137
+
138
+ In phase 1, you've setup web servers to scp usage data packages to the reporter machine, by logging into the reporter machine as a certain user. Let's call that user "foo".
139
+
140
+ 1. Login to the reporter machine as user foo.
141
+
142
+ 2. Create a directory that the web servers can scp into:
143
+
144
+ bash$ mkdir ~/passenger-enterprise-usage
145
+ bash$ chmod 700 ~/passenger-enterprise-usage
146
+
147
+ 3. Install the [passenger-enterprise-bulk-send-cloud-usage](https://github.com/phusion/passenger-enterprise-bulk-send-cloud-usage) tool:
148
+
149
+ bash$ cd ~
150
+ bash$ curl -L -O https://github.com/phusion/passenger-enterprise-bulk-send-cloud-usage/archive/master.tar.gz
151
+ bash$ tar xzvf master.tar.gz && rm master.tar.gz
152
+
153
+ 4. Open the crontab of user foo:
154
+
155
+ bash$ crontab -e
156
+
157
+ 5. Insert the following entry into the crontab to upload usage data packages on the 1st of every month:
158
+
159
+ 0 1 1 * * ~/passenger-enterprise-bulk-send-cloud-usage/passenger-enterprise-bulk-send-cloud-usage --delete ~/passenger-enterprise-usage-*.tar.gz
160
+
161
+ This crontab entry is batch job B as described in the conceptual overview.
162
+
163
+ Note that this command is run at 1 AM: 1 hour after the web servers have generated usage data packages and copied them over to the reporter machine. You *must* therefore ensure that the clocks on the web servers and the reporter machine are properly synchronized, and that they are set to the same time zone.
164
+
165
+ ## Phase 3: testing
166
+
167
+ Once the web servers and the reporter machine are all setup, you can test whether the setup works correctly.
168
+
169
+ 1. On each web server, run `/var/lib/passenger-enterprise-usage/script` as the user that PassengerHelperAgent runs as. For example, if PassengerHelperAgent is running as root:
170
+
171
+ sudo -u root -H /var/lib/passenger-enterprise-usage/script
172
+
173
+ Or, if you're an RVM user, use rvmsudo instead of sudo:
174
+
175
+ rvmsudo -u root -H /var/lib/passenger-enterprise-usage/script
176
+
177
+ You should see output like this:
178
+
179
+ + passenger-config package-cloud-usage /var/lib/passenger-enterprise-usage/myhostname-1415377926.tar.gz
180
+ + scp /var/lib/passenger-enterprise-usage/myhostname-1415377310.tar.gz hongli@localhost:passenger-enterprise-usage/
181
+ myhostname-1415377310.tar.gz 100% 605 0.6KB/s 00:00
182
+ + rm -f /var/lib/passenger-enterprise-usage/myhostname-1415377310.tar.gz
183
+
184
+ 2. Login to the reporter machine as the "foo" user (as described in phase 2) and run:
185
+
186
+ ~/passenger-enterprise-bulk-send-cloud-usage-master/passenger-enterprise-bulk-send-cloud-usage --delete ~/passenger-enterprise-usage/*.tar.gz
187
+
188
+ You should see output like this:
189
+
190
+ ---- Uploading ~/passenger-enterprise-usage/myhostname-1415377310.tar.gz -----
191
+ Success!
192
+ Deleting ~/passenger-enterprise-usage/myhostname-1415377310.tar.gz
193
+
194
+ 3. Login to the [Phusion Passenger Enterprise Customer Area](https://www.phusionpassenger.com/orders). Under "Cloud subscription status", click "View usage details". Verify that usage has been properly registered.
@@ -1883,7 +1883,7 @@ Apache's version also buffers to memory only, making it problematic for large re
1883
1883
 
1884
1884
  How does response buffering - whether it's done by Apache or by Phusion Passenger - exactly protect against slow clients?
1885
1885
  Consider an HTTP client that's on a dial-up modem link, and your
1886
- application process generates a 2 MB response. If the response is buffered
1886
+ application process generates a 2 MB response. If the response is not buffered
1887
1887
  then your application process will be blocked until the entire 2 MB has been
1888
1888
  sent out to the HTTP client. This disallows your application process to do any useful
1889
1889
  work in the mean time. By buffering responses, Phusion Passenger or Apache will read
@@ -0,0 +1,388 @@
1
+ {
2
+ "vars": {
3
+ "@gray-base": "#000",
4
+ "@gray-darker": "lighten(@gray-base, 13.5%)",
5
+ "@gray-dark": "lighten(@gray-base, 20%)",
6
+ "@gray": "lighten(@gray-base, 33.5%)",
7
+ "@gray-light": "lighten(@gray-base, 46.7%)",
8
+ "@gray-lighter": "lighten(@gray-base, 93.5%)",
9
+ "@brand-primary": "#428bca",
10
+ "@brand-success": "#5cb85c",
11
+ "@brand-info": "#5bc0de",
12
+ "@brand-warning": "#f0ad4e",
13
+ "@brand-danger": "#d9534f",
14
+ "@body-bg": "#fff",
15
+ "@text-color": "@gray-dark",
16
+ "@link-color": "@brand-primary",
17
+ "@link-hover-color": "darken(@link-color, 15%)",
18
+ "@link-hover-decoration": "underline",
19
+ "@font-family-sans-serif": "\"Helvetica Neue\", Helvetica, Arial, sans-serif",
20
+ "@font-family-serif": "Georgia, \"Times New Roman\", Times, serif",
21
+ "@font-family-monospace": "Menlo, Monaco, Consolas, \"Courier New\", monospace",
22
+ "@font-family-base": "@font-family-sans-serif",
23
+ "@font-size-base": "14px",
24
+ "@font-size-large": "ceil((@font-size-base * 1.25))",
25
+ "@font-size-small": "ceil((@font-size-base * 0.85))",
26
+ "@font-size-h1": "floor((@font-size-base * 2.6))",
27
+ "@font-size-h2": "floor((@font-size-base * 2.15))",
28
+ "@font-size-h3": "ceil((@font-size-base * 1.7))",
29
+ "@font-size-h4": "ceil((@font-size-base * 1.25))",
30
+ "@font-size-h5": "@font-size-base",
31
+ "@font-size-h6": "ceil((@font-size-base * 0.85))",
32
+ "@line-height-base": "1.428571429",
33
+ "@line-height-computed": "floor((@font-size-base * @line-height-base))",
34
+ "@headings-font-family": "inherit",
35
+ "@headings-font-weight": "500",
36
+ "@headings-line-height": "1.1",
37
+ "@headings-color": "inherit",
38
+ "@icon-font-path": "\"../fonts/\"",
39
+ "@icon-font-name": "\"glyphicons-halflings-regular\"",
40
+ "@icon-font-svg-id": "\"glyphicons_halflingsregular\"",
41
+ "@padding-base-vertical": "6px",
42
+ "@padding-base-horizontal": "12px",
43
+ "@padding-large-vertical": "10px",
44
+ "@padding-large-horizontal": "16px",
45
+ "@padding-small-vertical": "5px",
46
+ "@padding-small-horizontal": "10px",
47
+ "@padding-xs-vertical": "1px",
48
+ "@padding-xs-horizontal": "5px",
49
+ "@line-height-large": "1.33",
50
+ "@line-height-small": "1.5",
51
+ "@border-radius-base": "4px",
52
+ "@border-radius-large": "6px",
53
+ "@border-radius-small": "3px",
54
+ "@component-active-color": "#fff",
55
+ "@component-active-bg": "@brand-primary",
56
+ "@caret-width-base": "4px",
57
+ "@caret-width-large": "5px",
58
+ "@table-cell-padding": "8px",
59
+ "@table-condensed-cell-padding": "5px",
60
+ "@table-bg": "transparent",
61
+ "@table-bg-accent": "#f9f9f9",
62
+ "@table-bg-hover": "#f5f5f5",
63
+ "@table-bg-active": "@table-bg-hover",
64
+ "@table-border-color": "#ddd",
65
+ "@btn-font-weight": "normal",
66
+ "@btn-default-color": "#333",
67
+ "@btn-default-bg": "#fff",
68
+ "@btn-default-border": "#ccc",
69
+ "@btn-primary-color": "#fff",
70
+ "@btn-primary-bg": "@brand-primary",
71
+ "@btn-primary-border": "darken(@btn-primary-bg, 5%)",
72
+ "@btn-success-color": "#fff",
73
+ "@btn-success-bg": "@brand-success",
74
+ "@btn-success-border": "darken(@btn-success-bg, 5%)",
75
+ "@btn-info-color": "#fff",
76
+ "@btn-info-bg": "@brand-info",
77
+ "@btn-info-border": "darken(@btn-info-bg, 5%)",
78
+ "@btn-warning-color": "#fff",
79
+ "@btn-warning-bg": "@brand-warning",
80
+ "@btn-warning-border": "darken(@btn-warning-bg, 5%)",
81
+ "@btn-danger-color": "#fff",
82
+ "@btn-danger-bg": "@brand-danger",
83
+ "@btn-danger-border": "darken(@btn-danger-bg, 5%)",
84
+ "@btn-link-disabled-color": "@gray-light",
85
+ "@input-bg": "#fff",
86
+ "@input-bg-disabled": "@gray-lighter",
87
+ "@input-color": "@gray",
88
+ "@input-border": "#ccc",
89
+ "@input-border-radius": "@border-radius-base",
90
+ "@input-border-radius-large": "@border-radius-large",
91
+ "@input-border-radius-small": "@border-radius-small",
92
+ "@input-border-focus": "#66afe9",
93
+ "@input-color-placeholder": "#999",
94
+ "@input-height-base": "(@line-height-computed + (@padding-base-vertical * 2) + 2)",
95
+ "@input-height-large": "(ceil(@font-size-large * @line-height-large) + (@padding-large-vertical * 2) + 2)",
96
+ "@input-height-small": "(floor(@font-size-small * @line-height-small) + (@padding-small-vertical * 2) + 2)",
97
+ "@legend-color": "@gray-dark",
98
+ "@legend-border-color": "#e5e5e5",
99
+ "@input-group-addon-bg": "@gray-lighter",
100
+ "@input-group-addon-border-color": "@input-border",
101
+ "@cursor-disabled": "not-allowed",
102
+ "@dropdown-bg": "#fff",
103
+ "@dropdown-border": "rgba(0,0,0,.15)",
104
+ "@dropdown-fallback-border": "#ccc",
105
+ "@dropdown-divider-bg": "#e5e5e5",
106
+ "@dropdown-link-color": "@gray-dark",
107
+ "@dropdown-link-hover-color": "darken(@gray-dark, 5%)",
108
+ "@dropdown-link-hover-bg": "#f5f5f5",
109
+ "@dropdown-link-active-color": "@component-active-color",
110
+ "@dropdown-link-active-bg": "@component-active-bg",
111
+ "@dropdown-link-disabled-color": "@gray-light",
112
+ "@dropdown-header-color": "@gray-light",
113
+ "@dropdown-caret-color": "#000",
114
+ "@screen-xs": "480px",
115
+ "@screen-xs-min": "@screen-xs",
116
+ "@screen-phone": "@screen-xs-min",
117
+ "@screen-sm": "768px",
118
+ "@screen-sm-min": "@screen-sm",
119
+ "@screen-tablet": "@screen-sm-min",
120
+ "@screen-md": "992px",
121
+ "@screen-md-min": "@screen-md",
122
+ "@screen-desktop": "@screen-md-min",
123
+ "@screen-lg": "1200px",
124
+ "@screen-lg-min": "@screen-lg",
125
+ "@screen-lg-desktop": "@screen-lg-min",
126
+ "@screen-xs-max": "(@screen-sm-min - 1)",
127
+ "@screen-sm-max": "(@screen-md-min - 1)",
128
+ "@screen-md-max": "(@screen-lg-min - 1)",
129
+ "@grid-columns": "12",
130
+ "@grid-gutter-width": "30px",
131
+ "@grid-float-breakpoint": "@screen-sm-min",
132
+ "@grid-float-breakpoint-max": "(@grid-float-breakpoint - 1)",
133
+ "@container-tablet": "(720px + @grid-gutter-width)",
134
+ "@container-sm": "@container-tablet",
135
+ "@container-desktop": "(940px + @grid-gutter-width)",
136
+ "@container-md": "@container-desktop",
137
+ "@container-large-desktop": "(1140px + @grid-gutter-width)",
138
+ "@container-lg": "@container-large-desktop",
139
+ "@navbar-height": "50px",
140
+ "@navbar-margin-bottom": "@line-height-computed",
141
+ "@navbar-border-radius": "@border-radius-base",
142
+ "@navbar-padding-horizontal": "floor((@grid-gutter-width / 2))",
143
+ "@navbar-padding-vertical": "((@navbar-height - @line-height-computed) / 2)",
144
+ "@navbar-collapse-max-height": "340px",
145
+ "@navbar-default-color": "#777",
146
+ "@navbar-default-bg": "#f8f8f8",
147
+ "@navbar-default-border": "darken(@navbar-default-bg, 6.5%)",
148
+ "@navbar-default-link-color": "#777",
149
+ "@navbar-default-link-hover-color": "#333",
150
+ "@navbar-default-link-hover-bg": "transparent",
151
+ "@navbar-default-link-active-color": "#555",
152
+ "@navbar-default-link-active-bg": "darken(@navbar-default-bg, 6.5%)",
153
+ "@navbar-default-link-disabled-color": "#ccc",
154
+ "@navbar-default-link-disabled-bg": "transparent",
155
+ "@navbar-default-brand-color": "@navbar-default-link-color",
156
+ "@navbar-default-brand-hover-color": "darken(@navbar-default-brand-color, 10%)",
157
+ "@navbar-default-brand-hover-bg": "transparent",
158
+ "@navbar-default-toggle-hover-bg": "#ddd",
159
+ "@navbar-default-toggle-icon-bar-bg": "#888",
160
+ "@navbar-default-toggle-border-color": "#ddd",
161
+ "@navbar-inverse-color": "lighten(@gray-light, 15%)",
162
+ "@navbar-inverse-bg": "#222",
163
+ "@navbar-inverse-border": "darken(@navbar-inverse-bg, 10%)",
164
+ "@navbar-inverse-link-color": "lighten(@gray-light, 15%)",
165
+ "@navbar-inverse-link-hover-color": "#fff",
166
+ "@navbar-inverse-link-hover-bg": "transparent",
167
+ "@navbar-inverse-link-active-color": "@navbar-inverse-link-hover-color",
168
+ "@navbar-inverse-link-active-bg": "darken(@navbar-inverse-bg, 10%)",
169
+ "@navbar-inverse-link-disabled-color": "#444",
170
+ "@navbar-inverse-link-disabled-bg": "transparent",
171
+ "@navbar-inverse-brand-color": "@navbar-inverse-link-color",
172
+ "@navbar-inverse-brand-hover-color": "#fff",
173
+ "@navbar-inverse-brand-hover-bg": "transparent",
174
+ "@navbar-inverse-toggle-hover-bg": "#333",
175
+ "@navbar-inverse-toggle-icon-bar-bg": "#fff",
176
+ "@navbar-inverse-toggle-border-color": "#333",
177
+ "@nav-link-padding": "10px 15px",
178
+ "@nav-link-hover-bg": "@gray-lighter",
179
+ "@nav-disabled-link-color": "@gray-light",
180
+ "@nav-disabled-link-hover-color": "@gray-light",
181
+ "@nav-tabs-border-color": "#ddd",
182
+ "@nav-tabs-link-hover-border-color": "@gray-lighter",
183
+ "@nav-tabs-active-link-hover-bg": "@body-bg",
184
+ "@nav-tabs-active-link-hover-color": "@gray",
185
+ "@nav-tabs-active-link-hover-border-color": "#ddd",
186
+ "@nav-tabs-justified-link-border-color": "#ddd",
187
+ "@nav-tabs-justified-active-link-border-color": "@body-bg",
188
+ "@nav-pills-border-radius": "@border-radius-base",
189
+ "@nav-pills-active-link-hover-bg": "@component-active-bg",
190
+ "@nav-pills-active-link-hover-color": "@component-active-color",
191
+ "@pagination-color": "@link-color",
192
+ "@pagination-bg": "#fff",
193
+ "@pagination-border": "#ddd",
194
+ "@pagination-hover-color": "@link-hover-color",
195
+ "@pagination-hover-bg": "@gray-lighter",
196
+ "@pagination-hover-border": "#ddd",
197
+ "@pagination-active-color": "#fff",
198
+ "@pagination-active-bg": "@brand-primary",
199
+ "@pagination-active-border": "@brand-primary",
200
+ "@pagination-disabled-color": "@gray-light",
201
+ "@pagination-disabled-bg": "#fff",
202
+ "@pagination-disabled-border": "#ddd",
203
+ "@pager-bg": "@pagination-bg",
204
+ "@pager-border": "@pagination-border",
205
+ "@pager-border-radius": "15px",
206
+ "@pager-hover-bg": "@pagination-hover-bg",
207
+ "@pager-active-bg": "@pagination-active-bg",
208
+ "@pager-active-color": "@pagination-active-color",
209
+ "@pager-disabled-color": "@pagination-disabled-color",
210
+ "@jumbotron-padding": "30px",
211
+ "@jumbotron-color": "inherit",
212
+ "@jumbotron-bg": "@gray-lighter",
213
+ "@jumbotron-heading-color": "inherit",
214
+ "@jumbotron-font-size": "ceil((@font-size-base * 1.5))",
215
+ "@state-success-text": "#3c763d",
216
+ "@state-success-bg": "#dff0d8",
217
+ "@state-success-border": "darken(spin(@state-success-bg, -10), 5%)",
218
+ "@state-info-text": "#31708f",
219
+ "@state-info-bg": "#d9edf7",
220
+ "@state-info-border": "darken(spin(@state-info-bg, -10), 7%)",
221
+ "@state-warning-text": "#8a6d3b",
222
+ "@state-warning-bg": "#fcf8e3",
223
+ "@state-warning-border": "darken(spin(@state-warning-bg, -10), 5%)",
224
+ "@state-danger-text": "#a94442",
225
+ "@state-danger-bg": "#f2dede",
226
+ "@state-danger-border": "darken(spin(@state-danger-bg, -10), 5%)",
227
+ "@tooltip-max-width": "200px",
228
+ "@tooltip-color": "#fff",
229
+ "@tooltip-bg": "#000",
230
+ "@tooltip-opacity": ".9",
231
+ "@tooltip-arrow-width": "5px",
232
+ "@tooltip-arrow-color": "@tooltip-bg",
233
+ "@popover-bg": "#fff",
234
+ "@popover-max-width": "276px",
235
+ "@popover-border-color": "rgba(0,0,0,.2)",
236
+ "@popover-fallback-border-color": "#ccc",
237
+ "@popover-title-bg": "darken(@popover-bg, 3%)",
238
+ "@popover-arrow-width": "10px",
239
+ "@popover-arrow-color": "@popover-bg",
240
+ "@popover-arrow-outer-width": "(@popover-arrow-width + 1)",
241
+ "@popover-arrow-outer-color": "fadein(@popover-border-color, 5%)",
242
+ "@popover-arrow-outer-fallback-color": "darken(@popover-fallback-border-color, 20%)",
243
+ "@label-default-bg": "@gray-light",
244
+ "@label-primary-bg": "@brand-primary",
245
+ "@label-success-bg": "@brand-success",
246
+ "@label-info-bg": "@brand-info",
247
+ "@label-warning-bg": "@brand-warning",
248
+ "@label-danger-bg": "@brand-danger",
249
+ "@label-color": "#fff",
250
+ "@label-link-hover-color": "#fff",
251
+ "@modal-inner-padding": "15px",
252
+ "@modal-title-padding": "15px",
253
+ "@modal-title-line-height": "@line-height-base",
254
+ "@modal-content-bg": "#fff",
255
+ "@modal-content-border-color": "rgba(0,0,0,.2)",
256
+ "@modal-content-fallback-border-color": "#999",
257
+ "@modal-backdrop-bg": "#000",
258
+ "@modal-backdrop-opacity": ".5",
259
+ "@modal-header-border-color": "#e5e5e5",
260
+ "@modal-footer-border-color": "@modal-header-border-color",
261
+ "@modal-lg": "900px",
262
+ "@modal-md": "600px",
263
+ "@modal-sm": "300px",
264
+ "@alert-padding": "15px",
265
+ "@alert-border-radius": "@border-radius-base",
266
+ "@alert-link-font-weight": "bold",
267
+ "@alert-success-bg": "@state-success-bg",
268
+ "@alert-success-text": "@state-success-text",
269
+ "@alert-success-border": "@state-success-border",
270
+ "@alert-info-bg": "@state-info-bg",
271
+ "@alert-info-text": "@state-info-text",
272
+ "@alert-info-border": "@state-info-border",
273
+ "@alert-warning-bg": "@state-warning-bg",
274
+ "@alert-warning-text": "@state-warning-text",
275
+ "@alert-warning-border": "@state-warning-border",
276
+ "@alert-danger-bg": "@state-danger-bg",
277
+ "@alert-danger-text": "@state-danger-text",
278
+ "@alert-danger-border": "@state-danger-border",
279
+ "@progress-bg": "#f5f5f5",
280
+ "@progress-bar-color": "#fff",
281
+ "@progress-border-radius": "@border-radius-base",
282
+ "@progress-bar-bg": "@brand-primary",
283
+ "@progress-bar-success-bg": "@brand-success",
284
+ "@progress-bar-warning-bg": "@brand-warning",
285
+ "@progress-bar-danger-bg": "@brand-danger",
286
+ "@progress-bar-info-bg": "@brand-info",
287
+ "@list-group-bg": "#fff",
288
+ "@list-group-border": "#ddd",
289
+ "@list-group-border-radius": "@border-radius-base",
290
+ "@list-group-hover-bg": "#f5f5f5",
291
+ "@list-group-active-color": "@component-active-color",
292
+ "@list-group-active-bg": "@component-active-bg",
293
+ "@list-group-active-border": "@list-group-active-bg",
294
+ "@list-group-active-text-color": "lighten(@list-group-active-bg, 40%)",
295
+ "@list-group-disabled-color": "@gray-light",
296
+ "@list-group-disabled-bg": "@gray-lighter",
297
+ "@list-group-disabled-text-color": "@list-group-disabled-color",
298
+ "@list-group-link-color": "#555",
299
+ "@list-group-link-hover-color": "@list-group-link-color",
300
+ "@list-group-link-heading-color": "#333",
301
+ "@panel-bg": "#fff",
302
+ "@panel-body-padding": "15px",
303
+ "@panel-heading-padding": "10px 15px",
304
+ "@panel-footer-padding": "@panel-heading-padding",
305
+ "@panel-border-radius": "@border-radius-base",
306
+ "@panel-inner-border": "#ddd",
307
+ "@panel-footer-bg": "#f5f5f5",
308
+ "@panel-default-text": "@gray-dark",
309
+ "@panel-default-border": "#ddd",
310
+ "@panel-default-heading-bg": "#f5f5f5",
311
+ "@panel-primary-text": "#fff",
312
+ "@panel-primary-border": "@brand-primary",
313
+ "@panel-primary-heading-bg": "@brand-primary",
314
+ "@panel-success-text": "@state-success-text",
315
+ "@panel-success-border": "@state-success-border",
316
+ "@panel-success-heading-bg": "@state-success-bg",
317
+ "@panel-info-text": "@state-info-text",
318
+ "@panel-info-border": "@state-info-border",
319
+ "@panel-info-heading-bg": "@state-info-bg",
320
+ "@panel-warning-text": "@state-warning-text",
321
+ "@panel-warning-border": "@state-warning-border",
322
+ "@panel-warning-heading-bg": "@state-warning-bg",
323
+ "@panel-danger-text": "@state-danger-text",
324
+ "@panel-danger-border": "@state-danger-border",
325
+ "@panel-danger-heading-bg": "@state-danger-bg",
326
+ "@thumbnail-padding": "4px",
327
+ "@thumbnail-bg": "@body-bg",
328
+ "@thumbnail-border": "#ddd",
329
+ "@thumbnail-border-radius": "@border-radius-base",
330
+ "@thumbnail-caption-color": "@text-color",
331
+ "@thumbnail-caption-padding": "9px",
332
+ "@well-bg": "#f5f5f5",
333
+ "@well-border": "darken(@well-bg, 7%)",
334
+ "@badge-color": "#fff",
335
+ "@badge-link-hover-color": "#fff",
336
+ "@badge-bg": "@gray-light",
337
+ "@badge-active-color": "@link-color",
338
+ "@badge-active-bg": "#fff",
339
+ "@badge-font-weight": "bold",
340
+ "@badge-line-height": "1",
341
+ "@badge-border-radius": "10px",
342
+ "@breadcrumb-padding-vertical": "8px",
343
+ "@breadcrumb-padding-horizontal": "15px",
344
+ "@breadcrumb-bg": "#f5f5f5",
345
+ "@breadcrumb-color": "#ccc",
346
+ "@breadcrumb-active-color": "@gray-light",
347
+ "@breadcrumb-separator": "\"/\"",
348
+ "@carousel-text-shadow": "0 1px 2px rgba(0,0,0,.6)",
349
+ "@carousel-control-color": "#fff",
350
+ "@carousel-control-width": "15%",
351
+ "@carousel-control-opacity": ".5",
352
+ "@carousel-control-font-size": "20px",
353
+ "@carousel-indicator-active-bg": "#fff",
354
+ "@carousel-indicator-border-color": "#fff",
355
+ "@carousel-caption-color": "#fff",
356
+ "@close-font-weight": "bold",
357
+ "@close-color": "#000",
358
+ "@close-text-shadow": "0 1px 0 #fff",
359
+ "@code-color": "#c7254e",
360
+ "@code-bg": "#f9f2f4",
361
+ "@kbd-color": "#fff",
362
+ "@kbd-bg": "#333",
363
+ "@pre-bg": "#f5f5f5",
364
+ "@pre-color": "@gray-dark",
365
+ "@pre-border-color": "#ccc",
366
+ "@pre-scrollable-max-height": "340px",
367
+ "@component-offset-horizontal": "180px",
368
+ "@text-muted": "@gray-light",
369
+ "@abbr-border-color": "@gray-light",
370
+ "@headings-small-color": "@gray-light",
371
+ "@blockquote-small-color": "@gray-light",
372
+ "@blockquote-font-size": "(@font-size-base * 1.25)",
373
+ "@blockquote-border-color": "@gray-lighter",
374
+ "@page-header-border-color": "@gray-lighter",
375
+ "@dl-horizontal-offset": "@component-offset-horizontal",
376
+ "@hr-border": "@gray-lighter"
377
+ },
378
+ "css": [
379
+ "print.less",
380
+ "type.less",
381
+ "code.less",
382
+ "tables.less",
383
+ "forms.less",
384
+ "buttons.less"
385
+ ],
386
+ "js": [],
387
+ "customizerUrl": "http://getbootstrap.com/customize/?id=572bbf800700ea752a72"
388
+ }