167 lines
9.4 KiB
Python
167 lines
9.4 KiB
Python
#!/usr/bin/python
|
|
# -*- coding: utf-8 -*-
|
|
|
|
# --------------------------------------------------------------------------- #
|
|
# #
|
|
# Plugin for iSida Jabber Bot #
|
|
# Copyright (C) diSabler <dsy@dsy.name> #
|
|
# #
|
|
# This program is free software: you can redistribute it and/or modify #
|
|
# it under the terms of the GNU General Public License as published by #
|
|
# the Free Software Foundation, either version 3 of the License, or #
|
|
# (at your option) any later version. #
|
|
# #
|
|
# This program is distributed in the hope that it will be useful, #
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of #
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
|
|
# GNU General Public License for more details. #
|
|
# #
|
|
# You should have received a copy of the GNU General Public License #
|
|
# along with this program. If not, see <http://www.gnu.org/licenses/>. #
|
|
# #
|
|
# --------------------------------------------------------------------------- #
|
|
|
|
backup_async = {}
|
|
|
|
def getMucItems(jid,affil,ns,back_id):
|
|
iqid = get_id()
|
|
if ns == xmpp.NS_MUC_ADMIN: i = xmpp.Node('iq', {'id': iqid, 'type': 'get', 'to':getRoom(jid)}, payload = [xmpp.Node('query', {'xmlns': xmpp.NS_MUC_ADMIN},[xmpp.Node('item',{'affiliation':affil})])])
|
|
else: i = xmpp.Node('iq', {'id': iqid, 'type': 'get', 'to':getRoom(jid)}, payload = [xmpp.Node('query', {'xmlns': ns},[])])
|
|
iq_request[iqid]=(time.time(),getMucItems_async,[ns,affil,back_id],ns)
|
|
sender(i)
|
|
|
|
def getMucItems_async(ns,affil,back_id,iq_stanza):
|
|
global backup_async
|
|
iq_stanza = iq_stanza[1][0]
|
|
if ns == xmpp.NS_MUC_ADMIN: backup_async[back_id][affil] = [[tmp.getAttr('jid'),['',tmp.getTagData('reason')][tmp.getTagData('reason') != None]] for tmp in iq_stanza.getTag('query',namespace=xmpp.NS_MUC_ADMIN).getTags('item')]
|
|
else: backup_async[back_id]['room_config'] = [[tmp.getAttr('var'),tmp.getAttr('type'),tmp.getTagData('value')] for tmp in iq_stanza.getTag('query',namespace=xmpp.NS_MUC_OWNER).getTag('x',namespace=xmpp.NS_DATA).getTags('field')]
|
|
|
|
def make_stanzas_array(raw_back,jid,affil):
|
|
stanza_array = []
|
|
try: make_stanza_jid_count = get_config_int(jid,'make_stanza_jid_count')
|
|
except: make_stanza_jid_count = 1
|
|
for tmp in range(0,len(raw_back),make_stanza_jid_count):
|
|
i = xmpp.Iq(typ='set',to=jid,xmlns=xmpp.NS_CLIENT)
|
|
i.setTag('query',namespace=xmpp.NS_MUC_ADMIN)
|
|
for t in raw_back[tmp:tmp+make_stanza_jid_count]:
|
|
i.getTag('query',namespace=xmpp.NS_MUC_ADMIN).\
|
|
setTag('item',attrs={'affiliation':affil,'jid':t[0]}).\
|
|
setTagData('reason',t[1])
|
|
stanza_array.append(i)
|
|
return stanza_array
|
|
|
|
def conf_backup(type, jid, nick, text):
|
|
global backup_async,conn
|
|
if len(text):
|
|
text = text.split(' ')
|
|
mode = text[0]
|
|
|
|
if mode == 'show':
|
|
a = os.listdir(back_folder % '')
|
|
b = []
|
|
for c in a:
|
|
if not c.endswith('.txt') and not c.endswith('.back'): b.append((c,os.path.getmtime(back_folder % c)))
|
|
if len(b): msg = '%s %s' % (L('Available copies:','%s/%s'%(jid,nick)), ', '.join(['%s (%s)' % (c[0],disp_time(c[1],'%s/%s'%(jid,nick))) for c in b]))
|
|
else: msg = L('Backup copies not found.','%s/%s'%(jid,nick))
|
|
elif mode == 'now':
|
|
|
|
if get_xtype(jid) != 'owner': msg = L('I need an owner affiliation for backup settings!','%s/%s'%(jid,nick))
|
|
else:
|
|
back_id = get_id()
|
|
backup_async[back_id] = {}
|
|
getMucItems(jid,'outcast',xmpp.NS_MUC_ADMIN,back_id)
|
|
getMucItems(jid,'member',xmpp.NS_MUC_ADMIN,back_id)
|
|
getMucItems(jid,'admin',xmpp.NS_MUC_ADMIN,back_id)
|
|
getMucItems(jid,'owner',xmpp.NS_MUC_ADMIN,back_id)
|
|
getMucItems(jid,'',xmpp.NS_MUC_OWNER,back_id)
|
|
bst = GT('backup_sleep_time')
|
|
while len(backup_async[back_id]) != 5 and not game_over: time.sleep(bst)
|
|
iqid = get_id()
|
|
i = xmpp.Node('iq', {'id': iqid, 'type': 'set', 'to':jid}, payload = [xmpp.Node('query', {'xmlns': xmpp.NS_MUC_ADMIN},[xmpp.Node('item',{'affiliation':'admin', 'jid':getRoom(str(selfjid))},[])])])
|
|
sender(i)
|
|
backup_async[back_id]['alias'] = cur_execute_fetchall('select match ,cmd from alias where room=%s',(jid,))
|
|
backup_async[back_id]['bot_config'] = cur_execute_fetchall('select option ,value from config_conf where room=%s',(jid,))
|
|
backup_async[back_id]['acl'] = cur_execute_fetchall('select action,type,text,command,time,level from acl where jid=%s',(jid,))
|
|
backup_async[back_id]['rss'] = cur_execute_fetchall('select url, update ,type,time,hash from feed where room=%s',(jid,))
|
|
|
|
msg = L('Copying completed!','%s/%s'%(jid,nick))
|
|
msg += L('\nOwners: %s | Admins: %s | Members: %s | Banned: %s','%s/%s'%(jid,nick)) % (\
|
|
len(backup_async[back_id]['owner'])-1,\
|
|
len(backup_async[back_id]['admin'])+1,\
|
|
len(backup_async[back_id]['member']),\
|
|
len(backup_async[back_id]['outcast']))
|
|
|
|
msg += L('\nRoom config: %s | Bot config: %s | Aliases: %s | Acl\'s: %s | RSS: %s','%s/%s'%(jid,nick)) % (\
|
|
len(backup_async[back_id]['room_config']),\
|
|
len(backup_async[back_id]['bot_config']),\
|
|
len(backup_async[back_id]['alias']),\
|
|
len(backup_async[back_id]['acl']),\
|
|
len(backup_async[back_id]['rss']))
|
|
|
|
writefile(back_folder % unicode(jid),json.dumps(backup_async[back_id]))
|
|
|
|
elif mode == 'restore':
|
|
if len(text)>1:
|
|
if text[1] in os.listdir(back_folder % ''):
|
|
if text[1].endswith('.acl'):
|
|
raw_back = json.loads(readfile(back_folder % unicode(text[1])))
|
|
cnt = 0
|
|
for tmp in raw_back:
|
|
isit = cur_execute_fetchall('select action,type,text,command,time from acl where jid=%s and action=%s and type=%s and text=%s and level=%s',(jid,tmp[0],tmp[1],tmp[2],tmp[5]))
|
|
if not isit:
|
|
cur_execute('insert into acl values (%s,%s,%s,%s,%s,%s,%s)', tmp)
|
|
cnt += 1
|
|
msg = L('Restored %s action(s).','%s/%s'%(jid,nick)) % cnt
|
|
elif get_xtype(jid) != 'owner': msg = L('I need an owner affiliation for restore settings!','%s/%s'%(jid,nick))
|
|
else:
|
|
bst = GT('backup_sleep_time')
|
|
raw_back=json.loads(readfile(back_folder % unicode(text[1])))
|
|
for tmp in ['outcast','member','admin','owner']:
|
|
for t in make_stanzas_array(raw_back[tmp],jid,tmp):
|
|
sender(t)
|
|
time.sleep(bst)
|
|
i = xmpp.Iq(typ='set',to=jid,xmlns=xmpp.NS_CLIENT)
|
|
i.setTag('query',namespace=xmpp.NS_MUC_OWNER)
|
|
i.getTag('query',namespace=xmpp.NS_MUC_OWNER).setTag('x',namespace=xmpp.NS_DATA).setAttr('type','submit')
|
|
for tmp in raw_back['room_config']:
|
|
i.getTag('query',namespace=xmpp.NS_MUC_OWNER).getTag('x',namespace=xmpp.NS_DATA).\
|
|
setTag('field',attrs={'var':tmp[0],'type':tmp[1]}).\
|
|
setTagData('value',tmp[2])
|
|
sender(i)
|
|
time.sleep(bst)
|
|
sender(xmpp.Node('iq', {'id': get_id(), 'type': 'set', 'to':jid}, payload = [xmpp.Node('query', {'xmlns': xmpp.NS_MUC_ADMIN},[xmpp.Node('item',{'affiliation':'admin', 'jid':getRoom(unicode(selfjid))},[])])]))
|
|
time.sleep(bst)
|
|
cur_execute_fetchall('delete from config_conf where room=%s',(jid,))
|
|
for tmp in raw_back['bot_config']: cur_execute('insert into config_conf (room, option ,value) values (%s,%s,%s)',(jid,tmp[0],tmp[1]))
|
|
for tmp in raw_back['alias']:
|
|
cur_execute('delete from alias where room=%s and match =%s',(jid,tmp[0]))
|
|
cur_execute('insert into alias (room, match ,cmd) values (%s,%s,%s)',(jid,tmp[0],tmp[1]))
|
|
for tmp in raw_back['acl']:
|
|
isit = cur_execute_fetchall('select action,type,text,command,time from acl where jid=%s and action=%s and type=%s and text=%s and level=%s',(jid,tmp[0],tmp[1],tmp[2],tmp[5]))
|
|
if not isit: cur_execute('insert into acl values (%s,%s,%s,%s,%s,%s,%s)', tuple([jid]+list(tmp)))
|
|
for tmp in raw_back['rss']:
|
|
isit = cur_execute_fetchone('select * from feed where room=%s and url=%s',(jid,tmp[0]))
|
|
if not isit: cur_execute('insert into feeed (url, update ,type,time,room,hash) values (%s,%s,%s,%s,%s,%s)',(tmp[0],tmp[1],tmp[2],tmp[3],jid,tmp[4]))
|
|
msg = L('Restore completed.','%s/%s'%(jid,nick))
|
|
msg += L('\nOwners: %s | Admins: %s | Members: %s | Banned: %s','%s/%s'%(jid,nick)) % (\
|
|
len(raw_back['owner'])-1,\
|
|
len(raw_back['admin'])+1,\
|
|
len(raw_back['member']),\
|
|
len(raw_back['outcast']))
|
|
|
|
msg += L('\nRoom config: %s | Bot config: %s | Aliases: %s | Acl\'s: %s | RSS: %s','%s/%s'%(jid,nick)) % (\
|
|
len(raw_back['room_config']),\
|
|
len(raw_back['bot_config']),\
|
|
len(raw_back['alias']),\
|
|
len(raw_back['acl']),\
|
|
len(raw_back['rss']))
|
|
else: msg = L('Copy not found. Use key "show" for lisen available copies.','%s/%s'%(jid,nick))
|
|
else: msg = L('What do you want to restore?','%s/%s'%(jid,nick))
|
|
else: msg = L('Unknown item!','%s/%s'%(jid,nick))
|
|
else: msg = 'backup now|show|restore'
|
|
send_msg(type, jid, nick, msg)
|
|
|
|
global execute
|
|
|
|
execute = [(8, 'backup', conf_backup, 2, 'Backup/restore conference settings.\nbackup show|now|restore\nshow - show available copies\nnow - backup current conference\nrestore name_conference - restore settings name_conference in current conference')]
|