예제 #1
0
 def get_logger(self, name="", verbose=False, quiet=False, **kwargs):
     """Get a logger object."""
     return get_samba_logger(name=name or self.name,
                             stream=self.errf,
                             verbose=verbose,
                             quiet=quiet,
                             **kwargs)
예제 #2
0
파일: ntacls.py 프로젝트: wade1990/samba
def backup_online(smb_conn, dest_tarfile_path, dom_sid):
    """
    Backup all files and dirs with ntacl for the serive behind smb_conn.

    1. Create a temp dir as container dir
    2. Backup all files with dir structure into container dir
    3. Generate file.NTACL files for each file and dir in contianer dir
    4. Create a tar file from container dir(without top level folder)
    5. Delete contianer dir
    """

    logger = get_samba_logger()

    if isinstance(dom_sid, str):
        dom_sid = security.dom_sid(dom_sid)

    smb_helper = SMBHelper(smb_conn, dom_sid)

    remotedir = ''  # root dir

    localdir = tempfile.mkdtemp()

    r_dirs = [remotedir]
    l_dirs = [localdir]

    while r_dirs:
        r_dir = r_dirs.pop()
        l_dir = l_dirs.pop()

        for e in smb_helper.list(smb_path=r_dir):
            r_name = smb_helper.join(r_dir, e['name'])
            l_name = os.path.join(l_dir, e['name'])

            if smb_helper.is_dir(e['attrib']):
                r_dirs.append(r_name)
                l_dirs.append(l_name)
                os.mkdir(l_name)
            else:
                data = smb_helper.loadfile(r_name)
                with open(l_name, 'wb') as f:
                    f.write(data)

            # get ntacl for this entry and save alongside
            try:
                ntacl_sddl_str = smb_helper.get_acl(r_name, as_sddl=True)
                _create_ntacl_file(l_name, ntacl_sddl_str)
            except NTSTATUSError as e:
                logger.error('Failed to get the ntacl for %s: %s' % \
                             (r_name, e.args[1]))
                logger.warning('The permissions for %s may not be' % r_name +
                               ' restored correctly')

    with tarfile.open(name=dest_tarfile_path, mode='w:gz') as tar:
        for name in os.listdir(localdir):
            path = os.path.join(localdir, name)
            tar.add(path, arcname=name)

    shutil.rmtree(localdir)
예제 #3
0
def provision(realm, domain, adminpass, function_level, dns_backend,
              use_rfc2307):
    '''Provision a domain
    param string realm          The realm name
    param string domain         NetBIOS domain name to use
    param string adminpass      Choose an admin password
    param string function_level The domain and forest function level (2000 | 2003 | 2008 | 2008_R2)
    param string dns_backend    The DNS server backend
    param boolean use_rfc2307   Use AD to store posix attributes
    return string               Error message, or an empty string
    '''
    parser = OptionParser()
    sambaopts = SambaOptions(parser)
    lp = sambaopts.get_loadparm()
    lp.set('realm', realm)

    outlog = YaSTIO(ycpbuiltins.y2debug)
    errlog = YaSTIO(ycpbuiltins.y2error)

    provision = dm.cmd_domain_provision(errf=errlog)
    provision.raw_argv = []
    provision.logger = get_samba_logger(name="provision",
                                        stream=outlog,
                                        verbose=True,
                                        quiet=False,
                                        fmt="%(message)s")

    try:
        provision.run(sambaopts=sambaopts,
                      domain=domain,
                      adminpass=adminpass,
                      function_level=function_level,
                      dns_backend=dns_backend,
                      server_role="dc")
    except Exception as e:
        template = "{0} exception:\n{1}"
        message = template.format(type(e).__name__, str(e))
        return [False, message]
    return [True, outlog.getvalue()]
예제 #4
0
def join(domain, role, dns_backend, username, password):
    '''Join domain as either member or backup domain controller
    param string domain         NetBIOS domain name to use
    param string role           possible values: MEMBER, DC, RODC, SUBDOMAIN
    param string dns_backend    The DNS server backend
    param string username       Username
    param string password       Password
    return string               Error message, or an empty string
    '''
    parser = OptionParser()
    sambaopts = SambaOptions(parser)
    credopts = CredentialsOptions(parser)
    credopts.creds.parse_string(username)
    credopts.creds.set_password(password)
    credopts.ask_for_password = False
    credopts.machine_pass = False

    outlog = YaSTIO(ycpbuiltins.y2debug)
    errlog = YaSTIO(ycpbuiltins.y2error)

    join = dm.cmd_domain_join(errf=errlog)
    join.logger = get_samba_logger(name="provision",
                                   stream=outlog,
                                   verbose=True,
                                   quiet=False,
                                   fmt="%(message)s")

    try:
        join.run(sambaopts=sambaopts,
                 credopts=credopts,
                 domain=domain,
                 role=role,
                 dns_backend=dns_backend)
    except Exception as e:
        template = "{0} exception:\n{1}"
        message = template.format(type(e).__name__, str(e))
        return [False, message]
    return [True, outlog.getvalue()]
예제 #5
0
파일: mdssvc.py 프로젝트: rayddteam/samba
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
#
"""Tests for samba.dcerpc.mdssvc"""

import os
import time
import threading
import logging
import json
from http.server import HTTPServer, BaseHTTPRequestHandler
from samba.dcerpc import mdssvc
from samba.tests import RpcInterfaceTestCase
from samba.samba3 import mdscli
from samba.logger import get_samba_logger

logger = get_samba_logger(name=__name__)

testfiles = [
    "foo",
    "bar",
    "x+x",
    "x*x",
    "x=x",
    "x'x",
    "x?x",
    "x\"x",
    "x\\x",
    "x(x",
    "x x",
]
예제 #6
0
파일: ntacls.py 프로젝트: wade1990/samba
def backup_restore(src_tarfile_path, dst_service_path, samdb_conn,
                   smb_conf_path):
    """
    Restore files and ntacls from a tarfile to a service
    """
    logger = get_samba_logger()
    service = dst_service_path.rstrip('/').rsplit('/', 1)[-1]
    tempdir = tempfile.mkdtemp()  # src files

    dom_sid_str = samdb_conn.get_domain_sid()
    dom_sid = security.dom_sid(dom_sid_str)

    ntacls_helper = NtaclsHelper(service, smb_conf_path, dom_sid)

    with tarfile.open(src_tarfile_path) as f:
        f.extractall(path=tempdir)
        # e.g.: /tmp/tmpRNystY/{dir1,dir1.NTACL,...file1,file1.NTACL}

    for dirpath, dirnames, filenames in os.walk(tempdir):
        rel_dirpath = os.path.relpath(dirpath, start=tempdir)
        dst_dirpath = os.path.normpath(
            os.path.join(dst_service_path, rel_dirpath))

        for dirname in dirnames:
            if not dirname.endswith('.NTACL'):
                src = os.path.join(dirpath, dirname)
                dst = os.path.join(dst_dirpath, dirname)
                if not os.path.isdir(dst):
                    # dst must be absolute path for smbd API
                    smbd.mkdir(dst, service)

                ntacl_sddl_str = _read_ntacl_file(src)
                if ntacl_sddl_str:
                    ntacls_helper.setntacl(dst, ntacl_sddl_str)
                else:
                    logger.warning(
                        'Failed to restore ntacl for directory %s.' % dst +
                        ' Please check the permissions are correct')

        for filename in filenames:
            if not filename.endswith('.NTACL'):
                src = os.path.join(dirpath, filename)
                dst = os.path.join(dst_dirpath, filename)
                if not os.path.isfile(dst):
                    # dst must be absolute path for smbd API
                    smbd.create_file(dst, service)

                ntacl_sddl_str = _read_ntacl_file(src)
                if ntacl_sddl_str:
                    ntacls_helper.setntacl(dst, ntacl_sddl_str)
                else:
                    logger.warning('Failed to restore ntacl for file %s.' %
                                   dst +
                                   ' Please check the permissions are correct')

                # now put data in
                with open(src, 'rb') as src_file:
                    data = src_file.read()
                    with open(dst, 'wb') as dst_file:
                        dst_file.write(data)

    shutil.rmtree(tempdir)