Skip to content

Commit

Permalink
Installation of puppet using PC repositories on Debian
Browse files Browse the repository at this point in the history
  • Loading branch information
Suszyński Krzysztof committed Jul 13, 2017
1 parent a5044e8 commit 4bea9be
Show file tree
Hide file tree
Showing 30 changed files with 266 additions and 57 deletions.
2 changes: 1 addition & 1 deletion MANIFEST.in
Expand Up @@ -3,4 +3,4 @@ include LICENSE

# Include the data files
recursive-include puppeter *.py
recursive-include data *.sh
recursive-include puppeter *.sh
9 changes: 0 additions & 9 deletions data/templates/installer/pc/debian/puppetserver.sh

This file was deleted.

13 changes: 0 additions & 13 deletions data/templates/installer/pc4x/debian/repo.sh

This file was deleted.

4 changes: 4 additions & 0 deletions puppeter/domain/gateway/answers.py
@@ -1,12 +1,16 @@
from six import with_metaclass
from abc import ABCMeta, abstractmethod

from puppeter.domain.model.answers import Answers # NOQA


class AnswersGateway(with_metaclass(ABCMeta, object)):
@abstractmethod
def read_answers_from_file(self, file):
# type: (file) -> Answers
pass

@abstractmethod
def write_answers_to_file(self, answers, file):
# type: (Answers, file) -> None
pass
72 changes: 71 additions & 1 deletion puppeter/domain/model/configurer.py
@@ -1,9 +1,79 @@
from abc import ABCMeta, abstractmethod
from six import with_metaclass
from collections import OrderedDict
from string import Template

import pkg_resources
import re
from six import with_metaclass, iteritems


class Configurer(with_metaclass(ABCMeta, object)):
@abstractmethod
def produce_commands(self):
# type: () -> [str]
raise NotImplementedError()

def _collector(self):
# type: () -> self.CommandsCollector
return self.CommandsCollector(self)

class BashTemplate(Template):
delimiter = '@'
flags = re.MULTILINE

class CommandsCollector:

SHEBANG_REGEX = re.compile('^#!(.*)\n', re.MULTILINE)

def __init__(self, configurer):
self.__parts = OrderedDict()
self.__configurer = configurer # type: Configurer

def collect_from_template(self, description, template, mapping):
# type: (str, str, dict) -> Configurer.CommandsCollector
script = self.__template(template) \
.substitute(mapping)
self.__parts[description] = script
return self

def collect_from_file(self, description, path):
# type: (str, str) -> Configurer.CommandsCollector
script = self.__resource_string(path)
self.__parts[description] = script
return self

def lines(self):
# type: () -> str
lines = ['#!/usr/bin/env bash -ex', '']
i = 1
for (description, script) in iteritems(self.__parts):
lines.append('# Part %d: %s' % (i, description))
lines += self.__strip_shebang(script).split("\n")
i += 1
return lines

def __template(self, path):
# type: (str) -> Configurer.BashTemplate
return Configurer.BashTemplate(self.__resource_string(path))

def __resource_string(self, path):
# noinspection PyTypeChecker
return self.__load_resource(pkg_resources.resource_string, self.__configurer, path)\
.decode("utf-8")

@staticmethod
def __load_resource(loader, obj, path):
mod = Configurer.CommandsCollector.__moduleof(obj)
return loader(mod, path)

@staticmethod
def __moduleof(cls):
try:
cls = cls.original_cls()
except AttributeError:
cls = cls.__class__
return cls.__module__

@staticmethod
def __strip_shebang(script):
return re.sub(Configurer.CommandsCollector.SHEBANG_REGEX, "", script)
3 changes: 2 additions & 1 deletion puppeter/domain/model/installer.py
Expand Up @@ -10,7 +10,7 @@ class Mode(Enum):

class Installer:
def __init__(self):
self.__mode = Mode.Agent
self.__mode = Mode.Agent # type: Mode

def raw_options(self):
# noinspection PyUnresolvedReferences
Expand All @@ -27,6 +27,7 @@ def read_raw_options(self, options):
pass

def mode(self):
# type: () -> Mode
return self.__mode


Expand Down
12 changes: 6 additions & 6 deletions puppeter/persistence/gateway/installer/debian/__init__.py
Expand Up @@ -2,9 +2,9 @@
from puppeter.container import Named
from puppeter.domain.model.configurer import Configurer
from puppeter.domain.gateway.installer import InstallerGateway
from puppeter.persistence.gateway.installer.debian.pc3x import PC3xConfigurer
from puppeter.persistence.gateway.installer.debian.pc4x import PC4xConfigurer
from puppeter.persistence.gateway.installer.debian.pc5x import PC5xConfigurer
from puppeter.persistence.gateway.installer.debian.pc3x import DebianPC3xConfigurer
from puppeter.persistence.gateway.installer.debian.pc4x import DebianPC4xConfigurer
from puppeter.persistence.gateway.installer.debian.pc5x import DebianPC5xConfigurer


@Named('debian')
Expand All @@ -19,6 +19,6 @@ def _provide_configurer(self, installer):


container.bind(InstallerGateway, DebianInstallerGateway)
container.bind(Configurer, PC3xConfigurer)
container.bind(Configurer, PC4xConfigurer)
container.bind(Configurer, PC5xConfigurer)
container.bind(Configurer, DebianPC3xConfigurer)
container.bind(Configurer, DebianPC4xConfigurer)
container.bind(Configurer, DebianPC5xConfigurer)
16 changes: 16 additions & 0 deletions puppeter/persistence/gateway/installer/debian/after4x.py
@@ -0,0 +1,16 @@
from abc import ABCMeta

from six import with_metaclass

from puppeter.persistence.gateway.installer.debian.base import BaseDebianConfigurer


class AfterPuppet4xConfigurer(with_metaclass(ABCMeta, BaseDebianConfigurer)):
def __init__(self, installer):
super(AfterPuppet4xConfigurer, self).__init__(installer)

def _collect_agent(self, collector):
collector.collect_from_file('Puppet Agent setup', 'puppetagent.sh')

def _collect_server(self, collector):
collector.collect_from_file('Puppet Server setup', 'puppetserver.sh')
10 changes: 10 additions & 0 deletions puppeter/persistence/gateway/installer/debian/apt-update.sh
@@ -0,0 +1,10 @@
#!/usr/bin/env bash
function getLastAptGetUpdate() {
local aptDate="$(stat -c %Y '/var/cache/apt')"
local nowDate="$(date +'%s')"

echo $((nowDate - aptDate))
}
if [[ "$(getLastAptGetUpdate)" -gt '@{interval}' ]]; then
apt-get update -m
fi
41 changes: 41 additions & 0 deletions puppeter/persistence/gateway/installer/debian/base.py
@@ -0,0 +1,41 @@
from abc import ABCMeta, abstractmethod

from six import with_metaclass

from puppeter.domain.model import Installer # NOQA
from puppeter.domain.model.configurer import Configurer
from puppeter.domain.model.installer import Mode


class BaseDebianConfigurer(with_metaclass(ABCMeta, Configurer)):
UPDATE_INTERVAL = 24 * 60 * 60

def __init__(self, installer):
self._installer = installer # type: Installer

def produce_commands(self):
collector = self._collector()
collector.collect_from_template('apt system update',
'apt-update.sh',
dict(interval=self.UPDATE_INTERVAL))
collector.collect_from_file('wget downloader', 'wget.sh')
self._collect_repo(collector)
self._collect_agent(collector)
if self._installer.mode() == Mode.Server:
self._collect_server(collector)
return collector.lines()

@abstractmethod
def _collect_repo(self, collector):
# type: (Configurer.CommandsCollector) -> None
raise NotImplementedError()

@abstractmethod
def _collect_agent(self, collector):
# type: (Configurer.CommandsCollector) -> None
raise NotImplementedError()

@abstractmethod
def _collect_server(self, collector):
# type: (Configurer.CommandsCollector) -> None
raise NotImplementedError()
11 changes: 11 additions & 0 deletions puppeter/persistence/gateway/installer/debian/pc3x-repo.sh
@@ -0,0 +1,11 @@
#!/usr/bin/env bash
set +e
if ! dpkg -l 'puppetlabs-release' | grep -q ii; then
set -e
cd /tmp
wget 'https://apt.puppetlabs.com/puppetlabs-release-@{codename}.deb'
sudo dpkg -i 'puppetlabs-release-@{codename}.deb'
rm 'puppetlabs-release-@{codename}.deb'
cd -
sudo apt-get update
fi
23 changes: 18 additions & 5 deletions puppeter/persistence/gateway/installer/debian/pc3x.py
@@ -1,11 +1,24 @@
from puppeter.container import Named
from puppeter.domain.model.configurer import Configurer
from puppeter.domain.facter import Facter
from puppeter.domain.model.osfacts import OperatingSystemCodename
from puppeter.persistence.gateway.installer.debian.base import BaseDebianConfigurer


@Named('pc3x-debian')
class PC3xConfigurer(Configurer):
class DebianPC3xConfigurer(BaseDebianConfigurer):
def __init__(self, installer):
self.installer = installer
BaseDebianConfigurer.__init__(self, installer)

def produce_commands(self):
raise NotImplementedError('Not yet implemented!')
def _collect_repo(self, collector):
codename = Facter.get(OperatingSystemCodename)
collector.collect_from_template(
'Puppet Package Repository setup (Puppet OSS 3.x)',
'pc3x-repo.sh',
dict(codename=codename)
)

def _collect_agent(self, collector):
collector.collect_from_file('Puppet agent setup', 'puppet3xagent.sh')

def _collect_server(self, collector):
collector.collect_from_file('PuppetMaster setup', 'puppetmaster.sh')
11 changes: 11 additions & 0 deletions puppeter/persistence/gateway/installer/debian/pc4x-repo.sh
@@ -0,0 +1,11 @@
#!/usr/bin/env bash
set +e
if ! dpkg -l 'puppetlabs-release-pc1' | grep -q ii; then
set -e
cd /tmp
wget 'https://apt.puppetlabs.com/puppetlabs-release-pc1-@{codename}.deb'
sudo dpkg -i 'puppetlabs-release-pc1-@{codename}.deb'
rm 'puppetlabs-release-pc1-@{codename}.deb'
cd -
sudo apt-get update
fi
17 changes: 10 additions & 7 deletions puppeter/persistence/gateway/installer/debian/pc4x.py
@@ -1,16 +1,19 @@
from puppeter.container import Named
from puppeter.domain.facter import Facter
from puppeter.domain.model.osfacts import OperatingSystemCodename
from puppeter.domain.model.configurer import Configurer
from puppeter.persistence.gateway.installer.debian.after4x import AfterPuppet4xConfigurer


@Named('pc4x-debian')
class PC4xConfigurer(Configurer):
class DebianPC4xConfigurer(AfterPuppet4xConfigurer):

def __init__(self, installer):
self.__installer = installer
AfterPuppet4xConfigurer.__init__(self, installer)

def produce_commands(self):
def _collect_repo(self, collector):
codename = Facter.get(OperatingSystemCodename)
cmds = []
cmds.append("")
raise NotImplementedError('Not yet implemented! %s' % codename)
collector.collect_from_template(
'Puppet Labs Collection Repository (PC1) setup (Puppet OSS 4.x)',
'pc4x-repo.sh',
dict(codename=codename)
)
11 changes: 11 additions & 0 deletions puppeter/persistence/gateway/installer/debian/pc5x-repo.sh
@@ -0,0 +1,11 @@
#!/usr/bin/env bash
set +e
if ! dpkg -l 'puppet5-release' | grep -q ii; then
set -e
cd /tmp
wget 'https://apt.puppetlabs.com/puppet5-release-@{codename}.deb'
sudo dpkg -i 'puppet5-release-@{codename}.deb'
rm 'puppet5-release-@{codename}.deb'
cd -
sudo apt-get update
fi
18 changes: 13 additions & 5 deletions puppeter/persistence/gateway/installer/debian/pc5x.py
@@ -1,11 +1,19 @@
from puppeter.container import Named
from puppeter.domain.model.configurer import Configurer
from puppeter.domain.facter import Facter
from puppeter.domain.model.osfacts import OperatingSystemCodename
from puppeter.persistence.gateway.installer.debian.after4x import AfterPuppet4xConfigurer


@Named('pc5x-debian')
class PC5xConfigurer(Configurer):
class DebianPC5xConfigurer(AfterPuppet4xConfigurer):

def __init__(self, installer):
self.installer = installer
AfterPuppet4xConfigurer.__init__(self, installer)

def produce_commands(self):
raise NotImplementedError('Not yet implemented!')
def _collect_repo(self, collector):
codename = Facter.get(OperatingSystemCodename)
collector.collect_from_template(
'Puppet Platform Repository setup (Puppet OSS 5.x)',
'pc5x-repo.sh',
dict(codename=codename)
)
@@ -0,0 +1,6 @@
#!/usr/bin/env bash
set +e
if ! dpkg -l 'puppet' | grep -q ii; then
set -e
sudo apt-get install -y puppet
fi
@@ -1,9 +1,7 @@
#!/usr/bin/env bash

set -x
set +e

if ! dpkg -l 'puppet-agent' | grep -q ii; then
set -e
sudo apt-get install -y puppet-agent
exec env bash -l
fi
2 changes: 2 additions & 0 deletions puppeter/persistence/gateway/installer/debian/puppetmaster.sh
@@ -0,0 +1,2 @@
#!/usr/bin/env bash
puppet resource package puppetmaster ensure=installed
2 changes: 2 additions & 0 deletions puppeter/persistence/gateway/installer/debian/puppetserver.sh
@@ -0,0 +1,2 @@
#!/usr/bin/env bash
puppet resource package puppetserver ensure=installed
6 changes: 6 additions & 0 deletions puppeter/persistence/gateway/installer/debian/wget.sh
@@ -0,0 +1,6 @@
#!/usr/bin/env bash
set +e
if ! dpkg -l 'wget' | grep -q ii; then
set -e
sudo apt-get install -y wget
fi
2 changes: 1 addition & 1 deletion puppeter/presentation/app.py
Expand Up @@ -25,7 +25,7 @@ def run(self):
@staticmethod
def __stderr_handler():
handler = StreamHandler(stream=sys.stderr)
fmt = '%(levelname)s: %(message)s'
fmt = '# %(levelname)s: %(message)s'
handler.setFormatter(ColoredFormatter(fmt=fmt))
handler.setLevel(logging.NOTSET)
return handler
Expand Down

0 comments on commit 4bea9be

Please sign in to comment.