This repository has been archived by the owner on Nov 22, 2017. It is now read-only.
/
alwsl.bat
393 lines (340 loc) · 13.6 KB
/
alwsl.bat
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
@echo off
:: == ignore this =======================================================================================
SETLOCAL EnableDelayedExpansion
for /F "tokens=1,2 delims=#" %%a in ('"prompt #$H#$E#&echo on&for %%b in (1) do rem"') do (set "DEL=%%a")
set fail=call :colbang 0c "fail" & set info=call :colbang 0b "info" & set warn=call :colbang 0e "warn"
:: ======================================================================================================
REM Todo
REM - add user switching
if "%~1" == "update" (
%info% "Checking for updates..."
bitsadmin /RAWRETURN /transfer alwsl /download /priority FOREGROUND "https://cdn.turbo.run/alwsl/version" "%~dp0v_remote"
if not exist "%~dp0v_remote" (
%fail% "Failed to retrieve version from server. Nothing was done."
goto :eof
)
bash -c "cp /usr/share/version ./v_local"
set /p "v_remote="<"%~dp0v_remote"
set /p "v_local="<"%~dp0v_local"
del "v_*" > nul
if !v_remote! == !v_local! (
%info% "Your alwsl base system is up to date (!v_remote! = !v_local!)."
goto :eof
)
%info% "Update is available (!v_local! => !v_remote!)."
choice /M "Proceed with update? Hint: If you don't know what this does, don't."
if errorlevel 2 goto :eof
%fail% "Not yet implemented"
goto :eof
)
if "%~1" == "user" (
if not exist "%localappdata%\lxss\rootfs\usr\share\issue" (
%fail% "alwsl is not installed. Try >alwsl install<."
goto :eof
)
if "%~2" == "" (
%fail% "user requires a subtask."
goto :eof
)
if "%~2" == "default" (
REM This doesn't work at all.
if "%~3" == "" (
%fail% "No username given to switch to."
goto :eof
)
lxrun /setdefaultuser "%~3"
goto :eof
)
if "%~2" == "remove" (
REM Untested.
if "%~3" == "" (
%fail% "No username given to remove."
goto :eof
)
%info% "Removing %~3 and switching to root."
lxrun /setdefaultuser "root"
bash -c "userdel %~3"
goto :eof
)
)
if "%~1" == "snapshot" (
if not exist "%localappdata%\lxss\rootfs\usr\share\issue" (
%fail% "alwsl is not installed. Try >alwsl install<."
goto :eof
)
if "%~2" == "" (
%fail% "snapshot requires a subtask"
goto :eof
)
if "%~2" == "list" (
for /F %%i in ('dir /b "%localappdata%\lxss\snapshots\*"') do (
echo %%~ni
goto :eof
)
%fail% "There are no snapshots."
goto :eof
)
if "%~2" == "restore" (
if "%~3" == "" (
%fail% "No timestamp given for restore."
goto :eof
)
if not exist "%localappdata%\lxss\snapshots\%~3.sfs" (
%fail% "That snapshot doesn't exist."
goto :eof
)
call :overwritefs "%localappdata%\lxss\snapshots\%~3.sfs"
call :waitforexit
call :transpose
)
if "%~2" == "restore-sfs" (
if "%~3" == "" (
%fail% "No file given for restore."
goto :eof
)
if not exist "%~3" (
%fail% "That file doesn't exist."
goto :eof
)
call :overwritefs "%~3"
call :waitforexit
call :transpose
)
if "%~2" == "create" (
%info% "Creating snapshot..."
cd "%localappdata%\lxss\snapshots"
bash -c "mksquashfs / $(date +""%%Y-%%m-%%d_%%H-%%M-%%S"").sfs -b 1048576 -comp xz -Xdict-size 100%% -all-root -e /mnt 2>/dev/null"
cd "%~dp0"
goto :eof
)
if "%~2" == "remove-all" (
REM Don't add a choice here, del does that.
del "%localappdata%\lxss\snapshots\*"
goto :eof
)
if "%~2" == "remove" (
if "%~3" == "" (
%fail% "No timestamp given for remove."
goto :eof
)
if not exist "%localappdata%\lxss\snapshots\%~3.sfs" (
%fail% "That snapshot doesn't exist."
goto :eof
)
del "%localappdata%\lxss\snapshots\%~3.sfs"
if exist "%localappdata%\lxss\snapshots\%~3.sfs" (
%fail% "Failed to remove snapshot."
)
goto :eof
)
goto :eof
)
if "%~1" == "remove" (
%warn% "This can't be undone."
choice /M "Proceed and remove rootfs now?"
if errorlevel 2 goto :eof
call :purge
if exist "%localappdata%\lxss\rootfs\usr\share\issue" (
%fail% "Could not remove alwsl. Try again."
goto :eof
)
%info% "Successfully removed al+wsl."
goto :eof
)
if "%~1" == "install" (
FOR /F "tokens=3,* skip=2" %%L IN ('reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\AppModelUnlock" /v "AllowDevelopmentWithoutDevLicense"') DO (
if not "%%L" == "0x1" (
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\AppModelUnlock" /v "AllowDevelopmentWithoutDevLicense" /t REG_DWORD /d "0x1"
)
)
if exist "%localappdata%\lxss\sha256" (
%warn% "There's already a WSL rootfs installed. We need to remove that. If you have data there,"
%warn% "cancel this and backup your rootfs."
choice /M "Proceed with alwsl install and remove old rootfs now?"
if errorlevel 2 goto :eof
)
%info% "Cleaning old files."
call :purge
%info% "Installing base lxss fs from trusty server image. This will take A WHILE."
lxrun /install /y
if not exist "%localappdata%\lxss\root\.bashrc" (
%fail% "lxrun failed to install Microsoft's rootfs. Try to restart alwsl again. If this"
%fail% "error persists, check your firewall and AV. If all fails, open a GH issue."
goto :eof
)
bash -c "apt-get -qq update >/dev/null ; apt-get -qq --force-yes install squashfs-tools >/dev/null"
%info% "Downloading alwsl rootfs (this might take a while)..."
bitsadmin /RAWRETURN /transfer alwsl /download /priority FOREGROUND "https://cdn.turbo.run/alwsl/alwsl.sfs" "%~dp0alwsl.sfs"
If Not Exist "%~dp0alwsl.sfs" (
%fail% "Err, download failed. Try again (and check your firewall/AV settings)."
goto :eof
)
%info% "Downloading checksum for this image."
bitsadmin /RAWRETURN /transfer alwsl /download /priority FOREGROUND "https://cdn.turbo.run/alwsl/checksum" "%~dp0checksum"
set /p "remote="<"%~dp0checksum"
set "hash="
If Not Exist "%~dp0checksum" (
%fail% "Err, checksum download failed. Try again (and check your firewall/AV settings)."
%warn% "You can force the build, but it might brick the current lxss and you have to start over!"
choice /M "Do you want to force the build"
if errorlevel 2 goto :eof
) else (
FOR /F "tokens=* skip=1" %%F IN ('certutil -hashfile "%~dp0alwsl.sfs"') DO if not defined hash set "hash=%%F"
set hash=%hash: =%
if not "%hash%" == "%remote%" (
%fail% "Checksums do not match. This is most likely caused by a corrupted download :-/ ..."
%warn% "You can force the build, but it might brick the current lxss and you have to start over!"
choice /M "Do you want to force the build"
if errorlevel 2 goto :eof
) else (
%info% "Checksums match :-)"
)
)
call :overwritefs "%~dp0alwsl.sfs"
call :waitforexit
call :transpose
%info% "Checking installation success..."
if not exist "%localappdata%\lxss\rootfs\usr\share\issue" (
%fail% "Installation failed. Bash is still ubuntu. Try again."
goto :eof
)
mkdir "%localappdata%\lxss\snapshots"
%info% "Renaming shortut."
del "%USERPROFILE%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Bash on Ubuntu on Windows.lnk" > nul
bitsadmin /RAWRETURN /transfer alwsl /download /priority FOREGROUND "https://cdn.turbo.run/alwsl/archlinux.ico" "%localappdata%\lxss\archlinux.ico"
call :create_shortcut "%USERPROFILE%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\"
del /Q "%~dp0*.sfs" 2> nul
del /Q "%~dp0checksum" 2> nul
%info% "All done. Have fun! And open an issue for any ... issue you run into!"
choice /M "Do you want to start bash now?"
if errorlevel 2 goto :eof
bash -c "cat /usr/share/issue" & bash
goto :eof
)
echo\
%info% "alwsl - install and manage archlinux as the WSL distro"
%warn% "IMPORTANT: Read what NOT to do in alwsl at git.io/alwsl. alwsl is a non-standard distribution"
%warn% "and therefore not supported at the archlinux BBS. Ask for support at the above URL only."
echo\
echo Usage: alwsl task [subtask] [arg]
echo\
echo List of tasks:
echo\
echo install Install alwsl from scratch. Implies remove task.
echo\
echo remove Uninstall WSL completely.
echo\
echo snapshot Create and manage snapshots of the root file system. This does not include the /home of ANY
echo user (not even root). Create a snapshot if you think you're about to do something stupid and
echo need a way to get back to a working system.
echo create Capture the current rootfs.
echo remove TIME Delete snapshot TIME.
echo list List all available snapshots.
echo remove-all Delete all snapshots.
echo restore TIME Reset rootfs to TIME.
echo restore-sfs SFS Replace rootfs with third-party squashfs SFS. UNSUPPORTED.
echo\
echo user Manage the user which hosts bash.
echo remove Delete this user account and switch default to root.
echo default USER Switch default to USER (you did remember to add them to sudoers, right?).
echo\
echo update Check for and perform an update for the base alwsl rootfs. This will undo any changes you've
echo made not in a /home directory. You might want to create a snapshot before doing this.
goto :eof
:overwritefs
set wrfs=%~1
set wrfs=%wrfs:~3%
set wrfs=%wrfs:\=/%
set mountpoint=/mnt/%cd:~0,1%/
set "_UCASE=ABCDEFGHIJKLMNOPQRSTUVWXYZ"
set "_LCASE=abcdefghijklmnopqrstuvwxyz"
for /l %%a in (0,1,25) do (
call set "_FROM=%%_UCASE:~%%a,1%%
call set "_TO=%%_LCASE:~%%a,1%%
call set "mountpoint=%%mountpoint:!_FROM!=!_TO!%%
)
set mountpoint=%mountpoint%%wrfs%
%info% "Copying rootfs to temporary extraction destination."
bash -c "cd && mkdir -p rootfs-temp && cd rootfs-temp && cp %mountpoint% ."
%info% "Unsquashing rootfs."
bash -c "cd && cd rootfs-temp && unsquashfs -f -x -d . %~n1.sfs 2>/dev/null"
goto :eof
:transpose
timeout /t 5 /nobreak >nul
%info% "Transforming..."
move "%localappdata%\lxss\rootfs" "%localappdata%\lxss\rootfs-backup"
move "%localappdata%\lxss\root\rootfs-temp" "%localappdata%\lxss\rootfs"
move "%localappdata%\lxss\rootfs-backup" "%localappdata%\lxss\rootfs\tmp"
bash -c "cd / ; rm *.sfs ; rm -rf tmp ; mkdir -p tmp"
goto :eof
:waitforexit
if exist "%localappdata%\lxss\temp" (
call :waitforexit
)
goto :eof
:purge
del /Q "%~dp0*.sfs" 2> nul
del /Q "%USERPROFILE%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\archlinux.lnk" 2> nul
del /Q "%~dp0checksum" 2> nul
lxrun /uninstall /full /y > nul
goto :eof
:colbang
echo off&set "b=%~n0 (%~2)"
<nul set /p ".=%DEL%">"%b%"
findstr /v /a:%1 /R "^$" "%b%" nul&del "%b%">nul 2>&1&echo : %~3
goto :eof
:create_shortcut
(
echo -----BEGIN CERTIFICATE-----
echo TAAAAAEUAgAAAAAAwAAAAAAAAEb7AggAIAAAALEIDfh79NEBFxuvoZP50QFXfbGh
echo k/nRAQAcAQAAAAAAAQAAAFQGAAAAAAAAAAAAADkBFAAfUOBP0CDqOmkQotgIACsw
echo MJ0ZAC9DOlwAAAAAAAAAAAAAAAAAAAAAAAAAVgAxAAAAAAAUSbB0EABXaW5kb3dz
echo AEAACQAEAO++E0k5ixRJsHQuAAAAyQEAAAAAUAAAAAAAAAAAAAAAAAAAADdqFAFX
echo AGkAbgBkAG8AdwBzAAAAFgBaADEAAAAAABVJTUQQAFN5c3RlbTMyAABCAAkABADv
echo vhNJOYsVSU1ELgAAAPkBAAAAABcAAAAAAAAAAAAAAAAAAAB6URwBUwB5AHMAdABl
echo AG0AMwAyAAAAGABaADIAABwBABJJIqggAGJhc2guZXhlAABCAAkABADvvgxJo0sS
echo SSKoLgAAAADHCwAAAAIAAAAAAPMAAAAAAAAAAACpahMAYgBhAHMAaAAuAGUAeABl
echo AAAAGAAAAEsAAAAcAAAAAQAAABwAAAAtAAAAAAAAAEoAAAARAAAAAwAAADLXYEwQ
echo AAAAAEM6XFdpbmRvd3NcU3lzdGVtMzJcYmFzaC5leGUAADEALgAuAFwALgAuAFwA
echo LgAuAFwALgAuAFwALgAuAFwALgAuAFwALgAuAFwALgAuAFwAVwBpAG4AZABvAHcA
echo cwBcAFMAeQBzAHQAZQBtADMAMgBcAGIAYQBzAGgALgBlAHgAZQAVACUAcwB5AHMA
echo dABlAG0AcgBvAG8AdAAlAFwAUwB5AHMAdABlAG0AMwAyAAEAfgAhACUAbABvAGMA
echo YQBsAGEAcABwAGQAYQB0AGEAJQBcAGwAeABzAHMAXABhAHIAYwBoAGwAaQBuAHUA
echo eAAuAGkAYwBvABAAAAAFAACgJQAAAN0AAAAcAAAACwAAoHdOwRrnAl1Ot0Qusa5R
echo mLfdAAAAYAAAAAMAAKBYAAAAAAAAAGRhbGVrAAAAAAAAAAAAAAAkPbRiR4o2TKiR
echo FNzMraJQr9G6bgZm5hGu02Btx4GgUiQ9tGJHijZMqJEU3MytolCv0bpuBmbmEa7T
echo YG3HgaBSFAMAAAEAAKAlc3lzdGVtcm9vdCVcU3lzdGVtMzJcYmFzaC5leGUAAAAA
echo AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
echo AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
echo AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
echo AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
echo AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACUAcwB5AHMAdABlAG0A
echo cgBvAG8AdAAlAFwAUwB5AHMAdABlAG0AMwAyAFwAYgBhAHMAaAAuAGUAeABlAAAA
echo AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
echo AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
echo AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
echo AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
echo AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
echo AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
echo AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
echo AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
echo AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
echo AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9AgAACQAAoFkAAAAxU1BT7TC92kMA
echo iUen+NATpHNmIj0AAABkAAAAAB8AAAAWAAAAUwB5AHMAdABlAG0AMwAyACAAKABD
echo ADoAXABXAGkAbgBkAG8AdwBzACkAAAAAAAAAjQAAADFTUFPiilhGvEw4Q7v8E5Mm
echo mG3OcQAAAAQAAAAAHwAAAC8AAABTAC0AMQAtADUALQAyADEALQAzADgAOAA0ADEA
echo NQA3ADEAMQA0AC0AMwA1ADAAMgA2ADMAOQA5ADEANQAtADQAMAA0ADEAMwA4ADkA
echo OAA5ADMALQAxADAAMAAxAAAAAAAAAAAAqQAAADFTUFMw8SW370caEKXxAmCMnuus
echo JQAAAAoAAAAAHwAAAAkAAABiAGEAcwBoAC4AZQB4AGUAAAAAABUAAAAPAAAAAEAA
echo AAAAXaL4e/TRARUAAAAMAAAAABUAAAAAHAEAAAAAACkAAAAEAAAAAB8AAAAMAAAA
echo QQBwAHAAbABpAGMAYQB0AGkAbwBuAAAAFQAAAA4AAAAAQAAAAFd9saGT+dEBAAAA
echo AGkAAAAxU1BTpmpjKD2V0hG11gDAT9kY0E0AAAAeAAAAAB8AAAAdAAAAQwA6AFwA
echo VwBpAG4AZABvAHcAcwBcAFMAeQBzAHQAZQBtADMAMgBcAGIAYQBzAGgALgBlAHgA
echo ZQAAAAAAAAAAADkAAAAxU1BTsRZtRK2NcEinSEAupD14jB0AAABoAAAAAEgAAABS
echo 7Al1AAAAAAAAUB8AAAAAAAAAAAAAAAAAAAAA
echo -----END CERTIFICATE-----
)>file.tmp
certutil -decode file.tmp "%~1archlinux.lnk" >nul
del file.tmp
goto :eof
:: =====================================================================================================