source: trunk/server/www/app/vendors/shells/upgrade.php @ 303

Last change on this file since 303 was 303, checked in by sander, 11 years ago

Fix upgrade help

File size: 6.3 KB
Line 
1<?php
2/**
3 * Officeshots.org - Test your office documents in different applications
4 * Copyright (C) 2009 Stichting Lone Wolves
5 * Written by Sander Marechal <s.marechal@jejik.com>
6 *
7 * This program is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU Affero General Public License as
9 * published by the Free Software Foundation, either version 3 of the
10 * License, or (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 * GNU Affero General Public License for more details.
16 *
17 * You should have received a copy of the GNU Affero General Public License
18 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
19 */
20
21App::import('Model', 'Request');
22
23/**
24 * A simple shell to upgrade the database
25 */
26class UpgradeShell extends Shell
27{
28        /** @var array The models to use */
29        public $uses = array('Request', 'Result', 'User', 'Group');
30
31        /**
32         * Main function. Print help and exit.
33         */
34        public function main()
35        {
36                $this->help();
37        }
38
39        /**
40         * Try to determine the correct request state on all requests.
41         * This overrides any currently existing state!
42         */
43        public function requestState()
44        {
45                $result = $this->in('This will override any existing state. Before you do this you need to have set the counterCaches! Continue?', array('y', 'n'));
46
47                if ($result == 'n') {
48                        $this->_stop();
49                }
50
51                $requests = $this->Request->find('all');
52                foreach ($requests as $request) {
53                        $request['Request']['state'] = Request::STATE_QUEUED;
54
55                        if (strtotime($request['Request']['expire']) <= time()) {
56                                $request['Request']['state'] = Request::STATE_EXPIRED;
57                        }
58
59                        if ($request['Request']['job_count'] > 0 && $request['Request']['job_count'] == $request['Request']['result_count']) {
60                                $request['Request']['state'] = Request::STATE_FINISHED;
61                        }
62
63                        if ($request['Request']['job_count'] == 0) {
64                                $request['Request']['state'] = Request::STATE_CANCELLED;
65                        }
66
67                        $this->Request->save($request);
68                }
69        }
70
71        /**
72         * Upgrade from the sequential state to binary state flags
73         */
74        public function requestStateFlag()
75        {
76                $request = $this->Request->find('first', array('order' => array('Request.state DESC')));
77
78                if ($request['Request']['state'] > 7) {
79                        $this->out('It looks like your states have already have been upgraded.');
80                        $this->_stop();
81                }
82
83                // Sorted backwards
84                $states = array(
85                        7 => 128,
86                        6 => 64,
87                        5 => 32,
88                        4 => 16,
89                        3 => 8,
90                        2 => 4,
91                        1 => 2,
92                        0 => 1,
93                );
94
95                foreach ($states as $state_old => $state_new) {
96                        $this->Request->updateAll(
97                                array('Request.state' => $state_new),
98                                array('Request.state' => $state_old)
99                        );
100                }
101        }
102
103        /**
104         * Update the job and result counterCache on all requests.
105         */
106        public function jobCount()
107        {
108                $requests = $this->Request->find('all');
109                foreach ($requests as $request) {
110                        if (!isset($request['Job'][0]) || !is_array($request['Job'][0])) {
111                                continue;
112                        }
113
114                        $this->Request->Job->id = $request['Job'][0]['id'];
115                        $this->Request->Job->read();
116                        $this->Request->Job->updateCounterCache();
117                }
118        }
119
120        /**
121         * Upgrade the result state
122         */
123        public function resultState()
124        {
125                $this->Result->updateAll(
126                        array('state' => Result::STATE_FINISHED)
127                );
128        }
129
130        /**
131         * Set the default group membership based on e-mail address lists
132         */
133        public function defaultGroupMembership()
134        {
135                $users = $this->User->find('all', array('recursive' => -1));
136                foreach($users as $user) {
137                        $this->Group->add_default_member($user['User']['id']);
138                }
139        }
140
141        /**
142         * Upgrade filesystem layout
143         */
144        public function filesystemLayout()
145        {
146                $requests = $this->Request->find('all', array(
147                        'contain' => array(
148                                'Job',
149                                'Job.Result',
150                                'Job.Application',
151                                'Job.Platform',
152                        ),
153                        'conditions' => array('Request.root' => ''),
154                ));
155
156                foreach ($requests as $request) {
157                        $this->Request->id = $request['Request']['id'];
158
159                        // Create a root directory
160                        $root = 'requests' . DS . $request['Request']['id'];
161                        $root_path = APP . 'files' . DS . $root;
162                        @mkdir($root_path);
163
164                        // Move the request file
165                        if ($request['Request']['filename']) {
166                                $source = APP . 'files' . DS . 'requests' . DS . $request['Request']['path'];
167                                $target = $root_path . DS . 'source' . DS . $request['Request']['filename'];
168
169                                @mkdir(dirname($target));
170                                if (copy($source, $target)) {
171                                        unlink($source);
172                                        $this->out("Copied $source to $target");
173                                } else {
174                                        $this->out("Could not copy $source to $target");
175                                }
176                        }
177
178                        // Update the Request object
179                        $this->Request->set(array(
180                                'root' => $root,
181                                'path' => $root . DS . 'source',
182                        ));
183                        $this->Request->save();
184
185                        // Move the result files
186                        foreach ($request['Job'] as $job) {
187                                if ($job['Result'] && $job['Result']['filename']) {
188                                        $path  = Inflector::slug($job['Application']['name']) . '_';
189                                        $path .= Inflector::slug($job['version']) . '_';
190                                        $path .= Inflector::slug($job['Platform']['name']);
191
192                                        $source = APP . 'files' . DS . 'results' . DS . $job['Result']['path'];
193                                        $target = $root_path . DS . $path . DS . $job['Result']['filename'];
194
195                                        @mkdir(dirname($target));
196                                        if (copy($source, $target)) {
197                                                unlink($source);
198                                                $this->out("Copied $source to $target");
199                                        } else {
200                                                $this->out("Could not copy $source to $target");
201                                        }
202
203                                        $this->Result->id = $job['Result']['id'];
204                                        $this->Result->saveField('path', $root . DS . $path);
205                                }
206                        }
207                }
208        }
209
210        /**
211         * Print shell help
212         */
213        public function help()
214        {
215                $this->out('Commandline interface to upgrade the database');
216                $this->hr();
217                $this->out("Usage: cake upgrade <command>");
218                $this->hr();
219                $this->out('Commands:');
220                $this->out("\n\trequestState\n\t\tTry to determine the correct state for all requests.");
221                $this->out("\n\trequestStateFlag\n\t\tUpgrade from sequential to binary state flags.");
222                $this->out("\n\tjobCount\n\t\tUpdate the job_count and result_count on all requests.");
223                $this->out("\n\tresultState\n\t\tUpdate the result state to finished.");
224                $this->out("\n\tdefaultGroupMembership\n\t\tUpdate the default group membership for all existing users.");
225                $this->out("\n\tfilesystemLayout\n\t\tUpdate the layour of requests on the filesystem.");
226                $this->out("\n\thelp\n\t\tShow this help");
227                $this->out('');
228        }
229}
230
231?>
Note: See TracBrowser for help on using the repository browser.