Category: Hacking

  • Stuffing Text Into All Screen Windows

    Various pagers have been giving me question marks in boxes and hexadecimal codes.  This is probably because I didn’t have the right font in the past and inserted various hacks into my ~/.bash tree to get around them, e.g. aliasing a LANG=C before every perldoc command.

    Well, now I’ve just about got everything right and proper in UTF-8 mode using a uxterm, but those little nigglers still pop up.  Today I did a man less and found the LESSCHARSET environment variable.  Awesome!  But if it’s not set, it’s supposed to use the locale, and my locale is already properly set up to en_US.utf-8.  Not a problem.  I just export -n LESSCHARSET to un-export the variable.

    But I’m in screen, with fourteen windows open.  How do I loop through all screen windows, stuffing a command into each?

    Luckily, a quick reading of the screen man page led me to this:

    at \# stuff "export -n LESSCHARSET\015source ~/.bash/aliases\015
    

    And BAM that gets stuffed into every window I have open.  Unfortunately, some of those are SQL prompts, log tails, and maybe an open vim session or two, but such are the pitfalls of impatiently trying out a new command, and no harm was done.

    The trick is to use the backslash-escaped octothorpe to specify all windows.  The rest is just a normal stuff, with that annoying octal \015 to specify a newline.

    Oh, and I added a second command to source my bash aliases, because I’d added new ones recently.

  • Mounting Windows Shares On Linux

    There must be a gazillion posts on this, so I’m just going to concentrate on what I did wrong.

    First I wanted to mount the target share as NFS, but the server doesn’t export to our desktop subnet at work. I saw it was running Samba, and remembered having had it working on Windows XP, so tried that. A friend at work had an /etc/fstab line that almost worked.

    Turns out smbfs is deprecated and cifs is the new smbfs, so there was a documentation detour of sorts. Anyway, I contacted infrastructure and they gave me a line that worked, but included the password. My coworker’s line used a credentials file, and I’d prefer that, because I’m old-school anal about including passwords in the clear and logging in as root and that kind of thing.

    So, I took the infrastructure guy’s fstab line, turned it into a mount command, ran it with three verbose flags, and saw it was trying to log me in as root, even though my credentials file included my own username.

    The fix turned out to be to explicitly add another username option to the line:

    //samba-server/dude /ext/dev/dude cifs rw,credentials=/home/dude/.ntcred/dev,username=dude,uid=dude,gid=dude,auto,user 0 0

    Replace “dude” with your username everywhere. Here’s my ~/.ntcred/dev file:

    username=dude
    password=dude-password
    domain=dev

    Replace everything with the appropriate values.  I’m not sure the domain even matters in this case, but it’s the NT domain/workgroup of the share.

    I think the root of the problem is the parsing of credentials files.  Apparently extraneous whitespace causes it to b0rk itself up.

    Oh, and the “user” option (to allow any user to mount it, as opposed to just root, or the conflicting “user” option to samba) won’t work unless you set the cifs commands suid root:

    chmod +s /sbin/*mount.cifs

    Your package manager will probably gripe and/or change that back whenever an upgrade comes up, and since we’re using “auto” it’s going to be mounted on boot, anyway, so you might as well just sudo the mount the first time and then rest easy.

    While I was at it, I tried mounting a few other shares on another domain.  One works fine.  When I try to enter any subdirectories of the other, everything goes to hell.   So, whatever.  I’m done.

     

  • Gitweb Diffs Between Versions

    Our company deploys code into production primarily from our version control system.  I suppose all companies do, in some way or another.  We endured a long hell with CVS and a far shorter stint in the purgatory of Subversion before we went into the heavenly light of Git.

    The way we do it is to tag various branches destined for certain groups of machines, archive a snapshot, then copy those out to where they belong.  This is all partially automated by an awesome (if somewhat Byzantine) home-grown software suite that I inherited once the original author left for (at least literally) greener pastures in the Pacific northwest.

    I’m not normally in charge of deployment, but since I “own” the software now and the usual dude is on a well-deserved vacation, this week I’m handling the once-weekly scheduled deploy and the multitude of little tweaks that absolutely positively must go out immediately.

    Our regular deployment manager sends out hand-written emails when he starts a test deploy, initiates the production deploy, then a final one when everything is finished.  Myself,  being a hacker, just can’t stomach the thought of not having something like that automated.  Thus, I dug into the command that prints the deployment status of all servers and hacked it up to be slightly more informative and email-friendly, so I could just copy-and-paste its output to an email.

    Then I thought, as all hackers think, “Wouldn’t it be cool if I could include a link to Gitweb that shows the exact changes that occurred since the previous deploy?”  I know the previous version commit-ish deployed to each  server, and of course I know the new one, so I could do it quite easily with a simple git command.

    However, I didn’t want to just slap that command in there so someone could (and likely never would) issue it within their cloned repo.  I wanted a simple clickable link to Gitweb.  Anyway, the query ends up being something like this, tacked onto your own Gitweb URL, of course:

    gitweb.pl?p=your-repo.git;a=commitdiff;hp=695de2d;h=fb7b608

    Where hp is the previous commit-ish and h is the usual “current” commit-ish argument.

    Voilà!

    The next step was to group all the servers by common changes so there’s only one diff link per group, and next I might try adding an --email-to option to send the email, skipping the copy-and-paste.

    …and then I’ll work on the bugs.