fogproject  1.5.9
About: FOG is a Linux-based network computer cloning solution for Windows, Mac OSX and various Linux distributions that ties together a few open-source tools with a PHP-based web interface. FOG doesn’t use any boot disks, or CDs; everything is done via TFTP and PXE.
  Fossies Dox: fogproject-1.5.9.tar.gz  ("unofficial" and yet experimental doxygen-generated source code documentation)  

taskqueue.class.php
Go to the documentation of this file.
1 <?php
23 {
30  public function checkIn()
31  {
32  try {
34  $this->Task
35  ->set('stateID', self::getCheckedInState())
36  ->set('checkinTime', self::formatTime('now', 'Y-m-d H:i:s'))
37  ->save();
38  if (!$this->Task->save()) {
39  throw new Exception(_('Failed to update task'));
40  }
41  if ($this->imagingTask) {
42  if ($this->Task->isMulticast()) {
43  $msID = @min(
44  self::getSubObjectIDs(
45  'MulticastSessionAssociation',
46  array(
47  'taskID' => $this->Task->get('id')
48  ),
49  'msID'
50  )
51  );
52  $MulticastSession = self::getClass(
53  'MulticastSession',
54  $msID
55  );
56  if (!$MulticastSession->isValid()) {
57  throw new Exception(_('Invalid Multicast Session'));
58  }
59  if ($MulticastSession->get('clients') < 0) {
60  $clients = 1;
61  } else {
62  $clients = $MulticastSession->get('clients') + 1;
63  }
64  $MulticastSession
65  ->set('clients', $clients);
66  if (!$MulticastSession->save()) {
67  throw new Exception(_('Failed to update Session'));
68  }
69  if (self::$Host->isValid()) {
71  ->set(
72  'imageID',
73  $MulticastSession->get('image')
74  );
75  }
76 
77  $this->StorageNode = self::nodeFail(
78  self::getClass('StorageNode', $this->Task->get('storagenodeID')),
79  self::$Host->get('id')
80  );
81  if ($MulticastSession->get('stateID') == 1) {
82  $msg = sprintf(
83  '%s, %s %d %s.',
84  _('No open slots'),
85  _('There are'),
86  $inFront,
87  _('before me')
88  );
89  throw new Exception($msg);
90  }
91  } elseif ($this->Task->isForced()) {
92  self::$HookManager->processEvent(
93  'TASK_GROUP',
94  array(
95  'StorageGroup' => &$this->StorageGroup,
96  'Host' => &self::$Host
97  )
98  );
99  $this->StorageNode = null;
100  self::$HookManager->processEvent(
101  'TASK_NODE',
102  array(
103  'StorageNode' => &$this->StorageNode,
104  'Host' => &self::$Host
105  )
106  );
107  $method = 'getOptimalStorageNode';
108  if ($this->Task->isCapture()
109  || $this->Task->isMulticast()
110  ) {
111  $method = 'getMasterStorageNode';
112  }
113  if (!$this->StorageNode || !$this->StorageNode->isValid()) {
114  $this->StorageNode = $this->Image
115  ->getStorageGroup()
116  ->{$method}();
117  }
118  } else {
119  $this->StorageNode = self::nodeFail(
120  self::getClass(
121  'StorageNode',
122  $this->Task->get('storagenodeID')
123  ),
124  self::$Host->get('id')
125  );
126  $nodeTest = $this->StorageNode instanceof StorageNode &&
127  $this->StorageNode->isValid();
128 
129  if (!$nodeTest) {
130  $msg = sprintf(
131  '%s %s. %s %s.',
132  _('The node trying to be used is currently'),
133  _('unavailable'),
134  _('On reboot we will try to find a new node'),
135  _('automatically')
136  );
137  throw new Exception($msg);
138  }
139  $totalSlots = $this->StorageNode->get('maxClients');
140  $usedSlots = $this->StorageNode->getUsedSlotCount();
141  $inFront = $this->Task->getInFrontOfHostCount();
142  $groupOpenSlots = $totalSlots - $usedSlots;
143  if ($groupOpenSlots < 1) {
144  $msg = sprintf(
145  '%s, %s %d %s.',
146  _('No open slots'),
147  _('There are'),
148  $inFront,
149  _('before me')
150  );
151  throw new Exception($msg);
152  }
153  if ($groupOpenSlots <= $inFront) {
154  $msg = sprintf(
155  '%s, %s %d %s.',
156  _('There are open slots'),
157  _('but'),
158  $inFront,
159  _('before me on this node')
160  );
161  throw new Exception($msg);
162  }
163  }
164  if ($this->Task->isCapture()) {
165  $this->Task->getImage()->set('size', '')->save();
166  }
167  $this->Task
168  ->set(
169  'storagenodeID',
170  $this->StorageNode->get('id')
171  );
172  if (!$this->imageLog(true)) {
173  throw new Exception(_('Failed to update/create image log'));
174  }
175  }
176  $this->Task
177  ->set('stateID', self::getProgressState())
178  ->set('checkInTime', self::formatTime('now', 'Y-m-d H:i:s'));
179  if (!$this->Task->save()) {
180  throw new Exception(_('Failed to update Task'));
181  }
182  if (!$this->taskLog()) {
183  throw new Exception(_('Failed to update/create task log'));
184  }
185  self::$EventManager->notify(
186  'HOST_CHECKIN',
187  array(
188  'Host' => &self::$Host
189  )
190  );
191  echo '##@GO';
192  } catch (Exception $e) {
193  echo $e->getMessage();
194  }
195  }
201  private function _email()
202  {
203  list(
204  $emailAction,
205  $emailAddress,
206  $emailBinary,
207  $fromEmail
208  ) = self::getSubObjectIDs(
209  'Service',
210  array(
211  'name' => array(
212  'FOG_EMAIL_ACTION',
213  'FOG_EMAIL_ADDRESS',
214  'FOG_EMAIL_BINARY',
215  'FOG_FROM_EMAIL'
216  )
217  ),
218  'value',
219  false,
220  'AND',
221  'name',
222  false,
223  false
224  );
225  if (!$emailAction || !$emailAddress) {
226  return;
227  }
228  if (!self::$Host->get('inventory')->isValid()) {
229  return;
230  }
231  $SnapinJob = self::$Host->get('snapinjob');
232  $SnapinTasks = self::getSubObjectIDs(
233  'SnapinTask',
234  array(
235  'stateID' => self::getQueuedStates(),
236  'jobID' => $SnapinJob->get('id')
237  ),
238  'snapinID'
239  );
240  $SnapinNames = array();
241  if ($SnapinJob->isValid()) {
242  $SnapinNames = self::getSubObjectIDs(
243  'Snapin',
244  array(
245  'id' => $SnapinTasks,
246  ),
247  'name'
248  );
249  }
250  if (!$emailBinary) {
251  $emailBinary = '/usr/sbin/sendmail -t -f noreply@fogserver.com -i';
252  }
253  $reg = '#\$\{server-name\}#';
254  $nodeName = 'fogserver';
255  if ($this->StorageNode->isValid()) {
256  $nodeName = $this->StorageNode->get('name');
257  }
258  $emailBinary = preg_replace(
259  $reg,
260  $nodeName,
261  $emailBinary
262  );
263  if (!$fromEmail) {
264  $fromEmail = 'noreply@fogserver.com';
265  }
266  $fromEmail = preg_replace(
267  $reg,
268  $nodeName,
269  $fromEmail
270  );
271  $headers = sprintf(
272  "From: %s\r\nX-Mailer: PHP/%s",
273  $fromEmail,
274  phpversion()
275  );
276  $engineer = ucwords(
277  $this->Task->get('createdBy')
278  );
279  $primaryUser = ucwords(
280  self::$Host->get('inventory')->get('primaryUser')
281  );
282  $replaceUser = '#\$\{user-name\}#';
283  $emailAddress = preg_replace(
284  $replaceUser,
285  lcfirst($engineer),
286  $emailAddress
287  );
288  $emailAddress = preg_replace(
289  $reg,
290  $nodeName,
291  $emailAddress
292  );
293  $Inventory = self::$Host->get('inventory');
294  $mac = self::$Host->get('mac')->__toString();
295  $ImageName = $this->Task->getImage()->get('name');
296  $Snapins = implode(',', (array)$SnapinNames);
297  $email = array(
298  sprintf("%s:-\n", _('Machine Details')) => '',
299  sprintf("\n%s: ", _('Host Name')) => self::$Host->get('name'),
300  sprintf("\n%s: ", _('Computer Model')) => $Inventory->get('sysproduct'),
301  sprintf("\n%s: ", _('Serial Number')) => $Inventory->get('sysserial'),
302  sprintf("\n%s: ", _('MAC Address')) => $mac,
303  "\n" => '',
304  sprintf("\n%s: ", _('Image Used')) => $ImageName,
305  sprintf("\n%s: ", _('Snapin Used')) => $Snapins,
306  "\n" => '',
307  sprintf("\n%s: ", _('Imaged By')) => $engineer,
308  sprintf("\n%s: ", _('Imaged For')) => $primaryUser
309  );
310  self::$HookManager->processEvent(
311  'EMAIL_ITEMS',
312  array(
313  'email' => &$email,
314  'Host' => &self::$Host
315  )
316  );
317  ob_start();
318  foreach ((array)$email as $key => &$val) {
319  printf('%s%s', $key, $val);
320  unset($key, $val);
321  }
322  $emailMe = ob_get_clean();
323  $stat = sprintf(
324  '%s - %s',
325  self::$Host->get('name'),
326  _('Image Task Completed')
327  );
328  if ($Inventory->get('other1')) {
329  mail(
330  $emailAddress,
331  sprintf(
332  'ISSUE=%s PROJ=1',
333  $Inventory->get('other1')
334  ),
335  $emailMe,
336  $headers
337  );
338  $emailMe .= sprintf(
339  "\n%s (%s): %s",
340  _('Imaged For'),
341  _('Call'),
342  $Inventory->get('other1')
343  );
344  //$Inventory->set('other1', '')->save();
345  }
346  mail(
347  $emailAddress,
348  $stat,
349  $emailMe,
350  $headers
351  );
352  }
360  private function _moveUpload()
361  {
362  if (!$this->Task->isCapture()) {
363  return;
364  }
365  if (!(isset($_REQUEST['mac'])
366  && is_string($_REQUEST['mac']))
367  ) {
368  return;
369  }
370  $macftp = strtolower(
371  str_replace(
372  array(
373  ':',
374  '-',
375  '.'
376  ),
377  '',
378  basename($_REQUEST['mac'])
379  )
380  );
381  $src = sprintf(
382  '%s/dev/%s',
383  $this->StorageNode->get('ftppath'),
384  $macftp
385  );
386  $dest = sprintf(
387  '%s/%s',
388  $this->StorageNode->get('ftppath'),
389  $this->Image->get('path')
390  );
391  self::$FOGFTP
392  ->set('host', $this->StorageNode->get('ip'))
393  ->set('username', $this->StorageNode->get('user'))
394  ->set('password', $this->StorageNode->get('pass'))
395  ->connect()
396  ->delete($dest)
397  ->rename($src, $dest)
398  ->chmod(0777, $dest)
399  ->close();
400  if ($this->Image->get('format') == 1) {
401  $this->Image
402  ->set('format', 0)
403  ->set('srvsize', self::getFilesize($dest));
404  }
405  $this->Image
406  ->set(
407  'deployed',
408  self::niceDate()->format('Y-m-d H:i:s')
409  )->save();
410  }
417  public function checkout()
418  {
419  self::randWait();
420  if ($this->Task->isSnapinTasking()) {
421  die('##');
422  }
423  try {
424  if ($this->Task->isMulticast()) {
425  $MCTask = self::getClass('MulticastSessionAssociation')
426  ->set(
427  'taskID',
428  $this->Task->get('id')
429  )->load('taskID');
430  $MulticastSession = $MCTask->getMulticastSession();
431  if ($MulticastSession->get('clients') < 0) {
432  $clients = 1;
433  } else {
434  $clients = $MulticastSession->get('clients') - 1;
435  }
436  $MulticastSession
437  ->set('clients', $clients)
438  ->save();
439  }
441  ->set('pub_key', '')
442  ->set('sec_tok', '');
443  if ($this->Task->isDeploy()) {
445  ->set('deployed', self::niceDate()->format('Y-m-d H:i:s'));
446  $this->_email();
447  } elseif ($this->Task->isCapture()) {
448  $this->_moveUpload();
449  }
450  $this->Task
451  ->set('pct', 100)
452  ->set('percent', 100)
453  ->set('stateID', self::getCompleteState());
454  if (!self::$Host->save()) {
455  throw new Exception(_('Failed to update Host'));
456  }
457  if (!$this->Task->save()) {
458  throw new Exception(_('Failed to update Task'));
459  }
460  self::$HookManager
461  ->processEvent(
462  'HOST_TASKING_COMPLETE',
463  array(
464  'Host' => &self::$Host,
465  'Task' => &$this->Task
466  )
467  );
468  if (!$this->taskLog()) {
469  throw new Exception(_('Failed to update task log'));
470  }
471  if ($this->imagingTask) {
472  if (!$this->imageLog(false)) {
473  throw new Exception(_('Failed to update imaging log'));
474  }
475  }
476  self::$EventManager->notify(
477  'HOST_IMAGE_COMPLETE',
478  array(
479  'HostName' => self::$Host->get('name')
480  )
481  );
482  echo '##';
483  } catch (Exception $e) {
484  echo $e->getMessage();
485  }
486  }
487 }
FOGController\save
save()
Definition: fogcontroller.class.php:387
Image\getStorageGroup
getStorageGroup()
Definition: image.class.php:377
TaskQueue\_email
_email()
Definition: taskqueue.class.php:201
TaskType\isCapture
isCapture($nums=false)
Definition: tasktype.class.php:150
TaskQueue\_moveUpload
_moveUpload()
Definition: taskqueue.class.php:360
FOGBase\getClass
static getClass($class, $data='', $props=false)
Definition: fogbase.class.php:439
TaskQueue\checkout
checkout()
Definition: taskqueue.class.php:417
TaskingElement\nodeFail
static nodeFail( $StorageNode, $Host)
Definition: taskingelement.class.php:219
TaskingElement
Definition: taskingelement.class.php:23
Host\isValid
isValid()
Definition: host.class.php:622
Image
Definition: image.class.php:23
TaskQueue
Definition: taskqueue.class.php:23
$SnapinJob
if(!FOGCore::$Host->isValid()) $SnapinJob
Definition: snapcheck.php:28
StorageNode\getUsedSlotCount
getUsedSlotCount()
Definition: storagenode.class.php:303
$val
$val
Definition: check_node_exists.php:25
StorageNode\get
get($key='')
Definition: storagenode.class.php:102
FOGController\get
get($key='')
Definition: fogcontroller.class.php:207
$mac
$mac
Definition: hostinfo.php:151
Task\set
set($key, $value)
Definition: task.class.php:225
StorageNode
Definition: storagenode.class.php:23
Task
Definition: task.class.php:23
Task\getInFrontOfHostCount
getInFrontOfHostCount()
Definition: task.class.php:128
$Host
$Host
Definition: hostnameloop.php:30
FOGController\set
set($key, $value)
Definition: fogcontroller.class.php:241
TaskType\isMulticast
isMulticast($nums=false)
Definition: tasktype.class.php:285
Task\getImage
getImage()
Definition: task.class.php:268
TaskingElement\taskLog
taskLog()
Definition: taskingelement.class.php:244
TaskQueue\checkIn
checkIn()
Definition: taskqueue.class.php:30
Task\isForced
isForced()
Definition: task.class.php:313
StorageGroup
Definition: storagegroup.class.php:23
TaskingElement\imageLog
imageLog($checkin=false)
Definition: taskingelement.class.php:260
TaskType\isDeploy
isDeploy($nums=false)
Definition: tasktype.class.php:255
$msg
if($Host->isValid()) $msg
Definition: hostnameloop.php:42
$Inventory
$Inventory
Definition: hostinfo.php:149
FOGBase\randWait
static randWait()
Definition: fogbase.class.php:2542
FOGController\isValid
isValid()
Definition: fogcontroller.class.php:865
TaskType\isSnapinTasking
isSnapinTasking($nums=false)
Definition: tasktype.class.php:207