Merge pull request #3190 from vpeter4/mariadb_addon

mariadb: initial addon
This commit is contained in:
CvH 2018-12-30 16:30:25 +01:00 committed by GitHub
commit 41d2c65fd3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 440 additions and 0 deletions

View File

@ -0,0 +1,2 @@
100
- initial version

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

View File

@ -0,0 +1,97 @@
# SPDX-License-Identifier: GPL-2.0-or-later
# Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv)
PKG_NAME="mariadb"
PKG_VERSION="10.3.11"
PKG_REV="100"
PKG_SHA256="211655b794c9d5397ba3be6c90737eac02e882f296268299239db47ba328f1b2"
PKG_LICENSE="GPL2"
PKG_SITE="https://mariadb.org"
PKG_URL="https://downloads.mariadb.org/interstitial/${PKG_NAME}-${PKG_VERSION}/source/${PKG_NAME}-${PKG_VERSION}.tar.gz"
PKG_DEPENDS_HOST="toolchain ncurses:host"
PKG_DEPENDS_TARGET="toolchain binutils bzip2 libaio libxml2 lzo ncurses openssl systemd zlib mariadb:host"
PKG_SHORTDESC="MariaDB is a community-developed fork of the MySQL."
PKG_LONGDESC="MariaDB (${PKG_VERSION}) is a fast SQL database server and a drop-in replacement for MySQL."
PKG_TOOLCHAIN="cmake"
PKG_BUILD_FLAGS="-gold"
PKG_IS_ADDON="yes"
PKG_SECTION="service"
PKG_ADDON_NAME="MariaDB SQL database server"
PKG_ADDON_TYPE="xbmc.service"
configure_package() {
PKG_CMAKE_OPTS_HOST=" \
-DCMAKE_INSTALL_MESSAGE=NEVER \
-DSTACK_DIRECTION=-1 \
-DHAVE_IB_GCC_ATOMIC_BUILTINS=1 \
-DCMAKE_CROSSCOMPILING=OFF \
import_executables"
PKG_CMAKE_OPTS_TARGET=" \
-DCMAKE_INSTALL_MESSAGE=NEVER \
-DCMAKE_BUILD_TYPE=Release \
-DBUILD_CONFIG=mysql_release \
-DFEATURE_SET=classic \
-DSTACK_DIRECTION=1 \
-DDISABLE_LIBMYSQLCLIENT_SYMBOL_VERSIONING=ON \
-DCMAKE_CROSSCOMPILING=ON \
-DIMPORT_EXECUTABLES=${PKG_BUILD}/.${HOST_NAME}/import_executables.cmake \
-DWITHOUT_AWS_KEY_MANAGEMENT=ON \
-DWITH_EXTRA_CHARSETS=complex \
-DWITH_SSL=system \
-DWITH_SSL=${SYSROOT_PREFIX}/usr \
-DWITH_JEMALLOC=OFF \
-DWITH_PCRE=bundled \
-DWITH_ZLIB=bundled \
-DWITH_EDITLINE=bundled \
-DWITH_LIBEVENT=bundled \
-DCONNECT_WITH_LIBXML2=bundled \
-DSKIP_TESTS=ON \
-DWITH_DEBUG=OFF \
-DWITH_UNIT_TESTS=OFF \
-DENABLE_DTRACE=OFF \
-DSECURITY_HARDENED=OFF \
-DWITH_EMBEDDED_SERVER=OFF \
-DWITHOUT_SERVER=OFF \
-DPLUGIN_AUTH_SOCKET=STATIC \
-DDISABLE_SHARED=NO \
-DENABLED_PROFILING=OFF \
-DENABLE_STATIC_LIBS=OFF \
-DMYSQL_UNIX_ADDR=/var/run/mysqld/mysqld.sock \
-DWITH_SAFEMALLOC=OFF \
-DWITHOUT_AUTH_EXAMPLES=ON"
}
make_host() {
ninja ${NINJA_OPTS} import_executables
}
makeinstall_host() {
:
}
makeinstall_target() {
# use only for addon
DESTDIR=${PKG_BUILD}/.install_addon ninja ${NINJA_OPTS} install
rm -rf "${PKG_BUILD}/.install_addon/usr/mysql-test"
}
addon() {
local ADDON="${ADDON_BUILD}/${PKG_ADDON_ID}"
local MARIADB="${PKG_BUILD}/.install_addon/usr"
mkdir -p ${ADDON}/bin
mkdir -p ${ADDON}/config
cp ${MARIADB}/bin/mysql \
${MARIADB}/bin/mysqld \
${MARIADB}/bin/mysqladmin \
${MARIADB}/bin/mysql_secure_installation \
${MARIADB}/bin/my_print_defaults \
${MARIADB}/bin/resolveip \
${MARIADB}/scripts/mysql_install_db \
${ADDON}/bin
cp -PR ${MARIADB}/share ${ADDON}
}

View File

@ -0,0 +1,59 @@
#!/bin/sh
# SPDX-License-Identifier: GPL-2.0-or-later
# Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv)
. /etc/profile
oe_setup_addon service.mariadb
# create dir for socket and pid
mkdir -p /var/run/mysqld
# exit if already running
PID=$(ps aux | awk '/\/bin\/mysqld/ {print $1; exit 0}')
if [ -n "$PID" ]; then
echo "MariaDB server is already running"
exit 0
fi
# check for first run and generate passwords
DEF_XML="$ADDON_DIR/settings-default.xml"
CUR_XML="$ADDON_HOME/settings.xml"
if grep -q "@MYSQL_ROOT_PASS@" $DEF_XML; then
MYSQL_ROOT_PASS="$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 8)"
MYSQL_KODI_PASS="$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 8)"
sed -i "s|@MYSQL_ROOT_PASS@|$MYSQL_ROOT_PASS|g" $DEF_XML
sed -i "s|@MYSQL_KODI_PASS@|$MYSQL_KODI_PASS|g" $DEF_XML
cp $DEF_XML $CUR_XML
fi
# copy config file
if [ ! -f $ADDON_HOME/my.cnf ]; then
cp $ADDON_DIR/config/my.cnf $ADDON_HOME
fi
# install database
if [ ! -d "$ADDON_HOME/data/mysql" ]; then
echo "Installing database"
$ADDON_DIR/bin/mysql_install_db --basedir=$ADDON_DIR --datadir=$ADDON_HOME/data
fi
# init script to create user kodi and change passwords
if [[ ! -f $ADDON_DIR/set_mysql_passwords.sql ]] || [[ $CUR_XML -nt $ADDON_DIR/set_mysql_passwords.sql ]]; then
cat << SQL_DATA > $ADDON_DIR/set_mysql_passwords.sql
SET PASSWORD FOR 'root'@'localhost'=PASSWORD('$MYSQL_ROOT_PASS');
CREATE USER IF NOT EXISTS 'kodi';
SET PASSWORD FOR 'kodi'=PASSWORD('$MYSQL_KODI_PASS');
GRANT ALL ON *.* TO 'kodi';
flush privileges;
SQL_DATA
init_file="--init-file=$ADDON_DIR/set_mysql_passwords.sql"
fi
echo "Starting mysqld"
MYSQL_HOME="$ADDON_HOME" exec $ADDON_DIR/bin/mysqld $init_file &

View File

@ -0,0 +1,6 @@
#!/bin/sh
# SPDX-License-Identifier: GPL-2.0-or-later
# Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv)
kill $(cat /var/run/mysqld/mysqld.pid)

View File

@ -0,0 +1,206 @@
# MariaDB database server configuration file.
#
# You can copy this file to one of:
# - "/etc/mysql/my.cnf" to set global options,
# - "~/.my.cnf" to set user-specific options.
#
# One can use all long options that the program supports.
# Run program with --help to get a list of available options and with
# --print-defaults to see which it would actually understand and use.
#
# For explanations see
# http://dev.mysql.com/doc/mysql/en/server-system-variables.html
# This will be passed to all mysql clients
# It has been reported that passwords should be enclosed with ticks/quotes
# escpecially if they contain "#" chars...
# Remember to edit /etc/mysql/debian.cnf when changing the socket location.
[client]
port = 3306
socket = /var/run/mysqld/mysqld.sock
# Here is entries for some specific programs
# The following values assume you have at least 32M ram
# This was formally known as [safe_mysqld]. Both versions are currently parsed.
[mysqld_safe]
socket = /var/run/mysqld/mysqld.sock
nice = 0
[mysqld]
#
# * Basic Settings
#
user = root
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
port = 3306
basedir = /storage/.kodi/addons/service.mariadb
datadir = /storage/.kodi/userdata/addon_data/service.mariadb/data
log-error = /storage/.kodi/userdata/addon_data/service.mariadb/mysqld.log
tmpdir = /tmp
#lc_messages_dir = /usr/share/mysql
lc_messages = en_US
skip-external-locking
# Kodi needs more for library (256K should probably be enough)
#thread_stack = 128K
thread_stack = 384K
#
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
#bind-address = 127.0.0.1
#
# * Fine Tuning
#
max_connections = 100
connect_timeout = 5
wait_timeout = 600
max_allowed_packet = 16M
thread_cache_size = 128
sort_buffer_size = 4M
bulk_insert_buffer_size = 16M
tmp_table_size = 32M
max_heap_table_size = 32M
#
# * MyISAM
#
# This replaces the startup script and checks MyISAM tables if needed
# the first time they are touched. On error, make copy and try a repair.
myisam_recover_options = BACKUP
key_buffer_size = 128M
#open-files-limit = 2000
#table_open_cache = 400
table_open_cache = 1000
myisam_sort_buffer_size = 512M
concurrent_insert = 2
read_buffer_size = 2M
read_rnd_buffer_size = 1M
#
# * Query Cache Configuration
#
# Cache only tiny result sets, so we can fit more in the query cache.
query_cache_limit = 128K
query_cache_size = 64M
# for more write intensive setups, set to DEMAND or OFF
#query_cache_type = DEMAND
#
# * Logging and Replication
#
# Both location gets rotated by the cronjob.
# Be aware that this log type is a performance killer.
# As of 5.1 you can enable the log at runtime!
#general_log_file = /var/log/mysql/mysql.log
#general_log = 1
#
# Error logging goes to syslog due to /etc/mysql/conf.d/mysqld_safe_syslog.cnf.
#
# we do want to know about network errors and such
log_warnings = 2
#
# Enable the slow query log to see queries with especially long duration
#slow_query_log[={0|1}]
slow_query_log_file = /var/log/mysql/mariadb-slow.log
long_query_time = 10
#log_slow_rate_limit = 1000
log_slow_verbosity = query_plan
#log-queries-not-using-indexes
#log_slow_admin_statements
#
# The following can be used as easy to replay backup logs or for replication.
# note: if you are setting up a replication slave, see README.Debian about
# other settings you may need to change.
#server-id = 1
#report_host = master1
#auto_increment_increment = 2
#auto_increment_offset = 1
# disable binary log
#log_bin = /var/log/mysql/mariadb-bin
#log_bin_index = /var/log/mysql/mariadb-bin.index
# not fab for performance, but safer
#sync_binlog = 1
expire_logs_days = 10
max_binlog_size = 100M
# slaves
#relay_log = /var/log/mysql/relay-bin
#relay_log_index = /var/log/mysql/relay-bin.index
#relay_log_info_file = /var/log/mysql/relay-bin.info
#log_slave_updates
#read_only
#
# If applications support it, this stricter sql_mode prevents some
# mistakes like inserting invalid dates etc.
#sql_mode = NO_ENGINE_SUBSTITUTION,TRADITIONAL
#
# * InnoDB
#
# InnoDB is enabled by default with a 10MB datafile in /var/lib/mysql/.
# Read the manual for more InnoDB related options. There are many!
default_storage_engine = InnoDB
# you can't just change log file size, requires special procedure
#innodb_log_file_size = 50M
# optimizations https://forum.kodi.tv/showthread.php?tid=329046&pid=2708799 #pid2708799
# https://discourse.coreelec.org/t/kodi-and-mariadb-part-2/513
# innodb_buffer_pool_size=2G # MariaDB recommends using 80% of your available memory but the default 1G might be enough. Always set to multiples of 1G.
# innodb_buffer_pool_instances=2 # When innodb_buffer_pool_size is > 1G, MariaDB will split the pool in instances. They should be even dividers of 1G.
# innodb_file_format=Barracuda # Gone in 10.3 / This is an optimized storage engine not available in MySQL
# innodb_log_block_size=4096 # Gone in 10.3 / Default is 512, when using an SSD or 4k drives, block size should be 4096
# innodb_adaptive_hash_index=OFF # For Kodi no benefit is gained from additional indexes. This should only be used with large databases.
# character-set-server=utf8 # I really hope you all used this in MySQL already. This avoids potential pitfalls with text in exotic codepages.
# key-buffer-size=64k # When not using MyISAM as storage engine, this buffer can be reduced to a minimum
# skip-name-resolve # Avoids name resolving in the local network, thus reducing overhead. That also means that all connections are done by IP only.
# optimizer_search_depth=1 # Here we are, this is winner of the year.
innodb_buffer_pool_size = 256M
innodb_log_buffer_size = 8M
innodb_file_per_table = 1
innodb_open_files = 400
innodb_io_capacity = 400
innodb_flush_method = O_DIRECT
character-set-server=utf8 # This avoids potential pitfalls with text in exotic codepages.
#skip-name-resolve # Avoids name resolving in the local network, thus reducing overhead. That also means that all connections are done by IP only.
optimizer_search_depth=1 # Here we are, this is winner of the year.
#
# * Security Features
#
# Read the manual, too, if you want chroot!
# chroot = /var/lib/mysql/
#
# For generating SSL certificates I recommend the OpenSSL GUI "tinyca".
#
# ssl-ca=/etc/mysql/cacert.pem
# ssl-cert=/etc/mysql/server-cert.pem
# ssl-key=/etc/mysql/server-key.pem
#
# * Galera-related settings
#
[galera]
# Mandatory settings
#wsrep_on=ON
#wsrep_provider=
#wsrep_cluster_address=
#binlog_format=row
#default_storage_engine=InnoDB
#innodb_autoinc_lock_mode=2
#
# Allow server to accept connections on all interfaces.
#
#bind-address=0.0.0.0
#
# Optional setting
#wsrep_slave_threads=1
#innodb_flush_log_at_trx_commit=0
[mysqldump]
quick
quote-names
max_allowed_packet = 16M
[mysql]
#no-auto-rehash # faster start of mysql but no tab completion
[isamchk]
key_buffer = 16M

View File

@ -0,0 +1,18 @@
# SPDX-License-Identifier: GPL-2.0-or-later
# Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv)
import subprocess
import xbmc
import xbmcaddon
class Monitor(xbmc.Monitor):
def __init__(self, *args, **kwargs):
xbmc.Monitor.__init__(self)
self.id = xbmcaddon.Addon().getAddonInfo('id')
def onSettingsChanged(self):
subprocess.call(['systemctl', 'restart', self.id])
if __name__ == "__main__":
Monitor().waitForAbort()

View File

@ -0,0 +1,22 @@
# Kodi Media Center language file
# Addon Name: mariadb
# Addon id: service.mariadb
# Addon Provider: Team LibreELEC
msgid ""
msgstr ""
msgctxt "#30000"
msgid "Accounts"
msgstr ""
msgctxt "#30001"
msgid "Passwords"
msgstr ""
msgctxt "#30002"
msgid "root"
msgstr ""
msgctxt "#30003"
msgid "kodi"
msgstr ""

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<settings>
<category label="30000">
<setting label="30001" type="lsep"/>
<setting label="30002" id="MYSQL_ROOT_PASS" type="text" default="" />
<setting label="30003" id="MYSQL_KODI_PASS" type="text" default="" />
</category>
</settings>

View File

@ -0,0 +1,4 @@
<settings version="2">
<setting id="MYSQL_ROOT_PASS" default="">@MYSQL_ROOT_PASS@</setting>
<setting id="MYSQL_KODI_PASS" default="">@MYSQL_KODI_PASS@</setting>
</settings>

View File

@ -0,0 +1,18 @@
[Unit]
Description=MariaDB server
After=graphical.target network-online.service
Before=kodi.service
[Service]
Type=forking
PIDFile=/var/run/mysqld/mysqld.pid
ExecStart=/bin/sh -c "exec sh /storage/.kodi/addons/service.mariadb/bin/mariadb.start"
ExecStop=/bin/sh -c "exec sh /storage/.kodi/addons/service.mariadb/bin/mariadb.stop"
TimeoutStartSec=60
TimeoutStopSec=60
Restart=always
RestartSec=10
StartLimitInterval=0
[Install]
WantedBy=kodi.service