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