parent
6df9a6f2fa
commit
d4935af4e0
13 changed files with 504 additions and 12 deletions
@ -0,0 +1,234 @@ |
|||||||
|
#! /usr/bin/env python |
||||||
|
|
||||||
|
from argparse import ArgumentParser, RawDescriptionHelpFormatter |
||||||
|
from commonkit import highlight_code, smart_cast |
||||||
|
from commonkit.logging import LoggingHelper |
||||||
|
from commonkit.shell import EXIT |
||||||
|
import sys |
||||||
|
|
||||||
|
sys.path.insert(0, "../") |
||||||
|
|
||||||
|
from scripttease.constants import LOGGER_NAME |
||||||
|
from scripttease.lib.contexts import load_variables, Context |
||||||
|
from scripttease.lib.loaders.ini import INILoader |
||||||
|
from scripttease.lib.loaders.yaml import YMLLoader |
||||||
|
from scripttease.version import DATE as VERSION_DATE, VERSION |
||||||
|
|
||||||
|
DEBUG = 10 |
||||||
|
|
||||||
|
logging = LoggingHelper(colorize=True, name=LOGGER_NAME) |
||||||
|
log = logging.setup() |
||||||
|
|
||||||
|
|
||||||
|
def execute(): |
||||||
|
"""Process script configurations.""" |
||||||
|
|
||||||
|
__author__ = "Shawn Davis <shawn@develmaycare.com>" |
||||||
|
__date__ = VERSION_DATE |
||||||
|
__help__ = """NOTES |
||||||
|
|
||||||
|
This command is used to parse configuration files and output the commands. |
||||||
|
|
||||||
|
""" |
||||||
|
__version__ = VERSION + "+new" |
||||||
|
|
||||||
|
# Main argument parser from which sub-commands are created. |
||||||
|
parser = ArgumentParser(description=__doc__, epilog=__help__, formatter_class=RawDescriptionHelpFormatter) |
||||||
|
|
||||||
|
parser.add_argument( |
||||||
|
"path", |
||||||
|
default="steps.ini", |
||||||
|
nargs="?", |
||||||
|
help="The path to the configuration file." |
||||||
|
) |
||||||
|
|
||||||
|
parser.add_argument( |
||||||
|
"-c", |
||||||
|
"--color", |
||||||
|
action="store_true", |
||||||
|
dest="color_enabled", |
||||||
|
help="Enable code highlighting for terminal output." |
||||||
|
) |
||||||
|
|
||||||
|
parser.add_argument( |
||||||
|
"-C=", |
||||||
|
"--context=", |
||||||
|
action="append", |
||||||
|
dest="variables", |
||||||
|
help="Context variables for use in pre-parsing the config and templates. In the form of: name:value" |
||||||
|
) |
||||||
|
|
||||||
|
parser.add_argument( |
||||||
|
"-d", |
||||||
|
"--docs", |
||||||
|
action="store_true", |
||||||
|
dest="docs_enabled", |
||||||
|
help="Output documentation instead of code." |
||||||
|
) |
||||||
|
|
||||||
|
parser.add_argument( |
||||||
|
"-D", |
||||||
|
"--debug", |
||||||
|
action="store_true", |
||||||
|
dest="debug_enabled", |
||||||
|
help="Enable debug output." |
||||||
|
) |
||||||
|
|
||||||
|
parser.add_argument( |
||||||
|
"-f=", |
||||||
|
"--filter=", |
||||||
|
action="append", |
||||||
|
dest="filters", |
||||||
|
help="Filter the commands in the form of: attribute:value" |
||||||
|
) |
||||||
|
|
||||||
|
parser.add_argument( |
||||||
|
"-o=", |
||||||
|
"--option=", |
||||||
|
action="append", |
||||||
|
dest="options", |
||||||
|
help="Common command options in the form of: name:value" |
||||||
|
) |
||||||
|
|
||||||
|
parser.add_argument( |
||||||
|
"-P=", |
||||||
|
"--profile=", |
||||||
|
choices=["centos", "ubuntu"], |
||||||
|
default="ubuntu", |
||||||
|
dest="profile", |
||||||
|
help="The OS profile to use." |
||||||
|
) |
||||||
|
|
||||||
|
parser.add_argument( |
||||||
|
"-T=", |
||||||
|
"--template-path=", |
||||||
|
action="append", |
||||||
|
dest="template_locations", |
||||||
|
help="The location of template files that may be used with the template command." |
||||||
|
) |
||||||
|
|
||||||
|
parser.add_argument( |
||||||
|
"-w=", |
||||||
|
"--write=", |
||||||
|
dest="output_file", |
||||||
|
help="Write the output to disk." |
||||||
|
) |
||||||
|
|
||||||
|
parser.add_argument( |
||||||
|
"-V=", |
||||||
|
"--variables-file=", |
||||||
|
dest="variables_file", |
||||||
|
help="Load variables from a file." |
||||||
|
) |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Access to the version number requires special consideration, especially |
||||||
|
# when using sub parsers. The Python 3.3 behavior is different. See this |
||||||
|
# answer: http://stackoverflow.com/questions/8521612/argparse-optional-subparser-for-version |
||||||
|
parser.add_argument( |
||||||
|
"-v", |
||||||
|
action="version", |
||||||
|
help="Show version number and exit.", |
||||||
|
version=__version__ |
||||||
|
) |
||||||
|
|
||||||
|
parser.add_argument( |
||||||
|
"--version", |
||||||
|
action="version", |
||||||
|
help="Show verbose version information and exit.", |
||||||
|
version="%(prog)s" + " %s %s by %s" % (__version__, __date__, __author__) |
||||||
|
) |
||||||
|
|
||||||
|
# Parse arguments. |
||||||
|
args = parser.parse_args() |
||||||
|
|
||||||
|
if args.debug_enabled: |
||||||
|
log.setLevel(DEBUG) |
||||||
|
|
||||||
|
log.debug("Namespace: %s" % args) |
||||||
|
|
||||||
|
# Create the global context. |
||||||
|
context = Context() |
||||||
|
|
||||||
|
if args.variables_file: |
||||||
|
variables = load_variables(args.variables_file) |
||||||
|
for v in variables: |
||||||
|
context.variables[v.name] = v |
||||||
|
|
||||||
|
if args.variables: |
||||||
|
for token in args.variables: |
||||||
|
try: |
||||||
|
key, value = token.split(":") |
||||||
|
context.add(key, smart_cast(value)) |
||||||
|
except ValueError: |
||||||
|
context.add(token, True) |
||||||
|
|
||||||
|
# Capture filters. |
||||||
|
if args.filters: |
||||||
|
filters = dict() |
||||||
|
for token in args.filters: |
||||||
|
key, value = token.split(":") |
||||||
|
if key not in filters: |
||||||
|
filters[key] = list() |
||||||
|
|
||||||
|
filters[key].append(value) |
||||||
|
|
||||||
|
# Handle options. |
||||||
|
options = dict() |
||||||
|
if args.options: |
||||||
|
for token in args.options: |
||||||
|
try: |
||||||
|
key, value = token.split(":") |
||||||
|
options[key] = smart_cast(value) |
||||||
|
except ValueError: |
||||||
|
options[token] = True |
||||||
|
|
||||||
|
# Load the commands. |
||||||
|
if args.path.endswith(".ini"): |
||||||
|
loader = INILoader( |
||||||
|
args.path, |
||||||
|
context=context, |
||||||
|
locations=args.template_locations, |
||||||
|
profile=args.profile, |
||||||
|
**options |
||||||
|
) |
||||||
|
elif args.path.endswith(".yml"): |
||||||
|
loader = YMLLoader( |
||||||
|
args.path, |
||||||
|
context=context, |
||||||
|
locations=args.template_locations, |
||||||
|
profile=args.profile, |
||||||
|
**options |
||||||
|
) |
||||||
|
else: |
||||||
|
log.error("Unsupported file format: %s" % args.path) |
||||||
|
exit(EXIT.ERROR) |
||||||
|
|
||||||
|
# noinspection PyUnboundLocalVariable |
||||||
|
if not loader.load(): |
||||||
|
exit(EXIT.ERROR) |
||||||
|
|
||||||
|
# Generate output. |
||||||
|
if args.docs_enabled: |
||||||
|
pass |
||||||
|
else: |
||||||
|
commands = list() |
||||||
|
for snippet in loader.get_snippets(): |
||||||
|
statement = snippet.get_statement() |
||||||
|
if statement is not None: |
||||||
|
commands.append(statement) |
||||||
|
commands.append("") |
||||||
|
|
||||||
|
if args.color_enabled: |
||||||
|
print(highlight_code("\n".join(commands), language="bash")) |
||||||
|
else: |
||||||
|
print("\n".join(commands)) |
||||||
|
|
||||||
|
exit(EXIT.OK) |
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__': |
||||||
|
execute() |
||||||
|
|
||||||
|
|
@ -0,0 +1,180 @@ |
|||||||
|
[update system repos] |
||||||
|
system.update: |
||||||
|
|
||||||
|
[install apache] |
||||||
|
install: apache2 |
||||||
|
|
||||||
|
[install certbot] |
||||||
|
install: certbot |
||||||
|
|
||||||
|
[make sure a maintenance root exists] |
||||||
|
mkdir: /var/www/maint/www |
||||||
|
group: {{ apache_group }} |
||||||
|
owner: {{ apache_user }} |
||||||
|
recursive: yes |
||||||
|
|
||||||
|
[disable the default site] |
||||||
|
apache.disable: 000-default |
||||||
|
|
||||||
|
[install postgres] |
||||||
|
install: postgresql |
||||||
|
|
||||||
|
[install php and related resources] |
||||||
|
install: $item |
||||||
|
items: php, libapache2-mod-php, php-pgsql |
||||||
|
|
||||||
|
[install php modules] |
||||||
|
install: $item |
||||||
|
items: php-curl, php-dom, php-gd, php-json, php-mbstring, php-pdo-pgsql, php-zip |
||||||
|
|
||||||
|
[create the document root for the domain] |
||||||
|
dir: /var/www/{{ domain_tld }}/www |
||||||
|
group: {{ apache_group }} |
||||||
|
owner: {{ apache_user }} |
||||||
|
recursive: yes |
||||||
|
|
||||||
|
[prevent browsing of document root] |
||||||
|
file: /var/www/{{ domain_tld }}/www/index.html |
||||||
|
group: {{ apache_group }} |
||||||
|
owner: {{ apache_user }} |
||||||
|
|
||||||
|
[create the initial apache config file] |
||||||
|
template: httpd.conf /etc/apache2/sites-available/{{ domain_name }}.conf |
||||||
|
|
||||||
|
[enable the site] |
||||||
|
apache.enable: {{ domain_name }} |
||||||
|
|
||||||
|
[enable mod rewrite] |
||||||
|
apache.enable_module: rewrite |
||||||
|
|
||||||
|
[enable SSL engine] |
||||||
|
apache.enable_module: ssl |
||||||
|
|
||||||
|
[enable php ctype] |
||||||
|
run: "phpenmod ctype" |
||||||
|
|
||||||
|
[enable php curl] |
||||||
|
run: "phpenmod curl" |
||||||
|
|
||||||
|
[enable php dom] |
||||||
|
run: "phpenmod dom" |
||||||
|
|
||||||
|
[enable php GD] |
||||||
|
run: "phpenmod gd" |
||||||
|
|
||||||
|
[enable php JSON] |
||||||
|
run: "phpenmod json" |
||||||
|
|
||||||
|
[enable php PGSQL] |
||||||
|
run: "phpenmod pdo_pgsql" |
||||||
|
|
||||||
|
[enable php SimpleXML] |
||||||
|
run: "phpenmod simplexml" |
||||||
|
|
||||||
|
[enable php posix] |
||||||
|
run: "phpenmod posix" |
||||||
|
|
||||||
|
[enable php XMLReader] |
||||||
|
run: "phpenmod xmlreader" |
||||||
|
|
||||||
|
[enable php XMLWriter] |
||||||
|
run: "phpenmod xmlwriter" |
||||||
|
|
||||||
|
[enable php zip] |
||||||
|
run: "phpenmod zip" |
||||||
|
|
||||||
|
;PHP module libxml (Linux package libxml2 must be >=2.7.0) |
||||||
|
;php -i | grep -i libxml |
||||||
|
|
||||||
|
; https://askubuntu.com/questions/323005/php-openssl-extension-has-a-package |
||||||
|
; php -i | grep -i openssl |
||||||
|
;PHP module openssl |
||||||
|
|
||||||
|
;php -i | grep -i openssl |
||||||
|
;PHP module session |
||||||
|
|
||||||
|
;php -i | grep -i zlib |
||||||
|
;PHP module zlib |
||||||
|
|
||||||
|
[reload apache] |
||||||
|
apache.reload: |
||||||
|
|
||||||
|
[get an SSL cert] |
||||||
|
ssl: {{ domain_name }} |
||||||
|
email: {{ webmaster_email }} |
||||||
|
|
||||||
|
[create the SSL version of the apache config file] |
||||||
|
template: httpd.conf /etc/apache2/sites-available/{{ domain_name }}.conf |
||||||
|
ssl_enabled: yes |
||||||
|
|
||||||
|
[restart apache] |
||||||
|
apache.restart: |
||||||
|
|
||||||
|
[create the install path for nextcloud] |
||||||
|
dir: /var/www/{{ domain_tld }}/www{{ install_path }} |
||||||
|
group: {{ apache_group }} |
||||||
|
owner: {{ apache_user }} |
||||||
|
recursive: yes |
||||||
|
|
||||||
|
[get the nextcloud installer] |
||||||
|
run: "wget https://download.nextcloud.com/server/installer/setup-nextcloud.php" |
||||||
|
cd: /var/www/{{ domain_tld }}/www{{ install_path }} |
||||||
|
|
||||||
|
; createuser -U postgres -DRS {{ install_path }}_nextcloud |
||||||
|
; createdb -U postgres -O diff6_nextcloud diff6_nextcloud |
||||||
|
; psql -U postgres -c "ALTER USER diff6_nextcloud WITH ENCRYPTED PASSWORD '******'" |
||||||
|
|
||||||
|
; https://docs.nextcloud.com/server/latest/admin_manual/installation/source_installation.html |
||||||
|
; Recommended packages: |
||||||
|
; |
||||||
|
;PHP module fileinfo (highly recommended, enhances file analysis performance) |
||||||
|
; |
||||||
|
;PHP module bz2 (recommended, required for extraction of apps) |
||||||
|
; |
||||||
|
;PHP module intl (increases language translation performance and fixes sorting of non-ASCII characters) |
||||||
|
; |
||||||
|
;Required for specific apps: |
||||||
|
; |
||||||
|
;PHP module ldap (for LDAP integration) |
||||||
|
; |
||||||
|
;PHP module smbclient (SMB/CIFS integration, see SMB/CIFS) |
||||||
|
; |
||||||
|
;PHP module ftp (for FTP storage / external user authentication) |
||||||
|
; |
||||||
|
;PHP module imap (for external user authentication) |
||||||
|
; |
||||||
|
;PHP module bcmath (for passwordless login) |
||||||
|
; |
||||||
|
;PHP module gmp (for passwordless login) |
||||||
|
; |
||||||
|
;Recommended for specific apps (optional): |
||||||
|
; |
||||||
|
;PHP module gmp (for SFTP storage) |
||||||
|
; |
||||||
|
;PHP module exif (for image rotation in pictures app) |
||||||
|
; |
||||||
|
;For enhanced server performance (optional) select one of the following memcaches: |
||||||
|
; |
||||||
|
;PHP module apcu (>= 4.0.6) |
||||||
|
; |
||||||
|
;PHP module memcached |
||||||
|
; |
||||||
|
;PHP module redis (>= 2.2.6, required for Transactional File Locking) |
||||||
|
; |
||||||
|
;See Memory caching to learn how to select and configure a memcache. |
||||||
|
; |
||||||
|
;For preview generation (optional): |
||||||
|
; |
||||||
|
;PHP module imagick |
||||||
|
; |
||||||
|
;avconv or ffmpeg |
||||||
|
; |
||||||
|
;OpenOffice or LibreOffice |
||||||
|
; |
||||||
|
;For command line processing (optional): |
||||||
|
; |
||||||
|
;PHP module pcntl (enables command interruption by pressing ctrl-c) |
||||||
|
; |
||||||
|
;For command line updater (optional): |
||||||
|
; |
||||||
|
;PHP module phar (upgrades Nextcloud by running sudo -u www-data php /var/www/nextcloud/updater/updater.phar) |
@ -0,0 +1,28 @@ |
|||||||
|
# The port 80 host is required for renewing Let's Encrypt certificates. |
||||||
|
<VirtualHost *:80> |
||||||
|
ServerName {{ domain_name }} |
||||||
|
ServerAlias *.{{ domain_name }} |
||||||
|
ServerAdmin {{ webmaster_email }} |
||||||
|
RewriteEngine On |
||||||
|
RewriteCond %{HTTPS} off |
||||||
|
RewriteCond %{REQUEST_URI} !^/.well-known [NC] |
||||||
|
RewriteRule (.*) https://%{SERVER_NAME}/$1 [R,L] |
||||||
|
DocumentRoot /var/www/maint/www |
||||||
|
</VirtualHost> |
||||||
|
|
||||||
|
{% if ssl_enabled %} |
||||||
|
# The 443 host is where the project is actually served. |
||||||
|
<VirtualHost *:443> |
||||||
|
ServerName {{ domain_name }} |
||||||
|
ServerAdmin {{ webmaster_email }} |
||||||
|
DocumentRoot /var/www/{{ domain_tld }}/www |
||||||
|
|
||||||
|
ErrorLog ${APACHE_LOG_DIR}/error.log |
||||||
|
CustomLog ${APACHE_LOG_DIR}/access.log combined |
||||||
|
|
||||||
|
SSLEngine on |
||||||
|
SSLCertificateKeyFile /etc/letsencrypt/live/{{ domain_name }}/privkey.pem |
||||||
|
SSLCertificateFile /etc/letsencrypt/live/{{ domain_name }}/fullchain.pem |
||||||
|
|
||||||
|
</VirtualHost> |
||||||
|
{% endif %} |
@ -0,0 +1,23 @@ |
|||||||
|
[apache_user] |
||||||
|
comment = The name of the user that runs Apache. |
||||||
|
value = www-data |
||||||
|
|
||||||
|
[apache_group] |
||||||
|
comment = The name of the group to which the Apache user is assigned. |
||||||
|
value = www-data |
||||||
|
|
||||||
|
[domain_name] |
||||||
|
comment = The domain name to use for the NextCloud host. |
||||||
|
value = cloud.example.com |
||||||
|
|
||||||
|
[domain_tld] |
||||||
|
comment = The domain name as a directory. |
||||||
|
value = cloud_example_com |
||||||
|
|
||||||
|
[webmaster_email] |
||||||
|
comment = The webmaster's email address. Used when setting up SSL. |
||||||
|
value = webmaster@example.com |
||||||
|
|
||||||
|
[install_path] |
||||||
|
comment = The path relative to document root where NextCloud will be installed. |
||||||
|
value = / |
@ -0,0 +1,2 @@ |
|||||||
|
[create pg_hba.conf file] |
||||||
|
template: pg_hba.conf /etc/postgresql/{{ pgsql_version}}/main/pg_hba.conf |
@ -0,0 +1,8 @@ |
|||||||
|
# TYPE DATABASE USER ADDRESS METHOD |
||||||
|
local all postgres trust |
||||||
|
local sameuser all md5 |
||||||
|
host all postgres ::1/128 trust |
||||||
|
host all postgres localhost trust |
||||||
|
host sameuser all ::1/128 md5 |
||||||
|
host sameuser all localhost md5 |
||||||
|
host sameuser all 127.0.0.1/32 md5 |
@ -0,0 +1,3 @@ |
|||||||
|
[pgsql_version] |
||||||
|
comment = The current version of PostgreSQL. |
||||||
|
value = 12 |
@ -0,0 +1,2 @@ |
|||||||
|
[setup restricted ssh] |
||||||
|
template: sshd_config /etc/ssh/sshd_config |
@ -0,0 +1,10 @@ |
|||||||
|
Port 4894 |
||||||
|
AddressFamily inet |
||||||
|
PermitRootLogin no |
||||||
|
PasswordAuthentication no |
||||||
|
ChallengeResponseAuthentication no |
||||||
|
UsePAM yes |
||||||
|
X11Forwarding yes |
||||||
|
PrintMotd no |
||||||
|
AcceptEnv LANG LC_* |
||||||
|
Subsystem sftp /usr/lib/openssh/sftp-server |
Loading…
Reference in new issue