From 50422e07390f7b926b076c44e8bdf2ada7f28a20 Mon Sep 17 00:00:00 2001 From: nishiki Date: Thu, 12 May 2016 22:47:02 +0200 Subject: [PATCH] rewrite sync --- lib/mpw/mpw.rb | 95 ++++++++++++++++++++++++++++++++ lib/mpw/sync.rb | 135 ---------------------------------------------- lib/mpw/ui/cli.rb | 1 + 3 files changed, 96 insertions(+), 135 deletions(-) delete mode 100644 lib/mpw/sync.rb diff --git a/lib/mpw/mpw.rb b/lib/mpw/mpw.rb index 9ae896e..e488805 100644 --- a/lib/mpw/mpw.rb +++ b/lib/mpw/mpw.rb @@ -298,6 +298,101 @@ class MPW return 0 end + # Sync data with remote file + def sync + return if @config['sync'].nil? + + tmp_file = "#{@wallet_file}.sync" + last_sync = @config['last_sync'].to_i + + case @config['sync']['type'] + when 'sftp', 'scp', 'ssh' + require "#{APP_ROOT}/../lib/mpw/sync/ssh.rb" + sync = SyncSSH.new(@config['sync']) + when 'ftp' + require 'mpw/sync/ftp' + sync = SyncFTP.new(@config['sync']) + else + raise I18n.t('error.unknown_type') + end + + sync.connect + sync.get(tmp_file) + + remote = MPW.new(@key, @wallet_file, @gpg_pass) + remote.read_data + + File.unlink(tmp_file) if File.exist?(tmp_file) + + if not remote.to_s.empty? + @data.each do |item| + update = false + + remote.list.each do |r| + next if item.id != r.id + + # Update item + if item.last_edit < r.last_edit + item.update(name: r.name, + group: r.group, + host: r.host, + protocol: r.protocol, + user: r.user, + port: r.port, + comment: r.comment + ) + set_password(item.id, r.get_password(item.id)) + end + + r.delete + update = true + + break + end + + # Remove an old item + if not update and item.last_sync.to_i < last_sync and item.last_edit < last_sync + item.delete + end + end + end + + # Add item + remote.list.each do |r| + next if r.last_edit <= last_sync + + item = Item.new(id: r.id, + name: r.name, + group: r.group, + host: r.host, + protocol: r.protocol, + user: r.user, + port: r.port, + comment: r.comment, + created: r.created, + last_edit: r.last_edit + ) + + set_password(item.id, r.get_password(item.id)) + add(item) + end + + remote = nil + + @data.each do |item| + item.set_last_sync + end + + @config['sync']['last_sync'] = Time.now.to_i + + write_data + sync.update(@wallet_file) + rescue Exception => e + File.unlink(tmp_file) if File.exist?(tmp_file) + + raise "#{I18n.t('error.sync.unknown')}\n#{e}" + end + # Generate a random password # @args: length -> the length password # @rtrn: a random string diff --git a/lib/mpw/sync.rb b/lib/mpw/sync.rb deleted file mode 100644 index f271d79..0000000 --- a/lib/mpw/sync.rb +++ /dev/null @@ -1,135 +0,0 @@ -#!/usr/bin/ruby -# author: nishiki -# mail: nishiki@yaegashi.fr -# info: a simple script who manage your passwords - -require 'rubygems' -require 'i18n' -require 'yaml' -require 'tempfile' -require 'mpw/mpw' -require 'mpw/item' - -module MPW - class Sync - - attr_accessor :error_msg - - # Constructor - # raise an exception if there is a bad parameter - def initialize(config, local, password=nil) - @error_msg = nil - @config = config - @local = local - @password = password - - raise I18n.t('error.class') if not @local.instance_of?(MPW) - end - - # Get the data on remote host - # @rtrn: true if get the date, else false - def get_remote - case @config.sync_type - when 'sftp', 'scp', 'ssh' - require 'mpw/sync/ssh' - @sync = SyncSSH.new(@config.sync_host, @config.sync_user, @config.sync_pwd, @config.sync_path, @config.sync_port) - when 'ftp' - require 'mpw/sync/ftp' - @sync = SyncFTP.new(@config.sync_host, @config.sync_user, @config.sync_pwd, @config.sync_path, @config.sync_port) - else - @error_msg = I18n.t('error.unknown_type') - return false - end - - if not @sync.connect - @error_msg = @sync.error_msg - return false - end - - - file_tmp = Tempfile.new('mpw-') - raise @sync.error_msg if not @sync.get(file_tmp.path) - - @remote = MPW.new(file_tmp.path, @config.key) - raise @remote.error_msg if not @remote.decrypt(@password) - - file_tmp.close(true) - return true - rescue Exception => e - @error_msg = "#{I18n.t('error.sync.download')} #{e}" - file_tmp.close(true) - return false - end - - # Sync remote data and local data - # raise an exception if there is a problem - def sync - - if not @remote.to_s.empty? - @local.list.each do |item| - update = false - @remote.list.each do |r| - - # Update item - if item.id == r.id - if item.last_edit < r.last_edit - raise item.error_msg if not item.update(name: r.name, - group: r.group, - host: r.host, - protocol: r.protocol, - user: r.user, - password: r.password, - port: r.port, - comment: r.comment - ) - end - - r.delete - update = true - - break - end - end - - # Remove an old item - if not update and item.last_sync.to_i < @config.last_sync and item.last_edit < @config.last_sync - item.delete - end - end - end - - # Add item - @remote.list.each do |r| - if r.last_edit > @config.last_sync - item = Item.new(id: r.id, - name: r.name, - group: r.group, - host: r.host, - protocol: r.protocol, - user: r.user, - password: r.password, - port: r.port, - comment: r.comment, - created: r.created, - last_edit: r.last_edit - ) - raise @local.error_msg if not @local.add(item) - end - end - - @local.list.each do |item| - item.set_last_sync - end - - raise @mpw.error_msg if not @local.encrypt - raise @sync.error_msg if not @sync.update(@config.file_gpg) - - @config.set_last_sync - - return true - rescue Exception => e - @error_msg = "#{I18n.t('error.sync.unknown')} #{e}" - return false - end - end -end diff --git a/lib/mpw/ui/cli.rb b/lib/mpw/ui/cli.rb index ec99a7c..59da85b 100644 --- a/lib/mpw/ui/cli.rb +++ b/lib/mpw/ui/cli.rb @@ -113,6 +113,7 @@ class Cli end @mpw.read_data + @mpw.sync rescue Exception => e puts "#{I18n.t('display.error')} #11: #{e}".red exit 2