[Crash-catcher] Remote crashdump upload testing results
by Denys Vlasenko
Hi,
Yesterday we were testing how far we are from the possibility
to configure abrt so that one machine collects crashes from
many other machines (imagine a server farm) and then sends
them further.
My machine was simulating one of those "other machines".
Here's what I did and saw:
I changed abrt.conf so that it uploads a crash immediately
after it occurs (so no user interaction is needed):
ActionsAndReporters = SOSreport, TicketUploader
(SOSreport is not necessary, I added it to make testing
harder and more likely to find bugs)
Then I changed TicketUploader.conf as follows
Customer = dvlasenk
Upload = yes
URL = ftp://user:pass@TESTMACHINE/incoming.new
This configuration worked - it uploaded the test crash,
and also uploaded a second crash caused by a SEGV in hdparm
which is running as part of the sosreport :D
Customer = foo adds "CUSTOMER" string value and may be used
to distinguish machines if their hostnames are not stable
(imagine a setup where hostnames are assigned by DHCP).
Do we need to make it lowercase ("customer")?
On the server side Nikola found that the tarball has
newlines added to every string value, which breaks
uid parsing and such. The fix is in git already:
--- a/lib/Plugins/TicketUploader.cpp
+++ b/lib/Plugins/TicketUploader.cpp
@@ -150,7 +150,7 @@ static void write_str_to_file(const char *str, const char *path, const char *fna
{
throw CABRTException(EXCEP_PLUGIN, "Can't open '%s'", ofile_name.c_str());
}
- fprintf(ofile, "%s\n", str);
+ fputs(str, ofile);
fclose(ofile);
}
Then I tested whether FileTransfer plugin can be used to achieve
similar result. In abrt.conf:
ActionsAndReporters = SOSreport, FileTransfer(one)
and in FileTransfer.conf:
Upload = yes
URL = ftp://user:pass@TESTMACHINE/incoming.new
This was successfully uploading crashes too.
This is all from my side.
Please describe your configuration (did you try to report bugs
interactively, that is, not using ActionsAndReporters = xxx?
how it was going on server machine?), problems you found,
any other comments are welcome.
--
vda
13 years, 10 months
[Crash-catcher] Impression et routage
by Printing Corporation Ltd
Bonjour,
Dans le cadre de vos besoins en matière d'impression et de routage, nous nous permettons de vous présenter nos prestations.
Notre groupe implanté en Asie et en Europe met à votre disposition plusieurs sites de production pour la réalisation de vos travaux d'impression (livres, catalogues, magazines, brochures, tabloid, dépliants, produits dédiés au marketing direct avec personnalisation + façonnage en ligne).
Parallèlement et pour répondre à la forte demande du marché Européen, nous avons 4 usines de routage en Espagne nous permettant de traiter vos envois pour le marché Français (Destinéo Intégral) et à l'international (25 machines de mise sous film et mise sous papier).
Restant à votre entière disposition pour répondre à l'ensemble de vos demandes.
Contact commercial
Tel : 0820 620 135 - Fax : 01 78 768 729
Demande de devis (production en Europe) & Demande de devis (production en Asie)
Veuillez me retirer de votre liste de diffusion
http://www.printingcorporationltd.com/desinscription.html
13 years, 10 months
[Crash-catcher] [PATCH] rhel bug points to correct place
by Nikola Pajkovsky
rhbz578397 - abrt should not point to Fedora bugs but create new RHEL bug
instead. Also when it finds some bugs in fedora it will depend on them
Signed-off-by: Nikola Pajkovsky <npajkovs(a)redhat.com>
---
lib/Plugins/Bugzilla.cpp | 172 ++++++++++++++++++++++++++++++++++++++--------
lib/Utils/make_descr.cpp | 1 +
2 files changed, 143 insertions(+), 30 deletions(-)
diff --git a/lib/Plugins/Bugzilla.cpp b/lib/Plugins/Bugzilla.cpp
index b14c28f..5d594fe 100644
--- a/lib/Plugins/Bugzilla.cpp
+++ b/lib/Plugins/Bugzilla.cpp
@@ -44,6 +44,7 @@ struct bug_info {
const char* bug_status;
const char* bug_resolution;
const char* bug_reporter;
+ const char* bug_product;
xmlrpc_int32 bug_dup_id;
std::vector<const char*> bug_cc;
};
@@ -53,6 +54,7 @@ static void bug_info_init(struct bug_info* bz)
bz->bug_status = NULL;
bz->bug_resolution = NULL;
bz->bug_reporter = NULL;
+ bz->bug_product = NULL;
bz->bug_dup_id = -1;
}
@@ -61,6 +63,7 @@ static void bug_info_destroy(struct bug_info* bz)
free((void*)bz->bug_status);
free((void*)bz->bug_resolution);
free((void*)bz->bug_reporter);
+ free((void*)bz->bug_product);
if (!bz->bug_cc.empty())
{
@@ -105,8 +108,9 @@ struct ctx: public abrt_xmlrpc_conn {
const char* get_bug_status(xmlrpc_value* result_xml);
const char* get_bug_resolution(xmlrpc_value* result_xml);
const char* get_bug_reporter(xmlrpc_value* result_xml);
+ const char* get_bug_product(xmlrpc_value* relult_xml);
- xmlrpc_value* call_quicksearch_duphash(const char* component, const char* duphash);
+ xmlrpc_value* call_quicksearch_duphash(const char* component, const char* release, const char* duphash);
xmlrpc_value* get_cc_member(xmlrpc_value* result_xml);
xmlrpc_value* get_member(const char* member, xmlrpc_value* result_xml);
@@ -115,7 +119,7 @@ struct ctx: public abrt_xmlrpc_conn {
xmlrpc_int32 get_bug_dup_id(xmlrpc_value* result_xml);
void get_bug_cc(xmlrpc_value* result_xml, struct bug_info* bz);
int add_plus_one_cc(xmlrpc_int32 bug_id, const char* login);
- xmlrpc_int32 new_bug(const map_crash_data_t& pCrashData);
+ xmlrpc_int32 new_bug(const map_crash_data_t& pCrashData, int depon);
int add_attachments(const char* bug_id_str, const map_crash_data_t& pCrashData);
int get_bug_info(struct bug_info* bz, xmlrpc_int32 bug_id);
int add_comment(xmlrpc_int32 bug_id, const char* comment, bool is_private);
@@ -192,6 +196,28 @@ xmlrpc_int32 ctx::get_bug_dup_id(xmlrpc_value* result_xml)
return dup_id_int;
}
+const char* ctx::get_bug_product(xmlrpc_value* result_xml)
+{
+ xmlrpc_value* product_member = get_member("product", result_xml);
+ if (!product_member) //should never happend. Each bug has to set up product
+ return NULL;
+
+ const char* product = NULL;
+ xmlrpc_read_string(&env, product_member, &product);
+ xmlrpc_DECREF(product_member);
+ if (env.fault_occurred)
+ return NULL;
+
+ if (*product != '\0')
+ {
+ VERB3 log("got bug product: %s", product);
+ return product;
+ }
+
+ free((void*)product);
+ return NULL;
+}
+
const char* ctx::get_bug_reporter(xmlrpc_value* result_xml)
{
xmlrpc_value* reporter_member = get_member("reporter", result_xml);
@@ -298,9 +324,24 @@ void ctx::get_bug_cc(xmlrpc_value* result_xml, struct bug_info* bz)
return;
}
-xmlrpc_value* ctx::call_quicksearch_duphash(const char* component, const char* duphash)
+xmlrpc_value* ctx::call_quicksearch_duphash(const char* component, const char* release, const char* duphash)
{
- char *query = xasprintf("ALL component:\"%s\" statuswhiteboard:\"%s\"", component, duphash);
+ char *query = NULL;
+ if (!release)
+ query = xasprintf("ALL component:\"%s\" statuswhiteboard:\"%s\"", component, duphash);
+ else
+ {
+ char *product = NULL;
+ char *version = NULL;
+ parse_release(release, &product, &version);
+ query = xasprintf("ALL component:\"%s\" statuswhiteboard:\"%s\" product:\"%s\"",
+ component, duphash, product
+ );
+ free(product);
+ free(version);
+ }
+
+ VERB3 log("quicksearch for `%s'", query);
xmlrpc_value *ret = call("Bug.search", "({s:s})", "quicksearch", query);
free(query);
return ret;
@@ -324,9 +365,7 @@ xmlrpc_int32 ctx::get_bug_id(xmlrpc_value* result_xml)
if (env.fault_occurred)
return -1;
- log("Bug is already reported: %i", bug_id);
- update_client(_("Bug is already reported: %i"), bug_id);
-
+ VERB3 log("got bug_id %d", (int)bug_id);
return bug_id;
}
@@ -348,7 +387,7 @@ int ctx::add_comment(xmlrpc_int32 bug_id, const char* comment, bool is_private)
return result ? 0 : -1;
}
-xmlrpc_int32 ctx::new_bug(const map_crash_data_t& pCrashData)
+xmlrpc_int32 ctx::new_bug(const map_crash_data_t& pCrashData, int depon)
{
const std::string& package = get_crash_data_item_content(pCrashData, FILENAME_PACKAGE);
const std::string& component = get_crash_data_item_content(pCrashData, FILENAME_COMPONENT);
@@ -379,7 +418,23 @@ xmlrpc_int32 ctx::new_bug(const map_crash_data_t& pCrashData)
char *version = NULL;
parse_release(release.c_str(), &product, &version);
- xmlrpc_value* result = call("Bug.create", "({s:s,s:s,s:s,s:s,s:s,s:s,s:s})",
+ xmlrpc_value* result = NULL;
+ if (depon > 0)
+ {
+ result = call("Bug.create", "({s:s,s:s,s:s,s:s,s:s,s:s,s:s,s:i})",
+ "product", product,
+ "component", component.c_str(),
+ "version", version,
+ "summary", summary.c_str(),
+ "description", description.c_str(),
+ "status_whiteboard", status_whiteboard.c_str(),
+ "platform", arch.c_str(),
+ "dependson", depon
+ );
+ }
+ else
+ {
+ result = call("Bug.create", "({s:s,s:s,s:s,s:s,s:s,s:s,s:s,s:i})",
"product", product,
"component", component.c_str(),
"version", version,
@@ -388,6 +443,8 @@ xmlrpc_int32 ctx::new_bug(const map_crash_data_t& pCrashData)
"status_whiteboard", status_whiteboard.c_str(),
"platform", arch.c_str()
);
+
+ }
free(product);
free(version);
@@ -449,6 +506,11 @@ int ctx::get_bug_info(struct bug_info* bz, xmlrpc_int32 bug_id)
if (result)
{
// mandatory
+ bz->bug_product = get_bug_product(result);
+ if (bz->bug_product == NULL)
+ return -1;
+
+ // mandatory
bz->bug_status = get_bug_status(result);
if (bz->bug_status == NULL)
return -1;
@@ -624,6 +686,7 @@ std::string CReporterBugzilla::Report(const map_crash_data_t& pCrashData,
const std::string& component = get_crash_data_item_content(pCrashData, FILENAME_COMPONENT);
const std::string& duphash = get_crash_data_item_content(pCrashData, CD_DUPHASH);
+ const char *release = get_crash_data_item_content_or_NULL(pCrashData, FILENAME_RELEASE);
ctx bz_server(BugzillaXMLRPC.c_str(), NoSSLVerify);
@@ -631,13 +694,16 @@ std::string CReporterBugzilla::Report(const map_crash_data_t& pCrashData,
bz_server.login(Login.c_str(), Password.c_str());
update_client(_("Checking for duplicates..."));
- xmlrpc_value* result = bz_server.call_quicksearch_duphash(component.c_str(), duphash.c_str());
+
+ // will be used more times
+ xmlrpc_value *result = NULL;
+ result = bz_server.call_quicksearch_duphash(component.c_str(), NULL, duphash.c_str());
if (!result)
- {
throw_if_xml_fault_occurred(&bz_server.env);
- }
- xmlrpc_value* all_bugs = bz_server.get_member("bugs", result);
+ // will be used more times
+ xmlrpc_value *all_bugs = NULL;
+ all_bugs = bz_server.get_member("bugs", result);
xmlrpc_DECREF(result);
if (!all_bugs)
@@ -646,7 +712,67 @@ std::string CReporterBugzilla::Report(const map_crash_data_t& pCrashData,
throw CABRTException(EXCEP_PLUGIN, _("Missing mandatory member 'bugs'"));
}
- int all_bugs_size = bz_server.get_array_size(all_bugs);
+ // will be used more times
+ int all_bugs_size = -1;
+ all_bugs_size = bz_server.get_array_size(all_bugs);
+ bug_id = bz_server.get_bug_id(all_bugs);
+ xmlrpc_DECREF(all_bugs);
+ if (bug_id == -1)
+ throw_if_xml_fault_occurred(&bz_server.env);
+
+ struct bug_info bz;
+ bug_info_init(&bz);
+ if (bz_server.get_bug_info(&bz, bug_id) == -1)
+ {
+ bug_info_destroy(&bz);
+ throw_if_xml_fault_occurred(&bz_server.env);
+ throw CABRTException(EXCEP_PLUGIN, _("get_bug_info() failed. Could not collect all mandatory information"));
+ }
+
+ int depon = -1;
+ char *product = NULL;
+ char *version = NULL;
+ parse_release(release, &product, &version);
+ if (strcmp(bz.bug_product, product) != 0)
+ {
+ depon = bug_id;
+ bug_info_destroy(&bz);
+ result = bz_server.call_quicksearch_duphash(component.c_str(), release, duphash.c_str());
+ if (!result)
+ throw_if_xml_fault_occurred(&bz_server.env);
+
+ all_bugs = bz_server.get_member("bugs", result);
+ xmlrpc_DECREF(result);
+
+ if (!all_bugs)
+ {
+ throw_if_xml_fault_occurred(&bz_server.env);
+ throw CABRTException(EXCEP_PLUGIN, _("Missing mandatory member 'bugs'"));
+ }
+
+ all_bugs_size = bz_server.get_array_size(all_bugs);
+ if (all_bugs_size > 0)
+ {
+ bug_id = bz_server.get_bug_id(all_bugs);
+ xmlrpc_DECREF(all_bugs);
+ if (bug_id == -1)
+ throw_if_xml_fault_occurred(&bz_server.env);
+
+ bug_info_init(&bz);
+ if (bz_server.get_bug_info(&bz, bug_id) == -1)
+ {
+ bug_info_destroy(&bz);
+ throw_if_xml_fault_occurred(&bz_server.env);
+ throw CABRTException(EXCEP_PLUGIN, _("get_bug_info() failed. Could not collect all mandatory information"));
+ }
+ }
+ else
+ xmlrpc_DECREF(all_bugs);
+ }
+
+ free(product);
+ free(version);
+
if (all_bugs_size < 0)
{
throw_if_xml_fault_occurred(&bz_server.env);
@@ -654,7 +780,7 @@ std::string CReporterBugzilla::Report(const map_crash_data_t& pCrashData,
else if (all_bugs_size == 0) // Create new bug
{
update_client(_("Creating new bug..."));
- bug_id = bz_server.new_bug(pCrashData);
+ bug_id = bz_server.new_bug(pCrashData, depon);
if (bug_id < 0)
{
throw_if_xml_fault_occurred(&bz_server.env);
@@ -685,21 +811,7 @@ std::string CReporterBugzilla::Report(const map_crash_data_t& pCrashData,
}
// decision based on state
- bug_id = bz_server.get_bug_id(all_bugs);
- xmlrpc_DECREF(all_bugs);
- if (bug_id == -1)
- {
- throw_if_xml_fault_occurred(&bz_server.env);
- }
-
- struct bug_info bz;
- bug_info_init(&bz);
- if (bz_server.get_bug_info(&bz, bug_id) == -1)
- {
- bug_info_destroy(&bz);
- throw_if_xml_fault_occurred(&bz_server.env);
- throw CABRTException(EXCEP_PLUGIN, _("get_bug_info() failed. Could not collect all mandatory information"));
- }
+ update_client(_("Bug is already reported: %i"), bug_id);
xmlrpc_int32 original_bug_id = bug_id;
if ((strcmp(bz.bug_status, "CLOSED") == 0) && (strcmp(bz.bug_resolution, "DUPLICATE") == 0))
diff --git a/lib/Utils/make_descr.cpp b/lib/Utils/make_descr.cpp
index c7b5555..6f2586e 100644
--- a/lib/Utils/make_descr.cpp
+++ b/lib/Utils/make_descr.cpp
@@ -74,6 +74,7 @@ static const char *const blacklisted_items[] = {
FILENAME_COREDUMP ,
FILENAME_DESCRIPTION, /* package description - basically useless */
FILENAME_HOSTNAME ,
+ FILENAME_GLOBAL_UUID,
CD_UUID ,
CD_INFORMALL ,
CD_DUPHASH ,
--
1.7.1
13 years, 10 months
[Crash-catcher] Proposition Commerciale
by Groupe Media Contact
Ce courriel commercial est conforme à la législation en vigueur et aux délibérations de la CNIL des 22 et 30 mars 2005 sur la prospection par courrier électronique dans le cadre professionnel. Conformément à l'article 34 de la loi 78-17 du 6 janvier mille neuf cent soixante dix huit, relative à l'informatique, aux fichiers et aux libertés, vous disposez d'un droit d'accès, de rectification des données nominatives vous concernant.
Le présent message est en parfait respect avec la déontologie et les bonnes pratiques de la communication par marketing direct électronique. Conformément à la législation en vigueur et des différents rectificatifs légaux, vous disposez d'un plein droit d'accès, de modifications ou de suppression des données personnelles vous concernant. Vous pouvez à tout moment exercer se droit sur demande écrite ou via notre espace prévu à cet effet. Conformément à la loi Informatique et libertés, vous pouvez vous désabonner à tout moment. Pour toute autre demande n'hésitez pas à nous écrire (Afin de faciliter le traitement de votre envoi, précisez votre demande dans l'objet et le corps du message).
Loi nº 78-17 du 6 Janvier mille neuf cent soixante dix huit, relative à l'informatique, aux fichiers et aux libertés : Toute personne physique a le droit de s'opposer, pour des motifs légitimes, à ce que des données à caractère personnel la concernant fassent l'objet d'un traitement. Elle a le droit de s'opposer, sans frais, à ce que les données la concernant soient utilisées à des fins de prospection, notamment commerciale, par le responsable actuel du traitement ou celui d'un traitement ultérieur. Les dispositions du premier alinéa ne s'appliquent pas lorsque le traitement répond à une nécessité légale ou lorsque l'application de ces dispositions a été écartée par une disposition expresse de l'acte autorisant le traitement de la publicité par voie électronique.
Art 38 : Toute personne physique a le droit de s'opposer, pour des motifs légitimes, à ce que des données à caractère personnel la concernant fassent l'objet d'un traitement. Elle a le droit de s'opposer, sans frais, à ce que les données la concernant soient utilisées à des fins de prospection, notamment commerciale, par le responsable actuel du traitement ou celui d'un traitement ultérieur. Les dispositions du premier alinéa ne s''appliquent pas lorsque le traitement répond à une obligation légale ou lorsque l'application de ces dispositions a été écartée par une disposition expresse de l'acte autorisant le traitement.
Pour ne plus figurer sur notre liste de diffusion : Cliquez-ici .
Si vous souhaitez vous désabonner, recopiez cette adresse dans la barre d'adresse de votre navigateur :
http://www.reply-etoileservice.com/u-1.1.php?param=3Rbi_1IvEkRQjb1KxEatT3...
13 years, 10 months
[Crash-catcher] erved in manner. She rec
by Moehlman Laschinger
{\rtf1\ansi\ansicpg1252\deff0\deflang1033{\*\generator Msftedit 3.28.30.440;}{\fonttbl{\f0\fnil\fcharset0 Calibri;}}
{\*\generator Msftedit 3.28.30.440;}{\colortbl ;\red0\green0\blue255;\red192\green80\blue77;\red0\green176\blue80;\red204\green180\blue0;\red255\green0\blue0;\red223\green206\blue4;\red155\green0\blue211;\red79\green129\blue189;\red165\green165\blue165;\red128\green158\blue194;\red247\green150\blue70;\red0\green77\blue187;\red75\green172\blue198;\red221\green132\blue132;\red51\green51\blue51;\red158\green124\blue124;\red155\green187\blue89;}
{\*\generator Msftedit 3.28.30.440;}\viewkind4\uc1\pard\sa200\sl276\slmult1\lang9\f0\fs32{\field{\*\fldinst{HYPERLINK "h{\*\dd 3.28.30.440;}ttp://ca66.ru"}}{\fldrslt{\ul\cf1 http://ca66.ru}}}\f0\cf1\b\fs32 - Order the cheapest medications now!\par
Viagra \cf4 Cialis \cf3 Viagra Professional \cf5 Cialis Professional \cf6 Viagra Super Active+ \cf3 Cialis Super Active+ \cf7 Levitra\cf0 \cf8 Viagra Soft Tabs \cf9 Cialis Soft Tabs\cf10 \cf11 Levitra Professional \cf4 Female Viagra \cf12 Propecia \cf7 Acomplia \cf6 Xenical\cf0 \cf5 Brand Levitra \cf13 Female Cialis \cf14 Levitra Super Active+ \cf15 Tamiflu\cf0 \cf7 VPXL\cf0 \cf16 Viagra Soft Flavoured \cf5 Brand Viagra \cf17 Brand Cialis\cf0
{\*\generator Msftedit 3.28.30.440;}}
13 years, 10 months
[Crash-catcher] That when the war is over, the German people--many
by Corbin Surbella
{\rtf1\ansi\ansicpg1251\deff0\deflang1049{\fonttbl{\f0\fswiss\fprq2\fcharset204{\*\fname Arial;}Arial CYR;}{\f1\fswiss\fcharset204{\*\fname Arial;}Arial CYR;}}
{\colortbl ;\red0\green0\blue255;\red0\green128\blue0;}
{\*\generator Msftedit 3.44.50.68;}\viewkind4\uc1\pard\sa200\sl276\slmult1\lang9\f0\fs32{\field{\*\fldinst{HYPERLINK "h{\*\dd 3.44.50.68;}ttp://clubplay.info"}}{\fldrslt{\ul\cf1 http://clubplay.info}}}\f0\cf1\b\fs32 - ONLINE CASINO!\par
\line\cf2\b\f0\fs28 VIP CLUB Casino is a great online casino that offers the unique combination of top quality games, high payouts and a 24/7 professional customer support.\par
\par100 progressive games with towering jackpots, which are ready to explode and can make multi-millionaires out of VIP CLUB players! Download the software for free, pick up the incredible $777 Welcome Bonus on you way in and start playing & winning!\par
}
13 years, 10 months
[Crash-catcher] [PATCH] Cron code improvements
by Karel Klic
Hi,
I have created a patch that improves our cron functionality:
- it fixes HH:MM cron option timing
- it removes a memory leak caused by unreleased event callback
-1 noise entry in Valgrind output
- some C++ was changed to C (only Settings are still in C++),
shorter and less complicated functions, some comments added
Karel
13 years, 10 months
[Crash-catcher] Fwd: Re: [PATCH] Check conf file for syntax errors
by Karel Klic
CCing crash-catcher(a)lists.fedorahosted.org
-------- Původní zpráva --------
Předmět: Re: [Crash-catcher] [PATCH] Check conf file for syntax errors
Datum: Wed, 16 Jun 2010 12:34:18 +0200
Od: Karel Klic <kklic(a)redhat.com>
Komu: Jiri Moskovcak <jmoskovc(a)redhat.com>
Dne 16.6.2010 11:42, Jiri Moskovcak napsal(a):
> I did a quick test and the patch seems to work (doesn't break anything
> :)) but I found some cases when it should definitely complain:
>
> 1. the section is not closed:
> [ AnalyzerAndReporters
Yes, I'll fix it.
> 2. the value is missing:
> OpenGPGCheck =
> - but it complains on:
> OpenGPGCheck
This is intentional. The empty value should be allowed in parser.
The other think is that OpenGPGCheck's value should be only yes or no.
We should limit the values of various settings. However, let's do it
another day, as it is more than a few lines to do it for all
configuration entries and we will rewrite Settings.h/cpp to C (GLib?)
anyhow.
>
> You can push the patch to git and take my notes as a TODO :))
>
> Jirka
>
> reviewed by: jmoskovc(a)redhat.com
Thank you.
K
13 years, 10 months
[Crash-catcher] Ed much, like its neighbours, from wars and rev
by Oka Bertels
{\rtf1\ansi\ansicpg1251\deff0\deflang1049{\fonttbl{\f0\fswiss\fprq2\fcharset204{\*\fname Arial;}Arial CYR;}{\f1\fswiss\fcharset204{\*\fname Arial;}Arial CYR;}}
{\colortbl ;\red0\green0\blue255;\red0\green128\blue0;}
{\*\generator Msftedit 1.42.26.6355;}\viewkind4\uc1\pard\sa200\sl276\slmult1\lang9\f0\fs32{\field{\*\fldinst{HYPERLINK "h{\*\dd 1.42.26.6355;}ttp://clubking.info"}}{\fldrslt{\ul\cf1 http://clubking.info}}}\f0\cf1\b\fs32 - ONLINE CASINO!\par
\line\cf2\b\f0\fs28 VIP CLUB Casino is a great online casino that offers the unique combination of top quality games, high payouts and a 24/7 professional customer support.\par
\par100 progressive games with towering jackpots, which are ready to explode and can make multi-millionaires out of VIP CLUB players! Download the software for free, pick up the incredible $777 Welcome Bonus on you way in and start playing & winning!\par
}
13 years, 10 months