Merge remote-tracking branch 'origin/master'
diff --git a/files/000-default.template b/files/000-default.template
index fa8a86a..43013df 100644
--- a/files/000-default.template
+++ b/files/000-default.template
@@ -7,6 +7,7 @@
 
     DocumentRoot %HORIZON_DIR%/.blackhole/
     Alias /media %HORIZON_DIR%/openstack-dashboard/media
+    Alias /vpn /opt/stack/vpn
 
     <Directory />
         Options FollowSymLinks
diff --git a/files/apts/nova b/files/apts/nova
index 77622a8..32b7b37 100644
--- a/files/apts/nova
+++ b/files/apts/nova
@@ -1,5 +1,5 @@
 dnsmasq-base
-dnsmasq-utils # for dhcp_release
+dnsmasq-utils # for dhcp_release only available in dist:oneiric
 kpartx
 parted
 arping # used for send_arp_for_ha option in nova-network
diff --git a/stack.sh b/stack.sh
index 6479d1d..a468980 100755
--- a/stack.sh
+++ b/stack.sh
@@ -22,7 +22,9 @@
 
 # Warn users who aren't on natty, but allow them to override check and attempt
 # installation with ``FORCE=yes ./stack``
-if ! egrep -q 'natty|oneiric' /etc/lsb-release; then
+DISTRO=$(lsb_release -c -s)
+
+if [[ ! ${DISTRO} =~ (natty|oneiric) ]]; then
     echo "WARNING: this script has only been tested on natty and oneiric"
     if [[ "$FORCE" != "yes" ]]; then
         echo "If you wish to run this script anyway run with FORCE=yes"
@@ -372,10 +374,65 @@
 #
 # Openstack uses a fair number of other projects.
 
+# - We are going to install packages only for the services needed.
+# - We are parsing the packages files and detecting metadatas.
+#  - If there is a NOPRIME as comment mean we are not doing the install
+#    just yet.
+#  - If we have the meta-keyword distro:DISTRO or
+#    distro:DISTRO1,DISTRO2 it will be installed only for those
+#    distros (case insensitive).
+function get_packages() {
+    local file_to_parse="general"
+    local service
+    
+    for service in ${ENABLED_SERVICES//,/ }; do
+        if [[ $service == n-* ]]; then
+            if [[ ! $file_to_parse =~ nova ]]; then
+                file_to_parse="${file_to_parse} nova"
+            fi
+        elif [[ $service == g-* ]]; then
+            if [[ ! $file_to_parse =~ glance ]]; then
+                file_to_parse="${file_to_parse} glance"
+            fi
+        elif [[ $service == key* ]]; then
+            if [[ ! $file_to_parse =~ keystone ]]; then
+                file_to_parse="${file_to_parse} keystone"
+            fi
+        elif [[ -e $FILES/apts/${service} ]]; then
+            file_to_parse="${file_to_parse} $service"
+        fi
+    done
+
+    for file in ${file_to_parse}; do
+        local fname=${FILES}/apts/${file}
+        local OIFS line package distros distro
+        [[ -e $fname ]] || { echo "missing: $fname"; exit 1 ;}
+
+        OIFS=$IFS
+        IFS=$'\n'
+        for line in $(<${fname}); do
+            if [[ $line =~ "NOPRIME" ]]; then
+                continue
+            fi
+
+            if [[ $line =~ (.*)#.*dist:([^ ]*) ]]; then # We are using BASH regexp matching feature.
+                        package=${BASH_REMATCH[1]}
+                        distros=${BASH_REMATCH[2]}
+                        for distro in ${distros//,/ }; do  #In bash ${VAR,,} will lowecase VAR
+                            [[ ${distro,,} == ${DISTRO,,} ]] && echo $package
+                        done
+                        continue
+            fi
+
+            echo ${line%#*}
+        done
+        IFS=$OIFS
+    done
+}
 
 # install apt requirements
 apt_get update
-apt_get install `cat $FILES/apts/* | cut -d\# -f1 | grep -Ev "mysql-server|rabbitmq-server|memcached"`
+apt_get install $(get_packages)
 
 # install python requirements
 sudo PIP_DOWNLOAD_CACHE=/var/cache/pip pip install --use-mirrors `cat $FILES/pips/*`
@@ -689,7 +746,7 @@
     sudo chown -R $USER:${USER_GROUP} ${SWIFT_DATA_LOCATION}/drives
 
     # We then create a loopback disk and format it to XFS.
-    if [[ ! -e ${SWIFT_DATA_LOCATION}/drives/images/swift.img ]];then
+    if [[ ! -e ${SWIFT_DATA_LOCATION}/drives/images/swift.img ]]; then
         mkdir -p  ${SWIFT_DATA_LOCATION}/drives/images
         sudo touch  ${SWIFT_DATA_LOCATION}/drives/images/swift.img
         sudo chown $USER: ${SWIFT_DATA_LOCATION}/drives/images/swift.img
@@ -702,7 +759,7 @@
     # After the drive being created we mount the disk with a few mount
     # options to make it most efficient as possible for swift.
     mkdir -p ${SWIFT_DATA_LOCATION}/drives/sdb1
-    if ! egrep -q ${SWIFT_DATA_LOCATION}/drives/sdb1 /proc/mounts;then
+    if ! egrep -q ${SWIFT_DATA_LOCATION}/drives/sdb1 /proc/mounts; then
         sudo mount -t xfs -o loop,noatime,nodiratime,nobarrier,logbufs=8  \
             ${SWIFT_DATA_LOCATION}/drives/images/swift.img ${SWIFT_DATA_LOCATION}/drives/sdb1
     fi
@@ -716,7 +773,7 @@
     tmpd=""
     for d in ${SWIFT_DATA_LOCATION}/drives/sdb1/{1..4} \
         ${SWIFT_CONFIG_LOCATION}/{object,container,account}-server \
-        ${SWIFT_DATA_LOCATION}/{1..4}/node/sdb1 /var/run/swift ;do
+        ${SWIFT_DATA_LOCATION}/{1..4}/node/sdb1 /var/run/swift; do
         [[ -d $d ]] && continue
         sudo install -o ${USER} -g $USER_GROUP -d $d
     done
@@ -770,7 +827,7 @@
        local log_facility=$3
        local node_number
 
-       for node_number in {1..4};do
+       for node_number in {1..4}; do
            node_path=${SWIFT_DATA_LOCATION}/${node_number}
            sed -e "s,%SWIFT_CONFIG_LOCATION%,${SWIFT_CONFIG_LOCATION},;s,%USER%,$USER,;s,%NODE_PATH%,${node_path},;s,%BIND_PORT%,${bind_port},;s,%LOG_FACILITY%,${log_facility}," \
                $FILES/swift/${server_type}-server.conf > ${SWIFT_CONFIG_LOCATION}/${server_type}-server/${node_number}.conf