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