206 lines
5.8 KiB
Python
Executable File
206 lines
5.8 KiB
Python
Executable File
#!/usr/bin/python
|
|
# -*- coding: utf-8 -*-
|
|
"""
|
|
debops-init: create a new DebOps project directory
|
|
"""
|
|
# Copyright (C) 2014-2015 Hartmut Goebel <h.goebel@crazy-compilers.com>
|
|
# Part of the DebOps - https://debops.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,
|
|
# write to the Free Software Foundation, Inc., 59
|
|
# Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
#
|
|
# An on-line copy of the GNU General Public License can
|
|
# be downloaded from the FSF web page at:
|
|
# https://www.gnu.org/copyleft/gpl.html
|
|
|
|
from __future__ import print_function
|
|
|
|
import os
|
|
import codecs
|
|
import subprocess
|
|
import glob
|
|
import argparse
|
|
|
|
from debops import *
|
|
from debops.cmds import *
|
|
|
|
__author__ = "Hartmut Goebel <h.goebel@crazy-compilers.com>"
|
|
__copyright__ = "Copyright 2014-2015 by Hartmut Goebel <h.goebel@crazy-compilers.com>"
|
|
__licence__ = "GNU General Public License version 3 (GPL v3) or later"
|
|
|
|
SKEL_DIRS = (
|
|
os.path.join("ansible", INVENTORY, "group_vars", "all"),
|
|
os.path.join("ansible", INVENTORY, "host_vars"),
|
|
os.path.join("ansible", "playbooks"),
|
|
os.path.join("ansible", "roles"),
|
|
)
|
|
|
|
DEFAULT_DEBOPS_CONFIG = """
|
|
# -*- conf -*-
|
|
|
|
[paths]
|
|
;data-home: /opt/debops
|
|
|
|
[ansible defaults]
|
|
display_skipped_hosts = False
|
|
retry_files_enabled = False
|
|
;callback_plugins = /my/plugins/callback
|
|
;roles_path = /my/roles
|
|
|
|
[ansible paramiko]
|
|
;record_host_keys=True
|
|
|
|
[ansible ssh_connection]
|
|
;ssh_args = -o ControlMaster=auto -o ControlPersist=60s
|
|
"""
|
|
|
|
DEFAULT_GITIGNORE = """\
|
|
ansible/{SECRET_NAME}
|
|
{SECRET_NAME}
|
|
{ENCFS_PREFIX}{SECRET_NAME}
|
|
ansible.cfg
|
|
|
|
#-- python
|
|
*.py[co]
|
|
|
|
#-- vim
|
|
[._]*.s[a-w][a-z]
|
|
[._]s[a-w][a-z]
|
|
*.un~
|
|
Session.vim
|
|
.netrwhist
|
|
*~
|
|
|
|
#-- Emacs
|
|
\#*\#
|
|
/.emacs.desktop
|
|
/.emacs.desktop.lock
|
|
*.elc
|
|
auto-save-list
|
|
tramp
|
|
.\#*
|
|
|
|
#-- SublimeText
|
|
*.sublime-workspace
|
|
#*.sublime-project
|
|
|
|
#-- sftp configuration file
|
|
sftp-config.json
|
|
"""
|
|
|
|
HOSTS_FILE_HEADER = """\
|
|
# This is an Ansible inventory file in INI format. You can define a list of
|
|
# hosts and groups to be managed by this particular inventory.
|
|
|
|
# Hosts listed under [debops_all_hosts] will have common DebOps plays
|
|
# ran against them. It will include services such as iptables, DNS, Postfix,
|
|
# sshd configuration and more.
|
|
#
|
|
# View the list here:
|
|
# https://github.com/debops/debops-playbooks/blob/master/playbooks/common.yml
|
|
#
|
|
# You should check Getting Started guide for useful suggestions:
|
|
# https://docs.debops.org/en/latest/debops-playbooks/docs/guides/getting-started.html
|
|
"""
|
|
|
|
HOSTS_FILE_CONTENT_CONTROLER = """
|
|
# Your host is eligible to be managed by DebOps' common playbook. If you want
|
|
# that functionality and more, then uncomment your hostname below.
|
|
|
|
[debops_all_hosts]
|
|
#%s ansible_connection=local
|
|
""" % platform.node()
|
|
|
|
HOSTS_FILE_CONTENT_NO_CONTROLER = """
|
|
# Your host was not detected as compatible with DebOps playbooks, so you will
|
|
# not be able to leverage the above features on your current operating system.
|
|
# You can however use a virtual machine as the Ansible Controller.
|
|
|
|
[debops_all_hosts]
|
|
|
|
"""
|
|
|
|
|
|
def write_file(filename, *content):
|
|
"""
|
|
If file:`filename` does not exist, create it and write
|
|
var:`content` into it.
|
|
"""
|
|
if not os.path.exists(filename):
|
|
with open(filename, "w") as fh:
|
|
fh.writelines(content)
|
|
|
|
|
|
def write_config_files(project_root):
|
|
"""
|
|
Create the default debops-config files in the dir:`project_root`
|
|
directory.
|
|
"""
|
|
# Create .debops.cfg
|
|
write_file(os.path.join(project_root, DEBOPS_CONFIG), DEFAULT_DEBOPS_CONFIG)
|
|
# Create .gitignore
|
|
write_file(os.path.join(project_root, '.gitignore'),
|
|
DEFAULT_GITIGNORE.format(SECRET_NAME=SECRET_NAME, ENCFS_PREFIX=ENCFS_PREFIX))
|
|
|
|
hosts_filename = os.path.join(project_root, "ansible", INVENTORY, "hosts")
|
|
# Swap in different hosts file content depending on the host's OS/distro
|
|
if (platform.system() == "Linux" and
|
|
platform.linux_distribution()[0].lower() in ("debian", "ubuntu")):
|
|
write_file(hosts_filename,
|
|
HOSTS_FILE_HEADER, HOSTS_FILE_CONTENT_CONTROLER)
|
|
else:
|
|
write_file(hosts_filename,
|
|
HOSTS_FILE_HEADER, HOSTS_FILE_CONTENT_NO_CONTROLER)
|
|
|
|
|
|
def main(project_root):
|
|
orig_project_root = project_root
|
|
project_root = os.path.abspath(project_root)
|
|
|
|
#-- Check for existing debops project directory
|
|
debops_project_root = find_debops_project(project_root, required=False)
|
|
|
|
# Exit if DebOps configuration file has been found in project_dir
|
|
if os.path.exists(os.path.join(project_root, DEBOPS_CONFIG)):
|
|
error_msg("%s is already a DebOps project directory" % project_root)
|
|
|
|
# Exit if we are in a DebOps project dir and nested project would be created
|
|
if debops_project_root:
|
|
error_msg("You are inside %s project already" % debops_project_root)
|
|
|
|
#-- Main script
|
|
|
|
print("Creating new DebOps project directory in", orig_project_root, "...")
|
|
|
|
# Create base project directories
|
|
for skel_dir in SKEL_DIRS:
|
|
skel_dir = os.path.join(project_root, skel_dir)
|
|
if not os.path.isdir(skel_dir):
|
|
os.makedirs(skel_dir)
|
|
# Write default config files
|
|
write_config_files(project_root)
|
|
|
|
|
|
parser = argparse.ArgumentParser()
|
|
parser.add_argument('project_dir', default=os.curdir)
|
|
args = parser.parse_args()
|
|
|
|
try:
|
|
main(args.project_dir)
|
|
except KeyboardInterrupt:
|
|
raise SystemExit('... aborted')
|