Advertisement
Guest User

Untitled

a guest
Feb 6th, 2017
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.73 KB | None | 0 0
  1. #!/usr/bin/env python
  2.  
  3. # This script will attempt to detect fraudy DHC accounts using
  4. # machine learning.
  5.  
  6. from os import environ
  7. from datetime import datetime
  8. from sklearn import tree
  9. from keystoneclient.v2_0 import client as keyclient
  10. from keystoneauth1.identity import v2
  11. from keystoneauth1 import session
  12. from novaclient import client as novaclient
  13.  
  14.  
  15. def parse_tenant(tenant_id):
  16. """
  17. Parse tenant_id and return an array in the same format as FEATURES
  18. """
  19.  
  20. nclient = novaclient.Client(
  21. 2.0,
  22. username=environ['OS_USERNAME'],
  23. password=environ['OS_PASSWORD'],
  24. tenant_name=environ['OS_TENANT_ID'],
  25. auth_url=environ['OS_AUTH_URL']
  26. )
  27.  
  28. search_opts = {'all_tenants': 1,
  29. 'tenant_id': tenant_id}
  30.  
  31. import ipdb; ipdb.set_trace()
  32. tenant_vms = nclient.servers.list(search_opts=search_opts)
  33. vm_count = len(tenant_vms)
  34. avg_creation_diff = get_avg_time_between_creations(tenant_vms)
  35.  
  36. return [vm_count, avg_creation_diff]
  37.  
  38.  
  39. def get_avg_time_between_creations(vms):
  40. """Return average time (in seconds) between VM creations"""
  41.  
  42. epoch = datetime.utcfromtimestamp(0)
  43. create_times = []
  44. for vm in vms:
  45. created = datetime.strptime(vm.created, "%Y-%m-%dT%H:%M:%SZ")
  46. create_times.append((created - epoch))
  47.  
  48. return sum(create_times)/len(create_times)
  49.  
  50.  
  51. def train(features, labels):
  52. """Train the machine learning framework"""
  53. clf = tree.DecisionTreeClassifier()
  54.  
  55. return clf.fit(features, labels)
  56.  
  57.  
  58. def verify_tenants(tenants, model):
  59. """Use machine learning to detect if tenant is fraudy"""
  60. for tenant in tenants:
  61. status = model.predict(tenant[1])
  62. if status == 0:
  63. print "%s is a Fraudy McFraudface!" % tenant[0]
  64. elif status != 1:
  65. print "Something weird happened with tenant %s" % tenant[0]
  66.  
  67.  
  68. def main():
  69. """The main loop"""
  70.  
  71. auth = v2.Password(
  72. username=environ['OS_USERNAME'],
  73. password=environ['OS_PASSWORD'],
  74. tenant_name=environ['OS_TENANT_NAME'],
  75. auth_url=environ['OS_AUTH_URL']
  76. )
  77. sess = session.Session(auth=auth)
  78. kclient = keyclient.Client(session=sess)
  79.  
  80. features = []
  81. labels = []
  82. # read input tenants
  83. model_tenants = open('model_tenants.txt', 'r')
  84. for tenant in model_tenants.readlines():
  85. tenant, label = tenant.split()
  86. features.append(parse_tenant(tenant))
  87. labels.append(label)
  88. model_tenants.close()
  89.  
  90. # train ML
  91. model = train(features, labels)
  92.  
  93. # now iterate over all tenants, checking for fraudy accounts
  94. tenants = []
  95. for tenant in kclient.tenants.list():
  96. tenants.append([tenant, parse_tenant(tenant)])
  97. verify_tenants(tenants, model)
  98.  
  99.  
  100. if __name__ == "__main__":
  101. main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement