Guest User

Untitled

a guest
Apr 20th, 2018
132
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 19.10 KB | None | 0 0
  1. # encoding: utf-8
  2. from django import forms
  3. from django.forms.formsets import formset_factory
  4. from django.http import HttpResponse
  5. from django.utils import simplejson
  6. from django.shortcuts import render_to_response
  7. from django.template.context import RequestContext
  8. from django.utils.decorators import method_decorator
  9. from django.views.decorators.csrf import csrf_protect
  10. import copy
  11. from blowfish import Blowfish
  12. import base64
  13. from django.conf import settings
  14. from models import *
  15. from functions import *
  16.  
  17. class Master1Step1Form(forms.Form):
  18.     ip = forms.IPAddressField(label=u'IP адрес')
  19.     hardware = forms.ChoiceField(label=u'Тип оборудования', choices=HARDWARE)
  20.     login = forms.CharField(label=u'Пользователь',  required=False)
  21.     password = forms.CharField(label=u'Пароль',  required=False)#, widget=forms.PasswordInput)
  22.     def __init__(self, city_ls, *args, **kw):
  23.         # в city_ls список городов
  24.         super(Master1Step1Form, self).__init__(*args, **kw)
  25.         #вызываем родительский конструктор
  26.         self.fields.insert(0, 'city', forms.ChoiceField(label=u'Город', choices=city_ls))
  27.         #создаем поле city с заданным списком городов
  28.  
  29. class Master1Step2Form(forms.Form):
  30.     model = forms.CharField(label=u'Модель',  required=False, widget=forms.TextInput(attrs={'readonly': '1'}))
  31.     firmwarecurr = forms.CharField(label=u'Текущая прошивка', required=False, widget=forms.TextInput(attrs={'readonly': '1'}))
  32.     interface = forms.CharField(label=u'Интерфейс',  required=False, widget=forms.TextInput(attrs={'readonly': '1'}))
  33.     mask = forms.IPAddressField(label=u'Маска',  required=False, widget=forms.TextInput(attrs={'readonly': '1'}))
  34.     gateway = forms.IPAddressField(label=u'Шлюз',  required=False, widget=forms.TextInput(attrs={'readonly': '1'}))
  35.     vlan = forms.IntegerField(label=u'Vlan', required=False)
  36.     user = forms.CharField(required=False, widget=forms.HiddenInput)
  37.     passw = forms.CharField(required=False, widget=forms.HiddenInput)
  38.     aposnew = forms.BooleanField(required=False, widget=forms.HiddenInput)
  39.     def __init__(self, firm_ver, *args, **kw):
  40.         super(Master1Step2Form, self).__init__(*args, **kw)
  41.         self.fields.insert(0, 'firmware', forms.ChoiceField(label=u'Прошивка', choices=firm_ver))
  42.     config_old = forms.CharField(label=u'Старый конфиг',  required=False, widget=forms.Textarea(attrs={'rows':'46', 'cols':'60'}))
  43.     lines = forms.CharField(label=u'Линий')
  44.  
  45. class Master1Step3Form(forms.Form):
  46.     phonelines = forms.IntegerField(label=u'Номер %d')
  47.  
  48. class Master1Step4Form(forms.Form):
  49.     #phonesole = forms.IntegerField(label=u'Номер', widget=forms.TextInput(attrs={'readonly': '1', 'label':'Number'}))
  50.     phonecat = forms.ChoiceField(label=u'Кат. %d', choices=CATEGORY)
  51.  
  52. class Master1Step5Form(forms.Form):
  53.     config_new = forms.CharField(label=u'Новый конфиг', widget=forms.Textarea(attrs={'rows':'46', 'cols':'60'}))
  54.  
  55.  
  56. class ManagmentForm(forms.Form):
  57.  
  58.     def __init__(self, step, *args, **kwargs):    
  59.         super(ManagmentForm, self).__init__(*args, **kwargs)
  60.         for i in range(step+1):
  61.             self.fields['managment_%d' % i] = forms.CharField(widget=forms.HiddenInput)
  62.  
  63. def crypt(dt):
  64.     s = simplejson.dumps(dt)
  65.     if s:
  66.         b = Blowfish(settings.SECRET_KEY)
  67.         s = ''.join([b.encrypt(s[i:i+8].ljust(8)) for i in range(0, len(s), 8)])
  68.         return base64.b64encode(s)
  69.     else:
  70.         return ''
  71.  
  72. def decrypt(s):
  73.     if s:        
  74.         s = base64.b64decode(s)        
  75.         b = Blowfish(settings.SECRET_KEY)
  76.         s = ''.join([b.decrypt(s[i:i+8]) for i in range(0, len(s), 8)])
  77.         return simplejson.loads(s)
  78.     else:
  79.         return {}
  80. def enumerate_labels(formset, labels=None):
  81.     for i, form in enumerate(formset.forms):
  82.         for name in form.fields:
  83.             field = form.fields[name]
  84.             if '%d' in field.label:
  85.                 if labels:
  86.                     field.label = field.label % (labels[i])
  87.                 else:
  88.                     field.label = field.label % (i+1)
  89.     return formset    
  90.  
  91. class WizardError(Exception):
  92.  
  93.     def __init__(self, message, step):
  94.         self.message = message
  95.         self.step = step
  96.  
  97.  
  98. class EnhancedWizard(object):
  99.     step_field_name="wizard_step"
  100.  
  101.     def get_form(self, step, meta=None, data=None, form_list=None):
  102.         func = getattr(self, 'get_step_form_%d' % step, None)
  103.         if func:
  104.             return func(meta, data, form_list)
  105.         else:
  106.             return None, None
  107.  
  108.     @method_decorator(csrf_protect)
  109.     def __call__(self, request, *args, **kwargs):      
  110.  
  111.         self.message = None
  112.         self.message_class = 'info'
  113.                
  114.         current_step = self.determine_step(request, *args, **kwargs)
  115.         form_meta, form_ls = {}, []
  116.  
  117.         if request.method == 'POST':
  118.             last_managment = ManagmentForm(current_step, request.POST)
  119.             if not last_managment.is_valid():
  120.                 #TODO: бросить хорошее исключение
  121.                 raise
  122.             managment_data = getattr(last_managment, 'cleaned_data', {})
  123.             is_valid = True            
  124.             for i in range(current_step+1):  
  125.                 form, meta = self.get_form(i,
  126.                     decrypt(managment_data.get('managment_%d' % i, None)),
  127.                     request.POST)
  128.                 form_ls.append(form)
  129.                 form_meta['managment_%d' % i] = crypt(meta)          
  130.                 is_valid = is_valid and form.is_valid()
  131.             if is_valid:    
  132.                 next_step = current_step + 1
  133.                 try:
  134.                     form, meta = self.get_form(next_step, form_list=form_ls)
  135.                     if not form:
  136.                         return self.done(request, form_ls)
  137.                     form_meta['managment_%d' % next_step] = crypt(meta)
  138.                     current_step = next_step            
  139.                     form_ls.append(form)
  140.                 except WizardError, e:
  141.                     self.message = e.message
  142.                     self.message_class = 'error'
  143.                     current_step = next_step = e.step          
  144.                     #зачищаем формы и метаданные
  145.                     form_ls = form_ls[:current_step+1]
  146.                     for i in range(current_step+1, len(form_meta)):                        
  147.                         if 'managment_%d' % i in form_meta:
  148.                             del form_meta['managment_%d' % i]
  149.         else:
  150.             form, meta = self.get_form(current_step)
  151.             form_meta['managment_0'] = crypt(meta)  
  152.             next_step = current_step
  153.             form_ls.append(form)
  154.         next_managment = ManagmentForm(current_step, form_meta)    
  155.         return self.render(form_ls, request, current_step, next_managment)        
  156.  
  157.     def double_form(self, form):
  158.         # Побочный эфект на form!        
  159.        
  160.         def process_form(form, fake):
  161.             for name in form.fields:
  162.                 form.fields[name].widget = forms.HiddenInput()
  163.             for name in fake.fields:
  164.                 fake.fields[name].widget.attrs['disabled'] = '1'
  165.  
  166.         fake = copy.deepcopy(form)
  167.         if hasattr(form, 'forms'):
  168.             for x, y in zip(form.forms, fake.forms):
  169.                 process_form(x, y)
  170.         else:
  171.             process_form(form, fake)
  172.         return fake    
  173.  
  174.     def render(self, forms_list, request, step, managment_form):
  175.         ls = []      
  176.         for form in forms_list[:-1]:                        
  177.             ls.append(self.double_form(form))
  178.             ls.append(form)            
  179.         ls.append(forms_list[-1])
  180.         return self.render_template(request, ls, step, managment_form)        
  181.  
  182.     def get_template(self, step):
  183.         return 'wizard.html'
  184.  
  185.     def determine_step(self, request, *args, **kwargs):
  186.         if not request.POST:
  187.             return 0
  188.         try:
  189.             if 'action_next' in request.POST:
  190.                 step = int(request.POST.get(self.step_field_name, 0))
  191.             else:
  192.                 step = int(request.POST.get(self.step_field_name, 0)) - 2
  193.         except ValueError:
  194.             return 0
  195.         return step
  196.  
  197.     def render_template(self, request, forms, step, managment_form):
  198.         return render_to_response(self.get_template(step), dict(step0=step,
  199.             step=step+1,
  200.             managment_form=managment_form,
  201.             forms=forms,
  202.             step_field=self.step_field_name,
  203.             message=self.message,
  204.             message_class=self.message_class
  205.         ), context_instance=RequestContext(request))
  206.  
  207.     def done(self, request, form_list):
  208.         raise NotImplementedError("Your %s class has not defined a done() method, which is required." % self.__class__.__name__)        
  209.  
  210. class TestWizard(EnhancedWizard):
  211.    
  212.     def get_step_form_0(self, meta=None, data=None, form_list=None):
  213.         if not meta:
  214.             meta = {}
  215.             town_settings = init_town_settings()
  216.             city_ls = double(*sorted(town_settings['citys']))
  217.             meta['city_ls'] = city_ls
  218.             form = Master1Step1Form(city_ls, initial={'city': town_settings['my_town']})
  219.         else:
  220.             city_ls = meta['city_ls']
  221.             form = Master1Step1Form(city_ls, data)
  222.         return form, meta
  223.    
  224.     def get_step_form_1(self, meta=None, data=None, form_list=None):
  225.         if not meta:
  226.             meta = {}
  227.             town_settings = init_town_settings()
  228.             user, passw, mask, gw, vlan, interface, model, firmwarecurr = [], [], "", "", "", "0", "", ""
  229.             ip = form_list[0].cleaned_data['ip']
  230.             hardware = [form_list[0].cleaned_data['hardware']][0]
  231.             aposnew = False
  232.             if form_list[0].cleaned_data['login']:
  233.                 user = [form_list[0].cleaned_data['login']]
  234.             else:
  235.                 user = town_settings['user_set']
  236.             if form_list[0].cleaned_data['password']:
  237.                 passw = [form_list[0].cleaned_data['password']]
  238.             else:
  239.                 passw = town_settings['pass_set']
  240.  
  241.             if hardware == "0":
  242.                 result = addpac_access_telnet(ip, user, passw)
  243.                 tn = result['tn']
  244.                 user = result['userr']
  245.                 passw = result['passwr']
  246.                 message = "\r".join(result['message'])
  247.                 if tn:
  248.                     self.message = message
  249.                     result = addpac_pre_cfg(tn, passw)
  250.                     if result:
  251.                         model = result['model']
  252.                         firmwarecurr = result['version']
  253.                         aposnew = result['aposnew']
  254.                     config = addpac_get_cfg(ip, user, passw, aposnew)
  255.                     config_old = "".join(config)
  256.                     result = addpac_ip_settings(ip, config, aposnew)
  257.                     if result:
  258.                         mask = result['mask']
  259.                         gw = result['gw']
  260.                         vlan = result['vlan']
  261.                         interface = result['interface']
  262.                 else:
  263.                     raise WizardError(message, 0)
  264.  
  265.             elif hardware == "1":
  266.                 result = audiocodes_access_telnet(ip, user, passw)
  267.                 user = result['userr']
  268.                 passw = result['passwr']
  269.                 message = "\r".join(result['message'])
  270.                 if user:
  271.                     self.message = message
  272.                     result = audiocodes_pre_cfg(ip, user, passw)
  273.                     config_old = audiocodes_get_cfg(ip, user, passw)
  274.                     if result:
  275.                         mask = result['mask']
  276.                         gw = result['gw']
  277.                         model = result['model']
  278.                         firmwarecurr = result['version']
  279.                         vlan =  result['vlan']
  280.                 else:
  281.                     raise WizardError(message, 0)
  282.  
  283.             if int(hardware) < 10:
  284.                 result = init_hw_settings(model)
  285.                 firm_ver = result['firm_ver']
  286.                 firm_rec = result['firm_rec']
  287.                 lines = result['fxs']
  288.                 meta['firm_ver'] = firm_ver
  289.                 form = Master1Step2Form(firm_ver, initial={'firmware': firm_rec, 'user': user, 'passw': passw,
  290.                 'mask':mask, 'interface':interface, 'model':model, 'gateway':gw, 'aposnew':aposnew,
  291.                 'firmwarecurr':firmwarecurr, 'lines':lines, 'vlan':vlan, 'config_old':config_old})
  292.                 form.fields['lines'].widget.attrs['readonly'] = '1'
  293.             else:
  294.                 meta['firm_ver'] = (("None","None"),)
  295.                 form = Master1Step2Form((("None","None"),))
  296.                 #form.fields['config_old'].widget = forms.HiddenInput()
  297.                 form.fields['config_old'].widget.attrs['style']  = 'display: none;'
  298.         else:
  299.             firm_ver = meta['firm_ver']
  300.             form = Master1Step2Form(firm_ver, data)
  301.         return form, meta
  302.  
  303.     def get_step_form_2(self, meta=None, data=None, form_list=None):
  304.         if not meta:
  305.             meta = {}
  306.             n = int(form_list[1].cleaned_data['lines'])
  307.             meta['phones'] = n
  308.             formset = formset_factory(Master1Step3Form, extra=n)
  309.             form = formset(data, prefix='phones')
  310.             enumerate_labels(form)
  311.         else:
  312.             n = meta['phones']
  313.             formset = formset_factory(Master1Step3Form, extra=n)
  314.             form = formset(data, prefix='phones')
  315.             enumerate_labels(form)
  316.         return form, meta
  317.  
  318.     def get_step_form_3(self, meta=None, data=None, form_list=None):
  319.         if not meta:
  320.             meta = {}
  321.             phones = list(set(filter(lambda x: x, [x.cleaned_data.get('phonelines', None) for x in form_list[2].forms])))
  322.             meta['phonescount'] = len(phones)
  323.             meta['phones'] = phones
  324.             formset = formset_factory(Master1Step4Form, extra = 0)
  325.             form = formset(initial=[{'phonesole':x} for x in sorted(phones)])
  326.             enumerate_labels(form, sorted(phones))
  327.         else:
  328.             phones = meta['phones']
  329.             formset = formset_factory(Master1Step4Form, extra = 0)
  330.             form = formset(data)
  331.             enumerate_labels(form, sorted(phones))
  332.         return form, meta
  333.     def get_step_form_4(self, meta=None, data=None, form_list=None):
  334.         if not meta:
  335.             meta = {}
  336.             hardware = [form_list[0].cleaned_data['hardware']][0]
  337.             city = [form_list[0].cleaned_data['city']][0]
  338.             passw = [form_list[1].cleaned_data['passw']][0]
  339.             user = [form_list[1].cleaned_data['user']][0]
  340.             aposnew = [form_list[1].cleaned_data['aposnew']][0]
  341.             ip = [form_list[0].cleaned_data['ip']][0]
  342.             mask = [form_list[1].cleaned_data['mask']][0]
  343.             gateway = [form_list[1].cleaned_data['gateway']][0]
  344.             vlan = [form_list[1].cleaned_data['vlan']][0]
  345.             interface = [form_list[1].cleaned_data['interface']][0]
  346.             firmwarecurr = [form_list[1].cleaned_data['firmwarecurr']][0]
  347.             firmware = [form_list[1].cleaned_data['firmware']][0]
  348.             lines = [form_list[1].cleaned_data['lines']][0]
  349.             model = [form_list[1].cleaned_data['model']][0]
  350.             phonelines = filter(lambda x: x, [x.cleaned_data.get('phonelines', None) for x in form_list[2].forms])
  351.             phones = sorted(list(set(phonelines)))
  352.             phonecat = filter(lambda x: x, [x.cleaned_data.get('phonecat', None) for x in form_list[3].forms])
  353.             result = get_town_settings(city)
  354.             codec = result['codec']
  355.             gk = result['gk']
  356.             passw_gk = result['passw_gk']
  357.             if hardware == "0":
  358.                 config_new = addpac_make_cfg(ip, mask, gateway, passw_gk, gk, phonelines, codec, vlan, aposnew, interface)
  359.             if hardware == "1":
  360.                 config_new = audiocodes_make_cfg(ip, gk, phonelines, codec, vlan)
  361.             form = Master1Step5Form(initial={'config_new':config_new})
  362.         else:
  363.             form = Master1Step5Form(data)
  364.         return form, meta
  365.    
  366.     def done(self, request, form_list):        
  367.         ls =[x.cleaned_data for x in form_list]
  368.         hardware = [form_list[0].cleaned_data['hardware']][0]
  369.         city = [form_list[0].cleaned_data['city']][0]
  370.         passw = [form_list[1].cleaned_data['passw']][0]
  371.         user = [form_list[1].cleaned_data['user']][0]
  372.         aposnew = [form_list[1].cleaned_data['aposnew']][0]
  373.         ip = [form_list[0].cleaned_data['ip']][0]
  374.         mask = [form_list[1].cleaned_data['mask']][0]
  375.         gateway = [form_list[1].cleaned_data['gateway']][0]
  376.         vlan = [form_list[1].cleaned_data['vlan']][0]
  377.         interface = [form_list[1].cleaned_data['interface']][0]
  378.         firmwarecurr = [form_list[1].cleaned_data['firmwarecurr']][0]
  379.         firmware = [form_list[1].cleaned_data['firmware']][0]
  380.         lines = [form_list[1].cleaned_data['lines']][0]
  381.         model = [form_list[1].cleaned_data['model']][0]
  382.         phonelines = filter(lambda x: x, [x.cleaned_data.get('phonelines', None) for x in form_list[2].forms])
  383.         phones = sorted(list(set(phonelines)))
  384.         phonecat = filter(lambda x: x, [x.cleaned_data.get('phonecat', None) for x in form_list[3].forms])
  385.         result = get_town_settings(city)
  386.         codec = result['codec']
  387.         gk = result['gk']
  388.         passw_gk = result['passw_gk']
  389.         firmware_file = None
  390.         if firmwarecurr != firmware:
  391.             firmware_file = str("./firmware/"+init_hw_settings(model, firmware)['firmware'])
  392.         print hardware
  393.         print city
  394.         print passw
  395.         print user
  396.        
  397.         print ip
  398.         print mask
  399.         print gateway
  400.         print vlan
  401.        
  402.         print interface
  403.         print firmwarecurr
  404.         print firmware
  405.         print lines
  406.        
  407.         print model
  408.         print phonelines
  409.         print phones
  410.         print phonecat
  411.         print codec
  412.         print gk
  413.         print passw_gk
  414.         try: os.mkdir("./jobs/" + ip)
  415.         except: pass
  416.         file_cfg_old = str("./jobs/" + ip + "/" + ip + "_" + str(datetime.now().date()) + "-old.cfg")
  417.         file_cfg_new = str("./jobs/" + ip + "/" + ip + "_" + str(datetime.now().date()) + "-new.cfg")
  418.         if hardware == "0":
  419.             addpac_get_cfg(ip, user, passw, aposnew, file_cfg_old)
  420.             addpac_make_cfg(ip, mask, gateway, passw_gk, gk, phonelines, codec, vlan, aposnew, interface, file_cfg_new)
  421.             addpac_do_update(ip, user, passw, aposnew, file_cfg_new, firmware_file)
  422.         if hardware == "1":
  423.             audiocodes_get_cfg(ip, user, passw, file_cfg_old)
  424.             audiocodes_make_cfg(ip, gk, phonelines, codec, vlan, file_cfg_new)
  425.             audiocodes_do_update(ip, user, passw, file_cfg_new, firmware_file)
  426.         return HttpResponse(simplejson.dumps(ls), mimetype='application/json')
Add Comment
Please, Sign In to add comment