+
+ 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(
+ ipfw_bin, cloud_storage.INTERNAL_BUCKET)
+ changed |= cloud_storage.GetIfChanged(
+ ipfw_mod, cloud_storage.INTERNAL_BUCKET)
+ 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(avconv_bin, cloud_storage.INTERNAL_BUCKET)
+ 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'