ejabberd + AD +共有名簿

良い一日。



まず、私たちが持っているもの:主にWindows XP、Windows 2k3で自然に発生したドメイン、そしてgentoo linuxがインストールされている通常のマシン(またはサーバー)(オプションでMySQL)を含む〜150台のマシンの小さなネットワーク。



タスク:jabberサーバーをインストールし、ADのグループを使用して一般名簿を作成し、icqゲートをそれに接続して、jabberクライアントを稼働中のマシンに配置します。



ejabberdをインストールする



ejabberdのインストールを開始する前に、すべてが揃っていることを確認する必要があります。そうすれば、彼はそれを必要とする可能性があります。







安定版に共有名簿をインストールできなかったため、sjaからejabberd自体をビルドします。 これを行うには、次を実行します。



user$ svn checkout svn.process-one.net/ejabberd









これを収集します。アセンブリパラメーターに--enable-odbcを含めることを忘れないでください



user$ cd ejabberd/trunk/src/

user$ ./configure --enable-odbc

user$ make

user$ sudo make install









一部のエラーが表示されなかった場合は、さらに先に進みます。次のステップでは、共有名簿のモジュールを収集します。 モジュール自体のソースコードは、まだmod_shared_roster_ldap.erlです。



user$ wget -c www.ejabberd.im/files/contributions/mod_shared_roster_ldap.erl

user$ erlc -I ejabberd/trunk/src/ mod_shared_roster_ldap.erl









そのようなメッセージが表示されても心配しないでください



./mod_shared_roster_ldap.erl:19: Warning: behaviour gen_mod undefined

./mod_shared_roster_ldap.erl:289: Warning: variable 'User' is unused









さて、新しいモジュールをまとめて残りにコピーします



user$ sudo cp mod_shared_roster_ldap.beam /lib/ejabberd/ebin/









Ejabberdのセットアップ



ルートに移動して( sudo -i || su )、/ etc / ejabberd /に移動します。 そこでejabberd.cfgというファイルに興味があり、お気に入りのエディターで開いて編集を開始します。 私は%%でエスケープされるいくつかのコメントを使用して設定をもたらします:



override_global.

override_local.

override_acls.



{loglevel, 4}.



%% ,

, admin@domain %%

{watchdog_admins, ["admin@domain"]}.

%% , ejabberd,

cartman. hostname %%

{hosts, ["cartman"]}.

{listen,

[

%% %%

{5222, ejabberd_c2s, [

{access, c2s},

{shaper, c2s_shaper},

{max_stanza_size, 65536}

]},

%% , . SSL %%

{5223, ejabberd_c2s, [

{access, c2s},

{shaper, c2s_shaper},

%% , %%

{certfile, "/etc/ejabberd/cert/ejabberd.pem"}, tls,

{max_stanza_size, 65536}

]},

%% jabber %%

{5269, ejabberd_s2s_in, [

{shaper, s2s_shaper},

{max_stanza_size, 131072}

]},

%% , pyucq-t %%

{8888, ejabberd_service, [

{access, all},

{shaper_rule, fast},

{ip, {127, 0, 0, 1}},

%% %%

{hosts, ["icq.cartman"],

%% , pyicq-t %%

[{password, "123456"}]}

]},



%% ejabberd, %%

{5280, ejabberd_http, [

http_poll,

web_admin

]}



]}.



%% ldap %%

{auth_method, ldap}.

%% , domain.local %%

{ldap_servers, ["domain.local"]}.

{ldap_uids, [{"sAMAccountName"}]}.

{ldap_base, "dc=domain,dc=local"}.

%% , root, "" "" Users, ldap ( ?) %%

{ldap_rootdn, "cn=root,cn=Users,dc=domain,dc=local"}.

%% %%

{ldap_password, "123456"}.

%% , jabber ( ) %%

{shaper, normal, {maxrate, 10000}}.

{shaper, fast, {maxrate, 500000}}.

%% , admin %%

{acl, admin, {user, "admin", "cartman"}}.

%% , %%

{acl, admin, {user, "admin2", "cartman"}}.

{acl, local, {user_regexp, ""}}.

{access, max_user_sessions, [{10, all}]}.

{access, local, [{allow, local}]}.

%% , , jabber %%

{access, c2s, [{deny, blocked},

{allow, all}]}.

{access, c2s_shaper, [{none, admin},

{normal, all}]}.

{access, s2s_shaper, [{fast, all}]}.

{access, announce, [{allow, admin}]}.

{access, configure, [{allow, admin}]}.

{access, muc_admin, [{allow, admin}]}.

{access, muc, [{allow, all}]}.

{access, pubsub_createnode, [{allow, all}]}.

%% , AD %%

{access, register, [{deny, all}]}.



{language, "ru"}.



{modules,

[

{mod_adhoc, []},

{mod_announce, [{access, announce}]}, % recommends mod_adhoc

{mod_caps, []},

{mod_configure,[]}, % requires mod_adhoc

{mod_disco, []},

{mod_echo, [{host, "echo.localhost"}]},

{mod_last, []},

{mod_muc, [

{access, muc},

{access_create, muc},

{access_persistent, muc},

{access_admin, muc_admin}

]},

%% , , , . %%

{mod_muc_log, [

{access, muc},

{access_create, muc},

{access_admin, muc_admin},

{access_log, muc},

{outdir, "/var/log/muc_log"},

{top_link, {"http://cartman/", "JABBER SERVER"}}

]},

{mod_offline, []},

{mod_privacy, []},

{mod_private, []},

{mod_pubsub, [ % requires mod_caps

{access_createnode, pubsub_createnode},

{plugins, ["default", "pep"]}

]},

{mod_register, [

{welcome_message, {"Welcome",

"Hi! Welcome to this Jabber server."}},

%% , , , , , . %%

{registration_watchers, ["admin@cartman"]},

{access, register}

]},

{mod_roster, []},

{mod_stats, []},

{mod_time, []},

%% vcard AD, %%

{mod_vcard_ldap,

[{host, "users.cartman"},

{ldap_vcard_map,

[{"NICKNAME", "%u", []},

{"GIVEN", "%s", ["givenName"]},

{"MIDDLE", "%s", ["initials"]},

{"FAMILY", "%s", ["sn"]},

{"FN", "%s", ["displayName"]},

{"EMAIL", "%s", ["mail"]},

{"ORGNAME", "%s", ["company"]},

{"ORGUNIT", "%s", ["department"]},

{"CTRY", "%s", ["c"]},

{"LOCALITY", "%s", ["l"]},

{"STREET", "%s", ["streetAddress"]},

{"REGION", "%s", ["st"]},

{"PCODE", "%s", ["postalCode"]},

{"TITLE", "%s", ["title"]},

{"URL", "%s", ["wWWHomePage"]},

{"DESC", "%s", ["description"]},

{"TEL", "%s", ["telephoneNumber"]}]},

{ldap_search_fields,

[{"User", "%u"},

{"Name", "givenName"},

{"Family Name", "sn"},

{"Email", "mail"},

{"Phone", "telephoneNumber"}

]},

{ldap_search_reported,

[{"Full Name", "FN"},

{"Nickname", "NICKNAME"},

{"Email", "EMAIL"}]}

]},

%% shared_roster. department, AD %%

{mod_shared_roster_ldap,

[{ldap_groupattr,"department"},

{ldap_groupdesc,"department"},

%% , , AD JabberUsers, "" Users. , JabberUsers %%

{ldap_rfilter, "(&(memberOf=CN=JabberUsers,CN=Users,DC=klondike,DC=local) (|(userAccountControl=66050)(userAccountControl=66048)))"},

{ldap_memberattr,"sAMAccountName"},

{ldap_userdesc,"cn"}

]

},

{mod_version, []}

]}.









トレーラーにはすべて準備が整っています。SSL証明書を追加しましょう(bamが便利です)



mkdir /etc/ejabberd/cert

cd /etc/ejabberd/cert

openssl req -new -x509 -newkey rsa:1024 -days 3650 -keyout privkey.pem -out server.pem

openssl rsa -in privkey.pem -out privkey.pem

cat privkey.pem >> ejabberd.pem

rm privkey.pem









pyicq-tをインストールして構成する



snv || svc || gitからそれを収集することはありません。それは、gentooで利用可能になり、かなり機能しているからです(主に、USE =“ webinterface”を含めることを忘れないでください。



user$ sudo emerge net-im/pyicq-t









** / etc / jabber / pyicq-t.xmlにある彼の(彼女の)congfigによって、すべてがさらに修正されています。



<pyicqt>

<jid>icq.cartman</jid>

<spooldir>/var/spool/jabber</spooldir>

<pid>/var/run/jabber/pyicq-t.pid</pid>

<mainServer>127.0.0.1</mainServer>

<mainServerJID>cartman</mainServerJID>

<website>http://cartman/</website>

<supportJid>admin@cartman</supportJid>

<port>8888</port>

<webport>12345</webport>

<secret>123456</secret>

<lang>ru</lang>

<encoding>cp-1251</encoding>

<icqServer>login.icq.com</icqServer>

<icqPort>5190</icqPort>

<usemd5auth/>

<sessionGreeting>Welcome to icq gate of Cartman server</sessionGreeting>

<enableShutdownMessage/>

<customShutdownMessage>Sorry but icq gete will be shutdown.</customShutdownMessage>

<registerMessage>You have succsefull registed</registerMessage>

<crossChat/>

<enableAutoInvite/>

<xstatusessupport/>

<detectunicode>1</detectunicode>

<admins>

<jid>admin@cartman</jid>

</admins>

<reactor>epoll</reactor>

<!--<xdbDriver>xmlfiles</xdbDriver>-->

<xdbDriver>mysql</xdbDriver>

<xdbDriver_mysql>

<username>pyicqt</username>

<password>12345678</password>

<database>pyicqt</database>

<server>localhost</server>

<format>encrypted</format>

</xdbDriver_mysql>

<avatarsOnlyOnChat/>

</pyicqt>









私はおそらくそれについてコメントしないでしょう、設定自体のコメントはすでに非常に

良い、私が気づく唯一のことは8888です

私たちがいる方法で、ジャバーにねじ込まれているポート

彼らはjabber設定を登録しました。123456はjabberへのゲートアクセスのパスワードです。* .xmlファイルから情報のストレージを削除し、MySQLに転送します。以下にその方法を示します。



MySQLのインストール方法と起動方法、およびユーザーとデータベースの作成方法については説明しません。 一般に、MySQLは既にpyicqtデータベースで動作しており、pyicqtユーザーの完全な権限があり、パスワード12345678を使用してログインできます。次に、gentuvodsの場合は、/ usr / lib / python2.5 / site-packages / pyicq-フォルダーに移動しますt / tools /そして、次のことを行います



user$ mysql -u pyicqt -D pyicqt -p

mysql> \. db-setup.mysql









さて、これをすべて実行してみましょうか? 最初にejabberdを起動することにより、ejabberdctlを介して実行し、すぐにpyicq-tを実行します



user$ sudo ejabberdctl start

user$ sudo /etc/init.d/pyicq-t start









そして、jabberログを調べ始めます。



user$ sudo tail -F /var/log/ejabberd/ejabberd.log









そうでない場合、いくつかの恐ろしい恐怖は発生しません-すべての話題。 クライアントの構成を開始します。



クライアントの構成とインストール



原則として、私は多くのグースクライアントを感じました(私自身は長い間mcabberを使用しています)、そして

Windows XPを搭載したクライアントマシンでは、

PSIはより進化しており、PSIは

JabberクライアントとSparkは、MSIパッケージを持つ唯一のクライアントです。 どっち

あなたは自分で決定し、賭けます。私は、HELLの政治家を通じて、私がそれらをどのように置くかを個人的に示します。



PSI



原則として、これは良くありません。設定を中断するためにPythonを使用しました

クライアントマシン上にあるため、それぞれにインストールする必要があります

(これは簡単に行われます-彼はMSIパッケージを持っているので、ADを介して強打します)。 次に、自分でPSIを設定し、アカウントを追加して、すべてがどのように機能するか、グループがどのように表示されるか、オフラインユーザーがハングする方法を確認し、PSIを設定します。 完了したら、閉じます。 * C:\ Documents and Settings \%USERNAME%\ PsiData \ profiles \ default \ accounts.xmlに移動して編集し、行admin @ cartman (最後のどこか)を探します(adminは、ジャバーを入力したアカウントです、およびADのアカウント)で管理者QWERTYUIOPに置き換え、保存して、それをaccounts_oldに名前変更します 。 次のステップは、全員の読み取り権限でボールを作成することです。 \\ server4 \ psi_installを持ちC:\ Documents and Settings \%USERNAME%\ PsiDataおよびC:\ Program Files \ Psiを ドロップするとします (読み取り権限が必要です)すべてである)。 \\ server4 \ psi_install \ PsiData \ profiles \ defaultに 移動し、そこpsi_settings.pyという名前のPythonスクリプトをコピーします



  1. #!/usr/env/bin python

    # -*- coding: utf-8 -*-

    import os

    import re

    import sys

    username = os.getenv('USERNAME')

    find_accountname = re.compile('^\s{0,3}<jid type="QString" >(.+)@cartman</jid>$')

    change_username = re.compile('QWERTYUIOP')

    fr = open('accounts_old', 'r')

    fw = open('accounts.xml', 'w+')

    for i in fr.readlines():

    if find_accountname.search(i):

    i = change_username.sub(username, i)

    fw.write(i)

    fr.close()

    fw.close()




  2. #!/usr/env/bin python

    # -*- coding: utf-8 -*-

    import os

    import re

    import sys

    username = os.getenv('USERNAME')

    find_accountname = re.compile('^\s{0,3}<jid type="QString" >(.+)@cartman</jid>$')

    change_username = re.compile('QWERTYUIOP')

    fr = open('accounts_old', 'r')

    fw = open('accounts.xml', 'w+')

    for i in fr.readlines():

    if find_accountname.search(i):

    i = change_username.sub(username, i)

    fw.write(i)

    fr.close()

    fw.close()




  3. #!/usr/env/bin python

    # -*- coding: utf-8 -*-

    import os

    import re

    import sys

    username = os.getenv('USERNAME')

    find_accountname = re.compile('^\s{0,3}<jid type="QString" >(.+)@cartman</jid>$')

    change_username = re.compile('QWERTYUIOP')

    fr = open('accounts_old', 'r')

    fw = open('accounts.xml', 'w+')

    for i in fr.readlines():

    if find_accountname.search(i):

    i = change_username.sub(username, i)

    fw.write(i)

    fr.close()

    fw.close()




  4. #!/usr/env/bin python

    # -*- coding: utf-8 -*-

    import os

    import re

    import sys

    username = os.getenv('USERNAME')

    find_accountname = re.compile('^\s{0,3}<jid type="QString" >(.+)@cartman</jid>$')

    change_username = re.compile('QWERTYUIOP')

    fr = open('accounts_old', 'r')

    fw = open('accounts.xml', 'w+')

    for i in fr.readlines():

    if find_accountname.search(i):

    i = change_username.sub(username, i)

    fw.write(i)

    fr.close()

    fw.close()




  5. #!/usr/env/bin python

    # -*- coding: utf-8 -*-

    import os

    import re

    import sys

    username = os.getenv('USERNAME')

    find_accountname = re.compile('^\s{0,3}<jid type="QString" >(.+)@cartman</jid>$')

    change_username = re.compile('QWERTYUIOP')

    fr = open('accounts_old', 'r')

    fw = open('accounts.xml', 'w+')

    for i in fr.readlines():

    if find_accountname.search(i):

    i = change_username.sub(username, i)

    fw.write(i)

    fr.close()

    fw.close()




  6. #!/usr/env/bin python

    # -*- coding: utf-8 -*-

    import os

    import re

    import sys

    username = os.getenv('USERNAME')

    find_accountname = re.compile('^\s{0,3}<jid type="QString" >(.+)@cartman</jid>$')

    change_username = re.compile('QWERTYUIOP')

    fr = open('accounts_old', 'r')

    fw = open('accounts.xml', 'w+')

    for i in fr.readlines():

    if find_accountname.search(i):

    i = change_username.sub(username, i)

    fw.write(i)

    fr.close()

    fw.close()




  7. #!/usr/env/bin python

    # -*- coding: utf-8 -*-

    import os

    import re

    import sys

    username = os.getenv('USERNAME')

    find_accountname = re.compile('^\s{0,3}<jid type="QString" >(.+)@cartman</jid>$')

    change_username = re.compile('QWERTYUIOP')

    fr = open('accounts_old', 'r')

    fw = open('accounts.xml', 'w+')

    for i in fr.readlines():

    if find_accountname.search(i):

    i = change_username.sub(username, i)

    fw.write(i)

    fr.close()

    fw.close()




  8. #!/usr/env/bin python

    # -*- coding: utf-8 -*-

    import os

    import re

    import sys

    username = os.getenv('USERNAME')

    find_accountname = re.compile('^\s{0,3}<jid type="QString" >(.+)@cartman</jid>$')

    change_username = re.compile('QWERTYUIOP')

    fr = open('accounts_old', 'r')

    fw = open('accounts.xml', 'w+')

    for i in fr.readlines():

    if find_accountname.search(i):

    i = change_username.sub(username, i)

    fw.write(i)

    fr.close()

    fw.close()




  9. #!/usr/env/bin python

    # -*- coding: utf-8 -*-

    import os

    import re

    import sys

    username = os.getenv('USERNAME')

    find_accountname = re.compile('^\s{0,3}<jid type="QString" >(.+)@cartman</jid>$')

    change_username = re.compile('QWERTYUIOP')

    fr = open('accounts_old', 'r')

    fw = open('accounts.xml', 'w+')

    for i in fr.readlines():

    if find_accountname.search(i):

    i = change_username.sub(username, i)

    fw.write(i)

    fr.close()

    fw.close()




  10. #!/usr/env/bin python

    # -*- coding: utf-8 -*-

    import os

    import re

    import sys

    username = os.getenv('USERNAME')

    find_accountname = re.compile('^\s{0,3}<jid type="QString" >(.+)@cartman</jid>$')

    change_username = re.compile('QWERTYUIOP')

    fr = open('accounts_old', 'r')

    fw = open('accounts.xml', 'w+')

    for i in fr.readlines():

    if find_accountname.search(i):

    i = change_username.sub(username, i)

    fw.write(i)

    fr.close()

    fw.close()




  11. #!/usr/env/bin python

    # -*- coding: utf-8 -*-

    import os

    import re

    import sys

    username = os.getenv('USERNAME')

    find_accountname = re.compile('^\s{0,3}<jid type="QString" >(.+)@cartman</jid>$')

    change_username = re.compile('QWERTYUIOP')

    fr = open('accounts_old', 'r')

    fw = open('accounts.xml', 'w+')

    for i in fr.readlines():

    if find_accountname.search(i):

    i = change_username.sub(username, i)

    fw.write(i)

    fr.close()

    fw.close()




  12. #!/usr/env/bin python

    # -*- coding: utf-8 -*-

    import os

    import re

    import sys

    username = os.getenv('USERNAME')

    find_accountname = re.compile('^\s{0,3}<jid type="QString" >(.+)@cartman</jid>$')

    change_username = re.compile('QWERTYUIOP')

    fr = open('accounts_old', 'r')

    fw = open('accounts.xml', 'w+')

    for i in fr.readlines():

    if find_accountname.search(i):

    i = change_username.sub(username, i)

    fw.write(i)

    fr.close()

    fw.close()




  13. #!/usr/env/bin python

    # -*- coding: utf-8 -*-

    import os

    import re

    import sys

    username = os.getenv('USERNAME')

    find_accountname = re.compile('^\s{0,3}<jid type="QString" >(.+)@cartman</jid>$')

    change_username = re.compile('QWERTYUIOP')

    fr = open('accounts_old', 'r')

    fw = open('accounts.xml', 'w+')

    for i in fr.readlines():

    if find_accountname.search(i):

    i = change_username.sub(username, i)

    fw.write(i)

    fr.close()

    fw.close()




  14. #!/usr/env/bin python

    # -*- coding: utf-8 -*-

    import os

    import re

    import sys

    username = os.getenv('USERNAME')

    find_accountname = re.compile('^\s{0,3}<jid type="QString" >(.+)@cartman</jid>$')

    change_username = re.compile('QWERTYUIOP')

    fr = open('accounts_old', 'r')

    fw = open('accounts.xml', 'w+')

    for i in fr.readlines():

    if find_accountname.search(i):

    i = change_username.sub(username, i)

    fw.write(i)

    fr.close()

    fw.close()




  15. #!/usr/env/bin python

    # -*- coding: utf-8 -*-

    import os

    import re

    import sys

    username = os.getenv('USERNAME')

    find_accountname = re.compile('^\s{0,3}<jid type="QString" >(.+)@cartman</jid>$')

    change_username = re.compile('QWERTYUIOP')

    fr = open('accounts_old', 'r')

    fw = open('accounts.xml', 'w+')

    for i in fr.readlines():

    if find_accountname.search(i):

    i = change_username.sub(username, i)

    fw.write(i)

    fr.close()

    fw.close()




  16. #!/usr/env/bin python

    # -*- coding: utf-8 -*-

    import os

    import re

    import sys

    username = os.getenv('USERNAME')

    find_accountname = re.compile('^\s{0,3}<jid type="QString" >(.+)@cartman</jid>$')

    change_username = re.compile('QWERTYUIOP')

    fr = open('accounts_old', 'r')

    fw = open('accounts.xml', 'w+')

    for i in fr.readlines():

    if find_accountname.search(i):

    i = change_username.sub(username, i)

    fw.write(i)

    fr.close()

    fw.close()








スクリプトは悲惨で、急いで書いた



そのため、ほとんどのユーザーは限られた権限で作業するため、 C:\ Documents and Settings \%USERNAME%*のディレクトリからPSIを起動することにしました [グループポリシー]-> [ユーザーの構成]-> [Windowsの構成]-> [スクリプト(ログイン/ログアウト)]のスナップインに進み、[システムへのログイン]を選択します。 [ファイルの表示]をクリックし、* copy_psi.cmdというファイルを作成して、内容を変更します。



@Echo off

IF EXIST "C:\Python25\python.exe" (

IF NOT EXIST "C:\Documents and Settings\%USERNAME%\Psi\psi.exe" (

xcopy \dc\Soft\ezotrank\psi_ad\* "C:\Documents and Settings\%USERNAME%" /E /C

cd "C:\Documents and Settings\%USERNAME%\PsiData\profiles\default"

python psi_settings.py

reg add HKCU\Software\Microsoft\Windows\CurrentVersion\Run /v psi_run /d "C:\Documents and Settings\%USERNAME%\Psi\psi.exe"

)

)









さて、これで終わりです。GPに追加して、喫煙しましょう。



スパーク



すぐに気に入らなかったのは、RAMを非常に愛するJavaで書かれていることですが、市場の企業セグメントを対象としており、おそらくOpenFire(原則として、これと一部の人々の発案)、特に有料版で非常にうまく機能します。 私が一番気に入ったのは、スクリーンショット付きの組み込み機能です。 通常、 sparkを使用してダウンロードし、ADを使用して設定するのは簡単です。



いくつかのメモ:



ハリネズミのウェブフェイスはcartmanに配置されます :5280 /管理者ログイン

パスワードは、ejabberd.cfgに登録したadminです。つまり、admin @ cartmanです。



Webマズルpyicq-t cartman :12345



All Articles