1 /* $Id:
2 * ===========================================================================
3 *
4 * PUBLIC DOMAIN NOTICE
5 * National Center for Biotechnology Information
6 *
7 * This software/database is a "United States Government Work" under the
8 * terms of the United States Copyright Act. It was written as part of
9 * the author's official duties as a United States Government employee and
10 * thus cannot be copyrighted. This software/database is freely available
11 * to the public for use. The National Library of Medicine and the U.S.
12 * Government have not placed any restriction on its use or reproduction.
13 *
14 * Although all reasonable efforts have been taken to ensure the accuracy
15 * and reliability of the software and data, the NLM and the U.S.
16 * Government do not and cannot warrant the performance or results that
17 * may be obtained by using this software or data. The NLM and the U.S.
18 * Government disclaim all warranties, express or implied, including
19 * warranties of performance, merchantability or fitness for any particular
20 * purpose.
21 *
22 * Please cite the author in any work or product based on this material.
23 *
24 * ===========================================================================
25 *
26 * Authors: Amelia Fong
27 *
28 */
29
30 /** @file blast_usage_report.cpp
31 * BLAST usage report api
32 */
33
34 #include <ncbi_pch.hpp>
35 #include <algo/blast/api/blast_usage_report.hpp>
36 #include <corelib/ncbifile.hpp>
37
38 #ifndef SKIP_DOXYGEN_PROCESSING
39 USING_NCBI_SCOPE;
40 USING_SCOPE(blast);
41 #endif
42
43 static const string kNcbiAppName="standalone-blast";
44 static const string kIdFile="/sys/class/dmi/id/sys_vendor";
45
x_CheckRunEnv()46 void CBlastUsageReport::x_CheckRunEnv()
47 {
48 char * blast_docker = getenv("BLAST_DOCKER");
49 if(blast_docker != NULL){
50 AddParam(eDocker, true);
51 }
52
53 CFile id_file(kIdFile);
54 if(id_file.Exists()){
55 CNcbiIfstream s(id_file.GetPath().c_str(), IOS_BASE::in);
56 string line;
57 NcbiGetlineEOL(s, line);
58 NStr::ToUpper(line);
59 if (line.find("GOOGLE") != NPOS) {
60 AddParam(eGCP, true);
61 }
62 else if (line.find("AMAZON")!= NPOS){
63 AddParam(eAWS, true);
64 }
65 }
66
67 char* elb_job_id = getenv("BLAST_ELB_JOB_ID");
68 if(elb_job_id != NULL){
69 string j_id(elb_job_id);
70 AddParam(eELBJobId, j_id);
71 }
72 char* elb_batch_num = getenv("BLAST_ELB_BATCH_NUM");
73 if(elb_batch_num != NULL){
74 int bn = NStr::StringToInt(CTempString(elb_batch_num), NStr::fConvErr_NoThrow);
75 AddParam(eELBBatchNum, bn);
76 }
77 }
78
CBlastUsageReport()79 CBlastUsageReport::CBlastUsageReport()
80 {
81 x_CheckBlastUsageEnv();
82 AddParam(eApp, kNcbiAppName);
83 x_CheckRunEnv();
84 }
85
~CBlastUsageReport()86 CBlastUsageReport::~CBlastUsageReport()
87 {
88 if (IsEnabled()) {
89 Send(m_Params);
90 Wait();
91 Finish();
92 }
93 }
94
x_EUsageParmsToString(EUsageParams p)95 string CBlastUsageReport::x_EUsageParmsToString(EUsageParams p)
96 {
97 string retval;
98 switch (p) {
99 case eApp: retval.assign("ncbi_app"); break;
100 case eVersion: retval.assign("version"); break;
101 case eProgram: retval.assign("program"); break;
102 case eTask: retval.assign("task"); break;
103 case eExitStatus: retval.assign("exit_status"); break;
104 case eRunTime: retval.assign("run_time"); break;
105 case eDBName: retval.assign("db_name"); break;
106 case eDBLength: retval.assign("db_length"); break;
107 case eDBNumSeqs: retval.assign("db_num_seqs"); break;
108 case eDBDate: retval.assign("db_date"); break;
109 case eBl2seq: retval.assign("bl2seq"); break;
110 case eNumSubjects: retval.assign("num_subjects"); break;
111 case eSubjectsLength: retval.assign("subjects_length"); break;
112 case eNumQueries: retval.assign("num_queries"); break;
113 case eTotalQueryLength: retval.assign("queries_length"); break;
114 case eEvalueThreshold: retval.assign("evalue_threshold"); break;
115 case eNumThreads: retval.assign("num_threads"); break;
116 case eHitListSize: retval.assign("hitlist_size"); break;
117 case eOutputFmt: retval.assign("output_fmt"); break;
118 case eTaxIdList: retval.assign("taxidlist"); break;
119 case eNegTaxIdList: retval.assign("negative_taxidlist"); break;
120 case eGIList: retval.assign("gilist"); break;
121 case eNegGIList: retval.assign("negative_gilist"); break;
122 case eSeqIdList: retval.assign("seqidlist"); break;
123 case eNegSeqIdList: retval.assign("negative_seqidlist"); break;
124 case eIPGList: retval.assign("ipglist"); break;
125 case eNegIPGList: retval.assign("negative_ipglist"); break;
126 case eMaskAlgo: retval.assign("mask_algo"); break;
127 case eCompBasedStats: retval.assign("comp_based_stats"); break;
128 case eRange: retval.assign("range"); break;
129 case eMTMode: retval.assign("mt_mode"); break;
130 case eNumQueryBatches: retval.assign("num_query_batches"); break;
131 case eNumErrStatus: retval.assign("num_error_status"); break;
132 case ePSSMInput: retval.assign("pssm_input"); break;
133 case eConverged: retval.assign("converged"); break;
134 case eArchiveInput: retval.assign("archive"); break;
135 case eRIDInput: retval.assign("rid"); break;
136 case eDBInfo: retval.assign("db_info"); break;
137 case eDBTaxInfo: retval.assign("db_tax_info"); break;
138 case eDBEntry: retval.assign("db_entry"); break;
139 case eDBDumpAll: retval.assign("db_entry_all"); break;
140 case eDBType: retval.assign("db_type"); break;
141 case eInputType: retval.assign("input_type"); break;
142 case eParseSeqIDs: retval.assign("parse_seqids"); break;
143 case eSeqType: retval.assign("seq_type"); break;
144 case eDBTest: retval.assign("db_test"); break;
145 case eDBAliasMode: retval.assign("db_alias_mode"); break;
146 case eDocker: retval.assign("docker"); break;
147 case eGCP: retval.assign("gcp"); break;
148 case eAWS: retval.assign("aws"); break;
149 case eELBJobId: retval.assign("elb_job_id"); break;
150 case eELBBatchNum: retval.assign("elb_batch_num"); break;
151 case eSRA: retval.assign("sra"); break;
152 default:
153 LOG_POST(Warning <<"Invalid usage params: " << (int)p);
154 abort();
155 break;
156 }
157 return retval;
158 }
159
AddParam(EUsageParams p,int val)160 void CBlastUsageReport::AddParam(EUsageParams p, int val)
161 {
162 if (IsEnabled()){
163 string t = x_EUsageParmsToString(p);
164 m_Params.Add(t, NStr::IntToString(val));
165 }
166 }
167
AddParam(EUsageParams p,const string & val)168 void CBlastUsageReport::AddParam(EUsageParams p, const string & val)
169 {
170 if (IsEnabled()) {
171 string t = x_EUsageParmsToString(p);
172 m_Params.Add(t, val);
173 }
174 }
175
AddParam(EUsageParams p,const double & val)176 void CBlastUsageReport::AddParam(EUsageParams p, const double & val)
177 {
178 if (IsEnabled()) {
179 string t = x_EUsageParmsToString(p);
180 m_Params.Add(t, val);
181 }
182 }
183
x_CheckBlastUsageEnv()184 void CBlastUsageReport::x_CheckBlastUsageEnv()
185 {
186 char * blast_usage_env = getenv("BLAST_USAGE_REPORT");
187 if(blast_usage_env != NULL){
188 bool enable = NStr::StringToBool(blast_usage_env);
189 if (!enable) {
190 SetEnabled(false);
191 CUsageReportAPI::SetEnabled(false);
192 LOG_POST(Info <<"Phone home disabled");
193 return ;
194 }
195 }
196
197 CNcbiIstrstream empty_stream(kEmptyCStr);
198 CRef<CNcbiRegistry> registry(new CNcbiRegistry(empty_stream, IRegistry::fWithNcbirc));
199 if (registry->HasEntry("BLAST", "BLAST_USAGE_REPORT")) {
200 bool enable = NStr::StringToBool(registry->Get("BLAST", "BLAST_USAGE_REPORT"));
201 if (!enable) {
202 SetEnabled(false);
203 CUsageReportAPI::SetEnabled(false);
204 LOG_POST(Info <<"Phone home disabled by config setting");
205 return ;
206 }
207 }
208 CUsageReportAPI::SetEnabled(true);
209 SetEnabled(true);
210 LOG_POST(Info <<"Phone home enabled");
211 }
212
AddParam(EUsageParams p,Int8 val)213 void CBlastUsageReport::AddParam(EUsageParams p, Int8 val)
214 {
215 if (IsEnabled()) {
216 string t = x_EUsageParmsToString(p);
217 m_Params.Add(t, val);
218 }
219
220 }
221
AddParam(EUsageParams p,bool val)222 void CBlastUsageReport::AddParam(EUsageParams p, bool val)
223 {
224 if (IsEnabled()) {
225 string t = x_EUsageParmsToString(p);
226 m_Params.Add(t, val);
227 }
228
229 }
230