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)
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)
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()]
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()]
# 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", ]
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)