diff --git a/docker/roundcube/Dockerfile b/docker/roundcube/Dockerfile index d7b60c38..1aaca577 100644 --- a/docker/roundcube/Dockerfile +++ b/docker/roundcube/Dockerfile @@ -1,127 +1,128 @@ FROM apheleia/almalinux9 ENV HOME=/opt/app-root/src # Add kolab RUN rpm --import https://mirror.apheleia-it.ch/repos/Kolab:/16/key.asc && \ rpm -Uvh https://mirror.apheleia-it.ch/repos/Kolab:/16/kolab-16-for-el9.rpm # Install php modules RUN sed -i -e '/^ssl/d' /etc/yum.repos.d/kolab*.repo && \ dnf config-manager --enable kolab-16 &&\ dnf -y --setopt=install_weak_deps=False --setopt tsflags= install php-kolab php-kolabformat \ composer \ diffutils \ file \ git \ make \ unzip \ curl-minimal \ mariadb \ which \ rsync \ openssl \ httpd \ patch \ php-cli \ php-common \ php-ldap \ php-opcache \ php-pecl-apcu \ php-mysqlnd \ php-gd \ php-fpm \ php-pear \ php-redis \ ImageMagick \ re2c \ npm \ wget && \ dnf clean all RUN npm install -g less less-plugin-clean-css WORKDIR ${HOME} COPY rootfs/opt/app-root/src/build.sh /opt/app-root/src/ COPY rootfs/opt/app-root/src/update.sh /opt/app-root/src/ COPY rootfs/opt/app-root/src/composer.json /opt/app-root/src/ COPY rootfs/opt/app-root/src/roundcubemail-config-templates /opt/app-root/src/roundcubemail-config-templates ARG GIT_REF_ROUNDCUBEMAIL=dev/kolab-1.5 ARG GIT_REMOTE_ROUNDCUBEMAIL=https://git.kolab.org/source/roundcubemail.git ARG GIT_REF_ROUNDCUBEMAIL_PLUGINS=master ARG GIT_REMOTE_ROUNDCUBEMAIL_PLUGINS=https://git.kolab.org/diffusion/RPK/roundcubemail-plugins-kolab.git ARG GIT_REF_CHWALA=master ARG GIT_REMOTE_CHWALA=https://git.kolab.org/diffusion/C/chwala.git ARG GIT_REF_SYNCROTON=master ARG GIT_REMOTE_SYNCROTON=https://git.kolab.org/diffusion/S/syncroton.git ARG GIT_REF_AUTOCONF=master ARG GIT_REMOTE_AUTOCONF=https://git.kolab.org/diffusion/AC/autoconf.git ARG GIT_REF_IRONY=master ARG GIT_REMOTE_IRONY=https://git.kolab.org/source/iRony.git ARG GIT_REF_FREEBUSY=master ARG GIT_REMOTE_FREEBUSY=https://git.kolab.org/diffusion/F/freebusy.git RUN /opt/app-root/src/build.sh && \ for PATH in /run/php-fpm /run/httpd /var/log/httpd /var/lib/httpd /data /opt/app-root; \ do \ /usr/bin/mkdir -p $PATH; \ /usr/bin/chmod -R 777 $PATH; \ /usr/bin/chown -R 1001:0 $PATH; \ /usr/bin/chmod -R g=u $PATH; \ done COPY /rootfs / RUN chmod 777 /opt/app-root/src RUN chmod -R 777 /etc/php.ini /etc/httpd /opt/app-root/src/*.sh VOLUME /data ENV RUN_MIGRATIONS=true ENV KOLABOBJECTS_COMPAT_MODE=false ENV LOGDRIVER=logfmt +ENV SKIN=kolab # ENV FILEAPI_KOLABFILES_BASEURI= # ENV FILEAPI_WOPI_OFFICE= # ENV FILE_API_URL= # ENV FILE_API_SERVER_URL= # ENV CALENDAR_CALDAV_SERVER= # ENV TASKLIST_CALDAV_SERVER= # ENV KOLAB_ADDRESSBOOK_CARDDAV_SERVER= # ENV KOLAB_FILES_URL= # ENV KOLAB_FILES_SERVER_URL= # ENV IMAP_HOST= # ENV IMAP_PORT= # ENV IMAP_TLS= # ENV IMAP_PROXY_PROTOCOL= # ENV IMAP_ADMIN_LOGIN= # ENV IMAP_ADMIN_PASSWORD= # ENV DB_RC_USERNAME= # ENV DB_RC_PASSWORD= # ENV DB_RC_DATABASE= # ENV DB_HOST= # ENV DES_KEY= # ENV APP_DOMAIN= # ENV PROXY_WHITELIST= # ENV SUBMISSION_HOST= # ENV SUBMISSION_PORT= # ENV SUBMISSION_ENCRYPTION= # ENV DISABLED_PLUGINS= # ENV EXTRA_PLUGINS= # ENV SQL_DEBUG= # ENV MEMCACHE_DEBUG= # ENV IMAP_DEBUG= # ENV SMTP_DEBUG= # ENV DAV_DEBUG= # ENV ACTIVESYNC_DEBUG= # ENV REDIS_HOST= # ENV REDIS_PASSWORD= USER 1001 EXPOSE 8080 # https://httpd.apache.org/docs/2.4/stopping.html#gracefulstop STOPSIGNAL SIGWINCH CMD [ "/opt/app-root/src/init.sh" ] diff --git a/docker/roundcube/rootfs/opt/app-root/src/init.sh b/docker/roundcube/rootfs/opt/app-root/src/init.sh index 1d6c5287..e9ab5cbe 100755 --- a/docker/roundcube/rootfs/opt/app-root/src/init.sh +++ b/docker/roundcube/rootfs/opt/app-root/src/init.sh @@ -1,208 +1,213 @@ #!/bin/bash echo "Starting" set -e set -x mkdir -p /data/pgp-home chmod 777 /data/pgp-home pushd /opt/app-root/src/ +if [ -d /src.orig/ ]; then + echo "----> Updating source" + ./update.sh +fi + ## Copy our configs over the default ones cp /opt/app-root/src/roundcubemail-config-templates/* roundcubemail/config/ if [[ "$RUN_MIGRATIONS" == "true" ]]; then # Initialize the db if [[ "$DB_ROOT_PASSWORD" == "" ]]; then echo "Not using password" cat > /tmp/kolab-setup-my.cnf << EOF [client] host=${DB_HOST} user=root EOF else cat > /tmp/kolab-setup-my.cnf << EOF [client] host=${DB_HOST} user=root password=${DB_ROOT_PASSWORD} EOF fi mysql --defaults-file=/tmp/kolab-setup-my.cnf </dev/null 2>&1 || : done fi done popd roundcubemail/bin/initdb.sh --dir syncroton/docs/SQL/ || : roundcubemail/bin/initdb.sh --dir chwala/doc/SQL/ || : echo "Updating tables..." roundcubemail/bin/updatedb.sh --dir syncroton/docs/SQL/ --package syncroton || : roundcubemail/bin/updatedb.sh --dir roundcubemail/SQL/ --package roundcube || : roundcubemail/bin/updatedb.sh --dir roundcubemail/plugins/libkolab/SQL/ --package libkolab || : roundcubemail/bin/updatedb.sh --dir roundcubemail/plugins/kolab-calendar/SQL/ --package calendar-kolab || : fi echo "" echo "Done, starting httpd..." if [ "$1" == "syncroton" ]; then ./update-from-source.sh || : sed -i "s/?>/\$config['activesync_test_username'] = 'john@kolab.org';\n?>/" roundcubemail/config/config.inc.php sed -i "s/?>/\$config['activesync_test_password'] = 'simple123';\n?>/" roundcubemail/config/config.inc.php sed -i "s/?>/\$config['activesync_test_host'] = 'http:\/\/localhost:8001';\n?>/" roundcubemail/config/config.inc.php sed -i -r -e "s/config\['activesync_init_subscriptions'\] =.*$/config['activesync_init_subscriptions'] = 0;/g" roundcubemail/config/kolab_syncroton.inc.php sed -i -r -e "s/config\['activesync_multifolder_blacklist_event'\] =.*$/config['activesync_multifolder_blacklist_event'] = array('windowsoutlook');/g" roundcubemail/config/kolab_syncroton.inc.php sed -i -r -e "s/config\['activesync_multifolder_blacklist_task'\] =.*$/config['activesync_multifolder_blacklist_task'] = array('windowsoutlook');/g" roundcubemail/config/kolab_syncroton.inc.php sed -i -r -e "s/config\['activesync_multifolder_blacklist_contact'\] =.*$/config['activesync_multifolder_blacklist_contact'] = array('windowsoutlook');/g" roundcubemail/config/kolab_syncroton.inc.php pushd syncroton php -S localhost:8001 & pushd tests if [ "$2" == "testsuite" ]; then php \ -dmemory_limit=-1 \ ../vendor/bin/phpunit \ --verbose \ --testsuite Unit php \ -dmemory_limit=-1 \ ../vendor/bin/phpunit \ --verbose \ --testsuite Sync elif [ "$2" == "quicktest" ]; then php \ -dmemory_limit=-1 \ ../vendor/bin/phpunit \ --verbose \ --testsuite Unit elif [ "$2" == "lint" ]; then popd cp ../syncroton.phpstan.neon phpstan.neon php -dmemory_limit=-1 vendor/bin/phpstan elif [ "$2" == "shell" ]; then exec /bin/bash else php \ -dmemory_limit=-1 \ ../vendor/bin/phpunit \ --verbose \ --stop-on-defect \ --stop-on-error \ --stop-on-failure \ "$2" fi elif [ "$1" == "irony" ]; then ./update-from-source.sh || : pushd iRony pushd test if [ "$2" == "testsuite" ]; then php \ -dmemory_limit=-1 \ ../vendor/bin/phpunit \ --verbose elif [ "$2" == "shell" ]; then exec /bin/bash else php \ -dmemory_limit=-1 \ ../vendor/bin/phpunit \ --verbose \ --stop-on-defect \ --stop-on-error \ --stop-on-failure \ "$2" fi elif [ "$1" == "roundcubemail-plugins-kolab" ]; then ./update-from-source.sh || : # We run the tests from the plugins directory, which we don't normally update if [ -d /src.orig/roundcubemail-plugins-kolab ]; then rsync -av \ --no-links \ --exclude=vendor \ --exclude=temp \ --exclude=config \ --exclude=logs \ --exclude=.git \ --exclude=config.inc.php \ --exclude=composer.json \ --exclude=composer.lock \ /src.orig/roundcubemail-plugins-kolab/ /opt/app-root/src/roundcubemail-plugins-kolab fi pushd roundcubemail-plugins-kolab ln -s ../roundcubemail/tests tests ln -s ../roundcubemail/program program if [ "$2" == "testsuite" ]; then #FIXME this doesn't currently work: #* set logging to stdout #* add test configuration #* there's some error about serializing a libcalendaring object to a string? php \ -dmemory_limit=-1 \ ../roundcubemail/vendor/bin/phpunit \ --verbose elif [ "$2" == "lint" ]; then cp ../roundcubemail-plugins-kolab.phpstan.neon phpstan.neon php -dmemory_limit=-1 ../roundcubemail/vendor/bin/phpstan php ../roundcubemail/vendor/bin/php-cs-fixer fix --dry-run --using-cache=no --diff --verbose elif [ "$2" == "shell" ]; then exec /bin/bash else php \ -dmemory_limit=-1 \ ../roundcubemail/vendor/bin/phpunit \ --verbose \ --stop-on-defect \ --stop-on-error \ --stop-on-failure \ "$2" fi elif [ "$1" == "phpstan" ]; then ./update-from-source.sh || : pushd roundcubemail cp /src.orig/roundcubemail-plugins-kolab/phpstan.neon . cp /src.orig/roundcubemail-plugins-kolab/phpstan.bootstrap.php . php -dmemory_limit=-1 vendor/bin/phpstan analyse elif [ "$1" == "shell" ]; then exec /bin/bash else /usr/sbin/php-fpm exec httpd -DFOREGROUND fi diff --git a/docker/roundcube/rootfs/opt/app-root/src/roundcubemail-config-templates/config.inc.php b/docker/roundcube/rootfs/opt/app-root/src/roundcubemail-config-templates/config.inc.php index bf56adc5..1432af7f 100644 --- a/docker/roundcube/rootfs/opt/app-root/src/roundcubemail-config-templates/config.inc.php +++ b/docker/roundcube/rootfs/opt/app-root/src/roundcubemail-config-templates/config.inc.php @@ -1,225 +1,225 @@ 2) { array_shift($components); } $config['session_domain'] = implode('.', $components); $config['des_key'] = getenv('DES_KEY'); $config['username_domain'] = getenv('APP_DOMAIN'); $config['use_secure_urls'] = true; $config['mail_domain'] = ''; // IMAP Server Settings $config['default_host'] = (getenv('IMAP_TLS') == "true" ? "ssl://" : "") . getenv('IMAP_HOST'); $config['default_port'] = getenv('IMAP_PORT'); $config['imap_delimiter'] = '/'; $config['imap_force_lsub'] = true; if (getenv('IMAP_TLS') == "true") { $config['imap_conn_options'] = [ 'ssl' => [ 'verify_peer_name' => false, 'verify_peer' => false, 'allow_self_signed' => true ], 'proxy_protocol' => getenv('IMAP_PROXY_PROTOCOL') ]; } $config['proxy_whitelist'] = getenvlist('PROXY_WHITELIST'); // Caching and storage settings $config['imap_cache'] = 'redis'; $config['imap_cache_ttl'] = '10d'; $config['messages_cache'] = 'db'; // no redis available $config['message_cache_ttl'] = '10d'; $config['session_storage'] = 'redis'; $config['redis_hosts'] = [getenv('REDIS_HOST') . ':6379:3:' . getenv('REDIS_PASSWORD')]; // SMTP Server Settings if (getenv('SUBMISSION_ENCRYPTION') == "starttls") { $config['smtp_server'] = "tls://" . getenv('SUBMISSION_HOST'); } else { $config['smtp_server'] = getenv('SUBMISSION_HOST'); } $config['smtp_port'] = getenv('SUBMISSION_PORT'); $config['smtp_user'] = '%u'; $config['smtp_pass'] = '%p'; $config['smtp_helo_host'] = $_SERVER["HTTP_HOST"] ?? null; if (!empty(getenv('SUBMISSION_ENCRYPTION'))) { $config['smtp_conn_options'] = [ 'ssl' => [ 'verify_peer_name' => false, 'verify_peer' => false, 'allow_self_signed' => true ] ]; } // Kolab specific defaults $config['product_name'] = 'Kolab Groupware'; $config['quota_zero_as_unlimited'] = false; $config['login_lc'] = 2; $config['auto_create_user'] = true; $config['enable_installer'] = false; // The SMTP server does not allow empty identities $config['mdn_use_from'] = true; // Plugins $plugins = [ 'acl', 'archive', 'calendar', 'jqueryui', 'kolab_activesync', 'kolab_addressbook', 'kolab_files', 'managesieve', 'newmail_notifier', 'odfviewer', 'redundant_attachments', 'contextmenu', 'tasklist', 'enigma', ]; if (getenv('KOLABOBJECTS_COMPAT_MODE') == "true") { $plugins[] = 'kolab_config'; $plugins[] = 'kolab_folders'; $plugins[] = 'kolab_notes'; $plugins[] = 'kolab_tags'; // These require ldap // $plugins[] = 'kolab_auth'; // $plugins[] = 'kolab_delegation'; } if ($disabledPlugins = getenvlist('DISABLED_PLUGINS')) { $plugins = array_diff($plugins, $disabledPlugins); } if ($extraPlugins = getenvlist('EXTRA_PLUGINS')) { $plugins = array_merge($plugins, $extraPlugins); } // contextmenu must be after kolab_addressbook (#444) $plugins[] = 'contextmenu'; $config['plugins'] = $plugins; // Do not show deleted messages, mark deleted messages as read, // and flag them as deleted instead of moving them to the Trash // folder. $config['skip_deleted'] = true; $config['read_when_deleted'] = true; $config['flag_for_deletion'] = true; $config['delete_always'] = true; $config['session_lifetime'] = 180; $config['password_charset'] = 'UTF-8'; $config['useragent'] = 'Kolab 16/Roundcube ' . RCUBE_VERSION; $config['message_sort_col'] = 'date'; $config['spellcheck_engine'] = 'pspell'; $config['spellcheck_dictionary'] = true; $config['spellcheck_ignore_caps'] = true; $config['spellcheck_ignore_nums'] = true; $config['spellcheck_ignore_syms'] = true; $config['spellcheck_languages'] = array( 'da' => 'Dansk', 'de' => 'Deutsch', 'en' => 'English', 'es' => 'Español', 'fr' => 'Français', 'it' => 'Italiano', 'nl' => 'Nederlands', 'pt' => 'Português', 'ru' => 'Русский', 'sv' => 'Svenska' ); $config['undo_timeout'] = 10; $config['upload_progress'] = 2; $config['address_template'] = '{street}
{locality} {zipcode}
{country} {region}'; $config['preview_pane'] = true; $config['preview_pane_mark_read'] = 0; $config['autoexpand_threads'] = 2; $config['top_posting'] = 0; $config['sig_above'] = false; $config['mdn_requests'] = 0; $config['mdn_default'] = false; $config['dsn_default'] = false; $config['reply_same_folder'] = false; if (file_exists(RCUBE_CONFIG_DIR . '/' . ($_SERVER["HTTP_HOST"] ?? null) . '/' . basename(__FILE__))) { include_once(RCUBE_CONFIG_DIR . '/' . ($_SERVER["HTTP_HOST"] ?? null) . '/' . basename(__FILE__)); } // Re-apply mandatory settings here. $config['debug_level'] = 1; $config['devel_mode'] = false; $config['log_driver'] = getenv('LOG_DRIVER'); $config['per_user_logging'] = true; $config['log_date_format'] = 'd-M-Y H:i:s,u O'; $config['smtp_log'] = false; $config['log_logins'] = true; $config['log_session'] = false; $config['sql_debug'] = getenv('SQL_DEBUG'); $config['memcache_debug'] = getenv('MEMCACHE_DEBUG'); $config['imap_debug'] = getenv('IMAP_DEBUG'); $config['smtp_debug'] = getenv('SMTP_DEBUG'); $config['dav_debug'] = getenv('DAV_DEBUG'); - $config['skin'] = 'kolab'; + $config['skin'] = getenv('SKIN'); $config['skin_include_php'] = false; $config['mime_magic'] = null; $config['im_identify_path'] = '/usr/bin/identify'; $config['im_convert_path'] = '/usr/bin/convert'; $config['log_dir'] = 'logs/'; #$config['temp_dir'] = '/var/lib/roundcubemail/'; $config['create_default_folders'] = true; // Some additional default folders (archive plugin) $config['archive_mbox'] = 'Archive'; // The Kolab daemon by default creates 'Spam' $config['junk_mbox'] = 'Spam'; // $config['address_book_type'] = 'ldap'; $config['autocomplete_min_length'] = 3; $config['autocomplete_threads'] = 0; $config['autocomplete_max'] = 15; // Disable the default addressbook and use the dav addressbook by default $config['address_book_type'] = ''; $config['autocomplete_single'] = true; $config['htmleditor'] = 0; $config['kolab_http_request'] = Array( 'ssl_verify_host' => false, 'ssl_verify_peer' => false, ); @include('kolab_syncroton.inc.php'); @include('chwala.inc.php'); ?> diff --git a/docker/roundcube/rootfs/opt/app-root/src/update.sh b/docker/roundcube/rootfs/opt/app-root/src/update.sh index 0ab8d09c..45072f9f 100755 --- a/docker/roundcube/rootfs/opt/app-root/src/update.sh +++ b/docker/roundcube/rootfs/opt/app-root/src/update.sh @@ -1,191 +1,194 @@ #!/bin/bash set -e set -x # Look for local repositories for repo in roundcubemail roundcubemail-plugins-kolab roundcubemail-skin-elastic syncroton iRony chwala autoconf freebusy do if [ -d /src.orig/$repo ]; then rsync -av \ --exclude=vendor \ --exclude=temp \ --exclude=logs \ --exclude=composer.lock \ + --exclude=.git \ /src.orig/$repo/ /opt/app-root/src/$repo fi done pushd /opt/app-root/src/ LESSC=/usr/local/bin/lessc -SKINS=(kolab plesk) +if [ "$SKINS" == "" ]; then + SKINS=(kolab plesk) +fi pushd roundcubemail cp /opt/app-root/src/composer.json composer.json php -dmemory_limit=-1 $(command -v composer) update bin/install-jsdeps.sh # May require an "npm install less" and "npm install less-plugin-clean-css" pushd skins/elastic $LESSC -x styles/styles.less > styles/styles.css $LESSC -x styles/print.less > styles/print.css $LESSC -x styles/embed.less > styles/embed.css popd $LESSC --clean-css="--s1 --advanced" --rewrite-urls=all plugins/libkolab/skins/elastic/libkolab.less > plugins/libkolab/skins/elastic/libkolab.min.css bin/updatecss.sh --dir skins/elastic popd # Install skins for skin in "${SKINS[@]}"; do if [ -d "roundcubemail-skin-elastic/$skin" ]; then cp -r "roundcubemail-skin-elastic/$skin" roundcubemail/skins/ else echo "Skin $skin is not available" fi done pushd roundcubemail for skin in $(ls -1d skins/* | grep -vE '(classic|elastic|larry)'); do skin=$(basename $skin) # Copy elastic skin over $skin (but don't overwrite what already existis) find \ ./skins/elastic/ \ ./plugins/libkolab/skins/elastic/ \ -type f | sort | while read file; do target_dir=$(dirname ${file} | sed -e 's|%{datadir}|.|g' -e 's|./public_html/assets/|./|g' -e 's|./public_html/assets/plugins/libkolab/|./|g' -e "s/elastic/$skin/g") file_name=$(basename ${file}) echo "Target: $target_dir, file $file_name" if [ ! -d ${target_dir} ]; then mkdir -p ${target_dir} fi if [ ! -f "${target_dir}/${file_name}" ]; then cp -av "${file}" "${target_dir}" fi done # Replace elastic references, but don't change the depends value in meta.json sed -i -e "s/\"elastic\"/\"$skin\"/g" \ $(find skins/$skin/ plugins/libkolab/skins/$skin/ -type f -not -name "meta.json") pushd skins/$skin $LESSC -x styles/styles.less > styles/styles.css $LESSC -x styles/print.less > styles/print.css $LESSC -x styles/embed.less > styles/embed.css popd $LESSC --clean-css="--s1 --advanced" --rewrite-urls=all plugins/libkolab/skins/$skin/libkolab.less > plugins/libkolab/skins/$skin/libkolab.min.css # Compile and compress the CSS #for file in `find . -type f -name "styles.less" -o -name "print.less" -o -name "embed.less" -o -name "libkolab.less"`; do # %{_bindir}/lessc --relative-urls ${file} > $(dirname ${file})/$(basename ${file} .less).css # # sed -i \ # -e "s|../../../skins/plesk/images/contactpic.png|../../../../skins/plesk/images/contactpic.png|" \ # -e "s|../../../skins/plesk/images/watermark.jpg|../../../../skins/plesk/images/watermark.jpg|" \ # $(dirname ${file})/$(basename ${file} .less).css # # cat $(dirname ${file})/$(basename ${file} .less).css #done bin/updatecss.sh --dir "skins/$skin" done ## Configs # Install plugin configs for plugin in $(find plugins/ -mindepth 1 -maxdepth 1 -type d -exec basename {} \; | sort); do if [ -f "plugins/${plugin}/config.inc.php.dist" ]; then pushd plugins/${plugin} mv config.inc.php.dist ../../config/${plugin}.inc.php rm -f config.inc.php ln -s ../../config/${plugin}.inc.php config.inc.php popd fi done # Copy our configs over the default ones cp /opt/app-root/src/roundcubemail-config-templates/* config/ # Update plugins pushd /opt/app-root/src/roundcubemail-plugins-kolab/plugins for plugin in $(ls -1d) do if [ -d plugins/${plugin}/ ]; then rsync -av \ --exclude=vendor \ --exclude=composer.json \ --exclude=config.inc.php \ $plugin/ /opt/app-root/src/roundcubemail/plugins/$plugin fi done popd # Fix permissions chmod 777 -R logs chmod 777 -R temp popd # Maybe redo this in case of updates # Install chwala pushd chwala rm -f lib/ext/Roundcube lib/drivers/kolab/plugins vendor mkdir -p lib/ext ln -s ../../../roundcubemail/program/lib/Roundcube lib/ext/Roundcube ln -s ../../../../roundcubemail/plugins lib/drivers/kolab/plugins ln -s ../roundcubemail/vendor vendor rm -R config ln -s ../roundcubemail/config config chmod 777 -R cache chmod 777 -R logs popd # Install iRony pushd iRony rm -f lib/FileAPI lib/Roundcube lib/plugins vendor ln -s ../../chwala/lib lib/FileAPI ln -s ../../roundcubemail/program/lib/Roundcube lib/Roundcube ln -s ../../roundcubemail/plugins lib/plugins ln -s ../roundcubemail/vendor vendor rm -R config ln -s ../roundcubemail/config config mkdir -p logs chmod 777 -R logs mkdir -p temp chmod 777 -R temp popd # Install syncroton pushd syncroton rm -f lib/ext/Roundcube lib/plugins vendor mkdir -p lib/ext ln -s ../../../roundcubemail/program/lib/Roundcube lib/ext/Roundcube ln -s ../../roundcubemail/plugins lib/plugins ln -s ../roundcubemail/vendor vendor rm -R config ln -s ../roundcubemail/config config chmod 777 -R logs popd # Install autoconf pushd autoconf rm -f vendor ln -s ../roundcubemail/vendor vendor chmod 777 -R logs popd # Install freebusy pushd freebusy rm -f vendor ln -s ../roundcubemail/vendor vendor mkdir -p logs chmod 777 -R logs popd