从bugzilla大量导出附件

时间:2013-08-29 13:36:31

标签: bugzilla bug-reporting

我们的bigzilla安装有几GB数据,没有服务器管理员。 我有对bugzilla的web管理访问权限,并希望得到所有附件(带有原始名称和bug#)。

我知道数据库的大规模导出为XML,但可能之后必须解析附件。

我可以请求访问服务器,然后take a look访问bug数据库中的attachments表,但是,再次,我将不得不以某种方式解码附件数据。所以,

  

如何一次性导出所有Bugzilla的错误附件?

也许某些桌面客户端具有此功能?或者someboday有一个脚本来创建tarball?

3 个答案:

答案 0 :(得分:0)

我不知道现有的工具,但是这里有一些从数据库中提取数据的有用参考(如果您或其他人确实制作了工具,请在此链接。)

附件文件名位于链接的attachments表中,该表还指定了错误编号。

https://dev.mysql.com/doc/refman/5.0/en/select-into.html - 从数据库中写入文件。

你也可以使用bugzilla webservice,虽然这可能会很慢:http://www.bugzilla.org/docs/4.0/en/html/api/Bugzilla/WebService/Bug.html#attachments

答案 1 :(得分:0)

我使用下面的内容构建了一个单独的sql文件,可以执行该文件来获取文件。提示:注意文件名中的特殊字符

select concat('SELECT ad.thedata into DUMPFILE  \'e:/temp/attachments/'
, a.bug_id 
, '___'
, ad.id
, '___'
, replace(a.filename,'\'','')
, '\'  FROM bugs.attachments a, bugs.attach_data ad where ad.id = a.attach_id'
, ' and ad.id = '
, ad.id
,';') into outfile 'C:/Temp/attachments.sql'
from bugs.attachments a, bugs.attach_data ad where ad.id = a.attach_id;

答案 2 :(得分:0)

我需要查看是否已经有满足相同要求的脚本,然后出现在这里。由于我不理解纯SQL答案,因此我继续创建自己的Python脚本。如果将来有人需要它,就在这里,

脚本将基于作为参数给出的列名创建目录。我不检查参数,因为这是一个快速而肮脏的脚本。

[wizard @ work]$ ./fetch_attach_from_bugzilla.py bug_id
[wizard @ work]$ ls
16  18  19  21  23  24  26 fetch_attach_from_bugzilla.py 
[wizard @ work]$

[wizard @ work]$ cat fetch_attach_from_bugzilla.py
#!/usr/bin/python

import binascii;
import MySQLdb;
import os;
import sys;

conn = MySQLdb.connect(host='',user="",passwd="",db="bugs");

r = conn.cursor();
r.execute('select bug_id from bugs');

bug_ids = r.fetchall();

for bug_row in bug_ids:
   bug_id = bug_row[0];
   cmd = 'select attachments.filename,attachments.mimetype, bugs.' + sys.argv[1] + ', attach_data.thedata from attachments left join attach_data on attachments.attach_id = attach_data.id left join bugs on bugs.bug_id = attachments.bug_id where attachments.bug_id = ' + str(bug_id);
   r.execute(cmd);

   for adata_row in r.fetchall():
      if not os.path.isdir(os.path.join(os.getcwd(),str(adata_row[2]))):
         os.mkdir(str(adata_row[2]));
      f = open(os.path.join(os.getcwd(),str(adata_row[2]),adata_row[0]), "wb+")
      f.write(adata_row[3]);
      f.close();


r.close;
conn.close;
[wizard @ work]$