commit d241efd180353f73aa2f021e24dd0812ef29eb2b Author: Administrator Date: Fri Jun 7 10:16:54 2024 +0800 first commit diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..35410ca --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# 默认忽略的文件 +/shelf/ +/workspace.xml +# 基于编辑器的 HTTP 客户端请求 +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..105ce2d --- /dev/null +++ b/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..ecd184d --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..b23bae5 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/openstack-api.iml b/.idea/openstack-api.iml new file mode 100644 index 0000000..d0876a7 --- /dev/null +++ b/.idea/openstack-api.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/keystone/__pycache__/domain.cpython-36.pyc b/keystone/__pycache__/domain.cpython-36.pyc new file mode 100644 index 0000000..3dcac0e Binary files /dev/null and b/keystone/__pycache__/domain.cpython-36.pyc differ diff --git a/keystone/__pycache__/get_token.cpython-36.pyc b/keystone/__pycache__/get_token.cpython-36.pyc new file mode 100644 index 0000000..0d8d6cf Binary files /dev/null and b/keystone/__pycache__/get_token.cpython-36.pyc differ diff --git a/keystone/__pycache__/user.cpython-36.pyc b/keystone/__pycache__/user.cpython-36.pyc new file mode 100644 index 0000000..a26607f Binary files /dev/null and b/keystone/__pycache__/user.cpython-36.pyc differ diff --git a/keystone/domain.py b/keystone/domain.py new file mode 100644 index 0000000..f5ea945 --- /dev/null +++ b/keystone/domain.py @@ -0,0 +1,39 @@ +import requests +import json +def get_domain(ip, token): + url = "http://" + ip + ":5000/v3/domains" + headers = {'X-Auth-Token': token} + response = requests.get(url, headers=headers) + return response.json() +def get_domain_id(ip, token, domain_name): + url = "http://" + ip + ":5000/v3/domains" + headers = {'X-Auth-Token': token} + response = requests.get(url, headers=headers) + for i in response.json()['domains']: + if i['name'] == domain_name: + domain_id = i['id'] + return domain_id +def create_domain(ip, token, domain_name, description): + url = "http://" + ip + ":5000/v3/domains" + headers = {'X-Auth-Token': token} + data = { + "domain": { + "description": description, + "enabled": True, + "name": domain_name + } + } + response = requests.post(url, headers=headers, data=json.dumps(data)) + return response.json() +def show_domain(ip, token,domain_name): + domain_id = get_domain_id(ip, token, domain_name) + url = "http://" + ip + ":5000/v3/domains/" + domain_id + headers = {'X-Auth-Token': token} + response = requests.get(url, headers=headers) + return response.json() +def delete_domain(ip, token, domain_name): + domain_id = get_domain_id(ip, token, domain_name) + url = "http://" + ip + ":5000/v3/domains/" + domain_id + headers = {'X-Auth-Token': token} + response = requests.delete(url, headers=headers) + return response.json() \ No newline at end of file diff --git a/keystone/get_token.py b/keystone/get_token.py new file mode 100644 index 0000000..288b980 --- /dev/null +++ b/keystone/get_token.py @@ -0,0 +1,31 @@ +import requests +ip="" +domain_name="" +project_name="" +user_name="" +password="" +def get_token(ip,domain_name,project_name,user_name,password): + url=f"http://{ip}:5000/v3/auth/tokens" + auth_data = { + "auth": { + "identity": { + "methods": ["password"], + "password": { + "user": { + "name": user_name, + "domain": {"name": domain_name}, + "password": password + } + } + }, + "scope": { + "project": { + "name": project_name, + "domain": {"name": domain_name} + } + } + } + } + resp=requests.post(url=url,json=auth_data) + token=resp.headers['X-Subject-Token'] + return token \ No newline at end of file diff --git a/keystone/group.py b/keystone/group.py new file mode 100644 index 0000000..a641270 --- /dev/null +++ b/keystone/group.py @@ -0,0 +1,50 @@ +import requests +import json +def create_group(ip, token, group_name, description): + url = "http://" + ip + ":5000/v3/groups" + headers = {'X-Auth-Token': token} + data = { + "group": { + "name": group_name, + "domain_id": "default", + "description": description + } + } + response = requests.post(url, headers=headers, data=json.dumps(data)) + return response.json() +def get_group_id(ip, token, group_name): + url = "http://" + ip + ":5000/v3/groups" + headers = {'X-Auth-Token': token} + response = requests.get(url, headers=headers) + for i in response.json()['groups']: + if i['name'] == group_name: + return i['id'] +def show_group(ip, token, group_name): + group_id = get_group_id(ip, token, group_name) + url = "http://" + ip + ":5000/v3/groups/" + group_id + headers = {'X-Auth-Token': token} + response = requests.get(url, headers=headers) + return response.json() +def delete_group(ip, token, group_name): + group_id = get_group_id(ip, token, group_name) + url = "http://" + ip + ":5000/v3/groups/" + group_id + headers = {'X-Auth-Token': token} + response = requests.delete(url, headers=headers) + return response.json() +def get_group(ip, token): + url = "http://" + ip + ":5000/v3/groups" + headers = {'X-Auth-Token': token} + response = requests.get(url, headers=headers) + return response.json() +def update_group(ip, token, group_name, new_group_name, new_description): + group_id = get_group_id(ip, token, group_name) + url = "http://" + ip + ":5000/v3/groups/" + group_id + headers = {'X-Auth-Token': token} + data = { + "group": { + "name": new_group_name, + "description": new_description + } + } + response = requests.patch(url, headers=headers, data=json.dumps(data)) + return response.json() \ No newline at end of file diff --git a/keystone/user.py b/keystone/user.py new file mode 100644 index 0000000..dd58171 --- /dev/null +++ b/keystone/user.py @@ -0,0 +1,71 @@ +import requests +import json +def create_user(ip, token, user_name, password, description): + headers = {'X-Auth-Token': token} + body = { + "user": { + "name": user_name, + "password": password, + "description": description, + } + } + resp = requests.post(f"http://{ip}:5000/v3/users", data=json.dumps(body), headers=headers) + return resp.json() # Assuming the API returns JSON + + +def get_users(ip, token): + headers = {'X-Auth-Token': token} + resp = requests.get(f"http://{ip}:5000/v3/users", headers=headers) + return resp.json() # Assuming the API returns JSON + + +def get_user_id(ip, token, user_name): + headers = {'X-Auth-Token': token} + result = requests.get(f"http://{ip}:5000/v3/users", headers=headers).json() + for item in result['users']: + if item['name'] == user_name: + return item['id'] + return "NONE" + + +def get_user(ip, token, user_name): + user_id = get_user_id(ip, token, user_name) + if user_id == "NONE": + return {"error": "User not found"} + + headers = {'X-Auth-Token': token} + api_url = f"http://{ip}:5000/v3/users/{user_id}" + resp = requests.get(api_url, headers=headers) + return resp.json() # Assuming the API returns JSON + + +def delete_user(ip, token, user_name): + user_id = get_user_id(ip, token, user_name) + if user_id == "NONE": + return {"error": "User not found"} + + headers = {'X-Auth-Token': token} + api_url = f"http://{ip}:5000/v3/users/{user_id}" + resp = requests.delete(api_url, headers=headers) + if resp.status_code == 204: + return {"message":"用户删除成功"} + else: + return {"error": "用户删除失败", "status_code": resp.status_code} +def update_user_password(ip, token, user_name, new_password, original_password): + user_id = get_user_id(ip, token, user_name) + if user_id == "NONE": + return {"error": "User not found"} + + headers = {'X-Auth-Token': token} + body = { + "user": { + "password": new_password, + "original_password": original_password + } + } + api_url = f"http://{ip}:5000/v3/users/{user_id}/password" + resp = requests.post(api_url, data=json.dumps(body), headers=headers) + if resp.status_code == 204: + return {"message": "密码更新成功"} + else: + return {"error": "密码更新失败", "status_code": resp.status_code} \ No newline at end of file diff --git a/main.py b/main.py new file mode 100644 index 0000000..64327d5 --- /dev/null +++ b/main.py @@ -0,0 +1,126 @@ +from keystone import get_token +from keystone import user +from keystone import domain +import time +def main(): + print("====================") + print("选择一个操作:") + print("====================") + print("Keystone操作") + print("1. 用户管理") + print("2. 组管理") + print("3. 域管理") + print("====================") + choice = input("输入选项 (1-3): ") + + ip = "172.30.26.171" + token = get_token.get_token(ip,'demo','admin','admin','000000') + + if choice == '1': + print("====================") + print("选择一个操作:") + print("1. 创建用户") + print("2. 获取所有用户") + print("3. 获取特定用户信息") + print("4. 删除用户") + print("5. 更新用户密码") + print("====================") + choice = input("输入选项 (1-5): ") + print("====================") + if choice == '1': + user_name = input("请输入用户名: ") + password = input("请输入密码: ") + description = input("请输入描述: ") + result = user.create_user(ip, token, user_name, password, description) + print(result) + print("====================") + main() + + elif choice == '2': + result = user.get_users(ip, token) + print(result) + main() + + elif choice == '3': + user_name = input("请输入用户名: ") + result = user.get_user(ip, token, user_name) + print(result) + main() + + elif choice == '4': + user_name = input("请输入用户名: ") + result = user.delete_user(ip, token, user_name) + print(result) + main() + + elif choice == '5': + user_name = input("请输入用户名: ") + new_password = input("请输入新密码: ") + original_password = input("请输入原始密码: ") + result = user.update_user_password(ip, token, user_name, new_password, original_password) + print(result) + main() + + else: + print("无效选项") + main() + + elif choice == '2': + print("====================") + print("选择一个操作:") + print("1. 创建组") + print("2. 获取所有组") + print("3. 获取特定组信息") + print("4. 删除组") + print("5. 更新组信息") + print("====================") + choice = input("输入选项 (1-5): ") + print("====================") + if choice == '1': + user_name = input("请输入组名: ") + password = input("请输入域: ") + description = input("请输入描述: ") + result = user.create_user(ip, token, user_name, password, description) + print(result) + print("====================") + main() + + elif choice == '2': + result = user.get_users(ip, token) + print(result) + main() + + elif choice == '3': + user_name = input("请输入用户名: ") + result = user.get_user(ip, token, user_name) + print(result) + main() + + elif choice == '4': + user_name = input("请输入用户名: ") + result = user.delete_user(ip, token, user_name) + print(result) + main() + + elif choice == '5': + user_name = input("请输入用户名: ") + new_password = input("请输入新密码: ") + original_password = input("请输入原始密码: ") + result = user.update_user_password(ip, token, user_name, new_password, original_password) + print(result) + main() + + else: + print("无效选项") + main() + # + # elif choice == '3': + # + # elif choice == '4': + # + # elif choice == '5': + else: + print("无效选项") + main() +if __name__ == "__main__": + main()