Sm.java revision 7d2af54a98358e9dea96f879ebd1ea915263522b
17d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey/*
27d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey * Copyright (C) 2015 The Android Open Source Project
37d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey *
47d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey * Licensed under the Apache License, Version 2.0 (the "License");
57d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey * you may not use this file except in compliance with the License.
67d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey * You may obtain a copy of the License at
77d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey *
87d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey *      http://www.apache.org/licenses/LICENSE-2.0
97d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey *
107d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey * Unless required by applicable law or agreed to in writing, software
117d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey * distributed under the License is distributed on an "AS IS" BASIS,
127d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey * See the License for the specific language governing permissions and
147d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey * limitations under the License.
157d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey */
167d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey
177d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkeypackage com.android.commands.sm;
187d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey
197d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkeyimport android.os.RemoteException;
207d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkeyimport android.os.ServiceManager;
217d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkeyimport android.os.storage.DiskInfo;
227d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkeyimport android.os.storage.IMountService;
237d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkeyimport android.os.storage.VolumeInfo;
247d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkeyimport android.util.Log;
257d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey
267d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkeypublic final class Sm {
277d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey    private static final String TAG = "Sm";
287d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey
297d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey    IMountService mSm;
307d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey
317d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey    private String[] mArgs;
327d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey    private int mNextArg;
337d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey    private String mCurArgData;
347d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey
357d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey    public static void main(String[] args) {
367d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        boolean success = false;
377d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        try {
387d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            new Sm().run(args);
397d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            success = true;
407d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        } catch (Exception e) {
417d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            if (e instanceof IllegalArgumentException) {
427d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey                showUsage();
437d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            }
447d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            Log.e(TAG, "Error", e);
457d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            System.err.println("Error: " + e);
467d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        }
477d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        System.exit(success ? 0 : 1);
487d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey    }
497d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey
507d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey    public void run(String[] args) throws Exception {
517d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        if (args.length < 1) {
527d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            throw new IllegalArgumentException();
537d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        }
547d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey
557d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        mSm = IMountService.Stub.asInterface(ServiceManager.getService("mount"));
567d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        if (mSm == null) {
577d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            throw new RemoteException("Failed to find running mount service");
587d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        }
597d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey
607d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        mArgs = args;
617d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        String op = args[0];
627d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        mNextArg = 1;
637d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey
647d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        if ("list-disks".equals(op)) {
657d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            runListDisks();
667d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        } else if ("list-volumes".equals(op)) {
677d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            runListVolumes();
687d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        } else if ("get-primary-storage-uuid".equals(op)) {
697d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            runGetPrimaryStorageUuid();
707d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        } else if ("partition".equals(op)) {
717d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            runPartition();
727d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        } else if ("mount".equals(op)) {
737d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            runMount();
747d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        } else if ("unmount".equals(op)) {
757d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            runUnmount();
767d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        } else if ("format".equals(op)) {
777d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            runFormat();
787d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        } else if ("forget".equals(op)) {
797d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            runForget();
807d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        } else {
817d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            throw new IllegalArgumentException();
827d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        }
837d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey    }
847d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey
857d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey    public void runListDisks() throws RemoteException {
867d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        final DiskInfo[] disks = mSm.getDisks();
877d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        for (DiskInfo disk : disks) {
887d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            System.out.println(disk.getId());
897d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        }
907d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey    }
917d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey
927d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey    public void runListVolumes() throws RemoteException {
937d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        final String filter = nextArg();
947d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        final int filterType;
957d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        if ("public".equals(filter)) {
967d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            filterType = VolumeInfo.TYPE_PUBLIC;
977d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        } else if ("private".equals(filter)) {
987d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            filterType = VolumeInfo.TYPE_PRIVATE;
997d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        } else if ("emulated".equals(filter)) {
1007d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            filterType = VolumeInfo.TYPE_EMULATED;
1017d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        } else {
1027d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            filterType = -1;
1037d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        }
1047d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey
1057d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        final VolumeInfo[] vols = mSm.getVolumes(0);
1067d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        for (VolumeInfo vol : vols) {
1077d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            if (filterType == -1 || filterType == vol.getType()) {
1087d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey                final String envState = VolumeInfo.getEnvironmentForState(vol.getState());
1097d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey                System.out.println(vol.getId() + " " + envState + " " + vol.getFsUuid());
1107d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            }
1117d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        }
1127d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey    }
1137d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey
1147d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey    public void runGetPrimaryStorageUuid() throws RemoteException{
1157d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        System.out.println(mSm.getPrimaryStorageUuid());
1167d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey    }
1177d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey
1187d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey    public void runPartition() throws RemoteException {
1197d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        final String diskId = nextArg();
1207d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        final String type = nextArg();
1217d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        if ("public".equals(type)) {
1227d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            mSm.partitionPublic(diskId);
1237d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        } else if ("private".equals(type)) {
1247d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            mSm.partitionPrivate(diskId);
1257d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        } else if ("mixed".equals(type)) {
1267d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            final int ratio = Integer.parseInt(nextArg());
1277d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            mSm.partitionMixed(diskId, ratio);
1287d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        } else {
1297d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            throw new IllegalArgumentException("Unsupported partition type " + type);
1307d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        }
1317d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey    }
1327d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey
1337d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey    public void runMount() throws RemoteException {
1347d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        final String volId = nextArg();
1357d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        mSm.mount(volId);
1367d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey    }
1377d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey
1387d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey    public void runUnmount() throws RemoteException {
1397d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        final String volId = nextArg();
1407d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        mSm.unmount(volId);
1417d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey    }
1427d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey
1437d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey    public void runFormat() throws RemoteException {
1447d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        final String volId = nextArg();
1457d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        mSm.format(volId);
1467d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey    }
1477d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey
1487d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey    public void runForget() throws RemoteException{
1497d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        final String fsUuid = nextArg();
1507d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        if ("all".equals(fsUuid)) {
1517d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            mSm.forgetAllVolumes();
1527d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        } else {
1537d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            mSm.forgetVolume(fsUuid);
1547d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        }
1557d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey    }
1567d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey
1577d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey    private String nextArg() {
1587d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        if (mNextArg >= mArgs.length) {
1597d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey            return null;
1607d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        }
1617d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        String arg = mArgs[mNextArg];
1627d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        mNextArg++;
1637d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        return arg;
1647d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey    }
1657d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey
1667d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey    private static int showUsage() {
1677d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        System.err.println("usage: sm list-disks");
1687d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        System.err.println("       sm list-volumes [public|private|emulated|all]");
1697d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        System.err.println("       sm get-primary-storage-uuid");
1707d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        System.err.println("");
1717d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        System.err.println("       sm partition DISK [public|private|mixed] [ratio]");
1727d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        System.err.println("       sm mount VOLUME");
1737d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        System.err.println("       sm unmount VOLUME");
1747d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        System.err.println("       sm format VOLUME");
1757d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        System.err.println("");
1767d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        System.err.println("       sm forget [UUID|all]");
1777d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        System.err.println("");
1787d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey        return 1;
1797d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey    }
1807d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey}
181