• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!/usr/bin/env python3.4
2#
3#   Copyright 2016 - Google
4#
5#   Licensed under the Apache License, Version 2.0 (the "License");
6#   you may not use this file except in compliance with the License.
7#   You may obtain a copy of the License at
8#
9#       http://www.apache.org/licenses/LICENSE-2.0
10#
11#   Unless required by applicable law or agreed to in writing, software
12#   distributed under the License is distributed on an "AS IS" BASIS,
13#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14#   See the License for the specific language governing permissions and
15#   limitations under the License.
16"""
17    Basic script for managing a JSON "database" file of SIM cards.
18    It will look at the list of attached devices, and add their SIMs to a
19    database.
20    We expect to add much more functionality in the future.
21"""
22
23import argparse
24import json
25import acts.controllers.android_device as android_device
26import acts.test_utils.tel.tel_defines as tel_defines
27import acts.test_utils.tel.tel_lookup_tables as tel_lookup_tables
28
29def add_sims(sim_card_file=None):
30    if not sim_card_file:
31        print("Error: file name is None.")
32        return False
33    try:
34        f = open(sim_card_file, 'r')
35        simconf = json.load(f)
36        f.close()
37    except FileNotFoundError:
38        simconf = {}
39    flag = False
40
41    droid_list = android_device.get_all_instances()
42    for droid_device in droid_list:
43        droid = droid_device.get_droid(False)
44        if droid.telephonyGetSimState() != tel_defines.SIM_STATE_READY:
45            print("No Valid Sim! {} \n".format(droid.telephonyGetSimState()))
46            continue
47        serial = droid.telephonyGetSimSerialNumber()
48        print("add_sims: {}".format(serial))
49
50        # Add new entry if not exist
51        if serial in simconf:
52            print("Declining to add a duplicate entry: {}".format(serial))
53            #TODO: Add support for "refreshing" an entry
54            continue
55        else:
56            simconf[serial] = {}
57            current = simconf[serial]
58            flag = True
59
60        try:
61            #TODO: Make this list of hPLMNs a separate data structure
62            current["operator"] = tel_lookup_tables.operator_name_from_plmn_id(
63                droid.telephonyGetSimOperator())
64        except KeyError:
65            print("Unknown Operator {}".format(droid.telephonyGetSimOperator()))
66            current["operator"] = ""
67
68        # This is default capability: we need to try and
69        # run-time determine in the future based on SIM queries?
70        current["capability"] = ['voice', 'ims', 'volte', 'vt', 'sms',
71                                 'tethering', 'data']
72
73        phone_num = droid.telephonyGetLine1Number()
74        if not phone_num:
75            print("Please manually add a phone number for {}\n".format(serial))
76            current["phone_num"] = ""
77        else:
78            # Remove the leading +
79            if len(phone_num) == 10:
80                phone_num = "1" + phone_num
81            current["phone_num"] = ''.join(filter(lambda x: x.isdigit(), phone_num))
82    if flag:
83        f = open(sim_card_file, 'w')
84        json.dump(simconf, f, indent=4, sort_keys=True)
85        f.close()
86    return True
87
88def prune_sims(sim_card_file=None):
89    if sim_card_file==None:
90        sim_card_file = "./simcard_list.json"
91    add_sims(sim_card_file)
92
93    try:
94        f = open(sim_card_file, 'r')
95        simconf = json.load(f)
96        f.close()
97    except FileNotFoundError:
98        print ("File not found.")
99        return False
100
101    flag = False
102
103    droid_list = android_device.get_all_instances()
104
105    simconf_list = list(simconf.keys())
106    delete_list = []
107    active_list = []
108
109    for droid_device in droid_list:
110        droid = droid_device.get_droid(False)
111        if droid.telephonyGetSimState() != tel_defines.SIM_STATE_READY:
112            print("No Valid SIM! {} \n".format(droid.telephonyGetSimState()))
113            continue
114        serial = droid.telephonyGetSimSerialNumber()
115        active_list.append(serial)
116
117    delete_list = list(set(simconf_list).difference(set(active_list)))
118
119    print("active phones: {}".format(active_list))
120
121    if len(delete_list) > 0:
122        for sim in delete_list:
123            # prune
124            print("Deleting the SIM entry: ", sim)
125            del simconf[sim]
126            flag = True
127    else:
128        print("nothing to prune")
129
130    if flag:
131        f = open(sim_card_file, 'w')
132        json.dump(simconf, f, indent=4, sort_keys=True)
133        f.close()
134    return True
135
136
137if __name__ == "__main__":
138
139    parser = argparse.ArgumentParser(
140                      description=("Script to generate, augment and prune"
141                                   " SIM list"))
142    parser.add_argument("--f","-file",
143                       default='./simcard_list.json',
144                       help="json file path", type=str)
145    group = parser.add_mutually_exclusive_group()
146    group.add_argument("-a",help="append to the list of SIM entries",
147                      action='store_true')
148    group.add_argument("-p",help="prune the list of SIM entries",
149                      action='store_true')
150
151    args = parser.parse_args()
152
153    if args.a:
154        add_sims(args.f)
155    elif args.p:
156        prune_sims(args.f)
157    else:
158        print ("Error: must select an option: -a or -p")
159
160"""
161Usage Examples
162
163----------------------------------------------------------------
164p3 manage_sim.py -h
165usage: manage_sim.py [-h] [-f F] [-a | -p]
166
167Script to generate, augment and prune SIM list
168
169optional arguments:
170  -h, --help      show this help message and exit
171  -f F, --file F  name for json file
172  -a              append to the list of SIM entries
173  -p              prune the list of SIM entries
174
175----------------------------------------------------------------
176p3 manage_sim.py -f ./simcard_list.json -p
177        OR
178p3 manage_sim.py -p
179
180Namespace(a=False, f='./simcard_list.json', p=True)
181add_sims: 8901260222780922759
182Please manually add a phone number for 8901260222780922759
183
184active phones: 1
185 ['8901260222780922759']
186Deleting the SIM entry:  89148000001280331488
187:
188:
189Deleting the SIM entry:  89014103277559059196
190
191----------------------------------------------------------------
192p3 manage_sim.py -f ./simcard_list.json -a
193        OR
194p3 manage_sim.py -a
195
196Namespace(a=True, f='./simcard_list.json', p=False)
197add_sims: 8901260222780922759
198Please manually add a phone number for 8901260222780922759
199
200----------------------------------------------------------------
201"""
202