1
0
Fork 0
mirror of https://github.com/YunoHost-Apps/weblate_ynh.git synced 2024-10-01 13:35:04 +02:00

Merge pull request #10 from YunoHost-Apps/testing

Upgrade to 2.20, thank you @alexAubin
This commit is contained in:
Jean-Baptiste 2018-05-18 21:44:20 +02:00 committed by GitHub
commit 5e08f2dc7f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
19 changed files with 1137 additions and 196 deletions

View file

@ -13,6 +13,10 @@ An admin user is created at installation, the login is what you provided at inst
You'll need to give weblate a github user and a token. Please read [github's documentation about token](https://help.github.com/articles/creating-a-personal-access-token-for-the-command-line/). You'll need to give weblate a github user and a token. Please read [github's documentation about token](https://help.github.com/articles/creating-a-personal-access-token-for-the-command-line/).
This user will only be used to open the pull-request, each translation keep his author. This user will only be used to open the pull-request, each translation keep his author.
**Careful**, I still have to understand why, but you'll have to **manually** move your hub binary frile from /var/www/$app/bin/ to /usr/bin to enable pull request on github. I'm close to fix this.
**SSH keys**, you'll have to go in administration, and generate a public key for weblate and add github.com so weblate knows the fingerprint. Please note if your account already have a public key (ssh-rsa), you'll have to manually add the weblate's one to your github account.
## Settings and upgrades ## Settings and upgrades
Almost everything related to Weblate's configuration is handled in a `settings.py` file. Almost everything related to Weblate's configuration is handled in a `settings.py` file.

View file

@ -11,7 +11,6 @@
is_public=1 (PUBLIC|public=1|private=0) is_public=1 (PUBLIC|public=1|private=0)
github_account="myaccount" github_account="myaccount"
github_token="myoauthtoken" github_token="myoauthtoken"
password="pass"
; Checks ; Checks
pkg_linter=1 pkg_linter=1
setup_sub_dir=1 setup_sub_dir=1
@ -20,6 +19,8 @@
setup_private=1 setup_private=1
setup_public=1 setup_public=1
upgrade=1 upgrade=1
# latest published in community.json
upgrade=1 from_commit=dc037965b0fbc1bd59d352c4d2b71a97b1e4768f
backup_restore=1 backup_restore=1
multi_instance=1 multi_instance=1
incorrect_path=1 incorrect_path=1
@ -41,3 +42,7 @@
;;; Options ;;; Options
Email=jean-baptiste@holcroft.fr Email=jean-baptiste@holcroft.fr
Notification=all Notification=all
;;; Upgrade options
; commit=dc037965b0fbc1bd59d352c4d2b71a97b1e4768f
name=Upgrade from 2.17.1
manifest_arg=domain=DOMAIN&path=PATH&admin=USER&is_public=1&github_account=fake&github_token=fake

View file

@ -6,33 +6,31 @@ location __PATH__ {
include uwsgi_params; include uwsgi_params;
# Needed for long running operations in admin interface # Needed for long running operations in admin interface
uwsgi_read_timeout 3600; uwsgi_read_timeout 3600;
uwsgi_param SCRIPT_NAME __PATH__; uwsgi_pass unix:///var/run/uwsgi/__NAME__.socket;
uwsgi_modifier1 30;
uwsgi_pass unix://__FINALPATH__/socket;
# Include SSOWAT user panel. # Include SSOWAT user panel.
include conf.d/yunohost_panel.conf.inc; include conf.d/yunohost_panel.conf.inc;
} }
location __PATH__/favicon.ico { location ^__PATH__/favicon.ico$ {
# DATA_DIR/static/favicon.ico # DATA_DIR/static/favicon.ico
alias __FINALPATH__/data/static/favicon.ico; alias __FINALPATH__/data/static/favicon.ico;
expires 30d; expires 30d;
} }
location __PATH__/robots.txt { location ^__PATH__/robots.txt$ {
# DATA_DIR/static/robots.txt # DATA_DIR/static/robots.txt
alias __FINALPATH__/data/static/robots.txt; alias __FINALPATH__/data/static/robots.txt;
expires 30d; expires 30d;
} }
location __PATH__/static { location __PATH__/static/ {
# DATA_DIR/static/ # DATA_DIR/static/
alias __FINALPATH__/data/static/; alias __FINALPATH__/data/static/;
expires 30d; expires 30d;
} }
location __PATH__/media { location __PATH__/media/ {
# DATA_DIR/media/ # DATA_DIR/media/
alias __FINALPATH__/data/media/; alias __FINALPATH__/data/media/;
expires 30d; expires 30d;

View file

@ -165,6 +165,9 @@ SECRET_KEY = '__KEY__' # noqa
TEMPLATES = [ TEMPLATES = [
{ {
'BACKEND': 'django.template.backends.django.DjangoTemplates', 'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [
os.path.join(BASE_DIR, 'templates'),
],
'OPTIONS': { 'OPTIONS': {
'context_processors': [ 'context_processors': [
'django.contrib.auth.context_processors.auth', 'django.contrib.auth.context_processors.auth',
@ -310,7 +313,8 @@ AUTH_PASSWORD_VALIDATORS = [
] ]
# Middleware # Middleware
MIDDLEWARE_CLASSES = ( MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware', 'django.middleware.common.CommonMiddleware',
'django.middleware.locale.LocaleMiddleware', 'django.middleware.locale.LocaleMiddleware',
@ -321,7 +325,7 @@ MIDDLEWARE_CLASSES = (
'social_django.middleware.SocialAuthExceptionMiddleware', 'social_django.middleware.SocialAuthExceptionMiddleware',
'weblate.accounts.middleware.RequireLoginMiddleware', 'weblate.accounts.middleware.RequireLoginMiddleware',
'weblate.middleware.SecurityMiddleware', 'weblate.middleware.SecurityMiddleware',
) ]
ROOT_URLCONF = 'weblate.urls' ROOT_URLCONF = 'weblate.urls'
@ -371,7 +375,10 @@ DEFAULT_EXCEPTION_REPORTER_FILTER = \
HAVE_SYSLOG = False HAVE_SYSLOG = False
if platform.system() != 'Windows': if platform.system() != 'Windows':
try: try:
SysLogHandler(address='/dev/log', facility=SysLogHandler.LOG_LOCAL2) handler = SysLogHandler(
address='/dev/log', facility=SysLogHandler.LOG_LOCAL2
)
handler.close()
HAVE_SYSLOG = True HAVE_SYSLOG = True
except IOError: except IOError:
HAVE_SYSLOG = False HAVE_SYSLOG = False
@ -560,8 +567,6 @@ EMAIL_SEND_HTML = True
# Subject of emails includes site title # Subject of emails includes site title
EMAIL_SUBJECT_PREFIX = '[{0}] '.format(SITE_TITLE) EMAIL_SUBJECT_PREFIX = '[{0}] '.format(SITE_TITLE)
EMAIL_BACKEND = 'django_sendmail_backend.backends.EmailBackend'
# Enable remote hooks # Enable remote hooks
ENABLE_HOOKS = True ENABLE_HOOKS = True
@ -577,11 +582,6 @@ LAZY_COMMITS = True
# Offload indexing # Offload indexing
OFFLOAD_INDEXING = True OFFLOAD_INDEXING = True
# Translation locking
AUTO_LOCK = True
AUTO_LOCK_TIME = 60
LOCK_TIME = 15 * 60
# Use simple language codes for default language/country combinations # Use simple language codes for default language/country combinations
SIMPLIFY_LANGUAGES = True SIMPLIFY_LANGUAGES = True

View file

@ -0,0 +1,754 @@
# -*- coding: utf-8 -*-
#
# Copyright © 2012 - 2018 Michal Čihař <michal@cihar.com>
#
# This file is part of Weblate <https://weblate.org/>
#
# This program 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
# (at your option) any later version.
#
# This program 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 this program. If not, see <https://www.gnu.org/licenses/>.
#
from __future__ import unicode_literals
import platform
import os
from logging.handlers import SysLogHandler
#
# Django settings for Weblate project.
#
DEBUG = False
ADMINS = (
('__ADMIN__', '__ADMINMAIL__'),
)
MANAGERS = ADMINS
DATABASES = {
'default': {
# Database engine
'ENGINE': 'django.db.backends.postgresql_psycopg2',
# Database name
'NAME': '__NAME__',
# Database user
'USER': '__NAME__',
# Database password
'PASSWORD': '__DB_PWD__',
# Set to empty string for localhost
'HOST': 'localhost',
# Set to empty string for default
'PORT': '5432',
}
}
BASE_DIR = '__FINALPATH__'
# Data directory
DATA_DIR = os.path.join(BASE_DIR, 'data')
# Local time zone for this installation. Choices can be found here:
# http://en.wikipedia.org/wiki/List_of_tz_zones_by_name
# although not all choices may be available on all operating systems.
# In a Windows environment this must be set to your system time zone.
TIME_ZONE = 'UTC'
# Language code for this installation. All choices can be found here:
# http://www.i18nguy.com/unicode/language-identifiers.html
LANGUAGE_CODE = 'en-us'
LANGUAGES = (
('ar', 'العربية'),
('az', 'Azərbaycan'),
('be', 'Беларуская'),
('be@latin', 'Biełaruskaja'),
('bg', 'Български'),
('br', 'Brezhoneg'),
('ca', 'Català'),
('cs', 'Čeština'),
('da', 'Dansk'),
('de', 'Deutsch'),
('en', 'English'),
('en-gb', 'English (United Kingdom)'),
('el', 'Ελληνικά'),
('es', 'Español'),
('fi', 'Suomi'),
('fr', 'Français'),
('fy', 'Frysk'),
('gl', 'Galego'),
('he', 'עברית'),
('hu', 'Magyar'),
('id', 'Indonesia'),
('it', 'Italiano'),
('ja', '日本語'),
('ko', '한국어'),
('ksh', 'Kölsch'),
('nb', 'Norsk bokmål'),
('nl', 'Nederlands'),
('pl', 'Polski'),
('pt', 'Português'),
('pt-br', 'Português brasileiro'),
('ru', 'Русский'),
('sk', 'Slovenčina'),
('sl', 'Slovenščina'),
('sr', 'Српски'),
('sv', 'Svenska'),
('tr', 'Türkçe'),
('uk', 'Українська'),
('zh-hans', '简体字'),
('zh-hant', '正體字'),
)
SITE_ID = 1
# If you set this to False, Django will make some optimizations so as not
# to load the internationalization machinery.
USE_I18N = True
# If you set this to False, Django will not format dates, numbers and
# calendars according to the current locale.
USE_L10N = True
# If you set this to False, Django will not use timezone-aware datetimes.
USE_TZ = True
# URL prefix to use, please see documentation for more details
URL_PREFIX = '__PATHURL__'
# Absolute filesystem path to the directory that will hold user-uploaded files.
# Example: "/home/media/media.lawrence.com/media/"
MEDIA_ROOT = os.path.join(DATA_DIR, 'media')
# URL that handles the media served from MEDIA_ROOT. Make sure to use a
# trailing slash.
# Examples: "http://media.lawrence.com/media/", "http://example.com/media/"
MEDIA_URL = '{0}/media/'.format(URL_PREFIX)
# Absolute path to the directory static files should be collected to.
# Don't put anything in this directory yourself; store your static files
# in apps' "static/" subdirectories and in STATICFILES_DIRS.
# Example: "/home/media/media.lawrence.com/static/"
STATIC_ROOT = os.path.join(DATA_DIR, 'static')
# URL prefix for static files.
# Example: "http://media.lawrence.com/static/"
STATIC_URL = '{0}/static/'.format(URL_PREFIX)
# Additional locations of static files
STATICFILES_DIRS = (
# Put strings here, like "/home/html/static" or "C:/www/django/static".
# Always use forward slashes, even on Windows.
# Don't forget to use absolute paths, not relative paths.
)
# List of finder classes that know how to find static files in
# various locations.
STATICFILES_FINDERS = (
'django.contrib.staticfiles.finders.FileSystemFinder',
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
'compressor.finders.CompressorFinder',
)
# Make this unique, and don't share it with anybody.
# You can generate it using examples/generate-secret-key
SECRET_KEY = '__KEY__' # noqa
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [
os.path.join(BASE_DIR, 'weblate', 'templates'),
],
'OPTIONS': {
'context_processors': [
'django.contrib.auth.context_processors.auth',
'django.template.context_processors.debug',
'django.template.context_processors.i18n',
'django.template.context_processors.request',
'django.template.context_processors.csrf',
'django.contrib.messages.context_processors.messages',
'weblate.trans.context_processors.weblate_context',
],
'loaders': [
('django.template.loaders.cached.Loader', [
'django.template.loaders.filesystem.Loader',
'django.template.loaders.app_directories.Loader',
]),
],
},
},
]
# GitHub username for sending pull requests.
# Please see the documentation for more details.
GITHUB_USERNAME = "__GITHUBUSER__"
# Authentication configuration
AUTHENTICATION_BACKENDS = (
'social_core.backends.email.EmailAuth',
# 'social_core.backends.google.GoogleOAuth2',
# 'social_core.backends.github.GithubOAuth2',
# 'social_core.backends.bitbucket.BitbucketOAuth',
'social_core.backends.suse.OpenSUSEOpenId',
'social_core.backends.ubuntu.UbuntuOpenId',
'social_core.backends.fedora.FedoraOpenId',
# 'social_core.backends.facebook.FacebookOAuth2',
'weblate.accounts.auth.WeblateUserBackend',
)
# Social auth backends setup
SOCIAL_AUTH_GITHUB_KEY = ''
SOCIAL_AUTH_GITHUB_SECRET = ''
SOCIAL_AUTH_GITHUB_SCOPE = ['user:email']
SOCIAL_AUTH_BITBUCKET_KEY = ''
SOCIAL_AUTH_BITBUCKET_SECRET = ''
SOCIAL_AUTH_BITBUCKET_VERIFIED_EMAILS_ONLY = True
SOCIAL_AUTH_FACEBOOK_KEY = ''
SOCIAL_AUTH_FACEBOOK_SECRET = ''
SOCIAL_AUTH_FACEBOOK_SCOPE = ['email', 'public_profile']
SOCIAL_AUTH_GOOGLE_OAUTH2_KEY = ''
SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET = ''
# Social auth settings
SOCIAL_AUTH_PIPELINE = (
'social_core.pipeline.social_auth.social_details',
'social_core.pipeline.social_auth.social_uid',
'social_core.pipeline.social_auth.auth_allowed',
'social_core.pipeline.social_auth.social_user',
'weblate.accounts.pipeline.store_params',
'weblate.accounts.pipeline.verify_open',
'social_core.pipeline.user.get_username',
'weblate.accounts.pipeline.require_email',
'social_core.pipeline.mail.mail_validation',
'weblate.accounts.pipeline.revoke_mail_code',
'weblate.accounts.pipeline.ensure_valid',
'weblate.accounts.pipeline.remove_account',
'social_core.pipeline.social_auth.associate_by_email',
'weblate.accounts.pipeline.reauthenticate',
'weblate.accounts.pipeline.verify_username',
'social_core.pipeline.user.create_user',
'social_core.pipeline.social_auth.associate_user',
'social_core.pipeline.social_auth.load_extra_data',
'weblate.accounts.pipeline.cleanup_next',
'weblate.accounts.pipeline.user_full_name',
'weblate.accounts.pipeline.store_email',
'weblate.accounts.pipeline.notify_connect',
'weblate.accounts.pipeline.password_reset',
)
SOCIAL_AUTH_DISCONNECT_PIPELINE = (
'social_core.pipeline.disconnect.allowed_to_disconnect',
'social_core.pipeline.disconnect.get_entries',
'social_core.pipeline.disconnect.revoke_tokens',
'weblate.accounts.pipeline.cycle_session',
'weblate.accounts.pipeline.adjust_primary_mail',
'weblate.accounts.pipeline.notify_disconnect',
'social_core.pipeline.disconnect.disconnect',
'weblate.accounts.pipeline.cleanup_next',
)
# Custom authentication strategy
SOCIAL_AUTH_STRATEGY = 'weblate.accounts.strategy.WeblateStrategy'
# Raise exceptions so that we can handle them later
SOCIAL_AUTH_RAISE_EXCEPTIONS = True
SOCIAL_AUTH_EMAIL_VALIDATION_FUNCTION = \
'weblate.accounts.pipeline.send_validation'
SOCIAL_AUTH_EMAIL_VALIDATION_URL = \
'{0}/accounts/email-sent/'.format(URL_PREFIX)
SOCIAL_AUTH_LOGIN_ERROR_URL = \
'{0}/accounts/login/'.format(URL_PREFIX)
SOCIAL_AUTH_EMAIL_FORM_URL = \
'{0}/accounts/email/'.format(URL_PREFIX)
SOCIAL_AUTH_NEW_ASSOCIATION_REDIRECT_URL = \
'{0}/accounts/profile/#auth'.format(URL_PREFIX)
SOCIAL_AUTH_PROTECTED_USER_FIELDS = ('email',)
SOCIAL_AUTH_SLUGIFY_USERNAMES = True
SOCIAL_AUTH_SLUGIFY_FUNCTION = 'weblate.accounts.pipeline.slugify_username'
# Password validation configuration
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
'OPTIONS': {
'min_length': 6,
}
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
{
'NAME': 'weblate.accounts.password_validation.CharsPasswordValidator',
},
{
'NAME': 'weblate.accounts.password_validation.PastPasswordsValidator',
},
# Optional password strength validation by django-zxcvbn-password
# {
# 'NAME': 'zxcvbn_password.ZXCVBNValidator',
# 'OPTIONS': {
# 'min_score': 3,
# 'user_attributes': ('username', 'email', 'first_name')
# }
# },
]
# Middleware
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.locale.LocaleMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'weblate.accounts.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'social_django.middleware.SocialAuthExceptionMiddleware',
'weblate.accounts.middleware.RequireLoginMiddleware',
'weblate.middleware.SecurityMiddleware',
'weblate.wladmin.middleware.ConfigurationErrorsMiddleware',
]
ROOT_URLCONF = 'weblate.urls'
# Django and Weblate apps
INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.admin.apps.SimpleAdminConfig',
'django.contrib.admindocs',
'django.contrib.sitemaps',
'social_django',
'crispy_forms',
'compressor',
'rest_framework',
'rest_framework.authtoken',
'weblate.addons',
'weblate.trans',
'weblate.lang',
'weblate.langdata',
'weblate.memory',
'weblate.permissions',
'weblate.screenshots',
'weblate.accounts',
'weblate.utils',
'weblate.wladmin',
'weblate',
# Optional: Git exporter
# 'weblate.gitexport',
)
# Path to locales
LOCALE_PATHS = (os.path.join(BASE_DIR, 'weblate', 'locale'), )
# Custom exception reporter to include some details
DEFAULT_EXCEPTION_REPORTER_FILTER = \
'weblate.trans.debug.WeblateExceptionReporterFilter'
# Default logging of Weblate messages
# - to syslog in production (if available)
# - otherwise to console
# - you can also choose 'logfile' to log into separate file
# after configuring it below
# Detect if we can connect to syslog
HAVE_SYSLOG = False
if platform.system() != 'Windows':
try:
handler = SysLogHandler(
address='/dev/log', facility=SysLogHandler.LOG_LOCAL2
)
handler.close()
HAVE_SYSLOG = True
except IOError:
HAVE_SYSLOG = False
if DEBUG or not HAVE_SYSLOG:
DEFAULT_LOG = 'console'
else:
DEFAULT_LOG = 'syslog'
# A sample logging configuration. The only tangible logging
# performed by this configuration is to send an email to
# the site admins on every HTTP 500 error when DEBUG=False.
# See http://docs.djangoproject.com/en/stable/topics/logging for
# more details on how to customize your logging configuration.
LOGGING = {
'version': 1,
'disable_existing_loggers': True,
'filters': {
'require_debug_false': {
'()': 'django.utils.log.RequireDebugFalse'
}
},
'formatters': {
'syslog': {
'format': 'weblate[%(process)d]: %(levelname)s %(message)s'
},
'simple': {
'format': '%(levelname)s %(message)s'
},
'logfile': {
'format': '%(asctime)s %(levelname)s %(message)s'
},
'django.server': {
'()': 'django.utils.log.ServerFormatter',
'format': '[%(server_time)s] %(message)s',
}
},
'handlers': {
'mail_admins': {
'level': 'ERROR',
'filters': ['require_debug_false'],
'class': 'django.utils.log.AdminEmailHandler',
'include_html': True,
},
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler',
'formatter': 'simple'
},
'django.server': {
'level': 'INFO',
'class': 'logging.StreamHandler',
'formatter': 'django.server',
},
'syslog': {
'level': 'DEBUG',
'class': 'logging.handlers.SysLogHandler',
'formatter': 'syslog',
'address': '/dev/log',
'facility': SysLogHandler.LOG_LOCAL2,
},
# Logging to a file
# 'logfile': {
# 'level':'DEBUG',
# 'class':'logging.handlers.RotatingFileHandler',
# 'filename': "/var/log/weblate/weblate.log",
# 'maxBytes': 100000,
# 'backupCount': 3,
# 'formatter': 'logfile',
# },
},
'loggers': {
'django.request': {
'handlers': ['mail_admins', DEFAULT_LOG],
'level': 'ERROR',
'propagate': True,
},
'django.server': {
'handlers': ['django.server'],
'level': 'INFO',
'propagate': False,
},
# Logging database queries
# 'django.db.backends': {
# 'handlers': [DEFAULT_LOG],
# 'level': 'DEBUG',
# },
'weblate': {
'handlers': [DEFAULT_LOG],
'level': 'DEBUG',
},
# Logging VCS operations
# 'weblate-vcs': {
# 'handlers': [DEFAULT_LOG],
# 'level': 'DEBUG',
# },
# Python Social Auth logging
# 'social': {
# 'handlers': [DEFAULT_LOG],
# 'level': 'DEBUG',
# },
}
}
# Logging of management commands to console
if (os.environ.get('DJANGO_IS_MANAGEMENT_COMMAND', False) and
'console' not in LOGGING['loggers']['weblate']['handlers']):
LOGGING['loggers']['weblate']['handlers'].append('console')
# Remove syslog setup if it's not present
if not HAVE_SYSLOG:
del LOGGING['handlers']['syslog']
# List of machine translations
# MACHINE_TRANSLATION_SERVICES = (
# 'weblate.trans.machine.apertium.ApertiumAPYTranslation',
# 'weblate.trans.machine.deepl.DeepLTranslation',
# 'weblate.trans.machine.glosbe.GlosbeTranslation',
# 'weblate.trans.machine.google.GoogleTranslation',
# 'weblate.trans.machine.microsoft.MicrosoftCognitiveTranslation',
# 'weblate.trans.machine.mymemory.MyMemoryTranslation',
# 'weblate.trans.machine.tmserver.AmagamaTranslation',
# 'weblate.trans.machine.tmserver.TMServerTranslation',
# 'weblate.trans.machine.yandex.YandexTranslation',
# 'weblate.trans.machine.weblatetm.WeblateTranslation',
# 'weblate.trans.machine.saptranslationhub.SAPTranslationHub',
# 'weblate.memory.machine.WeblateMemory',
# )
# Machine translation API keys
# URL of the Apertium APy server
MT_APERTIUM_APY = None
# DeepL API key
MT_DEEPL_KEY = None
# Microsoft Cognitive Services Translator API, register at
# https://portal.azure.com/
MT_MICROSOFT_COGNITIVE_KEY = None
# MyMemory identification email, see
# https://mymemory.translated.net/doc/spec.php
MT_MYMEMORY_EMAIL = None
# Optional MyMemory credentials to access private translation memory
MT_MYMEMORY_USER = None
MT_MYMEMORY_KEY = None
# Google API key for Google Translate API
MT_GOOGLE_KEY = None
# API key for Yandex Translate API
MT_YANDEX_KEY = None
# tmserver URL
MT_TMSERVER = None
# SAP Translation Hub
MT_SAP_BASE_URL = None
MT_SAP_SANDBOX_APIKEY = None
MT_SAP_USERNAME = None
MT_SAP_PASSWORD = None
MT_SAP_USE_MT = True
# Title of site to use
SITE_TITLE = 'Weblate'
# Whether site uses https
ENABLE_HTTPS = True
# Use HTTPS when creating redirect URLs for social authentication, see
# documentation for more details:
# http://python-social-auth-docs.readthedocs.io/en/latest/configuration/settings.html#processing-redirects-and-urlopen
SOCIAL_AUTH_REDIRECT_IS_HTTPS = ENABLE_HTTPS
# Make CSRF cookie HttpOnly, see documentation for more details:
# https://docs.djangoproject.com/en/1.11/ref/settings/#csrf-cookie-httponly
CSRF_COOKIE_HTTPONLY = True
CSRF_COOKIE_SECURE = ENABLE_HTTPS
# Store CSRF token in session (since Django 1.11)
CSRF_USE_SESSIONS = True
SESSION_COOKIE_SECURE = ENABLE_HTTPS
# Session cookie age (in seconds)
SESSION_COOKIE_AGE = 1209600
# URL of login
LOGIN_URL = '{0}/accounts/login/'.format(URL_PREFIX)
# URL of logout
LOGOUT_URL = '{0}/accounts/logout/'.format(URL_PREFIX)
# Default location for login
LOGIN_REDIRECT_URL = '{0}/'.format(URL_PREFIX)
# Anonymous user name
ANONYMOUS_USER_NAME = 'anonymous'
# Reverse proxy settings
IP_BEHIND_REVERSE_PROXY = False
IP_PROXY_HEADER = 'HTTP_X_FORWARDED_FOR'
IP_PROXY_OFFSET = 0
# Sending HTML in mails
EMAIL_SEND_HTML = True
# Subject of emails includes site title
EMAIL_SUBJECT_PREFIX = '[{0}] '.format(SITE_TITLE)
EMAIL_BACKEND = 'django_sendmail_backend.backends.EmailBackend'
# Enable remote hooks
ENABLE_HOOKS = True
# Whether to run hooks in background
BACKGROUND_HOOKS = True
# Number of nearby messages to show in each direction
NEARBY_MESSAGES = 5
# Offload indexing
OFFLOAD_INDEXING = True
# Use simple language codes for default language/country combinations
SIMPLIFY_LANGUAGES = True
# Render forms using bootstrap
CRISPY_TEMPLATE_PACK = 'bootstrap3'
# List of quality checks
# CHECK_LIST = (
# 'weblate.trans.checks.same.SameCheck',
# 'weblate.trans.checks.chars.BeginNewlineCheck',
# 'weblate.trans.checks.chars.EndNewlineCheck',
# 'weblate.trans.checks.chars.BeginSpaceCheck',
# 'weblate.trans.checks.chars.EndSpaceCheck',
# 'weblate.trans.checks.chars.EndStopCheck',
# 'weblate.trans.checks.chars.EndColonCheck',
# 'weblate.trans.checks.chars.EndQuestionCheck',
# 'weblate.trans.checks.chars.EndExclamationCheck',
# 'weblate.trans.checks.chars.EndEllipsisCheck',
# 'weblate.trans.checks.chars.EndSemicolonCheck',
# 'weblate.trans.checks.chars.MaxLengthCheck',
# 'weblate.trans.checks.format.PythonFormatCheck',
# 'weblate.trans.checks.format.PythonBraceFormatCheck',
# 'weblate.trans.checks.format.PHPFormatCheck',
# 'weblate.trans.checks.format.CFormatCheck',
# 'weblate.trans.checks.format.PerlFormatCheck',
# 'weblate.trans.checks.format.JavascriptFormatCheck',
# 'weblate.trans.checks.consistency.PluralsCheck',
# 'weblate.trans.checks.consistency.SamePluralsCheck',
# 'weblate.trans.checks.consistency.ConsistencyCheck',
# 'weblate.trans.checks.consistency.TranslatedCheck',
# 'weblate.trans.checks.chars.NewlineCountingCheck',
# 'weblate.trans.checks.markup.BBCodeCheck',
# 'weblate.trans.checks.chars.ZeroWidthSpaceCheck',
# 'weblate.trans.checks.markup.XMLValidityCheck',
# 'weblate.trans.checks.markup.XMLTagsCheck',
# 'weblate.trans.checks.source.OptionalPluralCheck',
# 'weblate.trans.checks.source.EllipsisCheck',
# 'weblate.trans.checks.source.MultipleFailingCheck',
# )
# List of automatic fixups
# AUTOFIX_LIST = (
# 'weblate.trans.autofixes.whitespace.SameBookendingWhitespace',
# 'weblate.trans.autofixes.chars.ReplaceTrailingDotsWithEllipsis',
# 'weblate.trans.autofixes.chars.RemoveZeroSpace',
# 'weblate.trans.autofixes.chars.RemoveControlChars',
# )
# List of enabled addons
# WEBLATE_ADDONS = (
# 'weblate.addons.gettext.GenerateMoAddon',
# 'weblate.addons.gettext.UpdateLinguasAddon',
# 'weblate.addons.gettext.UpdateConfigureAddon',
# 'weblate.addons.gettext.MsgmergeAddon',
# 'weblate.addons.gettext.GettextCustomizeAddon',
# 'weblate.addons.cleanup.CleanupAddon',
# 'weblate.addons.flags.SourceEditAddon',
# 'weblate.addons.flags.TargetEditAddon',
# 'weblate.addons.json.JSONCustomizeAddon',
# 'weblate.addons.generate.GenerateFileAddon',
# 'weblate.addons.properties.PropertiesSortAddon',
# )
# List of scripts to use in custom processing
# POST_UPDATE_SCRIPTS = (
# )
# PRE_COMMIT_SCRIPTS = (
# )
# E-mail address that error messages come from.
SERVER_EMAIL = 'noreply@__DOMAIN__'
# Default email address to use for various automated correspondence from
# the site managers. Used for registration emails.
DEFAULT_FROM_EMAIL = '__ADMINMAIL__'
# List of URLs your site is supposed to serve
ALLOWED_HOSTS = ['__DOMAIN__']
# Example configuration to use memcached for caching
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
'LOCATION': '127.0.0.1:__MEMCPORT__',
},
'avatar': {
'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
'LOCATION': os.path.join(BASE_DIR, 'avatar-cache'),
'TIMEOUT': 3600,
'OPTIONS': {
'MAX_ENTRIES': 1000,
},
}
}
# REST framework settings for API
REST_FRAMEWORK = {
# Use Django's standard `django.contrib.auth` permissions,
# or allow read-only access for unauthenticated users.
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.IsAuthenticatedOrReadOnly'
],
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.TokenAuthentication',
'weblate.api.authentication.BearerAuthentication',
'rest_framework.authentication.SessionAuthentication',
),
'DEFAULT_THROTTLE_CLASSES': (
'rest_framework.throttling.AnonRateThrottle',
'rest_framework.throttling.UserRateThrottle'
),
'DEFAULT_THROTTLE_RATES': {
'anon': '100/day',
'user': '1000/day'
},
'DEFAULT_PAGINATION_CLASS': (
'rest_framework.pagination.PageNumberPagination'
),
'PAGE_SIZE': 20,
'VIEW_DESCRIPTION_FUNCTION': 'weblate.api.views.get_view_description',
'UNAUTHENTICATED_USER': 'weblate.accounts.models.get_anonymous',
}
# Example for restricting access to logged in users
# LOGIN_REQUIRED_URLS = (
# r'/(.*)$',
# )
# In such case you will want to include some of the exceptions
# LOGIN_REQUIRED_URLS_EXCEPTIONS = (
# r'/accounts/(.*)$', # Required for login
# r'/static/(.*)$', # Required for development mode
# r'/widgets/(.*)$', # Allowing public access to widgets
# r'/data/(.*)$', # Allowing public access to data exports
# r'/hooks/(.*)$', # Allowing public access to notification hooks
# r'/api/(.*)$', # Allowing access to API
# r'/js/i18n/$', # Javascript localization
# r'/contact/$', # Optional for contact form
# r'/legal/(.*)$', # Optional for legal app
# )
# Force sane test runner
TEST_RUNNER = 'django.test.runner.DiscoverRunner'

16
conf/uwsgi-app@.service Normal file
View file

@ -0,0 +1,16 @@
[Unit]
Description=%i uWSGI app
After=syslog.target
[Service]
ExecStart=/usr/bin/uwsgi \
--ini /etc/uwsgi/apps-available/%i.ini \
--socket /var/run/uwsgi/%i.socket \
--logto /var/log/uwsgi/app/%i
User=%i
Group=www-data
Restart=on-failure
KillSignal=SIGQUIT
Type=notify
StandardError=syslog
NotifyAccess=all

11
conf/uwsgi-app@.socket Normal file
View file

@ -0,0 +1,11 @@
[Unit]
Description=Socket for uWSGI app %i
[Socket]
ListenStream=/var/run/uwsgi/%i.socket
SocketUser=%i
SocketGroup=www-data
SocketMode=0775
[Install]
WantedBy=sockets.target

View file

@ -2,18 +2,17 @@
plugins = python plugins = python
master = true master = true
protocol = uwsgi protocol = uwsgi
socket = __FINALPATH__/socket socket = /var/run/uwsgi/__APP__.socket
virtualenv = __FINALPATH__/venv virtualenv = __FINALPATH__/venv
wsgi-file = __FINALPATH__/venv/lib/python2.7/site-packages/weblate/wsgi.py
python-path = __FINALPATH__/venv # http://uwsgi-docs.readthedocs.io/en/latest/Nginx.html#hosting-multiple-apps-in-the-same-process-aka-managing-script-name-and-path-info
mount = __PATH__=__FINALPATH__/venv/lib/python2.7/site-packages/weblate/wsgi.py
manage-script-name = true
# Needed for OAuth/OpenID # Needed for OAuth/OpenID
buffer-size = 8192 buffer-size = 8192
chmod-socket = 666
# Increase number of workers for heavily loaded sites # Increase number of workers for heavily loaded sites
#workers = 6
# Needed for background processing # Needed for background processing
enable-threads = true enable-threads = true
# Child processes do not need file descriptors # Child processes do not need file descriptors
close-on-exec = true close-on-exec = true
# Avoid default 0000 umask
umask = 0022

View file

@ -1,18 +0,0 @@
[Unit]
Description=uWSGI instance for __NAME__
Requires=network.target
After=network.target
[Service]
User=__NAME__
Group=__NAME__
RemainAfterExit=yes
WorkingDirectory=__FINALPATH__
ExecStart=/usr/bin/uwsgi \
--ini __FINALPATH__/uwsgi.ini \
--socket __FINALPATH__/socket
Restart=always
StandardError=syslog
[Install]
WantedBy=multi-user.target

View file

@ -3,12 +3,12 @@
"id": "weblate", "id": "weblate",
"packaging_format": 1, "packaging_format": 1,
"requirements": { "requirements": {
"yunohost": ">= 2.7.0" "yunohost": ">= 2.7.10"
}, },
"description": { "description": {
"en": "A translation platform using Git and Python" "en": "A translation platform using Git and Python"
}, },
"version": "2.17.1", "version": "2.20-1",
"url": "https://weblate.org", "url": "https://weblate.org",
"license": "AGPL-3.0", "license": "AGPL-3.0",
"maintainer": { "maintainer": {

View file

@ -1,6 +1,92 @@
#!/bin/bash #!/bin/bash
current_version="2.17.1" current_version="2.20"
ynh_check_global_uwsgi_config () {
uwsgi --version || ynh_die "You need to add uwsgi (and appropriate plugin) as a dependency"
if [ -f /etc/systemd/system/uwsgi-app@.service ];
then
echo "Uwsgi generic file is already installed"
else
cp ../conf/uwsgi-app@.socket /etc/systemd/system/uwsgi-app@.socket
cp ../conf/uwsgi-app@.service /etc/systemd/system/uwsgi-app@.service
fi
# make sure the folder for sockets exists and set authorizations
mkdir -p /var/run/uwsgi/
chown root:www-data /var/run/uwsgi/
chmod -R 775 /var/run/uwsgi/
# make sure the folder for logs exists and set authorizations
mkdir -p /var/log/uwsgi/app/
chown root:www-data /var/log/uwsgi/app/
chmod -R 775 /var/log/uwsgi/app/
}
# Create a dedicated uwsgi ini file to use with generic uwsgi service
# It will install generic uwsgi.socket and
#
# This will use a template in ../conf/uwsgi.ini
# and will replace the following keywords with
# global variables that should be defined before calling
# this helper :
#
# __APP__ by $app
# __PATH__ by $path_url
# __FINALPATH__ by $final_path
#
# usage: ynh_add_systemd_config
#
# to interact with your service: `systemctl <action> uwsgi-app@app`
ynh_add_uwsgi_service () {
ynh_check_global_uwsgi_config
# www-data group is needed since it is this nginx who will start the service
usermod --append --groups www-data "$app" || ynh_die "It wasn't possible to add user $app to group www-data"
finaluwsgiini="/etc/uwsgi/apps-available/$app.ini"
ynh_backup_if_checksum_is_different "$finaluwsgiini"
cp ../conf/uwsgi.ini "$finaluwsgiini"
# To avoid a break by set -u, use a void substitution ${var:-}. If the variable is not set, it's simply set with an empty variable.
# Substitute in a nginx config file only if the variable is not empty
if test -n "${final_path:-}"; then
ynh_replace_string "__FINALPATH__" "$final_path" "$finaluwsgiini"
fi
if test -n "${path_url:-}"; then
ynh_replace_string "__PATH__" "$path_url" "$finaluwsgiini"
fi
if test -n "${app:-}"; then
ynh_replace_string "__APP__" "$app" "$finaluwsgiini"
fi
ynh_store_file_checksum "$finaluwsgiini"
chown root: "$finaluwsgiini"
systemctl enable "uwsgi-app@$app.socket"
systemctl start "uwsgi-app@$app.socket"
systemctl daemon-reload
# Add as a service
yunohost service add "uwsgi-app@$app.socket" --log "/var/log/uwsgi/app/$app"
}
# Remove the dedicated uwsgi ini file
#
# usage: ynh_remove_systemd_config
ynh_remove_uwsgi_service () {
finaluwsgiini="/etc/uwsgi/apps-available/$app.ini"
if [ -e "$finaluwsgiini" ]; then
systemctl stop "uwsgi-app@$app.socket"
systemctl disable "uwsgi-app@$app.socket"
yunohost service remove "uwsgi-app@$app.socket"
ynh_secure_remove "$finaluwsgiini"
ynh_secure_remove "/var/run/uwsgi/$app.socket"
ynh_secure_remove "/var/log/uwsgi/app/$app"
fi
}
weblate_fill_settings() { weblate_fill_settings() {
settings="$1" settings="$1"
@ -30,7 +116,7 @@ ynh_check_if_checksum_is_different() {
local checksum_value=$(ynh_app_setting_get $app $checksum_setting_name) local checksum_value=$(ynh_app_setting_get $app $checksum_setting_name)
local check=0 local check=0
if ! echo "$checksum_value $file" | sudo md5sum -c --status if ! echo "$checksum_value $file" | md5sum -c --status
then # If the checksum is now different then # If the checksum is now different
check=1 check=1
fi fi
@ -44,12 +130,24 @@ ynh_psql_test_if_first_run() {
echo "PostgreSQL is already installed, no need to create master password" echo "PostgreSQL is already installed, no need to create master password"
else else
pgsql=$(ynh_string_random) pgsql=$(ynh_string_random)
pg_hba=""
echo "$pgsql" >> /etc/yunohost/psql echo "$pgsql" >> /etc/yunohost/psql
if [ -e /etc/postgresql/9.4/ ]
then
pg_hba=/etc/postgresql/9.4/main/pg_hba.conf
elif [ -e /etc/postgresql/9.6/ ]
then
pg_hba=/etc/postgresql/9.6/main/pg_hba.conf
else
ynh_die "postgresql shoud be 9.4 or 9.6"
fi
systemctl start postgresql systemctl start postgresql
su --command="psql -c\"ALTER user postgres WITH PASSWORD '${pgsql}'\"" postgres su --command="psql -c\"ALTER user postgres WITH PASSWORD '${pgsql}'\"" postgres
# we can't use peer since YunoHost create users with nologin # we can't use peer since YunoHost create users with nologin
sed -i '/local\s*all\s*all\s*peer/i \ sed -i '/local\s*all\s*all\s*peer/i \
local all all password' /etc/postgresql/9.4/main/pg_hba.conf local all all password' "$pg_hba"
systemctl enable postgresql systemctl enable postgresql
systemctl reload postgresql systemctl reload postgresql
fi fi
@ -68,7 +166,8 @@ ynh_psql_connect_as() {
user="$1" user="$1"
pwd="$2" pwd="$2"
db="$3" db="$3"
su --command="PGUSER=\"${user}\" PGPASSWORD=\"${pwd}\" psql \"${db}\"" postgres sudo --login --user=postgres PGUSER="$user" PGPASSWORD="$pwd" psql "$db"
echo "ynh_psql_connect_as" && pwd && ls -lah $(pwd)
} }
# # Execute a command as root user # # Execute a command as root user
@ -78,7 +177,8 @@ ynh_psql_connect_as() {
# | arg: db - the database to connect to # | arg: db - the database to connect to
ynh_psql_execute_as_root () { ynh_psql_execute_as_root () {
sql="$1" sql="$1"
su --command="psql" postgres <<< "$sql" sudo --login --user=postgres psql <<< "$sql"
echo "ynh_psql_execute_as_root" && pwd && ls -lah $(pwd)
} }
# Execute a command from a file as root user # Execute a command from a file as root user
@ -89,7 +189,8 @@ ynh_psql_execute_as_root () {
ynh_psql_execute_file_as_root() { ynh_psql_execute_file_as_root() {
file="$1" file="$1"
db="$2" db="$2"
su -c "psql $db" postgres < "$file" sudo --login --user=postgres psql "$db" < "$file"
echo "ynh_psql_execute_file_as_root" && pwd && ls -lah $(pwd)
} }
# Create a database, an user and its password. Then store the password in the app's config # Create a database, an user and its password. Then store the password in the app's config
@ -112,7 +213,7 @@ ynh_psql_setup_db () {
ynh_app_setting_set "$app" psqlpwd "$db_pwd" # Store the password in the app's config ynh_app_setting_set "$app" psqlpwd "$db_pwd" # Store the password in the app's config
} }
# Create a database and grant optionnaly privilegies to a user # Create a database and grant privilegies to a user
# #
# usage: ynh_psql_create_db db [user [pwd]] # usage: ynh_psql_create_db db [user [pwd]]
# | arg: db - the database name to create # | arg: db - the database name to create
@ -123,7 +224,7 @@ ynh_psql_create_db() {
user="$2" user="$2"
pwd="$3" pwd="$3"
ynh_psql_create_user "$user" "$pwd" ynh_psql_create_user "$user" "$pwd"
su --command="createdb --owner=\"${user}\" \"${db}\"" postgres sudo --login --user=postgres createdb --owner="$user" "$db"
} }
# Drop a database # Drop a database
@ -134,8 +235,8 @@ ynh_psql_create_db() {
ynh_psql_remove_db() { ynh_psql_remove_db() {
db="$1" db="$1"
user="$2" user="$2"
su --command="dropdb \"${db}\"" postgres sudo --login --user=postgres dropdb "$db"
ynh_psql_drop_user "${user}" ynh_psql_drop_user "$user"
} }
# Dump a database # Dump a database
@ -147,7 +248,7 @@ ynh_psql_remove_db() {
# | ret: the psqldump output # | ret: the psqldump output
ynh_psql_dump_db() { ynh_psql_dump_db() {
db="$1" db="$1"
su --command="pg_dump \"${db}\"" postgres sudo --login --user=postgres pg_dump "$db"
} }
@ -158,7 +259,7 @@ ynh_psql_dump_db() {
ynh_psql_create_user() { ynh_psql_create_user() {
user="$1" user="$1"
pwd="$2" pwd="$2"
su --command="psql -c\"CREATE USER ${user} WITH PASSWORD '${pwd}'\"" postgres sudo --login --user=postgres psql -c"CREATE USER $user WITH PASSWORD '$pwd'" postgres
} }
# Drop a user # Drop a user
@ -167,5 +268,54 @@ ynh_psql_create_user() {
# | arg: user - the user name to drop # | arg: user - the user name to drop
ynh_psql_drop_user() { ynh_psql_drop_user() {
user="$1" user="$1"
su --command="dropuser \"${user}\"" postgres sudo --login --user=postgres dropuser "$user"
}
# Send an email to inform the administrator
#
# usage: ynh_send_readme_to_admin app_message [recipients]
# | arg: app_message - The message to send to the administrator.
# | arg: recipients - The recipients of this email. Use spaces to separate multiples recipients. - default: root
# example: "root admin@domain"
# If you give the name of a YunoHost user, ynh_send_readme_to_admin will find its email adress for you
# example: "root admin@domain user1 user2"
ynh_send_readme_to_admin() {
local app_message="${1:-...No specific informations...}"
local recipients="${2:-root}"
# Retrieve the email of users
find_mails () {
local list_mails="$1"
local mail
local recipients=" "
# Read each mail in argument
for mail in $list_mails
do
# Keep root or a real email address as it is
if [ "$mail" = "root" ] || echo "$mail" | grep --quiet "@"
then
recipients="$recipients $mail"
else
# But replace an user name without a domain after by its email
if mail=$(ynh_user_get_info "$mail" "mail" 2> /dev/null)
then
recipients="$recipients $mail"
fi
fi
done
echo "$recipients"
}
recipients=$(find_mails "$recipients")
local mail_subject="☁️🆈🅽🅷☁️: \`$app\` was just installed!"
local mail_message="This is an automated message from your beloved YunoHost server.
Specific informations for the application $app.
$app_message
---
Automatic diagnosis data from YunoHost
$(yunohost tools diagnosis | grep -B 100 "services:" | sed '/services:/d')"
# Send the email to the recipients
echo "$mail_message" | mail -a "Content-Type: text/plain; charset=UTF-8" -s "$mail_subject" "$recipients"
} }

View file

@ -50,12 +50,6 @@ ynh_backup "db.sql"
#================================================= #=================================================
# SPECIFIC BACKUP # SPECIFIC BACKUP
#=================================================
# BACKUP LOGROTATE
#=================================================
ynh_backup "/etc/logrotate.d/$app"
#================================================= #=================================================
# BACKUP THE CRON FILE # BACKUP THE CRON FILE
#================================================= #=================================================
@ -63,7 +57,15 @@ ynh_backup "/etc/logrotate.d/$app"
ynh_backup "/etc/cron.d/$app" ynh_backup "/etc/cron.d/$app"
#================================================= #=================================================
# BACKUP THE SERVICE # BACKUP THE uwsgi files
#================================================= #=================================================
ynh_backup "/etc/systemd/system/$app.service" ynh_backup "/etc/uwsgi/apps-available/$app.ini"
ynh_backup "/etc/systemd/system/uwsgi-app@.socket"
ynh_backup "/etc/systemd/system/uwsgi-app@.service"
#=================================================
# BACKUP THE hub binary file
#=================================================
ynh_backup /usr/bin/hub

View file

@ -93,10 +93,6 @@ settings="$final_path/venv/lib/python2.7/site-packages/weblate/settings.py"
if [ "$old_path" == "/" ] && [ "$new_path" != "/" ] if [ "$old_path" == "/" ] && [ "$new_path" != "/" ]
then then
# uwsgi_param is only needed for non-root installation
ynh_replace_string "#uwsgi_param " "uwsgi_param " "$finalnginxconf"
ynh_replace_string "#uwsgi_modifier1 " "uwsgi_modifier1 " "$finalnginxconf"
if [ "$is_public" -eq 0 ] if [ "$is_public" -eq 0 ]
then then
# ynh panel is only comptable with non-root installation # ynh panel is only comptable with non-root installation
@ -111,9 +107,6 @@ fi
if [ "$old_path" != "/" ] && [ "$new_path" == "/" ] if [ "$old_path" != "/" ] && [ "$new_path" == "/" ]
then then
# uwsgi_param is only needed for non-root installation
ynh_replace_string "uwsgi_param " "#uwsgi_param " "$finalnginxconf"
ynh_replace_string "uwsgi_modifier1 " "#uwsgi_modifier1 " "$finalnginxconf"
# ynh panel is only comptable with non-root installation # ynh panel is only comptable with non-root installation
ynh_replace_string " include conf.d/" " #include conf.d/" "$finalnginxconf" ynh_replace_string " include conf.d/" " #include conf.d/" "$finalnginxconf"
@ -160,6 +153,7 @@ fi
#================================================= #=================================================
# RELOAD NGINX and Weblate # RELOAD NGINX and Weblate
#================================================= #=================================================
systemctl reload nginx systemctl reload nginx
systemctl stop "$app.service"
systemctl start "$app.service"

View file

@ -78,7 +78,8 @@ ynh_app_setting_set "$app" github_token "$github_token"
ynh_install_app_dependencies libxml2-dev libxslt-dev libfreetype6-dev \ ynh_install_app_dependencies libxml2-dev libxslt-dev libfreetype6-dev \
libjpeg-dev libz-dev libyaml-dev python-dev python-pip python-virtualenv \ libjpeg-dev libz-dev libyaml-dev python-dev python-pip python-virtualenv \
postgresql libpq-dev uwsgi uwsgi-plugin-python memcached postgresql libpq-dev uwsgi uwsgi-plugin-python memcached \
mailutils
#================================================= #=================================================
# CREATE A PostgreSQL DATABASE # CREATE A PostgreSQL DATABASE
@ -105,9 +106,6 @@ ynh_add_nginx_config
if [ "$path_url" == "/" ] if [ "$path_url" == "/" ]
then then
# $finalnginxconf comes from ynh_add_nginx_config # $finalnginxconf comes from ynh_add_nginx_config
# uwsgi_param is only needed for non-root installation
ynh_replace_string "uwsgi_param " "#uwsgi_param " "$finalnginxconf"
ynh_replace_string "uwsgi_modifier1 " "#uwsgi_modifier1 " "$finalnginxconf"
ynh_replace_string "location //" "location /" "$finalnginxconf" ynh_replace_string "location //" "location /" "$finalnginxconf"
# ynh panel is only comptable with non-root installation # ynh panel is only comptable with non-root installation
@ -159,8 +157,7 @@ esac
[[ $(sha256sum "$file_bin" | cut -d' ' -f1) = "$sha256sum" ]] || ynh_die "Hub's sha256sum failed (arch: ${arch})" [[ $(sha256sum "$file_bin" | cut -d' ' -f1) = "$sha256sum" ]] || ynh_die "Hub's sha256sum failed (arch: ${arch})"
tar --extract --file "$file_bin" "$version/bin/hub" tar --extract --file "$file_bin" "$version/bin/hub"
mkdir "$final_path/bin/" mv "$version/bin/hub" /usr/bin/
mv "$version/bin/hub" "$final_path/bin/"
mkdir "$final_path/.config/" mkdir "$final_path/.config/"
cp ../conf/hub_config "$final_path/.config/hub" cp ../conf/hub_config "$final_path/.config/hub"
@ -169,7 +166,6 @@ ynh_replace_string "__GITHUBTOKEN__" "$github_token" "$final_path/.config/hub"
cat <<EOF > "$final_path/.bashrc" cat <<EOF > "$final_path/.bashrc"
alias git=hub alias git=hub
PATH="$PATH:~/bin"
EOF EOF
#================================================= #=================================================
@ -178,20 +174,7 @@ EOF
# SPECIFIC SETUP uwsgi # SPECIFIC SETUP uwsgi
#================================================= #=================================================
# Copy Files ynh_add_uwsgi_service
cp ../conf/uwsgi.ini "$final_path/uwsgi.ini"
ynh_replace_string "__NAME__" "$app" "$final_path/uwsgi.ini"
ynh_replace_string "__FINALPATH__" "$final_path" "$final_path/uwsgi.ini"
cp ../conf/uwsgi_service "/etc/systemd/system/$app.service"
ynh_replace_string "__NAME__" "$app" "/etc/systemd/system/$app.service"
ynh_replace_string "__FINALPATH__" "$final_path" "/etc/systemd/system/$app.service"
# Start service
systemctl enable "$app.service"
# Add weblate as a service
yunohost service add "$app.service" --log "/var/log/$app/APP.log"
#================================================= #=================================================
# PIP INSTALLATION # PIP INSTALLATION
@ -199,12 +182,16 @@ yunohost service add "$app.service" --log "/var/log/$app/APP.log"
virtualenv "${final_path}/venv" virtualenv "${final_path}/venv"
#run source in a 'sub shell' #run source in a 'sub shell'
( (
set +eu set +o nounset
source "${final_path}/venv/bin/activate" source "${final_path}/venv/bin/activate"
"${final_path}/venv/bin/pip" install Weblate=="$current_version" django==1.11.8 set -o nounset
"${final_path}/venv/bin/pip" install pytz python-bidi PyYaML Babel pyuca pylibravatar pydns psycopg2 python-memcached phply pip install --upgrade pip
# prevent error: "command: 'install_requires' must be a string or list of strings containing valid project/version requirement specifiers"
pip install --upgrade setuptools
pip install Weblate=="$current_version"
pip install pytz python-bidi PyYaML Babel pyuca pylibravatar pydns psycopg2-binary python-memcached phply
# specific to YunoHost package: # specific to YunoHost package:
"${final_path}/venv/bin/pip" install django_sendmail_backend pip install django_sendmail_backend
) )
#================================================= #=================================================
@ -217,7 +204,7 @@ admin_mail=$(ynh_user_get_info "$admin" mail)
key=$(ynh_string_random) key=$(ynh_string_random)
memc_port=$(ynh_find_port 8080) memc_port=$(ynh_find_port 8080)
settings="$final_path/venv/lib/python2.7/site-packages/weblate/settings.py" settings="$final_path/venv/lib/python2.7/site-packages/weblate/settings.py"
cp ../conf/settings.py "$settings" cp "../conf/settings_history/settings.$current_version.py" "$settings"
weblate_fill_settings "$settings" weblate_fill_settings "$settings"
ynh_app_setting_set "$app" memc_port "$memc_port" ynh_app_setting_set "$app" memc_port "$memc_port"
@ -227,8 +214,9 @@ ynh_app_setting_set "$app" memc_port "$memc_port"
# https://docs.weblate.org/en/latest/admin/install.html#filling-up-the-database # https://docs.weblate.org/en/latest/admin/install.html#filling-up-the-database
#========================================== #==========================================
( (
set +eu set +o nounset
source "${final_path}/venv/bin/activate" source "${final_path}/venv/bin/activate"
set -o nounset
export DJANGO_SETTINGS_MODULE="weblate.settings" export DJANGO_SETTINGS_MODULE="weblate.settings"
# the user needs to be weblate for postgresql # the user needs to be weblate for postgresql
weblate migrate --noinput weblate migrate --noinput
@ -261,14 +249,10 @@ ynh_store_file_checksum "$final_path/venv/lib/python2.7/site-packages/weblate/se
#================================================= #=================================================
# Set permissions to app files # Set permissions to app files
chown -R "$app": "$final_path" chown -R "$app": "$final_path/data"
#================================================= mkdir -p "$final_path/avatar-cache"
# SETUP LOGROTATE chown -R "$app": "$final_path/avatar-cache"
#=================================================
# Use logrotate to manage application logfile(s)
ynh_use_logrotate
#================================================= #=================================================
# SETUP SSOWAT # SETUP SSOWAT
@ -294,5 +278,15 @@ fi
# RELOAD NGINX # RELOAD NGINX
#================================================= #=================================================
systemctl start "$app.service"
systemctl reload nginx systemctl reload nginx
#=================================================
# SEND A README FOR THE ADMIN
#=================================================
message="
Weblate settings file : $settings
If you facing an issue or want to improve this app, please open a new issue in this project: https://github.com/YunoHost-Apps/weblate_ynh
"
ynh_send_readme_to_admin "$message" "$admin"

View file

@ -17,17 +17,6 @@ app=$YNH_APP_INSTANCE_NAME
db_name=$(ynh_app_setting_get "$app" db_name) db_name=$(ynh_app_setting_get "$app" db_name)
#=================================================
# REMOVE SERVICE FROM ADMIN PANEL
#=================================================
if yunohost service status | grep -q "$app"
then
echo "Remove $app service"
systemctl stop "$app.service"
yunohost service remove "$app.service"
fi
#================================================= #=================================================
# REMOVE THE PostgreSQL DATABASE # REMOVE THE PostgreSQL DATABASE
#================================================= #=================================================
@ -56,13 +45,6 @@ ynh_secure_remove "/var/www/$app"
# Remove the dedicated nginx config # Remove the dedicated nginx config
ynh_remove_nginx_config ynh_remove_nginx_config
#=================================================
# REMOVE LOGROTATE CONFIGURATION
#=================================================
# Remove the app-specific logrotate config
ynh_remove_logrotate
#================================================= #=================================================
# SPECIFIC REMOVE # SPECIFIC REMOVE
#================================================= #=================================================
@ -76,7 +58,7 @@ ynh_secure_remove "/etc/cron.d/$app"
# REMOVE uwsgi and systemd files # REMOVE uwsgi and systemd files
#================================================= #=================================================
ynh_secure_remove "/etc/systemd/system/$app.service" ynh_remove_uwsgi_service
#================================================= #=================================================
# GENERIC FINALIZATION # GENERIC FINALIZATION

View file

@ -76,7 +76,8 @@ chown -R "$app": "$final_path"
ynh_install_app_dependencies libxml2-dev libxslt-dev libfreetype6-dev \ ynh_install_app_dependencies libxml2-dev libxslt-dev libfreetype6-dev \
libjpeg-dev libz-dev libyaml-dev python-dev python-pip python-virtualenv \ libjpeg-dev libz-dev libyaml-dev python-dev python-pip python-virtualenv \
postgresql libpq-dev uwsgi uwsgi-plugin-python memcached postgresql libpq-dev uwsgi uwsgi-plugin-python memcached \
mailutils
#================================================= #=================================================
# RESTORE THE PostgreSQL DATABASE # RESTORE THE PostgreSQL DATABASE
@ -87,17 +88,36 @@ ynh_psql_setup_db "$db_name" "$db_name" "$db_pwd"
ynh_psql_execute_file_as_root ./db.sql "$db_name" ynh_psql_execute_file_as_root ./db.sql "$db_name"
#================================================= #=================================================
# RESTORE THE SERVICE # RESTORE THE UWSGI MECANICS
#================================================= #=================================================
ynh_restore_file "/etc/systemd/system/$app.service" ynh_restore_file "/etc/systemd/system/uwsgi-app@.socket"
systemctl enable "$app.service" ynh_restore_file "/etc/systemd/system/uwsgi-app@.service"
# make sure the folder for sockets exists and set authorizations
mkdir -p /var/run/uwsgi/
chown root:www-data /var/run/uwsgi/
chmod -R 775 /var/run/uwsgi/
# make sure the folder for logs exists and set authorizations
mkdir -p /var/log/uwsgi/app/
chown root:www-data /var/log/uwsgi/app/
chmod -R 775 /var/log/uwsgi/app/
#================================================= #=================================================
# ADVERTISE SERVICE IN ADMIN PANEL # RESTORE Weblate service
#================================================= #=================================================
yunohost service add "$app.service" --log "/var/log/$app/APP.log" usermod --append --groups www-data "$app"
ynh_restore_file "/etc/uwsgi/apps-available/$app.ini"
systemctl enable "uwsgi-app@$app.socket"
systemctl start "uwsgi-app@$app.socket"
systemctl daemon-reload
# Add as a service
yunohost service add "uwsgi-app@$app.socket" --log "/var/log/uwsgi/app/$app"
#================================================= #=================================================
# RESTORE THE CRON FILE # RESTORE THE CRON FILE
@ -106,10 +126,10 @@ yunohost service add "$app.service" --log "/var/log/$app/APP.log"
ynh_restore_file "/etc/cron.d/$app" ynh_restore_file "/etc/cron.d/$app"
#================================================= #=================================================
# RESTORE THE LOGROTATE CONFIGURATION # RESTORE THE HUB BINARY FILE
#================================================= #=================================================
ynh_restore_file "/etc/logrotate.d/$app" ynh_restore_file "/usr/bin/hub"
#================================================= #=================================================
# GENERIC FINALIZATION # GENERIC FINALIZATION
@ -118,5 +138,3 @@ ynh_restore_file "/etc/logrotate.d/$app"
#================================================= #=================================================
systemctl reload nginx systemctl reload nginx
systemctl stop "$app.service"
systemctl start "$app.service"

View file

@ -28,26 +28,16 @@ memc_port=$(ynh_app_setting_get "$app" memc_port)
github_account=$(ynh_app_setting_get "$app" github_account) github_account=$(ynh_app_setting_get "$app" github_account)
key=$(ynh_string_random) key=$(ynh_string_random)
settings="$final_path/venv/lib/python2.7/site-packages/weblate/settings.py"
#save memc_port if it doesn't exist
if [[ -z "$memc_port" ]]
then
memc_port=$(cat "$settings" \
| grep "'LOCATION': '127.0.0.1:" \
| sed "s|.*:\\(.*\\)'.*|\\1|")
ynh_app_setting_set "$app" memc_port "$memc_port"
fi
#================================================= #=================================================
# Get previous version number # Get previous version number
#================================================= #=================================================
( (
set +eu set +o nounset
source "${final_path}/venv/bin/activate" source "${final_path}/venv/bin/activate"
"${final_path}/venv/bin/pip" install --upgrade pip set -o nounset
"${final_path}/venv/bin/pip" freeze --local > freeze.pip pip install --upgrade pip
pip freeze --local > freeze.pip
) )
previous_version=$(cat freeze.pip | grep "Weblate==" | sed "s|Weblate==||") previous_version=$(cat freeze.pip | grep "Weblate==" | sed "s|Weblate==||")
@ -66,11 +56,45 @@ elif [ "$is_public" = "No" ]; then
is_public=0 is_public=0
fi fi
# (<2.17)
if [ -z "$db_name" ]; then # If db_name doesn't exist, create it if [ -z "$db_name" ]; then # If db_name doesn't exist, create it
db_name=$(ynh_sanitize_dbid "$app") db_name=$(ynh_sanitize_dbid "$app")
ynh_app_setting_set "$app" db_name "$db_name" ynh_app_setting_set "$app" db_name "$db_name"
fi fi
settings="$final_path/venv/lib/python2.7/site-packages/weblate/settings.py"
# (<2.17) save memc_port if it doesn't exist
if [[ -z "$memc_port" ]]
then
memc_port=$(cat "$settings" \
| grep "'LOCATION': '127.0.0.1:" \
| sed "s|.*:\\(.*\\)'.*|\\1|")
ynh_app_setting_set "$app" memc_port "$memc_port"
fi
# (<2.18) migrade old uwsgi files if existing
if [ -e "/etc/systemd/system/$app.service" ]
then
systemctl stop "$app.service"
systemctl disable "$app.service"
yunohost service remove "$app.service"
ynh_secure_remove "$final_path/uwsgi.ini"
ynh_secure_remove "/etc/systemd/system/$app.service"
fi
# (<2.18) move hub to the correct folder
if [ -e "$final_path/bin/hub" ]
then
mv "$final_path/bin/hub" /usr/bin/
chown root:root /usr/bin/hub
fi
if [[ -d "$final_path/bin/" ]]
then
ynh_secure_remove "$final_path/bin/"
fi
#================================================= #=================================================
# CHECK THE PATH # CHECK THE PATH
#================================================= #=================================================
@ -82,19 +106,12 @@ path_url=$(ynh_normalize_url_path "$path_url")
# STANDARD UPGRADE STEPS # STANDARD UPGRADE STEPS
#================================================= #=================================================
#=================================================
# NGINX CONFIGURATION
#=================================================
# Create a dedicated nginx config # Create a dedicated nginx config
ynh_add_nginx_config ynh_add_nginx_config
if [ "$path_url" == "/" ] if [ "$path_url" == "/" ]
then then
# $finalnginxconf comes from ynh_add_nginx_config # $finalnginxconf comes from ynh_add_nginx_config
# uwsgi_param is only needed for non-root installation
ynh_replace_string "uwsgi_param " "#uwsgi_param " "$finalnginxconf"
ynh_replace_string "uwsgi_modifier1 " "#uwsgi_modifier1 " "$finalnginxconf"
ynh_replace_string "location //" "location /" "$finalnginxconf" ynh_replace_string "location //" "location /" "$finalnginxconf"
# ynh panel is only comptable with non-root installation # ynh panel is only comptable with non-root installation
@ -114,21 +131,41 @@ chsh --shell /bin/bash "$app"
#================================================= #=================================================
# SPECIFIC UPGRADE # SPECIFIC UPGRADE
#================================================= #=================================================
# Update dependencies
#=================================================
ynh_install_app_dependencies libxml2-dev libxslt-dev libfreetype6-dev \
libjpeg-dev libz-dev libyaml-dev python-dev python-pip python-virtualenv \
postgresql libpq-dev uwsgi uwsgi-plugin-python memcached \
mailutils
#=================================================
# SPECIFIC SETUP uwsgi
#=================================================
ynh_add_uwsgi_service
#================================================= #=================================================
# PIP INSTALLATION # PIP INSTALLATION
#================================================= #=================================================
# save old settings file
cp "$settings" "$final_path/settings.$previous_version.old.py"
old_settings="./settings.$previous_version.old.py" old_settings="./settings.$previous_version.old.py"
settings_diff="$final_path/settings.${previous_version}_${current_version}.diff" settings_diff="$final_path/settings.${previous_version}_${current_version}.diff"
( (
set +eu set +o nounset
source "${final_path}/venv/bin/activate" source "${final_path}/venv/bin/activate"
"${final_path}/venv/bin/pip" install Weblate=="$current_version" django==1.11.8 set -o nounset
"${final_path}/venv/bin/pip" install pytz python-bidi PyYaML Babel pyuca pylibravatar pydns psycopg2 python-memcached phply pip install --upgrade pip
# prevent error: "command: 'install_requires' must be a string or list of strings containing valid project/version requirement specifiers"
pip install --upgrade setuptools
pip install Weblate=="$current_version"
pip install pytz python-bidi PyYaML Babel pyuca pylibravatar pydns psycopg2-binary python-memcached phply
# specific to YunoHost package: # specific to YunoHost package:
"${final_path}/venv/bin/pip" install django_sendmail_backend pip install django_sendmail_backend
) )
check=$(ynh_check_if_checksum_is_different "$settings") check=$(ynh_check_if_checksum_is_different "$settings")
@ -144,11 +181,10 @@ then
diff --unified "$old_settings" "$settings" > "$settings_diff" diff --unified "$old_settings" "$settings" > "$settings_diff"
# generate new defaults settings # generate new defaults settings
cp ../conf/settings.py "$settings" cp "../conf/settings_history/settings.$current_version.py" "$settings"
weblate_fill_settings "$settings" weblate_fill_settings "$settings"
# send diff to the server administrator # send diff to the server administrator
mail_subject="'$app' settings diff from $previous_version to $current_version"
mail_message=" mail_message="
Weblate was updated from version $previous_version to $current_version Weblate was updated from version $previous_version to $current_version
@ -166,24 +202,11 @@ then
For any issue, please file a bug in: https://github.com/YunoHost-Apps/weblate_ynh For any issue, please file a bug in: https://github.com/YunoHost-Apps/weblate_ynh
" "
# Email server admin - for ACTION ynh_send_readme_to_admin "$mail_message" root "$admin_mail"
echo "$mail_message" | mail -s "$mail_subject" root -u root
# inform weblate's admin
mail_subject="'$app' was updated from $previous_version to $current_version"
mail_message="
Weblate was updated from version $previous_version to $current_version
A new settings.py has been created and a diff has been sent to root user.
Your administrator may have to update your settings.py to have a fully working installation.
"
# Email weblate's admin - for INFO
echo "$mail_subject" | mail -s "$mail_subject" "$admin_mail"
else else
echo "Settings.py was not modified, using the new default file for $current_version." echo "Settings.py was not modified, using the new default file for $current_version."
# generate new defaults settings # generate new defaults settings
cp ../conf/settings.py "$settings" cp "../conf/settings_history/settings.$current_version.py" "$settings"
weblate_fill_settings "$settings" weblate_fill_settings "$settings"
fi fi
@ -192,29 +215,44 @@ fi
#================================================= #=================================================
( (
set +eu set +o nounset
source ${final_path}/venv/bin/activate source "${final_path}/venv/bin/activate"
set -o nounset
export DJANGO_SETTINGS_MODULE="weblate.settings" export DJANGO_SETTINGS_MODULE="weblate.settings"
cd "${final_path}" cd "${final_path}"
weblate migrate --noinput weblate migrate --noinput
weblate collectstatic --noinput weblate collectstatic --noinput
weblate setuplang weblate setuplang
weblate setupgroups weblate setupgroups
if [[ $previous_version = "2.16" ]] || \
[[ $previous_version = "2.17.1" ]] || \
[[ $previous_version = "2.18" ]]
then
weblate loadpo --all --lang dsb
weblate loadpo --all --lang he
weblate loadpo --all --lang hsb
weblate loadpo --all --lang kw
weblate loadpo --all --lang lt
weblate loadpo --all --lang lv
fi
) )
# Recalculate and store the config file checksum into the app settings # Recalculate and store the config file checksum into the app settings
ynh_store_file_checksum "$final_path/venv/lib/python2.7/site-packages/weblate/settings.py" ynh_store_file_checksum "$final_path/venv/lib/python2.7/site-packages/weblate/settings.py"
#=================================================
# SETUP LOGROTATE
#=================================================
# Use logrotate to manage app-specific logfile(s)
ynh_use_logrotate
#================================================= #=================================================
# GENERIC FINALIZATION # GENERIC FINALIZATION
#================================================= #=================================================
# SECURE FILES AND DIRECTORIES
#=================================================
# Set right permissions for curl installation
chown -R root:root "$final_path"
chown -R "$app": "$final_path/data"
mkdir -p "$final_path/avatar-cache"
chown -R "$app": "$final_path/avatar-cache"
#================================================= #=================================================
# SETUP SSOWAT # SETUP SSOWAT
@ -240,6 +278,4 @@ fi
# RELOAD NGINX # RELOAD NGINX
#================================================= #=================================================
systemctl stop "$app.service"
systemctl start "$app.service"
systemctl reload nginx systemctl reload nginx

View file

@ -1,2 +0,0 @@
*~
*.sw[op]

View file

@ -1,2 +0,0 @@
*~
*.sw[op]