blob: f13f76e03c18fa961b0e8c20c1f65eb3a5d73828 [file] [log] [blame]
# Copyright (c) 2013 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import logging
import os
import subprocess
import sys
from telemetry.core import util
from telemetry.core.platform import posix_platform_backend
from telemetry.core.platform import proc_supporting_platform_backend
from telemetry.page import cloud_storage
class LinuxPlatformBackend(
posix_platform_backend.PosixPlatformBackend,
proc_supporting_platform_backend.ProcSupportingPlatformBackend):
def StartRawDisplayFrameRateMeasurement(self):
raise NotImplementedError()
def StopRawDisplayFrameRateMeasurement(self):
raise NotImplementedError()
def GetRawDisplayFrameRateMeasurements(self):
raise NotImplementedError()
def IsThermallyThrottled(self):
raise NotImplementedError()
def HasBeenThermallyThrottled(self):
raise NotImplementedError()
def GetOSName(self):
return 'linux'
def CanFlushIndividualFilesFromSystemCache(self):
return True
def FlushEntireSystemCache(self):
p = subprocess.Popen(['/sbin/sysctl', '-w', 'vm.drop_caches=3'])
p.wait()
assert p.returncode == 0, 'Failed to flush system cache'
def CanLaunchApplication(self, application):
if application == 'ipfw' and not self._IsIpfwKernelModuleInstalled():
return False
return super(LinuxPlatformBackend, self).CanLaunchApplication(application)
def InstallApplication(self, application):
if application == 'ipfw':
self._InstallIpfw()
elif application == 'avconv':
self._InstallAvconv()
else:
raise NotImplementedError(
'Please teach Telemetry how to install ' + application)
def _IsIpfwKernelModuleInstalled(self):
return 'ipfw_mod' in subprocess.Popen(
['lsmod'], stdout=subprocess.PIPE).communicate()[0]
def _InstallIpfw(self):
ipfw_bin = os.path.join(util.GetTelemetryDir(), 'bin', 'ipfw')
ipfw_mod = os.path.join(util.GetTelemetryDir(), 'bin', 'ipfw_mod.ko')
try:
changed = cloud_storage.GetIfChanged(
cloud_storage.INTERNAL_BUCKET, ipfw_bin)
changed |= cloud_storage.GetIfChanged(
cloud_storage.INTERNAL_BUCKET, ipfw_mod)
except cloud_storage.CloudStorageError, e:
logging.error(e)
logging.error('You may proceed by manually installing dummynet. See: '
'http://info.iet.unipi.it/~luigi/dummynet/')
sys.exit(1)
if changed or not self.CanLaunchApplication('ipfw'):
if not self._IsIpfwKernelModuleInstalled():
subprocess.check_call(['sudo', 'insmod', ipfw_mod])
os.chmod(ipfw_bin, 0755)
subprocess.check_call(['sudo', 'cp', ipfw_bin, '/usr/local/sbin'])
assert self.CanLaunchApplication('ipfw'), 'Failed to install ipfw'
def _InstallAvconv(self):
telemetry_bin_dir = os.path.join(util.GetTelemetryDir(), 'bin')
avconv_bin = os.path.join(telemetry_bin_dir, 'avconv')
os.environ['PATH'] += os.pathsep + telemetry_bin_dir
try:
cloud_storage.GetIfChanged(cloud_storage.INTERNAL_BUCKET, avconv_bin)
except cloud_storage.CloudStorageError, e:
logging.error(e)
logging.error('You may proceed by manually installing avconv via:\n'
'sudo apt-get install libav-tools')
sys.exit(1)
assert self.CanLaunchApplication('avconv'), 'Failed to install avconv'