From 7b8951d441267a7e33c93562b2d39240dc8e6f4b Mon Sep 17 00:00:00 2001 From: kingmo888 <17401091+kingmo888@users.noreply.github.com> Date: Mon, 9 Sep 2024 10:50:13 +0800 Subject: [PATCH] add ip_address for model resolves #137, resolves #15 --- README.md | 2 +- .../0008_rustdesdevice_ip_address.py | 18 +++++++ api/models_work.py | 51 ++++++++++-------- api/templates/show_work.html | 14 +++-- api/views_api.py | 5 +- db/db.sqlite3 | Bin 163840 -> 163840 bytes 6 files changed, 62 insertions(+), 28 deletions(-) create mode 100644 api/migrations/0008_rustdesdevice_ip_address.py diff --git a/README.md b/README.md index 9aa142a..741efb4 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@

一个 python 实现的 Rustdesk API 接口,支持 WebUI 管理
- +
diff --git a/api/migrations/0008_rustdesdevice_ip_address.py b/api/migrations/0008_rustdesdevice_ip_address.py new file mode 100644 index 0000000..fd2658a --- /dev/null +++ b/api/migrations/0008_rustdesdevice_ip_address.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2 on 2024-09-09 10:37 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('api', '0007_alter_rustdesdevice_options_and_more'), + ] + + operations = [ + migrations.AddField( + model_name='rustdesdevice', + name='ip_address', + field=models.CharField(blank=True, max_length=60, verbose_name='IP'), + ), + ] diff --git a/api/models_work.py b/api/models_work.py index 2991d83..899908e 100644 --- a/api/models_work.py +++ b/api/models_work.py @@ -3,6 +3,7 @@ from django.db import models from django.contrib import admin from django.utils.translation import gettext as _ + class RustDeskToken(models.Model): ''' Token ''' @@ -12,17 +13,19 @@ class RustDeskToken(models.Model): uuid = models.CharField(verbose_name=_('uuid'), max_length=60) access_token = models.CharField(verbose_name=_('access_token'), max_length=60, blank=True) create_time = models.DateTimeField(verbose_name=_('登录时间'), auto_now_add=True) - #expire_time = models.DateTimeField(verbose_name='过期时间') + # expire_time = models.DateTimeField(verbose_name='过期时间') + class Meta: ordering = ('-username',) verbose_name = "Token" - verbose_name_plural = _("Token列表") + verbose_name_plural = _("Token列表") + class RustDeskTokenAdmin(admin.ModelAdmin): list_display = ('username', 'uid') search_fields = ('username', 'uid') - list_filter = ('create_time', ) #过滤器 - + list_filter = ('create_time', ) # 过滤器 + class RustDeskTag(models.Model): ''' Tags @@ -30,17 +33,18 @@ class RustDeskTag(models.Model): uid = models.CharField(verbose_name=_('所属用户ID'), max_length=16) tag_name = models.CharField(verbose_name=_('标签名称'), max_length=60) tag_color = models.CharField(verbose_name=_('标签颜色'), max_length=60, blank=True) - + class Meta: ordering = ('-uid',) verbose_name = "Tags" verbose_name_plural = _("Tags列表") + class RustDeskTagAdmin(admin.ModelAdmin): list_display = ('tag_name', 'uid', 'tag_color') search_fields = ('tag_name', 'uid') list_filter = ('uid', ) - + class RustDeskPeer(models.Model): ''' Pees @@ -53,19 +57,19 @@ class RustDeskPeer(models.Model): platform = models.CharField(verbose_name=_('平台'), max_length=30) tags = models.CharField(verbose_name=_('标签'), max_length=30) rhash = models.CharField(verbose_name=_('设备链接密码'), max_length=60) - + class Meta: ordering = ('-username',) verbose_name = "Peers" - verbose_name_plural = _("Peers列表" ) - + verbose_name_plural = _("Peers列表") + class RustDeskPeerAdmin(admin.ModelAdmin): list_display = ('rid', 'uid', 'username', 'hostname', 'platform', 'alias', 'tags') search_fields = ('deviceid', 'alias') list_filter = ('rid', 'uid', ) - - + + class RustDesDevice(models.Model): rid = models.CharField(verbose_name=_('客户端ID'), max_length=60, blank=True) cpu = models.CharField(verbose_name='CPU', max_length=100) @@ -75,21 +79,24 @@ class RustDesDevice(models.Model): uuid = models.CharField(verbose_name='uuid', max_length=100) username = models.CharField(verbose_name=_('系统用户名'), max_length=100, blank=True) version = models.CharField(verbose_name=_('客户端版本'), max_length=100) + ip_address = models.CharField(verbose_name=_('IP'), max_length=60, blank=True) create_time = models.DateTimeField(verbose_name=_('设备注册时间'), auto_now_add=True) update_time = models.DateTimeField(verbose_name=('设备更新时间'), auto_now=True, blank=True) - + class Meta: ordering = ('-rid',) verbose_name = _("设备") - verbose_name_plural = _("设备列表" ) - + verbose_name_plural = _("设备列表") + + class RustDesDeviceAdmin(admin.ModelAdmin): list_display = ('rid', 'hostname', 'memory', 'uuid', 'version', 'create_time', 'update_time') search_fields = ('hostname', 'memory') list_filter = ('rid', ) + class ConnLog(models.Model): - id = models.IntegerField(verbose_name='ID',primary_key=True) + id = models.IntegerField(verbose_name='ID', primary_key=True) action = models.CharField(verbose_name='Action', max_length=20, null=True) conn_id = models.CharField(verbose_name='Connection ID', max_length=10, null=True) from_ip = models.CharField(verbose_name='From IP', max_length=30, null=True) @@ -100,13 +107,15 @@ class ConnLog(models.Model): session_id = models.CharField(verbose_name='Session ID', max_length=60, null=True) uuid = models.CharField(verbose_name='uuid', max_length=60, null=True) + class ConnLogAdmin(admin.ModelAdmin): list_display = ('id', 'action', 'conn_id', 'from_ip', 'from_id', 'rid', 'conn_start', 'conn_end', 'session_id', 'uuid') search_fields = ('from_ip', 'rid') list_filter = ('id', 'from_ip', 'from_id', 'rid', 'conn_start', 'conn_end') + class FileLog(models.Model): - id = models.IntegerField(verbose_name='ID',primary_key=True) + id = models.IntegerField(verbose_name='ID', primary_key=True) file = models.CharField(verbose_name='Path', max_length=500) remote_id = models.CharField(verbose_name='Remote ID', max_length=20, default='0') user_id = models.CharField(verbose_name='User ID', max_length=20, default='0') @@ -115,11 +124,13 @@ class FileLog(models.Model): direction = models.IntegerField(verbose_name='Direction', default=0) logged_at = models.DateTimeField(verbose_name='Logged At', null=True) + class FileLogAdmin(admin.ModelAdmin): list_display = ('id', 'file', 'remote_id', 'user_id', 'user_ip', 'filesize', 'direction', 'logged_at') search_fields = ('file', 'remote_id', 'user_id', 'user_ip') list_filter = ('id', 'file', 'remote_id', 'user_id', 'user_ip', 'filesize', 'direction', 'logged_at') + class ShareLink(models.Model): ''' 分享链接 ''' @@ -129,16 +140,14 @@ class ShareLink(models.Model): is_used = models.BooleanField(verbose_name=_('是否使用'), default=False) is_expired = models.BooleanField(verbose_name=_('是否过期'), default=False) create_time = models.DateTimeField(verbose_name=_('生成时间'), auto_now_add=True) - - class Meta: ordering = ('-create_time',) verbose_name = _("分享链接") - verbose_name_plural = _("链接列表" ) - + verbose_name_plural = _("链接列表") + class ShareLinkAdmin(admin.ModelAdmin): list_display = ('shash', 'uid', 'peers', 'is_used', 'is_expired', 'create_time') search_fields = ('peers', ) - list_filter = ('is_used', 'uid', 'is_expired' ) \ No newline at end of file + list_filter = ('is_used', 'uid', 'is_expired') diff --git a/api/templates/show_work.html b/api/templates/show_work.html index 1e8abe5..5350f57 100644 --- a/api/templates/show_work.html +++ b/api/templates/show_work.html @@ -23,6 +23,7 @@ {{ "系统" | translate }} {{ "CPU" | translate }} {{ "内存" | translate }} + {{ "IP" | translate }} {{ "注册时间" | translate }} {{ "更新时间" | translate }} {{ "状态" | translate }} @@ -41,6 +42,7 @@ {{one.os}} {{one.cpu}} {{one.memory}} + {{one.ip_address}} {{one.create_time}} {{one.update_time}} {{one.status}} @@ -67,10 +69,10 @@ {% endif %} - + {% endif %} - + {% if u.is_admin and show_all %}

@@ -89,6 +91,7 @@ {{ "系统" | translate }} {{ "CPU" | translate }} {{ "内存" | translate }} + {{ "IP" | translate }} {{ "注册日期" | translate }} {{ "更新时间" | translate }} {{ "状态" | translate }} @@ -106,6 +109,7 @@ {{one.os}} {{one.cpu}} {{one.memory}} + {{one.ip_address}} {{one.create_time}} {{one.update_time}} {{one.status}} @@ -132,11 +136,11 @@ {% endif %} -
+
{% endif %} - - + + diff --git a/api/views_api.py b/api/views_api.py index 520cc44..5ede9bc 100644 --- a/api/views_api.py +++ b/api/views_api.py @@ -226,7 +226,7 @@ def sysinfo(request): if request.method == 'GET': result['error'] = _('错误的提交方式!') return JsonResponse(result) - + client_ip = request.META.get('REMOTE_ADDR') postdata = json.loads(request.body) device = RustDesDevice.objects.filter(Q(rid=postdata['id']) & Q(uuid=postdata['uuid'])).first() if not device: @@ -239,6 +239,7 @@ def sysinfo(request): username=postdata.get('username', '-'), uuid=postdata['uuid'], version=postdata['version'], + ip_address=client_ip ) device.save() else: @@ -254,6 +255,8 @@ def heartbeat(request): postdata = json.loads(request.body) device = RustDesDevice.objects.filter(Q(rid=postdata['id']) & Q(uuid=postdata['uuid'])).first() if device: + client_ip = request.META.get('REMOTE_ADDR') + device.ip_address = client_ip device.save() # token保活 create_time = datetime.datetime.now() + datetime.timedelta(seconds=EFFECTIVE_SECONDS) diff --git a/db/db.sqlite3 b/db/db.sqlite3 index afb6fe0444c5438fbb5e8504d213d663f8555df5..1948f0f5526c8d7cb6370fcafb5be404ba6db4aa 100644 GIT binary patch delta 1028 zcmaJ=%WD%s9NwKxY!Xuw+iJ}=55-nnYIoU|Ow2tCd(9*g2wU z+OWSj*6GKGh(7ZA(({yI#*?Zmjg3+~xm-$ri~(Y*$xLBNjzPH>!6Kza2rUFTg7`=# zs`VZ(Rc2iXp(r=zn{(A#vsznlFW1WMY`IdcHfqf#hM4;74FOVgq$Lr7lB&gw>9~dguQ8 z9utR2=fsYvw(DG}GOs4GV}azjB`GBYsz+HX1PCNKbkwIT3IWVdK@hb&=Y#?OUJ_N# z(LgJ?MLC9Cy~q`NHrLNB;$WVSe^AB9v}Z(De|y?Lq}1U|L)twy6g zo#27@Qi8ntrSJ3ZN-&uC_np)?uxF*=01rgs@3axGTYw?sPT#oqm4GL@^cE->*7ti) YDR`(CJ<9<{S1y$F!}>~e9Q;1^7qHg$CIA2c delta 919 zcmaiy%}Z2K7{>28*Q<`{XpUv`ZIq>?ch2|62*E^)gjAv;2*QRO@Ip@7Xq$+pT(m3W zg>Fk1(YkOkn_9aGB6pGhLP0^R7Ij+$GuK52&gyrb_j%vvJRY59f11QD9Z#~&FUD? zR&z~ZJ6n3#Zb5y;mEw{NdCur~rMk2d)CnPUF{lUYLG?BxOiYtbg=B&o