Service#root, Environment#root.

This commit is contained in:
Luka Vandervelden 2019-10-26 14:00:11 +02:00
parent 1f9264f97b
commit 27c9a525f6
7 changed files with 59 additions and 24 deletions

View File

@ -6,6 +6,7 @@ variables+=(
LIBEXECDIR '$(PREFIX)/libexec'
SYSCONFDIR '/etc'
VARSTATEDIR '/var'
DATADIR '/srv'
)
targets=(service status get-port gen-config)

View File

@ -1,28 +1,28 @@
command: ./gitea -C . -w . -c ./custom/conf/app.ini
# deamon's working directory
directory: /srv/${ENVIRONMENT}/gitea
directory: ${SERVICE_ROOT} # FIXME: Could this be removed?
consumes: postgresql
%check
name: working directory
# 'command' is run only if this directory doesn't exist
directory: /srv/${ENVIRONMENT}/gitea/custom/conf/
command: mkdir -p /srv/${ENVIRONMENT}/gitea/custom/conf/
directory: ${SERVICE_ROOT}/custom/conf/
command: mkdir -p ${SERVICE_ROOT}/custom/conf/
%check
name: symlink
# 'command' is run only if this directory doesn't exist
file: /srv/${ENVIRONMENT}/gitea/gitea
command: ln -s $(which gitea) /srv/${ENVIRONMENT}/gitea/
file: ${SERVICE_ROOT}/gitea
command: ln -s $(which gitea) ${SERVICE_ROOT}/gitea
%check
name: configuration file
# 'command' is run only if this file doesn't exist
file: /srv/${ENVIRONMENT}/gitea/custom/conf/app.ini
command: gen-config gitea.cfg /srv/${ENVIRONMENT}/gitea/custom/conf/app.ini postgresql=${POSTGRESQL_PROVIDER}
file: ${SERVICE_ROOT}/custom/conf/app.ini
command: gen-config gitea.cfg ${SERVICE_ROOT}/custom/conf/app.ini postgresql=${POSTGRESQL_PROVIDER}
%check
name: gitea database creation
# 'command' is run only if this directory doesn't exist
file: /srv/${ENVIRONMENT}/gitea/db_is_setup
command: pg_create_user.sh --pghost=localhost --pgport=$(get-port $POSTGRESQL_PROVIDER) --pgdatadir=/srv/$POSTGRESQL_ENVIRONMENT/postgresql --pguser=postgres --dbuser=${ENVIRONMENT}_gitea --dbpassfile=/srv/$ENVIRONMENT/gitea/password_main --dbname=${ENVIRONMENT}_gitea_db create_user_and_db && touch /srv/$ENVIRONMENT/gitea/db_is_setup
file: ${SERVICE_ROOT}/db_is_setup
command: pg_create_user.sh --pghost=localhost --pgport=$(get-port $POSTGRESQL_PROVIDER) --pgdatadir=$POSTGRESQL_ROOT --pguser=postgres --dbuser=${ENVIRONMENT}_gitea --dbpassfile=${SERVICE_ROOT}/password_main --dbname=${ENVIRONMENT}_gitea_db create_user_and_db && touch ${SERVICE_ROOT}/db_is_setup

View File

@ -1,27 +1,27 @@
name: postgresql
user: postgres
command: postgres -D /srv/${ENVIRONMENT}/postgresql -k /tmp/postgresql-${ENVIRONMENT}
command: postgres -D ${SERVICE_ROOT} -k /tmp/postgresql-${ENVIRONMENT}
#stop-command: kill -HUP ${PID}
environment-variables:
- PGROOT=/srv/${ENVIRONMENT}/postgresql
- PGROOT=${SERVICE_ROOT}
provides: postgresql
%check
name: database directory creation
directory: /srv/${ENVIRONMENT}/postgresql
command: mkdir -p /srv/${ENVIRONMENT}/postgresql && chown postgres:postgres /srv/${ENVIRONMENT}/postgresql
directory: ${SERVICE_ROOT}
command: mkdir -p ${SERVICE_ROOT} && chown postgres:postgres ${SERVICE_ROOT}
%check
name: database creation
file: /srv/${ENVIRONMENT}/postgresql/base
command: su - postgres -c "initdb --locale en_US.UTF-8 -D '/srv/${ENVIRONMENT}/postgresql'" && rm /srv/${ENVIRONMENT}/postgresql/postgresql.conf
file: ${SERVICE_ROOT}/base
command: su - postgres -c "initdb --locale en_US.UTF-8 -D '${SERVICE_ROOT}'" && rm ${SERVICE_ROOT}/postgresql.conf
%check
name: database configuration
# once this file is created, there is no need to perform the command
file: /srv/${ENVIRONMENT}/postgresql/postgresql.conf
file: ${SERVICE_ROOT}/postgresql.conf
# gen-config inherits its parameters from the environment
command: gen-config postgresql.conf /srv/${ENVIRONMENT}/postgresql/postgresql.conf && chown postgres:postgres /srv/${ENVIRONMENT}/postgresql/postgresql.conf
command: gen-config postgresql.conf ${SERVICE_ROOT}/postgresql.conf && chown postgres:postgres ${SERVICE_ROOT}/postgresql.conf
%check
name: sockets directory

View File

@ -9,4 +9,5 @@ SYSTEM_CONFIGURATION_DIRECTORY = "@SYSCONFDIR@"
SHARED_DATA_DIRECTORY = "@SHAREDIR@"
OWN_LIBEXEC_DIR = "@LIBEXECDIR@/service"
CACHE_DIRECTORY = "@VARSTATEDIR@/cache"
SERVED_DATA_DIRECTORY = "@DATADIR@"

View File

@ -81,8 +81,10 @@ class GenConfig::Context
options["id"] = service.full_id
options["name"] = service.name
options["service_root"] = service.root
options["environment"] = environment.name
options["environment_root"] = environment.root
providers = Hash(String, Variables).new
service.providers.each do |token, provider|
@ -105,14 +107,15 @@ class GenConfig::Context
`get-port #{service}`.chomp
end
# FIXME: Move this to a separate binary?
options["random_password"] = Crinja.function do
id = (arguments.varargs[0]? || options["id"]).to_s
password_id = arguments.varargs[1]? || "main"
env, service = Service.parse_id id
_service = Service.get_by_id(id).not_nil!
# FIXME: hardcoded path
password_file = "/srv/#{env}/#{service}/password_#{password_id}"
password_file = "#{_service.root}/password_#{password_id}"
if File.exists? password_file
File.read password_file

View File

@ -11,6 +11,9 @@ class Environment
getter domain_name : String?
getter checks = Array(ServiceDefinition::Checks).new
# The place well put services data and configuration.
@root : String?
def initialize()
initialize "root"
end
@ -38,6 +41,10 @@ class Environment
end
end
def root
@root || "#{SERVED_DATA_DIRECTORY}/#{@name}"
end
class_getter root = Environment.new
class_getter all = [@@root] of Environment

View File

@ -19,6 +19,11 @@ class Service
getter environment : Environment
getter providers = ProvidersList.new
getter domain : String?
# The place well store configuration and data.
@root : String?
class Exception < ::Exception
end
@ -56,6 +61,8 @@ class Service
Environment.get env
end
@root = assignments["root"]?.try &.as_s
specs.sections.select(&.name.==("consumes")).each do |section|
env, provider = Service.parse_id section.content["from"].as_s
@providers[section.options[0]] = "#{env}/#{provider}"
@ -66,9 +73,12 @@ class Service
file = [
"name: #{@reference.name}",
"environment: #{@environment.name}"
# FIXME: consumed tokens are missing.
]
if @root
file << "root: #{@root}"
end
@providers.each do |token, provider|
file << "%consumes #{token}"
file << " from: #{provider}"
@ -109,6 +119,10 @@ class Service
@reference.consumes
end
def root
@root || "#{@environment.root}/#{name}"
end
def provides?(token)
provides.any? do |provider|
provider.token == token
@ -118,13 +132,20 @@ class Service
private def build_environment
env = {} of String => String
env["SERVICE_ROOT"] = root
env["SERVICE_ID"] = full_id
env["ENVIRONMENT"] = @environment.name
env["ENVIRONMENT_TYPE"] = @environment.type.to_s
@providers.each do |token, provider|
service_provider = Service.get_by_id provider
# FIXME: Warning?
next if service_provider.nil?
env["#{token.upcase}_PROVIDER"] = provider
env["#{token.upcase}_ENVIRONMENT"] = provider.gsub /\/.*/, ""
env["#{token.upcase}_ENVIRONMENT"] = service_provider.environment.name
env["#{token.upcase}_ROOT"] = service_provider.root
end
env["SERVICE_TOKENS"] = @providers.to_a.map(&.[0]).join ':'
@ -145,11 +166,13 @@ class Service
# FIXME: Is working on ${} really a good idea?
private def evaluate(string)
string.gsub /\${[a-zA-Z]+}/ do |match|
string.gsub /\${[a-zA-Z_]+}/ do |match|
match = match[2..match.size-2]
if match.downcase == "environment"
@environment.name
elsif match.downcase == "service_root"
root
else
""
end
@ -162,12 +185,12 @@ class Service
check.file.try do |file|
file = evaluate file
run_check = true if ! File.exists? evaluate file
run_check = true if ! File.exists? file
end
check.directory.try do |directory|
directory = evaluate directory
run_check = true if ! Dir.exists? evaluate directory
run_check = true if ! Dir.exists? directory
end
unless run_check