1bac3299720623f4226bca103b26260052732ad30Tom Cherry/* 2bac3299720623f4226bca103b26260052732ad30Tom Cherry * Copyright (C) 2015 The Android Open Source Project 3bac3299720623f4226bca103b26260052732ad30Tom Cherry * 4bac3299720623f4226bca103b26260052732ad30Tom Cherry * Licensed under the Apache License, Version 2.0 (the "License"); 5bac3299720623f4226bca103b26260052732ad30Tom Cherry * you may not use this file except in compliance with the License. 6bac3299720623f4226bca103b26260052732ad30Tom Cherry * You may obtain a copy of the License at 7bac3299720623f4226bca103b26260052732ad30Tom Cherry * 8bac3299720623f4226bca103b26260052732ad30Tom Cherry * http://www.apache.org/licenses/LICENSE-2.0 9bac3299720623f4226bca103b26260052732ad30Tom Cherry * 10bac3299720623f4226bca103b26260052732ad30Tom Cherry * Unless required by applicable law or agreed to in writing, software 11bac3299720623f4226bca103b26260052732ad30Tom Cherry * distributed under the License is distributed on an "AS IS" BASIS, 12bac3299720623f4226bca103b26260052732ad30Tom Cherry * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13bac3299720623f4226bca103b26260052732ad30Tom Cherry * See the License for the specific language governing permissions and 14bac3299720623f4226bca103b26260052732ad30Tom Cherry * limitations under the License. 15bac3299720623f4226bca103b26260052732ad30Tom Cherry */ 16bac3299720623f4226bca103b26260052732ad30Tom Cherry 17bac3299720623f4226bca103b26260052732ad30Tom Cherry#ifndef _INIT_SERVICE_H 18bac3299720623f4226bca103b26260052732ad30Tom Cherry#define _INIT_SERVICE_H 19bac3299720623f4226bca103b26260052732ad30Tom Cherry 20bac3299720623f4226bca103b26260052732ad30Tom Cherry#include <sys/types.h> 21bac3299720623f4226bca103b26260052732ad30Tom Cherry 22bac3299720623f4226bca103b26260052732ad30Tom Cherry#include <cutils/iosched_policy.h> 23bac3299720623f4226bca103b26260052732ad30Tom Cherry 24bac3299720623f4226bca103b26260052732ad30Tom Cherry#include <memory> 25bac3299720623f4226bca103b26260052732ad30Tom Cherry#include <string> 26bac3299720623f4226bca103b26260052732ad30Tom Cherry#include <vector> 27bac3299720623f4226bca103b26260052732ad30Tom Cherry 28bac3299720623f4226bca103b26260052732ad30Tom Cherry#include "action.h" 29b7349902a945903f9e36a569051f5131beb0bc24Tom Cherry#include "init_parser.h" 30b7349902a945903f9e36a569051f5131beb0bc24Tom Cherry#include "keyword_map.h" 31bac3299720623f4226bca103b26260052732ad30Tom Cherry 32bac3299720623f4226bca103b26260052732ad30Tom Cherry#define SVC_DISABLED 0x001 // do not autostart with class 33bac3299720623f4226bca103b26260052732ad30Tom Cherry#define SVC_ONESHOT 0x002 // do not restart on exit 34bac3299720623f4226bca103b26260052732ad30Tom Cherry#define SVC_RUNNING 0x004 // currently active 35bac3299720623f4226bca103b26260052732ad30Tom Cherry#define SVC_RESTARTING 0x008 // waiting to restart 36bac3299720623f4226bca103b26260052732ad30Tom Cherry#define SVC_CONSOLE 0x010 // requires console 37bac3299720623f4226bca103b26260052732ad30Tom Cherry#define SVC_CRITICAL 0x020 // will reboot into recovery if keeps crashing 38bac3299720623f4226bca103b26260052732ad30Tom Cherry#define SVC_RESET 0x040 // Use when stopping a process, 39bac3299720623f4226bca103b26260052732ad30Tom Cherry // but not disabling so it can be restarted with its class. 40bac3299720623f4226bca103b26260052732ad30Tom Cherry#define SVC_RC_DISABLED 0x080 // Remember if the disabled flag was set in the rc script. 41bac3299720623f4226bca103b26260052732ad30Tom Cherry#define SVC_RESTART 0x100 // Use to safely restart (stop, wait, start) a service. 42bac3299720623f4226bca103b26260052732ad30Tom Cherry#define SVC_DISABLED_START 0x200 // A start was requested but it was disabled at the time. 43bac3299720623f4226bca103b26260052732ad30Tom Cherry#define SVC_EXEC 0x400 // This synthetic service corresponds to an 'exec'. 44bac3299720623f4226bca103b26260052732ad30Tom Cherry 45bac3299720623f4226bca103b26260052732ad30Tom Cherry#define NR_SVC_SUPP_GIDS 12 // twelve supplementary groups 46bac3299720623f4226bca103b26260052732ad30Tom Cherry 47bac3299720623f4226bca103b26260052732ad30Tom Cherryclass Action; 48bac3299720623f4226bca103b26260052732ad30Tom Cherryclass ServiceManager; 49bac3299720623f4226bca103b26260052732ad30Tom Cherry 50bac3299720623f4226bca103b26260052732ad30Tom Cherrystruct SocketInfo { 51bac3299720623f4226bca103b26260052732ad30Tom Cherry SocketInfo(); 52bac3299720623f4226bca103b26260052732ad30Tom Cherry SocketInfo(const std::string& name, const std::string& type, uid_t uid, 53bac3299720623f4226bca103b26260052732ad30Tom Cherry gid_t gid, int perm, const std::string& socketcon); 54bac3299720623f4226bca103b26260052732ad30Tom Cherry std::string name; 55bac3299720623f4226bca103b26260052732ad30Tom Cherry std::string type; 56bac3299720623f4226bca103b26260052732ad30Tom Cherry uid_t uid; 57bac3299720623f4226bca103b26260052732ad30Tom Cherry gid_t gid; 58bac3299720623f4226bca103b26260052732ad30Tom Cherry int perm; 59bac3299720623f4226bca103b26260052732ad30Tom Cherry std::string socketcon; 60bac3299720623f4226bca103b26260052732ad30Tom Cherry}; 61bac3299720623f4226bca103b26260052732ad30Tom Cherry 62bac3299720623f4226bca103b26260052732ad30Tom Cherrystruct ServiceEnvironmentInfo { 63bac3299720623f4226bca103b26260052732ad30Tom Cherry ServiceEnvironmentInfo(); 64bac3299720623f4226bca103b26260052732ad30Tom Cherry ServiceEnvironmentInfo(const std::string& name, const std::string& value); 65bac3299720623f4226bca103b26260052732ad30Tom Cherry std::string name; 66bac3299720623f4226bca103b26260052732ad30Tom Cherry std::string value; 67bac3299720623f4226bca103b26260052732ad30Tom Cherry}; 68bac3299720623f4226bca103b26260052732ad30Tom Cherry 69bac3299720623f4226bca103b26260052732ad30Tom Cherryclass Service { 70bac3299720623f4226bca103b26260052732ad30Tom Cherrypublic: 71bac3299720623f4226bca103b26260052732ad30Tom Cherry Service(const std::string& name, const std::string& classname, 72bac3299720623f4226bca103b26260052732ad30Tom Cherry const std::vector<std::string>& args); 73bac3299720623f4226bca103b26260052732ad30Tom Cherry 74bac3299720623f4226bca103b26260052732ad30Tom Cherry Service(const std::string& name, const std::string& classname, 75bac3299720623f4226bca103b26260052732ad30Tom Cherry unsigned flags, uid_t uid, gid_t gid, const std::vector<gid_t>& supp_gids, 76bac3299720623f4226bca103b26260052732ad30Tom Cherry const std::string& seclabel, const std::vector<std::string>& args); 77bac3299720623f4226bca103b26260052732ad30Tom Cherry 78b7349902a945903f9e36a569051f5131beb0bc24Tom Cherry bool HandleLine(const std::vector<std::string>& args, std::string* err); 79bac3299720623f4226bca103b26260052732ad30Tom Cherry bool Start(); 80bac3299720623f4226bca103b26260052732ad30Tom Cherry bool StartIfNotDisabled(); 81bac3299720623f4226bca103b26260052732ad30Tom Cherry bool Enable(); 82bac3299720623f4226bca103b26260052732ad30Tom Cherry void Reset(); 83bac3299720623f4226bca103b26260052732ad30Tom Cherry void Stop(); 84b7e03e82b89a30b09fea88eaf2a5638df1017cf6Bertrand SIMONNET void Terminate(); 85bac3299720623f4226bca103b26260052732ad30Tom Cherry void Restart(); 86bac3299720623f4226bca103b26260052732ad30Tom Cherry void RestartIfNeeded(time_t& process_needs_restart); 87bac3299720623f4226bca103b26260052732ad30Tom Cherry bool Reap(); 88bac3299720623f4226bca103b26260052732ad30Tom Cherry void DumpState() const; 89bac3299720623f4226bca103b26260052732ad30Tom Cherry 90bac3299720623f4226bca103b26260052732ad30Tom Cherry const std::string& name() const { return name_; } 91bac3299720623f4226bca103b26260052732ad30Tom Cherry const std::string& classname() const { return classname_; } 92bac3299720623f4226bca103b26260052732ad30Tom Cherry unsigned flags() const { return flags_; } 93bac3299720623f4226bca103b26260052732ad30Tom Cherry pid_t pid() const { return pid_; } 94bac3299720623f4226bca103b26260052732ad30Tom Cherry uid_t uid() const { return uid_; } 95bac3299720623f4226bca103b26260052732ad30Tom Cherry gid_t gid() const { return gid_; } 96bac3299720623f4226bca103b26260052732ad30Tom Cherry const std::vector<gid_t>& supp_gids() const { return supp_gids_; } 97bac3299720623f4226bca103b26260052732ad30Tom Cherry const std::string& seclabel() const { return seclabel_; } 98bac3299720623f4226bca103b26260052732ad30Tom Cherry const std::vector<int>& keycodes() const { return keycodes_; } 99bac3299720623f4226bca103b26260052732ad30Tom Cherry int keychord_id() const { return keychord_id_; } 100bac3299720623f4226bca103b26260052732ad30Tom Cherry void set_keychord_id(int keychord_id) { keychord_id_ = keychord_id; } 101bac3299720623f4226bca103b26260052732ad30Tom Cherry const std::vector<std::string>& args() const { return args_; } 102bac3299720623f4226bca103b26260052732ad30Tom Cherry 103bac3299720623f4226bca103b26260052732ad30Tom Cherryprivate: 104b7349902a945903f9e36a569051f5131beb0bc24Tom Cherry using OptionHandler = bool (Service::*) (const std::vector<std::string>& args, 105b7349902a945903f9e36a569051f5131beb0bc24Tom Cherry std::string* err); 106b7349902a945903f9e36a569051f5131beb0bc24Tom Cherry class OptionHandlerMap; 107b7349902a945903f9e36a569051f5131beb0bc24Tom Cherry 108bac3299720623f4226bca103b26260052732ad30Tom Cherry void NotifyStateChange(const std::string& new_state) const; 109bac3299720623f4226bca103b26260052732ad30Tom Cherry void StopOrReset(int how); 110bac3299720623f4226bca103b26260052732ad30Tom Cherry void ZapStdio() const; 111bac3299720623f4226bca103b26260052732ad30Tom Cherry void OpenConsole() const; 112bac3299720623f4226bca103b26260052732ad30Tom Cherry void PublishSocket(const std::string& name, int fd) const; 113bac3299720623f4226bca103b26260052732ad30Tom Cherry 114b7349902a945903f9e36a569051f5131beb0bc24Tom Cherry bool HandleClass(const std::vector<std::string>& args, std::string* err); 115b7349902a945903f9e36a569051f5131beb0bc24Tom Cherry bool HandleConsole(const std::vector<std::string>& args, std::string* err); 116b7349902a945903f9e36a569051f5131beb0bc24Tom Cherry bool HandleCritical(const std::vector<std::string>& args, std::string* err); 117b7349902a945903f9e36a569051f5131beb0bc24Tom Cherry bool HandleDisabled(const std::vector<std::string>& args, std::string* err); 118b7349902a945903f9e36a569051f5131beb0bc24Tom Cherry bool HandleGroup(const std::vector<std::string>& args, std::string* err); 119b7349902a945903f9e36a569051f5131beb0bc24Tom Cherry bool HandleIoprio(const std::vector<std::string>& args, std::string* err); 120b7349902a945903f9e36a569051f5131beb0bc24Tom Cherry bool HandleKeycodes(const std::vector<std::string>& args, std::string* err); 121b7349902a945903f9e36a569051f5131beb0bc24Tom Cherry bool HandleOneshot(const std::vector<std::string>& args, std::string* err); 122b7349902a945903f9e36a569051f5131beb0bc24Tom Cherry bool HandleOnrestart(const std::vector<std::string>& args, std::string* err); 123b7349902a945903f9e36a569051f5131beb0bc24Tom Cherry bool HandleSeclabel(const std::vector<std::string>& args, std::string* err); 124b7349902a945903f9e36a569051f5131beb0bc24Tom Cherry bool HandleSetenv(const std::vector<std::string>& args, std::string* err); 125b7349902a945903f9e36a569051f5131beb0bc24Tom Cherry bool HandleSocket(const std::vector<std::string>& args, std::string* err); 126b7349902a945903f9e36a569051f5131beb0bc24Tom Cherry bool HandleUser(const std::vector<std::string>& args, std::string* err); 127b7349902a945903f9e36a569051f5131beb0bc24Tom Cherry bool HandleWritepid(const std::vector<std::string>& args, std::string* err); 128b7349902a945903f9e36a569051f5131beb0bc24Tom Cherry 129bac3299720623f4226bca103b26260052732ad30Tom Cherry std::string name_; 130bac3299720623f4226bca103b26260052732ad30Tom Cherry std::string classname_; 131bac3299720623f4226bca103b26260052732ad30Tom Cherry 132bac3299720623f4226bca103b26260052732ad30Tom Cherry unsigned flags_; 133bac3299720623f4226bca103b26260052732ad30Tom Cherry pid_t pid_; 134bac3299720623f4226bca103b26260052732ad30Tom Cherry time_t time_started_; // time of last start 135bac3299720623f4226bca103b26260052732ad30Tom Cherry time_t time_crashed_; // first crash within inspection window 136bac3299720623f4226bca103b26260052732ad30Tom Cherry int nr_crashed_; // number of times crashed within window 137bac3299720623f4226bca103b26260052732ad30Tom Cherry 138bac3299720623f4226bca103b26260052732ad30Tom Cherry uid_t uid_; 139bac3299720623f4226bca103b26260052732ad30Tom Cherry gid_t gid_; 140bac3299720623f4226bca103b26260052732ad30Tom Cherry std::vector<gid_t> supp_gids_; 141bac3299720623f4226bca103b26260052732ad30Tom Cherry 142bac3299720623f4226bca103b26260052732ad30Tom Cherry std::string seclabel_; 143bac3299720623f4226bca103b26260052732ad30Tom Cherry 144bac3299720623f4226bca103b26260052732ad30Tom Cherry std::vector<SocketInfo> sockets_; 145bac3299720623f4226bca103b26260052732ad30Tom Cherry std::vector<ServiceEnvironmentInfo> envvars_; 146bac3299720623f4226bca103b26260052732ad30Tom Cherry 147bac3299720623f4226bca103b26260052732ad30Tom Cherry Action onrestart_; // Commands to execute on restart. 148bac3299720623f4226bca103b26260052732ad30Tom Cherry 149bac3299720623f4226bca103b26260052732ad30Tom Cherry std::vector<std::string> writepid_files_; 150bac3299720623f4226bca103b26260052732ad30Tom Cherry 151bac3299720623f4226bca103b26260052732ad30Tom Cherry // keycodes for triggering this service via /dev/keychord 152bac3299720623f4226bca103b26260052732ad30Tom Cherry std::vector<int> keycodes_; 153bac3299720623f4226bca103b26260052732ad30Tom Cherry int keychord_id_; 154bac3299720623f4226bca103b26260052732ad30Tom Cherry 155bac3299720623f4226bca103b26260052732ad30Tom Cherry IoSchedClass ioprio_class_; 156bac3299720623f4226bca103b26260052732ad30Tom Cherry int ioprio_pri_; 157bac3299720623f4226bca103b26260052732ad30Tom Cherry 158bac3299720623f4226bca103b26260052732ad30Tom Cherry std::vector<std::string> args_; 159bac3299720623f4226bca103b26260052732ad30Tom Cherry}; 160bac3299720623f4226bca103b26260052732ad30Tom Cherry 161bac3299720623f4226bca103b26260052732ad30Tom Cherryclass ServiceManager { 162bac3299720623f4226bca103b26260052732ad30Tom Cherrypublic: 163bac3299720623f4226bca103b26260052732ad30Tom Cherry static ServiceManager& GetInstance(); 164bac3299720623f4226bca103b26260052732ad30Tom Cherry 165b7349902a945903f9e36a569051f5131beb0bc24Tom Cherry void AddService(std::unique_ptr<Service> service); 166bac3299720623f4226bca103b26260052732ad30Tom Cherry Service* MakeExecOneshotService(const std::vector<std::string>& args); 167bac3299720623f4226bca103b26260052732ad30Tom Cherry Service* FindServiceByName(const std::string& name) const; 168bac3299720623f4226bca103b26260052732ad30Tom Cherry Service* FindServiceByPid(pid_t pid) const; 169bac3299720623f4226bca103b26260052732ad30Tom Cherry Service* FindServiceByKeychord(int keychord_id) const; 170b7e03e82b89a30b09fea88eaf2a5638df1017cf6Bertrand SIMONNET void ForEachService(std::function<void(Service*)> callback) const; 171bac3299720623f4226bca103b26260052732ad30Tom Cherry void ForEachServiceInClass(const std::string& classname, 172bac3299720623f4226bca103b26260052732ad30Tom Cherry void (*func)(Service* svc)) const; 173bac3299720623f4226bca103b26260052732ad30Tom Cherry void ForEachServiceWithFlags(unsigned matchflags, 174bac3299720623f4226bca103b26260052732ad30Tom Cherry void (*func)(Service* svc)) const; 175b7e03e82b89a30b09fea88eaf2a5638df1017cf6Bertrand SIMONNET void ReapAnyOutstandingChildren(); 176bac3299720623f4226bca103b26260052732ad30Tom Cherry void RemoveService(const Service& svc); 177bac3299720623f4226bca103b26260052732ad30Tom Cherry void DumpState() const; 178b7349902a945903f9e36a569051f5131beb0bc24Tom Cherry 179bac3299720623f4226bca103b26260052732ad30Tom Cherryprivate: 180bac3299720623f4226bca103b26260052732ad30Tom Cherry ServiceManager(); 181bac3299720623f4226bca103b26260052732ad30Tom Cherry 182b7e03e82b89a30b09fea88eaf2a5638df1017cf6Bertrand SIMONNET // Cleans up a child process that exited. 183b7e03e82b89a30b09fea88eaf2a5638df1017cf6Bertrand SIMONNET // Returns true iff a children was cleaned up. 184b7e03e82b89a30b09fea88eaf2a5638df1017cf6Bertrand SIMONNET bool ReapOneProcess(); 185b7e03e82b89a30b09fea88eaf2a5638df1017cf6Bertrand SIMONNET 186bac3299720623f4226bca103b26260052732ad30Tom Cherry static int exec_count_; // Every service needs a unique name. 187bac3299720623f4226bca103b26260052732ad30Tom Cherry std::vector<std::unique_ptr<Service>> services_; 188bac3299720623f4226bca103b26260052732ad30Tom Cherry}; 189bac3299720623f4226bca103b26260052732ad30Tom Cherry 190b7349902a945903f9e36a569051f5131beb0bc24Tom Cherryclass ServiceParser : public SectionParser { 191b7349902a945903f9e36a569051f5131beb0bc24Tom Cherrypublic: 192b7349902a945903f9e36a569051f5131beb0bc24Tom Cherry ServiceParser() : service_(nullptr) { 193b7349902a945903f9e36a569051f5131beb0bc24Tom Cherry } 194b7349902a945903f9e36a569051f5131beb0bc24Tom Cherry bool ParseSection(const std::vector<std::string>& args, 195b7349902a945903f9e36a569051f5131beb0bc24Tom Cherry std::string* err) override; 196b7349902a945903f9e36a569051f5131beb0bc24Tom Cherry bool ParseLineSection(const std::vector<std::string>& args, 197b7349902a945903f9e36a569051f5131beb0bc24Tom Cherry const std::string& filename, int line, 198b7349902a945903f9e36a569051f5131beb0bc24Tom Cherry std::string* err) const override; 199b7349902a945903f9e36a569051f5131beb0bc24Tom Cherry void EndSection() override; 200b7349902a945903f9e36a569051f5131beb0bc24Tom Cherry void EndFile(const std::string&) override { 201b7349902a945903f9e36a569051f5131beb0bc24Tom Cherry } 202b7349902a945903f9e36a569051f5131beb0bc24Tom Cherryprivate: 203b7349902a945903f9e36a569051f5131beb0bc24Tom Cherry bool IsValidName(const std::string& name) const; 204b7349902a945903f9e36a569051f5131beb0bc24Tom Cherry 205b7349902a945903f9e36a569051f5131beb0bc24Tom Cherry std::unique_ptr<Service> service_; 206b7349902a945903f9e36a569051f5131beb0bc24Tom Cherry}; 207b7349902a945903f9e36a569051f5131beb0bc24Tom Cherry 208bac3299720623f4226bca103b26260052732ad30Tom Cherry#endif 209