%s: %s
" % (action.replace("_", " ").upper(), results) 139 | else: 140 | if result is False: 141 | msg_color = "danger" 142 | msg_text = "FAILED" 143 | elif result is True: 144 | msg_color = "success" 145 | msg_text = "SUCCESS" 146 | elif result is None: 147 | msg_color = "danger" 148 | msg_text = "FAILED (EMPTY RESULT)" 149 | else: 150 | msg_color = "success" 151 | msg_text = "SUCCESS" 152 | msg = ("%s: %s
" % 153 | (action.replace("_", " ").upper(), msg_color, msg_text)) 154 | else: 155 | msg = "FAILED - INVALID USER
" 156 | log.info(msg) 157 | return msg 158 | -------------------------------------------------------------------------------- /tests/libs/google/admin_tests.py: -------------------------------------------------------------------------------- 1 | import os 2 | import json 3 | 4 | from unittest import TestCase 5 | 6 | from mock import MagicMock, patch 7 | from google.admin import GoogleAdminApi 8 | 9 | CALL_GOOGLE_API = "google.admin.GoogleApiController.call_google_api" 10 | 11 | 12 | class SomeGoogleAdminApi(GoogleAdminApi): 13 | def __init__(self, oauth): 14 | self.config = MagicMock() 15 | self.oauth = oauth 16 | self.service = MagicMock() 17 | 18 | 19 | class GoogleAdminApiTests(TestCase): 20 | def read_resource_file(self, res_file): 21 | mock_results_dir = "tests/libs/google/mock_results" 22 | try: 23 | mock_resource_file = os.path.join(mock_results_dir, res_file) 24 | with open(mock_resource_file, "r") as mock_resource_fp: 25 | self.mock_resource = json.loads(mock_resource_fp.read()) 26 | mock_resource_fp.close() 27 | except IOError: 28 | self.mock_resource = None 29 | 30 | return self.mock_resource 31 | 32 | @patch(CALL_GOOGLE_API) 33 | def test_get_user_name(self, mock_google_api): 34 | mock_google_api.return_value = json.dumps(self.read_resource_file('get_user_name')["fullName"]) 35 | google_admin = SomeGoogleAdminApi(oauth=MagicMock()) 36 | get_user_name = google_admin.get_user_name("hkantas@testdomain.com") 37 | assert get_user_name == "Harry Kantas" 38 | 39 | @patch(CALL_GOOGLE_API) 40 | def test_is_suspended_pass(self, mock_google_api): 41 | mock_google_api.return_value = json.dumps(self.read_resource_file('user_resource')["suspended"]) 42 | google_admin = SomeGoogleAdminApi(oauth=MagicMock()) 43 | is_suspended = google_admin.is_suspended("someuser@somewhere.org") 44 | assert is_suspended is False 45 | 46 | @patch(CALL_GOOGLE_API) 47 | def test_is_suspended_fail(self, mock_google_api): 48 | mock_google_api.return_value = self.read_resource_file('user_resource_malformed') 49 | google_admin = SomeGoogleAdminApi(oauth=MagicMock()) 50 | is_suspended = google_admin.is_suspended("someuser@somewhere.org") 51 | assert is_suspended is None 52 | 53 | @patch(CALL_GOOGLE_API) 54 | def test_suspend(self, mock_google_api): 55 | mock_google_api.return_value = json.dumps(self.read_resource_file('suspend')["suspended"]) 56 | google_admin = SomeGoogleAdminApi(oauth=MagicMock()) 57 | suspend = google_admin.suspend("someuser@somewhere.org") 58 | assert suspend is True 59 | 60 | @patch(CALL_GOOGLE_API) 61 | def test_un_suspend(self, mock_google_api): 62 | mock_google_api.return_value = json.dumps(self.read_resource_file('un_suspend')["suspended"]) 63 | google_admin = SomeGoogleAdminApi(oauth=MagicMock()) 64 | suspend = google_admin.suspend("someuser@somewhere.org") 65 | assert suspend is True 66 | 67 | @patch(CALL_GOOGLE_API) 68 | def test_delete_user_pass(self, mock_google_api): 69 | mock_google_api.return_value = "" 70 | google_admin = SomeGoogleAdminApi(oauth=MagicMock()) 71 | delete_user = google_admin.delete_user("someuser@somewhere.org") 72 | assert delete_user is True 73 | 74 | @patch(CALL_GOOGLE_API) 75 | def test_delete_user_fail(self, mock_google_api): 76 | mock_google_api.return_value = json.dumps(self.read_resource_file('delete_user_resource_fail')) 77 | google_admin = SomeGoogleAdminApi(oauth=MagicMock()) 78 | delete_user = google_admin.delete_user("someuser@somewhere.org") 79 | assert delete_user is False 80 | 81 | @patch(CALL_GOOGLE_API) 82 | def test_list_asps_pass(self, mock_google_api): 83 | mock_google_api.return_value = json.dumps(self.read_resource_file('asps_resource')["items"]) 84 | google_admin = SomeGoogleAdminApi(oauth=MagicMock()) 85 | list_asps = google_admin.list_asps("items") 86 | assert list_asps == [0, 2, 3] 87 | 88 | @patch(CALL_GOOGLE_API) 89 | def test_list_asps_fail(self, mock_google_api): 90 | mock_google_api.return_value = self.read_resource_file('asps_resource_malformed')["items"] 91 | google_admin = SomeGoogleAdminApi(oauth=MagicMock()) 92 | list_asps = google_admin.list_asps("items") 93 | assert list_asps is False 94 | 95 | @patch(CALL_GOOGLE_API) 96 | def test_tokens_list_pass(self, mock_google_api): 97 | mock_google_api.return_value = json.dumps(self.read_resource_file('tokens_resource')["items"]) 98 | google_admin = SomeGoogleAdminApi(oauth=MagicMock()) 99 | list_tokens = google_admin.list_tokens("clientId") 100 | assert list_tokens == [("1011230515163-arsl01gv134b0sjidu62bkp3hub3nuj3." 101 | "apps.googleusercontent.com")] 102 | 103 | @patch(CALL_GOOGLE_API) 104 | def test_tokens_list_fail(self, mock_google_api): 105 | mock_google_api.return_value = self.read_resource_file('tokens_resource_malformed')["items"] 106 | google_admin = SomeGoogleAdminApi(oauth=MagicMock()) 107 | list_tokens = google_admin.list_tokens("clientId") 108 | assert list_tokens is None 109 | 110 | @patch(CALL_GOOGLE_API) 111 | def test_list_backup_codes_pass(self, mock_google_api): 112 | mock_google_api.return_value = json.dumps(self.read_resource_file 113 | ('verification_resource')["items"]) 114 | google_admin = SomeGoogleAdminApi(oauth=MagicMock()) 115 | list_backup_codes = google_admin.list_backup_codes("verificationCode") 116 | assert "26975385" in list_backup_codes 117 | 118 | @patch(CALL_GOOGLE_API) 119 | def test_list_backup_codes_fail(self, mock_google_api): 120 | mock_google_api.return_value = self.read_resource_file('verification_resource_fail') 121 | google_admin = SomeGoogleAdminApi(oauth=MagicMock()) 122 | list_backup_codes = google_admin.list_backup_codes("verificationCode") 123 | assert list_backup_codes is False 124 | 125 | @patch(CALL_GOOGLE_API) 126 | def test_org_unit_change_pass(self, mock_google_api): 127 | mock_google_api.return_value = json.dumps(self.read_resource_file 128 | ('org_unit_change')["primaryEmail"]) 129 | google_admin = SomeGoogleAdminApi(oauth=MagicMock()) 130 | org_unit_change = google_admin.org_unit_change("stillings@testdomain.com") 131 | assert org_unit_change is True 132 | 133 | @patch(CALL_GOOGLE_API) 134 | def test_org_unit_change_fail(self, mock_google_api): 135 | mock_google_api.return_value = self.read_resource_file('org_unit_change')["primaryEmail"] 136 | google_admin = SomeGoogleAdminApi(oauth=MagicMock()) 137 | org_unit_change = google_admin.org_unit_change("stillings@testdomain.com") 138 | assert org_unit_change is False 139 | 140 | @patch(CALL_GOOGLE_API) 141 | def test_group_members_list_pass(self, mock_google_api): 142 | mock_google_api.return_value = json.dumps(self.read_resource_file 143 | ('group_member_list')["members"]) 144 | google_admin = SomeGoogleAdminApi(oauth=MagicMock()) 145 | group_member_list = google_admin.group_member_list("group_key") 146 | assert group_member_list[1] == "phewson@testdomain.com" 147 | 148 | @patch(CALL_GOOGLE_API) 149 | def test_group_members_list_fail(self, mock_google_api): 150 | mock_google_api.return_value = json.dumps(self.read_resource_file('group_member_list_fail')) 151 | google_admin_api = SomeGoogleAdminApi(oauth=MagicMock()) 152 | group_member_list = google_admin_api.group_member_list("group_key") 153 | assert group_member_list is None 154 | 155 | @patch(CALL_GOOGLE_API) 156 | def test_group_member_delete_pass(self, mock_google_api): 157 | mock_google_api.return_value = json.dumps(self.read_resource_file 158 | ('group_member_delete')["members"]) 159 | google_admin_api = SomeGoogleAdminApi(oauth=MagicMock()) 160 | group_member_delete = google_admin_api.group_member_delete("group_key", "user_key") 161 | assert group_member_delete is True 162 | 163 | @patch(CALL_GOOGLE_API) 164 | def test_group_member_delete_fail(self, mock_google_api): 165 | mock_google_api.return_value = json.dumps(self.read_resource_file('group_member_delete_fail')) 166 | google_admin_api = SomeGoogleAdminApi(oauth=MagicMock()) 167 | group_member_delete = google_admin_api.group_member_delete("group_key", "user_key") 168 | assert group_member_delete is False 169 | -------------------------------------------------------------------------------- /tests/libs/duo/mock_results/list_users_resource: -------------------------------------------------------------------------------- 1 | [{"status": "disabled", "username": "mat", "desktoptokens": [], "user_id": "DUUCQHSE99RRJBVOLV0W", "realname": "Mat Clinton", "firstname": "", "created": 1528219451, "alias2": null, "alias3": null, "notes": "", "alias1": null, "alias4": null, "tokens": [], "last_login": null, "last_directory_sync": null, "groups": [], "lastname": "", "phones": [], "u2ftokens": [], "email": "mat@somewhere.com"}, {"status": "active", "username": "adatta", "desktoptokens": [], "user_id": "DUWB1SHWG1Z7X2F92G3G", "realname": "Ari D", "firstname": "", "created": 1522362515, "alias2": null, "alias3": null, "notes": "", "alias1": null, "alias4": null, "tokens": [], "last_login": null, "last_directory_sync": null, "groups": [], "lastname": "", "phones": [], "u2ftokens": [], "email": "smamidigumpula@somewhere.com"}, {"status": "active", "username": "akaliyeva", "desktoptokens": [], "user_id": "DUMMTPF5X85O0PZM4IJW", "realname": "akaliyeva", "firstname": "", "created": 1522176173, "alias2": null, "alias3": null, "notes": "", "alias1": null, "alias4": null, "tokens": [], "last_login": null, "last_directory_sync": null, "groups": [], "lastname": "", "phones": [], "u2ftokens": [], "email": "akaliyeva@twittertest.com"}, {"status": "active", "username": "amysaper", "desktoptokens": [], "user_id": "DUR5N15DYKU4PT9NBZA0", "realname": "Amy Saper", "firstname": "", "created": 1528488822, "alias2": null, "alias3": null, "notes": "", "alias1": null, "alias4": null, "tokens": [], "last_login": null, "last_directory_sync": null, "groups": [], "lastname": "", "phones": [], "u2ftokens": [], "email": "amysaper@somewhere.com"}, {"status": "active", "username": "andrewpabian", "desktoptokens": [], "user_id": "DU01VAE8UETGPOHWI845", "realname": "Andrew Pabian", "firstname": "", "created": 1528218796, "alias2": null, "alias3": null, "notes": "", "alias1": null, "alias4": null, "tokens": [], "last_login": null, "last_directory_sync": null, "groups": [], "lastname": "", "phones": [], "u2ftokens": [], "email": "andrewpabian@somewhere.com"}, {"status": "active", "username": "apadin", "desktoptokens": [], "user_id": "DU9G7NLVPB4L9E4EKXLF", "realname": "Anthony Padin", "firstname": "", "created": 1528157441, "alias2": null, "alias3": null, "notes": "", "alias1": null, "alias4": null, "tokens": [], "last_login": null, "last_directory_sync": null, "groups": [], "lastname": "", "phones": [], "u2ftokens": [], "email": "apadin@somewhere.com"}, {"status": "active", "username": "asamsudin", "desktoptokens": [], "user_id": "DU3ZWSBUZYJ5GCXHXRNZ", "realname": "Adi Hardiana Samsudin", "firstname": "", "created": 1524030926, "alias2": null, "alias3": null, "notes": "", "alias1": null, "alias4": null, "tokens": [], "last_login": null, "last_directory_sync": null, "groups": [], "lastname": "", "phones": [], "u2ftokens": [], "email": "smamidigumpula@somewhere.com"}, {"status": "disabled", "username": "athavorides", "desktoptokens": [], "user_id": "DUUJLKM1GR8OZRIQKED9", "realname": "Alyssa Thavorides", "firstname": "", "created": 1522175177, "alias2": null, "alias3": null, "notes": "", "alias1": null, "alias4": null, "tokens": [], "last_login": null, "last_directory_sync": null, "groups": [], "lastname": "", "phones": [{"name": "", "extension": "", "sms_passcodes_sent": false, "phone_id": "DPFAJOZLHJ1UZYUC610F", "activated": false, "number": "+15106249949", "capabilities": ["auto", "sms", "phone"], "platform": "Unknown", "predelay": "", "postdelay": "", "type": "Unknown", "last_seen": ""}], "u2ftokens": [], "email": "athavorides@twitter.test.com"}, {"status": "disabled", "username": "ayan", "desktoptokens": [], "user_id": "DUGX3JKQRQ2D4GG1ZRCG", "realname": "Amanda Yan", "firstname": "", "created": 1522184079, "alias2": null, "alias3": null, "notes": "", "alias1": null, "alias4": null, "tokens": [], "last_login": null, "last_directory_sync": null, "groups": [], "lastname": "", "phones": [], "u2ftokens": [], "email": "ayan@twittertest.com"}, {"status": "active", "username": "cadamson", "desktoptokens": [], "user_id": "DUV8M292MES0N02WZ9LU", "realname": "Celeste Ridlen", "firstname": "", "created": 1528358668, "alias2": null, "alias3": null, "notes": "", "alias1": null, "alias4": null, "tokens": [], "last_login": null, "last_directory_sync": null, "groups": [], "lastname": "", "phones": [], "u2ftokens": [], "email": "cadamson@somewhere.com"}, {"status": "active", "username": "fhrenic", "desktoptokens": [], "user_id": "DUB962UBJAEYXNJ1U05G", "realname": "Filip Hrenic", "firstname": "", "created": 1528835283, "alias2": null, "alias3": null, "notes": "", "alias1": null, "alias4": null, "tokens": [], "last_login": null, "last_directory_sync": null, "groups": [], "lastname": "", "phones": [{"name": "", "extension": "", "sms_passcodes_sent": false, "phone_id": "DPK8UM7IT1GT6C96ASWY", "activated": true, "number": "+14153086702", "capabilities": ["auto", "push", "sms", "phone", "mobile_otp"], "platform": "Apple iOS", "predelay": "", "postdelay": "", "type": "Mobile", "last_seen": "2018-06-16T01:56:04"}], "u2ftokens": [], "email": "fhrenic@somewhere.com"}, {"status": "disabled", "username": "funtest", "desktoptokens": [], "user_id": "DUH7D0UZ9A912INRDBXI", "realname": "fun test", "firstname": "", "created": 1528966402, "alias2": null, "alias3": null, "notes": "", "alias1": null, "alias4": null, "tokens": [], "last_login": null, "last_directory_sync": null, "groups": [], "lastname": "", "phones": [], "u2ftokens": [], "email": "funtest@somewhere.com"}, {"status": "active", "username": "jstrauss", "desktoptokens": [], "user_id": "DUVCWCBAENYFZ0R3LO32", "realname": "Jeff Strauss", "firstname": null, "created": 1527195029, "alias2": null, "alias3": null, "notes": "", "alias1": null, "alias4": null, "tokens": [], "last_login": null, "last_directory_sync": null, "groups": [], "lastname": null, "phones": [{"name": "", "extension": "", "sms_passcodes_sent": false, "phone_id": "DPA96OGS9LRWTVWUCONU", "activated": false, "number": "+14159903977", "capabilities": ["auto", "sms", "phone"], "platform": "Generic Smartphone", "predelay": "0", "postdelay": "0", "type": "Mobile", "last_seen": ""}], "u2ftokens": [], "email": "jstrauss@somewhere.com"}, {"status": "disabled", "username": "mpe", "desktoptokens": [], "user_id": "DUKO01W1GGMLA9N8U65P", "realname": "Mary Lynne Joyce Pe", "firstname": "", "created": 1528391362, "alias2": null, "alias3": null, "notes": "", "alias1": null, "alias4": null, "tokens": [], "last_login": null, "last_directory_sync": null, "groups": [], "lastname": "", "phones": [], "u2ftokens": [], "email": "smamidigumpula@somewhere.com"}, {"status": "disabled", "username": "qazsdf", "desktoptokens": [], "user_id": "DULF73HH9HEQR11E4PCS", "realname": "qaz sdf", "firstname": "", "created": 1528452620, "alias2": null, "alias3": null, "notes": "", "alias1": null, "alias4": null, "tokens": [], "last_login": null, "last_directory_sync": null, "groups": [], "lastname": "", "phones": [], "u2ftokens": [], "email": "qazsdf@somewhere.com"}, {"status": "disabled", "username": "rfactor", "desktoptokens": [], "user_id": "DUS1BX1CDC3ILQ36LDB4", "realname": "rfactor", "firstname": "", "created": 1523038950, "alias2": null, "alias3": null, "notes": "", "alias1": null, "alias4": null, "tokens": [], "last_login": null, "last_directory_sync": null, "groups": [], "lastname": "", "phones": [], "u2ftokens": [], "email": "smamidigumpula@somewhere.com"}, {"status": "active", "username": "testduo1", "desktoptokens": [], "user_id": "DUI3Z64KIU0HP3946RMO", "realname": "", "firstname": null, "created": 1519153771, "alias2": null, "alias3": null, "notes": "", "alias1": null, "alias4": null, "tokens": [], "last_login": null, "last_directory_sync": null, "groups": [], "lastname": null, "phones": [], "u2ftokens": [], "email": ""}, {"status": "disabled", "username": "testqwe", "desktoptokens": [], "user_id": "DU2UAIRCGL8JAVL2CNL9", "realname": "Test qwe", "firstname": "", "created": 1528450975, "alias2": null, "alias3": null, "notes": "", "alias1": null, "alias4": null, "tokens": [], "last_login": null, "last_directory_sync": null, "groups": [], "lastname": "", "phones": [], "u2ftokens": [], "email": "testqwe@somewhere.com"}, {"status": "active", "username": "ttw1last7", "desktoptokens": [], "user_id": "DU1TFQ4722APHP11WNER", "realname": "tw1first7 tw1last7", "firstname": "", "created": 1528835263, "alias2": null, "alias3": null, "notes": "", "alias1": null, "alias4": null, "tokens": [], "last_login": null, "last_directory_sync": null, "groups": [], "lastname": "", "phones": [], "u2ftokens": [], "email": "ttw1last7@somewhere.com"}, {"status": "active", "username": "tweet5", "desktoptokens": [], "user_id": "DUMC70PBXWB3RFXDRLZ8", "realname": "tweetfn5 tweetln5", "firstname": "", "created": 1528868829, "alias2": null, "alias3": null, "notes": "", "alias1": null, "alias4": null, "tokens": [], "last_login": null, "last_directory_sync": null, "groups": [], "lastname": "", "phones": [], "u2ftokens": [], "email": "tweet5@somewhere.com"}, {"status": "active", "username": "twun10", "desktoptokens": [], "user_id": "DUCUXVAIHSDIHDTEUYYE", "realname": "tw1first10 tw1last10", "firstname": "", "created": 1528868812, "alias2": null, "alias3": null, "notes": "", "alias1": null, "alias4": null, "tokens": [], "last_login": null, "last_directory_sync": null, "groups": [], "lastname": "", "phones": [], "u2ftokens": [], "email": "twun10@somewhere.com"}, {"status": "active", "username": "ustest", "desktoptokens": [], "user_id": "DULAEI8X729VO8BDG6AT", "realname": "use test", "firstname": "", "created": 1528911840, "alias2": null, "alias3": null, "notes": "", "alias1": null, "alias4": null, "tokens": [], "last_login": null, "last_directory_sync": null, "groups": [], "lastname": "", "phones": [], "u2ftokens": [], "email": "ustest@somewhere.com"}] 2 | -------------------------------------------------------------------------------- /libs/pagerduty/__init__.py: -------------------------------------------------------------------------------- 1 | import json 2 | 3 | from http_controller import HttpController 4 | 5 | 6 | class PagerDutyApi(HttpController): 7 | def __init__(self, config=None, **kwargs): 8 | self.config = config 9 | self.base_url = self.config["base_url"] 10 | self.api_key = self.config["api_key"] 11 | self.HEADERS = {"Authorization": "Token token={0}".format(self.api_key), 12 | "Accept": "application/vnd.pagerduty+json;version=2", 13 | "Content-type": "application/json"} 14 | super(PagerDutyApi, self).__init__(base_url=self.base_url, **kwargs) 15 | 16 | def find_user_id(self, user_email): 17 | """ 18 | Returns a user, matching the given email. 19 | :param user_email: user email 20 | :return: user object 21 | """ 22 | user_id = None 23 | params = {"query": user_email} 24 | try: 25 | list_users = self.api_request(method="get", 26 | endpoint="users", 27 | params=params, 28 | headers=self.HEADERS) 29 | if "users" in list_users and len(list_users["users"]) > 0: 30 | for user in list_users["users"]: 31 | if user["email"] == user_email: 32 | user_id = user["id"] 33 | except ValueError as e: 34 | print(e) 35 | 36 | return user_id 37 | 38 | def get_schedule_by_id(self, schedule_id): 39 | """ 40 | retrieves a schedule by its ID. 41 | :param schedule_id 42 | :return: schedule object 43 | """ 44 | r = self.api_request(method="get", 45 | endpoint="schedules/{id}".format(id=schedule_id), 46 | headers=self.HEADERS) 47 | return r 48 | 49 | def get_escalation_policy_by_id(self, policy_id): 50 | """ 51 | retrieves an escalation policy by its ID. 52 | :param policy_id 53 | :return: escalation policy object 54 | """ 55 | r = self.api_request(method="get", 56 | endpoint="escalation_policies/{id}".format(id=policy_id), 57 | headers=self.HEADERS) 58 | return r 59 | 60 | def get_service_by_id(self, service_id): 61 | """ 62 | retrieves a service by its ID. 63 | :param service_id 64 | :return: service object 65 | """ 66 | params = {"include[]": "escalation_policies"} 67 | r = self.api_request(method="get", 68 | endpoint="services/{id}".format(id=service_id), 69 | params=params, 70 | headers=self.HEADERS) 71 | return r 72 | 73 | def update_schedule_by_id(self, schedule_id, schedule): 74 | """ 75 | Updates a schedule by ID. 76 | :param schedule_id: schedule ID 77 | :param schedule: schedule object 78 | :return: bool 79 | """ 80 | updated = True 81 | r = self.api_request(method="put", 82 | endpoint="schedules/{id}".format(id=schedule_id), 83 | data=json.dumps(schedule), 84 | headers=self.HEADERS) 85 | if "error" in r: 86 | updated = False 87 | return updated 88 | 89 | def update_escalation_policy_by_id(self, policy_id, policy): 90 | """ 91 | Updates an escalation policy by ID. 92 | :param policy_id: policy ID 93 | :param policy: escalation_policy object 94 | :return: bool 95 | """ 96 | updated = True 97 | r = self.api_request(method="put", 98 | endpoint="escalation_policies/{id}".format(id=policy_id), 99 | data=json.dumps(policy), 100 | headers=self.HEADERS) 101 | if "error" in r: 102 | updated = False 103 | 104 | return updated 105 | 106 | def update_service_by_id(self, service_id, service): 107 | """ 108 | Updates a service by ID. 109 | :param service_id: service ID 110 | :param service: service object 111 | :return: bool 112 | """ 113 | updated = True 114 | r = self.api_request(method="put", 115 | endpoint="services/{id}".format(id=service_id), 116 | data=json.dumps(service), 117 | headers=self.HEADERS) 118 | if "error" in r: 119 | updated = False 120 | 121 | return updated 122 | 123 | def delete_escalation_policy_by_id(self, policy_id): 124 | """ 125 | Deletes an escalation policy by ID. 126 | :param policy_id: policy ID 127 | :return: bool 128 | """ 129 | deleted = False 130 | r = self.api_request(method="delete", 131 | endpoint="escalation_policies/{id}".format(id=policy_id), 132 | response_type="text", 133 | headers=self.HEADERS) 134 | try: 135 | response = json.loads(r) 136 | if "error" in response: 137 | deleted = False 138 | except json.JSONDecoderError: 139 | if r == "": 140 | deleted = True 141 | return deleted 142 | 143 | def remove_user_from_schedule(self, schedule_id, user_id): 144 | """ 145 | remove user from a schedule. 146 | :param schedule_id: schedule_id 147 | :param user_id: user_id 148 | :return: bool 149 | """ 150 | schedule = self.get_schedule_by_id(schedule_id=schedule_id) 151 | 152 | for layer in schedule["schedule"]["schedule_layers"]: 153 | for user in layer["users"]: 154 | if user["user"]["id"] == user_id: 155 | user_idx = layer["users"].index(user) 156 | layer["users"].pop(user_idx) 157 | if len(layer["users"]) == 0: 158 | layer["users"].append(schedule["schedule"]["users"][0]) 159 | removed = self.update_schedule_by_id(schedule_id=schedule_id, schedule=schedule) 160 | 161 | return removed 162 | 163 | def remove_user_from_escalation_policy(self, policy_id, user_id, delete_empty=False): 164 | """ 165 | remove user from an escalation policy. 166 | :param policy_id: policy_id 167 | :param user_id: user_id 168 | :param delete_empty: whether to delete an escalation policy with no targets 169 | :return: bool 170 | """ 171 | removed = False 172 | policy = self.get_escalation_policy_by_id(policy_id=policy_id) 173 | 174 | if len(policy["escalation_policy"]["escalation_rules"]) == 1: 175 | rule = policy["escalation_policy"]["escalation_rules"][0] 176 | if len(rule["targets"]) > 1: 177 | for target in rule["targets"]: 178 | if target["id"] == user_id: 179 | target_idx = rule["targets"].index(target) 180 | rule["targets"].pop(target_idx) 181 | removed = self.update_escalation_policy_by_id(policy_id=policy_id, policy=policy) 182 | elif delete_empty is True: 183 | for service in policy["escalation_policy"]["services"]: 184 | self.delete_service(service_id=service["id"]) 185 | self.get_escalation_policy_by_id(policy_id=policy_id) 186 | removed = self.delete_escalation_policy_by_id(policy_id=policy_id) 187 | 188 | return removed 189 | 190 | def delete_service(self, service_id): 191 | """ 192 | Deletes a service. 193 | :param service_id: id 194 | :return: user object 195 | """ 196 | deleted = False 197 | r = self.api_request(method="delete", 198 | endpoint="services/{id}".format(id=service_id), 199 | response_type="text", 200 | headers=self.HEADERS) 201 | if r == "": 202 | deleted = True 203 | return deleted 204 | 205 | def delete_user(self, user_id): 206 | """ 207 | Deletes a user. 208 | :param user_id: id 209 | :return: user object 210 | """ 211 | r = self.api_request(method="delete", 212 | endpoint="users/{id}".format(id=user_id), 213 | response_type="text", 214 | headers=self.HEADERS) 215 | 216 | return r 217 | 218 | def remove_from_oncalls(self, user_email): 219 | """ 220 | Removes a user from oncalls, and then deletes the user. 221 | :param email: user email 222 | :return: bool 223 | """ 224 | deleted = False 225 | user_id = self.find_user_id(user_email=user_email) 226 | if user_id is not None: 227 | try: 228 | userdel = json.loads(self.delete_user(user_id=user_id)) 229 | if "error" in userdel: 230 | for conflict in userdel["error"]["conflicts"]: 231 | if conflict["type"] == "schedule": 232 | self.remove_user_from_schedule(schedule_id=conflict["id"], user_id=user_id) 233 | elif conflict["type"] == "escalation_policy": 234 | self.remove_user_from_escalation_policy(policy_id=conflict["id"], 235 | user_id=user_id, 236 | delete_empty=True) 237 | userdel = self.delete_user(user_id=user_id) 238 | if userdel == "": 239 | deleted = True 240 | except ValueError: 241 | deleted = True 242 | else: 243 | deleted = True 244 | 245 | return deleted 246 | 247 | def list_oncalls(self, escalation_policy_ids): 248 | """ 249 | Returns all oncalls. 250 | :param escalation_policy_ids: list of escalation policy ids 251 | :return: list of oncalls resources 252 | """ 253 | params = {"escalation_policy_ids[]": escalation_policy_ids} 254 | r = self.api_request(method="get", 255 | endpoint="oncalls", 256 | params=params, 257 | headers=self.HEADERS) 258 | if "oncalls" in r: 259 | return r["oncalls"] 260 | else: 261 | return None 262 | -------------------------------------------------------------------------------- /templates/lost_asset.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | {% block head %} 5 | 6 | 7 | 8 | 9 | 10 | 16 |{{ message }}
41 | {% endfor %} 42 |{{ message }}
46 | {% endfor %} 47 |{{ message }}
41 | {% endfor %} 42 |