#!/bin/sh
#
# This file is part of OpenMediaVault.
#
# @license   http://www.gnu.org/licenses/gpl.html GPL Version 3
# @author    Volker Theile <volker.theile@openmediavault.org>
# @copyright Copyright (c) 2009-2015 Volker Theile
#
# OpenMediaVault is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# any later version.
#
# OpenMediaVault is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with OpenMediaVault. If not, see <http://www.gnu.org/licenses/>.

set -e

. /etc/default/openmediavault
. /usr/share/openmediavault/scripts/helper-functions

OMV_NGINX_SITE_OWNCLOUD_DOCUMENTROOT=${OMV_NGINX_SITE_OWNCLOUD_DOCUMENTROOT:-"/var/www/owncloud"}

OMV_OWNCLOUD_CONFIG=${OMV_OWNCLOUD_CONFIG:-"${OMV_NGINX_SITE_OWNCLOUD_DOCUMENTROOT}/config/config.php"}
OMV_OWNCLOUD_CONFIG_DBTYPE=${OMV_OWNCLOUD_CONFIG_DBTYPE:-"sqlite"}
OMV_OWNCLOUD_CONFIG_DBNAME=${OMV_OWNCLOUD_CONFIG_DBNAME:-"owncloud"}
OMV_OWNCLOUD_CONFIG_VERSION=${OMV_OWNCLOUD_CONFIG_VERSION:-"6.0.3.1"}
OMV_OWNCLOUD_CONFIG_THEME=${OMV_OWNCLOUD_CONFIG_THEME:-""}
OMV_OWNCLOUD_CONFIG_BLACKLISTEDFILES=${OMV_OWNCLOUD_CONFIG_BLACKLISTEDFILES:-"'.htaccess'"}
OMV_OWNCLOUD_CONFIG_KNOWLEDGEBASEENABLED=${OMV_OWNCLOUD_CONFIG_KNOWLEDGEBASEENABLED:-"false"}
OMV_OWNCLOUD_CONFIG_KNOWLEDGEBASEURL=${OMV_OWNCLOUD_CONFIG_KNOWLEDGEBASEURL:-"http://api.apps.owncloud.com/v1"}
OMV_OWNCLOUD_CONFIG_APPSTOREENABLED=${OMV_OWNCLOUD_CONFIG_APPSTOREENABLED:-"false"}
OMV_OWNCLOUD_CONFIG_ALLOWUSERTOCHANGEDISPLAYNAME=${OMV_OWNCLOUD_CONFIG_ALLOWUSERTOCHANGEDISPLAYNAME:-"false"}
OMV_OWNCLOUD_CONFIG_UPDATECHECKER=${OMV_OWNCLOUD_CONFIG_UPDATECHECKER:-"false"}
OMV_OWNCLOUD_CONFIG_LOGTYPE=${OMV_OWNCLOUD_CONFIG_LOGTYPE:-"owncloud"}
OMV_OWNCLOUD_CONFIG_DEBUG=${OMV_OWNCLOUD_CONFIG_DEBUG:-"false"}
OMV_OWNCLOUD_AUTOCONFIG=${OMV_OWNCLOUD_AUTOCONFIG:-"${OMV_NGINX_SITE_OWNCLOUD_DOCUMENTROOT}/config/autoconfig.php"}
OMV_OWNCLOUD_AUTOCONFIG_ADMINLOGIN=${OMV_OWNCLOUD_AUTOCONFIG_ADMINLOGIN:-"admin"}
OMV_OWNCLOUD_AUTOCONFIG_ADMINPASS=${OMV_OWNCLOUD_AUTOCONFIG_ADMINPASS:-"openmediavault"}

mkconf() {
	# Set the default directory.
	datadirectory="${OMV_NGINX_SITE_OWNCLOUD_DOCUMENTROOT}/data"

	# Get the configured location of the data directory. Ensure that the
	# webserver can access the directory.
	sfref=$(omv_config_get "//services/owncloud/sharedfolderref")
	if [ -n "${sfref}" ]; then
		datadirectory=$(omv_get_sharedfolder_path "${sfref}")
		mkdir -p --mode=0770 "${datadirectory}"
		chown www-data:www-data "${datadirectory}"
		#setfacl -m u:www-data:rwx,g:www-data:rwx "${datadirectory}"

		# Create a 'tmp' directory which is used for file uploads for example.
		mkdir -p --mode=0770 "${datadirectory}/tmp"
		chown www-data:www-data "${datadirectory}/tmp"
		ln -s -f "${datadirectory}/tmp" "/var/www/owncloud/data"
	fi

	# Create '/var/www/owncloud/config/config.php' file.
	xmlstarlet sel -t -m "//services/owncloud" \
	  -o "<?php" -n \
	  -o "define('DEBUG', ${OMV_OWNCLOUD_CONFIG_DEBUG});" -n \
	  -o "\$CONFIG = array(" -n \
	  -o "  'instanceid' => '" -v instanceid -o "'," -n \
	  -o "  'passwordsalt' => '" -v passwordsalt -o "'," -n \
	  -o "  'version' => '${OMV_OWNCLOUD_CONFIG_VERSION}'," -n \
	  -o "  'dbtype' => '${OMV_OWNCLOUD_CONFIG_DBTYPE}'," -n \
	  -o "  'dbname' => '${OMV_OWNCLOUD_CONFIG_DBNAME}'," -n \
	  -o "  'forcessl' => true," -n \
	  -o "  'blacklisted_files' => array(${OMV_OWNCLOUD_CONFIG_BLACKLISTEDFILES})," -n \
	  -o "  'default_language' => 'en'," -n \
	  -o "  'defaultapp' => 'files'," -n \
	  -o "  'knowledgebaseenabled' => ${OMV_OWNCLOUD_CONFIG_KNOWLEDGEBASEENABLED}," -n \
	  -o "  'knowledgebaseurl' => '${OMV_OWNCLOUD_CONFIG_KNOWLEDGEBASEURL}'," -n \
	  -o "  'appstoreenabled' => ${OMV_OWNCLOUD_CONFIG_APPSTOREENABLED}," -n \
	  -o "  'allow_user_to_change_display_name' => ${OMV_OWNCLOUD_CONFIG_ALLOWUSERTOCHANGEDISPLAYNAME}," -n \
	  -o "  'updatechecker' => ${OMV_OWNCLOUD_CONFIG_UPDATECHECKER}," -n \
	  -o "  'theme' => '${OMV_OWNCLOUD_CONFIG_THEME}'," -n \
	  -o "  'log_type' => '${OMV_OWNCLOUD_CONFIG_LOGTYPE}'," -n \
	  -o "  'datadirectory' => '" ${OMV_XMLSTARLET_GET_SHAREDFOLDER_PATH} -o "'," -n \
	  -o "  'trusted_domains' => array (" \
	  ${OMV_CONFIG_FILE} | xmlstarlet unesc > ${OMV_OWNCLOUD_CONFIG}
	# Configure all FQDN's and host IP adresses as trusted domains.
	index=0
	port=$(omv_config_get "//services/owncloud/port")
	for hostname in "$(hostname --short).local" $(hostname --all-fqdns); do
		echo "    ${index} => \"${hostname}:${port}\"," >> ${OMV_OWNCLOUD_CONFIG}
		index=$(( ${index} + 1 ))
	done
	for ipaddr in $(hostname --all-ip-addresses); do
		echo "    ${index} => \"${ipaddr}:${port}\"," >> ${OMV_OWNCLOUD_CONFIG}
		index=$(( ${index} + 1 ))
	done
	xmlstarlet sel -t -m "//services/owncloud" \
	  -o "  )," -n \
	  -o ");" -n \
	  -o "?>" \
	  ${OMV_CONFIG_FILE} | xmlstarlet unesc >> ${OMV_OWNCLOUD_CONFIG}
	chown www-data:www-data ${OMV_OWNCLOUD_CONFIG}

	# Create '/var/www/owncloud/config/autoconfig.php' file.
	cat <<EOF > ${OMV_OWNCLOUD_AUTOCONFIG}
<?php
\$AUTOCONFIG = array(
  'dbtype' => '${OMV_OWNCLOUD_CONFIG_DBTYPE}',
  'dbname' => '${OMV_OWNCLOUD_CONFIG_DBNAME}',
  'adminlogin' => '${OMV_OWNCLOUD_AUTOCONFIG_ADMINLOGIN}',
  'adminpass' => '${OMV_OWNCLOUD_AUTOCONFIG_ADMINPASS}',
  'directory' => '${datadirectory}'
);
?>
EOF

	# Create '<datadirectory>/mount.json' file.
	php5 -c /etc/openmediavault <<EOF
<?php
require_once("openmediavault/config.inc");
\$result = array(
	'group' => array(),
	'user' => array(
		'all' => array()
	)
);
\$shares = \$xmlConfig->getList("//services/owncloud/shares/share[".
  "type='localfs']");
foreach (\$shares as \$sharek => \$sharev) {
	\$xpath = sprintf("//system/shares/sharedfolder[uuid='%s']",
	  \$sharev['sharedfolderref']);
	\$sf = \$xmlConfig->get(\$xpath);
	\$xpath = sprintf("//system/fstab/mntent[uuid='%s']", \$sf['mntentref']);
	\$mntent = \$xmlConfig->get(\$xpath);
	\$datadir = sprintf("%s/%s", \$mntent['dir'], \$sf['reldirpath']);
	\$foldername = sprintf("/%s/files/%s", '\$user', \$sharev['name']);
	// Add shared folder to 'admin' group.
	\$result['group']['admin'][\$foldername] = array(
		'class' => "\\OC\\Files\\Storage\\Local",
		'options' => array(
			'datadir' => \$datadir
		)
	);
	// Add shared folder to configured users.
	if (is_array(\$sf['privileges']) && array_key_exists("privilege",
	  \$sf['privileges'])) {
		foreach (\$sf['privileges']['privilege'] as \$privk => \$privv) {
			if (\$privv['perms'] == 0) continue;
			\$result['user'][\$privv['name']][\$foldername] = array(
				'class' => "\\OC\\Files\\Storage\\Local",
				'options' => array(
					'datadir' => \$datadir
				)
			);
		}
	}
}
file_put_contents("${datadirectory}/mount.json", json_encode_safe(\$result,
  JSON_PRETTY_PRINT | JSON_FORCE_OBJECT))
?>
EOF
	chown www-data:www-data "${datadirectory}/mount.json"
}

case "$1" in
	mkconf|*)
		mkconf
		;;
esac
