routes.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. from flask import render_template, send_file, url_for, flash, redirect, request, session
  2. from lxconsole import app, db, bcrypt
  3. from lxconsole.forms import RegistrationForm, LoginForm
  4. from lxconsole.models import User, Server, Simplestream, Group, AccessControl, UserGroup
  5. from flask_login import login_user, current_user, logout_user, login_required
  6. from lxconsole.api import api
  7. app.register_blueprint(api)
  8. @app.route("/")
  9. def home():
  10. if current_user.is_authenticated:
  11. return redirect(url_for('servers'))
  12. else:
  13. if User.query.first():
  14. return redirect(url_for('login'))
  15. if not Simplestream.query.first():
  16. images_simplestream = Simplestream(url='https://images.linuxcontainers.org', alias='images')
  17. ubuntu_simplestream = Simplestream(url='https://cloud-images.ubuntu.com/releases', alias='ubuntu')
  18. ubuntu_daily_simplestream = Simplestream(url='https://cloud-images.ubuntu.com/daily', alias='ubuntu-daily')
  19. db.session.add(images_simplestream)
  20. db.session.add(ubuntu_simplestream)
  21. db.session.add(ubuntu_daily_simplestream)
  22. db.session.commit()
  23. if not Group.query.first():
  24. administrators_group = Group(name='Administrators', description='Default administrators group')
  25. operators_group = Group(name='Operators', description='Default operators')
  26. users_group = Group(name='Users', description='Default users group')
  27. auditors_group = Group(name='Auditors', description='Default auditors group')
  28. db.session.add(administrators_group)
  29. db.session.add(operators_group)
  30. db.session.add(users_group)
  31. db.session.add(auditors_group)
  32. db.session.commit()
  33. if not AccessControl.query.first():
  34. administrators_access_control = AccessControl(group_id=1, role_id=1, server_id=0, scope='global', description='Default access control for Administrators')
  35. operators_access_control = AccessControl(group_id=2, role_id=2, server_id=0, scope='global', description='Default access control for Operators')
  36. users_access_control = AccessControl(group_id=3, role_id=3, server_id=0, scope='global', description='Default access control for Users')
  37. auditors_access_control = AccessControl(group_id=4, role_id=4, server_id=0, scope='global', description='Default access control for Auditors')
  38. db.session.add(administrators_access_control)
  39. db.session.add(operators_access_control)
  40. db.session.add(users_access_control)
  41. db.session.add(auditors_access_control)
  42. db.session.commit()
  43. return redirect(url_for('register'))
  44. @app.route("/certificates")
  45. @login_required
  46. def certificates():
  47. return render_template('certificates.html', page_title='Certificates', page_user_id=current_user.id, page_username=current_user.username,)
  48. @app.route("/cluster-groups")
  49. @login_required
  50. def cluster_groups():
  51. return render_template('cluster-groups.html', page_title='Cluster Groups', page_user_id=current_user.id, page_username=current_user.username,)
  52. @app.route("/cluster-members")
  53. @login_required
  54. def cluster_members():
  55. return render_template('cluster-members.html', page_title='Cluster Members', page_user_id=current_user.id, page_username=current_user.username,)
  56. @app.route("/images")
  57. @login_required
  58. def images():
  59. return render_template('images.html', page_title='Images', page_user_id=current_user.id, page_username=current_user.username,)
  60. @app.route("/instance")
  61. @login_required
  62. def instance():
  63. return render_template('instance.html', page_title='Instance', page_user_id=current_user.id, page_username=current_user.username,)
  64. @app.route("/instances")
  65. @login_required
  66. def instances():
  67. return render_template('instances.html', page_title='Instances', page_user_id=current_user.id, page_username=current_user.username,)
  68. @app.route("/network-acl")
  69. @login_required
  70. def network_acl():
  71. return render_template('network-acl.html', page_title='Network ACL', page_user_id=current_user.id, page_username=current_user.username,)
  72. @app.route("/network-acls")
  73. @login_required
  74. def network_acls():
  75. return render_template('network-acls.html', page_title='Network ACLs', page_user_id=current_user.id, page_username=current_user.username,)
  76. @app.route("/network-zones")
  77. @login_required
  78. def network_zones():
  79. return render_template('network-zones.html', page_title='Network Zones', page_user_id=current_user.id, page_username=current_user.username,)
  80. @app.route("/network")
  81. @login_required
  82. def network():
  83. return render_template('network.html', page_title='Network', page_user_id=current_user.id, page_username=current_user.username,)
  84. @app.route("/networks")
  85. @login_required
  86. def networks():
  87. return render_template('networks.html', page_title='Networks', page_user_id=current_user.id, page_username=current_user.username,)
  88. @app.route("/operations")
  89. @login_required
  90. def operations():
  91. return render_template('operations.html', page_title='Operations', page_user_id=current_user.id, page_username=current_user.username,)
  92. @app.route("/profiles")
  93. @login_required
  94. def profiles():
  95. return render_template('profiles.html', page_title='Profiles', page_user_id=current_user.id, page_username=current_user.username,)
  96. @app.route("/projects")
  97. @login_required
  98. def projects():
  99. return render_template('projects.html', page_title='Projects', page_user_id=current_user.id, page_username=current_user.username,)
  100. @app.route("/server")
  101. @login_required
  102. def server():
  103. return render_template('server.html', page_title='Server', page_user_id=current_user.id, page_username=current_user.username,)
  104. @app.route("/servers")
  105. @login_required
  106. def servers():
  107. return render_template('servers.html', page_title='Servers', page_user_id=current_user.id, page_username=current_user.username, client_crt=session['client_crt'])
  108. @app.route("/simplestreams")
  109. @login_required
  110. def simplestreams():
  111. return render_template('simplestreams.html', page_title='Simplestreams', page_user_id=current_user.id, page_username=current_user.username,)
  112. @app.route("/storage-pools")
  113. @login_required
  114. def storage_pools():
  115. return render_template('storage-pools.html', page_title='Storage Pools', page_user_id=current_user.id, page_username=current_user.username,)
  116. @app.route("/storage-volumes")
  117. @login_required
  118. def storage_volumes():
  119. return render_template('storage-volumes.html', page_title='Storage Volumes', page_user_id=current_user.id, page_username=current_user.username,)
  120. @app.route("/backups/<serverId>/<project>/<instance>/<filename>")
  121. @login_required
  122. def backups(serverId, project, instance, filename):
  123. return send_file('../backups/' + serverId + '/' + project + '/' + instance + '/' + filename )
  124. @app.route("/register", methods=['GET', 'POST'])
  125. def register():
  126. if current_user.is_authenticated:
  127. return redirect(url_for('servers'))
  128. if User.query.first():
  129. return redirect(url_for('login'))
  130. else:
  131. form = RegistrationForm()
  132. if form.validate_on_submit():
  133. hashed_password = bcrypt.generate_password_hash(form.password.data).decode('utf-8')
  134. user = User(username=form.username.data, email=form.email.data, password=hashed_password)
  135. db.session.add(user)
  136. db.session.commit()
  137. user_group = UserGroup(user_id=1, group_id=1)
  138. db.session.add(user_group)
  139. db.session.commit()
  140. flash('Your account has been created! You are now able to log in', 'success')
  141. return redirect(url_for('login'))
  142. return render_template('register.html', title='Register', form=form)
  143. @app.route("/login", methods=['GET', 'POST'])
  144. def login():
  145. if current_user.is_authenticated:
  146. return redirect(url_for('servers'))
  147. form = LoginForm()
  148. if form.validate_on_submit():
  149. user = User.query.filter_by(username=form.username.data).first()
  150. if user and bcrypt.check_password_hash(user.password, form.password.data):
  151. login_user(user, remember=form.remember.data)
  152. next_page = request.args.get('next')
  153. with open('certs/client.crt', 'r') as file:
  154. session['client_crt'] = file.read()
  155. session['roles'] = [
  156. {'id': 1, 'name': 'Administrator', 'description': 'Default role with full privileges'},
  157. {'id': 2, 'name': 'Operator', 'description': 'Default role granting all LXD-based privileges'},
  158. {'id': 3, 'name': 'User', 'description': 'Default role with limited privileges'},
  159. {'id': 4, 'name': 'Auditor', 'description': 'Default role with read-only privileges'},
  160. ]
  161. session['global_roles'] = []
  162. session['host_roles'] = []
  163. groups = UserGroup.query.filter_by(user_id=current_user.id).all()
  164. print(groups)
  165. for group in groups:
  166. print(group)
  167. print(group.group_id)
  168. access_controls = AccessControl.query.filter_by(group_id=group.group_id).all()
  169. print(access_controls)
  170. for access_control in access_controls:
  171. print(access_control)
  172. if access_control.scope == 'global':
  173. print(access_control.scope)
  174. for role in session['roles']:
  175. print(role['id'])
  176. print(access_control.role_id)
  177. if role['id'] == access_control.role_id:
  178. session['global_roles'].append(str(role['name']))
  179. print(role['name'])
  180. if access_control.scope == 'host':
  181. for role in session['roles']:
  182. if role['id'] == access_control.role_id:
  183. session['host_roles'][access_control.server_id].append(str(role['name']))
  184. return redirect(next_page) if next_page else redirect(url_for('servers'))
  185. else:
  186. flash('Login Unsuccessful. Please check username and password', 'danger')
  187. return render_template('login.html', title='Login', form=form)
  188. @app.route("/logout")
  189. def logout():
  190. logout_user()
  191. return redirect(url_for('home'))
  192. @app.route("/account")
  193. @login_required
  194. def account():
  195. return render_template('account.html', title='Account')
  196. @app.route("/users")
  197. @login_required
  198. def users():
  199. return render_template('users.html', page_title='Users', page_user_id=current_user.id, page_username=current_user.username,)
  200. @app.route("/groups")
  201. @login_required
  202. def groups():
  203. return render_template('groups.html', page_title='Groups', page_user_id=current_user.id, page_username=current_user.username,)
  204. @app.route("/roles")
  205. @login_required
  206. def roles():
  207. return render_template('roles.html', page_title='Roles', page_user_id=current_user.id, page_username=current_user.username,)
  208. @app.route("/access-controls")
  209. @login_required
  210. def access_controls():
  211. return render_template('access-controls.html', page_title='Access Controls', page_user_id=current_user.id, page_username=current_user.username,)
  212. @app.route("/logs")
  213. @login_required
  214. def logs():
  215. return render_template('logs.html', page_title='Logs', page_user_id=current_user.id, page_username=current_user.username,)