/[monit]/monit/control.c
ViewVC logotype

Diff of /monit/control.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.90 by martinp, Sun Apr 10 21:13:37 2005 UTC revision 1.91 by martinp, Sun Apr 10 22:21:59 2005 UTC
# Line 75  static void  do_monitor(Service_T); Line 75  static void  do_monitor(Service_T);
75  static void  do_unmonitor(Service_T);  static void  do_unmonitor(Service_T);
76  static void *wait_start(void *);  static void *wait_start(void *);
77  static int   wait_stop(Service_T);  static int   wait_stop(Service_T);
78  static void  do_depend(Service_T, const char *);  static void  do_depend(Service_T, int);
79    
80    
81  /* ------------------------------------------------------------------ Public */  /* ------------------------------------------------------------------ Public */
# Line 94  void control_service_daemon(const char * Line 94  void control_service_daemon(const char *
94    ASSERT(S);    ASSERT(S);
95    ASSERT(action);    ASSERT(action);
96    
97      if(Util_getAction(action) == ACTION_IGNORE) {
98        log("%s: Cannot %s service '%s' -- invalid action %s\n",
99            prog, action, S, action);
100        return;
101      }
102    
103    s= socket_new(Run.bind_addr?Run.bind_addr:"localhost",    s= socket_new(Run.bind_addr?Run.bind_addr:"localhost",
104                  Run.httpdport, SOCKET_TCP, Run.httpdssl, NET_TIMEOUT);                  Run.httpdport, SOCKET_TCP, Run.httpdssl, NET_TIMEOUT);
# Line 126  void control_service_daemon(const char * Line 131  void control_service_daemon(const char *
131   */   */
132  void control_service(const char *S, const char *action) {  void control_service(const char *S, const char *action) {
133    
134    Service_T s= NULL;    Service_T s = NULL;
135      int _action = ACTION_IGNORE;
136    
137    ASSERT(S);    ASSERT(S);
138    ASSERT(action);    ASSERT(action);
139    
140    if(!(s= Util_getService(S))) {    if(!(s= Util_getService(S))) {
141      log("%s: Cannot %s service '%s' -- not found in %s\n",      log("%s: Cannot %s service '%s' -- not found in %s\n",
142            prog, action, S, Run.controlfile);          prog, action, S, Run.controlfile);
143      return;      return;
144    }    }
145    
146    if(IS(action, "start")) {    if((_action = Util_getAction(action)) == ACTION_IGNORE) {
147            log("%s: Cannot %s service '%s' -- invalid action %s\n",
148      if(s->type==TYPE_PROCESS && Util_isProcessRunning(s)) {            prog, action, S, action);
149        DEBUG("%s: Process already running -- process %s\n", prog, S);      return;
150        Util_monitorSet(s);    }
       return;  
     }  
       
     if(s->type==TYPE_PROCESS && !s->start) {  
       DEBUG("%s: Start method not defined -- process %s\n", prog, S);  
       Util_monitorSet(s);  
       return;  
     }  
       
     do_depend(s, "stop");  
     do_start(s);  
     do_depend(s, "start");  
       
   } else if(IS(action, "stop")) {  
       
     if(s->type==TYPE_PROCESS && !s->stop) {  
       DEBUG("%s: Stop method not defined -- process %s\n", prog, S);  
       Util_monitorUnset(s);  
       return;  
     }  
       
     do_depend(s, "stop");  
     do_stop(s);  
       
   } else if(IS(action, "restart")) {  
       
     if(s->type==TYPE_PROCESS && (!s->start || !s->stop)) {  
       DEBUG("%s: Start or stop method not defined -- process %s\n", prog, S);  
       Util_monitorSet(s);  
       return;  
     }  
151    
152      log("'%s' trying to restart\n", s->name);    switch(_action) {
153        
154      do_depend(s, "stop");      case ACTION_START:
155      if(do_stop(s)) {        if(s->type==TYPE_PROCESS && Util_isProcessRunning(s)) {
156        /* Only start if stop succeeded */          DEBUG("%s: Process already running -- process %s\n", prog, S);
157            Util_monitorSet(s);
158            return;
159          }
160          if(s->type==TYPE_PROCESS && !s->start) {
161            DEBUG("%s: Start method not defined -- process %s\n", prog, S);
162            Util_monitorSet(s);
163            return;
164          }
165          do_depend(s, ACTION_STOP);
166        do_start(s);        do_start(s);
167        do_depend(s, "start");        do_depend(s, ACTION_START);
168      }        break;
169        
170    } else if(IS(action, "monitor")) {      case ACTION_STOP:
171              if(s->type==TYPE_PROCESS && !s->stop) {
172      /* We only enable monitoring of this service and all prerequisite          DEBUG("%s: Stop method not defined -- process %s\n", prog, S);
173       * services. Chain of services which depends on this service keep          Util_monitorUnset(s);
174       * its state */          return;
175      do_monitor(s);        }
176              do_depend(s, ACTION_STOP);
177    } else if(IS(action, "unmonitor")) {        do_stop(s);
178              break;
179      /* We disable monitoring of this service and all services which  
180       * depends on it */      case ACTION_RESTART:
181      do_depend(s, "unmonitor");        if(s->type==TYPE_PROCESS && (!s->start || !s->stop)) {
182      do_unmonitor(s);          DEBUG("%s: Start or stop method not defined -- process %s\n", prog, S);
183                Util_monitorSet(s);
184            return;
185          }
186          log("'%s' trying to restart\n", s->name);
187          do_depend(s, ACTION_STOP);
188          if(do_stop(s)) {
189            /* Only start if stop succeeded */
190            do_start(s);
191            do_depend(s, ACTION_START);
192          }
193          break;
194    
195        case ACTION_MONITOR:
196          /* We only enable monitoring of this service and all prerequisite
197           * services. Chain of services which depends on this service keep
198           * its state */
199          do_monitor(s);
200          break;
201    
202        case ACTION_UNMONITOR:
203          /* We disable monitoring of this service and all services which
204           * depends on it */
205          do_depend(s, ACTION_UNMONITOR);
206          do_unmonitor(s);
207          break;
208    
209        default:
210          /* when the action handler i not implemented, we will refuse it even
211             in the case that monit generaly knows it */
212          log("%s: Cannot %s service '%s' -- invalid action %s\n",
213              prog, action, S, action);
214          break;
215    }    }
216        
217      return;
218  }  }
219    
220    
# Line 367  static void do_unmonitor(Service_T s) { Line 383  static void do_unmonitor(Service_T s) {
383   * @param s A Service_T object   * @param s A Service_T object
384   * @param action An action to do on the dependant services   * @param action An action to do on the dependant services
385   */   */
386  static void do_depend(Service_T s, const char *action) {  static void do_depend(Service_T s, int action) {
387    
388    Service_T child;    Service_T child;
389        
# Line 383  static void do_depend(Service_T s, const Line 399  static void do_depend(Service_T s, const
399    
400          if(IS(d->dependant, s->name)) {          if(IS(d->dependant, s->name)) {
401                    
402            if(IS(action, "start"))            if(action == ACTION_START)
403              do_start(child);              do_start(child);
404            else if(IS(action, "monitor"))            else if(action == ACTION_MONITOR)
405              do_monitor(child);              do_monitor(child);
406                    
407            do_depend(child, action);            do_depend(child, action);
408                    
409            if(IS(action, "stop"))            if(action == ACTION_STOP)
410              do_stop(child);              do_stop(child);
411            else if(IS(action, "unmonitor"))            else if(action == ACTION_UNMONITOR)
412              do_unmonitor(child);              do_unmonitor(child);
413    
414            break;            break;

Legend:
Removed from v.1.90  
changed lines
  Added in v.1.91

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26