winprofile 0.0.2 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.rdoc +3 -1
- data/VERSION +1 -1
- data/bin/redirect_folders.rb +4 -3
- data/lib/winprofile.rb +53 -2
- data/lib/winreg.rb +39 -3
- data/test/test_winprofile.rb +46 -4
- data/test/test_winreg.rb +24 -0
- metadata +3 -3
data/README.rdoc
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.3
|
data/bin/redirect_folders.rb
CHANGED
@@ -30,11 +30,12 @@ def redirect
|
|
30
30
|
p.verbose=@verbose
|
31
31
|
|
32
32
|
puts "Redirecting Desktop"
|
33
|
-
p.
|
33
|
+
p.change_folder('Desktop','U:\\.windows_settings')
|
34
34
|
puts "Redirecting AppData"
|
35
|
-
p.
|
35
|
+
p.change_folder('AppData','U:\\.windows_settings')
|
36
36
|
puts "Redirecting Personal"
|
37
|
-
p.
|
37
|
+
p.change_folder('Personal','U:')
|
38
|
+
p.commit
|
38
39
|
end
|
39
40
|
|
40
41
|
def move
|
data/lib/winprofile.rb
CHANGED
@@ -12,6 +12,9 @@ class WinProfile
|
|
12
12
|
# Base regkey for folder redirection
|
13
13
|
FOLDERS_BASE='Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders'
|
14
14
|
|
15
|
+
# Default base for profile folders (its a Windows default)
|
16
|
+
PROFILE_BASE='%USERPROFILE%'
|
17
|
+
|
15
18
|
# List of user folder redirection regkeys
|
16
19
|
FOLDER_DEFAULTS=[
|
17
20
|
{:name => "AppData", :dir => 'Datos de programa' },
|
@@ -38,7 +41,7 @@ class WinProfile
|
|
38
41
|
# Defaults
|
39
42
|
@profiles = profiles
|
40
43
|
@homes = homes
|
41
|
-
@folders =
|
44
|
+
@folders = Array.new()
|
42
45
|
|
43
46
|
# If user=nil don't check existence, late initialization
|
44
47
|
if user != nil
|
@@ -56,6 +59,42 @@ class WinProfile
|
|
56
59
|
raise "Invalid profile: #{@file}" unless File.exists? @file
|
57
60
|
end
|
58
61
|
|
62
|
+
# Stage a folder to be changed to the given base. The changes will be written on commit method
|
63
|
+
def change_folder(folder=nil, base=nil, dir=nil)
|
64
|
+
|
65
|
+
# Set defaults if parameters not given
|
66
|
+
base=PROFILE_BASE unless base
|
67
|
+
|
68
|
+
FOLDER_DEFAULTS.each do |key|
|
69
|
+
if key[:name] == folder
|
70
|
+
puts "Found key: #{key[:name]}" if @debug
|
71
|
+
# Ok key found
|
72
|
+
dir=key[:dir] unless dir
|
73
|
+
# Add it to stage
|
74
|
+
@folders.push({ :name => folder, :value => base+'\\'+dir })
|
75
|
+
end
|
76
|
+
end
|
77
|
+
@folders
|
78
|
+
end
|
79
|
+
|
80
|
+
# Show if a folder is staged for change. Returns the staged value
|
81
|
+
def show_changed_folder(folder)
|
82
|
+
@location=nil
|
83
|
+
|
84
|
+
@folders.each do |key|
|
85
|
+
if key[:name] == folder
|
86
|
+
@location = key[:value]
|
87
|
+
puts "#{key[:name]} -> #{@location}" if @verbose
|
88
|
+
end
|
89
|
+
end
|
90
|
+
@location
|
91
|
+
end
|
92
|
+
|
93
|
+
# Show all folders staged for change. Returns @folders
|
94
|
+
def show_changed_folders
|
95
|
+
@folders
|
96
|
+
end
|
97
|
+
|
59
98
|
# Show folder redirection status for a given folder
|
60
99
|
def show_folder(folder)
|
61
100
|
@location=nil
|
@@ -138,8 +177,20 @@ class WinProfile
|
|
138
177
|
w=WinReg.new(@file)
|
139
178
|
w.debug=@debug
|
140
179
|
FOLDER_DEFAULTS.each do |key|
|
141
|
-
w.write_key(FOLDERS_BASE+'\\'+key[:name],'
|
180
|
+
w.write_key(FOLDERS_BASE+'\\'+key[:name],PROFILE_BASE+'\\'+key[:dir])
|
181
|
+
end
|
182
|
+
end
|
183
|
+
|
184
|
+
# Commit (write) changes to hive file.
|
185
|
+
# NOTE: You should ALWAYS commit, or you will lose the changes
|
186
|
+
def commit
|
187
|
+
# Compose changes array
|
188
|
+
@changes=Array.new
|
189
|
+
@folders.each do |key|
|
190
|
+
@changes.push({ :name => FOLDERS_BASE+'\\'+key[:name], :value => key[:value] })
|
142
191
|
end
|
192
|
+
w=WinReg.new(@file,@debug)
|
193
|
+
w.write_keys(@changes)
|
143
194
|
end
|
144
195
|
|
145
196
|
end
|
data/lib/winreg.rb
CHANGED
@@ -7,16 +7,17 @@ $expect_verbose = false
|
|
7
7
|
class WinReg
|
8
8
|
attr_accessor :file, :debug, :verbose
|
9
9
|
|
10
|
-
def initialize(file)
|
10
|
+
def initialize(file,debug=false)
|
11
11
|
@file = file
|
12
|
+
@debug = debug
|
12
13
|
# Check that file exists
|
13
14
|
if not File.exists? @file
|
14
|
-
|
15
|
-
return nil
|
15
|
+
raise "ERROR: File #{@file} does not exist"
|
16
16
|
end
|
17
17
|
# FIXME: Check that we have the chntpw command
|
18
18
|
end
|
19
19
|
|
20
|
+
# Read a key from hive
|
20
21
|
def read_key(key)
|
21
22
|
@value = nil
|
22
23
|
|
@@ -49,6 +50,7 @@ class WinReg
|
|
49
50
|
return @value
|
50
51
|
end
|
51
52
|
|
53
|
+
# Write a key, value pair to hive
|
52
54
|
def write_key(key,value)
|
53
55
|
|
54
56
|
PTY.spawn("chntpw -e #{@file}") do |read,write,pid|
|
@@ -79,5 +81,39 @@ class WinReg
|
|
79
81
|
end
|
80
82
|
end
|
81
83
|
|
84
|
+
# Write an array of key,value pairs to hive
|
85
|
+
def write_keys(pairs)
|
86
|
+
|
87
|
+
PTY.spawn("chntpw -e #{@file}") do |read,write,pid|
|
88
|
+
$expect_verbose = @debug
|
89
|
+
write.sync = true
|
90
|
+
|
91
|
+
pairs.each do |key|
|
92
|
+
# If 30 seconds pass and the expected text is not found, the
|
93
|
+
# response object will be nil.
|
94
|
+
read.expect(/^>/, 5) do |response|
|
95
|
+
raise unless response
|
96
|
+
write.print "ed " + key[:name] + "\n" if response
|
97
|
+
end
|
98
|
+
|
99
|
+
read.expect(/^->/, 5) do |response|
|
100
|
+
raise unless response
|
101
|
+
write.print key[:value] + "\n" if response
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
read.expect(/^>/, 5) do |response|
|
106
|
+
raise unless response
|
107
|
+
write.print "q" + "\n" if response
|
108
|
+
end
|
109
|
+
|
110
|
+
read.expect(/^Write hive files?/, 5) do |response|
|
111
|
+
raise unless response
|
112
|
+
write.print "y" + "\n" if response
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
|
82
118
|
end
|
83
119
|
|
data/test/test_winprofile.rb
CHANGED
@@ -37,13 +37,13 @@ class TestWinProfile < Test::Unit::TestCase
|
|
37
37
|
context "a WinProfile instance" do
|
38
38
|
|
39
39
|
setup do
|
40
|
-
File.copy "test/sample_profile/NTUSER.DAT","test/NTUSER.DAT"
|
41
|
-
@winprofile=WinProfile.new("
|
40
|
+
File.copy "test/sample_profile/NTUSER.DAT","test/tmp/NTUSER.DAT"
|
41
|
+
@winprofile=WinProfile.new("tmp","test")
|
42
42
|
@winprofile.verbose=false
|
43
43
|
end
|
44
44
|
|
45
|
-
should "initialize folders
|
46
|
-
assert_same_elements
|
45
|
+
should "initialize folders as empty array" do
|
46
|
+
assert_same_elements [],@winprofile.folders
|
47
47
|
end
|
48
48
|
|
49
49
|
context "when asked for the 'Personal' folder key" do
|
@@ -89,6 +89,48 @@ class TestWinProfile < Test::Unit::TestCase
|
|
89
89
|
#end
|
90
90
|
#end
|
91
91
|
|
92
|
+
context 'when staging multiple key changes' do
|
93
|
+
setup do
|
94
|
+
File.copy "test/sample_profile/NTUSER.DAT","test/tmp/NTUSER.DAT"
|
95
|
+
@winprofile=WinProfile.new("tmp","test")
|
96
|
+
end
|
97
|
+
|
98
|
+
should "assume correct base when not given" do
|
99
|
+
@winprofile.change_folder('Personal',nil,'Mis documentos')
|
100
|
+
assert_equal WinProfile::PROFILE_BASE+'\\'+'Mis documentos', @winprofile.show_changed_folder('Personal')
|
101
|
+
end
|
102
|
+
should "assume correct dir when not given" do
|
103
|
+
@winprofile.change_folder('Personal',WinProfile::PROFILE_BASE,nil)
|
104
|
+
assert_equal WinProfile::PROFILE_BASE+'\\'+'Mis documentos', @winprofile.show_changed_folder('Personal')
|
105
|
+
end
|
106
|
+
should "assume correct base and dir when none given" do
|
107
|
+
@winprofile.change_folder('Personal')
|
108
|
+
assert_equal WinProfile::PROFILE_BASE+'\\'+'Mis documentos', @winprofile.show_changed_folder('Personal')
|
109
|
+
end
|
110
|
+
should "add valid folders to @folders" do
|
111
|
+
@winprofile.change_folder('Personal','U:')
|
112
|
+
@winprofile.change_folder('AppData','U:\\.windows_settings')
|
113
|
+
assert_equal 'U:\\Mis documentos', @winprofile.show_changed_folder('Personal')
|
114
|
+
assert_equal 'U:\\.windows_settings\Datos de programa', @winprofile.show_changed_folder('AppData')
|
115
|
+
end
|
116
|
+
should "not add nonexistent folders" do
|
117
|
+
@winprofile.change_folder('NONEXISTENT','U:')
|
118
|
+
assert_same_elements [], @winprofile.folders
|
119
|
+
end
|
120
|
+
should "read the same info from hive if we have not commited" do
|
121
|
+
@before=@winprofile.show_folder('AppData')
|
122
|
+
@winprofile.change_folder('AppData','NONE')
|
123
|
+
assert_equal @before, @winprofile.show_folder('AppData')
|
124
|
+
end
|
125
|
+
should "read written info when we commit" do
|
126
|
+
@winprofile.change_folder('Personal','U:')
|
127
|
+
@winprofile.change_folder('AppData','U:\\.windows_settings')
|
128
|
+
@winprofile.commit
|
129
|
+
assert_equal 'U:\\Mis documentos', @winprofile.show_folder('Personal')
|
130
|
+
assert_equal 'U:\\.windows_settings\Datos de programa', @winprofile.show_folder('AppData')
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
92
134
|
context "when moving profile folders" do
|
93
135
|
setup do
|
94
136
|
# Remove orig
|
data/test/test_winreg.rb
CHANGED
@@ -4,6 +4,17 @@ require 'ftools'
|
|
4
4
|
class TestWinReg < Test::Unit::TestCase
|
5
5
|
FOLDERS_BASE='Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders'
|
6
6
|
|
7
|
+
should "raise exception when nonexistent file given" do
|
8
|
+
assert_raise RuntimeError do
|
9
|
+
@winreg=WinReg.new("NONEXISTENT")
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
should 'return WinReg object when existent file given' do
|
14
|
+
@winprofile=WinReg.new("test/NTUSER.DAT.SAFE")
|
15
|
+
assert_instance_of WinReg, @winprofile
|
16
|
+
end
|
17
|
+
|
7
18
|
context "A WinReg instance" do
|
8
19
|
setup do
|
9
20
|
File.copy "test/NTUSER.DAT.SAFE","test/NTUSER.DAT"
|
@@ -23,5 +34,18 @@ class TestWinReg < Test::Unit::TestCase
|
|
23
34
|
end
|
24
35
|
end
|
25
36
|
|
37
|
+
context 'when writing multiple keys at once' do
|
38
|
+
setup do
|
39
|
+
@data = [ { :name => FOLDERS_BASE+'\\'+'Personal', :value => 'SOME_DATA' },
|
40
|
+
{ :name => FOLDERS_BASE+'\\'+'AppData', :value => 'SOME_MORE_DATA' }
|
41
|
+
]
|
42
|
+
end
|
43
|
+
should 'return the written keys' do
|
44
|
+
@winreg.write_keys(@data)
|
45
|
+
assert_equal 'SOME_DATA',@winreg.read_key(FOLDERS_BASE+'\\'+'Personal')
|
46
|
+
assert_equal 'SOME_MORE_DATA',@winreg.read_key(FOLDERS_BASE+'\\'+'AppData')
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
26
50
|
end
|
27
51
|
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: winprofile
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 25
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 3
|
10
|
+
version: 0.0.3
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Miguel Armas
|