86a427276e57cadda3c44afe1307cc5ed7b1aaec
[stapibas.git] / src / stapibas / Cli.php
1 <?php
2 namespace stapibas;
3
4 class Cli
5 {
6     protected $cliParser;
7
8     public function __construct()
9     {
10         $this->setupCli();
11     }
12
13     public function run()
14     {
15         try {
16             $result = $this->cliParser->parse();
17         } catch (\Exception $exc) {
18             $this->cliParser->displayError($exc->getMessage());
19         }
20
21         $log = new Logger();
22         if ($result->options['debug']) {
23             $log->debug = true;
24         }
25
26         try {
27             $deps = new Dependencies();
28             $deps->db = new PDO(
29                 $GLOBALS['dbdsn'], $GLOBALS['dbuser'], $GLOBALS['dbpass']
30             );
31             $deps->log = $log;
32             $deps->options = array_merge(
33                 $result->options,
34                 $result->command ? $result->command->options : array()
35             );
36
37             if ($result->command_name == 'update') {
38                 $this->runUpdate($result, $deps);
39             } else if ($result->command_name == 'feed') {
40                 $this->manageFeed($result, $deps);
41             }
42         } catch (\Exception $e) {
43             $msg = 'stapibas exception!' . "\n"
44                 . 'Code: ' . $e->getCode() . "\n"
45                 . 'Message: ' . $e->getMessage() . "\n";
46             file_put_contents('php://stderr', $msg);
47             exit(1);
48         }
49     }
50
51     protected function runUpdate(
52         \Console_CommandLine_Result $result, Dependencies $deps
53     ) {
54         $tasks = array_flip(explode(',', $result->command->options['tasks']));
55
56         if (isset($tasks['feeds'])) {
57             $this->runUpdateFeeds($deps);
58         }
59         if (isset($tasks['entries'])) {
60             $this->runUpdateEntries($deps);
61         }
62         if (isset($tasks['urls'])) {
63             $this->runUpdatePingUrls($deps);
64         }
65     }
66
67     protected function runUpdateFeeds($deps)
68     {
69         $uf = new Feed_UpdateFeeds($deps);
70         if ($deps->options['feed'] === null) {
71             $uf->updateAll();
72         } else {
73             $urlOrIds = explode(',', $deps->options['feed']);
74             $uf->updateSome($urlOrIds);
75         }
76     }
77
78     protected function runUpdateEntries($deps)
79     {
80         $ue = new Feed_UpdateEntries($deps);
81         if ($deps->options['entry'] === null) {
82             $ue->updateAll();
83         } else {
84             $urlOrIds = explode(',', $deps->options['entry']);
85             $ue->updateSome($urlOrIds);
86         }
87     }
88
89     protected function runUpdatePingUrls($deps)
90     {
91         $uf = new Feed_PingUrls($deps);
92         if ($deps->options['entryurl'] === null) {
93             $uf->pingAll();
94         } else {
95             $urls = explode(',', $deps->options['entryurl']);
96             $uf->pingSome($urls);
97         }
98     }
99
100
101     protected function manageFeed(
102         \Console_CommandLine_Result $result, Dependencies $deps
103     ) {
104         $mg = new Feed_Manage($deps);
105         if ($deps->options['add']) {
106             $mg->addFeed($result->command->args['feed']);
107         } else if ($deps->options['remove']) {
108             $mg->removeFeed($result->command->args['feed']);
109         } else {
110             $mg->listAll();
111         }
112     }
113
114
115     public function setupCli()
116     {
117         $p = new \Console_CommandLine();
118         $p->description = 'Sends pingbacks to URLs linked in Atom feed entries';
119         $p->version = '0.0.1';
120
121         $p->addOption(
122             'debug',
123             array(
124                 'short_name'  => '-d',
125                 'long_name'   => '--debug',
126                 'description' => "Output debug messages",
127                 'action'      => 'StoreTrue'
128             )
129         );
130         $p->addOption(
131             'force',
132             array(
133                 'short_name'  => '-f',
134                 'long_name'   => '--force',
135                 'description' => "Update even when resource did not change",
136                 'action'      => 'StoreTrue'
137             )
138         );
139
140         $feed = $p->addCommand(
141             'feed',
142             array(
143                 'description' => 'Edit, list or delete feeds'
144             )
145         );
146         $feed->addOption(
147             'add',
148             array(
149                 'short_name'  => '-a',
150                 'long_name'   => '--add',
151                 'description' => 'Add the feed',
152                 'action'      => 'StoreTrue'
153             )
154         );
155         $feed->addOption(
156             'remove',
157             array(
158                 'short_name'  => '-r',
159                 'long_name'   => '--remove',
160                 'description' => 'Remove the feed',
161                 'action'      => 'StoreTrue'
162             )
163         );
164         $feed->addArgument(
165             'feed',
166             array(
167                 'description' => 'URL or ID of feed',
168                 'optional' => true
169             )
170         );
171         
172
173         $update = $p->addCommand(
174             'update',
175             array(
176                 'description' => 'Update feed data and send out pings'
177             )
178         );
179
180         $update->addOption(
181             'feed',
182             array(
183                 'short_name'  => '-i',
184                 'long_name'   => '--feed',
185                 'description' => 'Update this feed URL or ID',
186                 'help_name'   => 'URL|ID',
187                 'action'      => 'StoreString'
188             )
189         );
190
191         $update->addOption(
192             'entry',
193             array(
194                 'short_name'  => '-e',
195                 'long_name'   => '--entry',
196                 'description' => 'Update this feed entry URL or ID',
197                 'help_name'   => 'URL|ID',
198                 'action'      => 'StoreString'
199             )
200         );
201
202         $update->addOption(
203             'tasks',
204             array(
205                 'short_name'  => '-t',
206                 'long_name'   => '--tasks',
207                 'description' => 'Execute the given tasks (comma-separated: feeds,entries,urls)',
208                 'help_name'   => 'tasks',
209                 'action'      => 'StoreString',
210                 'default'     => 'feeds,entries,urls',
211             )
212         );
213         $update->addOption(
214             'list_tasks',
215             array(
216                 'long_name'   => '--list-tasks',
217                 'description' => 'Show all possible tasks',
218                 'action'      => 'List',
219                 'list'        => array('feeds', 'entries', 'urls')
220             )
221         );
222
223         $update->addOption(
224             'entryurl',
225             array(
226                 'short_name'  => '-u',
227                 'long_name'   => '--url',
228                 'description' => 'Ping this URL or ID',
229                 'help_name'   => 'URL|ID',
230                 'action'      => 'StoreString'
231             )
232         );
233
234         $this->cliParser = $p;
235     }
236
237 }
238 ?>