From 62509da8abfb655d0b1c718c6dd64806eaaa9a16 Mon Sep 17 00:00:00 2001 From: jysperm Date: Wed, 19 Nov 2014 03:55:34 +0800 Subject: [PATCH] reconfigure for supervisor, shadowsocks --- plugin/linux/reconfigure.coffee | 10 +--- plugin/shadowsocks/reconfigure.coffee | 81 ++++++++++++++++++++++++++- plugin/shadowsocks/shadowsocks.coffee | 33 ++++++----- plugin/supervisor/reconfigure.coffee | 49 +++++++++++++++- 4 files changed, 150 insertions(+), 23 deletions(-) diff --git a/plugin/linux/reconfigure.coffee b/plugin/linux/reconfigure.coffee index e39ac21..207ec1a 100644 --- a/plugin/linux/reconfigure.coffee +++ b/plugin/linux/reconfigure.coffee @@ -1,5 +1,6 @@ {async, fs, child_process, _} = app.libs {Account} = app.models +{utils} = app linux = require './linux' @@ -32,14 +33,9 @@ module.exports = (callback) -> return callback console.log "removed /home/#{user}" + backup_filename = "#{__dirname}/../.backup/linux/#{user}-#{utils.randomString(5)}" + child_process.exec "sudo mv /home/#{user} #{backup_filename}", callback - async.series [ - (callback) -> - child_process.exec "sudo mv /home/#{user} #{__dirname}/../.backup/linux/#{user}-#{utils.randomString(5)}", callback - - (callback) -> - child_process.exec "sudo rm -r #{user}", callback - ], callback , callback ], (err) -> diff --git a/plugin/shadowsocks/reconfigure.coffee b/plugin/shadowsocks/reconfigure.coffee index e24ac89..0faa225 100644 --- a/plugin/shadowsocks/reconfigure.coffee +++ b/plugin/shadowsocks/reconfigure.coffee @@ -1,2 +1,81 @@ +{async, _, child_process} = app.libs +{Account} = app.models +{config, utils} = app + +shadowsocks = require './shadowsocks' + module.exports = (callback) -> - callback() + async.series [ + (callback) -> + async.each config.plugins.shadowsocks.available_ciphers, (method, callback) -> + shadowsocks.writeSupervisorConfigure method, callback + , callback + + (callback) -> + default_method = _.first config.plugins.shadowsocks.available_ciphers + + Account.find + 'billing.service': 'shadowsocks' + , (err, accounts) -> + async.eachSeries accounts, (account, callback) -> + {port, method, password} = account.pluggable.shadowsocks + + unless method + console.log "created shadowsocks method for #{account.username}}" + account.pluggable.shadowsocks.method = default_method + account.markModified 'pluggable.shadowsocks.method' + + unless password + console.log "created shadowsocks password for #{account.username}}" + account.pluggable.shadowsocks.password = utils.randomString 10 + account.markModified 'pluggable.shadowsocks.password' + + if port + account.save callback + else + shadowsocks.generatePort (port) -> + console.log "created shadowsocks port for #{account.username}}" + account.pluggable.shadowsocks.port = port + account.markModified 'pluggable.shadowsocks.port' + account.save callback + + , callback + + (callback) -> + shadowsocks.queryIptablesInfo (iptables_info) -> + Account.find + 'billing.service': 'shadowsocks' + , (err, accounts) -> + async.series [ + (callback) -> + async.eachSeries accounts, (account, callback) -> + port = iptables_info[account.pluggable.shadowsocks.port] + + if port + callback() + else + child_process.exec "sudo iptables -I OUTPUT -p tcp --sport #{port}", callback + , callback + + (callback) -> + async.eachSeries _.keys(iptables_info), (port) -> + matched_account = _.find accounts, (account) -> + return account.pluggable.shadowsocks.port == port + + if matched_account + callback() + else + child_process.exec "sudo iptables -D OUTPUT #{iptables_info[port].num}", callback + , callback + + ], callback + + (callback) -> + child_process.exec 'sudo iptables-save | sudo tee /etc/iptables.rules', callback + + (callback) -> + shadowsocks.updateConfigure callback + + ], (err) -> + throw err if err + callback() diff --git a/plugin/shadowsocks/shadowsocks.coffee b/plugin/shadowsocks/shadowsocks.coffee index ece411c..7072dca 100644 --- a/plugin/shadowsocks/shadowsocks.coffee +++ b/plugin/shadowsocks/shadowsocks.coffee @@ -16,22 +16,27 @@ exports.initSupervisor = (callback) -> if program_name in _.pluck program_status, 'name' return callback() - configure = exports.generateConfigure [], - method: method + exports.writeSupervisorConfigure method, -> + supervisor.updateProgram {}, {program_name: program_name}, -> + callback() - filename = "/etc/shadowsocks/#{method}.json" - ShadowsocksPlugin.writeConfigFile filename, configure, {mode: 0o755}, -> - supervisor.writeConfig {username: 'nobody'}, - program_name: program_name - command: "ssserver -c #{filename}" - name: program_name - autostart: true - autorestart: true - stdout_logfile: false - , -> - supervisor.updateProgram {}, {program_name: program_name}, -> - callback() + , callback +exports.writeSupervisorConfigure = (method, callback) -> + program_name = "shadowsocks-#{method}" + + configure = exports.generateConfigure [], + method: method + + filename = "/etc/shadowsocks/#{method}.json" + ShadowsocksPlugin.writeConfigFile filename, configure, {mode: 0o755}, -> + supervisor.writeConfig {username: 'nobody'}, + program_name: program_name + command: "ssserver -c #{filename}" + name: program_name + autostart: true + autorestart: true + stdout_logfile: false , -> callback() diff --git a/plugin/supervisor/reconfigure.coffee b/plugin/supervisor/reconfigure.coffee index e24ac89..cced3a4 100644 --- a/plugin/supervisor/reconfigure.coffee +++ b/plugin/supervisor/reconfigure.coffee @@ -1,2 +1,49 @@ +{async, fs, _, child_process} = app.libs +{Account} = app.models +{utils} = app + +supervisor = require './supervisor' + +fs.mkdirSync "#{__dirname}/../.backup/supervisor", 0o750 + module.exports = (callback) -> - callback() + async.series [ + (callback) -> + Account.find + 'billing.service': 'supervisor' + 'pluggable.supervisor.programs.0': + $exists: true + , (err, accounts) -> + async.eachSeries accounts, (account, callback) -> + async.eachSeries account.pluggable.supervisor.programs, (program, callback) -> + supervisor.writeConfig account, program, callback + , callback + , callback + + (callback) -> + exists_configures = _.filter fs.readdirSync('/etc/supervisor/conf.d'), (file) -> + return file[ ... 1] == '@' + + async.eachSeries exists_configures, (filename, callback) -> + [__, username, name] = filename.match /@([^-]+)-(.*)/ + + Account.findOne + 'username': username + 'billing.service': 'supervisor' + 'pluggable.supervisor.programs.name': name + , (err, account) -> + if account + return callback() + else + console.log "removed /etc/supervisor/conf.d/#{filename}" + backup_filename = "#{__dirname}/../.backup/supervisor/#{filename}-#{utils.randomString(5)}" + child_process.exec "sudo mv /etc/supervisor/conf.d/#{filename} #{backup_filename}", callback + + , callback + + (callback) -> + child_process.exec 'sudo service supervisor restart', callback + + ], (err) -> + throw err if err + callback()