Update to seafile server 4.0.6

This commit is contained in:
mbugeia 2015-02-10 14:42:32 +01:00
parent f43c57296c
commit 621f69e3da
9 changed files with 138 additions and 907 deletions

62
conf/install.exp Normal file
View file

@ -0,0 +1,62 @@
#!/usr/bin/expect
set timeout 10
set server_name [lindex $argv 0]
set domain [lindex $argv 1]
set ccnet_port [lindex $argv 2]
set seafile_data [lindex $argv 3]
set seafile_port [lindex $argv 4]
set fileserver_port [lindex $argv 5]
set db_pwd [lindex $argv 6]
spawn /var/www/seafile/seafile-server-4.0.6/setup-seafile-mysql.sh
expect "Press ENTER to continue"
send "\r";
expect "What is the name of the server? It will be displayed on the client."
send "$server_name\r";
expect "What is the ip or domain of the server?"
send "$domain\r";
expect "Which port do you want to use for the ccnet server?"
send "$ccnet_port\r";
expect "Where do you want to put your seafile data?"
send "$seafile_data\r";
expect "Which port do you want to use for the seafile server?"
send "$seafile_port\r";
expect "Which port do you want to use for the seafile fileserver?"
send "$fileserver_port\r";
expect "Use existing ccnet/seafile/seahub databases"
send "2\r";
expect "What is the host of mysql server?"
send "localhost\r";
expect "What is the port of mysql server?"
send "3306\r";
expect "Which mysql user to use for seafile?"
send "seafile\r";
expect "What is the password for mysql user"
send "$db_pwd\r";
expect "Enter the existing database name for ccnet:"
send "ccnetdb\r";
expect "Enter the existing database name for seafile:"
send "seafiledb\r";
expect "Enter the existing database name for seahub:"
send "seahubdb\r";
expect "Press ENTER to continue, or Ctrl-C to abort"
send "\r";
interact

View file

@ -3,7 +3,7 @@ location PATHTOCHANGE {
if ($scheme = http) {
rewrite ^ https://$server_name$request_uri? permanent;
}
client_max_body_size 10G;
client_max_body_size 0;
fastcgi_pass 127.0.0.1:SEAHUB_PORT;
@ -20,22 +20,23 @@ location PATHTOCHANGE {
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
fastcgi_param HTTPS on;
fastcgi_param REMOTE_ADDR $remote_addr;
access_log /var/log/nginx/seahub.access.log;
error_log /var/log/nginx/seahub.error.log;
error_log /var/log/nginx/seahub.error.log;
include conf.d/yunohost_panel.conf.inc;
}
location ~* ^PATHTOCHANGE/media/(.+\.(jpg|jpeg|gif|css|png|js|ico|html|xml|txt|woff|ttf))$ {
root ALIASTOCHANGEseafile-server-latest/;
}
location /seafhttp {
rewrite ^/seafhttp(.*)$ $1 break;
proxy_pass http://127.0.0.1:SEAFILE_FILESERVER_PORT;
client_max_body_size 0;
}
proxy_connect_timeout 36000s;
proxy_read_timeout 36000s;
}
location PATHTOCHANGE/media {
root ALIASTOCHANGEseafile-server-latest/seahub;
}

View file

@ -1,18 +1,19 @@
#!/bin/sh
### BEGIN INIT INFO
# Provides: seafile-server
# Should-Start: seafile-server
# Required-Start: $all
# Required-Stop:
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: start seafile-server at boot time
### END INIT INFO
#
# Change the value of "user" to your linux user name
user=root
# Change the value of "seafile_dir" to your path of seafile installation
### BEGIN INIT INFO
# Provides: seafile-server
# Required-Start: $local_fs $remote_fs $network mysql
# Required-Stop: $local_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Starts Seafile Server
# Description: starts Seafile Server
### END INIT INFO
# Change the value of "user" to your linux user name
user=www-data
# Change the value of "script_path" to your path of seafile installation
seafile_dir=SEAFILE_DIR
script_path=${seafile_dir}/seafile-server-latest
seafile_init_log=${seafile_dir}/logs/seafile.init.log

View file

@ -6,9 +6,9 @@
"fr": "Stockage Cloud Open Source"
},
"developer": {
"name": "ElieSauveterre",
"email": "contact@mikangali.om",
"url": "http://www.mikangali.com/"
"name": "",
"email": "",
"url": ""
},
"multi_instance": "false",
"arguments": {
@ -16,14 +16,16 @@
{
"name": "domain",
"ask": {
"en": "Choose a domain for Seafile"
"en": "Choose a domain for Seafile",
"fr": "Choisissez un domaine pour Seafile"
},
"example": "domain.org"
},
{
"name": "path",
"ask": {
"en": "Choose a path for Seafile"
"en": "Choose a path for Seafile",
"fr": "Choisissez un chemin pour Seafile"
},
"example": "/seafile",
"default": "/seafile"
@ -31,25 +33,12 @@
{
"name": "server_name",
"ask": {
"en": "Choose a name"
"en": "Choose a name",
"fr": "Choisissez un nom"
},
"example": "Seafile",
"default": "Seafile"
},
{
"name": "admin_email",
"ask": {
"en": "Enter an email for the administrator"
},
"example": "homer@domain.com"
},
{
"name": "admin_password",
"ask": {
"en": "Enter a password for the administrator"
},
"example": "**Sup3rS3cr3t**"
},
{
"name": "public_site",
"ask": {

View file

@ -2,12 +2,13 @@
domain=$1
path=$2
server_name=$3
admin_email=$4
admin_password=$5
is_public=$6
is_public=$4
final_path=/var/www/seafile
seafile_data=$final_path/seafile-data
seafile_version=3.1.1
seafile_data=/home/yunohost.app/seafile-data
seafile_version=4.0.6
# Retrieve admin email
admin_email=$(sudo yunohost user info $admin | grep mail: | sed "s/mail: //g")
port=''
findPort () {
@ -31,7 +32,7 @@ if [[ ! $? -eq 0 ]]; then
fi
# Check dependencies
sudo apt-get install -y python2.7 python-setuptools python-simplejson python-imaging python-mysqldb sqlite3
sudo apt-get install -qq python2.7 python-setuptools python-simplejson python-imaging python-mysqldb python-flup expect
# Copy files to the right place
sudo mkdir -p $final_path
@ -51,42 +52,36 @@ findPort 10001
ccnet_port=$port
findPort 12001
seafile_port=$port
findPort 8082
seafile_fileserver_port=$port
findPort 8000
seahub_port=$port
findPort 8082
fileserver_port=$port
# store config in yunohost
sudo yunohost app setting seafile ccnet_port -v $ccnet_port
sudo yunohost app setting seafile seafile_port -v $seafile_port
sudo yunohost app setting seafile seafile_fileserver_port -v $seafile_fileserver_port
sudo yunohost app setting seafile seahub_port -v $seahub_port
sudo yunohost app setting seafile fileserver_port -v $fileserver_port
sudo yunohost app setting seafile is_public -v $is_public
# Modify install script with parameters
sed -i "s@SERVER_NAME@$server_name@g" ../sources/setup-seafile.sh
sed -i "s@DOMAIN@$domain@g" ../sources/setup-seafile.sh
sed -i "s@CCNET_PORT@$ccnet_port@g" ../sources/setup-seafile.sh
sed -i "s@SEAFILE_DATA@$seafile_data@g" ../sources/setup-seafile.sh
sed -i "s@SEAFILE_PORT@$seafile_port@g" ../sources/setup-seafile.sh
sed -i "s@SEAFILE_FILESERVER_PORT@$seafile_fileserver_port@g" ../sources/setup-seafile.sh
sed -i "s/ADMIN_EMAIL/$admin_email/g" ../sources/check_init_admin.py
sed -i "s/ADMIN_PASSWORD/$admin_password/g" ../sources/check_init_admin.py
# init databases
db_user=seafile
db_pwd=$(dd if=/dev/urandom bs=1 count=200 2> /dev/null | tr -c -d 'A-Za-z0-9' | sed -n 's/\(.\{24\}\).*/\1/p')
sudo yunohost app initdb -d ccnetdb -p $db_pwd $db_user
sudo yunohost app initdb -d seafiledb -p $db_pwd $db_user
sudo yunohost app initdb -d seahubdb -p $db_pwd $db_user
# Run install script
sudo cp ../sources/check_init_admin.py $final_path/seafile-server-$seafile_version
sudo cp ../sources/setup-seafile.sh $final_path/seafile-server-$seafile_version
sudo chmod +x $final_path/seafile-server-$seafile_version/setup-seafile.sh
sudo $final_path/seafile-server-$seafile_version/setup-seafile.sh
sudo cp ../conf/install.exp $final_path/seafile-server-$seafile_version
sudo chmod +x $final_path/seafile-server-$seafile_version/install.exp
sudo chmod +x $final_path/seafile-server-$seafile_version/setup-seafile-mysql.sh
sudo $final_path/seafile-server-$seafile_version/install.exp $server_name $domain $ccnet_port $seafile_data $seafile_port $fileserver_port $db_pwd
# Update config
# Update seafile config
sudo sed -i "s@http://@https://@g" $final_path/ccnet/ccnet.conf
sudo sed -i "s@:8000@$path@g" $final_path/ccnet/ccnet.conf
echo 'SERVE_STATIC = False' | sudo tee -a $final_path/seahub_settings.py
echo 'MEDIA_URL = "'$path'/media/"' | sudo tee -a $final_path/seahub_settings.py
echo 'FILE_SERVER_ROOT = "https://'$domain'/seafhttp"' | sudo tee -a $final_path/seahub_settings.py
echo 'SITE_ROOT = "'$path'/"' | sudo tee -a $final_path/seahub_settings.py
echo 'FILE_SERVER_ROOT = "http://'$domain$path'"' | sudo tee -a $final_path/seahub_settings.py
# LDAP configuration
echo '[LDAP]' | sudo tee -a $final_path/ccnet/ccnet.conf
@ -94,40 +89,23 @@ echo 'HOST = ldap://localhost:389' | sudo tee -a $final_path/ccnet/ccnet.conf
echo 'BASE = ou=users,dc=yunohost,dc=org' | sudo tee -a $final_path/ccnet/ccnet.conf
echo 'LOGIN_ATTR = mail' | sudo tee -a $final_path/ccnet/ccnet.conf
# Symlink for media ( because only $path is accessible, not /seahub )
sudo ln -s $final_path/seafile-server-$seafile_version/seahub/media/ $final_path/seafile-server-$seafile_version/seafile/media
# Add Seafile Server to startup
sed -i "s@SEAHUB_PORT@$seahub_port@g" ../conf/seafile-server
sed -i "s@SEAFILE_DIR@$final_path@g" ../conf/seafile-server
sudo cp ../conf/seafile-server /etc/init.d
sudo sed -i "s@SEAHUB_PORT@$seahub_port@g" /etc/init.d/seafile-server
sudo sed -i "s@SEAFILE_DIR@$final_path@g" /etc/init.d/seafile-server
sudo chmod +x /etc/init.d/seafile-server
sudo cp ../conf/seafile-server.conf /etc/init
sudo update-rc.d seafile-server defaults
# Start Seafile Server
sudo $final_path/seafile-server-$seafile_version/seafile.sh start
sudo $final_path/seafile-server-$seafile_version/seahub.sh start-fastcgi $seahub_port
# Modify Nginx configuration file and copy it to Nginx conf directory
sed -i "s@PATHTOCHANGE@$path@g" ../conf/nginx.conf
sed -i "s@ALIASTOCHANGE@$final_path/@g" ../conf/nginx.conf
sed -i "s@SEAHUB_PORT@$seahub_port@g" ../conf/nginx.conf
sed -i "s@SEAFILE_FILESERVER_PORT@$seafile_fileserver_port@g" ../conf/nginx.conf
sed -i "s@SEAFILE_PATH@$final_path@g" ../conf/nginx.conf
sed -i "s@SEAFILE_FILESERVER_PORT@$fileserver_port@g" ../conf/nginx.conf
sudo cp ../conf/nginx.conf /etc/nginx/conf.d/$domain.d/seafile.conf
# Reload Nginx and regenerate SSOwat conf
sudo service nginx reload
sudo yunohost app ssowatconf
# Open port
sudo yunohost firewall allow $ccnet_port
sudo yunohost firewall allow $seafile_port
sudo yunohost firewall allow $seahub_port
if [ "$is_public" = "No" ];
then
@ -136,3 +114,10 @@ then
else
sudo yunohost app setting seafile skipped_uris -v "/"
fi
# Reload Nginx and regenerate SSOwat conf
sudo service nginx reload
sudo yunohost app ssowatconf
# Start Seafile Server
sudo service seafile-server start

View file

@ -1,19 +1,23 @@
#!/bin/bash
domain=$(sudo yunohost app setting seafile domain)
root_pwd=$(sudo cat /etc/yunohost/mysql)
cd /var/www/seafile/seafile-server-*
sudo ./seafile.sh stop
sudo ./seahub.sh stop
sudo service seafile-server stop
sudo rm -rf /var/www/seafile
sudo rm -f /etc/nginx/conf.d/$domain.d/seafile.conf
sudo rm -f /etc/init.d/seafile-server
sudo rm -f /etc/init/seafile-server.conf
sudo rm -rf /home/yunohost.app/seafile-data
# Remove databases
mysql -u root -p$root_pwd -e "DROP DATABASE ccnetdb ; DROP DATABASE seafiledb ; DROP DATABASE seahubdb ; DROP USER seafile@localhost ;"
ccnet_port=$(sudo yunohost app setting seafile ccnet_port)
seafile_port=$(sudo yunohost app setting seafile seafile_port)
seahub_port=$(sudo yunohost app setting seafile seahub_port)
sudo yunohost firewall disallow $ccnet_port
sudo yunohost firewall disallow $seafile_port
sudo yunohost firewall disallow $seahub_port
# Restart services
sudo service nginx reload
sudo yunohost app ssowatconf

View file

@ -1,371 +0,0 @@
#coding: UTF-8
'''This script would check if there is admin, and prompt the user to create a new one if non exist'''
import sys
import os
import time
import re
import shutil
import glob
import subprocess
import hashlib
import getpass
import uuid
import warnings
from ConfigParser import ConfigParser
try:
import readline # pylint: disable=W0611
except ImportError:
pass
SERVER_MANUAL_HTTP = 'https://github.com/haiwen/seafile/wiki'
class Utils(object):
'''Groups all helper functions here'''
@staticmethod
def welcome():
'''Show welcome message'''
welcome_msg = '''\
-----------------------------------------------------------------
This script will guide you to setup your seafile server using MySQL.
Make sure you have read seafile server manual at
%s
Press ENTER to continue
-----------------------------------------------------------------''' % SERVER_MANUAL_HTTP
print welcome_msg
raw_input()
@staticmethod
def highlight(content):
'''Add ANSI color to content to get it highlighted on terminal'''
return '\x1b[33m%s\x1b[m' % content
@staticmethod
def info(msg):
print msg
@staticmethod
def error(msg):
'''Print error and exit'''
print
print 'Error: ' + msg
sys.exit(1)
@staticmethod
def run_argv(argv, cwd=None, env=None, suppress_stdout=False, suppress_stderr=False):
'''Run a program and wait it to finish, and return its exit code. The
standard output of this program is supressed.
'''
with open(os.devnull, 'w') as devnull:
if suppress_stdout:
stdout = devnull
else:
stdout = sys.stdout
if suppress_stderr:
stderr = devnull
else:
stderr = sys.stderr
proc = subprocess.Popen(argv,
cwd=cwd,
stdout=stdout,
stderr=stderr,
env=env)
return proc.wait()
@staticmethod
def run(cmdline, cwd=None, env=None, suppress_stdout=False, suppress_stderr=False):
'''Like run_argv but specify a command line string instead of argv'''
with open(os.devnull, 'w') as devnull:
if suppress_stdout:
stdout = devnull
else:
stdout = sys.stdout
if suppress_stderr:
stderr = devnull
else:
stderr = sys.stderr
proc = subprocess.Popen(cmdline,
cwd=cwd,
stdout=stdout,
stderr=stderr,
env=env,
shell=True)
return proc.wait()
@staticmethod
def prepend_env_value(name, value, env=None, seperator=':'):
'''prepend a new value to a list'''
if env is None:
env = os.environ
try:
current_value = env[name]
except KeyError:
current_value = ''
new_value = value
if current_value:
new_value += seperator + current_value
env[name] = new_value
@staticmethod
def must_mkdir(path):
'''Create a directory, exit on failure'''
try:
os.mkdir(path)
except OSError, e:
Utils.error('failed to create directory %s:%s' % (path, e))
@staticmethod
def must_copy(src, dst):
'''Copy src to dst, exit on failure'''
try:
shutil.copy(src, dst)
except Exception, e:
Utils.error('failed to copy %s to %s: %s' % (src, dst, e))
@staticmethod
def find_in_path(prog):
if 'win32' in sys.platform:
sep = ';'
else:
sep = ':'
dirs = os.environ['PATH'].split(sep)
for d in dirs:
d = d.strip()
if d == '':
continue
path = os.path.join(d, prog)
if os.path.exists(path):
return path
return None
@staticmethod
def get_python_executable():
'''Return the python executable. This should be the PYTHON environment
variable which is set in setup-seafile-mysql.sh
'''
return os.environ['PYTHON']
@staticmethod
def read_config(fn):
'''Return a case sensitive ConfigParser by reading the file "fn"'''
cp = ConfigParser()
cp.optionxform = str
cp.read(fn)
return cp
@staticmethod
def write_config(cp, fn):
'''Return a case sensitive ConfigParser by reading the file "fn"'''
with open(fn, 'w') as fp:
cp.write(fp)
@staticmethod
def ask_question(desc,
key=None,
note=None,
default=None,
validate=None,
yes_or_no=False,
password=False):
'''Ask a question, return the answer.
@desc description, e.g. "What is the port of ccnet?"
@key a name to represent the target of the question, e.g. "port for
ccnet server"
@note additional information for the question, e.g. "Must be a valid
port number"
@default the default value of the question. If the default value is
not None, when the user enter nothing and press [ENTER], the default
value would be returned
@validate a function that takes the user input as the only parameter
and validate it. It should return a validated value, or throws an
"InvalidAnswer" exception if the input is not valid.
@yes_or_no If true, the user must answer "yes" or "no", and a boolean
value would be returned
@password If true, the user input would not be echoed to the
console
'''
assert key or yes_or_no
# Format description
print
if note:
desc += '\n' + note
desc += '\n'
if yes_or_no:
desc += '[ yes or no ]'
else:
if default:
desc += '[ default "%s" ]' % default
else:
desc += '[ %s ]' % key
desc += ' '
while True:
# prompt for user input
if password:
answer = getpass.getpass(desc).strip()
else:
answer = raw_input(desc).strip()
# No user input: use default
if not answer:
if default:
answer = default
else:
continue
# Have user input: validate answer
if yes_or_no:
if answer not in ['yes', 'no']:
print Utils.highlight('\nPlease answer yes or no\n')
continue
else:
return answer == 'yes'
else:
if validate:
try:
return validate(answer)
except InvalidAnswer, e:
print Utils.highlight('\n%s\n' % e)
continue
else:
return answer
@staticmethod
def validate_port(port):
try:
port = int(port)
except ValueError:
raise InvalidAnswer('%s is not a valid port' % Utils.highlight(port))
if port <= 0 or port > 65535:
raise InvalidAnswer('%s is not a valid port' % Utils.highlight(port))
return port
class InvalidAnswer(Exception):
def __init__(self, msg):
Exception.__init__(self)
self.msg = msg
def __str__(self):
return self.msg
### END of Utils
####################
class RPC(object):
def __init__(self):
import ccnet
ccnet_dir = os.environ['CCNET_CONF_DIR']
self.rpc_client = ccnet.CcnetThreadedRpcClient(ccnet.ClientPool(ccnet_dir))
def get_db_email_users(self):
return self.rpc_client.get_emailusers('DB', 0, 1)
def create_admin(self, email, user):
return self.rpc_client.add_emailuser(email, user, 1, 1)
def need_create_admin():
users = rpc.get_db_email_users()
return len(users) == 0
def create_admin(email, passwd):
if rpc.create_admin(email, passwd) < 0:
raise Exception('failed to create admin')
else:
print '\n\n'
print '----------------------------------------'
print 'Successfully created seafile admin'
print '----------------------------------------'
print '\n\n'
def ask_admin_email():
print
print '----------------------------------------'
print 'It\'s the first time you start the seafile server. Now let\'s create the admin account'
print '----------------------------------------'
def validate(email):
# whitespace is not allowed
if re.match(r'[\s]', email):
raise InvalidAnswer('%s is not a valid email address' % Utils.highlight(email))
# must be a valid email address
if not re.match(r'^.+@.*\..+$', email):
raise InvalidAnswer('%s is not a valid email address' % Utils.highlight(email))
return email
key = 'admin email'
question = 'What is the ' + Utils.highlight('email') + ' for the admin account?'
return Utils.ask_question(question,
key=key,
validate=validate)
def ask_admin_password():
def validate(password):
key = 'admin password again'
question = 'Enter the ' + Utils.highlight('password again:')
password_again = Utils.ask_question(question,
key=key,
password=True)
if password_again != password:
raise InvalidAnswer('password mismatch')
return password
key = 'admin password'
question = 'What is the ' + Utils.highlight('password') + ' for the admin account?'
return Utils.ask_question(question,
key=key,
password=True,
validate=validate)
rpc = RPC()
def main():
if not need_create_admin():
return
email = 'ADMIN_EMAIL'
passwd = 'ADMIN_PASSWORD'
create_admin(email, passwd)
if __name__ == '__main__':
try:
main()
except KeyboardInterrupt:
print '\n\n\n'
print Utils.highlight('Aborted.')
print
sys.exit(1)
except Exception, e:
print e
print Utils.highlight('Error happened during creating seafile admin.')
print

View file

@ -1,440 +0,0 @@
#!/bin/bash
SCRIPT=$(readlink -f "$0")
INSTALLPATH=$(dirname "${SCRIPT}")
TOPDIR=$(dirname "${INSTALLPATH}")
default_ccnet_conf_dir=${TOPDIR}/ccnet
default_seafile_data_dir=${TOPDIR}/seafile-data
default_seahub_db=${TOPDIR}/seahub.db
default_conf_dir=${TOPDIR}/conf
export SEAFILE_LD_LIBRARY_PATH=${INSTALLPATH}/seafile/lib/:${INSTALLPATH}/seafile/lib64:${LD_LIBRARY_PATH}
use_existing_ccnet="false"
use_existing_seafile="false"
server_manual_http="https://github.com/haiwen/seafile/wiki"
function welcome () {
echo "-----------------------------------------------------------------"
echo "This script will guide you to config and setup your seafile server."
echo -e "\nMake sure you have read seafile server manual at \n\n\t${server_manual_http}\n"
echo -e "Note: This script will guide your to setup seafile server using sqlite3,"
echo "which may have problems if your disk is on a NFS/CIFS/USB."
echo "In these cases, we sugguest you setup seafile server using MySQL."
echo
}
function err_and_quit () {
printf "\n\n\033[33mError occured during setup. \nPlease fix possible issues and run the script again.\033[m\n\n"
exit 1;
}
function on_ctrl_c_pressed () {
printf "\n\n\033[33mYou have pressed Ctrl-C. Setup is interrupted.\033[m\n\n"
exit 1;
}
# clean newly created ccnet/seafile configs when exit on SIGINT
trap on_ctrl_c_pressed 2
function check_sanity () {
if ! [[ -d ${INSTALLPATH}/seahub && -d ${INSTALLPATH}/seafile \
&& -d ${INSTALLPATH}/runtime ]]; then
echo
echo "The seafile-server diretory doesn't contain all needed files."
echo "Please make sure you have extracted all files and folders from tarball."
err_and_quit;
fi
}
function read_yes_no () {
printf "[yes|no] "
read yesno;
while [[ "${yesno}" != "yes" && "${yesno}" != "no" ]]
do
printf "please answer [yes|no] "
read yesno;
done
if [[ "${yesno}" == "no" ]]; then
return 1;
else
return 0;
fi
}
function check_existing_ccnet () {
if [[ -d ${default_ccnet_conf_dir} ]]; then
echo "It seems that you have created a ccnet configuration before. "
echo "Would you like to use the existing configuration?"
if ! read_yes_no; then
echo
echo "Please remove the existing configuration before continuing."
echo "You can do it by running \"rm -rf ${default_ccnet_conf_dir}\""
echo
exit 1;
else
echo
echo "Existing ccnet configuration is being used."
use_existing_ccnet=true
fi
fi
echo
}
function check_python_executable() {
if [[ "$PYTHON" != "" && -x $PYTHON ]]; then
return 0
fi
if which python2.7 2>/dev/null 1>&2; then
PYTHON=python2.7
elif which python27 2>/dev/null 1>&2; then
PYTHON=python27
elif which python2.6 2>/dev/null 1>&2; then
PYTHON=python2.6
elif which python26 2>/dev/null 1>&2; then
PYTHON=python26
else
echo
echo "Can't find a python executable of version 2.6 or above in PATH"
echo "Please install python 2.6+ before continuing."
echo "If it is installed in a non-standard PATH, please set the PYTHON environment variable"
echo
exit 1
fi
echo "Find python: $PYTHON"
echo
}
function check_python_module () {
module=$1
name=$2
hint=$3
printf " Checking python module: ${name} ... "
if ! $PYTHON -c "import ${module}" 2>/dev/null 1>&2; then
echo
printf "\033[33m ${name} \033[m is not installed, Please install it first.\n"
if [[ "${hint}" != "" ]]; then
printf "${hint}"
echo
fi
err_and_quit;
fi
echo -e "Done."
}
function check_python () {
echo "Checking python on this machine ..."
check_python_executable
if ! which $PYTHON 2>/dev/null 1>&2; then
echo "No $PYTHON found on this machine. Please install it first."
err_and_quit;
else
if ($Python --version 2>&1 | grep "3\\.[0-9].\\.[0-9]") 2>/dev/null 1>&2 ; then
printf "\033[33m Python version 3.x \033[m detected\n"
echo "Python 3.x is not supported. Please use python 2.x."
err_and_quit;
fi
if [[ $PYTHON == "python2.6" ]]; then
py26="2.6"
fi
hint="\nOn Debian/Ubntu: apt-get install python-setuptools\nOn CentOS/RHEL: yum install python${py26}-distribute"
check_python_module pkg_resources setuptools "${hint}"
hint="\nOn Debian/Ubntu: apt-get install python-imaging\nOn CentOS/RHEL: yum install python${py26}-imaging"
check_python_module PIL python-imaging "${hint}"
check_python_module sqlite3 python-sqlite3
fi
echo
}
function check_sqlite3 () {
echo -n "Checking for sqlite3 ..."
if ! which sqlite3 2>/dev/null 1>&2; then
echo -e "\nSqlite3 is not found. install it first.\n"
echo "On Debian/Ubuntu: apt-get install sqlite3"
echo "On CentOS/RHEL: yum install sqlite"
err_and_quit;
fi
printf "Done.\n\n"
}
function check_system_dependency () {
printf "Checking packages needed by seafile ...\n\n"
check_python;
check_sqlite3;
printf "Checking Done.\n\n"
}
function ask_question () {
question=$1
default=$2
key=$3
printf "${question}"
printf "\n"
if [[ "${default}" != "" && "${default}" != "nodefault" ]] ; then
printf "[default: ${default} ] "
elif [[ "${key}" != "" ]]; then
printf "[${key}]: "
fi
}
function gen_seafdav_conf () {
mkdir -p ${default_conf_dir}
seafdav_conf=${default_conf_dir}/seafdav.conf
if ! $(cat > ${seafdav_conf} <<EOF
[WEBDAV]
enabled = false
port = 8080
fastcgi = false
share_name = /
EOF
); then
echo "failed to generate seafdav.conf";
err_and_quit
fi
}
function copy_user_manuals() {
src_docs_dir=${INSTALLPATH}/seafile/docs/
library_template_dir=${seafile_data_dir}/library-template
mkdir -p ${library_template_dir}
cp -f ${src_docs_dir}/*.doc ${library_template_dir}
}
# -------------------------------------------
# Main workflow of this script
# -------------------------------------------
check_sanity;
welcome;
check_system_dependency;
check_existing_ccnet;
if [[ ${use_existing_ccnet} != "true" ]]; then
server_name=SERVER_NAME
ip_or_domain=DOMAIN;
server_port=CCNET_PORT
fi
seafile_data_dir=SEAFILE_DATA
if [[ ${use_existing_seafile} != "true" ]]; then
seafile_server_port=SEAFILE_PORT
fileserver_port=SEAFILE_FILESERVER_PORT
fi
sleep .5
printf "\nThis is your config information:\n\n"
if [[ ${use_existing_ccnet} != "true" ]]; then
printf "server name: \033[33m${server_name}\033[m\n"
printf "server ip/domain: \033[33m${ip_or_domain}\033[m\n"
printf "server port: \033[33m${server_port}\033[m\n"
else
printf "ccnet config: use existing config in \033[33m${default_ccnet_conf_dir}\033[m\n"
fi
if [[ ${use_existing_seafile} != "true" ]]; then
printf "seafile data dir: \033[33m${seafile_data_dir}\033[m\n"
printf "seafile port: \033[33m${seafile_server_port}\033[m\n"
printf "fileserver port: \033[33m${fileserver_port}\033[m\n"
else
printf "seafile data dir: use existing data in \033[33m${seafile_data_dir}\033[m\n"
fi
ccnet_init=${INSTALLPATH}/seafile/bin/ccnet-init
seaf_server_init=${INSTALLPATH}/seafile/bin/seaf-server-init
# -------------------------------------------
# Create ccnet conf
# -------------------------------------------
if [[ "${use_existing_ccnet}" != "true" ]]; then
echo "Generating ccnet configuration in ${default_ccnet_conf_dir}..."
echo
if ! LD_LIBRARY_PATH=$SEAFILE_LD_LIBRARY_PATH "${ccnet_init}" -c "${default_ccnet_conf_dir}" --name "${server_name}" --port "${server_port}" --host "${ip_or_domain}"; then
err_and_quit;
fi
echo
fi
sleep 0.5
# -------------------------------------------
# Create seafile conf
# -------------------------------------------
if [[ "${use_existing_seafile}" != "true" ]]; then
echo "Generating seafile configuration in ${seafile_data_dir} ..."
echo
if ! LD_LIBRARY_PATH=$SEAFILE_LD_LIBRARY_PATH ${seaf_server_init} --seafile-dir "${seafile_data_dir}" \
--port ${seafile_server_port} --fileserver-port ${fileserver_port}; then
echo "Failed to generate seafile configuration"
err_and_quit;
fi
echo
fi
# -------------------------------------------
# Write seafile.ini
# -------------------------------------------
echo "${seafile_data_dir}" > "${default_ccnet_conf_dir}/seafile.ini"
# -------------------------------------------
# Generate seafevents.conf
# -------------------------------------------
gen_seafdav_conf;
# -------------------------------------------
# generate seahub/settings.py
# -------------------------------------------
dest_settings_py=${TOPDIR}/seahub_settings.py
seahub_secret_keygen=${INSTALLPATH}/seahub/tools/secret_key_generator.py
if [[ ! -f ${dest_settings_py} ]]; then
echo -n "SECRET_KEY = " >> "${dest_settings_py}"
key=$($PYTHON "${seahub_secret_keygen}")
echo "\"${key}\"" >> "${dest_settings_py}"
fi
# -------------------------------------------
# Seahub related config
# -------------------------------------------
echo "-----------------------------------------------------------------"
echo "Seahub is the web interface for seafile server."
echo "Now let's setup seahub configuration. Press [ENTER] to continue"
echo "-----------------------------------------------------------------"
echo
# echo "Please specify the email address and password for the seahub administrator."
# echo "You can use them to login as admin on your seahub website."
# echo
function get_seahub_admin_email () {
question="Please specify the email address for the seahub administrator:"
ask_question "${question}" "nodefault" "seahub admin email"
read seahub_admin_email
if [[ "${seahub_admin_email}" == "" ]]; then
echo "Seahub admin user name cannot be empty."
get_seahub_admin_email;
elif [[ ! ${seahub_admin_email} =~ ^.+@.*\..+$ ]]; then
echo "${seahub_admin_email} is not a valid email address"
get_seahub_admin_email;
fi
}
function get_seahub_admin_passwd () {
echo
question="Please specify the password you would like to use for seahub administrator:"
ask_question "${question}" "nodefault" "seahub admin password"
read -s seahub_admin_passwd
echo
question="Please enter the password again:"
ask_question "${question}" "nodefault" "seahub admin password again"
read -s seahub_admin_passwd_again
echo
if [[ "${seahub_admin_passwd}" != "${seahub_admin_passwd_again}" ]]; then
printf "\033[33mThe passwords didn't match.\033[m"
get_seahub_admin_passwd;
elif [[ "${seahub_admin_passwd}" == "" ]]; then
echo "Password cannot be empty."
get_seahub_admin_passwd;
fi
}
echo "Creating seahub database now... "
echo
export CCNET_CONF_DIR=$default_ccnet_conf_dir
export SEAFILE_CONF_DIR=$seafile_data_dir
export PYTHONPATH=${INSTALLPATH}/seafile/lib/python2.6/site-packages:${INSTALLPATH}/seafile/lib64/python2.6/site-packages:${INSTALLPATH}/seahub/thirdpart:$PYTHONPATH
export PYTHONPATH=${INSTALLPATH}/seafile/lib/python2.7/site-packages:${INSTALLPATH}/seafile/lib64/python2.7/site-packages:$PYTHONPATH
manage_py=${INSTALLPATH}/seahub/manage.py
pushd "${INSTALLPATH}/seahub" 2>/dev/null 1>&2
if ! $PYTHON manage.py syncdb; then
popd 2>/dev/null 1>&2
echo "Failed to sync seahub database."
err_and_quit;
fi
popd 2>/dev/null 1>&2
echo
echo "Done."
# prepare avatar folder
media_dir=${INSTALLPATH}/seahub/media
orig_avatar_dir=${INSTALLPATH}/seahub/media/avatars
dest_avatar_dir=${TOPDIR}/seahub-data/avatars
if [[ ! -d ${dest_avatar_dir} ]]; then
mkdir -p "${TOPDIR}/seahub-data"
mv "${orig_avatar_dir}" "${dest_avatar_dir}"
ln -s ../../../seahub-data/avatars ${media_dir}
fi
# Make a seafile-server symlink, like this:
# /data/haiwen/
# -- seafile-server-2.0.4
# -- seafile-server-latest # symlink to 2.0.4
seafile_server_symlink=${TOPDIR}/seafile-server-latest
echo
echo -n "creating seafile-server-latest symbolic link ... "
if ! ln -s $(basename ${INSTALLPATH}) ${seafile_server_symlink}; then
echo
echo
echo "Failed to create symbolic link ${seafile_server_symlink}"
err_and_quit;
fi
echo "done"
echo
# -------------------------------------------
# copy user manuals to library template
# -------------------------------------------
copy_user_manuals;
# -------------------------------------------
# final message
# -------------------------------------------
sleep 1
echo
echo "-----------------------------------------------------------------"
echo "Your seafile server configuration has been completed successfully."
echo "-----------------------------------------------------------------"
echo
echo "run seafile server: ./seafile.sh { start | stop | restart }"
echo "run seahub server: ./seahub.sh { start <port> | stop | restart <port> }"
echo
echo "-----------------------------------------------------------------"
echo "If the server is behind a firewall, remember to open these tcp ports:"
echo "-----------------------------------------------------------------"
echo
echo "port of ccnet server: ${server_port}"
echo "port of seafile server: ${seafile_server_port}"
echo "port of seafile fileserver: ${fileserver_port}"
echo "port of seahub: 8000"
echo
echo -e "When problems occur, refer to\n"
echo -e " ${server_manual_http}\n"
echo "for more information."
echo