stat without struct
[gp-arc-client-c.git] / ext / arc_kill.cpp
1 /*
2  *  arc_kill.cpp
3  *  arcclientc
4  *
5  *  Created by Tamas Jung on 10/25/10.
6  *  Copyright 2010 Epl. All rights reserved.
7  *
8  */
9
10 #include "arc_kill.h"
11
12 // -*- indent-tabs-mode: nil -*-
13
14 #ifdef HAVE_CONFIG_H
15 #include <config.h>
16 #endif
17 #include "logger.h"
18
19
20 #include <iostream>
21 #include <list>
22 #include <string>
23 #include <algorithm>
24 #include "arc_libs.h"
25
26 int  arc_kill(int argc, char **argv) {
27
28   Arc::OptionParser options(istring("[job ...]"),
29                             istring("The arckill command is used to kill "
30                                     "running jobs."),
31                             istring("Argument to -c has the format "
32                                     "Flavour:URL e.g.\n"
33                                     "ARC0:ldap://grid.tsl.uu.se:2135/"
34                                     "nordugrid-cluster-name=grid.tsl.uu.se,"
35                                     "Mds-Vo-name=local,o=grid"));
36
37   bool all = false;
38   options.AddOption('a', "all",
39                     istring("all jobs"),
40                     all);
41
42   std::string joblist;
43   options.AddOption('j', "joblist",
44                     istring("file containing a list of jobs"),
45                     istring("filename"),
46                     joblist);
47
48   std::list<std::string> clusters;
49   options.AddOption('c', "cluster",
50                     istring("explicitly select or reject a specific resource"),
51                     istring("[-]name"),
52                     clusters);
53
54   std::list<std::string> status;
55   options.AddOption('s', "status",
56                     istring("only select jobs whose status is statusstr"),
57                     istring("statusstr"),
58                     status);
59
60   bool keep = false;
61   options.AddOption('k', "keep",
62                     istring("keep the files on the server (do not clean)"),
63                     keep);
64
65   int timeout = -1;
66   options.AddOption('t', "timeout", istring("timeout in seconds (default 20)"),
67                     istring("seconds"), timeout);
68
69   std::string conffile;
70   options.AddOption('z', "conffile",
71                     istring("configuration file (default ~/.arc/client.conf)"),
72                     istring("filename"), conffile);
73
74   std::list<std::string> jobs = options.Parse(argc, argv);
75
76
77   Arc::UserConfig usercfg(conffile, joblist);
78   if (!usercfg) {
79     logger.msg(Arc::ERROR, "Failed configuration initialization");
80     return 1;
81   }
82
83   if (timeout > 0)
84     usercfg.Timeout(timeout);
85
86   if ((!joblist.empty() || !status.empty()) && jobs.empty() && clusters.empty()){
87     all = true;
88     logger.msg(Arc::DEBUG, "Implicit all turned on");
89   }
90
91   if (jobs.empty() && clusters.empty() && !all) {
92     logger.msg(Arc::ERROR, "No jobs given");
93     return 1;
94   }
95
96   if (!jobs.empty() || all){
97     usercfg.ClearSelectedServices();
98     logger.msg(Arc::DEBUG, "ClearSelectedServcies was invoked.");
99   }
100
101   if (!clusters.empty()) {
102     usercfg.ClearSelectedServices();
103     usercfg.AddServices(clusters, Arc::COMPUTING);
104   }
105
106   // If the user specified a joblist on the command line joblist equals
107   // usercfg.JobListFile(). If not use the default, ie. usercfg.JobListFile().
108   Arc::JobSupervisor jobmaster(usercfg, jobs);
109   if (!jobmaster.JobsFound()) {
110     logger.msg(Arc::ERROR, "No jobs");
111     return 0;
112   }
113   std::list<Arc::JobController*> jobcont = jobmaster.GetJobControllers();
114
115   if (jobcont.empty()) {
116     logger.msg(Arc::ERROR, "No job controller plugins loaded");
117     return 1;
118   }
119
120   int retval = 0;
121   for (std::list<Arc::JobController*>::iterator it = jobcont.begin();
122        it != jobcont.end(); it++)
123     if (!(*it)->Kill(status, keep))
124       retval = 1;
125
126   return retval;
127 }