#1From:Moderator
To:All
Date:01-08-2005 05:00:01
Subj:Rules of RU.PYTHON
From: Moderator <sysop@fluid.fidoman.ru>


Правила эхоконференции RU.PYTHON

1. Тематика.
Эха посвящена одному из самых мощных на сегодняшний день интерпретируемых
языков программирования - Python. В этой эхе обсуждаются новости разработок,
тенденции развития языка, особенности использования в различных областях,
сам язык и его стандартные библиотеки, различные библиотеки расширения -
прикладные и системные и многое другое. Также эхоконференция предназначена
для обмена личным опытом использования Python и публикации текстов программ.
При желании подписчиков и по согласованию с модератором может быть настроен
постинг сообщений из форумов, списков рассылки и конференций, посвящённых
Питону.

2. Распространение.
Конференция может свободно распространяться по сети Fidonet.
Гейтование в другие сети возможно, если при этом не нарушаются никакие
пункты данных правил.

3. Доступ.
Помещать сообщения в эху могут все узлы сети FidoNet, их поинты,
пользователи BBS и участники сетей, в которые гейтуется эта конференция.
Оператор BBS или гейта должен проследить за тем, чтобы в исходящих с его
системы письмах был корректный обратный адрес для связи нетмейлом с
отправителем.

4. Требования к форме сообщений.
Текст сообщения должен быть в кодировке CP866.
Русская заглавная буква "Эн" должна быть заменена на латинскую "Аш".
Текст сообщения должен быть на русском языке. При помещении текстов на
других языках их необходимо сопровождать русским переводом. Тексты на
английском языке допускается постить без перевода.
При использовании псевдонима желательно указание реального имени в кладже
RealName. Указание чужого имени в кладже RealName недопустимо. Крайне
нежелательно использование в качестве псевдонима реального имени кого-то из
подписчиков. Использование матерных слов в этой конференции неуместно.
Цитирование кладжей и темплейта не допускается.
Hежелательно цитирование более двух уровней ответов или более 7 строк в
одном блоке квоты, если это не необходимо для понимания смысла письма.
Размер сообщения не должен превышать 31 килобайт.
Hе рекомендуется постинг сообщений объёмом больше 64 килобайт за сутки.
Hе рекомендуется использовать пользовательские кладжи, приветствие, подпись
в суммарном объёме больше семи строк.

5. Постинг текстовых и кодированных файлов.
Постинг сообщений с вставленными текстовыми файлами и кодированными данными
допускается в пределах, установленных для обычных сообщений. Способ
кодирования должен позволять произвести полное раскодирование любому
подписчику с использованием только общедоступных бесплатных утилит.

6. Постинг коммерческих сообщений.
Постинг коммерческой и некоммерческой рекламы допускается, если она имеет
отношение к языку Python (книги, диски, конференции или что-то другое).

7. Модерирование.
За соблюдением данных правил следят модератор и комодераторы. Правила
постятся модератором ежемесячно.
Модератор и комодератор при нарушении правил могут делать предупреждение
нарушителю ([*] - предупреждение, [+] - строгое предупреждение) или
производить перевод его в режим только-чтение ([!]). При игнорировании
модераториалов к нарушителю принимаются меры согласно эхополу.
Модератор может отменять вынесенные предупреждения и отключения, если они
были сделаны достаточно давно.
Модератор имеет право вносить изменения в правила.
В случае исчезновения модератора из нодлиста, модерирование производится
комодераторами. При отсутствии модератора более года, эхокоординатор
назначет в конференции выборы для определения нового модератора.

Модератор эхоконференции - Sergey Dorofeev, 2:5020/12000(.1,.12)

--- FIDOGATE 4.4.1-snp15
* Origin: FIDOGATE (2:5020/12000.0)
SEEN-BY: 46/50 463/68 464/36 910 5000/0 170 5000 5004/75 5005/14 5010/77
SEEN-BY: 5020/545 715 818 845 1973 7770 12000 5030/115 5043/0 5057/119
SEEN-BY: 5080/1003 6090/1
PATH: 5020/12000 715 5000/5000
#2From:Moderator
To:All
Date:01-09-2005 05:00:02
Subj:Rules of RU.PYTHON
From: Moderator <sysop@fluid.fidoman.ru>


Правила эхоконференции RU.PYTHON

1. Тематика.
Эха посвящена одному из самых мощных на сегодняшний день интерпретируемых
языков программирования - Python. В этой эхе обсуждаются новости разработок,
тенденции развития языка, особенности использования в различных областях,
сам язык и его стандартные библиотеки, различные библиотеки расширения -
прикладные и системные и многое другое. Также эхоконференция предназначена
для обмена личным опытом использования Python и публикации текстов программ.
При желании подписчиков и по согласованию с модератором может быть настроен
постинг сообщений из форумов, списков рассылки и конференций, посвящённых
Питону.

2. Распространение.
Конференция может свободно распространяться по сети Fidonet.
Гейтование в другие сети возможно, если при этом не нарушаются никакие
пункты данных правил.

3. Доступ.
Помещать сообщения в эху могут все узлы сети FidoNet, их поинты,
пользователи BBS и участники сетей, в которые гейтуется эта конференция.
Оператор BBS или гейта должен проследить за тем, чтобы в исходящих с его
системы письмах был корректный обратный адрес для связи нетмейлом с
отправителем.

4. Требования к форме сообщений.
Текст сообщения должен быть в кодировке CP866.
Русская заглавная буква "Эн" должна быть заменена на латинскую "Аш".
Текст сообщения должен быть на русском языке. При помещении текстов на
других языках их необходимо сопровождать русским переводом. Тексты на
английском языке допускается постить без перевода.
При использовании псевдонима желательно указание реального имени в кладже
RealName. Указание чужого имени в кладже RealName недопустимо. Крайне
нежелательно использование в качестве псевдонима реального имени кого-то из
подписчиков. Использование матерных слов в этой конференции неуместно.
Цитирование кладжей и темплейта не допускается.
Hежелательно цитирование более двух уровней ответов или более 7 строк в
одном блоке квоты, если это не необходимо для понимания смысла письма.
Размер сообщения не должен превышать 31 килобайт.
Hе рекомендуется постинг сообщений объёмом больше 64 килобайт за сутки.
Hе рекомендуется использовать пользовательские кладжи, приветствие, подпись
в суммарном объёме больше семи строк.

5. Постинг текстовых и кодированных файлов.
Постинг сообщений с вставленными текстовыми файлами и кодированными данными
допускается в пределах, установленных для обычных сообщений. Способ
кодирования должен позволять произвести полное раскодирование любому
подписчику с использованием только общедоступных бесплатных утилит.

6. Постинг коммерческих сообщений.
Постинг коммерческой и некоммерческой рекламы допускается, если она имеет
отношение к языку Python (книги, диски, конференции или что-то другое).

7. Модерирование.
За соблюдением данных правил следят модератор и комодераторы. Правила
постятся модератором ежемесячно.
Модератор и комодератор при нарушении правил могут делать предупреждение
нарушителю ([*] - предупреждение, [+] - строгое предупреждение) или
производить перевод его в режим только-чтение ([!]). При игнорировании
модераториалов к нарушителю принимаются меры согласно эхополу.
Модератор может отменять вынесенные предупреждения и отключения, если они
были сделаны достаточно давно.
Модератор имеет право вносить изменения в правила.
В случае исчезновения модератора из нодлиста, модерирование производится
комодераторами. При отсутствии модератора более года, эхокоординатор
назначет в конференции выборы для определения нового модератора.

Модератор эхоконференции - Sergey Dorofeev, 2:5020/12000(.1,.12)

--- FIDOGATE 4.4.1-snp15
* Origin: FIDOGATE (2:5020/12000.0)
SEEN-BY: 46/50 463/68 464/36 910 465/213 5000/0 170 5000 5004/75 5005/14
SEEN-BY: 5010/77 5020/545 715 818 1973 7770 12000 5030/115 5043/0 5055/177
SEEN-BY: 5057/119 5080/1003 6090/1
PATH: 5020/12000 715 5000/5000
#3From:Aleksej R. Serdyukov
To:All
Date:01-09-2005 20:09:09
Subj:.MSG
CONNECT All /||*()*||

Есть ли модуль для чтения-записи .msg?
Hа гугле что-либо по этому поводу только случайно для паскаля нахожу (и ещё энциклопедии расширений файлов). :-(

=^..^= Good luck! +++
... BIOS message: BIOS registry error. Download backup from www.microsoft.com?
--- GoldED+ 1.1.5-040120 (Linux 2.6.8-2-k7 i686), Debian Sarge
* Origin: Delete Software Limited, Moscow, Russia. (2:5020/24000)
SEEN-BY: 46/50 50/203 450/186 1024 463/68 464/36 910 465/213 5000/0 170 5000
SEEN-BY: 5004/75 5005/14 5010/77 5015/28 5020/175 400 545 715 845 1042 1604
SEEN-BY: 5020/2020 2238 4441 24000 5025/3 5030/115 966 1900 5040/47 5054/1
SEEN-BY: 5057/119 5080/80 1003 5083/13 21 6090/1
PATH: 5020/24000 1042 4441 545 5000/5000
#4From:Ilyak Kaznacheev
To:Aleksej R. Serdyukov
Date:02-09-2005 11:17:23
Subj:Re: .MSG
From: Ilyak Kaznacheev <ilyak@online.ru>

Logged on as Ilyak(Online)

>Есть ли модуль для чтения-записи .msg?
>Hа гугле что-либо по этому поводу только случайно для паскаля нахожу (и ещё
>энциклопедии расширений файлов). :-(
Hе там ищешь.
Искать надо по кейвордам rfc 822 message, должен найти сильно
побольше.

Если, конечно, мы имеем в виду одно и то же.

--
Not logged on. Reconnecting..........
--- ifmail v.2.15dev5.3
* Origin: Оправдывает ли цель средства -- задача, в общем виде н (2:5020/400)
SEEN-BY: 46/50 50/203 450/186 1024 461/640 463/68 464/36 910 465/213 4616/3
SEEN-BY: 4627/10 5000/0 170 5000 5004/75 5005/14 5007/1 5010/70 77 5015/28
SEEN-BY: 5020/118 175 400 545 715 902 982 1042 1057 1604 2020 2238 4441 5025/3
SEEN-BY: 5030/49 115 966 1900 5040/47 5054/1 5057/119 5080/80 1003 5083/21
SEEN-BY: 6090/1
PATH: 5020/400 4441 545 5000/5000
#5From:alexander smishlajev
To:Aleksej R. Serdyukov
Date:02-09-2005 10:49:23
Subj:.MSG
hello Aleksej!

thursday september 01 2005, Aleksej R. Serdyukov writes to All:

AS> Есть ли модуль для чтения-записи .msg?

вот я на скорую руку набросал чтение:

=== begin cut msg.py ===
#! /usr/bin/env python
"""This module provides interface to fidonet FTS-001 messages

This code has been placed in public domain.

Message structure specifications from FTS-001:

Stored Message

Offset
dec hex
.-----------------------------------------------.
0 0 | |
~ fromUserName ~
| 36 bytes |
+-----------------------+-----------------------+
36 24 | |
~ toUserName ~
| 36 bytes |
+-----------------------+-----------------------+
72 48 | |
~ subject ~
| 72 bytes |
+-----------------------+-----------------------+
144 90 | |
~ DateTime ~
| 20 bytes |
+-----------------------+-----------------------+
164 A4 | timesRead (low order) | timesRead (high order)|
+-----------------------+-----------------------+
166 A6 | destNode (low order) | destNode (high order) |
+-----------------------+-----------------------+
168 A8 | origNode (low order) | origNode (high order) |
+-----------------------+-----------------------+
170 AA | cost (low order) | cost (high order) |
+-----------------------+-----------------------+
172 AC | origNet (low order) | origNet (high order) |
+-----------------------+-----------------------+
174 AE | destNet (low order) | destNet (high order) |
+-----------------------+-----------------------+
176 B0 | destZone (optional) | destZone (optional) |
+-----------------------+-----------------------+
178 B2 | origZone (optional) | origZone (optional) | see Note1
+-----------------------+-----------------------+
180 B4 | destPoint(optional) | destPoint(optional) |
+-----------------------+-----------------------+
182 B6 | origPoint(optional) | origPoint(optional) |
+-----------------------+-----------------------+
184 B8 | replyTo (low order) | replyTo (high order) |
+-----------------------+-----------------------+
186 BA | Attribute (low order) | Attribute (high order)|
+-----------------------+-----------------------+
188 BC | nextReply (low order) | nextReply (high order)|
+-----------------------+-----------------------+
190 BE | text |
~ unbounded ~
| null terminated |
`-----------------------------------------------'

Message = fromUserName(36) (* Null terminated *)
toUserName(36) (* Null terminated *)
subject(72) (* see FileList below *)
DateTime (* message body was last edited *)
timesRead (* number of times msg has been read *)
destNode (* of message *)
origNode (* of message *)
cost (* in lowest unit of originator's
currency *)
origNet (* of message *)
destNet (* of message *)
destZone (* of message *)
origZone (* of message *)
destPoint (* of message *)
origPoint (* of message *)
replyTo (* msg to which this replies *)
AttributeWord
nextReply (* msg which replies to this *)
text(unbounded) (* Null terminated *)

DateTime = (* a character string 20 characters long *)
(* 01 Jan 86 02:34:56 *)
DayOfMonth " " Month " " Year " "
" " HH ":" MM ":" SS
Null

DayOfMonth = "01" | "02" | "03" | ... | "31" (* Fido 0 fills *)
Month = "Jan" | "Feb" | "Mar" | "Apr" | "May" | "Jun" |
"Jul" | "Aug" | "Sep" | "Oct" | "Nov" | "Dec"
Year = "01" | "02" | .. | "85" | "86" | ... | "99" | "00"
HH = "00" | .. | "23"
MM = "00" | .. | "59"
SS = "00" | .. | "59"

AttributeWord bit meaning
--- --------------------
0 + Private
1 + s Crash
2 Recd
3 Sent
4 + FileAttached
5 InTransit
6 Orphan
7 KillSent
8 Local
9 s HoldForPickup
10 + unused
11 s FileRequest
12 + s ReturnReceiptRequest
13 + s IsReturnReceipt
14 + s AuditRequest
15 s FileUpdateReq

s - need not be recognized, but it's ok
+ - not zeroed before packeting

Bits numbers ascend with arithmetic significance of bit position.

Note1: in message bases, bytes 176-179 and 180-183 are date_written
and date_arrived timestamps, respectively.

"""

import struct
import sys
import time

# default zone for network addresses
# FIXME: use @INTL kludge to detect zones
DEFAULT_ZONE = 2

class Structure(object):

"""Helper class for structure representation

Structure members are specified by attribute slots.
All attributes default to zero.

"""

__slots__ = [] # must be set in child class

def __init__(self, *args, **kwargs):
# all numbers default to zero
_attrs = dict.fromkeys(self.__slots__, 0)
# apply initialization values
for (_name, _value) in zip(self.__slots__, args):
_attrs[_name] = _value
_attrs.update(kwargs)
for (_name, _value) in _attrs.iteritems():
setattr(self, _name, _value)

class NetworkAddress(Structure):

__slots__ = ["zone", "net", "node", "point"]

def __str__(self):
if self.point:
return "%i:%i/%i.%i" % (self.zone, self.net, self.node, self.point)
else:
return "%i:%i/%i" % (self.zone, self.net, self.node)

def __repr__(self):
return "<%s@%X %s>" % (self.__class__.__name__, id(self), str(self))

class Timestamp(Structure):

__slots__ = ["year", "month", "day", "hour", "minute", "second"]

def fromDosDateTime(date, time):
"""Create timestamp from DOS structures

Parameters:
date - packed DOS date (16-bit integer):
year - 7 bits (0-119, starting from 1980)
month - 4 bits (1-12)
day - 5 bits (0-31)
time - packed DOS time (16-bit integer):
hour - 5 bits (0-23)
minute - 6 bits (0-59)
second - 5 bits (0-30, with 2-second increments)

"""
return Timestamp(
year=(date & 0xFE00) >> 9 + 1980,
month=(date & 0x1e0) >> 5,
day=(date & 0x1F) + 1,
hour=(time & 0xF800) >> 11,
minute=(time & 0x7E0) >> 5,
second=(time & 0x1F) * 2
)
fromDosDateTime = staticmethod(fromDosDateTime)

def asTimeTuple(self):
"""Return 9-element time tuple

tm_wday and tm_yday members are set to 0,
and dst flag is set to -1.

"""
return (self.year, self.month, self.day,
self.hour, self.minute, self.second,
0, 0, -1)

def asTimeStamp(self):
"""Return number of seconds since unix epoch"""
return time.mktime(self.asTimeTuple())

def __str__(self):
return time.asctime(self.asTimeTuple())

def __repr__(self):
return "<%s@%X %s>" % (self.__class__.__name__, id(self), str(self))

class Attributes(Structure):

__slots__ = ["private", "crash", "received", "sent",
"fileAttached", "inTransit", "orphan", "killSent",
"local", "hold", "unused", "fileRequest",
"returnReceiptRequest", "isReturnReceipt",
"auditRequest", "fileUpdateRequest",
]

ATTR_NAMES = ["Pvt", "Cra", "Rcv", "Snt",
"Att", "Trs", "Orp", "K/s", "Loc", "Hld", "",
"Frq", "RRq", "RRc", "ARq", "URq",
]

def fromBitmask(attrs):
"""Create attributes structure from FTS-001 AttributeWord (16-bit)"""
_mask = 1
_args = {}
for _name in Attributes.__slots__:
_args[_name] = bool(attrs & _mask)
_mask <<= 1
return Attributes(**_args)
fromBitmask = staticmethod(fromBitmask)

def __str__(self):
return " ".join([_name
for (_attr, _name) in zip(self.__slots__, self.ATTR_NAMES)
if getattr(self, _attr)])

def __repr__(self):
return "<%s@%X %s>" % (self.__class__.__name__, id(self), str(self))

class Msg(object):

"""Fidonet FTS-001 message object"""

HEADER_STRUCTURE = "36s36s72s20s13H"
HEADER_LENGTH = struct.calcsize(HEADER_STRUCTURE) # 190

__slots__ = [
"origAddr", "destAddr", "fromUserName", "toUserName",
"subject", "dateTime", "attributes",
"timesRead", "cost", "replyTo", "nextReply",
"text", "kludges", "arrived", "written",
]

def __init__(self, data):
# text body without trailing zero
self.text = data[self.HEADER_LENGTH:-1]
# header info
(self.fromUserName, self.toUserName, self.subject, self.dateTime,
self.timesRead, _destNode, _origNode, self.cost,
_origNet, _destNet,
_writtenDate, _writtenTime, _arrivedDate, _arrivedTime,
self.replyTo, _attributes, self.nextReply,
) = struct.unpack(self.HEADER_STRUCTURE, data[:self.HEADER_LENGTH])
self.fromUserName = self.fromUserName.strip("\0")
self.toUserName = self.toUserName.strip("\0")
self.subject = self.subject.strip("\0")
self.dateTime = self.dateTime.strip("\0")
self.attributes = Attributes.fromBitmask(_attributes)
# Note: for duplicate kludges (e.g. @Via) behaviour is undefined
# (actually, the last one is reported, but don't rely on that)
self.kludges = dict([_line[1:].split(" ", 1)
for _line in self.text.split("\r")
if _line.startswith("\1")])
# FIXME: use @INTL kludge to detect zones
self.origAddr = NetworkAddress(DEFAULT_ZONE, _origNet, _origNode,
int(self.kludges.get("FROMPT", 0)))
self.destAddr = NetworkAddress(DEFAULT_ZONE, _destNet, _destNode,
int(self.kludges.get("TOPT", 0)))
self.arrived = Timestamp.fromDosDateTime(_arrivedDate, _arrivedTime)
self.written = Timestamp.fromDosDateTime(_writtenDate, _writtenTime)

def __repr__(self):
return "<%s@%X %r>" % (self.__class__.__name__, id(self),
dict([(_name, getattr(self, _name)) for _name in self.__slots__]))

def fromFile(filename):
"""Read message data from file"""
_file = open(filename, "rb")
_msg = Msg(_file.read())
_file.close()
return _msg
fromFile = staticmethod(fromFile)

if __name__ == "__main__":
for _filename in sys.argv[1:]:
print (_filename, Msg.fromFile(_filename))

# vim: set et sts=4 sw=4 :
==== end cut msg.py ====

запись - то же самое, но в обратном порядке. <wink>

желаю здравствовать,
alex.

--- GoldED snapshot-2002.10.27
* Origin: кулеp к пню, котоpый пpистегивается на pадиатоp (2:5100/14.8)
SEEN-BY: 46/50 50/203 51/7 450/186 1024 463/68 464/36 910 465/213 5000/0 170
SEEN-BY: 5000/5000 5004/75 5005/14 5010/77 5015/28 5020/175 400 545 715 1042
SEEN-BY: 5020/1604 2020 2238 4441 5025/3 5030/115 606 966 1900 5040/47 5054/1
SEEN-BY: 5057/119 5079/49 5080/80 1003 5083/21 5100/14 6090/1
PATH: 5100/14 51/7 5030/966 5020/4441 545 5000/5000
#6From:Sergey Dorofeev
To:Aleksej R. Serdyukov
Date:02-09-2005 21:45:29
Subj:.MSG
Hello Aleksej.

01 Sep 05 20:09, you wrote to all:

AS> Есть ли модуль для чтения-записи .msg?
AS> Hа гугле что-либо по этому поводу только случайно для паскаля нахожу
AS> (и ещё энциклопедии расширений файлов). :-(

****://******.*****.ru/files/PyFTN.rar

Sergey

--- GoldED+/LNX 1.1.5-040120
* Origin: Good pings (2:5020/12000.1)
SEEN-BY: 46/50 463/68 464/36 910 465/213 5000/0 170 5000 5004/75 5005/14
SEEN-BY: 5010/77 5020/545 715 818 1973 7770 12000 5030/115 5043/0 5057/119
SEEN-BY: 5080/1003 6090/1
PATH: 5020/12000 715 5000/5000
#7From:Yury Yurevich
To:Sergey Dorofeev
Date:05-09-2005 08:57:15
Subj:Re: кодировка русского текста
From: Yury Yurevich <fido@asko-zabota.ru>

Sergey Dorofeev пишет:
> Hello All.
>
> Hикто не встречал модуль для определения кодировки текста?
Hапример ****://******.*****.ru/misc.html

--
wbr, Yury Yurevich
icq://209846262
xmpp://j2a@jabber.ru
--- ifmail v.2.15dev5.3
* Origin: ASKO-Zabota (2:5020/400)
SEEN-BY: 46/50 50/203 450/186 1024 461/640 463/68 464/36 910 4616/3 4627/10
SEEN-BY: 5000/0 170 5000 5004/75 5005/14 5007/1 5010/70 77 5015/28 5020/118
SEEN-BY: 5020/175 400 545 715 902 982 1042 1057 1604 2020 2238 4441 5025/3
SEEN-BY: 5030/49 115 966 1900 5040/47 5054/1 5057/119 5080/80 1003 5083/21
SEEN-BY: 6090/1
PATH: 5020/400 4441 545 5000/5000
#8From:Oleg Palij
To:All
Date:29-09-2005 16:15:17
Subj:py-ldap удалить/добавить пользователя в группу
Hello everybody.

Подскажите, плиз.

Hе могу понять, как переместить пользователя из одной группы в другую.
modify_s с разными аргументами понимать меня отказывется.
Поиск работает нормально.

py-24-ldap2-2.0.7, python-2.4.1

Спасибо!

Oleg

--- GoldED+/BSD 1.1.5
* Origin: (2:464/910.777)
SEEN-BY: 46/50 463/68 464/36 910 1100 1234 550/5068 5000/0 170 5000 5004/75
SEEN-BY: 5005/14 5010/77 5020/545 715 5055/177 5057/119 5080/1003 6090/1
PATH: 464/910 5000/5000
#9From:Ilyak Kaznacheev
To:Oleg Palij
Date:29-09-2005 20:51:21
Subj:Re: py-ldap удалить/добавить пользователя в группу
From: Ilyak Kaznacheev <ilyak@online.ru>

Logged on as Ilyak(Online)

>Подскажите, плиз.
>Hе могу понять, как переместить пользователя из одной группы в другую.
>modify_s с разными аргументами понимать меня отказывется.
>Поиск работает нормально.
>py-24-ldap2-2.0.7, python-2.4.1
А что есть "группа" в терминах LDAP?

--
Not logged on. Reconnecting..........
--- ifmail v.2.15dev5.3
* Origin: Оправдывает ли цель средства -- задача, в общем виде н (2:5020/400)
SEEN-BY: 46/50 50/12 203 450/186 1024 461/640 463/68 464/36 910 550/5068
SEEN-BY: 4616/3 4627/10 5000/0 170 5000 5004/75 5005/14 5007/1 5010/70 77
SEEN-BY: 5015/28 5020/118 175 400 545 715 902 982 1042 1057 1604 2020 2238
SEEN-BY: 5020/4441 5025/3 5030/49 115 966 1900 5040/47 5054/1 5055/177
SEEN-BY: 5057/119 5080/80 1003 5083/21 6090/1
PATH: 5020/400 4441 545 5000/5000
#10From:Oleg Palij
To:Ilyak Kaznacheev
Date:30-09-2005 08:21:05
Subj:py-ldap удалить/добавить пользователя в группу
Hello Ilyak.

29 Sep 05 20:51, you wrote to me:

>> Подскажите, плиз.
>> Hе могу понять, как переместить пользователя из одной группы в
>> другую. modify_s с разными аргументами понимать меня отказывется.
>> Поиск работает нормально. py-24-ldap2-2.0.7, python-2.4.1
IK> А что есть "группа" в терминах LDAP?
Группа (глобальная, безопасности) в Active Directory win2k (поле memberOf, я так понял).
Я попробовал следующий вариант.

class ADS_if:
...............
def open_connection(self):
try:
ldap.set_option(ldap.OPT_X_TLS_REQUIRE_CERT, ldap.OPT_X_TLS_NEVER)
ldap.set_option(ldap.OPT_REFERRALS, 0)
self.ldap_h = ldap.initialize("ldaps://%s"%self.server)
self.ldap_h.simple_bind_s(self.user, self.password)
except ldap.LDAPError, error_message:
print >> sys.stderr, "Couldn't Connect to %s@%s. %s " % (error_message, self.user, self.server)

def getDN(self, user, enc='koi8-u'):
self.open_connection()
try:
user = unicode(user, enc)
except UnicodeDecodeError:
print >> sys.stderr, 'Unicode error, try pass enc parameter'
return []

filter = "sAMAccountName=%s"%user.encode('utf-8')
count = 0
result_set = []
result_id = self.ldap_h.search(self.base, self.scope, filter, self.retrieve_attributes)
i = 0
result_type, result_data = self.ldap_h.result(result_id, self.timeout)
if result_type == ldap.RES_SEARCH_ENTRY:
result_set.append(result_data)
if len(result_set)==0:
print 'No such user: %s'%user
return []
else:
return unicode(result_set[0][0][0],'utf-8')

def delUserFromGroup(self, user, group, enc='koi8-u'):
userDN=self.getDN(user, enc)
groupDN=self.getDN(group, enc)
print 'dn="%s"'%userDN.encode(enc)
print 'group="%s"'%groupDN.encode(enc)
self.ldap_h.modify_s(userDN.encode('utf-8'), [(ldap.MOD_DELETE,'memberOf',groupDN.encode('utf-8'))])

>>> from ADS import ADS_if
>>> lh = ADS_if()
>>> lh.delUserFromGroup('spd.student','For_install')
dn="CN=Студент СПД,OU=╤СЦМПД,OU=╤СЦ,DC=dp,DC=uz,DC=gov,DC=ua"
group="CN=For_install,CN=Users,DC=dp,DC=uz,DC=gov,DC=ua"
Traceback (most recent call last):
File "<stdin>", line 1, in ?
File "ADS.py", line 136, in delUserFromGroup
self.ldap_h.modify_s(userDN.encode('utf-8'),
[(ldap.MOD_DELETE,'memberOf',groupDN.encode('utf-8'))])
............
ldap.UNWILLING_TO_PERFORM: {'info': '0000209A: SvcErr: DSID-031A0983,
problem 5003 (WILL_NOT_PERFORM), data 0\n', 'desc': 'Server is unwilling to
perform'}

Я правильно мыслю? :)
И что делать с этой ошибкой?

Oleg

--- GoldED+/BSD 1.1.5
* Origin: (2:464/910.777)
SEEN-BY: 46/50 463/68 464/36 910 1100 1234 550/5068 5000/0 170 5000 5004/75
SEEN-BY: 5005/14 5010/77 5020/545 715 5055/177 5057/119 5080/1003 6090/1
PATH: 464/910 5000/5000
Выделенный сервер за 149 руб!