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')
 |