commit 3ccca4d4f424bdabd1daf7bdf4f8fe0b9592a9c2 Author: asamoukin Date: Mon Oct 20 12:24:50 2008 +0000 git-svn-id: http://svn.calculate.ru/calculate2/calculate-client/trunk@249 c91db197-33c1-4113-bf15-f8a5c547ca64 diff --git a/LICENCE b/LICENCE new file mode 100644 index 0000000..d645695 --- /dev/null +++ b/LICENCE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/README b/README new file mode 100644 index 0000000..66a3cf5 --- /dev/null +++ b/README @@ -0,0 +1,15 @@ +AUTHOR: Calculate Pack + +INSTALL +------- + +calculate-client needs the following library version installed, in order to run: + Python >= 2.3 + python-ldap >= 2.0.0 + pyxml >= 0.8 + calculate-lib >= 0.0.1 + +To install calculate-client , just execute the install script 'setup.py'. +Example: + + ./setup.py install diff --git a/lib/cl_keys.c b/lib/cl_keys.c new file mode 100644 index 0000000..e60b6ba --- /dev/null +++ b/lib/cl_keys.c @@ -0,0 +1,47 @@ +//Copyright 2007 Calculate Pack, http://www.calculate-linux.ru +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include + +// для пароля +#include + +// для strcpy strlen +#include + +// для работы с ключами +#include + +char* getKey(char *login) +{ + char buffer[255]; + memset(buffer,0,sizeof(buffer)); + int ret; + // ищем номер пользовательского ключа + ret = request_key("user", login, NULL, 0); + if (ret < 0) + { + printf ("id_key not found\n"); + return ""; + }; + + // Возвращаем значение ключа + ret = keyctl_read(ret, buffer, sizeof(buffer)); + if (ret < 0) + { + printf("error keyctl_read\n"); + return ""; + }; + return buffer; +}; diff --git a/lib/cl_keys.i b/lib/cl_keys.i new file mode 100644 index 0000000..27eae34 --- /dev/null +++ b/lib/cl_keys.i @@ -0,0 +1,6 @@ +%module cl_keys +%inline %{ +/* Put header files here or function declarations like below */ +extern char* getKey(char*); +%} +%include cl_keys.c \ No newline at end of file diff --git a/pym/__init__.py b/pym/__init__.py new file mode 100644 index 0000000..8d1c8b6 --- /dev/null +++ b/pym/__init__.py @@ -0,0 +1 @@ + diff --git a/pym/cl_client.py b/pym/cl_client.py new file mode 100644 index 0000000..596b520 --- /dev/null +++ b/pym/cl_client.py @@ -0,0 +1,358 @@ +#-*- coding: utf-8 -*- + +#Copyright 2008 Calculate Pack, http://www.calculate-linux.ru +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import re +import sys + +import cl_base +import cl_profile +import cl_utils2 +import cl_utils + +import ldap + +Version = "calculate-client 0.0.1_alpha" + +tr = cl_base.lang() +tr.setLanguage(sys.modules[__name__]) + +pcs = cl_utils.prettyColumnStr + +# Импортированные классы в cl_ldap +# Запись ошибок +imp_cl_err = cl_profile._error +# Работа с XML +imp_cl_xml = cl_profile.xmlShare +# Обработка параметров командной строки +imp_cl_help = cl_utils2.cl_help +# Форматированный вывод +imp_cl_smcon = cl_utils2.cl_smartcon + +class cl_client(imp_cl_err, imp_cl_xml, imp_cl_help, imp_cl_smcon): + """Основной класс для работы с LDAP""" + def __init__(self, cmdName): + # объект для форматированного вывода + imp_cl_help.__init__(self, cmdName) + + servName = "" + if "user" in cmdName: + servName = _("user") + + self.chapter = [\ + # расположение разделов на странице + # имя раздела, видимый или невидимый, кол. "\n" после + # названия раздела, кол. "\n" после раздела + # тип раздела + ("Copyright",False,0,2,""), + (_("Usage"),True,0,1,""), + ("Function",False,0,2,""), + (_("Examples"),True,1,1,""), + (_("Common options"),True,1,0,"options"), + ] + + # имена используемых программ и их номера для доступа к переменным + # self.data + self.progName = { 'cl-client':0, + } + + # Cвязь длинных опций помощи и выводимых разделов помощи с опциями + self.relOptions = {"h":[_("Common options")],} + + # список разделов, которые на наличие в ней информации + # используется для автоматического отображения/скрытия + # опций help-имя + # Пример: self.relOption = + # { "help-all":[_("Common options"], _("Unix service options"), + # _("Samba service options"), _("LDAP service options")}] + # self.relChapterPass = (_("Common options"),) + # это означается что опция будет активна, если только в разделах + # кроме Common options есть хоть одна доступная опция. + self.relChapterPass = (_("Common options"),) + + self.data = [\ + { + #Copyright + #'progAccess':(3,), + 'helpChapter':"Copyright", + 'help':Version + }, + #Usage + { + 'progAccess':(0,), + 'helpChapter':_("Usage"), + 'help': cmdName + " [" + _("options") + "] " + _("user") + }, + # Function + { + 'progAccess':(0,), + 'helpChapter':"Function", + 'help':_("Client for the calculate-server") + }, + # Examples + { + 'progAccess':(0,), + 'helpChapter':_("Examples"), + 'help':pcs( " cl-client -m test", self.column_width, + "# " + _("mounts a test user directory on the server \ +calculate-server"), + self.consolewidth-self.column_width ) + }, + # Options + {'shortOption':"h", + 'longOption':"help", + 'helpChapter':_("Common options"), + 'help':_("display this help and exit") + }, + + {'progAccess':(0,), + 'shortOption':"f", + 'longOption':"force", + 'helpChapter':_("Common options"), + 'help':_("force exit with success status") + " " +\ + _("if the specified group already exists") + }, + ] + + self._cl_help__setParamHelp() + + # Удаляем ненужный аттрибут класса cl_profile.xmlShare + self._createElement = False + delattr(self, "_createElement") + + # Переменная объект Vars + self.clVars = False + # Переменная объект ldapFunction + self.ldapObj = False + # Переменная соединение с LDAP сервером + self.conLdap = False + # Базовый DN LDAP сервера + self.baseDN = False + # DN сервисов относительно базового + self.ServicesDN = "ou=Services" + + self.relUsDN = 'ou=Users' + self.relServDN = 'ou=Unix' + self.relDN = self.addDN(self.relServDN,self.ServicesDN) + # DN пользователей, относительно базового DN + self.relUsersDN = self.addDN(self.relUsDN, self.relDN) + + def processOptionsForDatavars(self, options, datavars): + '''Обработать опции связанные с переменными окружения + + Параметры: + options словарь опций ( <буква опции>:<значение> + обрабатывает буквы 's' для установки параметров + 'e' для отображения) + datavars объект-хранилище переменных окружнения + + Возвращаемые значения: + True удалось установить указанные параметры + False метод вызван для просмотра переменных окружения, или + установка переменных окружения прошла с ошибками. + ''' + # если это установка параметров + if 's' in options: + # если установки параметрв не произошло + if not datavars.flFromCmdParam(options['s']): + # вывод + print _("Bad enviroment parameters") + return False + # если опция отображения параметров + if 'e' in options: + # вывод всех параметров + if options['e'] == '*': + datavars.printVars() + # вывод параметров, используюя фильтр + else: + datavars.printVars( + [i.strip() for i in options['e'].split(':')]) + return False + return True + + def handleCheckAccess(self,dataHash): + """Дополнительная проверка опций-справок - опция доступна только если + в разделах этой справки есть хотябы одна опция + + Входные параметры: + dataHash словарь из списка self.data + """ + # если эта опция для реализации справки + if 'longOption' in dataHash \ + and dataHash['longOption'] in self.relOptions: + # составляем список разделов которые должны быть не пустые + # разделы из relOptions относящиеся к этой опции за исключением + # разделов которые надо пропустить (relChapterPass) + trueChapters = \ + set(self.relOptions[dataHash['longOption']]).difference( \ + self.relChapterPass) + # перебираем все опции + for unit in self.data: + # если опция не отностится к выполняемой программе, то + # ее пропустить + if 'progAccess' in unit and \ + not self.progName[self.cmdName] in unit['progAccess']: + continue + # если опция отностится к необходмой справки + if unit['helpChapter'] in trueChapters: + # опция справки - доступна + return True + # если не оказалось не одной опция для разделов этой справки + return False + # опция доступна, так как не справочная + return True + + + def createClVars(self, clVars=False): + """Создает объект Vars""" + if not clVars: + clVars = cl_base.DataVars() + clVars.flClient() + #clVars.flIniFile() + # Устанавливаем у объекта объект Vars + self.clVars = clVars + return True + + def addDN(self, *arg): + """Складывает текстовые элементы DN""" + DNs = [] + for dn in arg: + if dn: + DNs.append(dn) + return ','.join(DNs) + + def searchLdapDN(self, name, relDN, attr, retAttr=None): + """Находит DN в LDAP""" + baseDN = self.clVars.Get("soft_ldap_base") + DN = self.addDN(relDN,baseDN) + #searchScope = ldap.SCOPE_SUBTREE + searchScope = ldap.SCOPE_ONELEVEL + searchFilter = "%s=%s" %(attr,name) + retrieveAttributes = retAttr + resSearch = self.ldapObj.ldapSearch(DN, searchScope, + searchFilter, retrieveAttributes) + return resSearch + + + def searchUnixUser(self, userName): + """Находит пользователя сервиса Unix""" + resSearch = self.searchLdapDN(userName, self.relUsersDN, "uid") + return resSearch + + def getLdapObjBind(self, host): + """Получаем объект ldapFunction + + Соединяемся пользователем bind + В выходном объекте есть соединение с LDAP сервером: self.conLdap + """ + self.createClVars(self.clVars) + bindDn = self.clVars.Get("soft_ldap_bind") + bindPw = self.clVars.Get("soft_ldap_bindpw") + if not (bindDn or bindPw): + self.printERROR(_("not found LDAP bind DN or password") + " ...") + return False + ldapObj = cl_utils2.ldapFun(bindDn, bindPw, host) + if ldapObj.getError(): + self.printERROR (_("LDAP connect error") + ": " +\ + ldapObj.getError().strip()) + return False + # Устанавливаем у объекта соединение и объект LDAP функций + self.ldapObj = ldapObj + self.conLdap = ldapObj.conLdap + return True + + def getUserMail(self, userName): + """Выдаем основной почтовый адрес""" + searchUser = self.searchUnixUser(userName) + if not searchUser: + self.printERROR(_("User %s not found in Unix service")\ + %str(userName)) + return False + if searchUser[0][0][1].has_key('mail'): + return searchUser[0][0][1]['mail'][0] + else: + return "" + +class tsOpt(cl_base.opt): + """Класс для обработки параметров и вывода help + + Параметры: + helpObj объект-справка содержащий необходимые опции + notOptError выдавать ошибку при отсутствии опций командной строки + """ + def __init__(self, helpObj, notOptError=False): + # от cl_help получаем короткие и длинные опции + shortOpt,longOpt = helpObj.getAllOpt('all', helpObj.relOptions['h']) + # вызвать конструктор объекта, распознающего опции + cl_base.opt.__init__(self,shortOpt,longOpt) + self.nameParams = ['user'] + self.sysArgv = sys.argv[1:] + self.helpObj = helpObj + self.__iter = 0 + self.opt = {} + self.params = {} + self.getopt() + # Обработка help + self.flagHelp = False + # определяем есть ли среди опций опции, которые влияют на показ + # опциональных разделов (метод пересечения множеств) + helpopt = \ + tuple(set(self.opt.keys()).intersection(helpObj.relOptions.keys())) + #Если есть опции help + if len(helpopt) > 0: + print helpObj.getHelp(helpObj.relOptions[helpopt[0]]) + self.flagHelp = True + #Если нет хвостов + elif not self.params: + print helpObj.getHelp(helpObj.relOptions['h']) + self.flagHelp = True + else: + if self.params.has_key('user'): + if len(self.nameParams) != self.__iter: + self.handlerErrOpt() + else: + self.handlerErrOpt() + # В случае остсутствия опций командной строки + if notOptError and not self.opt and self.params.has_key('user'): + self.printErrorNotOpt() + self.flagHelp = True + + def printErrorNotOpt(self): + """Сообщение в случае отсутствия опций""" + print _("Options are absent.") + + def handlerOpt(self,option,value): + # Обработчик (опция значение) + #print option, value + shortOpt = self.helpObj.getShortOpt(option) + if not shortOpt: + shortOpt = option + if not shortOpt in self.opt: + self.opt[shortOpt] = value + + def handlerErrOpt(self): + # Обработчик ошибок + argv = " ".join(sys.argv[1:]) + print _("Unrecognized option") + ' "' + argv + '"\n' + \ +_("Try") + ' "' + sys.argv[0].split("/")[-1] + ' --help" ' +\ +_("for more information.") + + + def handlerParam(self,param): + # Обработчик хвостов (значение) + self.__iter += 1 + if self.__iter<=len(self.nameParams): + self.params[self.nameParams[self.__iter-1]] = param + diff --git a/pym/cl_vars_client.py b/pym/cl_vars_client.py new file mode 100644 index 0000000..44aa41d --- /dev/null +++ b/pym/cl_vars_client.py @@ -0,0 +1,115 @@ +#-*- coding: utf-8 -*- + +#Copyright 2008 Calculate Pack, http://www.calculate-linux.ru +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +#Допустимые ключи значений +# mode - режим переменной r-не переназначается из командной строки, +# w-переназначается из командной строки +# type - тип переменной состоит из двух элементов(что это и для чего +# это) +# value - дефоултное значение переменной +# select - список допустимых значений переменной +# official - флаг того, что данная переменная служебная и не отображается +# при печати списка значений переменных +# printval - печатное значение переменной(значение выводимое при печати +# списка значений переменных) + +class Data: + #базовый суффикс LDAP + soft_ldap_base= {'mode':"r", + 'type':('param','soft') + } + #bind суффикс LDAP + soft_ldap_bind= {'mode':"r", + 'type':('param','soft'), + } + #пользователь только для чтения + soft_ldap_bindname= {'mode':"r", + 'type':('param','soft'), + } + #пароль для пользователя для чтения + soft_ldap_bindpw= {'mode':"r", + 'type':('param','soft'), + } + + #имя для базового суффикса LDAP + soft_ldap_root= {'mode':"r", + 'type':('param','soft')} + #запись для пользователя root + soft_ldap_admin= {'mode':"r", + 'type':('param','soft')} + #имя пользователя root для LDAP + soft_ldap_adminname= {'mode':"r", + 'type':('param','soft'), + } + + #почта пользователя + soft_ldap_user_mail= {'mode':"w", + 'type':('param','soft'), + 'value':'ttt@fff' + } + + #----------------------------------------------------- + #Все сервисы Unix + #----------------------------------------------------- + #Имя для всех сервисов + soft_ldap_sevices_dn_name = {'mode':"r", + 'type':('param','soft'), + 'value' : 'Services' + } + #DN всех сервисов + soft_ldap_sevices_dn= {'mode':"r", + 'type':('param','soft'), + } + #----------------------------------------------------- + #Сервис Unix + #----------------------------------------------------- + #DN админстратора сервиса Unix (он, же DN сервиса) + soft_ldap_admin_unix= {'mode':"r", + 'type':('param','soft'), + } + #имя админстратора сервиса Unix + soft_ldap_admin_unix_name= {'mode':"r", + 'type':('param','soft'), + } + #Настроен или нет сервис Unix + soft_unix_setup= {'mode':"w", + 'type':('param','soft'), + 'value':'no' + } + #----------------------------------------------------- + #Сервис Samba + #----------------------------------------------------- + # Настроен или нет сервис Samba + soft_samba_setup= {'mode':"w", + 'type':('param','soft'), + 'value':'no' + } + #----------------------------------------------------- + #Сервис Mail + #----------------------------------------------------- + #Настроен или нет сервис Mail + soft_mail_setup= {'mode':"w", + 'type':('param','soft'), + 'value':'no' + } + #----------------------------------------------------- + #Сервис Jabber + #----------------------------------------------------- + #Настроен или нет сервис Jabber + soft_jabber_setup= {'mode':"w", + 'type':('param','soft'), + 'value':'no' + } \ No newline at end of file diff --git a/scripts/cl-client b/scripts/cl-client new file mode 100644 index 0000000..092aa35 --- /dev/null +++ b/scripts/cl-client @@ -0,0 +1,44 @@ +#!/usr/bin/python +#-*- coding: utf-8 -*- + +#Copyright 2008 Calculate Pack, http://www.calculate-linux.ru +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import sys +import os +sys.path.insert(0,os.path.abspath('/usr/lib/calculate/calculate-lib/pym')) +sys.path.insert(0,os.path.abspath('/usr/lib/calculate/calculate-client/pym')) +import cl_base +import cl_client +tr = cl_base.lang() +tr.setGlobalDomain('cl_client') +tr.setLanguage(sys.modules[__name__]) + +if __name__ == "__main__": + ldapObj = cl_client.cl_client("cl-client") + optObj = cl_client.tsOpt(ldapObj) + flagError = False + if not optObj.flagHelp and optObj.params.has_key('user'): + if ldapObj.getLdapObjBind("movie"): + print ldapObj.getUserMail(optObj.params['user']) + #print ldapObj.conLdap + #ldapObj.createClVars() + #ldapObj.clVars.printVars() + import _cl_keys + print _cl_keys.getKey(optObj.params['user']) + + if flagError: + sys.exit(1) + else: + sys.exit(0) diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 0000000..ac7cbc0 --- /dev/null +++ b/setup.cfg @@ -0,0 +1,5 @@ +[install] +install-scripts=/usr/bin +install-purelib=/usr/lib/calculate +install-platlib=/usr/lib/calculate +install-data=/usr/lib/calculate/calculate-client \ No newline at end of file diff --git a/setup.py b/setup.py new file mode 100755 index 0000000..5232617 --- /dev/null +++ b/setup.py @@ -0,0 +1,124 @@ +#!/usr/bin/env python + +# setup.py --- Setup script for calculate-client + +#Copyright 2008 Calculate Pack, http://www.calculate-linux.ru +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import os +import glob +import sys +import re +from distutils.core import setup, Extension + +module1 = Extension('calculate-client.pym._cl_keys', + library_dirs = ['/usr/lib'], + libraries = ['keyutils'], + sources = ['./lib/cl_keys.i','./lib/cl_keys.c']) + +data_files = [] + +var_data_files = [] + +data_dirs_local = ['profile'] +share_calculate_dir = "/usr/share/calculate/" +data_dirs_share = ['i18n'] + +data_files += var_data_files + +def scanDirs(profilesDirs): + """Recursive scanning directories""" + dirs = [] + class dirProf: + def __init__(self): + self.baseDir = False + self.dirs = [] + self.files = [] + def getFilesDir(dirP, dirname,names): + if '/.svn' in dirname: + return False + for nameFile in names: + absNameFile = dirname + "/" + nameFile + if '/.svn' in absNameFile: + continue + if os.path.isfile(absNameFile): + dirP.files.append(absNameFile) + elif os.path.isdir(absNameFile): + dirP.dirs.append(absNameFile) + return True + for profileDir in profilesDirs: + if profileDir: + dirP = dirProf() + dirP.baseDir = profileDir + dirs.append(dirP) + os.path.walk(profileDir,getFilesDir, dirP) + return dirs + +def create_data_files (data_dirs, prefix=""): + test1_files = [] + data_files = [] + dirs = scanDirs(data_dirs) + i = 0 + for obj in dirs: + if not obj.dirs: + obj.dirs.append(data_dirs[i]) + i += 1 + for obj in dirs: + files_obj_dirs = [] + for dir_name in obj.dirs: + for file_name in obj.files: + if re.match(dir_name,file_name): + files_obj_dirs.append(dir_name) + break + for files_obj_dir in files_obj_dirs: + obj.dirs.remove(files_obj_dir) + files_obj_dirs.sort(lambda x, y: cmp(len(y), len(x))) + for dir_name in files_obj_dirs: + wr_sp = (prefix+dir_name,[]) + file_dirs = [] + for file_name in obj.files: + if re.match(dir_name,file_name): + file_dirs.append(file_name) + for file_name in file_dirs: + wr_sp[1].append(file_name) + obj.files.remove(file_name) + test1_files.append(wr_sp) + test1_files.reverse() + test2_files = [] + for obj in dirs: + for dir_name in obj.dirs: + wr_sp = (prefix+dir_name,[]) + test2_files.append(wr_sp) + + test1_files = test2_files + test1_files + return test1_files + +data_files += create_data_files (data_dirs_local) +data_files += create_data_files (data_dirs_share, share_calculate_dir) + + +setup( + name = 'calculate-client', + version = "0.0.1", + description = "Client for the calculate-server", + author = "Calculate Pack", + author_email = "support@calculate.ru", + url = "http://calculate-linux.ru", + license = "http://www.apache.org/licenses/LICENSE-2.0", + package_dir = {'calculate-client': "."}, + packages = ['calculate-client.pym'], + data_files = data_files, + scripts=["./scripts/cl-client",], + ext_modules = [module1], +)