mirror of
https://github.com/YunoHost/moulinette.git
synced 2024-09-03 20:06:31 +02:00
Add win_messages + exec script function
This commit is contained in:
parent
00b19cf1a6
commit
6a100d7ed0
1 changed files with 69 additions and 16 deletions
|
@ -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
|
||||||
|
|
Loading…
Add table
Reference in a new issue