diff --git a/CSharp/Hangover.cs b/CSharp/Hangover.cs new file mode 100644 index 00000000..fe7a5888 --- /dev/null +++ b/CSharp/Hangover.cs @@ -0,0 +1,34 @@ +namespace Hacker_Scripts +{ + using System; + using Twilio; + using System.Linq; + + class Hangover + { + public static string TWILIO_ACCOUNT_SID = Environment.GetEnvironmentVariable("TWILIO_ACCOUNT_SID"); + public static string AUTH_TOKEN = Environment.GetEnvironmentVariable("TWILIO_AUTH_TOKEN"); + + public static string YOUR_NUMBER = "9879789978"; + public static string BOSS_NUMBER = "3213213233"; + + static void Main(string[] args) + { + var twilio = new TwilioRestClient(TWILIO_ACCOUNT_SID, AUTH_TOKEN); + + string[] randomMessages = { + "Locked out", + "Pipes broke", + "Food poisoning", + "Not feeling well" + }; + + int randomIndex = new Random().Next(randomMessages.Count()); + String messageToSend = (randomMessages[randomIndex]); + + var message = twilio.SendMessage(YOUR_NUMBER, BOSS_NUMBER, messageToSend); + Console.WriteLine(message.Sid); + } + } +} + diff --git a/CSharp/SmackMyBitch.cs b/CSharp/SmackMyBitch.cs new file mode 100644 index 00000000..d5c13fc1 --- /dev/null +++ b/CSharp/SmackMyBitch.cs @@ -0,0 +1,35 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Twilio; + +namespace Hacker_Scripts +{ + class SmackMyBitch + { + public static string TWILIO_ACCOUNT_SID = Environment.GetEnvironmentVariable("TWILIO_ACCOUNT_SID"); + public static string AUTH_TOKEN = Environment.GetEnvironmentVariable("TWILIO_AUTH_TOKEN"); + + public static string YOUR_NUMBER = "9879789978"; + public static string HER_NUMBER = "3213213233"; + + static void Main(string[] args) + { + var twilio = new TwilioRestClient(TWILIO_ACCOUNT_SID, AUTH_TOKEN); + + string[] randomMessages = { + "Working hard", + "Gotta ship this feature", + "Someone fucked the system again" + }; + + int randomIndex = new Random().Next(randomMessages.Count()); + String messageToSend = (randomMessages[randomIndex]); + + var message = twilio.SendMessage(YOUR_NUMBER, HER_NUMBER, messageToSend); + Console.WriteLine(message.Sid); + } + } +} diff --git a/R/hangover.R b/R/hangover.R new file mode 100644 index 00000000..44123c01 --- /dev/null +++ b/R/hangover.R @@ -0,0 +1,35 @@ +library(httr) + +today = Sys.Date() + +# skip weekends +if( weekdays(today) %in% c('Saturday','Sunday') ){ + quit() + } + +# exit if no sessions with my username are found +output = system("who", intern = TRUE) +if( !( grep('^my_user_name', output) ) ){ + quit() + } + +# returns 'None' if the key doesn't exist +TWILIO_ACCOUNT_SID = Sys.getenv('TWILIO_ACCOUNT_SID') +TWILIO_AUTH_TOKEN = Sys.getenv('TWILIO_AUTH_TOKEN') + +# Phone numbers +my_number = '+xxx' +number_of_boss= '+xxx' + +excuse = c( + 'Locked out', + 'Pipes broke', + 'Food poisoning', + 'Not feeling well' + ) + +POST(paste("https://api.twilio.com/2010-04-01/Accounts/",TWILIO_ACCOUNT_SID,"/Messages.json",sep=""), + body = list(From=my_number,To=number_of_boss,Body=paste("Gonna work from home. ", sample(excuse,1))), + authenticate(TWILIO_ACCOUNT_SID,TWILIO_AUTH_TOKEN) ) + +print( paste("Message sent at",Sys.time()) ) diff --git a/R/smack_my_bitch_up.R b/R/smack_my_bitch_up.R new file mode 100644 index 00000000..28fd2868 --- /dev/null +++ b/R/smack_my_bitch_up.R @@ -0,0 +1,34 @@ +library(httr) + +today = Sys.Date() + +# skip weekends +if( weekdays(today) %in% c('Saturday','Sunday') ){ + quit() + } + +# exit if no sessions with my username are found +output = system("who", intern = TRUE) +if( !( grep('^my_user_name', output) ) ){ + quit() + } + +# returns 'None' if the key doesn't exist +TWILIO_ACCOUNT_SID = Sys.getenv('TWILIO_ACCOUNT_SID') +TWILIO_AUTH_TOKEN = Sys.getenv('TWILIO_AUTH_TOKEN') + +# Phone numbers +my_number = '+xxx' +her_number = '+xxx' + +reasons = c( + 'Working hard', + 'Gotta ship this feature', + 'Someone fucked the system again' + ) + +POST(paste("https://api.twilio.com/2010-04-01/Accounts/",TWILIO_ACCOUNT_SID,"/Messages.json",sep=""), + body = list(From=my_number,To=her_number,Body=paste("Late at work. ", sample(reasons,1))), + authenticate(TWILIO_ACCOUNT_SID,TWILIO_AUTH_TOKEN) ) + +print( paste("Message sent at",Sys.time()) ) diff --git a/README.md b/README.md index 12d4b995..bfda095d 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ story](https://www.jitbit.com/alexblog/249-now-thats-what-i-call-a-hacker/)_: > xxx: [`hangover.sh`](https://github.com/NARKOZ/hacker-scripts/blob/master/hangover.sh) - another cron-job that is set to specific dates. Sends automated emails like "not feeling well/gonna work from home" etc. Adds a random "reason" from another predefined array of strings. Fires if there are no interactive sessions on the server at 8:45am. -> xxx: (and the oscar goes to) [`fucking-coffee.sh`](https://github.com/NARKOZ/hacker-scripts/blob/master/fucking-coffee.sh) - this one waits exactly 17 seconds (!), then opens an SSH session to our coffee-machine (we had no frikin idea the coffee machine is on the network, runs linux and has SSHD up and running) and sends some weird gibberish to it. Looks binary. Turns out this thing starts brewing a mid-sized half-caf latte and waits another 24 (!) seconds before pouring it into a cup. The timing is exactly how long it takes to walk to the machine from the dudes desk. +> xxx: (and the oscar goes to) [`fucking-coffee.sh`](https://github.com/NARKOZ/hacker-scripts/blob/master/fucking-coffee.sh) - this one waits exactly 17 seconds (!), then opens a telnet session to our coffee-machine (we had no frikin idea the coffee machine is on the network, runs linux and has a TCP socket up and running) and sends something like `sys brew`. Turns out this thing starts brewing a mid-sized half-caf latte and waits another 24 (!) seconds before pouring it into a cup. The timing is exactly how long it takes to walk to the machine from the dudes desk. > xxx: holy sh*t I'm keeping those @@ -37,22 +37,22 @@ GMAIL_PASSWORD=password ``` For Ruby scripts you need to install gems: -`gem install dotenv twilio gmail` +`gem install dotenv twilio-ruby gmail` ## Cron jobs ```sh -# Runs `smack-my-bitch-up.sh` daily at 9:20 pm. -20 21 * * * /path/to/scripts/smack-my-bitch-up.sh >> /path/to/smack-my-bitch-up.log 2>&1 +# Runs `smack-my-bitch-up.sh` monday to friday at 9:20 pm. +20 21 * * 1-5 /path/to/scripts/smack-my-bitch-up.sh >> /path/to/smack-my-bitch-up.log 2>&1 -# Runs `hangover.sh` daily at 8:45 am. -45 8 * * * /path/to/scripts/hangover.sh >> /path/to/hangover.log 2>&1 +# Runs `hangover.sh` monday to friday at 8:45 am. +45 8 * * 1-5 /path/to/scripts/hangover.sh >> /path/to/hangover.log 2>&1 # Runs `kumar-asshole.sh` every 10 minutes. */10 * * * * /path/to/scripts/kumar-asshole.sh -# Runs `fucking-coffee.sh` hourly from 9am to 6pm. -0 9-18 * * * /path/to/scripts/fucking-coffee.sh +# Runs `fucking-coffee.sh` hourly from 9am to 6pm on weekdays. +0 9-18 * * 1-5 /path/to/scripts/fucking-coffee.sh ``` --- diff --git a/coffee/fucking.coffee b/coffee/fucking.coffee new file mode 100755 index 00000000..8df9dbed --- /dev/null +++ b/coffee/fucking.coffee @@ -0,0 +1,28 @@ +#!/usr/bin/env coffee + +username = 'name' + +host = 'localhost' +port = '3000' +pass = '5555' + +sh = require('child_process').execSync + +# weekend +process.exit 0 if new Date().getDay() in [6, 0] + +# no sessions +process.exit 0 unless new RegExp(username).test sh('who -q').toString() + +conn = require('net').createConnection port, host + +setTimeout -> + conn.write "#{pass}\nsys brew\n" + setTimeout -> + conn.end 'sys pour' + process.exit 0 + , 2 * 1000 +, 1 * 1000 + +# alert +sh 'say come here and take your fucking coffee' diff --git a/fucking_coffee.rb b/fucking_coffee.rb index 29564be8..69a85ab1 100755 --- a/fucking_coffee.rb +++ b/fucking_coffee.rb @@ -1,8 +1,5 @@ #!/usr/bin/env ruby -# Skip on weekends -exit if Time.now.saturday? || Time.now.sunday? - # Exit early if no sessions with my username are found exit unless `who -q`.include? ENV['USER'] diff --git a/go/hangover.go b/go/hangover.go new file mode 100644 index 00000000..12d5d3e2 --- /dev/null +++ b/go/hangover.go @@ -0,0 +1,47 @@ +package main + +import ( + "fmt" + "log" + "math/rand" + "os" + + "github.com/codeskyblue/go-sh" + "github.com/subosito/twilio" +) + +const my_number string = "+xxxxx" +const boss_number string = "+yyyyy" + +func main() { + //exit if sessions with my username are found + _, err := sh.Command("who").Command("grep", "my_username").Output() + if err != nil { + os.Exit(1) + } + + //Grab Twilio ID and token from environment variables + Account_Sid := os.Getenv("TWILIO_ACCOUNT_SID") + Auth_Token := os.Getenv("TWILIO_AUTH_TOKEN") + + //create the reasons slice and append reasons to it + reasons := make([]string, 0) + reasons = append(reasons, + "Locked out", + "Pipes broke", + "Food poisoning", + "Not feeling well") + + // Initialize Twilio client and send message + client := twilio.NewClient(Account_Sid, Auth_Token, nil) + message := fmt.Sprint("Gonna work from home...", reasons[rand.Intn(len(reasons))]) + + params := twilio.MessageParams{ + Body: message, + } + s, resp, err := client.Messages.Send(my_number, boss_number, params) + + if err == nil { + log.Fatal(s, resp, err) + } +} diff --git a/go/smack_my_bitch_up.go b/go/smack_my_bitch_up.go new file mode 100755 index 00000000..41966881 --- /dev/null +++ b/go/smack_my_bitch_up.go @@ -0,0 +1,38 @@ +package main + +import ( + "fmt" + "math/rand" + "os" + "os/exec" + "strings" + "time" +) + +func main() { + output1, err := exec.Command("who").Output() + output2 := os.Getenv("USER") + users := string(output1[:]) + current_user := string(output2[:]) + if !strings.Contains(users, current_user) { + return + } + + reasons := []string{"Working hard", "Gotta ship this feature", "Someone fucked the system again"} + + rand.Seed(time.Now().UTC().UnixNano()) + message := "Late at work. " + reasons[rand.Intn(len(reasons))] + + TWILIO_ACCOUNT_SID := string(os.Getenv("TWILIO_ACCOUNT_SID")) + TWILIO_AUTH_TOKEN := string(os.Getenv("TWILIO_AUTH_TOKEN")) + MY_NUMBER := string(os.Getenv("MY_NUMBER")) + HER_NUMBER := string(os.Getenv("HER_NUMBER")) + + response, err := exec.Command("curl", "-fSs", "-u", TWILIO_ACCOUNT_SID+":"+TWILIO_AUTH_TOKEN, "-d", "From="+MY_NUMBER, "-d", "To="+HER_NUMBER, "-d", "Body="+message, "https://api.twilio.com/2010-04-01/Accounts/"+TWILIO_ACCOUNT_SID+"/Messages").Output() + if err != nil { + fmt.Printf("Failed to send SMS: %s", err) + return + } + + fmt.Printf("Message Sent Successfully with response: %s ", response) +} diff --git a/groovy/fucking_coffee.groovy b/groovy/fucking_coffee.groovy new file mode 100644 index 00000000..7411f3cc --- /dev/null +++ b/groovy/fucking_coffee.groovy @@ -0,0 +1,26 @@ +@Grab(group='org.hidetake', module='groovy-ssh', version='1.1.8') +@GrabExclude('org.codehaus.groovy:groovy-all') +import org.hidetake.groovy.ssh.Ssh + +final def ssh = Ssh.newService() + +final def HOST = '10.10.42.42' +final def USER = 'my_username' +final def PASSWORD = '1234' +final def DELAY = 24 + +ssh.remotes { + webServer { + host = HOST + user = USER + password = PASSWORD + } +} + +ssh.run { + session(ssh.remotes.webServer) { + execute 'sys brew' + execute "sleep ${DELAY}s" + execute 'sys pour' + } +} diff --git a/hangover.rb b/hangover.rb index 400c0d81..8578aaf8 100755 --- a/hangover.rb +++ b/hangover.rb @@ -1,8 +1,5 @@ #!/usr/bin/env ruby -# Skip on weekends -exit if Time.now.saturday? || Time.now.sunday? - # Exit early if sessions with my username are found exit if `who -q`.include? ENV['USER'] diff --git a/hangover.sh b/hangover.sh index fb3b7243..800a182a 100755 --- a/hangover.sh +++ b/hangover.sh @@ -1,12 +1,5 @@ #!/bin/sh -e -DAYOFWEEK=$(date +%u) - -# Skip on weekends -if [ "$DAYOFWEEK" -eq 6 ] || [ "$DAYOFWEEK" -eq 7 ]; then - exit -fi - # Exit early if any session with my username is found if who | grep -wq $USER; then exit diff --git a/java/FuckingCoffee.java b/java/FuckingCoffee.java new file mode 100644 index 00000000..483e124e --- /dev/null +++ b/java/FuckingCoffee.java @@ -0,0 +1,34 @@ +import java.net.*; +import java.io.*; + +public class FuckingCoffee{ + + private static final String MY_USERNAME = "my_username"; + private static final String PASSWORD_PROMPT = "Password: "; + private static final String PASSWORD = "1234"; + private static final String COFFEE_MACHINE_IP = "10.10.42.42"; + private static int DELAY_BEFORE_BREW = 17; + private static int DELAY = 24; + + public static void main(String[] args)throws Exception{ + for(int i = 1; i< args.length ; i++){ + if(!args[i].contains(MY_USERNAME)){ + return; + } + } + Socket telnet = new Socket(COFFEE_MACHINE_IP, 23); + PrintWriter out = new PrintWriter(telnet.getOutputStream(), true); + BufferedReader in = new BufferedReader(new InputStreamReader(telnet.getInputStream())); + Thread.sleep(DELAY_BEFORE_BREW*1000); + if(!in.readLine().equals(PASSWORD_PROMPT)){ + return ; + } + out.println(PASSWORD); + out.println("sys brew"); + Thread.sleep(DELAY*1000); + out.println("sys pour"); + out.close(); + in.close(); + telnet.close(); + } +} diff --git a/java/Hangover.java b/java/Hangover.java new file mode 100644 index 00000000..50177ef6 --- /dev/null +++ b/java/Hangover.java @@ -0,0 +1,44 @@ +import com.twilio.sdk.TwilioRestClient; +import com.twilio.sdk.TwilioRestException; +import com.twilio.sdk.resource.factory.MessageFactory; +import com.twilio.sdk.resource.instance.Message; +import org.apache.http.NameValuePair; +import org.apache.http.message.BasicNameValuePair; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +public class Hangover { + + public static final String ACCOUNT_SID = System.getenv("TWILIO_ACCOUNT_SID"); + public static final String AUTH_TOKEN = System.getenv("TWILIO_AUTH_TOKEN"); + + public static final String YOUR_NUMBER = "1231231231"; + public static final String BOSS_NUMBER = "3213213213"; + + public static void main(String[] args) throws TwilioRestException { + + TwilioRestClient client = new TwilioRestClient(ACCOUNT_SID, AUTH_TOKEN); + + String[] randomMessages = { + "Locked out", + "Pipes broke", + "Food poisoning", + "Not feeling well" + }; + + int randomIndex = new Random().nextInt(randomMessages.length); + String finalMessage = (randomMessages[randomIndex]); + + List params = new ArrayList(); + params.add(new BasicNameValuePair("Body", "Gonna work from home. " + finalMessage)); + params.add(new BasicNameValuePair("From", YOUR_NUMBER)); + params.add(new BasicNameValuePair("To", BOSS_NUMBER)); + + MessageFactory messageFactory = client.getAccount().getMessageFactory(); + Message message = messageFactory.create(params); + System.out.println(message.getSid()); + } +} + diff --git a/java/KumarAsshole.java b/java/KumarAsshole.java new file mode 100644 index 00000000..24471c9e --- /dev/null +++ b/java/KumarAsshole.java @@ -0,0 +1,95 @@ + +import java.io.File; +import java.io.FileInputStream; +import java.util.*; +import java.util.regex.*; + +import javax.mail.*; +import javax.mail.internet.*; +import javax.mail.search.FlagTerm; +//Dependencies- Java mail API + +public class KumarAsshole { + + public static void main(String[] args) { + KumarAsshole asshole = new KumarAsshole(); + asshole.read(); + } + + public void read() { + Properties props = new Properties(); + + + //modify below properties to your details + String host = "smtp.gmail.com"; + String username = "yourmailaddress@example.com goes here"; + String password = "your password goes here "; + String Kumar_mail = "the mail address to be replied to !"; + + try { + + Session session = Session.getDefaultInstance(props, null); + + Store store = session.getStore("imaps"); + store.connect(host, username, password); + + Folder inbox = store.getFolder("inbox"); + inbox.open(Folder.READ_ONLY); + + Message messages[] = inbox.search(new FlagTerm(new Flags(Flags.Flag.SEEN), false)); + + for (int i = 0; i < messages.length; i++) { + + if (messages[i].getFrom()[0].toString().contains(Kumar_mail)) { + + String bodytext = null; + Object content = messages[i].getContent(); + if (content instanceof String) { + bodytext = (String) content; + + } else if (content instanceof Multipart) { + + Multipart mp = (Multipart) content; + + BodyPart bp = mp.getBodyPart(mp.getCount() - 1); + bodytext = (String) bp.getContent(); + + } + + Pattern pattern = Pattern.compile("sorry|help|wrong", Pattern.CASE_INSENSITIVE); + Matcher matcher = pattern.matcher(bodytext); + // check all occurance + + if (matcher.find()) { + + Properties props1 = new Properties(); + Address[] tomail; + + MimeMessage msg = new MimeMessage(session); + msg.setFrom(new InternetAddress(username)); + tomail = messages[i].getFrom(); + String t1 = tomail[0].toString(); + msg.addRecipient(Message.RecipientType.TO, new InternetAddress(t1)); + msg.setSubject("Database fixes"); + msg.setText("No problem. I've fixed it. \n\n Please be careful next time."); + Transport t = null; + t = session.getTransport("smtps"); + t.connect(host, username, password); + t.sendMessage(msg, msg.getAllRecipients()); + + + } + + + } + } + inbox.close(true); + store.close(); + + }catch(Exception e) + { + + e.printStackTrace(); + } + } +} \ No newline at end of file diff --git a/java/SmackMyBitch.java b/java/SmackMyBitch.java new file mode 100644 index 00000000..82f0b0ef --- /dev/null +++ b/java/SmackMyBitch.java @@ -0,0 +1,45 @@ +import com.twilio.sdk.TwilioRestClient; +import com.twilio.sdk.TwilioRestException; +import com.twilio.sdk.resource.factory.MessageFactory; +import com.twilio.sdk.resource.instance.Message; +import org.apache.http.NameValuePair; +import org.apache.http.message.BasicNameValuePair; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +//Pre-requisite apache http and twilio java libraries + + +public class SmackMyBitch { + + public static final String ACCOUNT_SID = System.getenv("TWILIO_ACCOUNT_SID"); + public static final String AUTH_TOKEN = System.getenv("TWILIO_AUTH_TOKEN"); + + public static final String YOUR_NUMBER = "1231231231"; + public static final String HER_NUMBER = "3213213213"; + + public static void main(String[] args) throws TwilioRestException { + + TwilioRestClient client = new TwilioRestClient(ACCOUNT_SID, AUTH_TOKEN); + + String[] randomMessages = { + "Working hard", + "Gotta ship this feature", + "Someone fucked the system again", + }; + + int randomIndex = new Random().nextInt(randomMessages.length); + String finalMessage = (randomMessages[randomIndex]); + + List params = new ArrayList(); + params.add(new BasicNameValuePair("Body", "Late at work. " + finalMessage)); + params.add(new BasicNameValuePair("From", YOUR_NUMBER)); + params.add(new BasicNameValuePair("To", HER_NUMBER)); + + MessageFactory messageFactory = client.getAccount().getMessageFactory(); + Message message = messageFactory.create(params); + System.out.println(message.getSid()); + } +} \ No newline at end of file diff --git a/kumar_asshole.rb b/kumar_asshole.rb index ca5b9f6b..0dc5cb7c 100755 --- a/kumar_asshole.rb +++ b/kumar_asshole.rb @@ -8,14 +8,22 @@ GMAIL_USERNAME = ENV['GMAIL_USERNAME'] GMAIL_PASSWORD = ENV['GMAIL_PASSWORD'] -gmail = Gmail.connect(GMAIL_USERNAME, GMAIL_PASSWORD) -kumars_email = 'kumar.a@example.com' +GMAIL = Gmail.connect(GMAIL_USERNAME, GMAIL_PASSWORD) +KUMARS_EMAIL = 'kumar.a@example.com' DB_NAME_REGEX = /\S+_staging/ KEYWORDS_REGEX = /sorry|help|wrong/i -gmail.inbox.find(:unread, from: kumars_email).each do |email| - if email.body[KEYWORDS_REGEX] && (db_name = email.body[DB_NAME_REGEX]) +def create_reply(subject) + GMAIL.compose do + to KUMARS_EMAIL + subject "RE: #{subject}" + body "No problem. I've fixed it. \n\n Please be careful next time." + end +end + +GMAIL.inbox.find(:unread, from: KUMARS_EMAIL).each do |email| + if email.body.raw_source[KEYWORDS_REGEX] && (db_name = email.body.raw_source[DB_NAME_REGEX]) backup_file = "/home/backups/databases/#{db_name}-" + (Date.today - 1).strftime('%Y%m%d') + '.gz' abort 'ERROR: Backup file not found' unless File.exist?(backup_file) @@ -26,14 +34,6 @@ email.read! email.label('Database fixes') reply = create_reply(email.subject) - gmail.deliver(reply) - end -end - -def create_reply(subject) - gmail.compose do - to kumars_email - subject "RE: #{subject}" - body "No problem. I've fixed it. \n\n Please be careful next time." + GMAIL.deliver(reply) end end diff --git a/nodejs/fucking_coffee.js b/nodejs/fucking_coffee.js new file mode 100644 index 00000000..b30a6b4b --- /dev/null +++ b/nodejs/fucking_coffee.js @@ -0,0 +1,41 @@ +#!/usr/bin/env node + +/* Before running: + npm install telnet-client +*/ + +var exec = require('child_process').exec; +var telnet = require('telnet-client'); + +var me = 'my_username'; + +exec("who", function(error, stdout, stderr) { + + // Exit if no sessions with my username are found + if(stdout.indexOf(me) == -1) + process.exit(/*1*/); + + var coffee_machine_ip = 'xxx.xxx.xxx.xxx'; + var password = 'xxxx'; + var con = new telnet(); + + con.on('ready', function(prompt) { + con.exec('Password: ' + password, function(error, res) { + + // Brew Coffee! + con.exec('sys brew', function(error, res) { + + // Wait for 24s + setTimeout(function() { + + // Pour Coffee! + con.exec('sys pour', function(error, res) { + con.end(); + }); + }, 24000); + }); + }); + }); + + con.connect({host: coffee_machine_ip}); +}); diff --git a/nodejs/fucking_coffee_yo_server.js b/nodejs/fucking_coffee_yo_server.js new file mode 100755 index 00000000..28637c2d --- /dev/null +++ b/nodejs/fucking_coffee_yo_server.js @@ -0,0 +1,83 @@ +#!/usr/bin/env node + +/* Before running: + Setup Yo Callback URL and Yo username for coffee machine: + http://docs.justyo.co/docs/receiving-a-yo-with-the-api +*/ + +var exec = require('child_process').exec; +var telnet = require('telnet-client'); + +var ME = 'my_username'; +var AUTHORIZED_YO_NAMES = [ME]; +var COFFEE_MACHINE_YO_NAME = 'coffeemachine'; + +// These should be same as what you set up in the Yo API +var CALLBACK_URL = 'http://xxx.com'; +var CALLBACK_ENDPOINT = '/coffeemachine'; + +var PORT = '3000'; + +exec("who -q", function(error, stdout, stderr) { + + var express = require('express'); + var coffeeApp = express(); + + // Exit if no sessions with my username are found + if(stdout.indexOf(ME) == -1) + process.exit(1); + + // Got a Yo! + coffeeApp.get(CALLBACK_ENDPOINT, function (req, res) { + + if(req.query.username === undefined) { + // Not a Yo, don't make coffee. + res.sendStatus(401); + } + else if(AUTHORIZED_YO_NAMES.indexOf(req.query.username) == -1) { + // If authorized users didn't Yo, don't make coffee. + res.sendStatus(401); + + console.log(req.query.username + ' YO\'d.') + } + else { + res.sendStatus(200); + + var coffee_machine_ip = 'xxx.xxx.xxx.xxx'; + var password = 'xxxx'; + var con = new telnet(); + + con.on('ready', function(prompt) { + con.exec('Password: ' + password, function(error, res) { + + // Brew Coffee! + con.exec('sys brew', function(error, res) { + + // Wait for 24s + setTimeout(function() { + + // Pour Coffee! + con.exec('sys pour', function(error, res) { + con.end(); + }); + }, 24000); + }); + }); + }); + + con.connect({host: coffee_machine_ip}); + } + }); + + // Not Callback endpoint + coffeeApp.get('/*', function (req, res) { + res.sendStatus(404); + }); + + var coffeeServer = coffeeApp.listen(PORT, CALLBACK_URL, function() { + console.log('Coffee Server listening at %s:%s', + CALLBACK_URL, PORT); + console.log('\nYo Callback URL: %s:%s/%s', + CALLBACK_URL, PORT, CALLBACK_ENDPOINT); + }); +}); diff --git a/nodejs/hangover.js b/nodejs/hangover.js new file mode 100755 index 00000000..2088af3d --- /dev/null +++ b/nodejs/hangover.js @@ -0,0 +1,57 @@ +#!/usr/bin/env node + +/* Before running: + npm install twilio +*/ + +var exec = require('child_process').exec; + +var me = 'my_username'; + +exec("who -q", function(error, stdout, stderr) { + + // Exit if sessions with my username are found + if(stdout.indexOf(me) > -1) + process.exit(1); + + var TWILIO_ACCOUNT_SID = process.env['TWILIO_ACCOUNT_SID']; + var TWILIO_AUTH_TOKEN = process.env['TWILIO_AUTH_TOKEN']; + + // Phone numbers + var MY_NUMBER = '+xxx'; + var BOSS_NUMBER = '+xxx'; + + // Excuses + var excuses = [ + 'Locked out', + 'Pipes broke', + 'Food poisoning', + 'Not feeling well' + ]; + + // Generate BS message + var excuse = excuses[Math.floor(Math.random() * excuses.length)]; + var textMessage = 'Gonna work from home. ' + excuse; + + var client = require('twilio')(TWILIO_ACCOUNT_SID, TWILIO_AUTH_TOKEN); + + // Shoot text + client.messages.create({ + body: textMessage, + to: BOSS_NUMBER, + from: MY_NUMBER + }, function(error, message) { + if(error) + console.log('Failed to send SMS: ' + error.message); + else { + var currentdate = new Date(); + + console.log('Message sent at: '+ (currentdate.getMonth() + 1) + '/' + + currentdate.getDate() + '/' + + currentdate.getFullYear() + ' ' + + currentdate.getHours() + ':' + + currentdate.getMinutes() + ':' + + currentdate.getSeconds() + '| Excuse: ' + excuse); + } + }); +}); diff --git a/nodejs/kumar_asshole.js b/nodejs/kumar_asshole.js new file mode 100755 index 00000000..0276f295 --- /dev/null +++ b/nodejs/kumar_asshole.js @@ -0,0 +1,113 @@ +#!/usr/bin/env node + +/* Before running: + npm install nodemailer + npm install imap + +I realize this is long. IMAP can only fetch emails and nodemailer can only +send. Could try implementing with Gmail Node API later. +*/ + +var GMAIL_USERNAME = process.env['GMAIL_USERNAME']; +var GMAIL_PASSWORD = process.env['GMAIL_PASSWORD']; + +var KUMAR_EMAIL = 'kumar.asshole@example.com'; +var EMAIL = 'No worries mate, be careful next time'; + +// Scan for unread email from Kumar +var Imap = require('imap'); +var imap = new Imap({ + user: GMAIL_USERNAME, + password: GMAIL_PASSWORD, + host: 'imap.gmail.com', + port: 993, + tls: true, + tlsOptions: { rejectUnauthorized: false } +}); + +function openInbox(cb) { + imap.openBox('INBOX', false, cb); +} + +imap.once('ready', function() { + openInbox(function(err, box) { + if (err) + process.exit(1); + + imap.search(['UNSEEN', ['FROM', KUMAR_EMAIL]], + function(err, results) { + + if (err) + process.exit(1); + + // RegEx search for keywords; ignore case + var kumarPattern = new RegExp(/sorry|help|wrong/i); + + // IMAP dumps all headers, so need to parse and get email body + var MailParser = require("mailparser").MailParser; + + var f = imap.fetch(results, {bodies: ''}); + f.on('message', function(msg, seqno) { + msg.on('body', function(stream, info) { + var kumarEmail = ""; + + stream.on('data', function(chunk) { + kumarEmail += chunk.toString('utf8'); + }); + + stream.once('end', function() { + var mailparser = new MailParser(); + mailparser.on("end", function(mail_object){ + + // If the RegEx matches + if(mail_object.text.match(kumarPattern)) { + // Shoot email to Kumar! + var nodemailer = require('nodemailer'); + + // create reusable transporter object using SMTP transport + var transporter = nodemailer.createTransport({ + service: 'Gmail', + auth: { + user: GMAIL_USERNAME, + pass: GMAIL_PASSWORD + } + }); + + // setup e-mail data + var mailOptions = { + from: GMAIL_USERNAME, + to: KUMAR_EMAIL, + subject: 'Database Fixes', + text: EMAIL + }; + + // send mail with defined transport object + transporter.sendMail(mailOptions, function(error, info) { + if(error) + process.exit(1) + }); + } + }); + + mailparser.write(kumarEmail); + mailparser.end(); + }); + }); + + msg.once('end', function() { + // Fetched all unread from kumar + }); + }); + + f.once('error', function(err) { + process.exit(1); + }); + + f.once('end', function() { + imap.end(); + }); + }); + }); +}); + +imap.connect(); diff --git a/nodejs/smack_my_bitch_up.js b/nodejs/smack_my_bitch_up.js new file mode 100755 index 00000000..ebc47ead --- /dev/null +++ b/nodejs/smack_my_bitch_up.js @@ -0,0 +1,56 @@ +#!/usr/bin/env node + +/* Before running: + npm install twilio +*/ + +var exec = require('child_process').exec; + +var me = 'my_username'; + +exec("who -q", function(error, stdout, stderr) { + + // Exit if no sessions with my username are found + if(stdout.indexOf(me) == -1) + process.exit(1); + + var TWILIO_ACCOUNT_SID = process.env['TWILIO_ACCOUNT_SID']; + var TWILIO_AUTH_TOKEN = process.env['TWILIO_AUTH_TOKEN']; + + // Phone numbers + var MY_NUMBER = '+xxx'; + var HER_NUMBER = '+xxx'; + + // Reasons + var reasons = [ + 'Working hard', + 'Gotta ship this feature', + 'Someone fucked the system again' + ]; + + // Generate BS message + var reason = reasons[Math.floor(Math.random() * reasons.length)]; + var textMessage = 'Late at work. ' + reason; + + var client = require('twilio')(TWILIO_ACCOUNT_SID, TWILIO_AUTH_TOKEN); + + // Shoot text + client.messages.create({ + body: textMessage, + to: HER_NUMBER, + from: MY_NUMBER + }, function(error, message) { + if(error) + console.log('Failed to send SMS: ' + error.message); + else { + var currentdate = new Date(); + + console.log('Message sent at: '+ (currentdate.getMonth() + 1) + '/' + + currentdate.getDate() + '/' + + currentdate.getFullYear() + ' ' + + currentdate.getHours() + ':' + + currentdate.getMinutes() + ':' + + currentdate.getSeconds() + '| Excuse: ' + reason); + } + }); +}); diff --git a/perl/fucking-coffee.pl b/perl/fucking-coffee.pl new file mode 100755 index 00000000..bc08054d --- /dev/null +++ b/perl/fucking-coffee.pl @@ -0,0 +1,49 @@ +#!/usr/bin/perl + +use strict; +use warnings; + +use DateTime; +use YAML; +use Net::Telnet; + +# Config +my $conf = Load( <<'...' ); +--- +coffee_machine_ip: 10.10.42.42 +password: 1234 +password_prompt: Password: +delay_before_brew: 17 +delay: 24 +... + +# Skip on weekends +my $date = DateTime->now; +if ( $date->day_of_week >= 6 ) { + exit; +} + +# Exit early if no sessions with my username are found +open( my $cmd_who, '-|', 'who' ) || die "Cannot pipe who command ". $!; + +my @sessions = grep { + m/$ENV{'USER'}/ +} <$cmd_who>; + +close $cmd_who; + +exit if ( scalar( @sessions ) == 0 ); + +sleep $conf->{'delay_before_brew'}; + +my $con = Net::Telnet->new( + 'Host' => $conf->{'coffee_machine_ip'}, +); + +$con->watifor( $conf->{'password_prompt'} ); +$con->cmd( $conf->{'password'} ); +$con->cmd( 'sys brew' ); +sleep $conf->{'delay'}; +$con->cmd( 'sys pour' ); +$con->close; + diff --git a/perl/hangover.pl b/perl/hangover.pl new file mode 100755 index 00000000..dda41a95 --- /dev/null +++ b/perl/hangover.pl @@ -0,0 +1,73 @@ +#!/usr/bin/perl + +use strict; +use warnings; + +use DateTime; +use SMS::Send; +use YAML; + +# Config +my $conf = Load( <<'...' ); +--- +phone_numbers: + my_number: +15005550006 + boss_number: +xxx +reasons: + - Locked out + - Pipes broke + - Food poisoning + - Not feeling well +... + +my $date = DateTime->now; + +# Skip on weekends +if ( $date->day_of_week >= 6 ) { + exit; +} + +# Exit early if no sessions with my username are found +open( my $cmd_who, '-|', 'who' ) || die "Cannot pipe who command ". $!; + +my @sessions = grep { + m/$ENV{'USER'}/ +} <$cmd_who>; + +close $cmd_who; + +exit if ( scalar( @sessions ) == 0 ); + +# Load Twilio API config +open( my $env, '<', '../.env' ) || die "Cannot find .env file in project root."; +LINE: while ( my $line = <$env> ) { + next LINE unless ( $line =~ m/^(TWILIO[^=]+)=(.*)(?:[\n\r]*)/ ); + $conf->{'env'}->{ $1 } = $2; +} + +close $env; + +# Randomize excuse +my $reason_number = int( rand( scalar( @{ $conf->{'reasons'} } ) ) ); +my $sms_text = "Gonna work from home. ". $conf->{'reasons'}[ $reason_number ]; + +# Create an object. There are three required values: +my $sender = SMS::Send->new('Twilio', + _accountsid => $conf->{'env'}->{'TWILIO_ACCOUNT_SID'}, + _authtoken => $conf->{'env'}->{'TWILIO_AUTH_TOKEN'}, + _from => $conf->{'phone_numbers'}->{'my_number'}, +); + +# Send a message to me +my $sent = $sender->send_sms( + text => $sms_text, + to => $conf->{'phone_numbers'}->{'boss_number'}, +); + +# Did it send? +if ( $sent ) { + print "Sent message.\n"; +} else { + print "Message failed.\n"; +} + diff --git a/perl/kumar-asshole.pl b/perl/kumar-asshole.pl new file mode 100755 index 00000000..af7a4d83 --- /dev/null +++ b/perl/kumar-asshole.pl @@ -0,0 +1,88 @@ +#!/usr/bin/perl + +use strict; +use warnings; + +use YAML; +use DateTime; +use Mail::Webmail::Gmail; + +# Config +my $conf = Load( <<'...' ); +--- +kumar_mail: kumar.a@example.com +database_regex: \S+_staging +keywords_regex: sorry|help|wrong +backup_path: /home/backups/databases/ +... +$conf->{'database_regex'} = qr/ ( $conf->{'database_regex'} ) /x; +$conf->{'keywords_regex'} = qr/ ( $conf->{'keywords_regex'} ) /x; + +my $date = DateTime->now->subtract( + 'days' => 1 +); + +# Load GMail API config +open( my $env, '<', '../.env' ) || die "Cannot find .env file in project root."; +LINE: while ( my $line = <$env> ) { + next LINE unless ( $line =~ m/^(GMAIL[^=]+)=(.*)(?:[\n\r]*)/ ); + $conf->{'env'}->{ $1 } = $2; +} + +close $env; + +my $gmail = Mail::Webmail::Gmail->new( + username => $conf->{'env'}->{'GMAIL_USERNAME'}, + password => $conf->{'env'}->{'GMAIL_PASSWORD'}, + encrypt_session => 1, +); + +my $messages = $gmail->get_messages( label => $Mail::Webmail::Gmail::FOLDERS{ 'INBOX' } ); +die "Cannot fetch emails: ". $gmail->error_msg(); + +MESSAGE: foreach my $message ( @{ $messages } ) { + unless ( + ( $message->{ 'new' } ) + && ( $message->{'sender_email'} eq $conf->{'kumars_email'} ) + && ( $message->{'body'} =~ m/$conf->{'keywords_regex'}/ ) + && ( $message->{'body'} =~ m/$conf->{'database_regex'}/ ) + ) { + print "Skipping mail from=[". $message->{'sender_email'}."] subject=[". $message->{'subject'} ."]\n"; + next MESSAGE; + } + exit 1; + + my $database = $1; + my $backup_file = $conf->{'backup_path'} . $database .'-'. $date->ymd() .'.gz'; + + unless ( -f $backup_file ) { + die 'Cannot find backup file=['. $backup_file ."]\n"; + } + + print 'Restoring database=['. $database .'] from day=['. $date->ymd() .'] from file=['. $backup_file ."]\n"; + + # Restore DB + system( 'gunzip -c '. $backup_file .' | psql '. $database ); + die "Error while restoring the database=[". $database ."] from file=[". $backup_file ."]" if ( $? >> 8 ); + + # Mark as read, add label, reply + $gmail->edit_labels( + 'label' => 'Database fixes', + 'action' => 'add', + 'msgid' => $message->{'id'} + ); + + $gmail->send_message( + 'to' => $conf->{'kumars_email'}, + 'subject' => 'RE: '. $message->{'subject'}, + 'msgbody' => "No problem. I've fixed it. \n\n Please be careful next time.", + ); + + $gmail->edit_labels( + 'label' => 'unread', + 'action' => 'remove', + 'msgid' => $message->{'id'} + ); + +} + diff --git a/perl/smack-my-bitch-up.pl b/perl/smack-my-bitch-up.pl new file mode 100755 index 00000000..47075186 --- /dev/null +++ b/perl/smack-my-bitch-up.pl @@ -0,0 +1,72 @@ +#!/usr/bin/perl + +use strict; +use warnings; + +use DateTime; +use SMS::Send; +use YAML; + +# Config +my $conf = Load( <<'...' ); +--- +phone_numbers: + my_number: +15005550006 + her_number: +xxx +reasons: + - Working hard + - Gotta ship this feature + - Someone fucked the system again +... + +my $date = DateTime->now; + +# Skip on weekends +if ( $date->day_of_week >= 6 ) { + exit; +} + +# Exit early if no sessions with my username are found +open( my $cmd_who, '-|', 'who' ) || die "Cannot pipe who command ". $!; + +my @sessions = grep { + m/$ENV{'USER'}/ +} <$cmd_who>; + +close $cmd_who; + +exit if ( scalar( @sessions ) == 0 ); + +# Load Twilio API config +open( my $env, '<', '../.env' ) || die "Cannot find .env file in project root."; +LINE: while ( my $line = <$env> ) { + next LINE unless ( $line =~ m/^(TWILIO[^=]+)=(.*)(?:[\n\r]*)/ ); + $conf->{'env'}->{ $1 } = $2; +} + +close $env; + +# Randomize excuse +my $reason_number = int( rand( scalar( @{ $conf->{'reasons'} } ) ) ); +my $sms_text = "Late at work. ". $conf->{'reasons'}[ $reason_number ]; + +# Create an object. There are three required values: +my $sender = SMS::Send->new('Twilio', + _accountsid => $conf->{'env'}->{'TWILIO_ACCOUNT_SID'}, + _authtoken => $conf->{'env'}->{'TWILIO_AUTH_TOKEN'}, + _from => $conf->{'phone_numbers'}->{'my_number'}, +); + +# Send a message to me +my $sent = $sender->send_sms( + text => $sms_text, + to => $conf->{'phone_numbers'}->{'her_number'}, +); + +# Did it send? +if ( $sent ) { + print "Sent message.\n"; +} else { + print "Message failed.\n"; +} + diff --git a/php/composer.json b/php/composer.json new file mode 100644 index 00000000..e0f86d86 --- /dev/null +++ b/php/composer.json @@ -0,0 +1,7 @@ +{ + "require": { + "bestnetwork/telnet": "^1.0", + "vlucas/phpdotenv": "^2.0", + "twilio/sdk": "^4.6" + } +} diff --git a/php/fucking_coffee.php b/php/fucking_coffee.php new file mode 100644 index 00000000..074e22fe --- /dev/null +++ b/php/fucking_coffee.php @@ -0,0 +1,14 @@ +#!/usr/bin/env php +execute('1234', 'Password: '); +$con->execute('sys brew'); +sleep(24); +$con->execute('sys pour'); diff --git a/php/hangover.php b/php/hangover.php new file mode 100644 index 00000000..a660c4c0 --- /dev/null +++ b/php/hangover.php @@ -0,0 +1,21 @@ +#!/usr/bin/env php +load(); +(strpos(exec('who'), getenv('USER')) === false) or exit('session found'); + +$my_number = '+xxx'; +$number_of_boss = '+xxx'; +$excuse = ['Locked out', 'Pipes broke', 'Food poisoning', 'Not feeling well']; +$excuse = $excuse[array_rand($excuse)]; + +$twilio = new Services_Twilio(getenv('TWILIO_ACCOUNT_SID'), getenv('TWILIO_AUTH_TOKEN')); +$twilio->account->messages->sendMessage( + $my_number, + $number_of_boss, + "Gonna work from home. {$excuse}" +); + +echo "Message sent at: #".date('Y-m-d')." | Excuse: {$excuse}"; diff --git a/php/smack_my_bitch_up.php b/php/smack_my_bitch_up.php new file mode 100644 index 00000000..f1fc68fb --- /dev/null +++ b/php/smack_my_bitch_up.php @@ -0,0 +1,32 @@ +#!/usr/bin/env php +load(); + +(strpos(exec('who'), getenv('USER')) !== false) or exit('no session'); + +// Phone numbers +$my_number = '+xxx'; +$her_number = '+xxx'; + +$reasons = [ + 'Working hard', + 'Gotta ship this feature', + 'Someone fucked up the system again' +]; + +$rand = rand(0,count($reasons)-1); +$random_reason = $reasons[$rand]; + +$message = 'Late at work. '.$random_reason; + +// Send a text message +$twilio = new Services_Twilio(getenv('TWILIO_ACCOUNT_SID'), getenv('TWILIO_AUTH_TOKEN')); +$twilio->account->messages->sendMessage( + $my_number, + $her_number, + $message +); + +echo 'Message sent at: #'.date('Y-m-d').' | Reason: '.$random_reason; diff --git a/powershell/fucking_coffee.psm1 b/powershell/fucking_coffee.psm1 new file mode 100644 index 00000000..980eb621 --- /dev/null +++ b/powershell/fucking_coffee.psm1 @@ -0,0 +1,62 @@ +<# +.SYNOPSIS + Simple script to connect to a coffee part using TelNet then issue specific commands that + brew and pour a cup of coffee for the user. +.DESCRIPTION + This script was converted using the ruby version of the fucking_coffee script. In this script, + I left the use of environment variables since its only use was to determine if the user was + still logged in to the system. Per issue #42 (https://github.com/NARKOZ/hacker-scripts/issues/42) + I left the password string hard coded until a decision is made by NARKOZ, the project owner, as + to how the information should be stored. +.OUTPUT + None +.NOTES + Author: Tyler Hughes + Twitter: @thughesIT + Blog: http://tylerhughes.info/ + + Changelog: + 1.0 Initial Release +#> + +Function Fucking-Coffee +{ + # Exit early if no sessions with my username are found + if ($env:Username.Count > 0) { + return + } + + $coffee_machine_ip = '10.10.42.42' + $password = '1234' + + Start-Sleep -s 17 + + $socket = New-Object System.Net.Sockets.TcpClient($coffee_machine_ip) + if ($socket) { + $stream = $connection.GetStream() + $Writer = New-Object System.IO.StreamWriter($Stream) + $Buffer = New-Object System.Byte[] 1024 + $Encoding = New-Object System.Text.AsciiEncoding + + # Start issuing the commands + Send-TelNetCommands($Writer, $password, 1) + Send-TelNetCommands($Writer, "sys brew", 24) + Send-TelNetCommands($Writer, "sys pour", 4) + + $socket.Close() + } +} + +Function Send-TelNetCommands +{ + Param ( + [Parameter(ValueFromPipeline=$false)] + [System.IO.StreamWriter]$writer, + [String]$command, + [int]$WaitTime + ) + + $writer.WriteLine($command) + $writer.Flush() + Start-Sleep -Milliseconds $WaitTime +} diff --git a/powershell/hangover.psm1 b/powershell/hangover.psm1 new file mode 100644 index 00000000..fabb13fd --- /dev/null +++ b/powershell/hangover.psm1 @@ -0,0 +1,64 @@ +<# +.SYNOPSIS + Simple script to SMS a supervisor informing them you will be working from home + on the day this script is used. +.DESCRIPTION + This script was converted using the ruby version of the hangover script. However, the ruby + version used environment variables to hold the user's account information. Due to issue #42 + (https://github.com/NARKOZ/hacker-scripts/issues/42) I opted to hard code the strings at + this time until a decision is made by NARKOZ, the project owner, as the how the information + should be stored. + + This script also uses Twilio to send the SMS messages. The from number MUST be a valid Twilio + phone number. The to number can be any outgoing number. +.OUTPUT + This script will output an error message to the PowerShell window if it fails + to send the message. +.NOTES + Author: Tyler Hughes + Twitter: @thughesIT + Blog: http://tylerhughes.info/ + + Changelog: + 1.0 Initial Release +#> +Function Hangover +{ + # Phone numbers (Must include country code and area code) + $from = '+XXXXXXXXXXX' + $to = '+XXXXXXXXXXX' + + # Twilio API Information + $twilio_base_url = 'https://api.twilio.com/2010-04-01' + $twilio_account_sid = 'XXXXXXXXXXXXXXXXXXX' + $twilio_auth_token = 'XXXXXXXXXXXXXXXXXX' + + $password = ConvertTo-SecureString -AsPlainText $twilio_auth_token -Force + $credentials = New-Object System.Management.Automation.PSCredential($twilio_account_sid, $password) + + # Get the message to send + $excuses = + 'Locked out', + 'Pipes broke', + 'Food poisoning', + 'Not feeling well' + + $excuse = $excuses | Get-Random + $message = "$excuse. Going to work from home today." + $body = @{ + From = $from; + To = $to; + Body = $message; + } + + # Send the message and log any errors + $uri = "$twilio_base_url/Accounts/" + $credentials.UserName + "/SMS/Messages" + + try { + $response = Invoke-RestMethod -Method Post -Uri $uri -Body $body -Credential $credentials + } + catch { + $time = Get-Date -format u + Write-Host $time " - Failed to send message: " $message + } +} \ No newline at end of file diff --git a/powershell/smack_my_bitch_up.ps1 b/powershell/smack_my_bitch_up.ps1 new file mode 100644 index 00000000..903bd5cd --- /dev/null +++ b/powershell/smack_my_bitch_up.ps1 @@ -0,0 +1,38 @@ +$DAYOFWEEK = (Get-Date).DayOfWeek.value__; + +# Skip on weekends +if ($DAYOFWEEK -eq 6 -or $DAYOFWEEK -eq 7) { + return +} + +# Exit early if no sessions with my username are found +if (-not (QWINSTA | FINDSTR $env:USERNAME)) { + return +} + +# Phone numbers +$MY_NUMBER='+xxx' +$HER_NUMBER='+xxx' + +$REASONS = + 'Working hard', + 'Gotta ship this feature', + 'Someone fucked the system again' +$reason = $REASONS | Get-Random +$message = "Late at work. $reason." + +$API_URL = "https://api.twilio.com/2010-04-01/Accounts/$env:TWILIO_ACCOUNT_SID/Messages" +$BASE64AUTHINFO = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $env:TWILIO_ACCOUNT_SID,$env:TWILIO_AUTH_TOKEN))) +$body = @{ + From = $MY_NUMBER; + To = $HER_NUMBER; + Body = $message; +} + +#Send a text message and Log errors +try{ + Invoke-RestMethod -Method Post -Headers @{Authorization=("Basic {0}" -f $BASE64AUTHINFO)} $API_URL -Body $body > $null +} +catch{ + Write-Host "Failed to send SMS: $_" +} diff --git a/python/fucking_coffee.py b/python/fucking_coffee.py index a510b028..c19572f3 100755 --- a/python/fucking_coffee.py +++ b/python/fucking_coffee.py @@ -1,17 +1,10 @@ #!/usr/bin/env python -import datetime import sys import subprocess import telnetlib import time -today = datetime.date.today() - -# skip weekends -if today.strftime('%A') in ('Saturday', 'Sunday'): - sys.exit() - # exit if no sessions with my username are found output = subprocess.check_output('who') if 'my_username' not in output: diff --git a/python/hangover.py b/python/hangover.py index bf923d84..b1903cd9 100755 --- a/python/hangover.py +++ b/python/hangover.py @@ -1,18 +1,11 @@ #!/usr/bin/env python -import datetime import os import random from twilio.rest import TwilioRestClient from time import strftime import subprocess -today = datetime.date.today() - -# skip weekends -if today.strftime('%A') in ('Saturday', 'Sunday'): - sys.exit() - # exit if sessions with my username are found output = subprocess.check_output('who') if 'my_username' in output: @@ -41,17 +34,4 @@ body="Gonna work from home. " + random.choice(excuses) ) -try: - f = open('logs/file.txt', 'a') -except IOError as e: - # dir & file don't exist; create them - os.mkdir('logs') - f = open('logs/file.txt', 'a') -except Exception as e: - print e -else: - pass - -# log it -f.write("Message sent at " + strftime("%a, %d %b %Y %H:%M:%S") + "\n") -f.close() +print "Message sent at " + strftime("%a, %d %b %Y %H:%M:%S") diff --git a/python/kumar_asshole.py b/python/kumar_asshole.py index 36f5f67a..6e95d7df 100755 --- a/python/kumar_asshole.py +++ b/python/kumar_asshole.py @@ -12,7 +12,7 @@ if not g.logged_in: sys.exit() -msgs = g.inbox().mail(sender="kumar.a@example.com", unread=True) +msgs = g.inbox().mail(sender="kumar.a@example.com", unread=True, prefetch=True) pattern = re.compile("\bsorry\b | \bhelp\b | \bwrong\b ", flags=re.I) diff --git a/python/smack_my_bitch_up.py b/python/smack_my_bitch_up.py index 398c8815..17bd3216 100755 --- a/python/smack_my_bitch_up.py +++ b/python/smack_my_bitch_up.py @@ -1,6 +1,5 @@ #!/usr/bin/env python -import datetime import os import random from twilio.rest import TwilioRestClient @@ -8,13 +7,6 @@ import sys from time import strftime - -today = datetime.date.today() - -# skip weekends -if today.strftime('%A') == 'Saturday' || today('%A') == 'Sunday': - sys.exit() - # exit if no sessions with my username are found output = subprocess.check_output('who') if 'my_username' not in output: @@ -25,7 +17,7 @@ TWILIO_AUTH_TOKEN = os.environ.get('TWILIO_AUTH_TOKEN') # Phone numbers -my_number = '+xxx' +my_number = '+xxx' her_number = '+xxx' reasons = [ @@ -38,21 +30,8 @@ client.messages.create( to=her_number, - from=my_number, + from_=my_number, body="Late at work. " + random.choice(reasons) ) -try: - f = open('logs/file.txt', 'a') -except IOError as e: - # dir & file don't exist; create them - os.mkdir('logs') - f = open('logs/file.txt', 'a') -except Exception as e: - print e -else: - pass - -# log it -f.write("Message sent at " + strftime("%a, %d %b %Y %H:%M:%S") + "\n") -f.close() +print "Message sent at " + strftime("%a, %d %b %Y %H:%M:%S") diff --git a/python3/fucking_coffee.py b/python3/fucking_coffee.py index e213a3d0..0268b79a 100755 --- a/python3/fucking_coffee.py +++ b/python3/fucking_coffee.py @@ -1,7 +1,6 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- -import datetime import telnetlib import time @@ -13,10 +12,6 @@ def main(): - # Skip on weekends. - if datetime.date.today().weekday() in (0, 6,): - return - # Exit early if no sessions with my_username are found. if not any(s.startswith(b'my_username ') for s in sh('who').split(b'\n')): return diff --git a/python3/hangover.py b/python3/hangover.py index 744b9593..25ac0faa 100755 --- a/python3/hangover.py +++ b/python3/hangover.py @@ -1,7 +1,6 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- -import datetime import random from twilio import TwilioRestException @@ -18,10 +17,6 @@ def main(): - # Skip on weekends. - if datetime.date.today().weekday() in (0, 6,): - return - # Exit early if any session with my_username is found. if any(s.startswith(b'my_username ') for s in sh('who').split(b'\n')): return diff --git a/python3/smack_my_bitch_up.py b/python3/smack_my_bitch_up.py index dce950d8..f160c1c0 100755 --- a/python3/smack_my_bitch_up.py +++ b/python3/smack_my_bitch_up.py @@ -1,7 +1,6 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- -import datetime import random from twilio import TwilioRestException @@ -18,10 +17,6 @@ def main(): - # Skip on weekends. - if datetime.date.today().weekday() in (0, 6,): - return - # Exit early if no sessions with my_username are found. if not any(s.startswith(b'my_username ') for s in sh('who').split(b'\n')): return diff --git a/scala/fucking-coffee.scala b/scala/fucking-coffee.scala new file mode 100644 index 00000000..b40d0834 --- /dev/null +++ b/scala/fucking-coffee.scala @@ -0,0 +1,45 @@ +/******************************************* + * + * Get Ammonite (http://lihaoyi.github.io/Ammonite/#Ammonite-Shell): + * $ mkdir ~/.ammonite; curl -L -o ~/.ammonite/predef.scala http://git.io/vR04f + * $ curl -L -o amm http://git.io/vR08A; chmod +x amm + * + * Run script + * $ ./amm fucking-coffee.scala + * + *******************************************/ + +import java.net._ +import java.io._ +import ammonite.ops._ +import ammonite.ops.ImplicitWd._ + +val coffeeMachineIP = "10.10.42.42" +val password = "1234" +val passwordPrompt = "Password: " +val delayBeforeBrew = 17 +val delay = 24 + +if ((%%who "-q").out.string.contains(sys.props("user.name"))) { + + val telnet = new Socket(coffeeMachineIP, 23) + val out = new PrintWriter(telnet.getOutputStream, true) + val in = new BufferedReader(new InputStreamReader(telnet.getInputStream)) + + println(s"Wait for $delayBeforeBrew seconds") + Thread.sleep(delayBeforeBrew * 1000); + + if(in.readLine == passwordPrompt){ + out.println(password) + + out.println("sys brew") + Thread.sleep(delay * 1000) + out.println("sys pour") + + } + + out.close() + in.close() + telnet.close() + +} \ No newline at end of file diff --git a/smack-my-bitch-up.sh b/smack-my-bitch-up.sh index b0bf6b19..cc0547c1 100755 --- a/smack-my-bitch-up.sh +++ b/smack-my-bitch-up.sh @@ -1,12 +1,5 @@ #!/bin/sh -e -DAYOFWEEK=$(date +%u) - -# Skip on weekends -if [ "$DAYOFWEEK" -eq 6 ] || [ "$DAYOFWEEK" -eq 7 ]; then - exit -fi - # Exit early if no sessions with my username are found if ! who | grep -wq $USER; then exit diff --git a/smack_my_bitch_up.rb b/smack_my_bitch_up.rb index 06596e83..b81a3349 100755 --- a/smack_my_bitch_up.rb +++ b/smack_my_bitch_up.rb @@ -1,10 +1,7 @@ #!/usr/bin/env ruby -# Skip on weekends -exit if Time.now.saturday? || Time.now.sunday? - # Exit early if no sessions with my username are found -exit if `who -q`.include? ENV['USER'] +exit unless `who -q`.include? ENV['USER'] require 'dotenv' require 'twilio-ruby'