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