Index: chrome/test/pyautolib/chromeos/suid_actions.py |
=================================================================== |
--- chrome/test/pyautolib/chromeos/suid_actions.py (revision 261231) |
+++ chrome/test/pyautolib/chromeos/suid_actions.py (working copy) |
@@ -1,153 +0,0 @@ |
-#!/usr/bin/env python |
-# Copyright (c) 2012 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. |
- |
-"""Helper script to perform actions as a super-user on ChromeOS. |
- |
-Needs to be run with superuser privileges, typically using the |
-suid_python binary. |
- |
-Usage: |
- sudo python suid_actions.py --action=CleanFlimflamDirs |
-""" |
- |
-import optparse |
-import os |
-import shutil |
-import subprocess |
-import sys |
-import time |
- |
-sys.path.append('/usr/local') # to import autotest libs. |
-from autotest.cros import constants |
-from autotest.cros import cryptohome |
- |
-TEMP_BACKCHANNEL_FILE = '/tmp/pyauto_network_backchannel_file' |
- |
- |
-class SuidAction(object): |
- """Helper to perform some super-user actions on ChromeOS.""" |
- |
- def _ParseArgs(self): |
- parser = optparse.OptionParser() |
- parser.add_option( |
- '-a', '--action', help='Action to perform.') |
- self._options = parser.parse_args()[0] |
- if not self._options.action: |
- raise RuntimeError('No action specified.') |
- |
- def Run(self): |
- self._ParseArgs() |
- assert os.geteuid() == 0, 'Needs superuser privileges.' |
- handler = getattr(self, self._options.action) |
- assert handler and callable(handler), \ |
- 'No handler for %s' % self._options.action |
- handler() |
- return 0 |
- |
- ## Actions ## |
- def CleanFlimflamDirs(self): |
- """Clean the contents of all connection manager (shill/flimflam) profiles. |
- """ |
- flimflam_dirs = ['/home/chronos/user/flimflam', |
- '/home/chronos/user/shill', |
- '/var/cache/flimflam', |
- '/var/cache/shill'] |
- |
- # The stop/start flimflam command should stop/start shill respectivly if |
- # enabled. |
- os.system('stop flimflam') |
- try: |
- for flimflam_dir in flimflam_dirs: |
- if not os.path.exists(flimflam_dir): |
- continue |
- for item in os.listdir(flimflam_dir): |
- path = os.path.join(flimflam_dir, item) |
- if os.path.isdir(path): |
- shutil.rmtree(path) |
- else: |
- os.remove(path) |
- finally: |
- os.system('start flimflam') |
- # TODO(stanleyw): crosbug.com/29421 This method should wait until |
- # flimflam/shill is fully initialized and accessible via DBus again. |
- # Otherwise, there is a race conditions and subsequent accesses to |
- # flimflam/shill may fail. Until this is fixed, waiting for the |
- # resolv.conf file to be created is better than nothing. |
- begin = time.time() |
- while not os.path.exists(constants.RESOLV_CONF_FILE): |
- if time.time() - begin > 10: |
- raise RuntimeError('Timeout while waiting for flimflam/shill start.') |
- time.sleep(.25) |
- |
- def RemoveAllCryptohomeVaults(self): |
- """Remove any existing cryptohome vaults.""" |
- cryptohome.remove_all_vaults() |
- |
- def _GetEthInterfaces(self): |
- """Returns a list of the eth* interfaces detected by the device.""" |
- # Assumes ethernet interfaces all have "eth" in the name. |
- import pyudev |
- return sorted([iface.sys_name for iface in |
- pyudev.Context().list_devices(subsystem='net') |
- if 'eth' in iface.sys_name]) |
- |
- def _Renameif(self, old_iface, new_iface, mac_address): |
- """Renames the interface with mac_address from old_iface to new_iface. |
- |
- Args: |
- old_iface: The name of the interface you want to change. |
- new_iface: The name of the interface you want to change to. |
- mac_address: The mac address of the interface being changed. |
- """ |
- subprocess.call(['stop', 'flimflam']) |
- subprocess.call(['ifconfig', old_iface, 'down']) |
- subprocess.call(['nameif', new_iface, mac_address]) |
- subprocess.call(['ifconfig', new_iface, 'up']) |
- subprocess.call(['start', 'flimflam']) |
- |
- # Check and make sure interfaces have been renamed |
- eth_ifaces = self._GetEthInterfaces() |
- if new_iface not in eth_ifaces: |
- raise RuntimeError('Interface %s was not renamed to %s' % |
- (old_iface, new_iface)) |
- elif old_iface in eth_ifaces: |
- raise RuntimeError('Old iface %s is still present' % old_iface) |
- |
- def SetupBackchannel(self): |
- """Renames the connected ethernet interface to eth_test for offline mode |
- testing. Does nothing if no connected interface is found. |
- """ |
- # Return the interface with ethernet connected or returns if none found. |
- for iface in self._GetEthInterfaces(): |
- with open('/sys/class/net/%s/operstate' % iface, 'r') as fp: |
- if 'up' in fp.read(): |
- eth_iface = iface |
- break |
- else: |
- return |
- |
- # Write backup file to be used by TeardownBackchannel to restore the |
- # interface names. |
- with open(TEMP_BACKCHANNEL_FILE, 'w') as fpw: |
- with open('/sys/class/net/%s/address' % eth_iface) as fp: |
- mac_address = fp.read().strip() |
- fpw.write('%s, %s' % (eth_iface, mac_address)) |
- |
- self._Renameif(eth_iface, 'eth_test', mac_address) |
- |
- def TeardownBackchannel(self): |
- """Restores the eth interface names if SetupBackchannel was called.""" |
- if not os.path.isfile(TEMP_BACKCHANNEL_FILE): |
- return |
- |
- with open(TEMP_BACKCHANNEL_FILE, 'r') as fp: |
- eth_iface, mac_address = fp.read().split(',') |
- |
- self._Renameif('eth_test', eth_iface, mac_address) |
- os.remove(TEMP_BACKCHANNEL_FILE) |
- |
- |
-if __name__ == '__main__': |
- sys.exit(SuidAction().Run()) |