diff --git a/abonapp/migrations/0001_squashed_0008_auto_20181115_1206.py b/abonapp/migrations/0001_squashed_0008_auto_20181115_1206.py new file mode 100644 index 0000000..28accc3 --- /dev/null +++ b/abonapp/migrations/0001_squashed_0008_auto_20181115_1206.py @@ -0,0 +1,356 @@ +# Generated by Django 2.1.1 on 2019-03-05 20:00 + +import bitfield.models +import django.core.validators +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + replaces = [('abonapp', '0001_initial'), ('abonapp', '0002_auto_20180808_1448'), ('abonapp', '0003_abon_nas'), + ('abonapp', '0004_auto_20180918_1734'), ('abonapp', '0005_current_tariff'), + ('abonapp', '0006_change_ip'), ('abonapp', '0007_auto_20181101_1545'), + ('abonapp', '0008_auto_20181115_1206')] + + initial = True + + dependencies = [ + ('tariff_app', '0003_auto_20181115_1206'), + ('gw_app', '0001_initial'), + ('tariff_app', '0001_initial'), + ('ip_pool', '0001_initial'), + ('gw_app', '0002_auto_20181101_1545'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('group_app', '0001_initial'), + ('accounts_app', '0001_initial'), + ('devapp', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='AbonTariff', + fields=[ + ('id', models.AutoField( + auto_created=True, primary_key=True, + serialize=False, verbose_name='ID' + )), + ('tariff', models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name='linkto_tariff', + to='tariff_app.Tariff' + )), + ('time_start', models.DateTimeField( + blank=True, default=None, null=True + )), + ('deadline', models.DateTimeField( + blank=True, default=None, null=True + )), + ], + options={ + 'ordering': ('time_start',), + 'permissions': (('can_complete_service', 'finish service perm'),), + 'verbose_name': 'Abon service', + 'verbose_name_plural': 'Abon services', + 'db_table': 'abonent_tariff' + }, + ), + migrations.CreateModel( + name='AbonStreet', + fields=[ + ('id', models.AutoField( + auto_created=True, primary_key=True, + serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=64)), + ('group', models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to='group_app.Group' + )), + ], + options={ + 'verbose_name': 'Street', + 'verbose_name_plural': 'Streets', + 'db_table': 'abon_street', + 'ordering': ('name',), + }, + ), + migrations.CreateModel( + name='Abon', + fields=[ + ('baseaccount_ptr', models.OneToOneField( + auto_created=True, on_delete=django.db.models.deletion.CASCADE, + parent_link=True, primary_key=True, serialize=False, + to='accounts_app.BaseAccount' + )), + ('current_tariff', models.OneToOneField( + blank=True, default=None, null=True, + on_delete=django.db.models.deletion.SET_NULL, + to='abonapp.AbonTariff' + )), + ('group', models.ForeignKey( + blank=True, null=True, + on_delete=django.db.models.deletion.SET_NULL, + to='group_app.Group', verbose_name='User group' + )), + ('ballance', models.FloatField(default=0.0)), + ('ip_address', models.GenericIPAddressField( + blank=True, null=True, + verbose_name='Ip address' + )), + ('description', models.TextField( + blank=True, null=True, verbose_name='Comment' + )), + ('street', models.ForeignKey( + blank=True, null=True, + on_delete=django.db.models.deletion.SET_NULL, + to='abonapp.AbonStreet', verbose_name='Street' + )), + ('house', models.CharField( + blank=True, max_length=12, + null=True, verbose_name='House' + )), + ('device', models.ForeignKey( + blank=True, null=True, + on_delete=django.db.models.deletion.SET_NULL, + to='devapp.Device' + )), + ('dev_port', models.ForeignKey( + blank=True, null=True, + on_delete=django.db.models.deletion.SET_NULL, + to='devapp.Port' + )), + ('is_dynamic_ip', models.BooleanField( + default=False, verbose_name='Is dynamic ip' + )), + ('nas', models.ForeignKey( + blank=True, default=None, null=True, + on_delete=django.db.models.deletion.SET_NULL, + to='gw_app.NASModel', verbose_name='Network access server' + )), + ('autoconnect_service', models.BooleanField( + default=False, verbose_name='Automatically connect next service' + )), + ('last_connected_tariff', models.ForeignKey( + blank=True, default=None, null=True, + on_delete=django.db.models.deletion.SET_NULL, + to='tariff_app.Tariff', + verbose_name='Last connected service' + )), + ('markers', bitfield.models.BitField( + (('icon_donkey', 'Donkey'), ('icon_fire', 'Fire'), + ('icon_ok', 'Ok'), ('icon_king', 'King'), + ('icon_tv', 'TV'), ('icon_smile', 'Smile'), + ('icon_dollar', 'Dollar'), ('icon_service', 'Service'), + ('icon_mrk', 'Marker')), default=0 + )), + ], + options={ + 'ordering': ('fio',), + 'permissions': ( + ('can_buy_tariff', 'Buy service perm'), + ('can_add_ballance', 'fill account'), + ('can_ping', 'Can ping')), + 'verbose_name': 'Abon', + 'verbose_name_plural': 'Abons', + 'db_table': 'abonent', + 'unique_together': {('ip_address', 'nas')} + }, + bases=('accounts_app.baseaccount',), + ), + migrations.CreateModel( + name='AbonLog', + fields=[ + ('id', models.AutoField( + auto_created=True, primary_key=True, + serialize=False, verbose_name='ID' + )), + ('abon', models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to='abonapp.Abon')), + ('amount', models.FloatField(default=0.0)), + ('author', models.ForeignKey( + blank=True, null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name='+', to=settings.AUTH_USER_MODEL + )), + ('comment', models.CharField(max_length=128)), + ('date', models.DateTimeField(auto_now_add=True)), + ], + options={ + 'db_table': 'abonent_log', + 'ordering': ('-date',) + }, + ), + migrations.CreateModel( + name='AdditionalTelephone', + fields=[ + ('abon', models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name='additional_telephones', + to='abonapp.Abon' + )), + ('id', models.AutoField( + auto_created=True, primary_key=True, + serialize=False, verbose_name='ID' + )), + ('telephone', models.CharField( + max_length=16, validators=[ + django.core.validators.RegexValidator('^(\\+[7,8,9,3]\\d{10,11})?$') + ], + verbose_name='Telephone') + ), + ('owner_name', models.CharField(max_length=127)), + ], + options={ + 'verbose_name': 'Additional telephone', + 'verbose_name_plural': 'Additional telephones', + 'db_table': 'additional_telephones', + 'ordering': ('owner_name',), + }, + ), + migrations.CreateModel( + name='AllPayLog', + fields=[ + ('pay_id', models.CharField(max_length=64, primary_key=True, serialize=False)), + ('date_action', models.DateTimeField(auto_now_add=True)), + ('summ', models.FloatField(default=0.0)), + ('pay_system_name', models.CharField(max_length=16)), + ], + options={ + 'db_table': 'all_pay_log', + 'ordering': ('-date_action',), + }, + ), + migrations.CreateModel( + name='AllTimePayLog', + fields=[ + ('abon', + models.ForeignKey( + blank=True, default=None, null=True, + on_delete=django.db.models.deletion.SET_DEFAULT, + to='abonapp.Abon' + )), + ('pay_id', models.CharField( + max_length=36, primary_key=True, + serialize=False, unique=True + )), + ('date_add', models.DateTimeField(auto_now_add=True)), + ('summ', models.FloatField(default=0.0)), + ('trade_point', models.CharField( + blank=True, default=None, max_length=20, + null=True, verbose_name='Trade point' + )), + ('receipt_num', models.BigIntegerField(default=0, verbose_name='Receipt number')), + ], + options={ + 'db_table': 'all_time_pay_log', + 'ordering': ('-date_add',), + }, + ), + migrations.CreateModel( + name='InvoiceForPayment', + fields=[ + ('id', models.AutoField( + auto_created=True, primary_key=True, + serialize=False, verbose_name='ID' + )), + ('abon', models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to='abonapp.Abon' + )), + ('status', models.BooleanField(default=False)), + ('amount', models.FloatField(default=0.0)), + ('comment', models.CharField(max_length=128)), + ('date_create', models.DateTimeField(auto_now_add=True)), + ('date_pay', models.DateTimeField(blank=True, null=True)), + ('author', models.ForeignKey( + blank=True, null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name='+', to=settings.AUTH_USER_MODEL + )) + ], + options={ + 'verbose_name': 'Debt', + 'verbose_name_plural': 'Debts', + 'db_table': 'abonent_inv_pay', + 'ordering': ('date_create',) + }, + ), + migrations.CreateModel( + name='PassportInfo', + fields=[ + ('id', models.AutoField( + auto_created=True, primary_key=True, + serialize=False, verbose_name='ID' + )), + ('series', models.CharField( + max_length=4, validators=[django.core.validators.integer_validator], + verbose_name='Pasport serial' + )), + ('number', models.CharField( + max_length=6, validators=[django.core.validators.integer_validator], + verbose_name='Pasport number' + )), + ('distributor', models.CharField( + max_length=64, verbose_name='Distributor' + )), + ('date_of_acceptance', models.DateField( + verbose_name='Date of acceptance' + )), + ('abon', models.OneToOneField( + blank=True, null=True, + on_delete=django.db.models.deletion.CASCADE, + to='abonapp.Abon' + )) + ], + options={ + 'ordering': ('series',), + 'verbose_name': 'Passport Info', + 'verbose_name_plural': 'Passport Info', + 'db_table': 'passport_info' + }, + ), + migrations.CreateModel( + name='PeriodicPayForId', + fields=[ + ('id', models.AutoField( + auto_created=True, primary_key=True, + serialize=False, verbose_name='ID' + )), + ('periodic_pay', models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to='tariff_app.PeriodicPay', + verbose_name='Periodic pay' + )), + ('last_pay', models.DateTimeField( + blank=True, null=True, verbose_name='Last pay time' + )), + ('next_pay', models.DateTimeField( + verbose_name='Next time to pay' + )), + ('account', models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to='abonapp.Abon', + verbose_name='Account' + )) + ], + options={ + 'db_table': 'periodic_pay_for_id', + 'ordering': ('last_pay',) + }, + ), + migrations.CreateModel( + name='AbonRawPassword', + fields=[ + ('account', models.OneToOneField( + on_delete=django.db.models.deletion.CASCADE, + primary_key=True, serialize=False, + to='abonapp.Abon' + )), + ('passw_text', models.CharField(max_length=64)), + ], + options={ + 'db_table': 'abon_raw_password', + }, + ), + ] diff --git a/agent/netflow/djing_flow.tar.gz b/agent/netflow/djing_flow.tar.gz new file mode 100644 index 0000000..02b6e9a Binary files /dev/null and b/agent/netflow/djing_flow.tar.gz differ diff --git a/agent/netflow/netflow_handler.py b/agent/netflow/netflow_handler.py index 5302e6f..0f60b70 100755 --- a/agent/netflow/netflow_handler.py +++ b/agent/netflow/netflow_handler.py @@ -39,11 +39,8 @@ if __name__ == '__main__': cursor = db.cursor() sql = ( - 'SELECT INET_ATON(emps.ip) as uip, acc.id FROM abonent ' - 'LEFT JOIN base_accounts AS acc ON (acc.id = abonent.baseaccount_ptr_id) ' - 'LEFT JOIN abonent_ip_addresses AS ips ON (acc.id = ips.abon_id) ' - 'LEFT JOIN ip_pool_employed_ip AS emps ON (ips.ipleasemodel_id = emps.id) ' - 'WHERE INET_ATON(emps.ip) != 0;' + "SELECT INET_ATON(ip_address) as uip, baseaccount_ptr_id FROM abonent " + "WHERE INET_ATON(ip_address) != 'NULL';" ) ln = cursor.execute(sql) with open(tmp_ipuser_file, 'w') as f: diff --git a/agent/netflow/start_netflow.sh b/agent/netflow/start_netflow.sh index a5243e2..a298f8e 100755 --- a/agent/netflow/start_netflow.sh +++ b/agent/netflow/start_netflow.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash -PATH=/usr/local/sbin:/usr/local/bin:/usr/bin +PATH=/bin:/usr/local/sbin:/usr/local/bin:/usr/bin mkdir -p /tmp/djing_flow diff --git a/devapp/migrations/0001_squashed_0005_device_ip_address_change.py b/devapp/migrations/0001_squashed_0005_device_ip_address_change.py new file mode 100644 index 0000000..0459372 --- /dev/null +++ b/devapp/migrations/0001_squashed_0005_device_ip_address_change.py @@ -0,0 +1,120 @@ +# Generated by Django 2.1.1 on 2019-03-05 19:32 + +from django.db import migrations, models +import django.db.models.deletion +import djing.fields +import jsonfield.fields + + +class Migration(migrations.Migration): + replaces = [ + ('devapp', '0001_initial'), + ('devapp', '0002_auto_20180409_1318'), + ('devapp', '0003_auto_20180529_1311'), + ('devapp', '0004_device_extra_data'), + ('devapp', '0005_device_ip_address_change') + ] + + initial = True + + dependencies = [ + ('group_app', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='Device', + fields=[ + ('id', models.AutoField( + auto_created=True, primary_key=True, + serialize=False, verbose_name='ID' + )), + ('ip_address', models.GenericIPAddressField( + blank=True, null=True, verbose_name='Ip address' + )), + ('mac_addr', djing.fields.MACAddressField( + blank=True, integer=True, + null=True, unique=True, + verbose_name='Mac address' + )), + ('comment', models.CharField( + max_length=256, verbose_name='Comment' + )), + ('devtype', models.CharField( + choices=[('Dl', 'DLink switch'), ('Pn', 'PON OLT'), + ('On', 'PON ONU BDCOM'), ('Ex', 'Eltex switch'), + ('Zt', 'OLT ZTE C320'), ('Zo', 'Zte ONU F660'), + ('Z6', 'Zte ONU F601'), ('Hw', 'Huawei switch')], + default='Dl', max_length=2, + verbose_name='Device type' + )), + ('man_passw', models.CharField( + blank=True, max_length=16, + null=True, verbose_name='SNMP password' + )), + ('status', models.CharField( + choices=[('und', 'Undefined'), ('up', 'Up'), + ('unr', 'Unreachable'), ('dwn', 'Down')], + default='und', max_length=3, + verbose_name='Status' + )), + ('is_noticeable', models.BooleanField( + default=False, + verbose_name='Send notify when monitoring state changed' + )), + ('group', models.ForeignKey( + blank=True, null=True, + on_delete=django.db.models.deletion.SET_NULL, + to='group_app.Group', verbose_name='Device group' + )), + ('parent_dev', models.ForeignKey( + blank=True, null=True, + on_delete=django.db.models.deletion.SET_NULL, + to='devapp.Device', verbose_name='Parent device' + )), + ('extra_data', jsonfield.fields.JSONField( + blank=True, + help_text='Extra data in JSON format. You may use it for your custom data', + null=True, verbose_name='Extra data' + )), + ('snmp_extra', models.CharField( + blank=True, max_length=256, + null=True, verbose_name='SNMP extra info' + )) + ], + options={ + 'verbose_name': 'Device', + 'verbose_name_plural': 'Devices', + 'db_table': 'dev', + 'ordering': ('id',), + }, + ), + migrations.CreateModel( + name='Port', + fields=[ + ('id', models.AutoField( + auto_created=True, primary_key=True, + serialize=False, verbose_name='ID' + )), + ('num', models.PositiveSmallIntegerField( + default=0, verbose_name='Number' + )), + ('descr', models.CharField( + blank=True, max_length=60, null=True, + verbose_name='Description' + )), + ('device', models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to='devapp.Device', verbose_name='Device' + )), + ], + options={ + 'verbose_name': 'Port', + 'verbose_name_plural': 'Ports', + 'db_table': 'dev_port', + 'permissions': (('can_toggle_ports', 'Can toggle ports'),), + 'ordering': ('num',), + 'unique_together': {('device', 'num')}, + }, + ), + ] diff --git a/devapp/models.py b/devapp/models.py index 20c79a9..6808aee 100644 --- a/devapp/models.py +++ b/devapp/models.py @@ -110,7 +110,7 @@ class Port(models.Model): class Meta: db_table = 'dev_port' - unique_together = (('device', 'num'),) + unique_together = ('device', 'num') permissions = ( ('can_toggle_ports', _('Can toggle ports')), ) diff --git a/djing/fields.py b/djing/fields.py index b8effee..58bbd10 100644 --- a/djing/fields.py +++ b/djing/fields.py @@ -111,6 +111,7 @@ except ImportError: pass +# DEPRECATED: remove after clean old migrations class MyGenericIPAddressField(models.GenericIPAddressField): description = "Int32 notation ip address" diff --git a/ip_pool/migrations/0001_squashed_0004_auto_20190305_1243.py b/ip_pool/migrations/0001_squashed_0004_auto_20190305_1243.py new file mode 100644 index 0000000..cc71ae3 --- /dev/null +++ b/ip_pool/migrations/0001_squashed_0004_auto_20190305_1243.py @@ -0,0 +1,36 @@ +# Generated by Django 2.1.1 on 2019-03-05 12:47 + +from django.db import migrations, models +import ip_pool.fields + + +class Migration(migrations.Migration): + + replaces = [('ip_pool', '0001_initial'), ('ip_pool', '0002_change_unique'), ('ip_pool', '0003_auto_20181019_1230'), ('ip_pool', '0004_auto_20190305_1243')] + + initial = True + + dependencies = [ + ('group_app', '0002_group_code'), + ] + + operations = [ + migrations.CreateModel( + name='NetworkModel', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('network', ip_pool.fields.GenericIpAddressWithPrefix(help_text='Ip address of network. For example: 192.168.1.0 or fde8:6789:1234:1::', unique=True, verbose_name='IP network')), + ('kind', models.CharField(choices=[('inet', 'Internet'), ('guest', 'Guest'), ('trust', 'Trusted'), ('device', 'Devices'), ('admin', 'Admin')], default='guest', max_length=6, verbose_name='Kind of network')), + ('description', models.CharField(max_length=64, verbose_name='Description')), + ('ip_start', models.GenericIPAddressField(verbose_name='Start work ip range')), + ('ip_end', models.GenericIPAddressField(verbose_name='End work ip range')), + ('groups', models.ManyToManyField(to='group_app.Group', verbose_name='Groups')), + ], + options={ + 'verbose_name': 'Network', + 'verbose_name_plural': 'Networks', + 'db_table': 'ip_pool_network', + 'ordering': ('network',), + }, + ) + ] diff --git a/ip_pool/migrations/0004_auto_20190305_1243.py b/ip_pool/migrations/0004_auto_20190305_1243.py new file mode 100644 index 0000000..5514733 --- /dev/null +++ b/ip_pool/migrations/0004_auto_20190305_1243.py @@ -0,0 +1,15 @@ +# Generated by Django 2.1.1 on 2019-03-05 12:43 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('ip_pool', '0003_auto_20181019_1230'), + ] + + operations = [ + migrations.DeleteModel(name='IpLeaseModel'), + migrations.DeleteModel(name='LeasesHistory') + ] diff --git a/ip_pool/models.py b/ip_pool/models.py index bc6f771..e5f9a10 100644 --- a/ip_pool/models.py +++ b/ip_pool/models.py @@ -160,6 +160,7 @@ class NetworkModel(models.Model): ordering = ('network',) +# Deprecated. Remove after migrations squashed class IpLeaseManager(models.Manager): def get_free_ip(self, network: NetworkModel): @@ -234,6 +235,7 @@ class IpLeaseModel(models.Model): unique_together = ('ip', 'network', 'mac_addr') +# Deprecated. Remove after migrations squashed class LeasesHistory(models.Model): ip = models.GenericIPAddressField(verbose_name=_('Ip address')) lease_time = models.DateTimeField(_('Lease time'), auto_now_add=True)