diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..cd596a2 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,29 @@ +FROM docker.io/fedora:25 + +MAINTAINER "James Antill" + +RUN dnf install -y --setopt=tsflags=nodocs samba && \ + dnf install -y --setopt=tsflags=nodocs /usr/bin/pidof && \ + dnf install -y --setopt=tsflags=nodocs python-mako PyYAML && \ + dnf -y clean all + +ADD files /files + +# mkdir -p /srv/samba/Demo/ +RUN mkdir -p /srv/samba +RUN /files/config.sh + +RUN sh -c 'date > /srv/samba/tst-build' + +EXPOSE 138/udp +EXPOSE 139 +EXPOSE 445 +EXPOSE 137/udp +EXPOSE 445/udp + + +# VOLUME ['/var/log', '/srv/samba'] + +# USER samba + +CMD ["/files/start.sh"] diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..3ceab2a --- /dev/null +++ b/Makefile @@ -0,0 +1,16 @@ +IMAGE_NAME = samba + +MODULEMDURL=file://samba.yaml + +default: run + +build: + docker build --tag=$(IMAGE_NAME) . + +run: build + docker run -d $(IMAGE_NAME) + +test: build + cd tests; MODULE=docker MODULEMD=$(MODULEMDURL) URL="docker=$(IMAGE_NAME)" make all + cd tests; MODULE=rpm MODULEMD=$(MODULEMDURL) URL="docker=$(IMAGE_NAME)" make all + diff --git a/files/config.sh b/files/config.sh new file mode 100755 index 0000000..04b4cdc --- /dev/null +++ b/files/config.sh @@ -0,0 +1,6 @@ +#! /bin/sh -e + +echo Config. +python /files/mako-render.py /files/smb.conf.mako /files/config.yaml \ + > /etc/samba/smb.conf + diff --git a/files/config.yaml b/files/config.yaml new file mode 100644 index 0000000..a95ab22 --- /dev/null +++ b/files/config.yaml @@ -0,0 +1,2 @@ +mounts: + - /srv/samba diff --git a/files/mako-render.py b/files/mako-render.py new file mode 100644 index 0000000..af7e9e8 --- /dev/null +++ b/files/mako-render.py @@ -0,0 +1,23 @@ +#!/usr/bin/python + +from __future__ import print_function, unicode_literals + +import argparse +import mako.template +import yaml + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument("template") + parser.add_argument("data") + options = parser.parse_args() + + with open(options.template) as stream: + template = mako.template.Template(stream.read()) + with open(options.data) as stream: + data = yaml.load(stream) + + print(template.render(**data)) + +if __name__ == '__main__': + main() diff --git a/files/smb.conf.mako b/files/smb.conf.mako new file mode 100644 index 0000000..d942f4b --- /dev/null +++ b/files/smb.conf.mako @@ -0,0 +1,20 @@ + +[global] + server string = Samba Server Version %v + security = user + map to guest = bad user + # guest account = samba + hosts allow = * + dead time = 15 + socket options = TCP_NODELAY SO_KEEPALIVE SO_RCVBUF=17520 SO_SNDBUF=17520 IPTOS_LOWDELAY + +[public] + comment = Public test + path = /srv/samba + public = yes + guest ok = yes + read only = yes + printable = no + writeable = no + browseable = yes + diff --git a/files/start.sh b/files/start.sh new file mode 100755 index 0000000..70fc982 --- /dev/null +++ b/files/start.sh @@ -0,0 +1,38 @@ +#! /bin/sh -e + +function first +{ + echo $1 +} + +function rest +{ + shift + echo $@ +} + +date > /srv/samba/tst-run + +/usr/sbin/nmbd -D +/usr/sbin/smbd -D + +waits="1 1 2 4 8 16 32 64 360" + +while pidof smbd > /dev/null && pidof nmbd > /dev/null ; do + date + echo "SMBd proces" $(pidof smbd) + echo "NMBd proces" $(pidof nmbd) + sleep $(first $waits) + if [ "x$(rest $waits)" != "x" ]; then + waits="$(rest $waits)" + fi + echo +done + +if ! pidof nmbd; then + echo "NMBd is not running." +fi + +if ! pidof smbd; then + echo "SMBd is not running." +fi diff --git a/samba.yaml b/samba.yaml index 9b06615..f6878d7 100644 --- a/samba.yaml +++ b/samba.yaml @@ -1,109 +1,22 @@ document: modulemd version: 1 data: - summary: samba module - description: This samba module has been generated. - license: - module: - - MIT - dependencies: - buildrequires: - bootstrap: master - requires: - platform: master - python2: master - python2-ecosystem: master - libtom: master - references: - community: https://docs.pagure.org/modularity/ - documentation: https://github.com/modularity-modules/samba - tracker: https://github.com/modularity-modules/samba - api: - rpms: - - libldb - - libsmbclient - - libtdb - - libwbclient - - python2-samba - - samba - - samba-client-libs - - samba-common - - samba-common-libs - - samba-common-tools - - samba-dc-libs - - samba-libs - - samba-winbind - - samba-winbind-modules - profiles: - default: - description: A generated profile based on top-lvl package list. - rpms: - - libldb - - libsmbclient - - libtdb - - libwbclient - - python2-samba - - samba - - samba-client-libs - - samba-common - - samba-common-libs - - samba-common-tools - - samba-dc-libs - - samba-libs - - samba-winbind - - samba-winbind-modules - client: - description: SMB File sharing client - rpms: - - libsmbclient - - libtdb - - samba-client - - samba-client-libs - - samba-common - - samba-common-libs - - samba-common-tools - server: - description: SMB File sharing server - rpms: - - libldb - - libtdb - - samba - - samba-common - - samba-common-libs - - samba-common-tools - - samba-libs - domainclient: - description: SMB Domain Client - rpms: - - libtdb - - libwbclient - - samba-client-libs - - samba-common - - samba-common-libs - - samba-common-tools - - samba-libs - - samba-winbind - - samba-winbind-modules - domaincontroller: - description: Windows Domain Controller - rpms: - - samba-dc - components: - rpms: - avahi: - rationale: Generated. - ref: 64b07e2fc1d770e12b97ef0296a62f80984d88c0 - cups: - rationale: Generated. - ref: b85c292042537a333350465e946606907214aeb5 - libldb: - rationale: Generated. - ref: df8cc6a1d9e2bb5296a46287ce03390b1201e5da - buildorder: 5 - libtdb: - rationale: Generated. - ref: 94c6c6d0e350e5e35776aace06cd0fafbaaa800d - samba: - rationale: Generated. - ref: 8b94bf9ddc2a818eace810b47957650b47383389 - buildorder: 10 + name: '' + stream: '' + summary: Server and Client software to interoperate with Windows machines + version: 0 + dependencies: + buildrequires: {bootstrap: f26} + requires: {bootstrap: f26} + description: 'Samba is the standard Windows interoperability suite of programs for + Linux and Unix.' + license: + content: [GPLv3+ and LGPLv3+] + module: [MIT] + api: + rpms: [samba, samba-common, samba-client] + components: + rpms: + samba: {buildorder: 10, rationale: Runtime dependency.} + + diff --git a/tests/Makefile b/tests/Makefile new file mode 100644 index 0000000..fa94987 --- /dev/null +++ b/tests/Makefile @@ -0,0 +1,7 @@ +MODULE_LINT=/usr/share/moduleframework/tools/modulelint.py +CMD=python -m avocado run --filter-by-tags=-WIP $(MODULE_LINT) *.py + +# +all: + generator + $(CMD) diff --git a/tests/config.yaml b/tests/config.yaml new file mode 100644 index 0000000..43a4585 --- /dev/null +++ b/tests/config.yaml @@ -0,0 +1,23 @@ +document: modularity-testing +version: 1 +name: samba +modulemd-url: http://pkgs.fedoraproject.org/cgit/modules/samba.git/tree/samba.yaml +service: + port: [138/udp, 139, 445, 137/udp, 445/udp] +packages: + rpms: + - samba +module: + docker: + start: "docker run -it -P" + labels: + description: "Server and Client software to interoperate with Windows machines" + io.k8s.description: "Server and Client software to interoperate with Windows machines" + source: https://github.com/container-images/samba.git + container: docker.io/modularitycontainers/samba + rpm: + start: /usr/sbin/smbd & + repo: https://kojipkgs.stg.fedoraproject.org/compose/branched/jkaluza/latest-Fedora-Modular-26/compose/Server/x86_64/os/ +test: + processrunning: + - 'ls /proc/*/exe -alh | grep smbd' diff --git a/tests/generated.py b/tests/generated.py new file mode 100644 index 0000000..7a60065 --- /dev/null +++ b/tests/generated.py @@ -0,0 +1,17 @@ +#!/usr/bin/python + +import socket +from avocado import main +from moduleframework import module_framework + +if __name__ == '__main__': + main() + +class GeneratedTestsConfig(module_framework.AvocadoTest): + """ + :avocado: enable + """ + + def test_processrunning(self): + self.start() + self.run("ls /proc/*/exe -alh | grep smbd") diff --git a/tests/generated.pyc b/tests/generated.pyc new file mode 100644 index 0000000..f945da1 Binary files /dev/null and b/tests/generated.pyc differ diff --git a/tests/sanity.py b/tests/sanity.py new file mode 100644 index 0000000..5a09e1e --- /dev/null +++ b/tests/sanity.py @@ -0,0 +1,51 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +# +# This Modularity Testing Framework helps you to write tests for modules +# Copyright (C) 2017 Red Hat, Inc. +# +# 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 +# he Free Software Foundation; either version 2 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., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Authors: Dominika Hodovska +# + +from avocado import main +from avocado.core import exceptions +from moduleframework import module_framework + + +class SanityCheck(module_framework.AvocadoTest): + """ + :avocado: enable + """ + + def test(self): + """ + Simple sanity test + """ + + self.start() + self.run("ls / | grep bin") + + def testSambaVersion(self): + """ + Check if httpd is installed in correct version + """ + version = "4.5" + self.start() + self.run("smbcontrol -V | grep {}".format(version)) + +if __name__ == '__main__': + main() \ No newline at end of file diff --git a/tests/smbconfig.py b/tests/smbconfig.py new file mode 100644 index 0000000..5ef2646 --- /dev/null +++ b/tests/smbconfig.py @@ -0,0 +1,57 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +# +# This Modularity Testing Framework helps you to write tests for modules +# Copyright (C) 2017 Red Hat, Inc. +# +# 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 +# he Free Software Foundation; either version 2 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., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Authors: Dominika Hodovska +# + +from avocado import main +from avocado.core import exceptions +from moduleframework import module_framework + + +class SmbConfCheck(module_framework.AvocadoTest): + """ + :avocado: enable + """ + def testTestParamFail(self): + """ + Valid failure of testparam + """ + + self.start() + + self.run("testparm -s > /smb-fail") + self.run("printf \"\\n[fail]\\n\\tcomment = bad config\\n\" >> /smb-fail") + # No path + self.run("testparm -s /smb-fail > /out.txt") + self.run("cat out.txt | grep \"available = No\"") + + self.run("rm /out.txt") + self.run("testparm -s > /smb-fail") + + # bad mask + self.run("printf \"\\n[fail]\\n\\tcomment = bad config\\n\" >> /smb-fail") + self.run("printf \"\\tcreate mask = 9999\\n\" >> /smb-fail") + self.run("testparm -s /smb-fail > /out.txt; [ $? -ne 0 ]") + + self.run("[ ! -s /out.txt ]") + +if __name__ == '__main__': + main()