|00:06||boospy has left IRC (email@example.com, Remote host closed the connection)|
|00:06||boospy has joined IRC (firstname.lastname@example.org)|
|00:47||cryptrat has left IRC (cryptrat!481f0c3c@gateway/web/freenode/ip.22.214.171.124, Quit: Page closed)|
|01:24||andygraybeal has left IRC (email@example.com, Ping timeout: 260 seconds)|
|01:27||boospy has left IRC (firstname.lastname@example.org)|
|02:14||telex has left IRC (email@example.com, Ping timeout: 244 seconds)|
|02:16||telex has joined IRC (firstname.lastname@example.org)|
well, couldn't figure out what was wrong with ltspfs on jessie, but was able to test the fix on wheezy with a backported ltspfs: https://bugs.launchpad.net/ubuntu/+source/ltspfs/+bug/1021579
now to fix in jessie so I can really fix the issue.
|02:59||workingcats has left IRC (email@example.com, Ping timeout: 246 seconds)|
|03:00||workingcats has joined IRC (firstname.lastname@example.org)|
|03:07||adrianorg has left IRC (email@example.com, Ping timeout: 240 seconds)|
|03:09||adrianorg has joined IRC (firstname.lastname@example.org)|
so, the fuse group is gone .... i wonder if our scripts assume something there.
|03:47||staffencasa_ has joined IRC (email@example.com)|
|03:52||tarzeau has joined IRC (firstname.lastname@example.org)|
|03:52||telex has left IRC (email@example.com, Ping timeout: 250 seconds)|
|03:52||pppingme has left IRC (pppingme!~pppingme@unaffiliated/pppingme, Ping timeout: 250 seconds)|
|03:52||mmetzger has left IRC (firstname.lastname@example.org, Ping timeout: 250 seconds)|
|03:52||tarzeau_ has left IRC (email@example.com, Ping timeout: 250 seconds)|
|03:52||staffencasa has left IRC (firstname.lastname@example.org, Ping timeout: 250 seconds)|
|03:52||mmetzger has joined IRC (email@example.com)|
|03:53||telex has joined IRC (firstname.lastname@example.org)|
|03:54||pppingme has joined IRC (pppingme!~pppingme@unaffiliated/pppingme)|
|03:54||telex has joined IRC (email@example.com)|
|04:03||adrianorg has left IRC (firstname.lastname@example.org, Ping timeout: 264 seconds)|
|04:05||adrianorg has joined IRC (email@example.com)|
|04:06||mmetzger_ has joined IRC (firstname.lastname@example.org)|
|04:07||mmetzger has left IRC (email@example.com, Ping timeout: 250 seconds)|
ok, i think lbmount thinks it's not installed setuid root.
that's *one* of the problems...
meh. strace is not useable on setuid programs, so the setuid issue is a red herring.
anyone having ltspfs troubles in recent versions of ubuntu? 14.04 or 14.10 ?
|05:01||* vagrantc tries patching lbmont to use --bind instead of --move|
|05:08||sutula_ has joined IRC (firstname.lastname@example.org)|
|05:10||sutula has left IRC (email@example.com, Quit: ZNC - http://znc.sourceforge.net)|
|05:10||sutula_ is now known as sutula|
|06:28||Grembler has joined IRC (Grembler!~Ben@cpc29-aztw22-2-0-cust128.18-1.cable.virginm.net)|
well, made some progress... still can't figure out why ltspfsd fails to start when called from udev.
ok, well, running sysvinit instead of systemd fixed it.
first time i've been really bitten by a difference in behavior
wonder if that affects the mount --move bug too...
and systemd breaks that too
|07:04||alkisg has joined IRC (alkisg!~alkisg@ubuntu/member/alkisg)|
this kind of makes me want to toss out the security concerns of a writeable /media/USERNAME and just mount directly to /media/USERNAME/MOUNT
alkisg: so, systemd borked ltspfs on debian! :)
or, one of it's evil minions.
the "mount --move" just plain doesn't work, and ltspfsd doesn't start from udev anymore. switching back to sysvinit works like a charm.
|07:16||* vagrantc might upload ltspfs with a "Breaks: systemd" just to document this...|
is any ubuntu variant using systemd yet?
|07:26||mealstrom1 has left IRC (mealstrom1!~Thunderbi@126.96.36.199, Ping timeout: 255 seconds)|
vagrantc, we have that mount --move since a long time on suse, i've just adapted /etc/ltspfs/mounter.d/kde-desktop-icons to point to file:///tmp/.%s-ltspfs/%
cyberorg: yes, we've been using "mount --move" for ages in debian and ubuntu as well...
cyberorg: or do you mean "systemd breaks mount --move" ?
mount: bad option. Note that moving a mount residing under a shared mount is unsupported
don't know what is responsible for it
i think directly mounting to /media/USERNAME/MOUNT is a good idea, all the moving mount doesn't make much sense to me
vagrantc: I don't know enough about ltspfsd to be immediately helpful, but if you want to chat about it, i'm here :)
ltspfsd doesn't start from udev at all now, or it just exits immediately?
Ubuntu 14.10 uses systemd AFAIK
alkisg: it seems to start and fail quietly ... it's a bit of a beast to extract useful information out of
vagrantc: maybe you could run screen instead, so that you have a terminal to test stuff?
I.e. replace ltspfsd with a screen wrapper...
also, if i run it manually from a shell on tty2, it works fine.
i did replace it with an strace logging wrapper ... but that didn't tell much
screen would be under systemd
Btw, what were those security concerns?
cyberorg: yeah, the direct mounting would be ideal, i even had a patch for it ages ago, but it was nixed due to security concerns of a user DOSing a server by filling up /media/
What's the sequence there? A user inserts a stick, udev launches ltspfsd, which mounts the stick as root, and `mount --bind`'s it to /media/username/label?
vagrantc, how does mounting to /tmp them mount --move prevent that?
cyberorg: because they're not given write access to /media/USERNAME
alkisg: everything good up until mount --bind ...
alkisg: there's a bunch of plumbing between server and client at that point
Ah, wait, ltspfsd locally hides the mount... and then ltspfs on the server mounts it under /media/username
alkisg: ltspfs on the server mounts it as /tmp/.username-ltspfs/FOO and then "mount --move /tmp/.username-ltspfs/FOO /media/username/FOO"
lbmount handles the relocation of the mount point
But /media/username is already owned by the user, unrelated to ltsp, right?
I had alkisg:alkisg, but after deleting it, it was recreated root:root, ok
apparently, "mount --make-private /" may make "mount --move" work on systemd running systems.
though, honestly, i'm tempted to just mount a tiny tmpfs in /media/username and direct mount
How does udisks mount things under /media/username/label, and we can't do it?
there was some plan to explore ltspfs-udisks hooks, but it's been long stalled out
I mean, if we already have a suid root wrapper, I don't see why we can't mount things directly under /media/username, even if it's owned by root...
the ltspfs fuse part needs to be run as the user
also, don't run more as root than you absolutely have to
especially with setuid
Sure, same as udisks does it
I don't think they're doing more than absolutely necessary
my old code basically just created a dir in /media/username/ for each mountpoint, and that's all the setuid code did, and then the ltspfs mount could mount directly to that.
E.g. mkdir /media/alkisg/sshfs-test, and chown it to alkisg, and then try sshfs as the user => works fine...
it was a hugely simpler diff, far less code running as root, just had the problem of potentially allowing a user to write DOS the /media/username dir with big files (given that /media isn't often split off from /)
alkisg: yes, that's exactly what the code did.
In my example above, /media/alkisg is owned by root
So the user can't write there
but they could write to sshfs-test
It's sshfs, mounted from elsewhere
if they managed to unmount it
you can unmount sshfs dirs you create
The unmount wrapper should delete the directory
but they don't have to use the wrapper
They do, they're not root
If we pass a helper to the mount command
they can umount sshfs filesystems owned by themselves
If you have a helper there, it'll be called on unmount
Even if you use fusermount
i.e. /sbin/umount.ltspfs or whatever?
/sbin/mount.ntfs /dev/sda1 /media/alkisg/Vista -o rw,nosuid,nodev,uhelper=udisks2,uid=1010,gid=1010,dmask=0077,fmask=0177
That uhelper=xxx can be lbumount, yeah
And it will even allow unmounting from nautilus
that sounds like an improvement.
ok, time to do some surgery on ltspfs...
maybe after i get some sleep.
|08:00||* alkisg wonders if all those private* mounts can help in ltsp-update-image cleanup.d...|
alkisg-todo: (#1) Hooks for running scripts on these phases: INITRD/INIT/RC/DM/AUTH/LOGIN/SESSION/PERIODIC/LOGOUT/SHUTDOWN, or (#2) implement ltsp-config aoe, or (#3) fix vendor:pxe in ltsp-server-dnsmasq.conf and add more options, or (#4) change COMPRESS=gzip (19899456 bytes) to either lzma (14710842) or xz (14633624), in /etc/initramfs-tools/initramfs.conf
!forget alkisg-todo 4
The operation succeeded.
vendor:pxe in ltsp-server-dnsmasq.conf should be vendor:PXEClient... I don't know why it ended up that way
|08:01||ben_nabiy has joined IRC (ben_nabiy!~bennabiy@unaffiliated/bennabiy)|
And we could add some other options in the example configuration, commented out, like those shown in dnsmasq --help dhcp
|08:02||mealstrom has joined IRC (mealstrom!~Thunderbi@188.8.131.52)|
E.g. dns-server, swap-server...
|08:04||bennabiy has left IRC (bennabiy!~bennabiy@unaffiliated/bennabiy, Ping timeout: 240 seconds)|
!learn alkisg-todo as parse dhcpinfo.dat from http://www.syslinux.org/wiki/index.php/Linux.c32
The operation succeeded.
alkisg: i cc'ed you on two ltspfs* bugs i just submitted related to the systemd issues...
alkisg: hope that's ok.
vagrantc: sure buddy, np at all
i don't expect you to solve it, but if you have more ideas or something i missed, feel free to chime in :)
|08:34||* vagrantc suspects the newer ubuntu system will have the same or similar issues|
and if not, i'd be very curious about what's different
I think Ubuntu LTSP users nowadays stick with LTS releases... so unless some developer tests some non-LTS release, we'll know about it in 16.04 :)
wheee. two RC bugs on ltspfs...
that'll stir the mud.
Are any ltsp-dev other than you attending debconf ? Maybe you could work on that there...
|08:44||* vagrantc is playing host|
probably not a lot of time for development
might get some time to work on it in the next couple days
Ah, I thought there was a time before debconf reserved for development... *camp something?
usually there is, but this time the plan was to have dedicated development time during the course of the week without any scheduled talks
it's an experiment
|08:48||* vagrantc is tempted to limp along with the "use --bind mount and umount the entry in /tmp" quick fix|
even though something more ambitious is in order
|08:50||* vagrantc sleep|
|08:50||* alkisg would prefer sshfs for ltsp6...|
|08:50||* vagrantc waves|
|08:50||vagrantc has left IRC (vagrantc!~vagrant@freegeek/vagrantc, Quit: leaving)|
|09:10||boospy has joined IRC (firstname.lastname@example.org)|
|09:10||boospy has left IRC (email@example.com)|
|09:16||boospy has joined IRC (firstname.lastname@example.org)|
|09:16||boospy has left IRC (email@example.com)|
|09:44||bernste4 has joined IRC (firstname.lastname@example.org)|
the file /etc/network/interfaces is dynamically generated by ltsp
do you know where i can set the MTU then ?
RCFILE_01="ip params to change mtu"
Even if you changed that file, it wouldn't take effect, because the ip is manual, set by the initramfs
So either use RCFILE_01 like above, or put an initramfs script
E.g. #2: /usr/share/initramfs-tools/scripts/init-premount/udhcp-sis190
That sets the mtu only for sis network cards
btw, i just updated our ubuntu 12.04 ltsp setup to 14.04 and it worked great
You're lucky, 14.04 is lame here, where we need an international keyboard layout... :)
|09:50||* alkisg waves|
|09:50||alkisg has left IRC (alkisg!~alkisg@ubuntu/member/alkisg, Remote host closed the connection)|
|09:54||freedomrun has joined IRC (freedomrun!~freedomru@unaffiliated/freedomrun)|
|10:07||cyberorg has left IRC (cyberorg!~cyberorg@opensuse/member/Cyberorg, Ping timeout: 260 seconds)|
|10:09||cyberorg has joined IRC (cyberorg!~cyberorg@opensuse/member/Cyberorg)|
|10:17||boospy has joined IRC (email@example.com)|
|10:22||andygraybeal has joined IRC (firstname.lastname@example.org)|
|10:38||NeonLicht has left IRC (NeonLicht!~NeonLicht@darwin.ugr.es, Ping timeout: 245 seconds)|
|11:29||boospy has left IRC (email@example.com)|
|11:52||staffencasa_ has left IRC (firstname.lastname@example.org, Ping timeout: 260 seconds)|
|12:14||Faith has joined IRC (Faith!~paty@unaffiliated/faith)|
|12:34||sutula has left IRC (email@example.com, Ping timeout: 264 seconds)|
|12:35||bernste4 has left IRC (firstname.lastname@example.org, Quit: leaving)|
|12:40||khildin has joined IRC (email@example.com)|
|12:42||bill_ has joined IRC (bill_!6567c79d@gateway/web/freenode/ip.184.108.40.206)|
|13:20||sutula has joined IRC (firstname.lastname@example.org)|
Are there any other HOT examples besides https://github.com/openstack/heat-templates/tree/master/hot
Oops, wrong channel.
|13:42||Grembler has joined IRC (Grembler!~Ben@cpc29-aztw22-2-0-cust128.18-1.cable.virginm.net)|
|13:51||boospy has joined IRC (email@example.com)|
|13:51||freedomrun has left IRC (freedomrun!~freedomru@unaffiliated/freedomrun, Quit: So long and thanks for all the fish.)|
|14:08||brianr has joined IRC (firstname.lastname@example.org)|
good morning. I have a web application that is being accessed by thin clients. The web application needs to know the IP of the thin client. Does anyone know a good way to make remote_addr or even x_forwarded_for (or similar variables) report the thin client ip and not the terminal server ip
|14:26||Grembler has left IRC (Grembler!~Ben@cpc29-aztw22-2-0-cust128.18-1.cable.virginm.net, Quit: I Leave)|
|14:32||mealstrom has left IRC (mealstrom!~Thunderbi@220.127.116.11, Ping timeout: 240 seconds)|
brianr, actually, I ran into the same issue are you are running into.
|14:32||staffencasa_ has joined IRC (email@example.com)|
brianr, not sure if you are actually looking for the IP of the user? Because what I wanted was the username. :-)
brianr, and this I solved by using the ident protocol (TCP port 113, identd daemon)
It's a very simple protocol to implement.
If you really need the IP address of the client, then you're out of luck I think. The browser runs on the terminal server, not the thin client. So it doesn't actually know the IP address.
One hack you could do is create a script that runs firefox http://mywebapp/?ip=$LTSP_CLIENT
how about dynamically setting x_forwarded_for to $LTSP_CLIEN
getting the username wont help us much
brianr, X_FORWARDED_FOR is set by proxy servers
brianr, let's go back one step - what exactly do you want to do with the IP address?
Why do you need it?
we have local devices, scanners to be exact on the thin clients, and the web app needs to tell sane where to try and pull the scan from
right now we are looking at some browser extensions that let you set headers
we might have something that works ... it reads your headers from a file, so we could write that file when the user logs in.
brianr, you realize LTSP has scanning features you can enable so the local scanner is available directly on the server?
That might help a little somehow...
Also, another option could be to run the browser for the webapp locally, on the thin client itself, rather than on the server.
localapps: to access a tutorial on setting up localapps on jaunty, see https://help.ubuntu.com/community/UbuntuLTSP/LTSPLocalAppsJaunty
Oh that's really old.
Type "ltsp-localapps xterm" in a terminal window, it'll show you what localapps does.
many of our thin clients are not beefy enough to run it locally, it works but performance is poor. many have 1gb memory, and are using atom processors
I wasn't suggesting to run everything locally... just the web app.
because that does work ... we tried that but performance was horrible
right .. we were just running chrome locally
Anyway... those are my thoughts so far. :P I have to hit the road now though.
Maybe someone else has better idea.
|14:52||mealstrom has joined IRC (mealstrom!~Thunderbi@18.104.22.168)|
|14:54||boospy has left IRC (firstname.lastname@example.org)|
|14:57||staffencasa_ has left IRC (email@example.com, Ping timeout: 260 seconds)|
|15:12||staffencasa_ has joined IRC (firstname.lastname@example.org)|
|15:20||alkisg has joined IRC (alkisg!~alkisg@ubuntu/member/alkisg)|
brianr: create a /usr/local/bin/firefox wrapper, which runs /usr/bin/firefox "http://your-web-server/index.php?client=$LTSP-CLIENT"
Then redirect it to your main index page, and get the referrer...
hmm, yes that _should_ work
|15:32||khildin has left IRC (email@example.com, Remote host closed the connection)|
|15:35||sutula_ has joined IRC (firstname.lastname@example.org)|
|15:36||vagrantc has joined IRC (vagrantc!~vagrant@freegeek/vagrantc)|
i'll tell you the imediate issue with that, when you specify a url in the startup of chrome or firefox, it does not open the users preferred start page(s).
|15:38||sutula has left IRC (email@example.com, Quit: ZNC - http://znc.sourceforge.net)|
|15:38||sutula_ is now known as sutula|
I thought that was the only application that the users ran... but anyway, translating from an environment variable to an http header is a question for #mozilla, not for #ltsp...
It should be doable with a tiny plugin.
It's also possible for the wrapper to use sqlite and directly edit firefox settings before launching firefox
that's a possibility. also thinking of writing a cookie upon user login, that the webserver can access
They describe a method to set user preferences (like user.js) from environment variables there
So it should be easy to create a global user.js that sets a header from LTSP_CLIENT, for all users
thanks for the link , that looks promising
Anyway, ask at #mozilla, they know their stuff better
|16:08||||cw has left IRC (||cw!~chris@phpgroupware/cw, Ping timeout: 260 seconds)|
cyberorg: you might be interested in following https://bugs.debian.org/758090 and https://bugs.debian.org/758093
i guess upstream bugs might make sense as well..
although i'm not sure what part is debian-specific at this point
|16:21||||cw has joined IRC (||cw!~chris@phpgroupware/cw)|
ok, so lxde has *two* features that work well with ltsp ... shutdown/reboot work out of the box, and ltspfs mounts show up in the file manager!
|16:29||mmetzger_ is now known as mmetzger|
|16:38||||cw has left IRC (||cw!~chris@phpgroupware/cw, Ping timeout: 245 seconds)|
|16:52||||cw has joined IRC (||cw!~chris@phpgroupware/cw)|
|16:54||mealstrom has left IRC (mealstrom!~Thunderbi@22.214.171.124, Remote host closed the connection)|
|18:06||Ark74 has joined IRC (Ark74firstname.lastname@example.org)|
|18:15||andygraybeal has left IRC (email@example.com, Ping timeout: 260 seconds)|
hrm. my quick workaround requires me to learn some C ... it exec's the mount --bind business, so it can't follow-up with an umount.
or maybe there's another way.
|18:31||* alkisg just tried ltspfs in 14.04, and while it works (no systemd here), the owner of /media/user is user:root|
So it's already writeable...
Unmounting any directory inside /home/user/* automatically results in the directory being removed
Even without helpers present in the command line
wonder how we made that work.
No no sorry, for the automatic removal, I was talking about other mounts, not ltspfs ones
E.g. mounting an ntfs volume... but, unmounting an ltspfs mount doesn't auto-remove it
|18:37||Ark74 has left IRC (Ark74firstname.lastname@example.org, Remote host closed the connection)|
the simplest approach would be to create /media/username/FOO as writeable as the user, and then ltspfs mounting directly there.
Verify that /media/username doesn't exist. Then plug in a USB stick. Then you say that in debian, that directory would be owned by root:root?
Because here, when ltspfs creates it, it's user:root, already insecure...
yeah, it seems to be created as /media/username owned by the user here too...
though i do have a quick fix workaround: http://paste.debian.net/115638/
So all the trouble of `mount --move` is in vain, AFAIK...
we could really simplify the code greatly.
There's a small patch for reverse sshfs
I'd rather use that for ltsp6...
well, at least for debian, i may go with my simple little workaround for now.
What are the downsides of mount --bind as a workaround for now?
the original downside was that it leaves two mounts (one in /media and one in /tmp)
but i've worked around that in ltspfsmounter.
there might be some corner cases where a mount fails and leaves us in an ugly state, whereas --move is atomic
also haven't tested the backportability of this approach ... maybe old fusermount would remove both /media and /tmp mountpoints if you removed one of them.
|18:52||* vagrantc also needs to test with sysvinit and backportability...|
|18:53||championofcyrodi has left IRC (email@example.com)|
!learn alkisg as test reverse sshfs: http://www.commandlinefu.com/commands/view/13289/reverse-sshfs-mount
The operation succeeded.
!forget alkisg 2
The operation succeeded.
!learn alkisg-todo as test reverse sshfs: http://www.commandlinefu.com/commands/view/13289/reverse-sshfs-mount
The operation succeeded.
i should look into updating it to mount to /media/username/foo directly.
a little more invasive, but a *lot* cleaner.
|18:55||championofcyrodi has joined IRC (firstname.lastname@example.org)|
also, while we're at it, installing a umount helper script would be nice.
let's see if we can't push out ltspfs 1.4 in the next couple days...
It appears that things advanced, in 14.04 it's possible for the user to unmount things even without a helper somehow
in jessie i've been able to unmount it with fusermount -u
ltsp 6... no ldm, no ltspfs, no getltscfg... we already removed xatomwait etc...
...it shouldn't be called ltsp anymore, everything got rewritten :D
hrm. lxde's file manager isn't showing the mounts with mount --bind
alkisg: well, a lot of that wasn't in ltsp 3 or 4 either
alkisg: about the only thing that's been around since forever is getltscfg
alkisg: so, calling it something else is a separate issue
helperless unmount doesn't work in mate on jessie
but it does show up in the file manager
|19:17||alkisg has left IRC (alkisg!~alkisg@ubuntu/member/alkisg, Quit: Leaving.)|
heh. looks like sbalneav changed it to own the /media/username as the user back in february 2010
why we're not taking full advantage of it is beyond me!
|20:00||mealstrom has joined IRC (mealstrom!~Thunderbi@126.96.36.199)|
|20:03||andygraybeal has joined IRC (email@example.com)|
|20:24||championofcyrodi has left IRC (firstname.lastname@example.org)|
|20:27||freedomrun has joined IRC (freedomrun!~freedomru@unaffiliated/freedomrun)|
ah, i remember now ... we changed the /media/username to be chowned by the user so that it didn't depend on the user's group being private.
as the code to handle that correctly was insane.
|20:53||telex has left IRC (email@example.com, Remote host closed the connection)|
|20:54||telex has joined IRC (firstname.lastname@example.org)|
|21:10||brianr has left IRC (email@example.com, Quit: Leaving)|
|21:20||staffencasa_ has left IRC (firstname.lastname@example.org, Ping timeout: 255 seconds)|
|21:22||staffencasa_ has joined IRC (email@example.com)|
|21:31||staffencasa_ has left IRC (firstname.lastname@example.org, Ping timeout: 244 seconds)|
|21:41||user3 has joined IRC (user3!6567c79d@gateway/web/freenode/ip.188.8.131.52)|
Hi, Im wondering if LTSP requires a internet connection for it to work. I think it needs to be connected to the router, but if the internet itself cuts off (which is somewhat requent with my internet), will the thin clients shut down?
Also, does it use data from your ISP?
it does not need internet
unless, of course, you want to surf the web
it doesn't use data from your ISP, unless, of course, you want to surf the web
|21:46||user3 has left IRC (user3!6567c79d@gateway/web/freenode/ip.184.108.40.206, Quit: Page closed)|
unless, of course, your router is the hardware that fails...
and you've got the thin clients plugged directly into it...
|21:55||Faith has left IRC (Faith!~paty@unaffiliated/faith, Quit: Saindo)|
|22:43||freedomrun_ has joined IRC (freedomrun_!~freedomru@unaffiliated/freedomrun)|
|22:47||freedomrun has left IRC (freedomrun!~freedomru@unaffiliated/freedomrun, Ping timeout: 272 seconds)|
|22:48||staffencasa_ has joined IRC (email@example.com)|
|23:12||staffencasa_ is now known as staffencasa|
|23:25||cryptrat has joined IRC (cryptrat!481f0c3c@gateway/web/freenode/ip.220.127.116.11)|
|23:26||staffencasa has left IRC (firstname.lastname@example.org, Ping timeout: 246 seconds)|
got a ?, there is a youtube video from disklessworkstations that shows rdp or rdesktop being used to remotely call ms office is there any tutorial for that anywhere?
sorry it was revolutionLinux https://www.youtube.com/watch?v=8OEs2AWFTWc