1 /**********************************************************************
2 * Copyright (c) 2012, 2014 Ericsson
4 * All rights reserved. This program and the accompanying materials are
5 * made available under the terms of the Eclipse Public License v1.0 which
6 * accompanies this distribution, and is available at
7 * http://www.eclipse.org/legal/epl-v10.html
10 * Bernd Hufmann - Initial API and implementation
11 * Bernd Hufmann - Updated for support of LTTng Tools 2.1
12 * Simon Delisle - Updated for support of LTTng Tools 2.2
13 **********************************************************************/
14 package org
.eclipse
.linuxtools
.internal
.lttng2
.control
.ui
.views
.service
;
16 import java
.util
.ArrayList
;
17 import java
.util
.Iterator
;
18 import java
.util
.List
;
19 import java
.util
.regex
.Matcher
;
21 import org
.eclipse
.core
.commands
.ExecutionException
;
22 import org
.eclipse
.core
.runtime
.IProgressMonitor
;
23 import org
.eclipse
.core
.runtime
.NullProgressMonitor
;
24 import org
.eclipse
.linuxtools
.internal
.lttng2
.control
.core
.model
.IBaseEventInfo
;
25 import org
.eclipse
.linuxtools
.internal
.lttng2
.control
.core
.model
.IChannelInfo
;
26 import org
.eclipse
.linuxtools
.internal
.lttng2
.control
.core
.model
.IDomainInfo
;
27 import org
.eclipse
.linuxtools
.internal
.lttng2
.control
.core
.model
.IEventInfo
;
28 import org
.eclipse
.linuxtools
.internal
.lttng2
.control
.core
.model
.IFieldInfo
;
29 import org
.eclipse
.linuxtools
.internal
.lttng2
.control
.core
.model
.IProbeEventInfo
;
30 import org
.eclipse
.linuxtools
.internal
.lttng2
.control
.core
.model
.ISessionInfo
;
31 import org
.eclipse
.linuxtools
.internal
.lttng2
.control
.core
.model
.ISnapshotInfo
;
32 import org
.eclipse
.linuxtools
.internal
.lttng2
.control
.core
.model
.IUstProviderInfo
;
33 import org
.eclipse
.linuxtools
.internal
.lttng2
.control
.core
.model
.LogLevelType
;
34 import org
.eclipse
.linuxtools
.internal
.lttng2
.control
.core
.model
.TraceEventType
;
35 import org
.eclipse
.linuxtools
.internal
.lttng2
.control
.core
.model
.TraceLogLevel
;
36 import org
.eclipse
.linuxtools
.internal
.lttng2
.control
.core
.model
.impl
.BaseEventInfo
;
37 import org
.eclipse
.linuxtools
.internal
.lttng2
.control
.core
.model
.impl
.BufferType
;
38 import org
.eclipse
.linuxtools
.internal
.lttng2
.control
.core
.model
.impl
.ChannelInfo
;
39 import org
.eclipse
.linuxtools
.internal
.lttng2
.control
.core
.model
.impl
.DomainInfo
;
40 import org
.eclipse
.linuxtools
.internal
.lttng2
.control
.core
.model
.impl
.EventInfo
;
41 import org
.eclipse
.linuxtools
.internal
.lttng2
.control
.core
.model
.impl
.FieldInfo
;
42 import org
.eclipse
.linuxtools
.internal
.lttng2
.control
.core
.model
.impl
.ProbeEventInfo
;
43 import org
.eclipse
.linuxtools
.internal
.lttng2
.control
.core
.model
.impl
.SessionInfo
;
44 import org
.eclipse
.linuxtools
.internal
.lttng2
.control
.core
.model
.impl
.SnapshotInfo
;
45 import org
.eclipse
.linuxtools
.internal
.lttng2
.control
.core
.model
.impl
.UstProviderInfo
;
46 import org
.eclipse
.linuxtools
.internal
.lttng2
.control
.ui
.views
.logging
.ControlCommandLogger
;
47 import org
.eclipse
.linuxtools
.internal
.lttng2
.control
.ui
.views
.messages
.Messages
;
48 import org
.eclipse
.linuxtools
.internal
.lttng2
.control
.ui
.views
.preferences
.ControlPreferences
;
49 import org
.eclipse
.linuxtools
.internal
.lttng2
.control
.ui
.views
.remote
.ICommandResult
;
50 import org
.eclipse
.linuxtools
.internal
.lttng2
.control
.ui
.views
.remote
.ICommandShell
;
54 * Service for sending LTTng trace control commands to remote host.
57 * @author Bernd Hufmann
59 public class LTTngControlService
implements ILttngControlService
{
61 // ------------------------------------------------------------------------
63 // ------------------------------------------------------------------------
65 * The command shell implementation
67 private final ICommandShell fCommandShell
;
72 private LttngVersion fVersion
= null;
74 // ------------------------------------------------------------------------
76 // ------------------------------------------------------------------------
82 * - the command shell implementation to use
84 public LTTngControlService(ICommandShell shell
) {
85 fCommandShell
= shell
;
88 // ------------------------------------------------------------------------
90 // ------------------------------------------------------------------------
93 public String
getVersion() {
94 if (fVersion
== null) {
95 return "Unknown"; //$NON-NLS-1$
97 return fVersion
.toString();
101 * Sets the version of the LTTng 2.0 control service.
102 * @param version - a version to set
104 public void setVersion(String version
) {
105 fVersion
= new LttngVersion(version
);
109 public boolean isVersionSupported(String version
) {
110 LttngVersion tmp
= new LttngVersion(version
);
111 return (fVersion
!= null && fVersion
.compareTo(tmp
) >= 0) ?
true : false;
115 * Returns the command shell implementation.
117 * @return the command shell implementation
119 protected ICommandShell
getCommandShell() {
120 return fCommandShell
;
123 // ------------------------------------------------------------------------
125 // ------------------------------------------------------------------------
128 public String
[] getSessionNames(IProgressMonitor monitor
) throws ExecutionException
{
129 StringBuffer command
= createCommand(LTTngControlServiceConstants
.COMMAND_LIST
);
131 ICommandResult result
= executeCommand(command
.toString(), monitor
);
134 // Available tracing sessions:
135 // 1) mysession1 (/home/user/lttng-traces/mysession1-20120123-083928) [inactive]
136 // 2) mysession (/home/user/lttng-traces/mysession-20120123-083318) [inactive]
138 // Use lttng list <session_name> for more details
140 ArrayList
<String
> retArray
= new ArrayList
<>();
142 while (index
< result
.getOutput().length
) {
143 String line
= result
.getOutput()[index
];
144 Matcher matcher
= LTTngControlServiceConstants
.SESSION_PATTERN
.matcher(line
);
145 if (matcher
.matches()) {
146 retArray
.add(matcher
.group(2).trim());
150 return retArray
.toArray(new String
[retArray
.size()]);
154 public ISessionInfo
getSession(String sessionName
, IProgressMonitor monitor
) throws ExecutionException
{
155 StringBuffer command
= createCommand(LTTngControlServiceConstants
.COMMAND_LIST
, sessionName
);
156 ICommandResult result
= executeCommand(command
.toString(), monitor
);
161 // Tracing session mysession2: [inactive]
162 // Trace path: /home/eedbhu/lttng-traces/mysession2-20120123-110330
163 ISessionInfo sessionInfo
= new SessionInfo(sessionName
);
165 while (index
< result
.getOutput().length
) {
166 // Tracing session mysession2: [inactive]
167 // Trace path: /home/eedbhu/lttng-traces/mysession2-20120123-110330
169 // === Domain: Kernel ===
171 String line
= result
.getOutput()[index
];
172 Matcher matcher
= LTTngControlServiceConstants
.TRACE_SESSION_PATTERN
.matcher(line
);
173 if (matcher
.matches()) {
174 sessionInfo
.setSessionState(matcher
.group(2));
179 matcher
= LTTngControlServiceConstants
.TRACE_SNAPSHOT_SESSION_PATTERN
.matcher(line
);
180 if (matcher
.matches()) {
181 sessionInfo
.setSessionState(matcher
.group(2));
182 // real name will be set later
183 ISnapshotInfo snapshotInfo
= new SnapshotInfo(""); //$NON-NLS-1$
184 sessionInfo
.setSnapshotInfo(snapshotInfo
);
189 if (!sessionInfo
.isSnapshotSession()) {
190 matcher
= LTTngControlServiceConstants
.TRACE_NETWORK_PATH_PATTERN
.matcher(line
);
191 if (matcher
.matches()) {
192 sessionInfo
.setStreamedTrace(true);
195 matcher
= LTTngControlServiceConstants
.TRACE_SESSION_PATH_PATTERN
.matcher(line
);
196 if (matcher
.matches()) {
197 sessionInfo
.setSessionPath(matcher
.group(1).trim());
203 matcher
= LTTngControlServiceConstants
.DOMAIN_KERNEL_PATTERN
.matcher(line
);
204 if (matcher
.matches()) {
206 IDomainInfo domainInfo
= new DomainInfo(Messages
.TraceControl_KernelDomainDisplayName
);
209 domainInfo
.setIsKernel(true);
212 ArrayList
<IChannelInfo
> channels
= new ArrayList
<>();
213 index
= parseDomain(result
.getOutput(), index
, channels
, domainInfo
);
215 if (channels
.size() > 0) {
217 sessionInfo
.addDomain(domainInfo
);
220 domainInfo
.setChannels(channels
);
225 matcher
= LTTngControlServiceConstants
.DOMAIN_UST_GLOBAL_PATTERN
.matcher(line
);
226 if (matcher
.matches()) {
227 IDomainInfo domainInfo
= new DomainInfo(Messages
.TraceControl_UstGlobalDomainDisplayName
);
230 domainInfo
.setIsKernel(false);
233 ArrayList
<IChannelInfo
> channels
= new ArrayList
<>();
234 index
= parseDomain(result
.getOutput(), index
, channels
, domainInfo
);
236 if (channels
.size() > 0) {
238 sessionInfo
.addDomain(domainInfo
);
241 domainInfo
.setChannels(channels
);
248 if (sessionInfo
.isSnapshotSession()) {
249 ISnapshotInfo snapshot
= getSnapshotInfo(sessionName
, monitor
);
250 sessionInfo
.setSnapshotInfo(snapshot
);
257 public ISnapshotInfo
getSnapshotInfo(String sessionName
, IProgressMonitor monitor
) throws ExecutionException
{
258 StringBuffer command
= createCommand(LTTngControlServiceConstants
.COMMAND_LIST_SNAPSHOT_OUTPUT
, LTTngControlServiceConstants
.OPTION_SESSION
, sessionName
);
259 ICommandResult result
= executeCommand(command
.toString(), monitor
);
264 // [1] snapshot-1: /home/user/lttng-traces/my-20130909-114431
266 // [3] snapshot-3: net4://172.0.0.1/
267 ISnapshotInfo snapshotInfo
= new SnapshotInfo(""); //$NON-NLS-1$
269 while (index
< result
.getOutput().length
) {
270 String line
= result
.getOutput()[index
];
271 Matcher matcher
= LTTngControlServiceConstants
.LIST_SNAPSHOT_OUTPUT_PATTERN
.matcher(line
);
272 if (matcher
.matches()) {
273 snapshotInfo
.setId(Integer
.valueOf(matcher
.group(1)));
274 snapshotInfo
.setName(matcher
.group(2));
275 snapshotInfo
.setSnapshotPath(matcher
.group(3));
277 Matcher matcher2
= LTTngControlServiceConstants
.SNAPSHOT_NETWORK_PATH_PATTERN
.matcher(snapshotInfo
.getSnapshotPath());
278 if (matcher2
.matches()) {
279 snapshotInfo
.setStreamedSnapshot(true);
292 public List
<IBaseEventInfo
> getKernelProvider(IProgressMonitor monitor
) throws ExecutionException
{
293 StringBuffer command
= createCommand(LTTngControlServiceConstants
.COMMAND_LIST_KERNEL
);
294 ICommandResult result
= executeCommand(command
.toString(), monitor
, false);
296 List
<IBaseEventInfo
> events
= new ArrayList
<>();
298 if (result
.getOutput() != null) {
299 // Ignore the following 2 cases:
300 // Spawning a session daemon
301 // Error: Unable to list kernel events
303 // Error: Unable to list kernel events
306 while (index
< result
.getOutput().length
) {
307 String line
= result
.getOutput()[index
];
308 Matcher matcher
= LTTngControlServiceConstants
.LIST_KERNEL_NO_KERNEL_PROVIDER_PATTERN
.matcher(line
);
309 if (matcher
.matches()) {
316 if (isError(result
)) {
317 throw new ExecutionException(Messages
.TraceControl_CommandError
+ " " + command
.toString() + "\n" + formatOutput(result
)); //$NON-NLS-1$ //$NON-NLS-2$
322 // sched_kthread_stop (type: tracepoint)
323 getProviderEventInfo(result
.getOutput(), 0, events
);
328 public List
<IUstProviderInfo
> getUstProvider() throws ExecutionException
{
329 return getUstProvider(new NullProgressMonitor());
333 public List
<IUstProviderInfo
> getUstProvider(IProgressMonitor monitor
) throws ExecutionException
{
334 StringBuffer command
= createCommand(LTTngControlServiceConstants
.COMMAND_LIST_UST
);
336 if (isVersionSupported("2.1.0")) { //$NON-NLS-1$
337 command
.append(LTTngControlServiceConstants
.OPTION_FIELDS
);
340 ICommandResult result
= executeCommand(command
.toString(), monitor
, false);
341 List
<IUstProviderInfo
> allProviders
= new ArrayList
<>();
343 // Workaround for versions 2.0.x which causes a segmentation fault for this command
344 // if LTTng Tools is compiled without UST support.
345 if (!isVersionSupported("2.1.0") && (result
.getResult() != 0)) { //$NON-NLS-1$
349 if (result
.getOutput() != null) {
350 // Ignore the following 2 cases:
351 // Spawning a session daemon
352 // Error: Unable to list UST events: Listing UST events failed
354 // Error: Unable to list UST events: Listing UST events failed
357 while (index
< result
.getOutput().length
) {
358 String line
= result
.getOutput()[index
];
359 Matcher matcher
= LTTngControlServiceConstants
.LIST_UST_NO_UST_PROVIDER_PATTERN
.matcher(line
);
360 if (matcher
.matches()) {
367 if (isError(result
)) {
368 throw new ExecutionException(Messages
.TraceControl_CommandError
+ " " + command
.toString() + "\n" + formatOutput(result
)); //$NON-NLS-1$ //$NON-NLS-2$
371 // Note that field print-outs exists for version >= 2.1.0
377 // /home/user/git/lttng-ust/tests/hello.cxx/.libs/lt-hello
378 // ust_tests_hello:tptest_sighandler (loglevel: TRACE_EMERG0) (type:
380 // ust_tests_hello:tptest (loglevel: TRACE_EMERG0) (type: tracepoint)
381 // field: doublefield (float)
382 // field: floatfield (float)
383 // field: stringfield (string)
386 // /home/user/git/lttng-ust/tests/hello.cxx/.libs/lt-hello
387 // ust_tests_hello:tptest_sighandler (loglevel: TRACE_EMERG0) (type:
389 // ust_tests_hello:tptest (loglevel: TRACE_EMERG0) (type: tracepoint)
390 // field: doublefield (float)
391 // field: floatfield (float)
392 // field: stringfield (string)
394 IUstProviderInfo provider
= null;
397 while (index
< result
.getOutput().length
) {
398 String line
= result
.getOutput()[index
];
399 Matcher matcher
= LTTngControlServiceConstants
.UST_PROVIDER_PATTERN
.matcher(line
);
400 if (matcher
.matches()) {
401 provider
= new UstProviderInfo(matcher
.group(2).trim());
402 provider
.setPid(Integer
.valueOf(matcher
.group(1).trim()));
403 List
<IBaseEventInfo
> events
= new ArrayList
<>();
404 index
= getProviderEventInfo(result
.getOutput(), ++index
, events
);
405 provider
.setEvents(events
);
406 allProviders
.add(provider
);
415 public ISessionInfo
createSession(ISessionInfo sessionInfo
, IProgressMonitor monitor
) throws ExecutionException
{
416 if (sessionInfo
.isStreamedTrace()) {
417 return createStreamedSession(sessionInfo
, monitor
);
420 String newName
= formatParameter(sessionInfo
.getName());
421 String newPath
= formatParameter(sessionInfo
.getSessionPath());
423 StringBuffer command
= createCommand(LTTngControlServiceConstants
.COMMAND_CREATE_SESSION
, newName
);
425 if (newPath
!= null && !"".equals(newPath
)) { //$NON-NLS-1$
426 command
.append(LTTngControlServiceConstants
.OPTION_OUTPUT_PATH
);
427 command
.append(newPath
);
430 if (sessionInfo
.isSnapshotSession()) {
431 command
.append(LTTngControlServiceConstants
.OPTION_SNAPSHOT
);
434 ICommandResult result
= executeCommand(command
.toString(), monitor
);
436 //Session myssession2 created.
437 //Traces will be written in /home/user/lttng-traces/myssession2-20120209-095418
438 String
[] output
= result
.getOutput();
440 // Get and session name and path
445 while (index
< output
.length
) {
446 String line
= output
[index
];
447 Matcher nameMatcher
= LTTngControlServiceConstants
.CREATE_SESSION_NAME_PATTERN
.matcher(line
);
448 Matcher pathMatcher
= LTTngControlServiceConstants
.CREATE_SESSION_PATH_PATTERN
.matcher(line
);
449 if (nameMatcher
.matches()) {
450 name
= String
.valueOf(nameMatcher
.group(1).trim());
451 } else if (pathMatcher
.matches()) {
452 path
= String
.valueOf(pathMatcher
.group(1).trim());
457 // Verify session name
458 if ((name
== null) || (!"".equals(sessionInfo
.getName()) && !name
.equals(sessionInfo
.getName()))) { //$NON-NLS-1$
459 // Unexpected name returned
460 throw new ExecutionException(Messages
.TraceControl_CommandError
+ " " + command
+ "\n" + //$NON-NLS-1$ //$NON-NLS-2$
461 Messages
.TraceControl_UnexpectedNameError
+ ": " + name
); //$NON-NLS-1$
464 sessionInfo
.setName(name
);
465 // Verify session path
466 if (!sessionInfo
.isSnapshotSession() &&
467 ((path
== null) || ((sessionInfo
.getSessionPath() != null) && (!path
.contains(sessionInfo
.getSessionPath()))))) {
469 throw new ExecutionException(Messages
.TraceControl_CommandError
+ " " + command
+ "\n" + //$NON-NLS-1$ //$NON-NLS-2$
470 Messages
.TraceControl_UnexpectedPathError
+ ": " + name
); //$NON-NLS-1$
473 if (sessionInfo
.isSnapshotSession()) {
474 // Make it a snapshot session - content of snapshot info need to
475 // set afterwards using getSession() or getSnapshotInfo()
476 sessionInfo
.setSnapshotInfo(new SnapshotInfo("")); //$NON-NLS-1$
478 sessionInfo
.setSessionPath(path
);
485 private ISessionInfo
createStreamedSession(ISessionInfo sessionInfo
, IProgressMonitor monitor
) throws ExecutionException
{
487 String newName
= formatParameter(sessionInfo
.getName());
488 StringBuffer command
= createCommand(LTTngControlServiceConstants
.COMMAND_CREATE_SESSION
, newName
);
490 if (sessionInfo
.isSnapshotSession()) {
491 command
.append(LTTngControlServiceConstants
.OPTION_SNAPSHOT
);
494 if (sessionInfo
.getNetworkUrl() != null) {
495 command
.append(LTTngControlServiceConstants
.OPTION_NETWORK_URL
);
496 command
.append(sessionInfo
.getNetworkUrl());
498 command
.append(LTTngControlServiceConstants
.OPTION_CONTROL_URL
);
499 command
.append(sessionInfo
.getControlUrl());
501 command
.append(LTTngControlServiceConstants
.OPTION_DATA_URL
);
502 command
.append(sessionInfo
.getDataUrl());
505 ICommandResult result
= executeCommand(command
.toString(), monitor
);
508 String
[] output
= result
.getOutput();
510 // Get and session name and path
515 while (index
< output
.length
) {
516 String line
= output
[index
];
517 Matcher nameMatcher
= LTTngControlServiceConstants
.CREATE_SESSION_NAME_PATTERN
.matcher(line
);
518 Matcher pathMatcher
= LTTngControlServiceConstants
.CREATE_SESSION_PATH_PATTERN
.matcher(line
);
520 if (nameMatcher
.matches()) {
521 name
= String
.valueOf(nameMatcher
.group(1).trim());
522 } else if (pathMatcher
.matches() && (sessionInfo
.getNetworkUrl() != null)) {
523 path
= String
.valueOf(pathMatcher
.group(1).trim());
528 // Verify session name
529 if ((name
== null) || (!"".equals(sessionInfo
.getName()) && !name
.equals(sessionInfo
.getName()))) { //$NON-NLS-1$
530 // Unexpected name returned
531 throw new ExecutionException(Messages
.TraceControl_CommandError
+ " " + command
+ "\n" + //$NON-NLS-1$ //$NON-NLS-2$
532 Messages
.TraceControl_UnexpectedNameError
+ ": " + name
); //$NON-NLS-1$
535 sessionInfo
.setName(name
);
537 sessionInfo
.setStreamedTrace(true);
539 // Verify session path
540 if (sessionInfo
.getNetworkUrl() != null) {
541 if (!sessionInfo
.isSnapshotSession() && (path
== null)) {
543 throw new ExecutionException(Messages
.TraceControl_CommandError
+ " " + command
+ "\n" + //$NON-NLS-1$ //$NON-NLS-2$
544 Messages
.TraceControl_UnexpectedPathError
+ ": " + name
); //$NON-NLS-1$
547 if (sessionInfo
.isSnapshotSession()) {
548 sessionInfo
.setStreamedTrace(false);
550 sessionInfo
.setSessionPath(path
);
551 // Check file protocol
552 Matcher matcher
= LTTngControlServiceConstants
.TRACE_FILE_PROTOCOL_PATTERN
.matcher(path
);
553 if (matcher
.matches()) {
554 sessionInfo
.setStreamedTrace(false);
559 // When using controlUrl and dataUrl the full session path is not known yet
560 // and will be set later on when listing the session
566 public void destroySession(String sessionName
, IProgressMonitor monitor
) throws ExecutionException
{
567 String newName
= formatParameter(sessionName
);
569 StringBuffer command
= createCommand(LTTngControlServiceConstants
.COMMAND_DESTROY_SESSION
, newName
);
571 ICommandResult result
= executeCommand(command
.toString(), monitor
, false);
572 String
[] output
= result
.getOutput();
574 boolean isError
= isError(result
);
575 if (isError
&& (output
!= null)) {
577 while (index
< output
.length
) {
578 String line
= output
[index
];
579 Matcher matcher
= LTTngControlServiceConstants
.SESSION_NOT_FOUND_ERROR_PATTERN
.matcher(line
);
580 if (matcher
.matches()) {
581 // Don't treat this as an error
589 throw new ExecutionException(Messages
.TraceControl_CommandError
+ " " + command
.toString() + "\n" + formatOutput(result
)); //$NON-NLS-1$ //$NON-NLS-2$
592 //Session <sessionName> destroyed
596 public void startSession(String sessionName
, IProgressMonitor monitor
) throws ExecutionException
{
598 String newSessionName
= formatParameter(sessionName
);
600 StringBuffer command
= createCommand(LTTngControlServiceConstants
.COMMAND_START_SESSION
, newSessionName
);
602 executeCommand(command
.toString(), monitor
);
604 //Session <sessionName> started
608 public void stopSession(String sessionName
, IProgressMonitor monitor
) throws ExecutionException
{
609 String newSessionName
= formatParameter(sessionName
);
610 StringBuffer command
= createCommand(LTTngControlServiceConstants
.COMMAND_STOP_SESSION
, newSessionName
);
612 executeCommand(command
.toString(), monitor
);
614 //Session <sessionName> stopped
619 public void enableChannels(String sessionName
, List
<String
> channelNames
, boolean isKernel
, IChannelInfo info
, IProgressMonitor monitor
) throws ExecutionException
{
621 // no channels to enable
622 if (channelNames
.isEmpty()) {
626 StringBuffer command
= createCommand(LTTngControlServiceConstants
.COMMAND_ENABLE_CHANNEL
);
628 for (Iterator
<String
> iterator
= channelNames
.iterator(); iterator
.hasNext();) {
629 String channel
= iterator
.next();
630 command
.append(channel
);
631 if (iterator
.hasNext()) {
637 command
.append(LTTngControlServiceConstants
.OPTION_KERNEL
);
639 command
.append(LTTngControlServiceConstants
.OPTION_UST
);
642 String newSessionName
= formatParameter(sessionName
);
643 command
.append(LTTngControlServiceConstants
.OPTION_SESSION
);
644 command
.append(newSessionName
);
647 // --discard Discard event when buffers are full (default)
649 // --overwrite Flight recorder mode
650 if (info
.isOverwriteMode()) {
651 command
.append(LTTngControlServiceConstants
.OPTION_OVERWRITE
);
653 // --subbuf-size SIZE Subbuffer size in bytes
654 // (default: 4096, kernel default: 262144)
655 if (info
.getSubBufferSize() != LTTngControlServiceConstants
.UNUSED_VALUE
) {
656 command
.append(LTTngControlServiceConstants
.OPTION_SUB_BUFFER_SIZE
);
657 command
.append(String
.valueOf(info
.getSubBufferSize()));
660 // --num-subbuf NUM Number of subbufers
661 if (info
.getNumberOfSubBuffers() != LTTngControlServiceConstants
.UNUSED_VALUE
) {
662 command
.append(LTTngControlServiceConstants
.OPTION_NUM_SUB_BUFFERS
);
663 command
.append(String
.valueOf(info
.getNumberOfSubBuffers()));
666 // --switch-timer USEC Switch timer interval in usec
667 if (info
.getSwitchTimer() != LTTngControlServiceConstants
.UNUSED_VALUE
) {
668 command
.append(LTTngControlServiceConstants
.OPTION_SWITCH_TIMER
);
669 command
.append(String
.valueOf(info
.getSwitchTimer()));
672 // --read-timer USEC Read timer interval in usec
673 if (info
.getReadTimer() != LTTngControlServiceConstants
.UNUSED_VALUE
) {
674 command
.append(LTTngControlServiceConstants
.OPTION_READ_TIMER
);
675 command
.append(String
.valueOf(info
.getReadTimer()));
678 if (isVersionSupported("2.2.0")) { //$NON-NLS-1$
679 // --buffers-uid Every application sharing the same UID use the same buffers
680 // --buffers-pid Buffers are allocated per PID
682 if (info
.getBufferType() == BufferType
.BUFFER_PER_PID
) {
683 command
.append(LTTngControlServiceConstants
.OPTION_PER_PID_BUFFERS
);
685 } else if (info
.getBufferType() == BufferType
.BUFFER_PER_UID
) {
686 command
.append(LTTngControlServiceConstants
.OPTION_PER_UID_BUFFERS
);
690 // -C SIZE Maximum size of trace files in bytes
691 if (info
.getMaxSizeTraceFiles() != LTTngControlServiceConstants
.UNUSED_VALUE
) {
692 command
.append(LTTngControlServiceConstants
.OPTION_MAX_SIZE_TRACE_FILES
);
693 command
.append(String
.valueOf(info
.getMaxSizeTraceFiles()));
696 // -W NUM Maximum number of trace files
697 if (info
.getMaxNumberTraceFiles() != LTTngControlServiceConstants
.UNUSED_VALUE
) {
698 command
.append(LTTngControlServiceConstants
.OPTION_MAX_TRACE_FILES
);
699 command
.append(String
.valueOf(info
.getMaxNumberTraceFiles()));
704 executeCommand(command
.toString(), monitor
);
709 public void disableChannels(String sessionName
, List
<String
> channelNames
, boolean isKernel
, IProgressMonitor monitor
) throws ExecutionException
{
711 // no channels to enable
712 if (channelNames
.isEmpty()) {
716 StringBuffer command
= createCommand(LTTngControlServiceConstants
.COMMAND_DISABLE_CHANNEL
);
718 for (Iterator
<String
> iterator
= channelNames
.iterator(); iterator
.hasNext();) {
719 String channel
= iterator
.next();
720 command
.append(channel
);
721 if (iterator
.hasNext()) {
727 command
.append(LTTngControlServiceConstants
.OPTION_KERNEL
);
729 command
.append(LTTngControlServiceConstants
.OPTION_UST
);
732 String newSessionName
= formatParameter(sessionName
);
733 command
.append(LTTngControlServiceConstants
.OPTION_SESSION
);
734 command
.append(newSessionName
);
736 executeCommand(command
.toString(), monitor
);
740 public void enableEvents(String sessionName
, String channelName
, List
<String
> eventNames
, boolean isKernel
, String filterExpression
, IProgressMonitor monitor
) throws ExecutionException
{
742 StringBuffer command
= createCommand(LTTngControlServiceConstants
.COMMAND_ENABLE_EVENT
);
744 if (eventNames
== null || eventNames
.isEmpty()) {
745 command
.append(LTTngControlServiceConstants
.OPTION_ALL
);
748 StringBuffer eventNameParameter
= new StringBuffer();
749 for (Iterator
<String
> iterator
= eventNames
.iterator(); iterator
.hasNext();) {
750 String event
= iterator
.next();
751 eventNameParameter
.append(event
);
752 if (iterator
.hasNext()) {
753 eventNameParameter
.append(',');
756 command
.append(formatParameter(eventNameParameter
.toString()));
760 command
.append(LTTngControlServiceConstants
.OPTION_KERNEL
);
762 command
.append(LTTngControlServiceConstants
.OPTION_UST
);
765 String newSessionName
= formatParameter(sessionName
);
767 command
.append(LTTngControlServiceConstants
.OPTION_SESSION
);
768 command
.append(newSessionName
);
770 if (channelName
!= null) {
771 command
.append(LTTngControlServiceConstants
.OPTION_CHANNEL
);
772 command
.append(channelName
);
775 command
.append(LTTngControlServiceConstants
.OPTION_TRACEPOINT
);
777 if (filterExpression
!= null) {
778 command
.append(LTTngControlServiceConstants
.OPTION_FILTER
);
779 command
.append('\'');
780 command
.append(filterExpression
);
781 command
.append('\'');
784 executeCommand(command
.toString(), monitor
);
789 public void enableSyscalls(String sessionName
, String channelName
, IProgressMonitor monitor
) throws ExecutionException
{
791 StringBuffer command
= createCommand(LTTngControlServiceConstants
.COMMAND_ENABLE_EVENT
);
793 command
.append(LTTngControlServiceConstants
.OPTION_ALL
);
794 command
.append(LTTngControlServiceConstants
.OPTION_KERNEL
);
796 String newSessionName
= formatParameter(sessionName
);
798 command
.append(LTTngControlServiceConstants
.OPTION_SESSION
);
799 command
.append(newSessionName
);
801 if (channelName
!= null) {
802 command
.append(LTTngControlServiceConstants
.OPTION_CHANNEL
);
803 command
.append(channelName
);
806 command
.append(LTTngControlServiceConstants
.OPTION_SYSCALL
);
808 executeCommand(command
.toString(), monitor
);
812 public void enableProbe(String sessionName
, String channelName
, String eventName
, boolean isFunction
, String probe
, IProgressMonitor monitor
) throws ExecutionException
{
813 StringBuffer command
= createCommand(LTTngControlServiceConstants
.COMMAND_ENABLE_EVENT
);
815 command
.append(eventName
);
816 command
.append(LTTngControlServiceConstants
.OPTION_KERNEL
);
818 String newSessionName
= formatParameter(sessionName
);
819 command
.append(LTTngControlServiceConstants
.OPTION_SESSION
);
820 command
.append(newSessionName
);
822 if (channelName
!= null) {
823 command
.append(LTTngControlServiceConstants
.OPTION_CHANNEL
);
824 command
.append(channelName
);
827 command
.append(LTTngControlServiceConstants
.OPTION_FUNCTION_PROBE
);
829 command
.append(LTTngControlServiceConstants
.OPTION_PROBE
);
832 command
.append(probe
);
834 executeCommand(command
.toString(), monitor
);
838 public void enableLogLevel(String sessionName
, String channelName
, String eventName
, LogLevelType logLevelType
, TraceLogLevel level
, String filterExpression
, IProgressMonitor monitor
) throws ExecutionException
{
839 StringBuffer command
= createCommand(LTTngControlServiceConstants
.COMMAND_ENABLE_EVENT
);
841 command
.append(eventName
);
842 command
.append(LTTngControlServiceConstants
.OPTION_UST
);
844 String newSessionName
= formatParameter(sessionName
);
845 command
.append(LTTngControlServiceConstants
.OPTION_SESSION
);
846 command
.append(newSessionName
);
848 if (channelName
!= null) {
849 command
.append(LTTngControlServiceConstants
.OPTION_CHANNEL
);
850 command
.append(channelName
);
853 if (logLevelType
== LogLevelType
.LOGLEVEL
) {
854 command
.append(LTTngControlServiceConstants
.OPTION_LOGLEVEL
);
855 } else if (logLevelType
== LogLevelType
.LOGLEVEL_ONLY
) {
856 command
.append(LTTngControlServiceConstants
.OPTION_LOGLEVEL_ONLY
);
861 command
.append(level
.getInName());
863 executeCommand(command
.toString(), monitor
);
867 public void disableEvent(String sessionName
, String channelName
, List
<String
> eventNames
, boolean isKernel
, IProgressMonitor monitor
) throws ExecutionException
{
868 StringBuffer command
= createCommand(LTTngControlServiceConstants
.COMMAND_DISABLE_EVENT
);
870 if (eventNames
== null) {
871 command
.append(LTTngControlServiceConstants
.OPTION_ALL
);
873 // no events to disable
874 if (eventNames
.isEmpty()) {
878 StringBuffer eventNameParameter
= new StringBuffer();
879 for (Iterator
<String
> iterator
= eventNames
.iterator(); iterator
.hasNext();) {
880 String event
= iterator
.next();
881 eventNameParameter
.append(event
);
882 if (iterator
.hasNext()) {
883 eventNameParameter
.append(',');
886 command
.append(formatParameter(eventNameParameter
.toString()));
890 command
.append(LTTngControlServiceConstants
.OPTION_KERNEL
);
892 command
.append(LTTngControlServiceConstants
.OPTION_UST
);
895 String newSessionName
= formatParameter(sessionName
);
896 command
.append(LTTngControlServiceConstants
.OPTION_SESSION
);
897 command
.append(newSessionName
);
899 if (channelName
!= null) {
900 command
.append(LTTngControlServiceConstants
.OPTION_CHANNEL
);
901 command
.append(channelName
);
904 executeCommand(command
.toString(), monitor
);
908 public List
<String
> getContextList(IProgressMonitor monitor
) throws ExecutionException
{
910 StringBuffer command
= createCommand(LTTngControlServiceConstants
.COMMAND_ADD_CONTEXT
, LTTngControlServiceConstants
.OPTION_HELP
);
912 ICommandResult result
= executeCommand(command
.toString(), monitor
);
914 String
[] output
= result
.getOutput();
916 List
<String
> contexts
= new ArrayList
<>(0);
919 boolean inList
= false;
920 while (index
< output
.length
) {
921 String line
= result
.getOutput()[index
];
923 Matcher startMatcher
= LTTngControlServiceConstants
.ADD_CONTEXT_HELP_CONTEXTS_INTRO
.matcher(line
);
924 Matcher endMatcher
= LTTngControlServiceConstants
.ADD_CONTEXT_HELP_CONTEXTS_END_LINE
.matcher(line
);
926 if (startMatcher
.matches()) {
928 } else if (endMatcher
.matches()) {
930 } else if (inList
== true) {
931 String
[] tmp
= line
.split(","); //$NON-NLS-1$
932 for (int i
= 0; i
< tmp
.length
; i
++) {
933 contexts
.add(tmp
[i
].trim());
942 public void addContexts(String sessionName
, String channelName
, String eventName
, boolean isKernel
, List
<String
> contextNames
, IProgressMonitor monitor
) throws ExecutionException
{
943 StringBuffer command
= createCommand(LTTngControlServiceConstants
.COMMAND_ADD_CONTEXT
);
945 String newSessionName
= formatParameter(sessionName
);
946 command
.append(LTTngControlServiceConstants
.OPTION_SESSION
);
947 command
.append(newSessionName
);
949 if (channelName
!= null) {
950 command
.append(LTTngControlServiceConstants
.OPTION_CHANNEL
);
951 command
.append(channelName
);
954 if (eventName
!= null) {
955 command
.append(LTTngControlServiceConstants
.OPTION_EVENT
);
956 command
.append(eventName
);
960 command
.append(LTTngControlServiceConstants
.OPTION_KERNEL
);
962 command
.append(LTTngControlServiceConstants
.OPTION_UST
);
965 for (Iterator
<String
> iterator
= contextNames
.iterator(); iterator
.hasNext();) {
966 String context
= iterator
.next();
967 command
.append(LTTngControlServiceConstants
.OPTION_CONTEXT_TYPE
);
968 command
.append(context
);
971 executeCommand(command
.toString(), monitor
);
976 public void calibrate(boolean isKernel
, IProgressMonitor monitor
) throws ExecutionException
{
977 StringBuffer command
= createCommand(LTTngControlServiceConstants
.COMMAND_CALIBRATE
);
980 command
.append(LTTngControlServiceConstants
.OPTION_KERNEL
);
982 command
.append(LTTngControlServiceConstants
.OPTION_UST
);
985 command
.append(LTTngControlServiceConstants
.OPTION_FUNCTION_PROBE
);
987 executeCommand(command
.toString(), monitor
);
991 public void recordSnapshot(String sessionName
, IProgressMonitor monitor
)
992 throws ExecutionException
{
993 StringBuffer command
= createCommand(LTTngControlServiceConstants
.COMMAND_RECORD_SNAPSHOT
);
995 String newSessionName
= formatParameter(sessionName
);
996 command
.append(LTTngControlServiceConstants
.OPTION_SESSION
);
997 command
.append(newSessionName
);
999 executeCommand(command
.toString(), monitor
);
1003 public void runCommands(IProgressMonitor monitor
, List
<String
> commands
) throws ExecutionException
{
1004 for (String command
: commands
) {
1005 if (monitor
.isCanceled()) {
1009 if (command
.isEmpty() || command
.startsWith("#")) { //$NON-NLS-1$
1012 executeCommand(command
, monitor
);
1016 // ------------------------------------------------------------------------
1018 // ------------------------------------------------------------------------
1021 * Checks if command result is an error result.
1024 * - the command result to check
1025 * @return true if error else false
1027 protected boolean isError(ICommandResult result
) {
1028 // Check return code and length of returned strings
1029 if ((result
.getResult()) != 0 || (result
.getOutput().length
< 1)) {
1033 // Look for error pattern
1035 while (index
< result
.getOutput().length
) {
1036 String line
= result
.getOutput()[index
];
1037 Matcher matcher
= LTTngControlServiceConstants
.ERROR_PATTERN
.matcher(line
);
1038 if (matcher
.matches()) {
1048 * Formats the output string as single string.
1052 * @return - the formatted output
1054 public static String
formatOutput(ICommandResult result
) {
1055 if ((result
== null) || result
.getOutput() == null || result
.getOutput().length
== 0) {
1056 return ""; //$NON-NLS-1$
1058 String
[] output
= result
.getOutput();
1059 StringBuffer ret
= new StringBuffer();
1060 ret
.append("Return Value: "); //$NON-NLS-1$
1061 ret
.append(result
.getResult());
1062 ret
.append("\n"); //$NON-NLS-1$
1063 for (int i
= 0; i
< output
.length
; i
++) {
1064 ret
.append(output
[i
]).append("\n"); //$NON-NLS-1$
1066 return ret
.toString();
1070 * Parses the domain information.
1073 * - a command output array
1074 * @param currentIndex
1075 * - current index in command output array
1077 * - list for returning channel information
1079 * - The domain information
1080 * @return the new current index in command output array
1082 protected int parseDomain(String
[] output
, int currentIndex
, List
<IChannelInfo
> channels
, IDomainInfo domainInfo
) {
1083 int index
= currentIndex
;
1085 // if kernel set the buffer type to shared
1086 if (domainInfo
.isKernel()) {
1087 domainInfo
.setBufferType(BufferType
.BUFFER_SHARED
);
1092 // - channnel1: [enabled]
1095 // overwrite mode: 0
1096 // subbufers size: 262144
1097 // number of subbufers: 4
1098 // switch timer interval: 0
1099 // read timer interval: 200
1102 while (index
< output
.length
) {
1103 String line
= output
[index
];
1105 if (isVersionSupported("2.2.0")) { //$NON-NLS-1$
1106 Matcher bufferTypeMatcher
= LTTngControlServiceConstants
.BUFFER_TYPE_PATTERN
.matcher(line
);
1107 if (bufferTypeMatcher
.matches()) {
1108 String bufferTypeString
= getAttributeValue(line
);
1109 if (BufferType
.BUFFER_PER_PID
.getInName().equals(bufferTypeString
)) {
1110 domainInfo
.setBufferType(BufferType
.BUFFER_PER_PID
);
1111 } else if (BufferType
.BUFFER_PER_UID
.getInName().equals(bufferTypeString
)) {
1112 domainInfo
.setBufferType(BufferType
.BUFFER_PER_UID
);
1114 domainInfo
.setBufferType(BufferType
.BUFFER_TYPE_UNKNOWN
);
1118 domainInfo
.setBufferType(BufferType
.BUFFER_TYPE_UNKNOWN
);
1120 Matcher outerMatcher
= LTTngControlServiceConstants
.CHANNELS_SECTION_PATTERN
.matcher(line
);
1121 Matcher noKernelChannelMatcher
= LTTngControlServiceConstants
.DOMAIN_NO_KERNEL_CHANNEL_PATTERN
.matcher(line
);
1122 Matcher noUstChannelMatcher
= LTTngControlServiceConstants
.DOMAIN_NO_UST_CHANNEL_PATTERN
.matcher(line
);
1123 if (outerMatcher
.matches()) {
1124 IChannelInfo channelInfo
= null;
1125 while (index
< output
.length
) {
1126 String subLine
= output
[index
];
1128 Matcher innerMatcher
= LTTngControlServiceConstants
.CHANNEL_PATTERN
.matcher(subLine
);
1129 if (innerMatcher
.matches()) {
1130 channelInfo
= new ChannelInfo(""); //$NON-NLS-1$
1132 channelInfo
.setName(innerMatcher
.group(1));
1134 // get channel enablement
1135 channelInfo
.setState(innerMatcher
.group(2));
1138 channelInfo
.setBufferType(domainInfo
.getBufferType());
1141 channels
.add(channelInfo
);
1143 } else if (LTTngControlServiceConstants
.OVERWRITE_MODE_ATTRIBUTE
.matcher(subLine
).matches()) {
1144 String value
= getAttributeValue(subLine
);
1145 if (channelInfo
!= null) {
1146 channelInfo
.setOverwriteMode(!LTTngControlServiceConstants
.OVERWRITE_MODE_ATTRIBUTE_FALSE
.equals(value
));
1148 } else if (LTTngControlServiceConstants
.SUBBUFFER_SIZE_ATTRIBUTE
.matcher(subLine
).matches()) {
1149 if (channelInfo
!= null) {
1150 channelInfo
.setSubBufferSize(Long
.valueOf(getAttributeValue(subLine
)));
1153 } else if (LTTngControlServiceConstants
.NUM_SUBBUFFERS_ATTRIBUTE
.matcher(subLine
).matches()) {
1154 if (channelInfo
!= null) {
1155 channelInfo
.setNumberOfSubBuffers(Integer
.valueOf(getAttributeValue(subLine
)));
1158 } else if (LTTngControlServiceConstants
.SWITCH_TIMER_ATTRIBUTE
.matcher(subLine
).matches()) {
1159 if (channelInfo
!= null) {
1160 channelInfo
.setSwitchTimer(Long
.valueOf(getAttributeValue(subLine
)));
1163 } else if (LTTngControlServiceConstants
.READ_TIMER_ATTRIBUTE
.matcher(subLine
).matches()) {
1164 if (channelInfo
!= null) {
1165 channelInfo
.setReadTimer(Long
.valueOf(getAttributeValue(subLine
)));
1168 } else if (LTTngControlServiceConstants
.OUTPUT_ATTRIBUTE
.matcher(subLine
).matches()) {
1169 if (channelInfo
!= null) {
1170 channelInfo
.setOutputType(getAttributeValue(subLine
));
1173 } else if (LTTngControlServiceConstants
.EVENT_SECTION_PATTERN
.matcher(subLine
).matches()) {
1174 List
<IEventInfo
> events
= new ArrayList
<>();
1175 index
= parseEvents(output
, index
, events
);
1176 if (channelInfo
!= null) {
1177 channelInfo
.setEvents(events
);
1179 // we want to stay at the current index to be able to
1182 } else if (LTTngControlServiceConstants
.DOMAIN_KERNEL_PATTERN
.matcher(subLine
).matches()) {
1185 } else if (LTTngControlServiceConstants
.DOMAIN_UST_GLOBAL_PATTERN
.matcher(subLine
).matches()) {
1190 } else if (noKernelChannelMatcher
.matches() || noUstChannelMatcher
.matches()) {
1191 // domain indicates that no channels were found -> return
1201 * Parses the event information within a domain.
1204 * - a command output array
1205 * @param currentIndex
1206 * - current index in command output array
1208 * - list for returning event information
1209 * @return the new current index in command output array
1211 protected int parseEvents(String
[] output
, int currentIndex
, List
<IEventInfo
> events
) {
1212 int index
= currentIndex
;
1214 while (index
< output
.length
) {
1215 String line
= output
[index
];
1216 if (LTTngControlServiceConstants
.CHANNEL_PATTERN
.matcher(line
).matches()) {
1219 } else if (LTTngControlServiceConstants
.DOMAIN_KERNEL_PATTERN
.matcher(line
).matches()) {
1222 } else if (LTTngControlServiceConstants
.DOMAIN_UST_GLOBAL_PATTERN
.matcher(line
).matches()) {
1227 Matcher matcher
= LTTngControlServiceConstants
.EVENT_PATTERN
.matcher(line
);
1228 Matcher matcher2
= LTTngControlServiceConstants
.WILDCARD_EVENT_PATTERN
.matcher(line
);
1230 if (matcher
.matches()) {
1231 IEventInfo eventInfo
= new EventInfo(matcher
.group(1).trim());
1232 eventInfo
.setLogLevelType(matcher
.group(2).trim());
1233 eventInfo
.setLogLevel(matcher
.group(3).trim());
1234 eventInfo
.setEventType(matcher
.group(4).trim());
1235 eventInfo
.setState(matcher
.group(5));
1236 String filter
= matcher
.group(6);
1237 if (filter
!= null) {
1238 filter
= filter
.substring(1, filter
.length() - 1); // remove '[' and ']'
1239 eventInfo
.setFilterExpression(filter
);
1241 events
.add(eventInfo
);
1243 } else if (matcher2
.matches()) {
1244 IEventInfo eventInfo
= new EventInfo(matcher2
.group(1).trim());
1245 eventInfo
.setLogLevel(TraceLogLevel
.LEVEL_UNKNOWN
);
1246 eventInfo
.setEventType(matcher2
.group(2).trim());
1247 eventInfo
.setState(matcher2
.group(3));
1248 String filter
= matcher2
.group(4);
1249 if (filter
!= null) {
1250 filter
= filter
.substring(1, filter
.length() - 1); // remove '[' and ']'
1251 eventInfo
.setFilterExpression(filter
);
1254 if ((eventInfo
.getEventType() == TraceEventType
.PROBE
) ||
1255 (eventInfo
.getEventType() == TraceEventType
.FUNCTION
)){
1256 IProbeEventInfo probeEvent
= new ProbeEventInfo(eventInfo
.getName());
1257 probeEvent
.setLogLevel(eventInfo
.getLogLevel());
1258 probeEvent
.setEventType(eventInfo
.getEventType());
1259 probeEvent
.setState(eventInfo
.getState());
1261 // Overwrite eventinfo
1262 eventInfo
= probeEvent
;
1264 // myevent2 (type: probe) [enabled]
1266 // myevent0 (type: function) [enabled]
1268 // symbol: init_post
1270 while (index
< output
.length
) {
1271 String probeLine
= output
[index
];
1273 Matcher addrMatcher
= LTTngControlServiceConstants
.PROBE_ADDRESS_PATTERN
.matcher(probeLine
);
1274 Matcher offsetMatcher
= LTTngControlServiceConstants
.PROBE_OFFSET_PATTERN
.matcher(probeLine
);
1275 Matcher symbolMatcher
= LTTngControlServiceConstants
.PROBE_SYMBOL_PATTERN
.matcher(probeLine
);
1276 if (addrMatcher
.matches()) {
1277 String addr
= addrMatcher
.group(2).trim();
1278 probeEvent
.setAddress(addr
);
1279 } else if (offsetMatcher
.matches()) {
1280 String offset
= offsetMatcher
.group(2).trim();
1281 probeEvent
.setOffset(offset
);
1282 } else if (symbolMatcher
.matches()) {
1283 String symbol
= symbolMatcher
.group(2).trim();
1284 probeEvent
.setSymbol(symbol
);
1285 } else if ((LTTngControlServiceConstants
.EVENT_PATTERN
.matcher(probeLine
).matches()) || (LTTngControlServiceConstants
.WILDCARD_EVENT_PATTERN
.matcher(probeLine
).matches())) {
1287 } else if (LTTngControlServiceConstants
.CHANNEL_PATTERN
.matcher(probeLine
).matches()) {
1289 } else if (LTTngControlServiceConstants
.DOMAIN_KERNEL_PATTERN
.matcher(probeLine
).matches()) {
1292 } else if (LTTngControlServiceConstants
.DOMAIN_UST_GLOBAL_PATTERN
.matcher(probeLine
).matches()) {
1298 events
.add(eventInfo
);
1300 events
.add(eventInfo
);
1313 * Parses a line with attributes: <attribute Name>: <attribute value>
1316 * - attribute line to parse
1317 * @return the attribute value as string
1319 protected String
getAttributeValue(String line
) {
1320 String
[] temp
= line
.split("\\: "); //$NON-NLS-1$
1325 * Parses the event information within a provider.
1328 * - a command output array
1329 * @param currentIndex
1330 * - current index in command output array
1332 * - list for returning event information
1333 * @return the new current index in command output array
1335 protected int getProviderEventInfo(String
[] output
, int currentIndex
, List
<IBaseEventInfo
> events
) {
1336 int index
= currentIndex
;
1337 IBaseEventInfo eventInfo
= null;
1338 while (index
< output
.length
) {
1339 String line
= output
[index
];
1340 Matcher matcher
= LTTngControlServiceConstants
.PROVIDER_EVENT_PATTERN
.matcher(line
);
1341 if (matcher
.matches()) {
1342 // sched_kthread_stop (loglevel: TRACE_EMERG0) (type: tracepoint)
1343 eventInfo
= new BaseEventInfo(matcher
.group(1).trim());
1344 eventInfo
.setLogLevel(matcher
.group(2).trim());
1345 eventInfo
.setEventType(matcher
.group(3).trim());
1346 events
.add(eventInfo
);
1348 } else if (LTTngControlServiceConstants
.EVENT_FIELD_PATTERN
.matcher(line
).matches()) {
1349 if (eventInfo
!= null) {
1350 List
<IFieldInfo
> fields
= new ArrayList
<>();
1351 index
= getFieldInfo(output
, index
, fields
);
1352 eventInfo
.setFields(fields
);
1357 else if (LTTngControlServiceConstants
.UST_PROVIDER_PATTERN
.matcher(line
).matches()) {
1368 * Parse a field's information.
1371 * A command output array
1372 * @param currentIndex
1373 * The current index in the command output array
1375 * List for returning the field information
1376 * @return The new current index in the command output array
1378 protected int getFieldInfo(String
[] output
, int currentIndex
, List
<IFieldInfo
> fields
) {
1379 int index
= currentIndex
;
1380 IFieldInfo fieldInfo
= null;
1381 while (index
< output
.length
) {
1382 String line
= output
[index
];
1383 Matcher matcher
= LTTngControlServiceConstants
.EVENT_FIELD_PATTERN
.matcher(line
);
1384 if (matcher
.matches()) {
1385 // field: content (string)
1386 fieldInfo
= new FieldInfo(matcher
.group(2).trim());
1387 fieldInfo
.setFieldType(matcher
.group(3).trim());
1388 fields
.add(fieldInfo
);
1389 } else if (LTTngControlServiceConstants
.PROVIDER_EVENT_PATTERN
.matcher(line
).matches()) {
1391 } else if (LTTngControlServiceConstants
.UST_PROVIDER_PATTERN
.matcher(line
).matches()) {
1400 * Formats a command parameter for the command execution i.e. adds quotes
1401 * at the beginning and end if necessary.
1402 * @param parameter - parameter to format
1403 * @return formated parameter
1405 protected String
formatParameter(String parameter
) {
1406 if (parameter
!= null) {
1407 StringBuffer newString
= new StringBuffer();
1408 newString
.append(parameter
);
1410 if (parameter
.contains(" ") || parameter
.contains("*")) { //$NON-NLS-1$ //$NON-NLS-2$
1411 newString
.insert(0, "\""); //$NON-NLS-1$
1412 newString
.append("\""); //$NON-NLS-1$
1414 return newString
.toString();
1420 * @param strings array of string that makes up a command line
1421 * @return string buffer with created command line
1423 protected StringBuffer
createCommand(String
... strings
) {
1424 StringBuffer command
= new StringBuffer();
1425 command
.append(LTTngControlServiceConstants
.CONTROL_COMMAND
);
1426 command
.append(getTracingGroupOption());
1427 command
.append(getVerboseOption());
1428 for (String string
: strings
) {
1429 command
.append(string
);
1435 * @return the tracing group option if configured in the preferences
1437 protected String
getTracingGroupOption() {
1438 if (!ControlPreferences
.getInstance().isDefaultTracingGroup() && !ControlPreferences
.getInstance().getTracingGroup().equals("")) { //$NON-NLS-1$
1439 return LTTngControlServiceConstants
.OPTION_TRACING_GROUP
+ ControlPreferences
.getInstance().getTracingGroup();
1441 return ""; //$NON-NLS-1$
1445 * @return the verbose option as configured in the preferences
1447 protected String
getVerboseOption() {
1448 if (ControlPreferences
.getInstance().isLoggingEnabled()) {
1449 String level
= ControlPreferences
.getInstance().getVerboseLevel();
1450 if (ControlPreferences
.TRACE_CONTROL_VERBOSE_LEVEL_VERBOSE
.equals(level
)) {
1451 return LTTngControlServiceConstants
.OPTION_VERBOSE
;
1453 if (ControlPreferences
.TRACE_CONTROL_VERBOSE_LEVEL_V_VERBOSE
.equals(level
)) {
1454 return LTTngControlServiceConstants
.OPTION_VERY_VERBOSE
;
1456 if (ControlPreferences
.TRACE_CONTROL_VERBOSE_LEVEL_V_V_VERBOSE
.equals(level
)) {
1457 return LTTngControlServiceConstants
.OPTION_VERY_VERY_VERBOSE
;
1460 return ""; //$NON-NLS-1$
1464 * Method that logs the command and command result if logging is enabled as
1465 * well as forwards the command execution to the shell.
1468 * - the command to execute
1470 * - a progress monitor
1471 * @return the command result
1472 * @throws ExecutionException
1473 * If the command fails
1475 protected ICommandResult
executeCommand(String command
,
1476 IProgressMonitor monitor
) throws ExecutionException
{
1477 return executeCommand(command
, monitor
, true);
1481 * Method that logs the command and command result if logging is enabled as
1482 * well as forwards the command execution to the shell.
1485 * - the command to execute
1487 * - a progress monitor
1488 * @param checkForError
1489 * - true to verify command result, else false
1490 * @return the command result
1491 * @throws ExecutionException
1492 * in case of error result
1494 protected ICommandResult
executeCommand(String command
,
1495 IProgressMonitor monitor
, boolean checkForError
)
1496 throws ExecutionException
{
1497 if (ControlPreferences
.getInstance().isLoggingEnabled()) {
1498 ControlCommandLogger
.log(command
);
1501 ICommandResult result
= fCommandShell
.executeCommand(
1502 command
.toString(), monitor
);
1504 if (ControlPreferences
.getInstance().isLoggingEnabled()) {
1505 ControlCommandLogger
.log(formatOutput(result
));
1508 if (checkForError
&& isError(result
)) {
1509 throw new ExecutionException(Messages
.TraceControl_CommandError
1510 + " " + command
.toString() + "\n" + formatOutput(result
)); //$NON-NLS-1$ //$NON-NLS-2$