Blog

  • Создание панели для Django Debug Toolbar

    Велосипед не мой, я лишь объяву разместил.

    У меня пока не хватает кармы на хабре, чтоб раздавать инвайты за полезные статьи, так что приходится, пока просто копировать в «бложик», ибо они совсем выпадут из выдачи гугла.


    Создание панели для Django Debug Toolbar

    При отладке джангопроектов становиться необходимостью просмотр различной отладочной информации.
    На вопрос отладки в полной мере отвечает приложение Django Debug Toolbar. Воспользуемся возможностью расширения функционала DDT и создадим панель для собственных нужд.

    Создание панели

    Так как системы контроля версий повсеместно используются для работы над проектами, время от времени возникает необходимость проверить когда тот или иной коммит был добавлен.
    По причине того, что я использую git, данная панель будет взаимодействовать именно с этой vcs.
    Примером при написании панели послужило приложение django-git, созданное с целью замены gitweb.
    В качестве обертки для git был использован модуль GitPython.
    Сначала напишем модуль с производным классом от DebugPanel (к примеру, в директории с каким-нибуть из приложений), назовем его panels.py:

    import os
    import time
    
    from git import *
    from debug_toolbar.panels import DebugPanel
    from django.template.loader import render_to_string
    
    class GitStatusPanel(DebugPanel):
    	name = 'Git'
    	has_content = True
    
    	def nav_title(self):
    		return self.name
    
    	def title(self):
    		return self.name
    
    	def url(self):
    		return ''
    
    	def content(self):
    		repo_path = '../GitPython'
    		repo = Repo(repo_path)
    		return render_to_string('debug_toolbar/panels/commits.html', {'commits': repo})Code language: Python (python)

    repo_path — относительный путь к репозиторию.
    Так как GitPython возвращает время добавления коммита в формате unixtime, напишем templatetag для конвертации даты в нужную форму.

    app_name/templatetags/cdate.py:

    import time
    
    from django import template
    
    register = template.Library()
    
    @register.filter
    def cdate(value):
    	date = time.strftime("%d.%M.%Y, %H:%M:%S", time.localtime(value))
    	return dateCode language: Python (python)

    Затем, создадим шаблон страницы в директории с остальными шаблонами DDT (templates/debug_toolbar/panels/commits.html) следующего содержания:

    	{% load i18n %}
    	{% load cdate %}
    	 <table>
    		 <thead>
    			 <tr>
    				 <th>Commit </th>
    				 <th>Date </th>
    				 <th>Author </th>
    			 </tr>
    		 </thead>
    		 <tbody>
    			{% for commit in commits.iter_commits %}
    				 <tr class="{% cycle 'djDebugOdd' 'djDebugEven' %}">
    					 <td><a href="/__debug__/commit/{{commit}}" class="remoteCall">{{commit}} </a></td>
    					 <td>
    						{{commit.committed_date|cdate}}
    					 </td>
    					 <td>
    						{{commit.committer.name}}, {{commit.committer.email}}
    					 </td>
    				 </tr>
    			{% endfor %}
    		 </tbody>
    	 </table>Code language: HTML, XML (xml)

    В результате получилась панель со списком коммитов:

    Так как задачей было также отобразить список действий в рамках коммитов, напишем соответствующую страницу.
    Правим urls.py:

    urlpatterns = patterns('',
    	...
    	(r'^__debug__/commit/([a-z0-9]+)$', show_commit),
    )Code language: Python (python)

    Добавим функцию show_commit к вьюхам приложения app_name (app_name/views.py) или к вьюхам проекта (views.py):

    def show_commit(request, commit):
    	repo_path = '../GitPython'
    	repo = Repo(repo_path)
    	commit_item = repo.commit(commit)
    	commit_diffs = commit_item.diff()
    	changes = []
    	for blob in commit_item.tree:
    		try:
    			changes.append({'path': blob[0].path, 'content': blob[0].data_stream.read()})
    		except:
    			changes.append({'path': blob.path, 'content': blob.data_stream.read()})
    	return render_to_response('debug_toolbar/panels/commit.html', {'commit': commit, 'commit_item': commit_item, 'commit_diffs': commit_diffs, 'changes': changes})Code language: Python (python)

    Воспользовавшись API модуля GitPython получили список изменений, а с помощью свойств объекта blob — путь к модифицированным файлам и их raw-содержимое.
    И наконец, создадим шаблон, templates/debug_toolbar/panels/commit.html:

    {% load i18n %}
    <div class="djDebugPanelTitle">
    	<a class="djDebugClose djDebugBack" href="">{% trans "Back" %}</a>
    	<h3>Commit {{commit}}</h3>
    </div>
    <div class="djDebugPanelContent">
    	<div class="scroll">
    	{% for diff in commit_diffs %}
    		<code><pre>{{diff}}
    
    
    {% if diff.deleted_file %}
    File was removed.
    {% endif %}
    {% if diff.new_file %}
    File was created.
    {% endif %}
    {% if diff.rename %}
    File was renamed: {{diff.rename_from}} → {{diff.rename_to}}
    {% endif %}
    {% endfor %}
    {% if commit_diffs %}
    Modified files
    
    {% for change in changes %}
    file: {{change.path}}
    
    {% autoescape off %}{{change.content}}{% endautoescape %}
    
    
    {% endfor %}
    {% endif %}Code language: Python (python)

    На данной странице будет отображен комментарий к коммиту, список изменений в рамках коммита, а также список путей и содержимого файлами, которые подверглись изменениям.
    Результат:

    При необходимости, можно добавить подсветку синтаксиса с помощью pygments.

    Материалы

    Страница проекта на github — https://github.com/robhudson/django-debug-toolbar,
    статья о создании своей панели — http://blog.akei.com/post/3600587187/creating-a-custom-panel-for-the-django-debug-toolbar.
    страница модуля GitPython — https://github.com/gitpython-developers/GitPython,
    страница приложения django-git — https://github.com/sethtrain/django-git.

    PS Песочница хабра

  • Крутой ping прям как Чак Норис

    А вы знаете как диагностировать момент где потерялся пакетик пинга? а наком именно этапе, по дороге туда или обратно?

    # ping 192.168.6.51 -R -c 3
    PING 192.168.6.51 (192.168.6.51) 56(124) bytes of data.
    64 bytes from 192.168.6.51: icmp_seq=1 ttl=63 time=46.5 ms
    RR:     10.10.10.1
            192.168.6.11
            192.168.6.51
            192.168.6.51
            10.10.10.50
            10.10.10.1
    
    64 bytes from 192.168.6.51: icmp_seq=2 ttl=63 time=40.3 ms      (same route)Code language: Bash (bash)

    Вот так мы хорошо видим, что куда идёт, и также увидим, что где потерялось.

  • debian редактор в mc

    По умолчанию в МЦ в дебиан идёт nano но нам то надо mcedit

    update-alternatives --config editorCode language: Bash (bash)

    Это спасёт нас, выбираем нужную циферку и жмём энтр, * отмечено что выбрано сейчас

  • Есть админы, которые…

    Много много букавак….

    Все мы знаем, что есть админы, которые не делают бэкапы, и кто уже делает бэкапы…

    Я вот непонятно кто, есть у меня сервер со злым рейдом на 4 порта, исторически сложилось, что на нём 2 зеркальных массива.
    2х500 и 2х1500гб

    И посетило меня чудо-юдо..
    один винт из зеркального рейда пошёл в мир иной, точнее как пошёл, из одной папки пропала вся инфа, я подумал, что юзеры удалили попытался туда вернуть файлы из бэкапа, но убунта мне сказала что они уже там лежат.

    (далее…)

  • Список хостов в сети

    И так, понадобилось мне воткнуть в сеть железяку, которая лет ндцать была уже в нашей сети и у неё статический адрес….
    на этой железяке выписан мак, и по маку я должен был найти её ip адрес.

    arp-scan -lCode language: Bash (bash)

    Поможет нам в этом

    покажет он нам примерно такое

    192.168.110.6   00:17:a4:a4:9a:83       Global Data Services
    192.168.110.15  00:21:91:3a:dd:1f       (Unknown)
    192.168.110.16  30:46:9a:1e:b0:d0       (Unknown)
    192.168.110.71  00:16:76:03:a3:c4       Intel Corporation
    192.168.110.74  00:03:9d:75:a3:8a       BENQ CORPORATION
    192.168.110.75  00:19:d1:83:8d:a1       Intel Corporation
    192.168.110.77  00:1d:7d:00:8f:00       (Unknown)Code language: Bash (bash)