diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..82694bb5 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,21 @@ +FROM python:3.6-slim-stretch + +WORKDIR /app + +COPY sources.list /etc/apt/sources.list +COPY requirements.txt ./ +RUN apt update \ + && apt install -y default-libmysqlclient-dev gcc python-dev libsasl2-dev git sshpass mariadb-client \ + && pip install --no-cache-dir -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple \ + && rm -rf /var/lib/apt/lists/* + +COPY . . +RUN cp conf/celeryd.conf /etc/default/celeryd \ + && cp conf/celeryd.server /etc/init.d/celeryd \ + && cp conf/celerybeat.server /etc/init.d/celerybeat \ + && cp conf/get_mem.py /usr/local/lib/python3.6/site-packages/ansible \ + && chmod +x /etc/init.d/celeryd /etc/init.d/celerybeat /usr/local/lib/python3.6/site-packages/ansible/get_mem.py /app/docker-entrypoint.sh + +EXPOSE 8000 + +ENTRYPOINT [ "/app/docker-entrypoint.sh" ] diff --git a/Ops/__pycache__/__init__.cpython-36.opt-1.pyc b/Ops/__pycache__/__init__.cpython-36.opt-1.pyc deleted file mode 100644 index 66180815..00000000 Binary files a/Ops/__pycache__/__init__.cpython-36.opt-1.pyc and /dev/null differ diff --git a/Ops/__pycache__/__init__.cpython-36.pyc b/Ops/__pycache__/__init__.cpython-36.pyc deleted file mode 100644 index 46ca6486..00000000 Binary files a/Ops/__pycache__/__init__.cpython-36.pyc and /dev/null differ diff --git a/Ops/__pycache__/index.cpython-36.opt-1.pyc b/Ops/__pycache__/index.cpython-36.opt-1.pyc deleted file mode 100644 index c4f11c62..00000000 Binary files a/Ops/__pycache__/index.cpython-36.opt-1.pyc and /dev/null differ diff --git a/Ops/__pycache__/routing.cpython-36.opt-1.pyc b/Ops/__pycache__/routing.cpython-36.opt-1.pyc deleted file mode 100644 index 100fd6a9..00000000 Binary files a/Ops/__pycache__/routing.cpython-36.opt-1.pyc and /dev/null differ diff --git a/Ops/__pycache__/settings.cpython-36.opt-1.pyc b/Ops/__pycache__/settings.cpython-36.opt-1.pyc deleted file mode 100644 index a98d7143..00000000 Binary files a/Ops/__pycache__/settings.cpython-36.opt-1.pyc and /dev/null differ diff --git a/Ops/__pycache__/settings.cpython-36.pyc b/Ops/__pycache__/settings.cpython-36.pyc deleted file mode 100644 index b113e78f..00000000 Binary files a/Ops/__pycache__/settings.cpython-36.pyc and /dev/null differ diff --git a/Ops/__pycache__/urls.cpython-36.opt-1.pyc b/Ops/__pycache__/urls.cpython-36.opt-1.pyc deleted file mode 100644 index 78f85fed..00000000 Binary files a/Ops/__pycache__/urls.cpython-36.opt-1.pyc and /dev/null differ diff --git a/Ops/__pycache__/urls.cpython-36.pyc b/Ops/__pycache__/urls.cpython-36.pyc deleted file mode 100644 index 99403c43..00000000 Binary files a/Ops/__pycache__/urls.cpython-36.pyc and /dev/null differ diff --git a/Ops/__pycache__/views.cpython-36.opt-1.pyc b/Ops/__pycache__/views.cpython-36.opt-1.pyc deleted file mode 100644 index 560143f0..00000000 Binary files a/Ops/__pycache__/views.cpython-36.opt-1.pyc and /dev/null differ diff --git a/Ops/__pycache__/wsgi.cpython-36.opt-1.pyc b/Ops/__pycache__/wsgi.cpython-36.opt-1.pyc deleted file mode 100644 index e8a80651..00000000 Binary files a/Ops/__pycache__/wsgi.cpython-36.opt-1.pyc and /dev/null differ diff --git a/Ops/__pycache__/wsgi.cpython-36.pyc b/Ops/__pycache__/wsgi.cpython-36.pyc deleted file mode 100644 index 44f591fd..00000000 Binary files a/Ops/__pycache__/wsgi.cpython-36.pyc and /dev/null differ diff --git a/Ops/celery.py b/Ops/celery.py index ec36cc92..74310d02 100644 --- a/Ops/celery.py +++ b/Ops/celery.py @@ -13,11 +13,18 @@ import os from celery import Celery from kombu import Queue, Exchange +try: + import ConfigParser as conf +except ImportError as e: + import configparser as conf # set the default Django settings module for the 'celery' program. os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'Ops.settings') +BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +config = conf.ConfigParser() +config.read(os.path.join(BASE_DIR, 'conf/ops.ini')) -app = Celery('Ops', broker='redis://127.0.0.1:6379/0') +app = Celery('Ops', broker='redis://{host}:{port}/{db}'.format(host=config.get('redis', 'host'), port=config.get('redis', 'port'), db=config.get('redis', 'celery_db'))) app.conf.task_queues = ( Queue('default', Exchange('default', type='direct'), routing_key='default'), diff --git a/Ops/settings.py b/Ops/settings.py index b5ab4159..292977ad 100644 --- a/Ops/settings.py +++ b/Ops/settings.py @@ -12,9 +12,15 @@ import os import sys +try: + import ConfigParser as conf +except ImportError as e: + import configparser as conf # Build paths inside the project like this: os.path.join(BASE_DIR, ...) BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +config = conf.ConfigParser() +config.read(os.path.join(BASE_DIR, 'conf/ops.ini')) # Quick-start development settings - unsuitable for production # See https://docs.djangoproject.com/en/2.0/howto/deployment/checklist/ @@ -23,7 +29,7 @@ SECRET_KEY = 'e02$n$tpsi&rvjj7=5y!pi7b2$ku-+@5+6%#va7=oypuglxkn#' # SECURITY WARNING: don't run with debug turned on in production! -DEBUG = True +DEBUG = config.get('global', 'debug') ALLOWED_HOSTS = ['*'] @@ -35,7 +41,7 @@ # This example app uses the Redis channel layer implementation channels_redis "BACKEND": "channels_redis.core.RedisChannelLayer", "CONFIG": { - "hosts": [('127.0.0.1', 6379)], + "hosts": [(config.get('redis', 'host'), config.get('redis', 'port'))], }, }, } @@ -57,18 +63,18 @@ } # 执行ansible命令使用的redis信息 -REDIS_HOST = '127.0.0.1' -REDIS_PORT = 6379 -REDIS_DB = 2 -REDIS_PASSWORD = None +REDIS_HOST = config.get('redis', 'host') +REDIS_PORT = config.get('redis', 'port') +REDIS_DB = config.get('redis', 'ansible_db') +REDIS_PASSWORD = config.get('redis', 'password') # mongodb配置信息 -MONGODB_HOST = '10.1.7.198' -MONGODB_PORT = 27017 -MONGODB_USER = 'admin' -MONGODB_PASS = '123456' -RECORD_DB = 'records' -RECORD_COLL = 'ops' +MONGODB_HOST = config.get('mongodb', 'host') +MONGODB_PORT = config.getint('mongodb', 'port') +MONGODB_USER = config.get('mongodb', 'user') +MONGODB_PASS = config.get('mongodb', 'password') +RECORD_DB = config.get('mongodb', 'record_db') +RECORD_COLL = config.get('mongodb', 'record_coll') # Application definition INSTALLED_APPS = [ @@ -169,10 +175,15 @@ DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', - 'NAME': 'ops', - 'USER': 'ops', - 'PASSWORD': '123456', - 'HOST': '127.0.0.1' + 'NAME': config.get('db', 'name'), + 'USER': config.get('db', 'user'), + 'PASSWORD': config.get('db', 'password'), + 'HOST': config.get('db', 'host'), + 'PORT': config.get('db', 'port'), + 'OPTIONS':{ + 'init_command': "SET sql_mode='STRICT_TRANS_TABLES'", + 'charset': 'utf8mb4', + }, } } @@ -226,26 +237,26 @@ # zabbix配置 ZABBIX_INFO = { - 'api_url': 'http://127.0.0.1/zabbix/api_jsonrpc.php', - 'graph_url': 'http://127.0.0.1/zabbix/chart2.php', - 'login_url': 'http://127.0.0.1/zabbix/index.php', - 'username': 'admin', - 'password': '123456' + 'api_url': 'http://{host}:{port}/{api_url}'.format(host=config.get('zabbix', 'host'), port=config.get('zabbix', 'port'), api_url=config.get('zabbix', 'api_url')), + 'graph_url': 'http://{host}:{port}/{graph_url}'.format(host=config.get('zabbix', 'host'), port=config.get('zabbix', 'port'), graph_url=config.get('zabbix', 'graph_url')), + 'login_url': 'http://{host}:{port}/{login_url}'.format(host=config.get('zabbix', 'host'), port=config.get('zabbix', 'port'), login_url=config.get('zabbix', 'login_url')), + 'username': '{username}'.format(username=config.get('zabbix', 'username')), + 'password': '{password}'.format(password=config.get('zabbix', 'password')) } # ANSIBLE_ROLE_PATH = os.path.join(MEDIA_ROOT, 'roles') -ANSIBLE_ROLE_PATH = '/usr/share/ansible/roles' +ANSIBLE_ROLE_PATH = config.get('ansible', 'ansible_role_path') -GUACD_HOST = '127.0.0.1' -GUACD_PORT = 4822 +GUACD_HOST = config.get('cuacd', 'host') +GUACD_PORT = config.get('cuacd', 'port') # email配置 -EMAIL_HOST = 'smtp.163.com' -EMAIL_PORT = 25 -EMAIL_HOST_USER = 'XXXXXXXXXXXX' -EMAIL_HOST_PASSWORD = 'XXXXXXXXXXX' +EMAIL_HOST = config.get('email', 'smtp_host') +EMAIL_PORT = config.get('email', 'smtp_port') +EMAIL_HOST_USER = config.get('email', 'smtp_user') +EMAIL_HOST_PASSWORD = config.get('email', 'smtp_passwd') DEFAULT_FROM_EMAIL = EMAIL_HOST_USER # 数据库管理用户,该用户需要有grant option权限,并且只能赋予该用户所拥有的权限 -MYSQL_USER = 'cc' -MYSQL_PASS = '123456' +MYSQL_USER = config.get('db', 'admin_user') +MYSQL_PASS = config.get('db', 'admin_password') diff --git a/api/__pycache__/__init__.cpython-36.opt-1.pyc b/api/__pycache__/__init__.cpython-36.opt-1.pyc deleted file mode 100644 index 2a08763e..00000000 Binary files a/api/__pycache__/__init__.cpython-36.opt-1.pyc and /dev/null differ diff --git a/api/__pycache__/admin.cpython-36.opt-1.pyc b/api/__pycache__/admin.cpython-36.opt-1.pyc deleted file mode 100644 index 175d66fb..00000000 Binary files a/api/__pycache__/admin.cpython-36.opt-1.pyc and /dev/null differ diff --git a/api/__pycache__/apps.cpython-36.opt-1.pyc b/api/__pycache__/apps.cpython-36.opt-1.pyc deleted file mode 100644 index 4c964b42..00000000 Binary files a/api/__pycache__/apps.cpython-36.opt-1.pyc and /dev/null differ diff --git a/api/__pycache__/models.cpython-36.opt-1.pyc b/api/__pycache__/models.cpython-36.opt-1.pyc deleted file mode 100644 index 83d5b8e3..00000000 Binary files a/api/__pycache__/models.cpython-36.opt-1.pyc and /dev/null differ diff --git a/api/__pycache__/serializers.cpython-36.opt-1.pyc b/api/__pycache__/serializers.cpython-36.opt-1.pyc deleted file mode 100644 index 29432690..00000000 Binary files a/api/__pycache__/serializers.cpython-36.opt-1.pyc and /dev/null differ diff --git a/api/__pycache__/urls.cpython-36.opt-1.pyc b/api/__pycache__/urls.cpython-36.opt-1.pyc deleted file mode 100644 index 59105724..00000000 Binary files a/api/__pycache__/urls.cpython-36.opt-1.pyc and /dev/null differ diff --git a/api/__pycache__/views.cpython-36.opt-1.pyc b/api/__pycache__/views.cpython-36.opt-1.pyc deleted file mode 100644 index 754c53a8..00000000 Binary files a/api/__pycache__/views.cpython-36.opt-1.pyc and /dev/null differ diff --git a/api/migrations/__init__.py b/api/migrations/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/api/migrations/__pycache__/__init__.cpython-36.opt-1.pyc b/api/migrations/__pycache__/__init__.cpython-36.opt-1.pyc deleted file mode 100644 index 9b0b895e..00000000 Binary files a/api/migrations/__pycache__/__init__.cpython-36.opt-1.pyc and /dev/null differ diff --git a/assets/__pycache__/__init__.cpython-36.opt-1.pyc b/assets/__pycache__/__init__.cpython-36.opt-1.pyc deleted file mode 100644 index 49dee406..00000000 Binary files a/assets/__pycache__/__init__.cpython-36.opt-1.pyc and /dev/null differ diff --git a/assets/__pycache__/admin.cpython-36.opt-1.pyc b/assets/__pycache__/admin.cpython-36.opt-1.pyc deleted file mode 100644 index 43a22948..00000000 Binary files a/assets/__pycache__/admin.cpython-36.opt-1.pyc and /dev/null differ diff --git a/assets/__pycache__/apps.cpython-36.opt-1.pyc b/assets/__pycache__/apps.cpython-36.opt-1.pyc deleted file mode 100644 index ec9de0b6..00000000 Binary files a/assets/__pycache__/apps.cpython-36.opt-1.pyc and /dev/null differ diff --git a/assets/__pycache__/models.cpython-36.opt-1.pyc b/assets/__pycache__/models.cpython-36.opt-1.pyc deleted file mode 100644 index c31136cd..00000000 Binary files a/assets/__pycache__/models.cpython-36.opt-1.pyc and /dev/null differ diff --git a/assets/migrations/0001_initial.py b/assets/migrations/0001_initial.py deleted file mode 100644 index 38afa1c7..00000000 --- a/assets/migrations/0001_initial.py +++ /dev/null @@ -1,273 +0,0 @@ -# Generated by Django 2.0.5 on 2018-07-29 14:15 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ] - - operations = [ - migrations.CreateModel( - name='AssetProvider', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('asset_provider_name', models.CharField(max_length=64, unique=True, verbose_name='供应商名称')), - ('asset_provider_contact', models.CharField(blank=True, max_length=32, null=True, verbose_name='技术支持人员')), - ('asset_provider_telephone', models.CharField(blank=True, max_length=11, null=True, verbose_name='支持电话')), - ('asset_provider_memo', models.CharField(blank=True, max_length=128, null=True, verbose_name='备注')), - ], - options={ - 'verbose_name': '供应商表', - 'verbose_name_plural': '供应商表', - 'db_table': 'ops_asset_provider', - }, - ), - migrations.CreateModel( - name='Assets', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('asset_type', models.CharField(choices=[('server', '服务器'), ('network', '网络设备'), ('office', '办公设备'), ('security', '安全设备'), ('storage', '存储设备'), ('software', '软件资产')], default='server', max_length=100, verbose_name='资产类型')), - ('asset_nu', models.CharField(max_length=100, unique=True, verbose_name='资产编号')), - ('asset_model', models.CharField(blank=True, max_length=100, null=True, verbose_name='资产型号')), - ('asset_status', models.SmallIntegerField(choices=[(0, '已上线'), (1, '已下线'), (2, '故障中'), (3, '未使用')], default=0, verbose_name='状态')), - ('asset_management_ip', models.GenericIPAddressField(blank=True, null=True, verbose_name='管理IP')), - ('asset_purchase_day', models.DateField(blank=True, null=True, verbose_name='购买日期')), - ('asset_expire_day', models.DateField(blank=True, null=True, verbose_name='过保日期')), - ('asset_price', models.CharField(blank=True, max_length=100, null=True, verbose_name='价格(万元)')), - ('asset_create_time', models.DateTimeField(auto_now_add=True)), - ('asset_update_time', models.DateTimeField(auto_now_add=True)), - ('asset_memo', models.TextField(blank=True, help_text='配置说明或一些注意事项', null=True, verbose_name='备注')), - ], - options={ - 'verbose_name': '总资产表', - 'verbose_name_plural': '总资产表', - 'db_table': 'ops_assets', - }, - ), - migrations.CreateModel( - name='AssetsLog', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('remote_ip', models.GenericIPAddressField(verbose_name='操作用户IP')), - ('content', models.CharField(max_length=100, verbose_name='操作内容')), - ('c_time', models.DateTimeField(auto_now_add=True, verbose_name='操作时间')), - ], - options={ - 'verbose_name': '资产管理操作记录表', - 'verbose_name_plural': '资产管理操作记录表', - 'db_table': 'ops_assets_log', - }, - ), - migrations.CreateModel( - name='Cabinet', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('cabinet_name', models.CharField(max_length=64, unique=True, verbose_name='机柜名称')), - ('cabinet_memo', models.CharField(blank=True, max_length=100, null=True, verbose_name='备注')), - ], - options={ - 'verbose_name': '机柜表', - 'verbose_name_plural': '机柜表', - 'db_table': 'ops_cabinet', - }, - ), - migrations.CreateModel( - name='DiskAssets', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('disk_volume', models.CharField(blank=True, max_length=100, null=True, verbose_name='硬盘容量')), - ('disk_status', models.CharField(blank=True, max_length=100, null=True, verbose_name='硬盘状态')), - ('disk_model', models.CharField(blank=True, max_length=100, null=True, verbose_name='硬盘型号')), - ('disk_brand', models.CharField(blank=True, max_length=100, null=True, verbose_name='硬盘生产商')), - ('disk_serial', models.CharField(blank=True, max_length=100, null=True, verbose_name='硬盘序列号')), - ('disk_slot', models.SmallIntegerField(blank=True, null=True, verbose_name='硬盘插槽')), - ('asset', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='disk_assets', to='assets.Assets')), - ], - options={ - 'verbose_name': '磁盘资产表', - 'verbose_name_plural': '磁盘资产表', - 'db_table': 'ops_disk_assets', - }, - ), - migrations.CreateModel( - name='IDC', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('idc_name', models.CharField(max_length=64, unique=True, verbose_name='机房名称')), - ('idc_address', models.CharField(max_length=100, unique=True, verbose_name='机房地址')), - ('idc_contact', models.CharField(max_length=32, unique=True, verbose_name='机房联系人')), - ('idc_telephone', models.CharField(blank=True, max_length=11, null=True, verbose_name='支持电话')), - ('idc_memo', models.CharField(blank=True, max_length=100, null=True, verbose_name='备注')), - ], - options={ - 'verbose_name': '机房表', - 'verbose_name_plural': '机房表', - 'db_table': 'ops_idc', - }, - ), - migrations.CreateModel( - name='NetworkAssets', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('network_type', models.SmallIntegerField(choices=[(0, '路由器'), (1, '交换机'), (2, '负载均衡'), (3, 'wifi'), (4, 'VPN'), (5, '其它')], default=0, verbose_name='网络设备类型')), - ('assets', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to='assets.Assets')), - ], - options={ - 'verbose_name': '网络资产表', - 'verbose_name_plural': '网络资产表', - 'db_table': 'ops_network_assets', - }, - ), - migrations.CreateModel( - name='NetworkCardAssets', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('network_card_name', models.CharField(blank=True, max_length=20, null=True, verbose_name='网卡名称')), - ('network_card_mac', models.CharField(blank=True, max_length=64, null=True, verbose_name='MAC地址')), - ('network_card_ip', models.GenericIPAddressField(blank=True, null=True, verbose_name='IP地址')), - ('network_card_model', models.CharField(blank=True, max_length=50, null=True, verbose_name='网卡类型')), - ('network_card_mtu', models.CharField(blank=True, max_length=50, null=True, verbose_name='MTU')), - ('network_card_status', models.SmallIntegerField(blank=True, null=True, verbose_name='网卡状态')), - ('asset', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='network_card_assets', to='assets.Assets')), - ], - options={ - 'verbose_name': '服务器网卡资产表', - 'verbose_name_plural': '服务器网卡资产表', - 'db_table': 'ops_network_card_assets', - }, - ), - migrations.CreateModel( - name='OfficeAssets', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('office_type', models.SmallIntegerField(choices=[(0, 'PC机'), (1, '打印机'), (2, '扫描仪'), (3, '其它')], default=0, verbose_name='办公设备类型')), - ('assets', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to='assets.Assets')), - ], - options={ - 'verbose_name': '办公资产表', - 'verbose_name_plural': '办公资产表', - 'db_table': 'ops_office_assets', - }, - ), - migrations.CreateModel( - name='Project', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('project_name', models.CharField(max_length=64, unique=True, verbose_name='项目名称')), - ('project_memo', models.CharField(blank=True, max_length=100, null=True, verbose_name='基本描述')), - ('parent_project', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='parent_level', to='assets.Project')), - ], - options={ - 'verbose_name': '项目表', - 'verbose_name_plural': '项目表', - 'db_table': 'ops_project', - }, - ), - migrations.CreateModel( - name='RamAssets', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('ram_model', models.CharField(blank=True, max_length=100, null=True, verbose_name='内存型号')), - ('ram_volume', models.CharField(blank=True, max_length=100, null=True, verbose_name='内存容量')), - ('ram_brand', models.CharField(blank=True, max_length=100, null=True, verbose_name='内存生产商')), - ('ram_slot', models.SmallIntegerField(blank=True, null=True, verbose_name='内存插槽')), - ('ram_status', models.CharField(blank=True, max_length=100, null=True, verbose_name='内存状态')), - ('asset', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='ram_assets', to='assets.Assets')), - ], - options={ - 'verbose_name': '内存资产表', - 'verbose_name_plural': '内存资产表', - 'db_table': 'ops_ram_assets', - }, - ), - migrations.CreateModel( - name='SecurityAssets', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('security_type', models.SmallIntegerField(choices=[(0, '防火墙'), (1, '网关'), (2, '其它')], default=0, verbose_name='安全设备类型')), - ('assets', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to='assets.Assets')), - ], - options={ - 'verbose_name': '安全资产表', - 'verbose_name_plural': '安全资产表', - 'db_table': 'ops_security_assets', - }, - ), - migrations.CreateModel( - name='ServerAssets', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('server_type', models.SmallIntegerField(choices=[(0, '物理机'), (1, '虚拟机'), (2, '云主机')], default=0, verbose_name='服务器类型')), - ('username', models.CharField(blank=True, max_length=100, null=True, verbose_name='用户名称')), - ('auth_type', models.SmallIntegerField(choices=[(0, '密钥认证'), (1, '账户密码')], default=0, verbose_name='认证方式')), - ('password', models.CharField(blank=True, max_length=100, null=True, verbose_name='用户密码')), - ('port', models.DecimalField(blank=True, decimal_places=0, max_digits=6, null=True, verbose_name='SSH端口')), - ('hostname', models.CharField(blank=True, max_length=100, null=True, verbose_name='主机名称')), - ('cpu_model', models.CharField(blank=True, max_length=100, null=True, verbose_name='CPU型号')), - ('cpu_number', models.SmallIntegerField(blank=True, null=True, verbose_name='物理CPU个数')), - ('vcpu_number', models.SmallIntegerField(blank=True, null=True, verbose_name='逻辑CPU个数')), - ('disk_total', models.IntegerField(blank=True, null=True, verbose_name='磁盘空间')), - ('ram_total', models.SmallIntegerField(blank=True, null=True, verbose_name='内存容量')), - ('kernel', models.CharField(blank=True, max_length=100, null=True, verbose_name='内核版本')), - ('system', models.CharField(blank=True, max_length=100, null=True, verbose_name='操作系统')), - ('host_vars', models.TextField(blank=True, null=True, verbose_name='主机变量')), - ('assets', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to='assets.Assets')), - ('hosted_on', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='hosted_on_server', to='assets.ServerAssets', verbose_name='宿主机')), - ], - options={ - 'verbose_name': '服务器资产表', - 'verbose_name_plural': '服务器资产表', - 'db_table': 'ops_server_assets', - }, - ), - migrations.CreateModel( - name='Service', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('service_name', models.CharField(help_text='数据库、中间件等', max_length=32, verbose_name='服务名称')), - ('project_name', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='service', to='assets.Project')), - ('service_assets', models.ManyToManyField(to='assets.Assets', verbose_name='提供服务的机器')), - ], - options={ - 'verbose_name': '服务类型表', - 'verbose_name_plural': '服务类型表', - 'db_table': 'ops_service', - }, - ), - migrations.CreateModel( - name='SoftwareAssets', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('software_type', models.SmallIntegerField(choices=[(0, '操作系统'), (1, '办公/开发软件'), (2, '业务软件')], default=0, verbose_name='软件类型')), - ('assets', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to='assets.Assets')), - ], - options={ - 'verbose_name': '软件资产表', - 'verbose_name_plural': '软件资产表', - 'db_table': 'ops_software_assets', - }, - ), - migrations.CreateModel( - name='StorageAssets', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('storage_type', models.SmallIntegerField(choices=[(0, '磁盘阵列'), (1, '网络存储器'), (2, '磁带库'), (3, '磁带机')], default=0, verbose_name='存储设备类型')), - ('assets', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to='assets.Assets')), - ], - options={ - 'verbose_name': '存储资产表', - 'verbose_name_plural': '存储资产表', - 'db_table': 'ops_storage_assets', - }, - ), - migrations.AddField( - model_name='cabinet', - name='idc', - field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='cabinet', to='assets.IDC'), - ), - ] diff --git a/assets/migrations/__init__.py b/assets/migrations/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/assets/migrations/__pycache__/0001_initial.cpython-36.opt-1.pyc b/assets/migrations/__pycache__/0001_initial.cpython-36.opt-1.pyc deleted file mode 100644 index b6e0d785..00000000 Binary files a/assets/migrations/__pycache__/0001_initial.cpython-36.opt-1.pyc and /dev/null differ diff --git a/assets/migrations/__pycache__/0002_auto_20180705_1711.cpython-36.opt-1.pyc b/assets/migrations/__pycache__/0002_auto_20180705_1711.cpython-36.opt-1.pyc deleted file mode 100644 index 60fec298..00000000 Binary files a/assets/migrations/__pycache__/0002_auto_20180705_1711.cpython-36.opt-1.pyc and /dev/null differ diff --git a/assets/migrations/__pycache__/0003_auto_20180705_1738.cpython-36.opt-1.pyc b/assets/migrations/__pycache__/0003_auto_20180705_1738.cpython-36.opt-1.pyc deleted file mode 100644 index 53fce4c4..00000000 Binary files a/assets/migrations/__pycache__/0003_auto_20180705_1738.cpython-36.opt-1.pyc and /dev/null differ diff --git a/assets/migrations/__pycache__/0004_auto_20180705_1741.cpython-36.opt-1.pyc b/assets/migrations/__pycache__/0004_auto_20180705_1741.cpython-36.opt-1.pyc deleted file mode 100644 index 17dea73c..00000000 Binary files a/assets/migrations/__pycache__/0004_auto_20180705_1741.cpython-36.opt-1.pyc and /dev/null differ diff --git a/assets/migrations/__pycache__/0005_auto_20180705_1758.cpython-36.opt-1.pyc b/assets/migrations/__pycache__/0005_auto_20180705_1758.cpython-36.opt-1.pyc deleted file mode 100644 index e9e9ab81..00000000 Binary files a/assets/migrations/__pycache__/0005_auto_20180705_1758.cpython-36.opt-1.pyc and /dev/null differ diff --git a/assets/migrations/__pycache__/0006_auto_20180706_1821.cpython-36.opt-1.pyc b/assets/migrations/__pycache__/0006_auto_20180706_1821.cpython-36.opt-1.pyc deleted file mode 100644 index ab4d0bbd..00000000 Binary files a/assets/migrations/__pycache__/0006_auto_20180706_1821.cpython-36.opt-1.pyc and /dev/null differ diff --git a/assets/migrations/__pycache__/__init__.cpython-36.opt-1.pyc b/assets/migrations/__pycache__/__init__.cpython-36.opt-1.pyc deleted file mode 100644 index db70fb9c..00000000 Binary files a/assets/migrations/__pycache__/__init__.cpython-36.opt-1.pyc and /dev/null differ diff --git a/assets/models.py b/assets/models.py index 86950617..38a5fda3 100644 --- a/assets/models.py +++ b/assets/models.py @@ -25,7 +25,7 @@ class Assets(models.Model): asset_status = models.SmallIntegerField(choices=asset_status_, default=0, verbose_name='状态') asset_management_ip = models.GenericIPAddressField(blank=True, null=True, verbose_name='管理IP') asset_admin = models.ForeignKey('users.UserProfile', related_name='assets', verbose_name='资产管理员', - on_delete=models.PROTECT) + on_delete=models.PROTECT, null=True) asset_idc = models.ForeignKey('IDC', related_name='assets', null=True, blank=True, verbose_name='所在机房', on_delete=models.PROTECT) asset_cabinet = models.ForeignKey('Cabinet', related_name='assets', null=True, blank=True, verbose_name='所在机柜', @@ -36,7 +36,7 @@ class Assets(models.Model): asset_price = models.CharField(max_length=100, null=True, blank=True, verbose_name="价格(万元)") asset_create_time = models.DateTimeField(auto_now_add=True) - asset_update_time = models.DateTimeField(auto_now_add=True) + asset_update_time = models.DateTimeField(auto_now=True) asset_memo = models.TextField(null=True, blank=True, verbose_name='备注', help_text='配置说明或一些注意事项') class Meta: diff --git a/commons/views.py b/commons/views.py index 3e4befbf..9e899814 100644 --- a/commons/views.py +++ b/commons/views.py @@ -116,7 +116,7 @@ def system_log(request): # datatables客户端分页(一次性获取所有数据) @admin_auth def get_system_log(request): - mongo = MongoOps(settings.MONGODB_HOST, settings.MONGODB_PORT, settings.RECORD_DB, settings.RECORD_COLL) + mongo = MongoOps(settings.MONGODB_HOST, settings.MONGODB_PORT, settings.RECORD_DB, settings.RECORD_COLL, settings.MONGODB_USER, settings.MONGODB_PASS) start_time = request.GET.get('startTime') end_time = request.GET.get('endTime') try: diff --git a/conf/__pycache__/__init__.cpython-36.opt-1.pyc b/conf/__pycache__/__init__.cpython-36.opt-1.pyc deleted file mode 100644 index 3ce5601e..00000000 Binary files a/conf/__pycache__/__init__.cpython-36.opt-1.pyc and /dev/null differ diff --git a/conf/__pycache__/__init__.cpython-36.pyc b/conf/__pycache__/__init__.cpython-36.pyc deleted file mode 100644 index 8d3868d9..00000000 Binary files a/conf/__pycache__/__init__.cpython-36.pyc and /dev/null differ diff --git a/conf/__pycache__/logger.cpython-36.opt-1.pyc b/conf/__pycache__/logger.cpython-36.opt-1.pyc deleted file mode 100644 index 8f2b369c..00000000 Binary files a/conf/__pycache__/logger.cpython-36.opt-1.pyc and /dev/null differ diff --git a/conf/__pycache__/logger.cpython-36.pyc b/conf/__pycache__/logger.cpython-36.pyc deleted file mode 100644 index b1cdc3a3..00000000 Binary files a/conf/__pycache__/logger.cpython-36.pyc and /dev/null differ diff --git a/conf/ops.ini b/conf/ops.ini new file mode 100644 index 00000000..64b238d9 --- /dev/null +++ b/conf/ops.ini @@ -0,0 +1,48 @@ +[global] +debug = True + +[redis] +host = redis +port = 6379 +password = None +celery_db = 0 +ansible_db = 2 + +[mongodb] +host = mongodb +port = 27017 +user = admin +password = 123456 +record_db = records +record_coll = ops + +[ansible] +ansible_role_path = /usr/share/ansible/roles + +[zabbix] +host = zabbix +port = 8080 +api_url = zabbix/api_jsonrpc.php +graph_url = zabbix/chart2.php +login_url = zabbix/index.php +username = admin +password = 123456 + +[db] +host = mysql +port = 3306 +user = ops +password = 123456 +name = ops +admin_user = root +admin_password = 123456 + +[cuacd] +host = cuacd +port = 4822 + +[email] +smtp_user = ops@163.com +smtp_host = smtp.163.com +smtp_port = 25 +smtp_passwd = 123456 diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 00000000..a173eeb2 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,81 @@ +version: '2.4' + +networks: + default: + external: + name: ops_net1 + +services: + mysql: + image: mysql:5.6 + container_name: mysql + hostname: mysql + restart: always + command: --character-set-server=utf8 --collation-server=utf8_unicode_ci --lower_case_table_names=1 + environment: + MYSQL_ROOT_PASSWORD: 123456 + volumes: + - /data/mysql:/var/lib/mysql + ports: + - 3306:3306 + + redis: + image: redis:3.2 + container_name: redis + hostname: redis + restart: always + volumes: + - /data/redis:/data + + mongodb: + image: mongo:3.4.22 + container_name: mongodb + hostname: mongodb + restart: always + environment: + MONGO_INITDB_ROOT_USERNAME: admin + MONGO_INITDB_ROOT_PASSWORD: 123456 + volumes: + - /data/mongodb:/data/db + + mongo-express: + image: mongo-express:0.49.0 + restart: always + ports: + - 8081:8081 + environment: + ME_CONFIG_MONGODB_ADMINUSERNAME: admin + ME_CONFIG_MONGODB_ADMINPASSWORD: 123456 + ME_CONFIG_MONGODB_SERVER: mongodb + + ops: + image: ops + container_name: ops + hostname: ops + restart: always + environment: + REDIS_HOST: redis + MONGODB_HOST: mongodb + MONGODB_USER: admin + MONGODB_PASSWD: 123456 + DB_HOST: mysql + DB_USER: ops + DB_PASSWD: 123456 + DB_ADMIN_PASSWD: 123456 + DB_NAME: ops + volumes: + - /data/ops/initapp:/initapp + - /data/ops/ansible_roles:/usr/share/ansible/roles + ports: + - 8000:8000 + depends_on: + - mysql + - redis + - mongodb + - guacd + + guacd: + image: guacamole/guacd:1.0.0 + container_name: guacd + hostname: guacd + restart: always diff --git a/docker-entrypoint.sh b/docker-entrypoint.sh new file mode 100644 index 00000000..8e660364 --- /dev/null +++ b/docker-entrypoint.sh @@ -0,0 +1,122 @@ +#!/bin/bash + +if [ ! -n "${DB_HOST}" ] || [ ! -n "${REDIS_HOST}" ] || [ ! -n "${MONGODB_HOST}" ]; then + echo "You must set the DB_HOST, REDIS_HOST and MONGODB_HOST!!!" + exit 1 +fi + +inited=$(cat /initapp/inited.txt) + +if [ "no" == "$inited" ]; then + +: "${DEBUG:=True}" + +: "${REDIS_PORT:=6379}" +: "${REDIS_PASSWD:=None}" +: "${REDIS_CELERY_DB:=0}" +: "${REDIS_ANSIBLE_DB:=2}" + +: "${MONGODB_PORT:=27017}" +: "${MONGODB_USER:=admin}" +: "${MONGODB_PASSWD:=123456}" +: "${MONGODB_RECORD_DB:=records}" +: "${MONGODB_RECORD_COLL:=ops}" + +: "${DB_PORT:=3306}" +: "${DB_ADMIN_USER:=root}" +: "${DB_ADMIN_PASSWD:=123456}" +: "${DB_USER:=root}" +: "${DB_PASSWD:=123456}" +: "${DB_NAME:=ops}" + +: "${ANSIBLE_ROLES_PATH:=/usr/share/ansible/roles}" + +: "${ZABBIX_HOST:=zabbix}" +: "${ZABBIX_PORT:=8080}" +: "${ZABBIX_API_URL:=zabbix/api_jsonrpc.php}" +: "${ZABBIX_GRAPH_URL:=zabbix/chart2.php}" +: "${ZABBIX_LOGIN_URL:=zabbix/index.php}" +: "${ZABBIX_USER:=admin}" +: "${ZABBIX_PASSWD:=123456}" + +: "${CUACD_HOST:=cuacd}" +: "${CUACD_PORT:=4822}" + +: "${SMTP_HOST:=smtp.163.com}" +: "${SMTP_PORT:=25}" +: "${SMTP_USER:=ops@163.com}" +: "${SMTP_PASSWD:=123456}" + +: "${ADMIN_USER:=admin}" +: "${ADMIN_EMAIL:=ops@163.com}" +: "${ADMIN_PASSWD:=ChangeMe123}" + +cat > /app/conf/ops.ini < /tmp/create_superuser.sh +/bin/bash /tmp/create_superuser.sh +echo "yes" > /initapp/inited.txt +fi + +export CELERY_BIN="\/usr\/local\/bin\/celery" && sed -i 's/^CELERY_BIN=.*$/CELERY_BIN="'$CELERY_BIN'"/g' /etc/default/celeryd +export CELERYD_CHDIR="\/app" && sed -i 's/^CELERYD_CHDIR=.*$/CELERYD_CHDIR="'$CELERYD_CHDIR'"/g' /etc/default/celeryd +export C_FORCE_ROOT="true" +/etc/init.d/celeryd start +/etc/init.d/celerybeat start + +python manage.py runserver 0.0.0.0:8000 diff --git a/install-with-docker-compose.md b/install-with-docker-compose.md new file mode 100644 index 00000000..71b8351e --- /dev/null +++ b/install-with-docker-compose.md @@ -0,0 +1,35 @@ +## 使用 docker-compose 快速部署 + +### 0. 安装 docker docker-compose + +见 docker 官方文档 + +### 1. 构建镜像 + ++ ops + +``` +git clone https://github.com/pythonzm/Ops.git +cd Ops +docker build -t ops . +``` + +### 2. 创建数据持久化目录 + +``` +sudo mkdir -p /data/mysql /data/redis /data/mongodb /data/ops/initapp /data/ops/ansible_roles +``` + +### 3. 启动 + +``` +docker-compose up -d +``` + +### 4. 访问 + +浏览器访问: + +``` +http://:8000 +``` diff --git a/requirements.txt b/requirements.txt index a3d1ab70..34801964 100644 --- a/requirements.txt +++ b/requirements.txt @@ -16,6 +16,7 @@ cffi==1.11.5 channels==2.1.1 channels-redis==2.2.1 chardet==3.0.4 +configparser==3.5.0 constantly==15.1.0 cryptography==2.2.2 daphne==2.1.2 diff --git a/sources.list b/sources.list new file mode 100644 index 00000000..4cf49767 --- /dev/null +++ b/sources.list @@ -0,0 +1,8 @@ +deb http://mirrors.aliyun.com/debian/ stretch main non-free contrib +deb-src http://mirrors.aliyun.com/debian/ stretch main non-free contrib +deb http://mirrors.aliyun.com/debian-security stretch/updates main +deb-src http://mirrors.aliyun.com/debian-security stretch/updates main +deb http://mirrors.aliyun.com/debian/ stretch-updates main non-free contrib +deb-src http://mirrors.aliyun.com/debian/ stretch-updates main non-free contrib +deb http://mirrors.aliyun.com/debian/ stretch-backports main non-free contrib +deb-src http://mirrors.aliyun.com/debian/ stretch-backports main non-free contrib \ No newline at end of file diff --git a/users/__pycache__/__init__.cpython-36.opt-1.pyc b/users/__pycache__/__init__.cpython-36.opt-1.pyc deleted file mode 100644 index cace6517..00000000 Binary files a/users/__pycache__/__init__.cpython-36.opt-1.pyc and /dev/null differ diff --git a/users/__pycache__/admin.cpython-36.opt-1.pyc b/users/__pycache__/admin.cpython-36.opt-1.pyc deleted file mode 100644 index 9dee1a7e..00000000 Binary files a/users/__pycache__/admin.cpython-36.opt-1.pyc and /dev/null differ diff --git a/users/__pycache__/apps.cpython-36.opt-1.pyc b/users/__pycache__/apps.cpython-36.opt-1.pyc deleted file mode 100644 index 01c9e376..00000000 Binary files a/users/__pycache__/apps.cpython-36.opt-1.pyc and /dev/null differ diff --git a/users/__pycache__/models.cpython-36.opt-1.pyc b/users/__pycache__/models.cpython-36.opt-1.pyc deleted file mode 100644 index fdad015a..00000000 Binary files a/users/__pycache__/models.cpython-36.opt-1.pyc and /dev/null differ diff --git a/users/__pycache__/urls.cpython-36.opt-1.pyc b/users/__pycache__/urls.cpython-36.opt-1.pyc deleted file mode 100644 index 22b7249a..00000000 Binary files a/users/__pycache__/urls.cpython-36.opt-1.pyc and /dev/null differ diff --git a/users/__pycache__/views.cpython-36.opt-1.pyc b/users/__pycache__/views.cpython-36.opt-1.pyc deleted file mode 100644 index eaabba7a..00000000 Binary files a/users/__pycache__/views.cpython-36.opt-1.pyc and /dev/null differ diff --git a/users/migrations/0001_initial.py b/users/migrations/0001_initial.py deleted file mode 100644 index 75833366..00000000 --- a/users/migrations/0001_initial.py +++ /dev/null @@ -1,84 +0,0 @@ -# Generated by Django 2.0.5 on 2018-07-29 14:15 - -from django.conf import settings -import django.contrib.auth.models -import django.contrib.auth.validators -from django.db import migrations, models -import django.db.models.deletion -import django.utils.timezone - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ('auth', '0009_alter_user_last_name_max_length'), - ] - - operations = [ - migrations.CreateModel( - name='UserProfile', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('password', models.CharField(max_length=128, verbose_name='password')), - ('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')), - ('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')), - ('username', models.CharField(error_messages={'unique': 'A user with that username already exists.'}, help_text='Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.', max_length=150, unique=True, validators=[django.contrib.auth.validators.UnicodeUsernameValidator()], verbose_name='username')), - ('first_name', models.CharField(blank=True, max_length=30, verbose_name='first name')), - ('last_name', models.CharField(blank=True, max_length=150, verbose_name='last name')), - ('email', models.EmailField(blank=True, max_length=254, verbose_name='email address')), - ('is_staff', models.BooleanField(default=False, help_text='Designates whether the user can log into this admin site.', verbose_name='staff status')), - ('is_active', models.BooleanField(default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')), - ('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')), - ('mobile', models.CharField(blank=True, max_length=11, null=True, verbose_name='手机号码')), - ('image', models.ImageField(default='images/default.png', upload_to='images/%Y/%m/%d/')), - ('groups', models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.Group', verbose_name='groups')), - ('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.Permission', verbose_name='user permissions')), - ], - options={ - 'verbose_name': '用户表', - 'verbose_name_plural': '用户表', - 'db_table': 'ops_user', - }, - managers=[ - ('objects', django.contrib.auth.models.UserManager()), - ], - ), - migrations.CreateModel( - name='UserLog', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('user', models.CharField(max_length=16, verbose_name='操作用户')), - ('remote_ip', models.GenericIPAddressField(verbose_name='操作用户IP')), - ('content', models.CharField(max_length=100, verbose_name='操作内容')), - ('c_time', models.DateTimeField(auto_now_add=True, verbose_name='操作时间')), - ], - options={ - 'verbose_name': '用户管理操作记录表', - 'verbose_name_plural': '用户管理操作记录表', - 'db_table': 'ops_users_log', - }, - ), - migrations.CreateModel( - name='UserPlan', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(max_length=32, verbose_name='计划标题')), - ('start_time', models.DateTimeField(blank=True, null=True, verbose_name='开始时间')), - ('end_time', models.DateTimeField(blank=True, null=True, verbose_name='结束时间')), - ('all_day', models.SmallIntegerField(blank=True, null=True, verbose_name='是否全天')), - ('color', models.CharField(blank=True, max_length=32, null=True, verbose_name='颜色')), - ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='user_plan', to=settings.AUTH_USER_MODEL)), - ], - options={ - 'verbose_name': '用户计划表', - 'verbose_name_plural': '用户计划表', - 'db_table': 'ops_user_plan', - }, - ), - migrations.AlterUniqueTogether( - name='userplan', - unique_together={('user', 'title')}, - ), - ] diff --git a/users/migrations/__init__.py b/users/migrations/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/users/migrations/__pycache__/0001_initial.cpython-36.opt-1.pyc b/users/migrations/__pycache__/0001_initial.cpython-36.opt-1.pyc deleted file mode 100644 index 97521de3..00000000 Binary files a/users/migrations/__pycache__/0001_initial.cpython-36.opt-1.pyc and /dev/null differ diff --git a/users/migrations/__pycache__/0002_remove_userprofile_gender.cpython-36.opt-1.pyc b/users/migrations/__pycache__/0002_remove_userprofile_gender.cpython-36.opt-1.pyc deleted file mode 100644 index 144b3a88..00000000 Binary files a/users/migrations/__pycache__/0002_remove_userprofile_gender.cpython-36.opt-1.pyc and /dev/null differ diff --git a/users/migrations/__pycache__/0003_auto_20180706_1807.cpython-36.opt-1.pyc b/users/migrations/__pycache__/0003_auto_20180706_1807.cpython-36.opt-1.pyc deleted file mode 100644 index cc3645dd..00000000 Binary files a/users/migrations/__pycache__/0003_auto_20180706_1807.cpython-36.opt-1.pyc and /dev/null differ diff --git a/users/migrations/__pycache__/0004_auto_20180706_1830.cpython-36.opt-1.pyc b/users/migrations/__pycache__/0004_auto_20180706_1830.cpython-36.opt-1.pyc deleted file mode 100644 index 63c82fd9..00000000 Binary files a/users/migrations/__pycache__/0004_auto_20180706_1830.cpython-36.opt-1.pyc and /dev/null differ diff --git a/users/migrations/__pycache__/0005_auto_20180706_1931.cpython-36.opt-1.pyc b/users/migrations/__pycache__/0005_auto_20180706_1931.cpython-36.opt-1.pyc deleted file mode 100644 index 5ab13287..00000000 Binary files a/users/migrations/__pycache__/0005_auto_20180706_1931.cpython-36.opt-1.pyc and /dev/null differ diff --git a/users/migrations/__pycache__/0006_auto_20180708_1347.cpython-36.opt-1.pyc b/users/migrations/__pycache__/0006_auto_20180708_1347.cpython-36.opt-1.pyc deleted file mode 100644 index 1dbf524f..00000000 Binary files a/users/migrations/__pycache__/0006_auto_20180708_1347.cpython-36.opt-1.pyc and /dev/null differ diff --git a/users/migrations/__pycache__/__init__.cpython-36.opt-1.pyc b/users/migrations/__pycache__/__init__.cpython-36.opt-1.pyc deleted file mode 100644 index fde2d795..00000000 Binary files a/users/migrations/__pycache__/__init__.cpython-36.opt-1.pyc and /dev/null differ diff --git a/users/models.py b/users/models.py index ebff0754..51280401 100644 --- a/users/models.py +++ b/users/models.py @@ -1,6 +1,6 @@ from django.db import models from django.contrib.auth.models import AbstractUser - +from django.utils import timezone class UserProfile(AbstractUser): login_status_ = ( @@ -27,11 +27,11 @@ class UserPlan(models.Model): user = models.ForeignKey('UserProfile', related_name='self_user', on_delete=models.CASCADE, verbose_name='创建者') attention = models.ManyToManyField('UserProfile', related_name='attention_user', blank=True, verbose_name='关注者') title = models.CharField(max_length=32, verbose_name='计划标题') - content = models.TextField(verbose_name='计划内容') + content = models.TextField(verbose_name='计划内容', null=True) status = models.PositiveSmallIntegerField(choices=plan_status, verbose_name='任务状态', default=0) - start_time = models.DateTimeField(default='', verbose_name='开始时间') - end_time = models.DateTimeField(default='', verbose_name='结束时间') - add_time = models.DateTimeField(auto_now_add=True, verbose_name="添加时间") + start_time = models.DateTimeField(default=timezone.now, verbose_name='开始时间') + end_time = models.DateTimeField(default=timezone.now, verbose_name='结束时间') + add_time = models.DateTimeField(auto_now_add=True, verbose_name="添加时间", null=True) class Meta: db_table = 'ops_users_plan' diff --git a/utils/__pycache__/__init__.cpython-36.opt-1.pyc b/utils/__pycache__/__init__.cpython-36.opt-1.pyc deleted file mode 100644 index 8145c95e..00000000 Binary files a/utils/__pycache__/__init__.cpython-36.opt-1.pyc and /dev/null differ diff --git a/utils/__pycache__/__init__.cpython-36.pyc b/utils/__pycache__/__init__.cpython-36.pyc deleted file mode 100644 index be457b8d..00000000 Binary files a/utils/__pycache__/__init__.cpython-36.pyc and /dev/null differ diff --git a/utils/__pycache__/crypt_pwd.cpython-36.opt-1.pyc b/utils/__pycache__/crypt_pwd.cpython-36.opt-1.pyc deleted file mode 100644 index 0645aef3..00000000 Binary files a/utils/__pycache__/crypt_pwd.cpython-36.opt-1.pyc and /dev/null differ diff --git a/utils/__pycache__/get_mongo_log.cpython-36.pyc b/utils/__pycache__/get_mongo_log.cpython-36.pyc deleted file mode 100644 index 3002a855..00000000 Binary files a/utils/__pycache__/get_mongo_log.cpython-36.pyc and /dev/null differ diff --git a/utils/__pycache__/get_verbose_name.cpython-36.opt-1.pyc b/utils/__pycache__/get_verbose_name.cpython-36.opt-1.pyc deleted file mode 100644 index de9cec9f..00000000 Binary files a/utils/__pycache__/get_verbose_name.cpython-36.opt-1.pyc and /dev/null differ diff --git a/utils/__pycache__/init_yaml.cpython-36.opt-1.pyc b/utils/__pycache__/init_yaml.cpython-36.opt-1.pyc deleted file mode 100644 index ec23b5d4..00000000 Binary files a/utils/__pycache__/init_yaml.cpython-36.opt-1.pyc and /dev/null differ diff --git a/utils/__pycache__/init_yaml.cpython-36.pyc b/utils/__pycache__/init_yaml.cpython-36.pyc deleted file mode 100644 index 9a380b11..00000000 Binary files a/utils/__pycache__/init_yaml.cpython-36.pyc and /dev/null differ diff --git a/utils/__pycache__/log_websocket.cpython-36.opt-1.pyc b/utils/__pycache__/log_websocket.cpython-36.opt-1.pyc deleted file mode 100644 index e2033c39..00000000 Binary files a/utils/__pycache__/log_websocket.cpython-36.opt-1.pyc and /dev/null differ diff --git a/utils/__pycache__/mongo_log.cpython-36.opt-1.pyc b/utils/__pycache__/mongo_log.cpython-36.opt-1.pyc deleted file mode 100644 index decf2a35..00000000 Binary files a/utils/__pycache__/mongo_log.cpython-36.opt-1.pyc and /dev/null differ diff --git a/utils/__pycache__/mongo_log.cpython-36.pyc b/utils/__pycache__/mongo_log.cpython-36.pyc deleted file mode 100644 index 13fdd699..00000000 Binary files a/utils/__pycache__/mongo_log.cpython-36.pyc and /dev/null differ diff --git a/utils/db/__pycache__/__init__.cpython-36.opt-1.pyc b/utils/db/__pycache__/__init__.cpython-36.opt-1.pyc deleted file mode 100644 index b4fbb068..00000000 Binary files a/utils/db/__pycache__/__init__.cpython-36.opt-1.pyc and /dev/null differ diff --git a/utils/db/__pycache__/__init__.cpython-36.pyc b/utils/db/__pycache__/__init__.cpython-36.pyc deleted file mode 100644 index dcc1d613..00000000 Binary files a/utils/db/__pycache__/__init__.cpython-36.pyc and /dev/null differ diff --git a/utils/db/__pycache__/redis_ops.cpython-36.opt-1.pyc b/utils/db/__pycache__/redis_ops.cpython-36.opt-1.pyc deleted file mode 100644 index 7102a875..00000000 Binary files a/utils/db/__pycache__/redis_ops.cpython-36.opt-1.pyc and /dev/null differ diff --git a/utils/db/__pycache__/redis_ops.cpython-36.pyc b/utils/db/__pycache__/redis_ops.cpython-36.pyc deleted file mode 100644 index 29200c8b..00000000 Binary files a/utils/db/__pycache__/redis_ops.cpython-36.pyc and /dev/null differ diff --git a/utils/middleware.py b/utils/middleware.py index 23ebc1f6..1bca5fc4 100644 --- a/utils/middleware.py +++ b/utils/middleware.py @@ -65,7 +65,7 @@ def process_response(self, request, response): else: code = None - mongo = MongoOps(settings.MONGODB_HOST, settings.MONGODB_PORT, settings.RECORD_DB, settings.RECORD_COLL) + mongo = MongoOps(settings.MONGODB_HOST, settings.MONGODB_PORT, settings.RECORD_DB, settings.RECORD_COLL, settings.MONGODB_USER, settings.MONGODB_PASS) request_data = {'username': request.user.username, 'path': request.path, 'method': request.method, 'request_data': data, 'code': code, 'ip': request.META['REMOTE_ADDR'], 'datetime': datetime.datetime.now()}