django-restit 4.2.103__py3-none-any.whl → 4.2.105__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
account/models/device.py CHANGED
@@ -41,13 +41,15 @@ class MemberDevice(models.Model, rm.RestModel, rm.MetaDataModel):
41
41
  def sendData(self, message, **kwargs):
42
42
  messenger = getCloudMessenger(self.cm_provider)
43
43
  if messenger:
44
- return messenger.sendToDevice(self, message)
44
+ resp = messenger.sendToDevice(self, message)
45
+ return resp
45
46
  return objict(status_code=404, reason=self.cm_provider)
46
47
 
47
48
  def sendNotification(self, title, body):
48
49
  messenger = getCloudMessenger(self.cm_provider)
49
50
  if messenger:
50
- return messenger.sendNotification(self.cm_token, title, body)
51
+ resp = messenger.sendNotification(self.cm_token, title, body)
52
+ return resp
51
53
  return objict(status_code=404, reason=self.cm_provider)
52
54
 
53
55
  def notify(self, title, body):
account/models/member.py CHANGED
@@ -627,7 +627,22 @@ class Member(User, RestModel, MetaDataModel):
627
627
  # for slog in qset:
628
628
  # slog.logout()
629
629
 
630
- def notifyMobile(self, data=None, title=None, body=None):
630
+ def notifyMobile(self, data=None, title=None, body=None, delay=None):
631
+ if delay:
632
+ Task = RestModel.getModel("taskqueue", "Task")
633
+ if delay < 60:
634
+ Task.Publish(
635
+ "account.Member", "on_task_cm",
636
+ data=dict(pk=self.pk, delay=delay, data=data, title=title, body=body),
637
+ stale_after_seconds=300,
638
+ channel="tq_app_handler")
639
+ else:
640
+ Task.Publish(
641
+ "account.Member", "on_task_cm",
642
+ data=dict(pk=self.pk, data=data, title=title, body=body),
643
+ scheduled_for=datetime.now() + timedelta(seconds=delay),
644
+ channel="tq_app_handler")
645
+ return
631
646
  stale = datetime.now() - timedelta(days=60)
632
647
  for device in self.devices.filter(state=1, modified__gt=stale).exclude(cm_provider="ws", cm_token__isnull=True):
633
648
  if data is not None:
@@ -1226,6 +1241,16 @@ class Member(User, RestModel, MetaDataModel):
1226
1241
  return None
1227
1242
  return cls.objects.filter(pk=uid).last()
1228
1243
 
1244
+ @classmethod
1245
+ def on_task_cm(cls, task):
1246
+ member = cls.objects.filter(pk=task.data.pk).last()
1247
+ if not member:
1248
+ task.failed("could not find member")
1249
+ return False
1250
+ if task.data.delay:
1251
+ time.sleep(task.data.delay) # delay
1252
+ member.notifyMobile(data=task.data.data, title=task.data.title, body=task.data.body)
1253
+
1229
1254
 
1230
1255
  class MemberMetaData(MetaDataBase):
1231
1256
  parent = models.ForeignKey(Member, related_name="properties", on_delete=models.CASCADE)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: django-restit
3
- Version: 4.2.103
3
+ Version: 4.2.105
4
4
  Summary: A Rest Framework for DJANGO
5
5
  License: MIT
6
6
  Author: Ian Starnes
@@ -26,11 +26,11 @@ account/migrations/0021_alter_cloudcredentials_group.py,sha256=zoFYmE-hd3uRGX6DR
26
26
  account/migrations/0022_alter_memberdevice_modified.py,sha256=9eeKcdr9p6qFJ8ZxSnKSj1KxZjW8NZfM0YCMck6i0QQ,424
27
27
  account/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
28
28
  account/models/__init__.py,sha256=cV_lMnT2vL_mjiYtT4hlcIHo52ocFbGSNVkOIHHLXZY,385
29
- account/models/device.py,sha256=qW9tKMFhlSepaNku4OOHGb9VoSU6hhOXyg4hzDwlbKk,5886
29
+ account/models/device.py,sha256=0AFeLMGk4im4KZVd3eGSyRbK4eQEXiFM2cdY8GUzihs,5934
30
30
  account/models/feeds.py,sha256=vI7fG4ASY1M0Zjke24RdnfDcuWeATl_yR_25jPmT64g,2011
31
31
  account/models/group.py,sha256=mjWwePt3ogQUo9m0EhURMz0aBrVVx_0Drr0lNDESQio,22281
32
32
  account/models/legacy.py,sha256=zYdtv4LC0ooxPVqWM-uToPwV-lYWQLorSE6p6yn1xDw,2720
33
- account/models/member.py,sha256=XYb3LUd9HhhY6fX4m963-ts0VTmYLLjiqpPzlMoF7Xo,53129
33
+ account/models/member.py,sha256=JziyYNC13SFWX07Thtoe2V_YlrKNn2RHJZcRk15Zh-s,54205
34
34
  account/models/membership.py,sha256=90EpAhOsGaqphDAkONP6j_qQ0OWSRaQsI8H7E7fgMkE,9249
35
35
  account/models/notify.py,sha256=TOkuVBLAsbzT58FOxII_G3Cj_IDQx16vyehyEsNrDcY,15306
36
36
  account/models/passkeys.py,sha256=TJxITUi4DT4_1tW2K7ZlOcRjJuMVl2NtKz7pKQU8-Tw,1516
@@ -352,10 +352,10 @@ metrics/migrations/0004_eodmetrics.py,sha256=Ky6ZVMZqa0F_SUp_QFWY7ZKBgVhy9CS4wZc
352
352
  metrics/migrations/0005_alter_metrics_v1_alter_metrics_v10_alter_metrics_v11_and_more.py,sha256=pmwJfpPJ1RUX_CqM66l6vvV-nrAUPo_GIan0Pc9mQHs,2358
353
353
  metrics/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
354
354
  metrics/models.py,sha256=lD9nVzfwdav70ENulqJ8rE8Ui8EWlzdVp05rg8bAlMA,13444
355
- metrics/periodic.py,sha256=VmL0YG05D6k5fcNsF4QqPEU-BBPbZXjbOrp3b8EHZ-U,651
355
+ metrics/periodic.py,sha256=28V8Ml4y1WpZeuC-6Ggf8l4kudskYpBedIKLAe5Br2c,978
356
356
  metrics/providers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
357
- metrics/providers/aws.py,sha256=RDM5RLeFADHexm4cHaJdAm3K6iz1NwMSNcV9GYuGtjY,7432
358
- metrics/rpc.py,sha256=nY7TQPOXJ-CcFbv5uvrCicGbsvEdrIooD0rFKS8Ma1E,21300
357
+ metrics/providers/aws.py,sha256=vhz0w6xE_V_V050g3V2uKEUPRIaI_o48MFkfsHjLzQU,8307
358
+ metrics/rpc.py,sha256=yIv1ZVnlY_RYI693pX5iptH3gnVAC1DQ2nJQ5vLZQyw,21657
359
359
  metrics/settings.py,sha256=wwHA9Z7BAHNeu3tFVn8Fh5j46KR-eGx0E8r5dzCFlAU,132
360
360
  metrics/tq.py,sha256=WHBRYSinmTuxF9l-_-lx0yfzEYkb0ffVMt_uvCj9bYo,825
361
361
  metrics/utils.py,sha256=PSydxeI983udULUTcbeWG-_ulPSOac6Q_t_8k_Vjn1I,12606
@@ -386,6 +386,7 @@ rest/decorators.py,sha256=ig0LATc3-2mhEJPAWHRbIRM-ZOFyjm6e_F9RhpRWidE,15082
386
386
  rest/encryption.py,sha256=x6Kiez0tVqfxK26MSsRL3k8OS05ni1gEX2aj3I0S9V0,788
387
387
  rest/errors.py,sha256=uKwG9OkLme36etabqK54DMjMQc1fgEoUIAUxXa7WFQw,612
388
388
  rest/extra/__init__.py,sha256=YzmNsch5H5FFLkUK9mIAKyoRK_rJCA9HGb0kubp4h30,54
389
+ rest/extra/hostinfo.py,sha256=bAj-6XjY9sJPLHqLxZZLHjmlzSFDJK1L18w81Zb_1ec,3081
389
390
  rest/extra/json_metadata.py,sha256=p_ffzmANmOFix_oC3voR6_NNTjcn7-T7aXcH-I4_Npg,1078
390
391
  rest/fields.py,sha256=_v1TJVc6vyWlqmwFRJ6mtuR5Fo-lS0KcUhPWIrzKZUo,9719
391
392
  rest/forms.py,sha256=66Wm5cdy8tKib_mGicjq_yd-gNVMFWRECnrDksnNnwU,6316
@@ -412,7 +413,7 @@ rest/models/metadata.py,sha256=1nQ7CYo9bJHoaXE_hVNaj1-Y7yqhHlf2ZlaD1IfTzic,12904
412
413
  rest/net.py,sha256=LcB2QV6VNRtsSdmiQvYZgwQUDwOPMn_VBdRiZ6OpI-I,2974
413
414
  rest/regexes.yaml,sha256=VoGb4E-P_K9f82Yzcpltgzekpt9usRtwu9PYlo46nUw,149463
414
415
  rest/requestex.py,sha256=N56056vV3zWkAP-QrYsCu7SdpPzE5kLuPoxGIuZAKt0,16127
415
- rest/rpc.py,sha256=Z-0Q62VeMViZiS_9vBHKJmbERgemsfg8pnKFjV-DH-w,4200
416
+ rest/rpc.py,sha256=lHJkZXOxLJJoD4LVPDMXZGk5jV6Yltu7Lu4pMxMpq38,1764
416
417
  rest/search.py,sha256=QVjk2b5tZLgf1zM2MHvJTyRjwUbY5ZD7HXSTmSPXtvU,8362
417
418
  rest/serializers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
418
419
  rest/serializers/collection.py,sha256=V9O4qxw26VX9dSYdbsN0-RNnXEi347Ln8eFLZ003LhA,4646
@@ -455,7 +456,7 @@ taskqueue/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
455
456
  taskqueue/admin.py,sha256=E6zXoToS_ea3MdoGjZzF1JiepWFtDSoZUQdan8H-pXI,208
456
457
  taskqueue/migrations/0001_initial.py,sha256=JwYib8CK5ftSXlfxKZUcKEEVsXktNB5q3h-2tu9inGk,4738
457
458
  taskqueue/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
458
- taskqueue/models.py,sha256=N3_9jWHPGzs6UxlAzpjst6qPhvIs1RELTy1cMXMeXsA,22407
459
+ taskqueue/models.py,sha256=i8v0vQqlz4X3rVFVJsUSldA-26NEPWnsMZF2Kly_1Qo,22398
459
460
  taskqueue/periodic.py,sha256=2i0271khrCow3hDmlNEcoAZnesBVl40jd7MIim2Cxs4,3543
460
461
  taskqueue/rpc.py,sha256=Lf5VUoqCRkfWUAIvx_s508mjAtDPwpiWyxg0ryqWbQA,5793
461
462
  taskqueue/tq.py,sha256=PzSoDrawYcqZylruEgsK95gcJ4J_VhdM6rxg9V6_X8E,942
@@ -508,7 +509,7 @@ ws4redis/servers/uwsgi.py,sha256=VyhoCI1DnVFqBiJYHoxqn5Idlf6uJPHvfBKgkjs34mo,172
508
509
  ws4redis/settings.py,sha256=K0yBiLUuY81iDM4Yr-k8hbvjn5VVHu5zQhmMK8Dtz0s,1536
509
510
  ws4redis/utf8validator.py,sha256=S0OlfjeGRP75aO6CzZsF4oTjRQAgR17OWE9rgZdMBZA,5122
510
511
  ws4redis/websocket.py,sha256=R0TUyPsoVRD7Y_oU7w2I6NL4fPwiz5Vl94-fUkZgLHA,14848
511
- django_restit-4.2.103.dist-info/LICENSE.md,sha256=VHN4hhEeVOoFjtG-5fVv4jesA4SWi0Z-KgOzzN6a1ps,1068
512
- django_restit-4.2.103.dist-info/METADATA,sha256=nrU8OENjEKfiHoufi6H03kYhsf4mkpD01W8WvOWJkeM,7663
513
- django_restit-4.2.103.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
514
- django_restit-4.2.103.dist-info/RECORD,,
512
+ django_restit-4.2.105.dist-info/LICENSE.md,sha256=VHN4hhEeVOoFjtG-5fVv4jesA4SWi0Z-KgOzzN6a1ps,1068
513
+ django_restit-4.2.105.dist-info/METADATA,sha256=coKathiRmyLShZnTuanyUxbHmC_0C2nPkuTfHR4aszs,7663
514
+ django_restit-4.2.105.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
515
+ django_restit-4.2.105.dist-info/RECORD,,
metrics/periodic.py CHANGED
@@ -3,6 +3,9 @@ from taskqueue.models import Task
3
3
  from .models import Metrics
4
4
  from rest import log
5
5
  from rest import decorators as rd
6
+ from rest import settings
7
+
8
+ PUSH_METRICS_TO_CLOUDWATCH = settings.get("PUSH_METRICS_TO_CLOUDWATCH", False)
6
9
 
7
10
 
8
11
  @rd.periodic(minute=15, hour=10)
@@ -16,3 +19,10 @@ def run_cleanup(force=False, verbose=False, now=None):
16
19
  @rd.periodic(minute=15, hour=11, weekday=1)
17
20
  def run_checks(force=False, verbose=False, now=None):
18
21
  Task.Publish("metrics", "run_monitoring", channel="tq_app_handler")
22
+
23
+
24
+ @rd.periodic(minute=rd.PERIODIC_EVERY_5_MINUTES)
25
+ def run_aws_metrics(force=False, verbose=False, now=None):
26
+ if PUSH_METRICS_TO_CLOUDWATCH:
27
+ from metrics.providers import aws
28
+ aws.publishLocalMetrics()
metrics/providers/aws.py CHANGED
@@ -2,7 +2,7 @@ import boto3
2
2
  from datetime import datetime, timedelta
3
3
  from rest import settings
4
4
  from objict import objict
5
- import socket
5
+ from rest.extra import hostinfo
6
6
 
7
7
 
8
8
  METRIC_MAP = {
@@ -19,10 +19,20 @@ METRIC_MAP = {
19
19
  "cache_cons": "CurrConnections",
20
20
  "max": "Maximum",
21
21
  "min": "Minimum",
22
- "avg": "Average"
22
+ "avg": "Average",
23
+ "ec2_cons": "EstablishedConnections"
23
24
  }
24
25
 
25
26
 
27
+ def publishLocalMetrics():
28
+ # this will publish any local metrics to cloudwatch
29
+ instance = getLocalEC2()
30
+ pushMetric(
31
+ METRIC_MAP["ec2_cons"],
32
+ hostinfo.getTcpEstablishedCount(),
33
+ "Count", instance)
34
+
35
+
26
36
  def getLocalEC2():
27
37
  """
28
38
  {
@@ -43,9 +53,7 @@ def getLocalEC2():
43
53
  "zone": "us-west-2d"
44
54
  }
45
55
  """
46
- hostname = socket.gethostname()
47
- priv_ip = socket.gethostbyname(hostname)
48
- return getEC2ByIP(priv_ip)
56
+ return getEC2ByIP(hostinfo.getHostIP())
49
57
 
50
58
 
51
59
  def getClient(region=settings.AWS_REGION, service="cloudwatch"):
@@ -54,6 +62,29 @@ def getClient(region=settings.AWS_REGION, service="cloudwatch"):
54
62
  return boto3.client(service, aws_access_key_id=key, aws_secret_access_key=secret, region_name=region)
55
63
 
56
64
 
65
+ def pushMetric(name, value, unit="Count", instance=None):
66
+ """Push the custom metric to CloudWatch."""
67
+ cloudwatch = getClient(service="cloudwatch")
68
+ if instance is None:
69
+ instance = getLocalEC2()
70
+ return cloudwatch.put_metric_data(
71
+ Namespace = 'CustomMetrics',
72
+ MetricData = [
73
+ {
74
+ 'MetricName': name,
75
+ 'Dimensions': [
76
+ {
77
+ 'Name': 'InstanceId',
78
+ 'Value': instance.id
79
+ },
80
+ ],
81
+ 'Value': value,
82
+ 'Unit': unit
83
+ },
84
+ ]
85
+ )
86
+
87
+
57
88
  def buildQuery(id, instance, period=300, metric="cpu", namespace="rds", stat="max"):
58
89
  dname = "DBInstanceIdentifier"
59
90
  if namespace == "ec2":
@@ -135,7 +166,7 @@ def getAllEC2(just_ids=False, region=settings.AWS_REGION):
135
166
 
136
167
  def getEC2ByIP(ip):
137
168
  # retreives the local ec2 instance details by private ip
138
- client = getClient("ec2")
169
+ client = getClient(service="ec2")
139
170
  filters = [dict(Name="private-ip-address", Values=[ip])]
140
171
  resp = client.describe_instances(Filters=filters)["Reservations"]
141
172
  try:
metrics/rpc.py CHANGED
@@ -287,7 +287,7 @@ def getPeriods(period, duration):
287
287
 
288
288
  @rd.urlGET('restit/domains')
289
289
  @rd.login_required
290
- def rest_on_ec2_domains(request, pk=None):
290
+ def rest_on_ec2_domains(request):
291
291
  if not settings.DOMAIN_WATCH:
292
292
  return rv.restPermissionDenied(request)
293
293
 
@@ -300,7 +300,7 @@ def rest_on_ec2_domains(request, pk=None):
300
300
 
301
301
  @rd.urlGET('restit/servers')
302
302
  @rd.login_required
303
- def rest_on_ec2_restit_stats(request, pk=None):
303
+ def rest_on_ec2_restit_stats(request):
304
304
  hostname = settings.SERVER_ROOT
305
305
  if hostname is None:
306
306
  hostname = settings.SERVER_NAME
@@ -332,19 +332,19 @@ def rest_on_ec2_restit_stats(request, pk=None):
332
332
 
333
333
  @rd.urlGET('aws/ec2/list/details')
334
334
  @rd.login_required
335
- def rest_on_ec2_list(request, pk=None):
335
+ def rest_on_ec2_list(request):
336
336
  return rv.restReturn(request, dict(data=aws.getAllEC2()))
337
337
 
338
338
 
339
339
  @rd.urlGET('aws/ec2/list/ids')
340
340
  @rd.login_required
341
- def rest_on_ec2_list_ids(request, pk=None):
341
+ def rest_on_ec2_list_ids(request):
342
342
  return rv.restReturn(request, dict(data=aws.getAllEC2(True)))
343
343
 
344
344
 
345
345
  @rd.urlGET('aws/ec2/cpu')
346
346
  @rd.requires_params(["ids"])
347
- def rest_on_ec2_metrics_cpu(request, pk=None):
347
+ def rest_on_ec2_metrics_cpu(request):
348
348
  ids = request.DATA.getlist("ids")
349
349
  period = request.DATA.get("period", 300, field_type=int)
350
350
  duration = request.DATA.get("duration", period*8, field_type=int)
@@ -383,9 +383,22 @@ def rest_on_ec2_metrics_cpu(request, pk=None):
383
383
  return rv.restReturn(request, dict(data=data))
384
384
 
385
385
 
386
+ @rd.urlGET('aws/ec2/network/established')
387
+ @rd.requires_params(["ids"])
388
+ def rest_on_ec2_metrics_net_established(request):
389
+ data = aws.getMetrics(
390
+ request.DATA.getlist("ids"),
391
+ period=request.DATA.get("period", 300, field_type=int),
392
+ duration_seconds=request.DATA.get("duration", 900, field_type=int),
393
+ metric="EstablishedConnections",
394
+ namespace="CustomMetrics",
395
+ stat="max")
396
+ return rv.restReturn(request, dict(data=data))
397
+
398
+
386
399
  @rd.urlGET('aws/ec2/network/in')
387
400
  @rd.requires_params(["ids"])
388
- def rest_on_ec2_metrics_netin(request, pk=None):
401
+ def rest_on_ec2_metrics_netin(request):
389
402
  data = aws.getMetrics(
390
403
  request.DATA.getlist("ids"),
391
404
  period=request.DATA.get("period", 300, field_type=int),
@@ -398,7 +411,7 @@ def rest_on_ec2_metrics_netin(request, pk=None):
398
411
 
399
412
  @rd.urlGET('aws/ec2/network/out')
400
413
  @rd.requires_params(["ids"])
401
- def rest_on_ec2_metrics_netout(request, pk=None):
414
+ def rest_on_ec2_metrics_netout(request):
402
415
  ids = request.DATA.getlist("ids")
403
416
  period = request.DATA.get("period", 300, field_type=int)
404
417
  duration = request.DATA.get("duration", period*8, field_type=int)
@@ -426,7 +439,7 @@ def rest_on_ec2_metrics_netout(request, pk=None):
426
439
 
427
440
  @rd.urlGET('aws/rds/cpu')
428
441
  @rd.requires_params(["ids"])
429
- def rest_on_ec2_metrics_cpu(request, pk=None):
442
+ def rest_on_ec2_metrics_cpu(request):
430
443
  ids = request.DATA.getlist("ids")
431
444
  period = request.DATA.get("period", 300, field_type=int)
432
445
  duration = request.DATA.get("duration", period*8, field_type=int)
@@ -446,7 +459,7 @@ def rest_on_ec2_metrics_cpu(request, pk=None):
446
459
 
447
460
  @rd.urlGET('aws/rds/memory')
448
461
  @rd.requires_params(["ids"])
449
- def rest_on_rds_metrics_memory(request, pk=None):
462
+ def rest_on_rds_metrics_memory(request):
450
463
  ids = request.DATA.getlist("ids")
451
464
  period = request.DATA.get("period", 300, field_type=int)
452
465
  duration = request.DATA.get("duration", period*8, field_type=int)
@@ -466,7 +479,7 @@ def rest_on_rds_metrics_memory(request, pk=None):
466
479
 
467
480
  @rd.urlGET('aws/rds/cons')
468
481
  @rd.requires_params(["ids"])
469
- def rest_on_rds_metrics_cons(request, pk=None):
482
+ def rest_on_rds_metrics_cons(request):
470
483
  ids = request.DATA.getlist("ids")
471
484
  period = request.DATA.get("period", 300, field_type=int)
472
485
  duration = request.DATA.get("duration", period*8, field_type=int)
@@ -486,19 +499,19 @@ def rest_on_rds_metrics_cons(request, pk=None):
486
499
 
487
500
  @rd.urlGET('aws/redis/cpu')
488
501
  @rd.requires_params(["ids"])
489
- def rest_on_redis_metrics_cpu(request, pk=None):
502
+ def rest_on_redis_metrics_cpu(request):
490
503
  return get_redis_metrics(request, "cpu")
491
504
 
492
505
 
493
506
  @rd.urlGET('aws/redis/cons')
494
507
  @rd.requires_params(["ids"])
495
- def rest_on_redis_metrics_cons(request, pk=None):
508
+ def rest_on_redis_metrics_cons(request):
496
509
  return get_redis_metrics(request, "cache_cons")
497
510
 
498
511
 
499
512
  @rd.urlGET('aws/redis/memory')
500
513
  @rd.requires_params(["ids"])
501
- def rest_on_redis_metrics_mem(request, pk=None):
514
+ def rest_on_redis_metrics_mem(request):
502
515
  return get_redis_metrics(request, "cache_usage")
503
516
 
504
517
 
rest/extra/hostinfo.py ADDED
@@ -0,0 +1,122 @@
1
+ from datetime import datetime
2
+ import time
3
+ from rest import helpers
4
+ from django.conf import settings
5
+ import django
6
+ import version
7
+ import platform
8
+ import socket
9
+
10
+
11
+ try:
12
+ import psutil
13
+ except Exception:
14
+ print("no psutil")
15
+
16
+ SOFTWARE_VERSIONS = getattr(settings, 'SOFTWARE_VERSIONS', None)
17
+
18
+
19
+ def getHostIP():
20
+ hostname = socket.gethostname()
21
+ return socket.gethostbyname(hostname)
22
+
23
+
24
+ def getTcpEstablishedCount():
25
+ return len(getTcpEstablished())
26
+
27
+
28
+ def getTcpEstablished():
29
+ cons = psutil.net_connections(kind="tcp")
30
+ established = []
31
+ for c in cons:
32
+ if c.status == "ESTABLISHED":
33
+ established.append(c)
34
+ return established
35
+
36
+
37
+ def getVersions(out=None):
38
+ if out is None:
39
+ out = {}
40
+ for key in SOFTWARE_VERSIONS:
41
+ if key == "django":
42
+ out[key] = django.__version__
43
+ else:
44
+ out[key] = safe_cmd(SOFTWARE_VERSIONS[key])
45
+ return out
46
+
47
+
48
+ def getHostInfo(include_versions=False, include_blocked=False):
49
+ mem = psutil.virtual_memory()
50
+ disk = psutil.disk_usage('/')
51
+ net = psutil.net_io_counters()
52
+
53
+ out = {
54
+ "time": time.time(),
55
+ "datetime": str(datetime.now()),
56
+ "version": version.VERSION,
57
+ "os": {
58
+ "system": platform.system(),
59
+ "version": platform.version(),
60
+ "hostname": platform.node(),
61
+ "release": platform.release(),
62
+ "processor": platform.processor(),
63
+ "machine": platform.machine()
64
+ },
65
+ "boot_time": psutil.boot_time(),
66
+ "cpu_load": psutil.cpu_percent(),
67
+ "cpus_load": psutil.cpu_percent(percpu=True),
68
+ "memory": {
69
+ "total": mem.total,
70
+ "used": mem.used,
71
+ "available": mem.available,
72
+ "percent": mem.percent
73
+ },
74
+ "disk": {
75
+ "total": disk.total,
76
+ "used": disk.used,
77
+ "free": disk.free,
78
+ "percent": disk.percent
79
+ },
80
+ "users": psutil.users()
81
+ }
82
+
83
+ try:
84
+ out["cpu"] = {
85
+ "count": psutil.cpu_count(),
86
+ "freq": psutil.cpu_freq(),
87
+ }
88
+ except Exception:
89
+ pass
90
+
91
+ try:
92
+ out["network"] = {
93
+ "tcp_cons": getTcpEstablishedCount(),
94
+ "bytes_sent": net.bytes_sent,
95
+ "bytes_recv": net.bytes_recv,
96
+ "packets_sent": net.packets_sent,
97
+ "packets_recv": net.packets_recv,
98
+ "errin": net.errin,
99
+ "errout": net.errout,
100
+ "dropin": net.dropin,
101
+ "dropout": net.dropout
102
+ }
103
+ except Exception:
104
+ pass
105
+
106
+ if include_versions and SOFTWARE_VERSIONS:
107
+ out["versions"] = getVersions()
108
+ if include_blocked:
109
+ out["blocked"] = helpers.getBlockedHosts()
110
+ return out
111
+
112
+
113
+ def safe_cmd(cmd, *args):
114
+ try:
115
+ cmd_args = [cmd]
116
+ if len(args):
117
+ cmd_args.extend(list(args))
118
+ return helpers.toString(subprocess.check_output(cmd_args, shell=True).strip())
119
+ except Exception as err:
120
+ return str(err)
121
+ # print( str(err))
122
+ return None
rest/rpc.py CHANGED
@@ -1,10 +1,6 @@
1
1
  from . import views
2
2
 
3
3
  import version
4
- import time
5
- from datetime import datetime
6
- import platform
7
- import subprocess
8
4
  from . import joke
9
5
  from . import helpers
10
6
 
@@ -13,33 +9,30 @@ from django.conf import settings
13
9
 
14
10
 
15
11
  from .decorators import url
16
-
17
- try:
18
- import psutil
19
- except Exception:
20
- print("no psutil")
12
+ from rest.extra import hostinfo
21
13
 
22
14
 
23
15
  URL_PREFIX = ""
24
16
 
25
17
  SOFTWARE_VERSIONS = getattr(settings, 'SOFTWARE_VERSIONS', None)
26
18
  ALLOW_PUBLIC_SYS_INFO = getattr(settings, 'ALLOW_PUBLIC_SYS_INFO', False)
19
+ SYS_INFO_KEY = getattr(settings, 'SYS_INFO_KEY', None)
27
20
  # SOFTWARE_VERSIONS_ACTUAL = {}
28
21
 
29
22
 
30
- @url(r'^version$')
23
+ @url('version')
31
24
  def on_get_version(request):
32
25
  return views.restStatus(request, True, {"data": version.VERSION, "ip": request.ip})
33
26
 
34
27
 
35
- @url(r'^versions$')
28
+ @url('versions')
36
29
  def on_get_version(request):
37
30
  from rest import __version__ as restit_version
38
31
  versions = dict(
39
32
  project=version.VERSION,
40
33
  restit=restit_version)
41
34
  if request.DATA.get("detailed") and SOFTWARE_VERSIONS:
42
- getVersions(versions)
35
+ hostinfo.getVersions(versions)
43
36
  return views.restStatus(request, True, {"data": versions})
44
37
 
45
38
 
@@ -51,110 +44,19 @@ def on_get_my_session(request):
51
44
  return views.restReturn(request, dict(echo=request.session.get("echo", "not set")))
52
45
 
53
46
 
54
- @url(r'^joke$')
47
+ @url('joke')
55
48
  def on_get_joke(request):
56
49
  return views.restGet(request, {"joke": joke.getRandomJoke()})
57
50
 
58
51
 
59
- def getTcpEstablishedCount():
60
- return len(getTcpEstablished())
61
-
62
-
63
- def getTcpEstablished():
64
- cons = psutil.net_connections(kind="tcp")
65
- established = []
66
- for c in cons:
67
- if c.status == "ESTABLISHED":
68
- established.append(c)
69
- return established
70
-
71
-
72
- @url(r'^system/info$')
52
+ @url('system/info')
73
53
  def on_get_system_info(request):
74
- if not ALLOW_PUBLIC_SYS_INFO and not request.user.is_authenticated:
75
- return views.restPermissionDenied(request, "system info is not public", 565)
76
- mem = psutil.virtual_memory()
77
- disk = psutil.disk_usage('/')
78
- net = psutil.net_io_counters()
79
-
80
- out = {
81
- "time": time.time(),
82
- "datetime": str(datetime.now()),
83
- "version": version.VERSION,
84
- "os": {
85
- "system": platform.system(),
86
- "version": platform.version(),
87
- "hostname": platform.node(),
88
- "release": platform.release(),
89
- "processor": platform.processor(),
90
- "machine": platform.machine()
91
- },
92
- "boot_time": psutil.boot_time(),
93
- "cpu_load": psutil.cpu_percent(),
94
- "cpus_load": psutil.cpu_percent(percpu=True),
95
- "memory": {
96
- "total": mem.total,
97
- "used": mem.used,
98
- "available": mem.available,
99
- "percent": mem.percent
100
- },
101
- "disk": {
102
- "total": disk.total,
103
- "used": disk.used,
104
- "free": disk.free,
105
- "percent": disk.percent
106
- },
107
- "users": psutil.users()
108
- }
109
-
110
- try:
111
- out["cpu"] = {
112
- "count": psutil.cpu_count(),
113
- "freq": psutil.cpu_freq(),
114
- }
115
- except Exception:
116
- pass
117
-
118
- try:
119
- out["network"] = {
120
- "tcp_cons": getTcpEstablishedCount(),
121
- "bytes_sent": net.bytes_sent,
122
- "bytes_recv": net.bytes_recv,
123
- "packets_sent": net.packets_sent,
124
- "packets_recv": net.packets_recv,
125
- "errin": net.errin,
126
- "errout": net.errout,
127
- "dropin": net.dropin,
128
- "dropout": net.dropout
129
- }
130
- except Exception:
131
- pass
132
-
133
- if request.DATA.get("versions") and SOFTWARE_VERSIONS:
134
- out["versions"] = getVersions()
135
- if request.DATA.get("blocked"):
136
- out["blocked"] = helpers.getBlockedHosts()
54
+ key = request.DATA.get("key")
55
+ if SYS_INFO_KEY is None or key != SYS_INFO_KEY:
56
+ if not ALLOW_PUBLIC_SYS_INFO and not request.user.is_authenticated:
57
+ return views.restPermissionDenied(request, "system info is not public", 565)
58
+ out = hostinfo.getHostInfo(
59
+ include_versions=request.DATA.get("versions") and SOFTWARE_VERSIONS,
60
+ include_blocked=request.DATA.get("blocked"))
137
61
  return views.restGet(request, out)
138
62
 
139
-
140
- def safe_cmd(cmd, *args):
141
- try:
142
- cmd_args = [cmd]
143
- if len(args):
144
- cmd_args.extend(list(args))
145
- return helpers.toString(subprocess.check_output(cmd_args, shell=True).strip())
146
- except Exception as err:
147
- return str(err)
148
- # print( str(err))
149
- return None
150
-
151
-
152
- def getVersions(out=None):
153
- if out is None:
154
- out = {}
155
- for key in SOFTWARE_VERSIONS:
156
- if key == "django":
157
- out[key] = django.__version__
158
- else:
159
- out[key] = safe_cmd(SOFTWARE_VERSIONS[key])
160
- return out
taskqueue/models.py CHANGED
@@ -392,7 +392,7 @@ class Task(models.Model, RestModel):
392
392
  return task
393
393
 
394
394
  @classmethod
395
- def PublishModelTask(cls, model_name, fname, data, stale_after_seconds=0, channel="tq_model_handler", scheduled_for=scheduled_for):
395
+ def PublishModelTask(cls, model_name, fname, data, stale_after_seconds=0, channel="tq_model_handler", scheduled_for=None):
396
396
  return cls.Publish(cls, model_name, fname, data, stale_after_seconds, channel, scheduled_for)
397
397
 
398
398
  @classmethod