Add win_messages + exec script function

This commit is contained in:
Kload 2013-02-26 14:52:13 +01:00
parent 00b19cf1a6
commit 6a100d7ed0

View file

@ -4,6 +4,7 @@ import os
import sys import sys
import json import json
import shutil import shutil
import stat
from yunohost import YunoHostError, YunoHostLDAP, win_msg, random_password from yunohost import YunoHostError, YunoHostLDAP, win_msg, random_password
from yunohost_domain import domain_list, domain_add from yunohost_domain import domain_list, domain_add
@ -150,9 +151,9 @@ def app_install(app, domain, path='/', label=None, public=False, protected=True)
# Check if install from file or git # Check if install from file or git
if "." in app: if "." in app:
manifest = extract_app_tarball(app) manifest = _extract_app_tarball(app)
else: else:
manifest = fetch_app_from_git(app) manifest = _fetch_app_from_git(app)
# TODO: Check if exists another instance # TODO: Check if exists another instance
@ -162,32 +163,38 @@ def app_install(app, domain, path='/', label=None, public=False, protected=True)
except YunoHostError: except YunoHostError:
domain_add([domain]) domain_add([domain])
if 'dependencies' in manifest: install_app_dependencies(manifest['dependencies']) script_var_dict = { 'APP_DIR': app_tmp_folder }
if 'dependencies' in manifest: _install_app_dependencies(manifest['dependencies'])
if 'webapp' in manifest['yunohost']: if 'webapp' in manifest['yunohost']:
if 'db' in manifest['yunohost']['webapp']: if 'db' in manifest['yunohost']['webapp']:
db_user = manifest['yunohost']['uid'] # TODO: app.instance db_user = manifest['yunohost']['uid'] # TODO: app.instance
db_pwd = random_password() db_pwd = random_password()
script_var_dict['DB_USER'] = db_user
script_var_dict['DB_PWD'] = db_pwd
script_var_dict['DB_NAME'] = db_user
init_app_db(db_user, db_pwd, manifest['yunohost']['webapp']['db']) _init_app_db(db_user, db_pwd, manifest['yunohost']['webapp']['db'])
if 'script_path' in manifest['yunohost']:
_exec_app_script(step='install', path=app_tmp_folder +'/'+ manifest['yunohost']['script_path'], var_dict=script_var_dict, app_type=manifest['type'])
# TODO: Copy files to the right place # TODO: Copy files to the right place
# TODO: Exec postinstall script
# TODO: Create appsettings and chmod it # TODO: Create appsettings and chmod it
# TODO: Configure apache/lemon with NPZE's scripts # TODO: Configure apache/lemon with NPZE's scripts
# TODO: Remove scripts folder # TODO: Remove scripts folder and /tmp files
def extract_app_tarball(app): def _extract_app_tarball(path):
""" """
Unzip or untar application tarball in app_tmp_folder Unzip or untar application tarball in app_tmp_folder
Keyword arguments: Keyword arguments:
app -- Path of the tarball path -- Path of the tarball
Returns: Returns:
Dict manifest Dict manifest
@ -195,10 +202,10 @@ def extract_app_tarball(app):
""" """
if os.path.exists(app_tmp_folder): shutil.rmtree(app_tmp_folder) if os.path.exists(app_tmp_folder): shutil.rmtree(app_tmp_folder)
os.makedirs(app_tmp_folder) os.makedirs(app_tmp_folder)
if ".zip" in app: if ".zip" in path:
extract_result = os.system('cd '+ os.getcwd() +' && unzip '+ app +' -d '+ app_tmp_folder) extract_result = os.system('cd '+ os.getcwd() +' && unzip '+ path +' -d '+ app_tmp_folder)
elif ".tar" in app: elif ".tar" in path:
extract_result = os.system('cd '+ os.getcwd() +' && tar -C '+ app_tmp_folder +' -xf '+ app) extract_result = os.system('cd '+ os.getcwd() +' && tar -C '+ app_tmp_folder +' -xf '+ path)
else: else:
extract_result = 1 extract_result = 1
@ -208,10 +215,12 @@ def extract_app_tarball(app):
with open(app_tmp_folder + '/manifest.webapp') as json_manifest: with open(app_tmp_folder + '/manifest.webapp') as json_manifest:
manifest = json.loads(str(json_manifest.read())) manifest = json.loads(str(json_manifest.read()))
win_msg(_("Tarball extracted"))
return manifest return manifest
def fetch_app_from_git(app): def _fetch_app_from_git(app):
""" """
Unzip or untar application tarball in app_tmp_folder Unzip or untar application tarball in app_tmp_folder
@ -240,10 +249,12 @@ def fetch_app_from_git(app):
if not git_result == git_result_2 == 0: if not git_result == git_result_2 == 0:
raise YunoHostError(22, _("Sources fetching failed")) raise YunoHostError(22, _("Sources fetching failed"))
win_msg(_("Repository fetched"))
return app_info['manifest'] return app_info['manifest']
def install_app_dependencies(dep_dict): def _install_app_dependencies(dep_dict):
""" """
Install debian, npm, gem, pip and pear dependencies of the app Install debian, npm, gem, pip and pear dependencies of the app
@ -258,8 +269,10 @@ def install_app_dependencies(dep_dict):
# TODO: Install npm, pip, gem and pear dependencies # TODO: Install npm, pip, gem and pear dependencies
win_msg(_("Dependencies installed"))
def init_app_db(db_user, db_pwd, db_dict):
def _init_app_db(db_user, db_pwd, db_dict):
""" """
Create database and initialize it with optionnal attached script Create database and initialize it with optionnal attached script
@ -280,3 +293,43 @@ def init_app_db(db_user, db_pwd, db_dict):
raise YunoHostError(1, _("MySQL DB init failed")) raise YunoHostError(1, _("MySQL DB init failed"))
# TODO: PgSQL/MongoDB ? # TODO: PgSQL/MongoDB ?
win_msg(_("Database initiliazed"))
def _exec_app_script(step, path, var_dict, app_type):
"""
Execute step user script
Keyword arguments:
step -- Name of the script to call regarding the current step (e.g. install|upgrade|remove|etc.)
path -- Absolute path of the script's directory
var_dict -- Dictionnary of environnement variable to pass to the script
app_type -- Decides whether to execute as root or as yunohost-app user (e.g. web|privileged|certified)
"""
scripts = [ step, step +'.sh', step +'.py' ]
for script in scripts:
script_path = path +'/'+ script
if os.path.exists(script_path):
st = os.stat(script_path)
os.chmod(script_path, st.st_mode | stat.S_IEXEC)
if app_type == 'privileged' or app_type == 'certified':
user = 'root'
else:
user = 'yunohost-app'
os.system('chown -R '+ user +': '+ app_tmp_folder)
env_vars = ''
for key, value in var_dict.items():
env_vars = env_vars + key + "='"+ value +"' "
command = 'su - '+ user +' -c "'+ env_vars +' sh '+ path +'/'+ script +'"'
if os.system(command) == 0:
win_msg(_("Script executed: ") + script)
else:
raise YunoHostError(1, _("Script execution failed: ") + script)
break