xref: /aosp_15_r20/frameworks/base/cmds/incidentd/src/Section.h (revision d57664e9bc4670b3ecf6748a746a57c557b6bc9e)
1*d57664e9SAndroid Build Coastguard Worker /*
2*d57664e9SAndroid Build Coastguard Worker  * Copyright (C) 2016 The Android Open Source Project
3*d57664e9SAndroid Build Coastguard Worker  *
4*d57664e9SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*d57664e9SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*d57664e9SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*d57664e9SAndroid Build Coastguard Worker  *
8*d57664e9SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*d57664e9SAndroid Build Coastguard Worker  *
10*d57664e9SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*d57664e9SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*d57664e9SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*d57664e9SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*d57664e9SAndroid Build Coastguard Worker  * limitations under the License.
15*d57664e9SAndroid Build Coastguard Worker  */
16*d57664e9SAndroid Build Coastguard Worker #pragma once
17*d57664e9SAndroid Build Coastguard Worker 
18*d57664e9SAndroid Build Coastguard Worker #ifndef SECTIONS_H
19*d57664e9SAndroid Build Coastguard Worker #define SECTIONS_H
20*d57664e9SAndroid Build Coastguard Worker 
21*d57664e9SAndroid Build Coastguard Worker #include "Reporter.h"
22*d57664e9SAndroid Build Coastguard Worker 
23*d57664e9SAndroid Build Coastguard Worker #include <stdarg.h>
24*d57664e9SAndroid Build Coastguard Worker #include <map>
25*d57664e9SAndroid Build Coastguard Worker 
26*d57664e9SAndroid Build Coastguard Worker #include <android/os/IIncidentDumpCallback.h>
27*d57664e9SAndroid Build Coastguard Worker #include <log/log_read.h>
28*d57664e9SAndroid Build Coastguard Worker #include <utils/String16.h>
29*d57664e9SAndroid Build Coastguard Worker #include <utils/String8.h>
30*d57664e9SAndroid Build Coastguard Worker #include <utils/Vector.h>
31*d57664e9SAndroid Build Coastguard Worker 
32*d57664e9SAndroid Build Coastguard Worker namespace android {
33*d57664e9SAndroid Build Coastguard Worker namespace os {
34*d57664e9SAndroid Build Coastguard Worker namespace incidentd {
35*d57664e9SAndroid Build Coastguard Worker 
36*d57664e9SAndroid Build Coastguard Worker const int64_t REMOTE_CALL_TIMEOUT_MS = 30 * 1000;  // 30 seconds
37*d57664e9SAndroid Build Coastguard Worker 
38*d57664e9SAndroid Build Coastguard Worker /**
39*d57664e9SAndroid Build Coastguard Worker  * Base class for sections
40*d57664e9SAndroid Build Coastguard Worker  */
41*d57664e9SAndroid Build Coastguard Worker class Section {
42*d57664e9SAndroid Build Coastguard Worker public:
43*d57664e9SAndroid Build Coastguard Worker     const int id;
44*d57664e9SAndroid Build Coastguard Worker     const int64_t timeoutMs;  // each section must have a timeout
45*d57664e9SAndroid Build Coastguard Worker     String8 name;
46*d57664e9SAndroid Build Coastguard Worker 
47*d57664e9SAndroid Build Coastguard Worker     Section(int id, int64_t timeoutMs = REMOTE_CALL_TIMEOUT_MS);
48*d57664e9SAndroid Build Coastguard Worker     virtual ~Section();
49*d57664e9SAndroid Build Coastguard Worker 
50*d57664e9SAndroid Build Coastguard Worker     virtual status_t Execute(ReportWriter* writer) const = 0;
51*d57664e9SAndroid Build Coastguard Worker };
52*d57664e9SAndroid Build Coastguard Worker 
53*d57664e9SAndroid Build Coastguard Worker /**
54*d57664e9SAndroid Build Coastguard Worker  * Section that reads in a file.
55*d57664e9SAndroid Build Coastguard Worker  */
56*d57664e9SAndroid Build Coastguard Worker class FileSection : public Section {
57*d57664e9SAndroid Build Coastguard Worker public:
58*d57664e9SAndroid Build Coastguard Worker     FileSection(int id, const char* filename,
59*d57664e9SAndroid Build Coastguard Worker                 int64_t timeoutMs = 5000 /* 5 seconds */);
60*d57664e9SAndroid Build Coastguard Worker     virtual ~FileSection();
61*d57664e9SAndroid Build Coastguard Worker 
62*d57664e9SAndroid Build Coastguard Worker     virtual status_t Execute(ReportWriter* writer) const;
63*d57664e9SAndroid Build Coastguard Worker 
64*d57664e9SAndroid Build Coastguard Worker private:
65*d57664e9SAndroid Build Coastguard Worker     const char* mFilename;
66*d57664e9SAndroid Build Coastguard Worker     bool mIsSysfs;  // sysfs files are pollable but return POLLERR by default, handle it separately
67*d57664e9SAndroid Build Coastguard Worker };
68*d57664e9SAndroid Build Coastguard Worker 
69*d57664e9SAndroid Build Coastguard Worker /**
70*d57664e9SAndroid Build Coastguard Worker  * Section that reads in a file and gzips the content.
71*d57664e9SAndroid Build Coastguard Worker  */
72*d57664e9SAndroid Build Coastguard Worker class GZipSection : public Section {
73*d57664e9SAndroid Build Coastguard Worker public:
74*d57664e9SAndroid Build Coastguard Worker     GZipSection(int id, const char* filename, ...);
75*d57664e9SAndroid Build Coastguard Worker     virtual ~GZipSection();
76*d57664e9SAndroid Build Coastguard Worker 
77*d57664e9SAndroid Build Coastguard Worker     virtual status_t Execute(ReportWriter* writer) const;
78*d57664e9SAndroid Build Coastguard Worker 
79*d57664e9SAndroid Build Coastguard Worker private:
80*d57664e9SAndroid Build Coastguard Worker     // It looks up the content from multiple files and stops when the first one is available.
81*d57664e9SAndroid Build Coastguard Worker     const char** mFilenames;
82*d57664e9SAndroid Build Coastguard Worker };
83*d57664e9SAndroid Build Coastguard Worker 
84*d57664e9SAndroid Build Coastguard Worker /**
85*d57664e9SAndroid Build Coastguard Worker  * Base class for sections that call a command that might need a timeout.
86*d57664e9SAndroid Build Coastguard Worker  */
87*d57664e9SAndroid Build Coastguard Worker class WorkerThreadSection : public Section {
88*d57664e9SAndroid Build Coastguard Worker public:
89*d57664e9SAndroid Build Coastguard Worker     WorkerThreadSection(int id, int64_t timeoutMs = REMOTE_CALL_TIMEOUT_MS);
90*d57664e9SAndroid Build Coastguard Worker     virtual ~WorkerThreadSection();
91*d57664e9SAndroid Build Coastguard Worker 
92*d57664e9SAndroid Build Coastguard Worker     virtual status_t Execute(ReportWriter* writer) const;
93*d57664e9SAndroid Build Coastguard Worker 
94*d57664e9SAndroid Build Coastguard Worker     virtual status_t BlockingCall(unique_fd& pipeWriteFd) const = 0;
95*d57664e9SAndroid Build Coastguard Worker };
96*d57664e9SAndroid Build Coastguard Worker 
97*d57664e9SAndroid Build Coastguard Worker /**
98*d57664e9SAndroid Build Coastguard Worker  * Section that forks and execs a command, and puts stdout as the section.
99*d57664e9SAndroid Build Coastguard Worker  */
100*d57664e9SAndroid Build Coastguard Worker class CommandSection : public Section {
101*d57664e9SAndroid Build Coastguard Worker public:
102*d57664e9SAndroid Build Coastguard Worker     CommandSection(int id, int64_t timeoutMs, const char* command, ...);
103*d57664e9SAndroid Build Coastguard Worker 
104*d57664e9SAndroid Build Coastguard Worker     CommandSection(int id, const char* command, ...);
105*d57664e9SAndroid Build Coastguard Worker 
106*d57664e9SAndroid Build Coastguard Worker     virtual ~CommandSection();
107*d57664e9SAndroid Build Coastguard Worker 
108*d57664e9SAndroid Build Coastguard Worker     virtual status_t Execute(ReportWriter* writer) const;
109*d57664e9SAndroid Build Coastguard Worker 
110*d57664e9SAndroid Build Coastguard Worker private:
111*d57664e9SAndroid Build Coastguard Worker     const char** mCommand;
112*d57664e9SAndroid Build Coastguard Worker };
113*d57664e9SAndroid Build Coastguard Worker 
114*d57664e9SAndroid Build Coastguard Worker /**
115*d57664e9SAndroid Build Coastguard Worker  * Section that calls protobuf dumpsys on a system service, usually
116*d57664e9SAndroid Build Coastguard Worker  * "dumpsys [service_name] --proto".
117*d57664e9SAndroid Build Coastguard Worker  */
118*d57664e9SAndroid Build Coastguard Worker class DumpsysSection : public WorkerThreadSection {
119*d57664e9SAndroid Build Coastguard Worker public:
120*d57664e9SAndroid Build Coastguard Worker     DumpsysSection(int id, const char* service, ...);
121*d57664e9SAndroid Build Coastguard Worker     virtual ~DumpsysSection();
122*d57664e9SAndroid Build Coastguard Worker 
123*d57664e9SAndroid Build Coastguard Worker     virtual status_t BlockingCall(unique_fd& pipeWriteFd) const;
124*d57664e9SAndroid Build Coastguard Worker 
125*d57664e9SAndroid Build Coastguard Worker private:
126*d57664e9SAndroid Build Coastguard Worker     String16 mService;
127*d57664e9SAndroid Build Coastguard Worker     Vector<String16> mArgs;
128*d57664e9SAndroid Build Coastguard Worker };
129*d57664e9SAndroid Build Coastguard Worker 
130*d57664e9SAndroid Build Coastguard Worker /**
131*d57664e9SAndroid Build Coastguard Worker  * Section that calls text dumpsys on a system service, usually "dumpsys [service_name]".
132*d57664e9SAndroid Build Coastguard Worker  */
133*d57664e9SAndroid Build Coastguard Worker class TextDumpsysSection : public Section {
134*d57664e9SAndroid Build Coastguard Worker public:
135*d57664e9SAndroid Build Coastguard Worker     TextDumpsysSection(int id, const char* service, ...);
136*d57664e9SAndroid Build Coastguard Worker     virtual ~TextDumpsysSection();
137*d57664e9SAndroid Build Coastguard Worker 
138*d57664e9SAndroid Build Coastguard Worker     virtual status_t Execute(ReportWriter* writer) const;
139*d57664e9SAndroid Build Coastguard Worker 
140*d57664e9SAndroid Build Coastguard Worker private:
141*d57664e9SAndroid Build Coastguard Worker     String16 mService;
142*d57664e9SAndroid Build Coastguard Worker     Vector<String16> mArgs;
143*d57664e9SAndroid Build Coastguard Worker };
144*d57664e9SAndroid Build Coastguard Worker 
145*d57664e9SAndroid Build Coastguard Worker /**
146*d57664e9SAndroid Build Coastguard Worker  * Section that calls dumpsys on a system service.
147*d57664e9SAndroid Build Coastguard Worker  */
148*d57664e9SAndroid Build Coastguard Worker class SystemPropertyDumpsysSection : public WorkerThreadSection {
149*d57664e9SAndroid Build Coastguard Worker public:
150*d57664e9SAndroid Build Coastguard Worker     SystemPropertyDumpsysSection(int id, const char* service, ...);
151*d57664e9SAndroid Build Coastguard Worker     virtual ~SystemPropertyDumpsysSection();
152*d57664e9SAndroid Build Coastguard Worker 
153*d57664e9SAndroid Build Coastguard Worker     virtual status_t BlockingCall(unique_fd& pipeWriteFd) const;
154*d57664e9SAndroid Build Coastguard Worker 
155*d57664e9SAndroid Build Coastguard Worker private:
156*d57664e9SAndroid Build Coastguard Worker     String16 mService;
157*d57664e9SAndroid Build Coastguard Worker     Vector<String16> mArgs;
158*d57664e9SAndroid Build Coastguard Worker };
159*d57664e9SAndroid Build Coastguard Worker 
160*d57664e9SAndroid Build Coastguard Worker /**
161*d57664e9SAndroid Build Coastguard Worker  * Section that reads from logd.
162*d57664e9SAndroid Build Coastguard Worker  */
163*d57664e9SAndroid Build Coastguard Worker class LogSection : public WorkerThreadSection {
164*d57664e9SAndroid Build Coastguard Worker     // global last log retrieved timestamp for each log_id_t.
165*d57664e9SAndroid Build Coastguard Worker     static map<log_id_t, log_time> gLastLogsRetrieved;
166*d57664e9SAndroid Build Coastguard Worker 
167*d57664e9SAndroid Build Coastguard Worker     // log mode: non blocking.
168*d57664e9SAndroid Build Coastguard Worker     const static int logModeBase = ANDROID_LOG_NONBLOCK;
169*d57664e9SAndroid Build Coastguard Worker 
170*d57664e9SAndroid Build Coastguard Worker public:
171*d57664e9SAndroid Build Coastguard Worker     LogSection(int id, const char* logID, ...);
172*d57664e9SAndroid Build Coastguard Worker     virtual ~LogSection();
173*d57664e9SAndroid Build Coastguard Worker 
174*d57664e9SAndroid Build Coastguard Worker     virtual status_t BlockingCall(unique_fd& pipeWriteFd) const;
175*d57664e9SAndroid Build Coastguard Worker 
176*d57664e9SAndroid Build Coastguard Worker private:
177*d57664e9SAndroid Build Coastguard Worker     log_id_t mLogID;
178*d57664e9SAndroid Build Coastguard Worker     bool mBinary;
179*d57664e9SAndroid Build Coastguard Worker     int mLogMode;
180*d57664e9SAndroid Build Coastguard Worker };
181*d57664e9SAndroid Build Coastguard Worker 
182*d57664e9SAndroid Build Coastguard Worker /**
183*d57664e9SAndroid Build Coastguard Worker  * Section that gets data from tombstoned.
184*d57664e9SAndroid Build Coastguard Worker  */
185*d57664e9SAndroid Build Coastguard Worker class TombstoneSection : public WorkerThreadSection {
186*d57664e9SAndroid Build Coastguard Worker public:
187*d57664e9SAndroid Build Coastguard Worker     TombstoneSection(int id, const char* type, int64_t timeoutMs = 120000 /* 2 minutes */);
188*d57664e9SAndroid Build Coastguard Worker     virtual ~TombstoneSection();
189*d57664e9SAndroid Build Coastguard Worker 
190*d57664e9SAndroid Build Coastguard Worker     virtual status_t BlockingCall(unique_fd& pipeWriteFd) const;
191*d57664e9SAndroid Build Coastguard Worker 
192*d57664e9SAndroid Build Coastguard Worker private:
193*d57664e9SAndroid Build Coastguard Worker     std::string mType;
194*d57664e9SAndroid Build Coastguard Worker };
195*d57664e9SAndroid Build Coastguard Worker 
196*d57664e9SAndroid Build Coastguard Worker /**
197*d57664e9SAndroid Build Coastguard Worker  * Section that gets data from a registered dump callback.
198*d57664e9SAndroid Build Coastguard Worker  */
199*d57664e9SAndroid Build Coastguard Worker class BringYourOwnSection : public WorkerThreadSection {
200*d57664e9SAndroid Build Coastguard Worker public:
201*d57664e9SAndroid Build Coastguard Worker     const uid_t uid;
202*d57664e9SAndroid Build Coastguard Worker 
203*d57664e9SAndroid Build Coastguard Worker     BringYourOwnSection(int id, const char* customName, const uid_t callingUid,
204*d57664e9SAndroid Build Coastguard Worker         const sp<IIncidentDumpCallback>& callback);
205*d57664e9SAndroid Build Coastguard Worker     virtual ~BringYourOwnSection();
206*d57664e9SAndroid Build Coastguard Worker 
207*d57664e9SAndroid Build Coastguard Worker     virtual status_t BlockingCall(unique_fd& pipeWriteFd) const;
208*d57664e9SAndroid Build Coastguard Worker 
209*d57664e9SAndroid Build Coastguard Worker private:
210*d57664e9SAndroid Build Coastguard Worker     const sp<IIncidentDumpCallback> mCallback;
211*d57664e9SAndroid Build Coastguard Worker };
212*d57664e9SAndroid Build Coastguard Worker 
213*d57664e9SAndroid Build Coastguard Worker 
214*d57664e9SAndroid Build Coastguard Worker /**
215*d57664e9SAndroid Build Coastguard Worker  * These sections will not be generated when doing an 'all' report, either
216*d57664e9SAndroid Build Coastguard Worker  * for size, speed of collection, or privacy.
217*d57664e9SAndroid Build Coastguard Worker  */
218*d57664e9SAndroid Build Coastguard Worker bool section_requires_specific_mention(int sectionId);
219*d57664e9SAndroid Build Coastguard Worker 
220*d57664e9SAndroid Build Coastguard Worker }  // namespace incidentd
221*d57664e9SAndroid Build Coastguard Worker }  // namespace os
222*d57664e9SAndroid Build Coastguard Worker }  // namespace android
223*d57664e9SAndroid Build Coastguard Worker 
224*d57664e9SAndroid Build Coastguard Worker #endif  // SECTIONS_H
225