From 96be0a1aa51bc504ea35db80895d1a908b660569 Mon Sep 17 00:00:00 2001 From: jysperm Date: Thu, 24 Jul 2014 04:43:46 +0800 Subject: [PATCH] finish mongodb plugin --- INSTALL.md | 4 +- README.md | 4 +- core/plugin.coffee | 2 + core/static/script/panel/panel.coffee | 21 ++++++++++ core/view/panel.jade | 2 +- plugin/mongodb/action.coffee | 60 +++++++++++++++++++++++++++ plugin/mongodb/index.coffee | 2 + plugin/mongodb/service.coffee | 50 ++++++++++++++++------ plugin/mongodb/view/widget.jade | 11 ++--- plugin/mysql/action.coffee | 2 +- 10 files changed, 136 insertions(+), 22 deletions(-) diff --git a/INSTALL.md b/INSTALL.md index c196a72..949970f 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -16,7 +16,9 @@ mongo use admin - db.addUser({user: 'rpadmin', pwd: 'password', roles: ['readWriteAnyDatabase', 'userAdminAnyDatabase', 'dbAdminAnyDatabase']}) + db.addUser({user: 'rpadmin', pwd: 'password', roles: ['userAdminAnyDatabase', 'dbAdminAnyDatabase']}) + use RootPanel + db.addUser({user: 'rpadmin', pwd: 'password', roles: ['readWrite']}) vi /etc/mongodb.conf diff --git a/README.md b/README.md index 3818d87..2f0d28f 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ RP3 的核心功能包括: ## 技术构成 -* 前端:Bootstrap3, jQuery, Jade, Less +* 前端:Bootstrap(3), jQuery, Jade, Less * 后端:Express, Coffee -* 数据库:MongoDB, redis +* 数据库:MongoDB(2.4), Redis * 操作系统支持:Ubuntu 14.04 diff --git a/core/plugin.coffee b/core/plugin.coffee index 0c01eb5..7c11367 100644 --- a/core/plugin.coffee +++ b/core/plugin.coffee @@ -7,6 +7,8 @@ i18n = require './i18n' config = require './../config' {requestAuthenticate} = require './router/middleware' +app.plugins = {} + exports.get = (name) -> return require path.join(__dirname, "../plugin/#{name}") diff --git a/core/static/script/panel/panel.coffee b/core/static/script/panel/panel.coffee index f17a0be..1a0ffde 100644 --- a/core/static/script/panel/panel.coffee +++ b/core/static/script/panel/panel.coffee @@ -12,6 +12,27 @@ $ -> .success -> location.reload() + $('#widget-mongodb button.create-database').click -> + $.post '/plugin/mongodb/create_database', JSON.stringify + name: $(@).parents('.input-group').find('input').val() + .success -> + location.reload() + + $('#widget-mongodb button.delete-database').click -> + if window.confirm 'Are you sure?' + $.post '/plugin/mongodb/delete_database', JSON.stringify + name: $(@).parents('tr').data 'name' + .success -> + location.reload() + + $('#widget-mongodb button.update-password').click -> + $.post '/plugin/mongodb/update_password', JSON.stringify + password: $(@).parents('.input-group').find('input').val() + .success -> + location.reload() + + # refactored above + service = $ '#service' service.find 'button' .on 'click', (e) -> diff --git a/core/view/panel.jade b/core/view/panel.jade index d0222aa..d11b65c 100644 --- a/core/view/panel.jade +++ b/core/view/panel.jade @@ -58,7 +58,7 @@ block content button(data-name= name).btn.btn-success 开启 #{t('plugins.' + name + '.name')} for widget in widgets - .row + .row(id='widget-#{widget.plugin.name}') != widget.html append footer diff --git a/plugin/mongodb/action.coffee b/plugin/mongodb/action.coffee index 92d5db3..3a3b014 100644 --- a/plugin/mongodb/action.coffee +++ b/plugin/mongodb/action.coffee @@ -1,5 +1,65 @@ +crypto = require 'crypto' + {assertInService} = require '../../core/router/middleware' +mongodb = app.plugins.mongodb + +mAccount = require '../../core/model/account' + module.exports = exports = express.Router() exports.use assertInService 'mongodb' + +exports.post '/update_password', (req, res) -> + unless req.body.password or /^[A-Za-z0-9\-_]+$/.test req.body.password + return res.error 'invalid_password' + + md5 = crypto.createHash 'md5' + md5.update "#{req.account.username}:mongo:#{req.body.password}" + pwd = md5.digest 'hex' + + mongodb.admin_users.update user: req.account.username, + $set: + pwd: pwd + , (err, result) -> + mongodb.admin.listDatabases (err, result) -> + dbs = _.filter result.databases, (i) -> + return i.name[..req.account.username.length] == "#{req.account.username}_" + + async.each dbs, (db, callback) -> + db_users = app.db.db(db.name).collection 'system.users' + db_users.update user: req.account.username, + $set: + pwd: pwd + , -> + callback() + , -> + res.json {} + +exports.post '/create_database', (req, res) -> + unless req.body.name[..req.account.username.length] == "#{req.account.username}_" + return res.error 'invalid_name' + + unless /^[A-Za-z0-9_]+$/.test req.body.name + return res.error 'invalid_name' + + mongodb.admin_users.findOne + user: req.account.username + , (err, result) -> + db_users = app.db.db(req.body.name).collection 'system.users' + db_users.insert + user: req.account.username + pwd: result.pwd + roles: ['readWrite', 'dbAdmin'] + , (err) -> + res.json {} + +exports.post '/delete_database', (req, res) -> + unless req.body.name[..req.account.username.length] == "#{req.account.username}_" + return res.error 'invalid_name' + + unless /^[A-Za-z0-9_]+$/.test req.body.name + return res.error 'invalid_name' + + app.db.db(req.body.name).dropDatabase -> + res.json {} diff --git a/plugin/mongodb/index.coffee b/plugin/mongodb/index.coffee index 4aaf55b..3e62825 100644 --- a/plugin/mongodb/index.coffee +++ b/plugin/mongodb/index.coffee @@ -1,3 +1,5 @@ +app.plugins.mongodb = {} + action = require './action' service = require './service' diff --git a/plugin/mongodb/service.coffee b/plugin/mongodb/service.coffee index b4a2b50..6a1fb7e 100644 --- a/plugin/mongodb/service.coffee +++ b/plugin/mongodb/service.coffee @@ -1,30 +1,56 @@ jade = require 'jade' path = require 'path' async = require 'async' +crypto = require 'crypto' config = require '../../config' mAccount = require '../../core/model/account' +mongodb = app.plugins.mongodb + +mongodb.admin = app.db.admin() +mongodb.admin.authenticate config.mongodb.user, config.mongodb.password, -> + mongodb.admin_users = app.db.db('admin').collection 'system.users' + module.exports = enable: (account, callback) -> - callback() + md5 = crypto.createHash 'md5' + md5.update "#{account.username}:mongo:#{mAccount.randomSalt()}" + pwd = md5.digest 'hex' + + mongodb.admin_users.insert + user: account.username + pwd: pwd + roles: [] + , (err, result) -> + console.log err, result + callback() delete: (account, callback) -> - callback() + mongodb.admin_users.remove + user: account.username + , (err) -> + mongodb.admin.listDatabases (err, result) -> + dbs = _.filter result.databases, (i) -> + return i.name[..account.username.length] == "#{account.username}_" + + async.each dbs, (db, callback) -> + app.db.db(db.name).dropDatabase -> + callback() + , -> + callback() widget: (account, callback) -> - admin = app.db.admin() - admin.authenticate config.mongodb.user, config.mongodb.password, -> - admin.listDatabases (err, result) -> - dbs = _.filter result.databases, (i) -> - return i.name.slice(0, account.username.length + 1) == "#{account.username}_" + mongodb.admin.listDatabases (err, result) -> + dbs = _.filter result.databases, (i) -> + return i.name[..account.username.length] == "#{account.username}_" - jade.renderFile path.join(__dirname, 'view/widget.jade'), - account: account - dbs: dbs - , (err, html) -> - callback html + jade.renderFile path.join(__dirname, 'view/widget.jade'), + account: account + dbs: dbs + , (err, html) -> + callback html preview: (callback) -> jade.renderFile path.join(__dirname, 'view/preview.jade'), {}, (err, html) -> diff --git a/plugin/mongodb/view/widget.jade b/plugin/mongodb/view/widget.jade index 3af9ee2..75b5e75 100644 --- a/plugin/mongodb/view/widget.jade +++ b/plugin/mongodb/view/widget.jade @@ -4,18 +4,19 @@ header MongoDB .panel-heading h3.panel-title 新建数据库 .panel-body - .input-group#mongodb-create + .input-group input.form-control(value='#{account.username}_') span.input-group-btn - button.btn.btn-default(type='button') 提交 + button.create-database.btn.btn-default(type='button') 提交 .panel.panel-warning .panel-heading h3.panel-title 设置 MongoDB 密码 .panel-body - .input-group#mongodb-input + .input-group input.form-control(type='password') span.input-group-btn - button.btn.btn-default(type='button') 提交 + button.update-password.btn.btn-default(type='button') 提交 + .col-md-6 table(style= 'table-layout: fixed;').table.table-hover thead @@ -29,5 +30,5 @@ header MongoDB td(style= 'white-space: nowrap; overflow: hidden;', title= db.name)= db.name td #{(db.sizeOnDisk / 1024 / 1024).toFixed(1)}M td - button.nginx-remove-btn.btn.btn-danger.btn-xs + button.delete-database.btn.btn-danger.btn-xs span.glyphicon.glyphicon-remove-sign diff --git a/plugin/mysql/action.coffee b/plugin/mysql/action.coffee index ba95b44..a8c6309 100644 --- a/plugin/mysql/action.coffee +++ b/plugin/mysql/action.coffee @@ -10,7 +10,7 @@ module.exports = exports = express.Router() exports.use assertInService 'mysql' -exports.post '/update_password/', (req, res) -> +exports.post '/update_password', (req, res) -> unless req.body.password or /^[A-Za-z0-9\-_]+$/.test req.body.password return res.error 'invalid_password'