mod_offline_odbc

при попытке отправить сообщение в оффлайн выходит ошибка 503 - service unavaliable, в логи ничего не пишет дополнительного

в конфиге
{access, max_user_offline_messages, [{5000, admin}, {100, all}]}.

...
{mod_offline_odbc, [{access_max_user_messages, max_user_offline_messages}]},
...

в базу ничего не пишет...даже при варианте

{mod_offline, [{access_max_user_messages, max_user_offline_messages}]},

та же ошибка

в чём может быть проблема? заранее спасибо!

Может быть, Вы снова

Может быть, Вы снова отключили какой-нибудь необходимый модуль? (Скажу сразу - в работе этого модуля подробно не разбирался. У меня просто работает.)
Вот мой работающий ejabberd.cfg:

override_global.
override_local.
override_acls.
{loglevel, 3}.
{hosts, ["pi.local"]}.
{listen,
[
  {5222, ejabberd_c2s, [
{access, c2s},
{shaper, c2s_shaper},
{max_stanza_size, 65536}
       ]},
  {5269, ejabberd_s2s_in, [
   {shaper, s2s_shaper},
   {max_stanza_size, 131072}
  ]},
  {5280, ejabberd_http, [
http_bind,
http_poll,
web_admin
]}
]}.
{auth_method, ldap}.
{ldap_servers, ["dc1.pi.local", "dc2.pi.local"]}.
{ldap_port, 389}.
{ldap_rootdn, "cn=jabber,cn=Users,dc=pi,dc=local"}.
{ldap_password, "Secret"}.
{ldap_base, "ou=pi,dc=pi,dc=local"}.
{ldap_uids, [{"userPrincipalName", "%u@pi.local"}]}.
{ldap_filter, "(&(objectClass=user)(!(UserAccountControl:1.2.840.113556.1.4.803:=2)))"}.
{shaper, normal, {maxrate, 1000}}.
{shaper, fast, {maxrate, 50000}}.
{max_fsm_queue, 1000}.
{acl, admin, {user, "admin1", "pi.local"}}.
{acl, admin, {user, "admin2", "pi.local"}}.
{acl, local, {user_regexp, ""}}.
{acl, announcer, {user, "И.Иванов", "pi.local"}}.
{acl, announcer, {user, "П.Петров", "pi.local"}}.
{acl, announcer, {user, "В.Пупкин", "pi.local"}}.
{access, max_user_sessions, [{10, all}]}.
{access, max_user_offline_messages, [{5000, admin}, {100, all}]}.
{access, local, [{allow, local}]}.
{access, c2s, [{deny, blocked},
       {allow, all}]}.
{access, c2s_shaper, [{none, admin},
      {normal, all}]}.
{access, s2s_shaper, [{fast, all}]}.
{access, announce, [{allow, admin},{allow, announcer}]}.
{access, configure, [{allow, admin}]}.
{access, muc_admin, [{allow, admin}]}.
{access, muc_create, [{allow, local}]}.
{access, muc, [{allow, all}]}.
{access, pubsub_createnode, [{allow, local}]}.
{access, register, [{allow, all}]}.
{language, "en"}.
{modules,
[
  {mod_adhoc,    []},
  {mod_announce, [{access, announce}]},
  {mod_caps,     []},
  {mod_configure,[]},
  {mod_disco,    []},
  {mod_last,     []},
  {mod_offline,  [{access_max_user_messages, max_user_offline_messages}]},
  {mod_ping,     []},
  {mod_private,  []},
  {mod_roster,   []},
  {mod_shared_roster_ldap,[
    {ldap_base, "dc=pi,dc=local"},
    {ldap_rfilter, "(distinguishedName=CN=jabber_groups,CN=Users,DC=pi,DC=local)"},
    {ldap_groupattr, "member"},
    {ldap_group_is_dn, true},
    {ldap_groupdesc, "cn"},
    {ldap_memberattr, "member"},
    {ldap_member_selection_mode, memberattr_dn},
    {ldap_ufilter, "(&(objectClass=user)(!(UserAccountControl:1.2.840.113556.1.4.803:=2)))"},
    {ldap_userdesc, "displayName"},
    {ldap_useruid, "userPrincipalName"},
    {ldap_useruid_format, "%u@pi.local"}
  ]},
  {mod_stats,    []},
  {mod_time,     []},
  {mod_vcard_ldap,    [
    {matches, infinity},
    {ldap_vcard_map, [
      {"NICKNAME", "%s", ["displayName"]},
      {"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"]},
      {"DESC", "%s", ["description"]},
      {"TEL", "%s", ["telephoneNumber"]},
      {"BDAY", "%s", ["birthDate"]},
      {"PHOTO", "%s", ["jpegPhoto"]}
    ]},
    {ldap_search_fields, [
      {"Name", "givenName"},
      {"Family Name", "sn"},
      {"Department", "department"}
    ]},
    {ldap_search_reported, [
      {"Full Name", "FN"},
      {"Department", "ORGUNIT"},
      {"Phone", "TEL"}
    ]}
  ]},
  {mod_version,  []}
]}.

Настройка mod_shared_roster_ldap нестандартная, поскольку я использую изменённый модуль. Всё остальное - из коробки. Кодировка UTF8 без BOM.

да всё вроде то же

да всё вроде то же самое

может ли это быть связано с тем, что используется скрипт external auth?

также есть предположение, что это как-то связано с тем, что

ejabberdctl stats registeredusers = 0

а

ejabberdctl stats onlineusers = 9, например...

как такое может быть? при этом, в mysql таблице таблица users пустая, хотя, например, в vcard хранятся данные, которые нормально показываются в клиентах

rosterusers и rostergroups пустые, хотя включён модуль mod_roster_odbc и в контакт листе, соответственно, показываются и группы и пользователи, как было настроено в mod_shared_roster_ldap

Это, получается, если

Это, получается, если пользователь в своём ростере переименует пользователя, или перенесёт его в какую-нибудь свою группу, он либо не переименуется/не перенесётся, либо эти изменения не сохранятся при логофе/логоне?

А если, например, с помощью ejabberdctl зарегистрировать пользователя с таким же jid, что-нибудь изменится?

Я никогда не использовал ext auth, просто мысли.

да, получается, именно так! -

да, получается, именно так! - как раз такая цель с самого начала, чтобы пользователи не могли друг-друга никуда перемещать, переименовывать, удалять и пр. - т.е. это можно сделать, и пользователь даже исчезнет из контакт листа, но при первом же логоф/логоне - всё опять будет по прежнему

если что-то регистрировать пользователя с помощью ejabberdctl, то происходит запрос к extauth скрипту сначала isuser, а потом tryregister - ну, соответственно, что пропишешь в скрипте на эти запросы - то и изменится (в моём скрипте эти запросы пока никак не обрабатываются))) )

просто если при такой конфигурации руками заполнить таблицы users, rosterusers и rostergroups - то это ничего не меняет...поэтому я и не придавал значения тому, что они пустые, однако, когда пользователь оффлайн система, видимо, должна как-то определить кому отправлять - но в эти таблицы она не смотрит (иначе бы что-то менялось бы если забить эти таблицы руками?)

кстати, ещё такой вопрос - в какой таблице в mysql еджабберд хранит оффлайн сообщения? вроде по смыслу подходит только private_storage? или в другое место?

Получилось короче, суть была

Получилось

короче, суть была в том, что из коробки, или это был какой-то копипаст из чужого конфига - сейчас уже сложно сказать, но в конфиге было у меня такое место

{mod_pubsub, [ % requires mod_caps
{access_createnode, pubsub_createnode},
{pep_sendlast_offline, false},
{last_item_cache, false},
%%{plugins, ["default", "pep"]}
{plugins, ["flat", "hometree", "pep"]} % pep requires mod_caps
]},

так вот, если изменить параметр pep_sendlast_offline на true, то сообщения отправляются!!! и, кстати, в базу MySQL никуда не пишутся

однако, сейчас такой вопрос: как сделать так, чтобы как только человек, которому было отправлено оффлайн сообщение, войдёт в сеть - чтобы ему пришло уведомление о новых сообщениях? а то так он только если сам посмотрит свою переписку с кем-то - то увидит, что тот ему отправил сообщение в оффлайн

Это не может быть причиной -

Это не может быть причиной - mod_pubsub вообще не нужен для оффлайновых сообщений. У меня он не подключён, и сообщения прекрасно приходят (и выскакивают при логоне)

по поводу выскакиваний при

по поводу выскакиваний при логоне - я сперва ошибся, всё выскакивает

сейчас попробовал сделать всегда isuser на True - видимо, это существенно было, т.к. теперь вне зависимости от содержания таблицы users всё работает

Ну и славненько :)

Ну и славненько :) Естественно, нужно это доработать, чтобы true было только на реальных пользователей.

1. Я не писал об удалении

1. Я не писал об удалении пользователей - обратите внимание: я говорил только о перемещении и переименовании.
2. Я не знал, как выглядит логика работа скрипта. Но судя по Вашим словам, скрипт имеет средства определения, имеется ли в природе некий юзер - а именно, isuser. Мне кажется, всё дело именно в этом - а что будет, если заставить этот запрос всегда возвращать истину?

Syndicate content