From fdd41947e49d4ad8464bfb1a55922aa4f77aa51c Mon Sep 17 00:00:00 2001
From: Matthew Saunders Brown <msb@stackaas.com>
Date: Mon, 2 May 2022 16:19:00 -0700
Subject: [PATCH] create new vhost-get.sh

---
 bin/vhost-get.sh | 163 +++++++++++++++++++++++++++++++++++++++++++++++
 bin/vhost.sh     |   5 +-
 2 files changed, 167 insertions(+), 1 deletion(-)
 create mode 100755 bin/vhost-get.sh

diff --git a/bin/vhost-get.sh b/bin/vhost-get.sh
new file mode 100755
index 0000000..9140975
--- /dev/null
+++ b/bin/vhost-get.sh
@@ -0,0 +1,163 @@
+#!/bin/bash
+#
+# vhost-stack
+# https://git.stack-source.com/msb/vhost-stack
+# MIT License Copyright (c) 2022 Matthew Saunders Brown
+
+# load include file
+source $(dirname $0)/vhost.sh
+
+help()
+{
+  thisfilename=$(basename -- "$0")
+  echo "Get VirtualHost info."
+  echo ""
+  echo "usage: $thisfilename [-d <domain>] [-o <mode>] [-c] [-h]"
+  echo ""
+  echo "  -h            Print this help."
+  echo "  -d <domain>   Domain name to get info for. By defual all domains are returned"
+  echo "  -o <mode>     Type of query. 'virtualhosts' (default), 'redirects', 'aliases'."
+  echo "  -c            CVS - Output in cvs format, instead of tabbed table."
+}
+
+vhost:getoptions "$@"
+
+# create newline var
+NL=$'\n'
+
+# check for option (mode or type of query)
+if [[ -z $option ]]; then
+  option='virtualhosts'
+fi
+
+if [[ $option = 'virtualhosts' ]]; then
+
+  if [[ -n $domain ]]; then
+    if [[ -d /srv/www/$domain ]]; then
+      virtualhostArray=($domain)
+    else
+      echo "ERROR: $domain not found"
+      exit 1
+    fi
+  else
+    vhost::set-virtualhostArray
+  fi
+
+  output="Virtualhost Username Config Status"
+
+  for v in "${virtualhostArray[@]}"
+  do
+    username=$(stat -c '%U' /srv/www/$v)
+    if [[ -f /etc/apache2/sites-available/$v.conf ]]; then
+      macro="Custom"
+      if head -n 1 /etc/apache2/sites-available/$v.conf |grep --quiet ^Use; then
+        macro=$(head -n 1 /etc/apache2/sites-available/$v.conf |grep ^Use|cut -d ' ' -f 2)
+      fi
+    else
+      macro="None"
+    fi
+    if [[ -f /etc/apache2/sites-enabled/$v.conf ]]; then
+      status="Enabled"
+    else
+      status="Disabled"
+    fi
+    output="$output${NL}$v $username $macro $status"
+  done
+  if [[ $cvs ]]; then
+    echo "$output" | tr " " ","
+  else
+    echo "$output" | column -t
+  fi
+elif [[ $option = 'redirects' ]]; then
+
+  # working dir for redirect configs
+  cd /etc/apache2/sites-available
+
+  if [[ -n $domain ]]; then
+    if [[ -f $domain.conf ]]; then
+      if head -n 1 $domain.conf |grep --quiet '^Use Redirect'; then
+        vhostConfigs=("$domain.conf")
+      else
+        echo "ERROR: $domain is not configured as a Redirect."
+        exit 1
+      fi
+    else
+      echo "ERROR: $domain is not configured on this server."
+      exit 1
+    fi
+  else
+    vhostConfigs=(`ls -1`)
+  fi
+
+  output="Virtualhost Config Redirect Status"
+
+  for c in "${vhostConfigs[@]}"
+  do
+    if head -n 1 /etc/apache2/sites-available/$c |grep --quiet '^Use Redirect'; then
+      domain=$(head -n 1 /etc/apache2/sites-available/$c |grep '^Use Redirect'|cut -d ' ' -f 3)
+      macro=$(head -n 1 /etc/apache2/sites-available/$c |grep '^Use Redirect'|cut -d ' ' -f 2)
+      redirect=$(head -n 1 /etc/apache2/sites-available/$c |grep '^Use Redirect'|cut -d ' ' -f 4)
+      if [[ -f /etc/apache2/sites-enabled/$c ]]; then
+        status="Enabled"
+      else
+        status="Disabled"
+      fi
+      output="$output${NL}$domain $macro $redirect $status"
+    fi
+  done
+
+  if [[ $cvs ]]; then
+    echo "$output" | tr " " ","
+  else
+    echo "$output" | column -t
+  fi
+
+elif [[ $option = 'aliases' ]]; then
+
+  # working dir for aliases configs
+  cd /etc/apache2/sites-available
+
+  if [[ -n $domain ]]; then
+    if [[ -f $domain.conf ]]; then
+      if head -n 1 $domain.conf |grep --quiet '^Use VHostAlias'; then
+        vhostConfigs=("$domain.conf")
+      else
+        echo "ERROR: $domain is not configured as a Alias"
+        exit 1
+      fi
+    else
+      echo "ERROR: $domain is not configured on this server."
+      exit 1
+    fi
+  else
+    vhostConfigs=(`ls -1`)
+  fi
+
+  output="Virtualhost Username Macro Alias Status"
+
+  for c in "${vhostConfigs[@]}"
+  do
+    if head -n 1 /etc/apache2/sites-available/$c |grep --quiet '^Use VHostAlias'; then
+      macro=$(head -n 1 /etc/apache2/sites-available/$c |grep '^Use VHostAlias'|cut -d ' ' -f 2)
+      alias=$(head -n 1 /etc/apache2/sites-available/$c |grep '^Use VHostAlias'|cut -d ' ' -f 3)
+      username=$(head -n 1 /etc/apache2/sites-available/$c |grep '^Use VHostAlias'|cut -d ' ' -f 4)
+      virtualhost=$(head -n 1 /etc/apache2/sites-available/$c |grep '^Use VHostAlias'|cut -d ' ' -f 5)
+      if [[ -f /etc/apache2/sites-enabled/$c ]]; then
+        status="Enabled"
+      else
+        status="Disabled"
+      fi
+      output="$output${NL}$alias $username $macro $virtualhost $status"
+    fi
+  done
+
+  if [[ $cvs ]]; then
+    echo "$output" | tr " " ","
+  else
+    echo "$output" | column -t
+  fi
+
+else
+  echo "ERROR: Invalid mode '$option'"
+  exit 1
+fi
diff --git a/bin/vhost.sh b/bin/vhost.sh
index 5ee488a..f658f46 100755
--- a/bin/vhost.sh
+++ b/bin/vhost.sh
@@ -38,12 +38,15 @@ function vhost::validate_domain () {
 
 function vhost:getoptions () {
   local OPTIND
-  while getopts "d:i:m:o:p:u:jhnvw" opt ; do
+  while getopts "cd:i:m:o:p:u:jhnvw" opt ; do
     case "${opt}" in
         h ) # display help and exit
           help
           exit
           ;;
+        c ) # cvs - output in cvs format
+          cvs=true
+          ;;
         d ) # domain name (virtualhost) to act on
           domain=${OPTARG,,}
           if ! vhost::validate_domain $domain; then