Python Tech

ajenti的安装及插件制作

ajenti是Web方式的服务器管理平台,包含一系列常用运维工具,例如文件操作、服务管理、流量/磁盘空间实时监控等。这些工具本身倒是没什么亮点,我自己都写过。使用ajenti主要因为它是Python写的,修改扩展非常简单,我给它加了几个插件,省掉许多以前需要ssh连服务器进行操作。其次是它的界面交互做得不错,非专业人员也能使用,如果以后有多人管理的需求也能用上。本文分享安装和插件制作的步骤。

Install

ajenti支持Ubuntu、Debian、REHL、CentOS、FreeBSD这5种Linux发行版,我是在两台Ubuntu和一台FreeBSD上安装的,流程都很简单,以Ubuntu为例:

$ wget http://repo.ajenti.org/debian/key
$ sudo add-key key # 如果提示找不到命令,请使用 sudo apt-key add key
$ sudo echo “deb http://repo.ajenti.org/ng/debian main main ubuntu” >> /etc/apt/sources.list
$ sudo apt-get update
$ sudo apt-get install ajenti
$ sudo service ajenti restart
Stopping Ajenti:
* not running
Starting Ajenti:
* started

用浏览器打开:https://127.0.0.1:8000 (证书根据需要设置)就能看到ajenti的界面了:

Plugin

例如这台服务器的8001/8002端口上都有站点,我希望打开ajenti时能看到这些站点是否正常,所以制作一个名为monitor的插件,返回这两个站点的状态码。

ajenti的插件目录是/var/lib/ajenti/plugins/,目录结构自然是跟Python其他包一样,需要包含__init__.py文件。插件主要逻辑一般是写在main.py里,用xml文件定义布局,静态文件放在content目录下,因此基本的插件目录结构如下:

monitor/
├── content/
├── layout/
│   ├── main.xml
│   └── widget.xml
├── __init__.py
├── widget.py
└── main.py

content文件本例中不会用到,只介绍其他文件。首先是__init__.py文件,主要用来申明插件的名称、图标、依赖等信息。


from ajenti.api import *
from ajenti.plugins import *

info = PluginInfo(
    title='Monitor',
    icon='desktop',
    dependencies=[
        PluginDependency('main'),
    ],
)

def init():
    import main
    import widget

然后是layout/main.xml文件,定义界面,包括Site1(8001端口的站点)/Site2(8002端口的站点)状态码如何显示。本例中,Site1是加载时直接显示,Site2是点击按钮后显示:


<body>
    <pad>
        <vc>
            <formline text="Site 1">
                <label id="site1"/>
            </formline>
            <formline text="Site 2">
                <label id="site2"/>
                <button icon="refresh" id="load" text="Load" />
            </formline>
        </vc>
    </pad>
</body>

最后是main.py文件,用Python自带的库请求Site1/Site2,返回状态码:


from ajenti.api import plugin
from ajenti.plugins.main.api import SectionPlugin
from ajenti.ui import on

import urllib2

@plugin
class Monitor (SectionPlugin):
    # 获取状态码
    @staticmethod
    def status_code(port):
        connection = urllib2.urlopen('http://127.0.0.1:%d' % port)
        status_code = connection.getcode()
        connection.close()
        return str(status_code)
    
    def init(self):
        # 以下定义会在左侧导航菜单显示
        self.title = 'Monitor'
        self.icon = 'desktop'
        self.category = 'Custom'

        self.append(self.ui.inflate('monitor:main'))

        # 加载时显示Site1的状态码
        self.find('site1').text = self.status_code(8001)

    # 点击load按钮时显示Site2的状态码
    @on('load', 'click')
    def on_load(self):
        self.find('site2').text = self.status_code(8002)

插件执行如下图:

Widget

Dashboard里可以添加插件附带的Widget(点击右上方的“添加小部件”按钮弹出列表),把一些常用操作/信息放在Dashboard,省掉了点导航菜单的操作。上面的代码在__init__.py文件里import了widget,也创建了widget.xmlwidget.py文件,用来实现一个很简单的Widget,以下是代码:


<hc>
    <box width="20">
        <icon id="icon" icon="monitor" />
    </box>
    <box width="100">
        <label style="bold" id="site1"/>
    </box>
</hc>

from ajenti.api import plugin
from ajenti.plugins.dashboard.api import ConfigurableWidget

import main

@plugin
class MonitorWidget (ConfigurableWidget):
    name = 'Monitor'
    icon = 'desktop'

    def on_prepare(self):
        self.append(self.ui.inflate('monitor:widget'))

    def on_start(self):
        status_code = main.Monitor.status_code(8001)
        self.find('site1').text = 'Site on port 8001 return %s' % status_code

Afterword

ajenti在github的repo地址是:https://github.com/Eugeny/ajenti ,开发插件时主要是参考源码。

相比同类产品来说,ajenti很突出:界面交互上比webmin好太多,免费开源,又把Cpanel和DA比下去了。没找到它具体的授权协议,但对于个人用户是“Completely free”,目前是可以放心使用的。硬件提供商需要申请“Special licensing conditions apply”,想省钱就请期待山寨产品出现吧。

0 0 投票数
文章评分
订阅评论
提醒
guest

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

7 评论
最新
最旧 最多投票
内联反馈
查看所有评论
腾袭
腾袭
10 年 前

我一直在想我的服务器内存太小了,想跑好多东西都很无奈……不知有什么好办法

腾袭
腾袭
10 年 前
回复给  Perchouli

vps不好加内存啊,毕竟不是实体的服务器……当初改内核就是加上了防火墙…………感觉除了换vps没有啥好方法了……

腾袭
腾袭
10 年 前
回复给  Perchouli

现在的和这个差不多…2G的24刀每月

腾袭
腾袭
10 年 前
回复给  Perchouli

是个好主意啊