Openstack dashboard添加license控制功能

·
Tech openstack django March 21, 2018

openstack_dashboard/settings.py中MIDDLEWARE_CLASSES添加中间件horizon.middleware.LicenseMiddleware。
horizon/middleware/目录中添加license.py,用于检测license状态的中间件,将license状态写入session中。

class LicenseMiddleware(object):

    def process_request(self, request):
        response = check_license()
        request.session['license_info'] = response
        return

horizon/middleware/init.py中添加license中间件

from horizon.middleware import license
LicenseMiddleware = license.LicenseMiddleware

修改table_actions和row_actions的基类horizon.tables.actions.BaseAction添加判断license的方法,对license不敏感的直接返回True。

def _check_license(self, request):
    expire_sensitive_object = ['CreateVolume', 'DeleteVolume', 'StartInstance', 'LaunchLinkNG', 'DeleteInstance',
                               'LaunchImage', 'LaunchImageNG', 'CreateImage', 'CreateVolumeFromImage',
                               'ImportKeyPair', 'CreateKeyPair', 'CreateNetwork', 'CreateSubnet', 'CreateRouter',
                               'CreateGroup', 'CreateRule', 'AllocateIP', 'CreateAggregateAction',
                               'ManageVolumeAction', 'CreateVolumeType', 'CreateQosSpec', 'CreateFlavor',
                               'AdminCreateImage', 'AdminAllocateFloatingIP', 'UpdateDefaultQuotas',
                               'CreateProject', 'CreateUserLink', 'ModifyQuotas']
    if self.__class__.__name__ in expire_sensitive_object:
        self.has_valid_license = request.session.get('license_info')
    else:
        self.has_valid_license = True

在horizon.tables.actions.BaseAction的_allowed中添加_check_license的调用

def _allowed(self, request, datum):
    self._check_license(request)
    policy_check = utils_settings.import_setting("POLICY_CHECK_FUNCTION")

    if policy_check and self.policy_rules:
        target = self.get_policy_target(request, datum)
        return (policy_check(self.policy_rules, request, target) and
                self.allowed(request, datum))
    return self.allowed(request, datum)

在模板horizon/templates/horizon/common/_data_table_action.html添加license的控制

{% load horizon %}
{% load i18n %}
{% minifyspace %}
  {% if action.method != "GET" %}
    <button {{ action.attr_string_nc|safe }}
      {% if not action.has_valid_license %} disabled="disabled" {% endif %}
      class="data-table-action
        {% if is_small %}btn-sm{% endif %}
        {% for class in action.get_default_classes %}
          {{ class }}
        {% endfor %}
        {% if action.action_type %}
          btn-{{ action.action_type }}
        {% endif %} btn"
      name="action"
      {% if action.help_text %}
        help_text="{{ action.help_text }}"
      {% endif %}
      type="submit"
      {% if is_table_action %}
        value="{{ action.get_param_name }}">
        {% if action.icon != None %}
          <span class="fa fa-{{ action.icon }}"></span>
        {% endif %}
        {% if action.handles_multiple %}
            {% if not action.has_valid_license %}
                {{ action.verbose_name_plural }} ({% trans "License Expired" %})
            {% else %}
                {{ action.verbose_name_plural }}
            {% endif %}
        {% else %}
            {% if not action.has_valid_license %}
                {{ action.verbose_name }} ({% trans "License Expired" %})
            {% else %}
                {{ action.verbose_name }}
            {% endif %}
        {% endif %}
      {% else %}
        value="{{ action.table.name }}__{{ action.name }}__{{ row_id }}">
        {% if action.has_valid_license %}
            {{ action.verbose_name }}
        {% else %}
            {{ action.verbose_name }} ({% trans "License Expired" %})
        {% endif %}
      {% endif %}
    </button>
  {% else %}
    <a {{ action.attr_string_nc|safe }}
      class="btn data-table-action {% if is_single %}btn-default {% endif %}{% if is_small %}btn-sm {% endif %}{{ action.get_final_css|safe }}"
      {% if is_table_action %}
        {% if action.has_valid_license %}
          href="{{ action.get_link_url }}"
        {% else %}
          href="#"
          onclick="return false;"
          disabled="true"
          style="color:#ccc;"
        {% endif %}
        title="{{ action.verbose_name }}">
        {% if action.icon != None %}
          <span class="fa fa-{{ action.icon }}"></span>
        {% endif %}
      {% else %}
        {% if action.has_valid_license %}
          href="{{ action.bound_url }}"
        {% else %}
          href="#"
          onclick="return false;"
          disabled="true"
          style="color:#ccc;"
        {% endif %}>
      {% endif %}
      {% if action.has_valid_license %}
          {{ action.verbose_name }}
      {% else %}
          {{ action.verbose_name }} ({% trans "License Expired" %})
      {% endif %}
    </a>
  {% endif %}
{% endminifyspace %}

为了防止修改html元素进行使用,可以在api侧进行控制。
添加装饰器

def has_valid_license(func):
    def wrapper(*args, **kwargs):
        request = args[0]
        license_info = request.session.get('license_info')
        if license_info:
            return func(*args, **kwargs)
        else:
            class LicenseExpiredError(Exception):
                pass
            raise LicenseExpiredError(_('License Expired'))
    return wrapper

在openstack_dashboard.api.xxx xxx对openstack组件名,在需要license控制的方法前添加@has_valid_license装饰器即可。

  • iptables -m physdev
  • ansible-playbook api 调用

已有 4 条评论
  1. 人気スーパーコピーブランド時計激安通販専門店

    日本超人気のスーパーコピーブランド激安通販専門店

    ロレックス買取"弊社はロレックスの商品特に大人気のロレックスデイトナシリーズのロレックス時計の種類を豊富に取り揃えます。日本ロレックス時計とロレックスレプリカのロレックスコピー品の品質よくて、激安税込み価格でご提供します。 }}}}}}
    人気の売れ筋商品を多数取り揃えております。
    全て激安特価でご提供.お願いします.
    ★100%品質保証!満足保障!リピーター率100%!
    ★商品数も大幅に増え、品質も大自信です。
    ★スタイルが多い、品質がよい、価格が低い!
    ★顧客は至上 誠実 信用。
    ★歓迎光臨
    ★送料無料(日本全国)
    https://www.buykopi78.com/product/ProductShow-1851.html

    人気スーパーコピーブランド時計激安通販専門店 July 8th, 2020 at 07:59 am回复
  2. ForexPrunda

    比特币价格分析. https://cn.forex-is.com

    ForexPrunda December 16th, 2020 at 02:05 pm回复
  3. Shawnbrawl

    Detail: http://zrenieblog.ru/ http://zrenieblog.ru/ http://zrenieblog.ru/
    歷史
    六七千年前的先民就開始釣魚。周文王曾和兒子們在靈沼釣魚取樂。戰國時范蠡也愛釣魚,常把所釣之魚供給越王勾踐食用。 二十世紀八十年代,中國大陸的各級釣魚協會成立,釣魚地點也從自然水域向養殖水域過度,所釣之魚則從粗養向細養過度。人數增多、水體污染及濫捕濫撈導致釣魚難度上升。釣魚協會開始與漁民和農民簽訂文件,使更多釣者能夠在養殖水域釣魚,達到了雙贏的目的。 二十世紀九十年代初,來自台灣的懸釣法走紅大陸,各地開始建造標準釣池。 二十世紀末,發達國家的釣者提倡回顧自然,引發新一輪野釣戰,而中國的釣者則更青睞精養魚池。]

    工具

    一种钓鱼竿机械部分示意图
    最基本的钓具包括:鱼竿、鱼线、鱼钩、沉坨(又名沉子)、浮标(又名鱼漂)、鱼饵。]:1其他辅助钓具包括:失手绳、钓箱、线轮、抄网、鱼篓、渔具盒、钓鱼服、钓鱼鞋等。]:1

    钓竿一般由玻璃纖維或碳纖維轻而有力的竿状物质製成,钓竿和鱼饵用丝线联接。一般的鱼饵可以是蚯蚓、米饭、蝦子、菜叶、苍蝇、蛆等,现代有专门制作好(多数由自己配置的半成品)的粉製鱼饵出售。鱼饵挂在鱼鉤上,不同的對象鱼有不同的釣組配置。在周围水面撒一些誘餌通常会有較好的集魚效果。

    钓具
    鱼竿
    主条目:鱼竿
    钓鱼的鱼竿按照材质包括:传统竹竿、玻璃纤维竿、碳素竿,按照钓法包括:手竿、矶竿、海竿(又名甩竿),按照所钓鱼类包括:溪流小继竿、日鲫竿(又名河内竿)、鲤竿、矶中小物竿。]:6-8

    鱼钩
    主条目:鱼钩
    鱼钩就是垂钓用的钩,主要分为:有倒钩、无倒钩、毛钩。]:14

    鱼线
    主条目:鱼线
    鱼线就是垂钓时绑接鱼竿和鱼钩的线,历史上曾使用蚕丝(远古日本)、发丝(江户时期日本)、马尾(西欧)、二枚贝(地中海)、蛛网丝(夏威夷)、琼麻(东南亚)、尼龙钓线(美国)。]:25

    鱼漂
    主条目:鱼漂
    鱼漂又名浮标,垂钓时栓在鱼线上的能漂浮的东西,主要用于搜集水底情报,查看鱼汛,观察鱼饵存留状态,以及水底水流起伏变化。]:36

    鱼饵
    主条目:鱼饵
    鱼饵分为诱饵和钓饵,是一种用来吸引鱼群和垂钓时使用的物品,钓饵分为荤饵、素饵、拟饵、拉饵。]:170

    沉子
    主条目:沉子
    沉子又名沉坨、铅锤,是一种调节鱼漂的工具。]:45

    卷线器
    主条目:卷线器
    卷线器主要安装在海竿和矶竿上的一种卷线的工具。]:63

    连结具
    主条目:连结具
    连结具是连结鱼线与钓竿、母线与子线的一种连结物,使用最广泛的是连结环。]:55

    识鱼
    鱼类的视力不如人类,距离、宽度均无法和人类的视力比较,鱼类对水色、绿色比较敏感,鱼类的嗅觉非常灵敏,鱼类的听觉也非常灵敏,钓鲤鱼时,不能在岸上大声谈笑、走动不停,鱼类的思考能力非常弱,鱼类应对周边环境随着气象、水温、水色、潮流、流速、水量的变化而变化,于是便出现了在同一个池塘、水库、湖泊,往日钓鱼收获大,今日少,上午收获大,下午少,晴天大,雨天少等情况。]:114-117淡水钓鱼,中国大陆经常垂钓的鱼类对象是本地鲫鱼、日本鲫、非洲鲫、鲤鱼、游鱼、罗非鱼、黄刺鱼(黄鸭叫)、黄尾、鳊鱼、青鱼、草鱼、鲢鱼、鳙鱼,台湾经常垂钓的鱼类对象是本地鲫鱼、日本鲫、吴郭鱼(罗非鱼)、溪哥仔和红猫(粗首马口鱲)、斗鱼、罗汉鱼、苦花、三角姑(河鮠)、竹蒿头(密鱼)。]:117

    影响鱼类的6大因素主要是:季节变更、气温高低、水的涨落、风的大小、水的清浊、天气阴晴

    Shawnbrawl December 20th, 2020 at 10:03 pm回复
  4. curtsyjp

    dvd 通販 新品 dvd 通販 安い dvd 通販サイト DVD買取 dvd 通販 激安 nhk dvd 購入 アニメ dvd 安く買う ドラマdvd 人気 dvd 海賊版

    curtsyjp January 15th, 2021 at 08:18 pm回复
取消回复

说点什么?

© 2021 Coo's Note. Using Typecho & Moricolor.