#!/usr/bin/python # Copyright (c) 2013 The Chromium OS 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 pprint import sys import common from autotest_lib.client.cros.networking import shill_proxy def usage(): """ Prints a script usage message. """ cmd = sys.argv[0] print 'Usage: %s <command> [more parameters]' % cmd print 'Example uses:' print cmd, 'create <name> - Create a profile called |name|.' print cmd, 'push <name> - Push a previously created profile called |name|.' print cmd, 'pop <name> - Pop a profile called |name|.' print cmd, 'pop - Pop the top-most profile.' print cmd, 'remove <name> - Remove a profile called |name| from disk.' print cmd, 'clean - Pop and remove profiles above the default profile.' print cmd, 'list - List profiles and their properties.' print cmd, 'list-entries - List profile entries.' print cmd, 'delete-entry <entry> [name] - Delete an entry from a ' \ 'profile called |name| or all profiles if no name is given.' return False def print_profile_path(profile_path, active_path): """ Print profile_path and indicate if it is the active profile. """ if profile_path == active_path: print 'Profile: %s <== active' % profile_path else: print 'Profile: %s' % profile_path def clean_profiles(): """ Pop and remove all profiles until 'default' is found. """ shill = shill_proxy.ShillProxy() while True: active_profile = shill.get_active_profile() properties = active_profile.GetProperties(utf8_strings=True) active_name = shill.dbus2primitive( properties[shill.PROFILE_PROPERTY_NAME]) if active_name == 'default': return True else: print 'Removing profile: %s' % active_name shill.manager.PopProfile(active_name) shill.manager.RemoveProfile(active_name) def delete_entry(): """ Remove an entry from the specified profile, or all profiles if no profile is given. """ if len(sys.argv) <= 2: return usage() identifier = sys.argv[2] profile_path = None if len(sys.argv) > 3: profile_path = sys.argv[3] shill = shill_proxy.ShillProxy() properties = shill.dbus2primitive( shill.manager.GetProperties(utf8_strings=True)) active_profile = shill.get_active_profile() for path in properties[shill.MANAGER_PROPERTY_PROFILES]: print_profile_path(path, active_profile.object_path) if profile_path and path != profile_path: continue profile = shill.get_dbus_object(shill.DBUS_TYPE_PROFILE, path) try: profile.DeleteEntry(identifier) print " -> delete succeeded" except: print " -> delete failed" def list_entries(): """ Display detailed profile entry information. """ shill = shill_proxy.ShillProxy() active_profile = shill.get_active_profile() for profile in shill.get_profiles(): print_profile_path(profile.object_path, active_profile.object_path) properties = shill.dbus2primitive( profile.GetProperties(utf8_strings=True)) if not shill.PROFILE_PROPERTY_ENTRIES in properties: continue for ident in properties[shill.PROFILE_PROPERTY_ENTRIES]: print 'Entry: %s' % ident pprint.pprint(shill.dbus2primitive(profile.GetEntry(ident)), indent=2) print return True def list_profiles(): """ List shill profiles and their properties. """ shill = shill_proxy.ShillProxy() active_profile = shill.get_active_profile() for profile in shill.get_profiles(): print_profile_path(profile.object_path, active_profile.object_path) properties = shill.dbus2primitive( profile.GetProperties(utf8_strings=True)) pprint.pprint(properties, indent=2) print return True def main(): """ Main entry point for the profile script. """ if len(sys.argv) < 2: return usage() command = sys.argv[1] shill = shill_proxy.ShillProxy() if command == 'clean': return clean_profiles() if command == 'delete-entry': return delete_entry() if command == 'list': return list_profiles() if command == 'list-entries': return list_entries() if command == 'pop' and len(sys.argv) == 2: shill.manager.PopAnyProfile() print 'Popped profile.' return True # All the remaining operations require a profile name. if len(sys.argv) < 3: return usage() name = sys.argv[2] if command == 'pop': shill.manager.PopProfile(name) print 'Popped profile %s.' % name return True if command == 'create': path = shill.manager.CreateProfile(name) print 'New profile created at %s.' % path return True if command == 'push': path = shill.manager.PushProfile(name) print 'Pushed profile %s.' % path return True if command == 'remove': shill.manager.RemoveProfile(name) print 'Removed profile %s.' % name return True return usage() if __name__ == '__main__': if not main(): sys.exit(1)