1
0
mirror of https://github.com/samba-team/samba.git synced 2025-01-17 02:05:21 +03:00

remove the python stuff, this will be rewritten on top of libsmb.so

and maintained in a external tree.
(discussed with tpot)

metze
This commit is contained in:
Stefan Metzmacher -
parent 9d89928086
commit 54a0100841
12 changed files with 0 additions and 664 deletions

View File

@ -1 +0,0 @@
*.pyc

View File

@ -1,27 +0,0 @@
#################################################
# Check if the user wants Python
# At the moment, you can use this to set which Python binary to link
# against. (Libraries built for Python2.2 can't be used by 2.1,
# though they can coexist in different directories.) In the future
# this might make the Python stuff be built by default.
# Defaulting python breaks the clean target if python isn't installed
PYTHON=
AC_ARG_WITH(python,
[ --with-python=PYTHONNAME build Python libraries],
[ case "${withval-python}" in
yes)
PYTHON=python
EXTRA_ALL_TARGETS="$EXTRA_ALL_TARGETS python_ext"
;;
no)
PYTHON=
;;
*)
PYTHON=${withval-python}
;;
esac ])
AC_SUBST(PYTHON)

View File

@ -1,34 +0,0 @@
#!/usr/bin/python
#
# Display the changeid for a list of printers given on the command line
#
# Sample usage:
#
# changeid.py '\\win2kdc1\magpie'
#
import sys
from samba import spoolss
if len(sys.argv) == 1:
print "Usage: changeid.py <printername>"
sys.exit(1)
for printer in sys.argv[1:]:
# Open printer handle
try:
hnd = spoolss.openprinter(printer)
except:
print "error opening printer %s" % printer
sys.exit(1)
# Fetch and display changeid
info = hnd.getprinter(level = 0)
print info["change_id"]
# Clean up
spoolss.closeprinter(hnd)

View File

@ -1,36 +0,0 @@
#!/usr/bin/env python
#
# Display information on all printers on a print server. Defaults to
# printer info level 1.
#
# Example: enumprinters.py win2kdc1
#
import sys
from samba import spoolss
if len(sys.argv) < 2 or len(sys.argv) > 3:
print "Usage: enumprinters.py <servername> [infolevel]"
sys.exit(1)
printserver = sys.argv[1]
level = 1
if len(sys.argv) == 3:
level = int(sys.argv[2])
# Get list of printers
try:
printer_list = spoolss.enumprinters("\\\\%s" % printserver)
except:
print "error enumerating printers on %s" % printserver
sys.exit(1)
# Display basic info
for printer in printer_list:
h = spoolss.openprinter("\\\\%s\\%s" % (printserver, printer))
info = h.getprinter(level = level)
print "Printer info %d for %s: %s" % (level, printer, info)
print

View File

@ -1,88 +0,0 @@
#!/usr/bin/env python
#
# Get or set the security descriptor on a printer
#
import sys, re, string
from samba import spoolss
if len(sys.argv) != 3:
print "Usage: psec.py getsec|setsec printername"
sys.exit(1)
op = sys.argv[1]
printername = sys.argv[2]
# Display security descriptor
if op == "getsec":
try:
hnd = spoolss.openprinter(printername)
except:
print "error opening printer %s" % printername
sys.exit(1)
secdesc = hnd.getprinter(level = 3)["security_descriptor"]
print secdesc["owner_sid"]
print secdesc["group_sid"]
for acl in secdesc["dacl"]["ace_list"]:
print "%d %d 0x%08x %s" % (acl["type"], acl["flags"],
acl["mask"], acl["trustee"])
spoolss.closeprinter(hnd)
sys.exit(0)
# Set security descriptor
if op == "setsec":
# Open printer
try:
hnd = spoolss.openprinter(printername,
creds = {"domain": "NPSD-TEST2",
"username": "Administrator",
"password": "penguin"})
except:
print "error opening printer %s" % printername
sys.exit(1)
# Read lines from standard input and build security descriptor
lines = sys.stdin.readlines()
secdesc = {}
secdesc["owner_sid"] = lines[0]
secdesc["group_sid"] = lines[1]
secdesc["revision"] = 1
secdesc["dacl"] = {}
secdesc["dacl"]["revision"] = 2
secdesc["dacl"]["ace_list"] = []
for acl in lines[2:]:
match = re.match("(\d+) (\d+) (0[xX][\dA-Fa-f]+) (\S+)", acl)
secdesc["dacl"]["ace_list"].append(
{"type": int(match.group(1)), "flags": int(match.group(2)),
"mask": string.atoi(match.group(3), 0), "trustee": match.group(4)})
# Build info3 structure
info3 = {}
info3["flags"] = 0x8004 # self-relative, dacl present
info3["level"] = 3
info3["security_descriptor"] = secdesc
hnd.setprinter(info3)
spoolss.closeprinter(hnd)
sys.exit(0)
print "invalid operation %s" % op
sys.exit(1)

View File

@ -1,2 +0,0 @@
*.pyc
*.pyo

View File

@ -1,144 +0,0 @@
#!/usr/bin/python
#############################################################
# tdbutil
#
# Purpose:
# Contains functions that are used to pack and unpack data
# from Samba's tdb databases. Samba sometimes represents complex
# data structures as a single value in a database. These functions
# allow other python scripts to package data types into a single python
# string and unpackage them.
#
#
# XXXXX: This code is no longer used; it's just here for testing
# compatibility with the new (much faster) C implementation.
#
##############################################################
import string
def pack(format,list):
retstring = ''
listind = 0
# Cycle through format entries
for type in format:
# Null Terminated String
if (type == 'f' or type == 'P'):
retstring = retstring + list[listind] + "\000"
# 4 Byte Number
if (type == 'd'):
retstring = retstring + PackNum(list[listind],4)
# 2 Byte Number
if (type == 'w'):
retstring = retstring + PackNum(list[listind],2)
# Pointer Value
if (type == 'p'):
if (list[listind]):
retstring = retstring + PackNum(1,4)
else:
retstring = retstring + PackNum(0,4)
# Buffer and Length
if (type == 'B'):
# length
length = list[listind]
retstring = retstring + PackNum(length,4)
length = int(length)
listind = listind + 1
# buffer
retstring = retstring + list[listind][:length]
listind = listind + 1
return retstring
def unpack(format,buffer):
retlist = []
bufind = 0
lasttype = ""
for type in format:
# Pointer Value
if (type == 'p'):
newvalue = UnpackNum(buffer[bufind:bufind+4])
bufind = bufind + 4
if (newvalue):
newvalue = 1L
else:
newvalue = 0L
retlist.append(newvalue)
# Previous character till end of data
elif (type == '$'):
if (lasttype == 'f'):
while (bufind < len(buffer)):
newstring = ''
while (buffer[bufind] != '\000'):
newstring = newstring + buffer[bufind]
bufind = bufind + 1
bufind = bufind + 1
retlist.append(newstring)
# Null Terminated String
elif (type == 'f' or type == 'P'):
newstring = ''
while (buffer[bufind] != '\000'):
newstring = newstring + buffer[bufind]
bufind = bufind + 1
bufind = bufind + 1
retlist.append(newstring)
# 4 Byte Number
elif (type == 'd'):
newvalue = UnpackNum(buffer[bufind:bufind+4])
bufind = bufind + 4
retlist.append(newvalue)
# 2 Byte Number
elif (type == 'w'):
newvalue = UnpackNum(buffer[bufind:bufind+2])
bufind = bufind + 2
retlist.append(newvalue)
# Length and Buffer
elif (type == 'B'):
# Length
length = UnpackNum(buffer[bufind:bufind+4])
bufind = bufind + 4
retlist.append(length)
length = int(length)
# Buffer
retlist.append(buffer[bufind:bufind+length])
bufind = bufind + length
lasttype = type
return ((retlist,buffer[bufind:]))
def PackNum(myint,size):
retstring = ''
size = size * 2
hint = hex(myint)[2:]
# Check for long notation
if (hint[-1:] == 'L'):
hint = hint[:-1]
addon = size - len(hint)
for i in range(0,addon):
hint = '0' + hint
while (size > 0):
val = string.atoi(hint[size-2:size],16)
retstring = retstring + chr(val)
size = size - 2
return retstring
def UnpackNum(buffer):
size = len(buffer)
mystring = ''
for i in range(size-1,-1,-1):
val = hex(ord(buffer[i]))[2:]
if (len(val) == 1):
val = '0' + val
mystring = mystring + val
if (len(mystring) > 4):
return string.atol(mystring,16)
else:
return string.atoi(mystring,16)

View File

@ -1,12 +0,0 @@
#! /usr/bin/python2.2
def run_trial():
# import tdbutil
from samba.tdbpack import pack
for i in xrange(500000):
pack("ddffd", (10, 2, "mbp", "martin", 0))
#s = "\n\0\0\0" + "\x02\0\0\0" + "mbp\0" + "martin\0" + "\0\0\0\0"
if __name__ == '__main__':
run_trial()

View File

@ -1,253 +0,0 @@
#! /usr/bin/env python2.2
__doc__ = """test case for samba.tdbpack functions
tdbpack provides a means of pickling values into binary formats
compatible with that used by the samba tdbpack()/tdbunpack()
functions.
Numbers are always stored in little-endian format; strings are stored
in either DOS or Unix codepage as appropriate.
The format for any particular element is encoded as a short ASCII
string, with one character per field."""
# Copyright (C) 2002 Hewlett-Packard.
__author__ = 'Martin Pool <mbp@sourcefrog.net>'
import unittest
import oldtdbutil
import samba.tdbpack
both_unpackers = (samba.tdbpack.unpack, oldtdbutil.unpack)
both_packers = (samba.tdbpack.pack, oldtdbutil.pack)
# # ('B', [10, 'hello'], '\x0a\0\0\0hello'),
# ('BB', [11, 'hello\0world', 3, 'now'],
# '\x0b\0\0\0hello\0world\x03\0\0\0now'),
# ('pd', [1, 10], '\x01\0\0\0\x0a\0\0\0'),
# ('BBB', [5, 'hello', 0, '', 5, 'world'],
# '\x05\0\0\0hello\0\0\0\0\x05\0\0\0world'),
# strings are sequences in Python, there's no getting away
# from it
# ('ffff', 'evil', 'e\0v\0i\0l\0'),
# ('BBBB', 'evil',
# '\x01\0\0\0e'
# '\x01\0\0\0v'
# '\x01\0\0\0i'
# '\x01\0\0\0l'),
# ('', [], ''),
# # exercise some long strings
# ('PP', ['hello' * 255, 'world' * 255],
# 'hello' * 255 + '\0' + 'world' * 255 + '\0'),
# ('PP', ['hello' * 40000, 'world' * 50000],
# 'hello' * 40000 + '\0' + 'world' * 50000 + '\0'),
# ('B', [(5*51), 'hello' * 51], '\xff\0\0\0' + 'hello' * 51),
# ('BB', [(5 * 40000), 'hello' * 40000,
# (5 * 50000), 'world' * 50000],
# '\x40\x0d\x03\0' + 'hello' * 40000 + '\x90\xd0\x03\x00' + 'world' * 50000),
class PackTests(unittest.TestCase):
symm_cases = [
('w', [42], '\x2a\0'),
('www', [42, 2, 69], '\x2a\0\x02\0\x45\0'),
('wd', [42, 256], '\x2a\0\0\x01\0\0'),
('w', [0], '\0\0'),
('w', [255], '\xff\0'),
('w', [256], '\0\x01'),
('w', [0xdead], '\xad\xde'),
('w', [0xffff], '\xff\xff'),
('p', [0], '\0\0\0\0'),
('p', [1], '\x01\0\0\0'),
('d', [0x01020304], '\x04\x03\x02\x01'),
('d', [0x7fffffff], '\xff\xff\xff\x7f'),
('d', [0x80000000L], '\x00\x00\x00\x80'),
('d', [0x80000069L], '\x69\x00\x00\x80'),
('d', [0xffffffffL], '\xff\xff\xff\xff'),
('d', [0xffffff00L], '\x00\xff\xff\xff'),
('ddd', [1, 10, 50], '\x01\0\0\0\x0a\0\0\0\x32\0\0\0'),
('ff', ['hello', 'world'], 'hello\0world\0'),
('fP', ['hello', 'world'], 'hello\0world\0'),
('PP', ['hello', 'world'], 'hello\0world\0'),
('B', [0, ''], '\0\0\0\0'),
# old implementation is wierd when string is not the right length
# ('B', [2, 'hello'], '\x0a\0\0\0hello'),
('B', [5, 'hello'], '\x05\0\0\0hello'),
]
def test_symmetric(self):
"""Cookbook of symmetric pack/unpack tests
"""
for packer in [samba.tdbpack.pack]: # both_packers:
for unpacker in both_unpackers:
for format, values, expected in self.symm_cases:
out_packed = packer(format, values)
self.assertEquals(out_packed, expected)
out, rest = unpacker(format, expected)
self.assertEquals(rest, '')
self.assertEquals(list(values), list(out))
def test_large(self):
"""Test large pack/unpack strings"""
large_cases = [('w' * 1000, xrange(1000)), ]
for packer in both_packers:
for unpacker in both_unpackers:
for format, values in large_cases:
packed = packer(format, values)
out, rest = unpacker(format, packed)
self.assertEquals(rest, '')
self.assertEquals(list(values), list(out))
def test_pack(self):
"""Cookbook of expected pack values
These can't be used for the symmetric test because the unpacked value is
not "canonical".
"""
cases = [('w', (42,), '\x2a\0'),
]
for packer in both_packers:
for format, values, expected in cases:
self.assertEquals(packer(format, values), expected)
def test_unpack_extra(self):
# Test leftover data
for unpacker in both_unpackers:
for format, values, packed in self.symm_cases:
out, rest = unpacker(format, packed + 'hello sailor!')
self.assertEquals(rest, 'hello sailor!')
self.assertEquals(list(values), list(out))
def test_pack_extra(self):
"""Leftover values when packing"""
cases = [
('d', [10, 20], [10]),
('d', [10, 'hello'], [10]),
('ff', ['hello', 'world', 'sailor'], ['hello', 'world']),
]
for unpacker in both_unpackers:
for packer in both_packers:
for format, values, chopped in cases:
bin = packer(format, values)
out, rest = unpacker(format, bin)
self.assertEquals(list(out), list(chopped))
self.assertEquals(rest, '')
def test_unpack(self):
"""Cookbook of tricky unpack tests"""
cases = [
# Apparently I couldn't think of any tests that weren't
# symmetric :-/
]
for unpacker in both_unpackers:
for format, values, expected in cases:
out, rest = unpacker(format, expected)
self.assertEquals(rest, '')
self.assertEquals(list(values), list(out))
def test_pack_failures(self):
"""Expected errors for incorrect packing"""
cases = [('w', []),
# ('w', ()),
# ('w', {}),
('ww', [2]),
('w', 2),
# ('w', None),
('wwwwwwwwwwww', []),
# ('w', [0x60A15EC5L]),
# ('w', [None]),
('d', []),
('p', []),
('f', [2]),
('P', [None]),
('P', ()),
('f', [hex]),
('fw', ['hello']),
# ('f', [u'hello']),
('B', [2]),
(None, [2, 3, 4]),
(ord('f'), [20]),
# old code doesn't distinguish string from seq-of-char
# (['w', 'w'], [2, 2]),
# old code just ignores invalid characters
# ('Q', [2]),
# ('fQ', ['2', 3]),
# ('fQ', ['2']),
(2, [2]),
# old code doesn't typecheck format
# ({}, {})
]
for packer in both_packers:
for format, values in cases:
try:
packer(format, values)
except StandardError:
pass
else:
raise AssertionError("didn't get exception: format %s, values %s, packer %s"
% (`format`, `values`, `packer`))
def test_unpack_failures(self):
"""Expected errors for incorrect unpacking"""
cases = [
# This ought to be illegal, but the old code doesn't prohibit it
# ('$', '', ValueError),
# ('Q', '', ValueError),
# ('Q$', '', ValueError),
('f', '', IndexError),
('d', '', IndexError),
# This is an illegal packing, but the old code doesn't trap
# ('d', '2', IndexError),
# ('d', '22', IndexError),
# ('d', '222', IndexError),
# ('p', '\x01\0', IndexError),
# ('w', '2', IndexError),
# ('B', '\xff\0\0\0hello', IndexError),
# ('B', '\xff\0', IndexError),
('w', '', IndexError),
('f', 'hello', IndexError),
('f', '', IndexError),
# ('B', '\x01\0\0\0', IndexError),
# ('B', '\x05\0\0\0hell', IndexError),
('B', '\xff\xff\xff\xff', ValueError),
# ('B', 'foobar', IndexError),
# ('BB', '\x01\0\0\0a\x01', IndexError),
]
for unpacker in both_unpackers:
for format, values, throwable_class in cases:
try:
unpacker(format, values)
except StandardError:
pass
else:
raise AssertionError("didn't get exception: format %s, values %s, unpacker %s"
% (`format`, `values`, `unpacker`))
def test_unpack_repeated(self):
cases = [(('df$',
'\x00\x00\x00\x00HP C LaserJet 4500-PS\x00Windows 4.0\x00\\print$\\WIN40\\0\\PSCRIPT.DRV\x00\\print$\\WIN40\\0\\PSCRIPT.DRV\x00\\print$\\WIN40\\0\\PSCRIPT.DRV\x00\\print$\\WIN40\\0\\PSCRIPT.HLP\x00\x00RAW\x00\\print$\\WIN40\\0\\readme.wri\x00\\print$\\WIN40\\0\\pscript.drv\x00\\print$\\WIN40\\0\\pscript.hlp\x00'),
([0L, 'HP C LaserJet 4500-PS', 'Windows 4.0', '\\print$\\WIN40\\0\\PSCRIPT.DRV', '\\print$\\WIN40\\0\\PSCRIPT.DRV', '\\print$\\WIN40\\0\\PSCRIPT.DRV', '\\print$\\WIN40\\0\\PSCRIPT.HLP', '', 'RAW', '\\print$\\WIN40\\0\\readme.wri', '\\print$\\WIN40\\0\\pscript.drv', '\\print$\\WIN40\\0\\pscript.hlp'], ''))]
for unpacker in both_unpackers:
for input, expected in cases:
result = apply(unpacker, input)
if result != expected:
raise AssertionError("%s:\n input: %s\n output: %s\n expected: %s" % (`unpacker`, `input`, `result`, `expected`))
if __name__ == '__main__':
unittest.main()

View File

@ -1 +0,0 @@
*.pyc

View File

@ -1,7 +0,0 @@
"""samba
Various Python modules for interfacing to Samba.
Try using help() to examine their documentation.
"""

View File

@ -1,59 +0,0 @@
#!/usr/bin/env python
#
# A python module that maps printerdata to a dictionary. We define
# two classes. The printerdata class maps to Get/Set/Enum/DeletePrinterData
# and the printerdata_ex class maps to Get/Set/Enum/DeletePrinterDataEx
#
#
# TODO:
#
# - Implement __delitem__
#
from samba import spoolss
class printerdata:
def __init__(self, host, creds = {}):
self.hnd = spoolss.openprinter(host, creds = creds)
def keys(self):
return self.hnd.enumprinterdata().keys()
def __getitem__(self, key):
return self.hnd.getprinterdata(key)['data']
def __setitem__(self, key, value):
# Store as REG_BINARY for now
self.hnd.setprinterdata({"key": "", "value": key, "type": 3,
"data": value})
class printerdata_ex:
def __init__(self, host):
self.host = host
self.top_level_keys = ["PrinterDriverData", "DsSpooler", "DsDriver",
"DsUser"]
def keys(self):
return self.top_level_keys
def has_key(self, key):
for k in self.top_level_keys:
if k == key:
return 1
return 0
class printerdata_ex_subkey:
def __init__(self, host, key):
self.hnd = spoolss.openprinter(host)
self.key = key
def keys(self):
return self.hnd.enumprinterdataex(self.key).keys()
def __getitem__(self, key):
return self.hnd.getprinterdataex(self.key, key)['data']
def __getitem__(self, key):
return self.printerdata_ex_subkey(self.host, key)