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 bfda095d..00d6deef 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,6 @@ + +English | [简体中文](./README.zh-CN.md) + # Hacker Scripts Based on a _[true @@ -19,7 +22,7 @@ story](https://www.jitbit.com/alexblog/249-now-thats-what-i-call-a-hacker/)_: > xxx: holy sh*t I'm keeping those -Original: http://bash.im/quote/436725 (in Russian) +Original: http://bash.im/quote/436725 (in Russian) (Archive.org [link](https://web.archive.org/web/20210226092253/http://bash.im/quote/436725)) Pull requests with other implementations (Python, Perl, Shell, etc) are welcome. ## Usage diff --git a/README.zh-CN.md b/README.zh-CN.md new file mode 100644 index 00000000..b3f184d6 --- /dev/null +++ b/README.zh-CN.md @@ -0,0 +1,59 @@ +# Hacker Scripts + +根据 *[真实故事](https://www.jitbit.com/alexblog/249-now-thats-what-i-call-a-hacker/)* 改编: + +> xxx: 是这样的,我们的构建工程师离职去了另外一家公司,这货基本算是生活在终端里。 你知道么,这人热爱Vim,用Dot作图,甚至用MarkDown来写维基帖子...,如果有什么事情要花上他超过90秒,他一定会整个脚本来让这件事变得“自动化”。 + +> xxx: 我们现在坐在他的工位上,看着他留下来的这些,呃,“遗产”? + +> xxx: 我觉得你们会喜欢这些的 + +> xxx: [`smack-my-bitch-up.sh(拍老婆马屁脚本)`](https://github.com/NARKOZ/hacker-scripts/blob/master/smack-my-bitch-up.sh) - 它会给他的老婆(很明显是他老婆)发送一条“今晚要加班了”的短信,再自动从文本库中随机地选择一条理由。这个脚本被设置为定时触发,而且只有在工作日晚9点以后,服务器上还有他登陆的SSH进程在运行时才会执行。 + +> xxx: [`kumar-asshole.sh(库马尔个傻*)`](https://github.com/NARKOZ/hacker-scripts/blob/master/kumar-asshole.sh) - 这个脚本会自动扫描邮箱,如果发现其中有库马尔(库马尔是我们客户公司的一位数据库管理员)发来的邮件,就会在其中寻找关键字如“求助”,“遇到麻烦了”,“抱歉”等等,如果发现了这些关键字,这个脚本会通过SSH连接上客户公司的服务器,把中间数据库(staging database)回滚到最新一次的可用备份。然后它会给邮件发送回复,“没事了哥们,下次小心点哈”。 + +> xxx: [`hangover.sh(宿醉)`](https://github.com/NARKOZ/hacker-scripts/blob/master/hangover.sh) - 同样是个定时执行的任务,被设置为在特定日期触发,它会自动发送诸如“今天不太舒服”或“今天我在家上班”之类的邮件,同样会从文本库里随机选取一条理由。这个任务会在工作日清晨8点45分以后服务器上仍然没有可交互的SSH进程时真正执行。 + +> xxx: (最牛的就是接下来这个) [`fucking-coffee.sh(**的咖啡)`](https://github.com/NARKOZ/hacker-scripts/blob/master/fucking-coffee.sh) - 这个脚本在启动之后,会先等待恰好17秒(!),然后启动一个登录进程连接到我们的咖啡机(淦,我们之前完全不知道我们的咖啡机是联网的,上面还运行着Linux系统,甚至还跑着TCP socket连接!),然后它会发送类似“系统!开始煮咖啡!”之类的消息,结果这条消息会让咖啡机开始工作,煮一杯 中杯大小、半咖啡因的拿铁,再等待恰好24秒(!)后,才倒进咖啡杯里。这些时间加起来刚好就是这位程序员从自己的工位走到机器前要的时间。 + +> xxx: 天了噜我要把这些保留下来。 + +原文: http://bash.im/quote/436725 (俄语) + +欢迎使用其它语言来实现 (Python, Perl, Shell等等)并提交PR。 + +## 用法 + +你需要以下这些环境变量: + +```bash +# used in `smack-my-bitch-up` and `hangover` scripts +TWILIO_ACCOUNT_SID=ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxx +TWILIO_AUTH_TOKEN=yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy + +# used in `kumar_asshole` script +GMAIL_USERNAME=admin@example.org +GMAIL_PASSWORD=password +``` + +为了执行Ruby脚本,你需要安装gems: `gem install dotenv twilio-ruby gmail` + +## 定时任务 + +```bash +# 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` 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 on weekdays. +0 9-18 * * 1-5 /path/to/scripts/fucking-coffee.sh +``` + +------ + +代码的使用遵循WTFPL(Do What The Fuck You Want To Public License)协议。 diff --git a/clojure/coffee.clj b/clojure/coffee.clj new file mode 100644 index 00000000..96d87eb2 --- /dev/null +++ b/clojure/coffee.clj @@ -0,0 +1,39 @@ +(ns hacker-scripts.coffee + (:require [environ.core :refer [env]]) + (:import + (java.net Socket) + (java.io BufferedReader PrintWriter InputStreamReader))) + +(def my-username "my-username") +(def my-password "my-password") + +(def coffee-machine-ip "10.10.42.42") +(def password-prompt "Password: ") +(def connection-port 23) + +(def sec-delay-before-brew 17) +(def sec-delay-before-pour 24) + +(defn logged-in? [] (= (:USER env) my-username)) + +(defn auth [in-stream out-stream] + (if (= (.readLine in-stream) password-prompt) + (.println out-stream my-password) + (throw (RuntimeException. + "Failed to authenticate with coffee machine")))) + +(defn command-brew-pour [out-stream] + (do + (Thread/sleep (* 1000 sec-delay-before-brew)) + (.println out-stream "sys brew") + (Thread/sleep (* 1000 sec-delay-before-pour)) + (.println out-stream "sys pour"))) + +(defn coffee [] + (if (logged-in?) + (with-open [socket (Socket. coffee-machine-ip connection-port) + out-stream (PrintWriter. (.getOutputStream socket) true) + in-stream (BufferedReader. (InputStreamReader. (.getInputStream socket)))] + (do + (auth in-stream out-stream) + (command-brew-pour out-stream))))) diff --git a/clojure/hangover.clj b/clojure/hangover.clj new file mode 100644 index 00000000..7a71372a --- /dev/null +++ b/clojure/hangover.clj @@ -0,0 +1,28 @@ +(ns hacker-scripts.hangover + (:import + (com.twilio Twilio) + (com.twilio.rest.api.v2010.account Message) + (com.twilio.type PhoneNumber))) + +(def acc-sid "my twilio account SID") +(def acc-tkn "my twilio secret token") + +(def my-num (PhoneNumber. "+10001112222")) +(def boss-num (PhoneNumber. "+19998887777")) + +(def reasons ["Receiving delivery" + "Waiting for repairman" + "Nasty cold"]) + +(defn twilio-init [] + (Twilio/init acc-sid acc-tkn)) + +(defn send-sms [to-num from-num message] + (.. Message (creator to-num from-num message) create)) + +(def send-sms-boss (partial send-sms boss-num my-num)) + +(defn hangover [] + (twilio-init) + (let [message (rand-nth reasons)] + (send-sms-boss message))) diff --git a/clojure/kumar.clj b/clojure/kumar.clj new file mode 100644 index 00000000..e406ce95 --- /dev/null +++ b/clojure/kumar.clj @@ -0,0 +1,68 @@ +(ns hacker-scripts.kumar + (:import + (java.util Properties) + (javax.mail Session Authenticator PasswordAuthentication Message$RecipientType Transport Folder Flags Flags$Flag) + (javax.mail.internet MimeMessage InternetAddress) + (javax.mail.search FlagTerm FromTerm AndTerm OrTerm SubjectTerm BodyTerm SearchTerm))) + +(def host "smtp.gmail.com") +(def my-email "my-email@gmail.com") +(def my-password "my-gmail-password") +(def kumar-email "kumar@gmail.com") + +(def seen-flag (Flags. (Flags$Flag/SEEN))) + +(def unread-term (FlagTerm. seen-flag false)) + +(defn get-session [] + (let [authenticator (proxy [Authenticator] [] + (getPasswordAuthentication [] + (PasswordAuthentication. my-email my-password))) + props (Properties.)] + (.put props "mail.smtp.host" "smtp.gmail.com") + (.put props "mail.smtp.port" "587") + (.put props "mail.smtp.auth" "true") + (.put props "mail.smtp.starttls.enable" "true") + (.. Session (getInstance props authenticator)))) + +(defn get-inbox [session] + (let [store (.getStore session "imaps") + inbox (do + (.connect store host my-email my-password) + (.getFolder store "inbox"))] + (.open inbox Folder/READ_WRITE) + inbox)) + +(defn get-no-worries-message [session] + (let [message (MimeMessage. session)] + (.setFrom message (InternetAddress. my-email)) + (.addRecipient message Message$RecipientType/TO (InternetAddress. kumar-email)) + (.setSubject message "Database fixes") + (.setText message "No worries mate, be careful next time") + message)) + +(defn search-term [pattern] + (OrTerm. (into-array SearchTerm [(SubjectTerm. pattern) (BodyTerm. pattern)]))) + +(defn any-of-search-term [& patterns] + (OrTerm. (into-array (map search-term patterns)))) + +(defn from-term [addr] + (FromTerm. (InternetAddress. addr))) + +(defn get-unread-sos-from-kumar [inbox] + (let [flag (AndTerm. (into-array SearchTerm [unread-term + (from-term kumar-email) + (any-of-search-term "help" "sorry" "trouble")]))] + (.search inbox flag))) + +(defn mark-as-read [inbox messages] + (.setFlags inbox messages seen-flag true)) + +(defn kumar-asshole [] + (let [session (get-session) + inbox (get-inbox session) + unread-sos-from-kumar (get-unread-sos-from-kumar inbox)] + (when (seq unread-sos-from-kumar) + (mark-as-read inbox unread-sos-from-kumar) + (Transport/send (get-no-worries-message session))))) diff --git a/clojure/smack.clj b/clojure/smack.clj new file mode 100644 index 00000000..232a0b1e --- /dev/null +++ b/clojure/smack.clj @@ -0,0 +1,28 @@ +(ns hacker-scripts.smack + (:import + (com.twilio Twilio) + (com.twilio.rest.api.v2010.account Message) + (com.twilio.type PhoneNumber))) + +(def acc-sid "my twilio account SID") +(def acc-tkn "my twilio secret token") + +(def my-num (PhoneNumber. "+10001112222")) +(def her-num (PhoneNumber. "+19998887777")) + +(def reasons ["Working hard" + "Gotta ship this feature" + "Someone fucked the system again"]) + +(defn twilio-init [] + (Twilio/init acc-sid acc-tkn)) + +(defn send-sms [to-num from-num message] + (.. Message (creator to-num from-num message) create)) + +(def send-sms-girlfriend (partial send-sms her-num my-num)) + +(defn smack [] + (twilio-init) + (let [message (rand-nth reasons)] + (send-sms-girlfriend message))) diff --git a/coffee/fucking.coffee b/coffee/fucking.coffee index d0f26bca..8df9dbed 100755 --- a/coffee/fucking.coffee +++ b/coffee/fucking.coffee @@ -14,15 +14,15 @@ 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) +conn = require('net').createConnection port, host setTimeout -> conn.write "#{pass}\nsys brew\n" setTimeout -> conn.end 'sys pour' - process.exit(0) + process.exit 0 , 2 * 1000 , 1 * 1000 # alert -sh('say come here and take your fucking coffee') +sh 'say come here and take your fucking coffee' diff --git a/go/fucking-coffee.go b/go/fucking-coffee.go new file mode 100644 index 00000000..23149d83 --- /dev/null +++ b/go/fucking-coffee.go @@ -0,0 +1,50 @@ +package main + +import ( + "fmt" + "log" + "os" + "regexp" + "time" + + "github.com/codeskyblue/go-sh" + "github.com/google/goexpect" +) + +func main() { + // exit early if no sessions with my username are found + currentUser, _ := sh.Command("who").Command("grep", "my_username").Output() + if currentUser == nil { + os.Exit(1) + } + + // info about the coffee machine + coffeeMachineIP := "10.10.42.42" + password := "1234" + passwordPrompt := "Password: " + delayBeforeBrew := 17 * time.Second + delay := 24 * time.Second + + // timeout for the telnet prompts + timeout := 10 * time.Minute + + // sleep 17 seconds before brewing coffee + time.Sleep(delayBeforeBrew) + + // spawn a new telnet session with the coffee machine + t, _, err := expect.Spawn(fmt.Sprintf("telnet %s", coffeeMachineIP), -1) + if err != nil { + log.Fatal(err) + } + defer t.Close() + + t.Expect(regexp.MustCompile(passwordPrompt), timeout) + t.Send(password + "\n") + t.Expect(regexp.MustCompile("telnet>"), timeout) + t.Send("sys brew\n") + time.Sleep(delay) + t.Expect(regexp.MustCompile("telnet>"), timeout) + t.Send("sys pour\n") + t.Expect(regexp.MustCompile("telnet>"), timeout) + t.Send("exit\n") +} 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/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..cbbd97a4 --- /dev/null +++ b/java/KumarAsshole.java @@ -0,0 +1,81 @@ +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(); + } + } +} 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/kotlin/FuckingCoffee.kt b/kotlin/FuckingCoffee.kt new file mode 100644 index 00000000..f775ea93 --- /dev/null +++ b/kotlin/FuckingCoffee.kt @@ -0,0 +1,33 @@ +import java.io.BufferedReader +import java.io.InputStreamReader +import java.io.PrintWriter +import java.net.Socket + +private const val MY_USERNAME = "my_username" +private const val PASSWORD_PROMPT = "Password: " +private const val PASSWORD = "1234" +private const val COFFEE_MACHINE_IP = "10.10.42.42" +private const val DELAY_BEFORE_BREW = 17 +private const val DELAY = 24 + +fun main(args: Array) { + for (i in 1 until args.size) { + if (!args[i].contains(MY_USERNAME)) { + return + } + } + val telnet = Socket(COFFEE_MACHINE_IP, 23) + val out = PrintWriter(telnet.getOutputStream(), true) + val reader = BufferedReader(InputStreamReader(telnet.getInputStream())) + Thread.sleep((DELAY_BEFORE_BREW * 1000).toLong()) + if (reader.readLine() != PASSWORD_PROMPT) { + return + } + out.println(PASSWORD) + out.println("sys brew") + Thread.sleep((DELAY * 1000).toLong()) + out.println("sys pour") + out.close() + reader.close() + telnet.close() +} \ No newline at end of file diff --git a/kotlin/Hangover.kt b/kotlin/Hangover.kt new file mode 100644 index 00000000..35f13ef5 --- /dev/null +++ b/kotlin/Hangover.kt @@ -0,0 +1,41 @@ +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.Random + +private val ACCOUNT_SID = System.getenv("TWILIO_ACCOUNT_SID") +private val AUTH_TOKEN = System.getenv("TWILIO_AUTH_TOKEN") + +private const val YOUR_NUMBER = "1231231231" +private const val BOSS_NUMBER = "3213213213" + +private val randomMessages = arrayOf( + "Locked out", + "Pipes broke", + "Food poisoning", + "Not feeling well" +) + + +fun main() { + + val client = TwilioRestClient(ACCOUNT_SID, AUTH_TOKEN) + + val finalMessage = randomMessages.random() + + val params = ArrayList().apply { + add(BasicNameValuePair("Body", "Gonna work from home. $finalMessage")) + add(BasicNameValuePair("From", YOUR_NUMBER)) + add(BasicNameValuePair("To", BOSS_NUMBER)) + } + + val messageFactory = client.getAccount().getMessageFactory() + val message = messageFactory.create(params) + System.out.println(message.getSid()) +} + diff --git a/kotlin/KumarAsshole.kt b/kotlin/KumarAsshole.kt new file mode 100644 index 00000000..75c23988 --- /dev/null +++ b/kotlin/KumarAsshole.kt @@ -0,0 +1,91 @@ +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 + +//modify below properties to your details +private const val host = "smtp.gmail.com" +private const val username = "yourmailaddress@example.com goes here" +private const val password = "your password goes here " +private const val Kumar_mail = "the mail address to be replied to !" + + +//Dependencies- Java mail API +fun main() { + val asshole = KumarAsshole() + asshole.read() +} + +object KumarAsshole { + + fun read() { + val props = Properties() + + try { + + val session = Session.getDefaultInstance(props, null) + + val store = session.getStore("imaps") + store.connect(host, username, password) + + val inbox = store.getFolder("inbox") + inbox.open(Folder.READ_ONLY) + + val messages = inbox.search(FlagTerm(Flags(Flags.Flag.SEEN), false)) + + for (i in messages.indices) { + + if (messages[i].getFrom()[0].toString().contains(Kumar_mail)) { + + var bodytext: String? = null + val content = messages[i].getContent() + if (content is String) { + bodytext = content + + } else if (content is Multipart) { + + val mp = content as Multipart + + val bp = mp.getBodyPart(mp.getCount() - 1) + bodytext = bp.getContent() + + } + + val pattern = Pattern.compile("sorry|help|wrong", Pattern.CASE_INSENSITIVE) + val matcher = pattern.matcher(bodytext!!) + // check all occurance + + if (matcher.find()) { + + val props1 = Properties() + val tomail: Array
+ + val msg = MimeMessage(session) + msg.setFrom(InternetAddress(username)) + tomail = messages[i].getFrom() + val t1 = tomail[0].toString() + msg.addRecipient(Message.RecipientType.TO, InternetAddress(t1)) + msg.setSubject("Database fixes") + msg.setText("No problem. I've fixed it. \n\n Please be careful next time.") + var t: Transport? = null + t = session.getTransport("smtps") + t!!.connect(host, username, password) + t!!.sendMessage(msg, msg.getAllRecipients()) + } + + + } + } + inbox.close(true) + store.close() + + } catch (e: Exception) { + e.printStackTrace() + } + + } +} \ No newline at end of file diff --git a/kotlin/SmackMyBitch.kt b/kotlin/SmackMyBitch.kt new file mode 100644 index 00000000..9a73bb34 --- /dev/null +++ b/kotlin/SmackMyBitch.kt @@ -0,0 +1,42 @@ +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.Random + +//Pre-requisite apache http and twilio java libraries + +private const val ACCOUNT_SID = System.getenv("TWILIO_ACCOUNT_SID") +private const val AUTH_TOKEN = System.getenv("TWILIO_AUTH_TOKEN") + +private const val YOUR_NUMBER = "1231231231" +private const val HER_NUMBER = "3213213213" + +private val randomMessages = arrayOf( + "Working hard", + "Gotta ship this feature", + "Someone fucked the system again" +) + + +@Throws(TwilioRestException::class) +fun main() { + + val client = TwilioRestClient(ACCOUNT_SID, AUTH_TOKEN) + + val finalMessage = randomMessages.random() + + val params = mutableListOf().apply { + add(BasicNameValuePair("Body", "Late at work. $finalMessage")) + add(BasicNameValuePair("From", YOUR_NUMBER)) + add(BasicNameValuePair("To", HER_NUMBER)) + } + + val messageFactory = client.getAccount().getMessageFactory() + val message = messageFactory.create(params) + System.out.println(message.getSid()) +} \ No newline at end of file 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/php/Lib/Telnet.php b/php/Lib/Telnet.php deleted file mode 100644 index 3409dc3a..00000000 --- a/php/Lib/Telnet.php +++ /dev/null @@ -1,264 +0,0 @@ - - * Based on the code originally written by Marc Ennaji and extended by - * Matthias Blaser - * - * Extended by Christian Hammers - * Modified by Frederik Sauer - * - */ - -class Telnet { - - private $host; - private $port; - private $timeout; - private $stream_timeout_sec; - private $stream_timeout_usec; - - private $socket = NULL; - private $buffer = NULL; - private $prompt; - private $errno; - private $errstr; - private $strip_prompt = TRUE; - - private $NULL; - private $DC1; - private $WILL; - private $WONT; - private $DO; - private $DONT; - private $IAC; - - private $global_buffer = ''; - - const TELNET_ERROR = FALSE; - const TELNET_OK = TRUE; - - public function __construct($host = '127.0.0.1', $port = '23', $timeout = 10, $prompt = '$', $stream_timeout = 1) { - $this->host = $host; - $this->port = $port; - $this->timeout = $timeout; - $this->setPrompt($prompt); - $this->setStreamTimeout($stream_timeout); - - // set some telnet special characters - $this->NULL = chr(0); - $this->DC1 = chr(17); - $this->WILL = chr(251); - $this->WONT = chr(252); - $this->DO = chr(253); - $this->DONT = chr(254); - $this->IAC = chr(255); - - $this->connect(); - } - - public function __destruct() { - // clean up resources - $this->disconnect(); - $this->buffer = NULL; - $this->global_buffer = NULL; - } - - public function connect() { - // check if we need to convert host to IP - if (!preg_match('/([0-9]{1,3}\\.){3,3}[0-9]{1,3}/', $this->host)) { - $ip = gethostbyname($this->host); - - if ($this->host == $ip) { - throw new Exception("Cannot resolve $this->host"); - } else { - $this->host = $ip; - } - } - - // attempt connection - suppress warnings - $this->socket = @fsockopen($this->host, $this->port, $this->errno, $this->errstr, $this->timeout); - - if (!$this->socket) { - throw new Exception("Cannot connect to $this->host on port $this->port"); - } - - if (!empty($this->prompt)) { - $this->waitPrompt(); - } - - return self::TELNET_OK; - } - - public function disconnect() { - if ($this->socket) { - if (! fclose($this->socket)) { - throw new Exception("Error while closing telnet socket"); - } - $this->socket = NULL; - } - return self::TELNET_OK; - } - - public function exec($command, $add_newline = TRUE) { - $this->write($command, $add_newline); - $this->waitPrompt(); - return $this->getBuffer(); - } - - public function login($username, $password) { - try { - $this->setPrompt('login:'); - $this->waitPrompt(); - $this->write($username); - $this->setPrompt('Password:'); - $this->waitPrompt(); - $this->write($password); - $this->setPrompt(); - $this->waitPrompt(); - } catch (Exception $e) { - throw new Exception("Login failed."); - } - - return self::TELNET_OK; - } - - public function setPrompt($str = '$') { - return $this->setRegexPrompt(preg_quote($str, '/')); - } - - public function setRegexPrompt($str = '\$') { - $this->prompt = $str; - return self::TELNET_OK; - } - - public function setStreamTimeout($timeout) { - $this->stream_timeout_usec = (int)(fmod($timeout, 1) * 1000000); - $this->stream_timeout_sec = (int)$timeout; - } - - public function stripPromptFromBuffer($strip) { - $this->strip_prompt = $strip; - } // function stripPromptFromBuffer - - protected function getc() { - stream_set_timeout($this->socket, $this->stream_timeout_sec, $this->stream_timeout_usec); - $c = fgetc($this->socket); - $this->global_buffer .= $c; - return $c; - } - - public function clearBuffer() { - $this->buffer = ''; - } - - public function readTo($prompt) { - if (!$this->socket) { - throw new Exception("Telnet connection closed"); - } - - // clear the buffer - $this->clearBuffer(); - - $until_t = time() + $this->timeout; - do { - // time's up (loop can be exited at end or through continue!) - if (time() > $until_t) { - throw new Exception("Couldn't find the requested : '$prompt' within {$this->timeout} seconds"); - } - - $c = $this->getc(); - - if ($c === FALSE) { - if (empty($prompt)) { - return self::TELNET_OK; - } - throw new Exception("Couldn't find the requested : '" . $prompt . "', it was not in the data returned from server: " . $this->buffer); - } - - // Interpreted As Command - if ($c == $this->IAC) { - if ($this->negotiateTelnetOptions()) { - continue; - } - } - - // append current char to global buffer - $this->buffer .= $c; - - // we've encountered the prompt. Break out of the loop - if (!empty($prompt) && preg_match("/{$prompt}$/", $this->buffer)) { - return self::TELNET_OK; - } - - } while ($c != $this->NULL || $c != $this->DC1); - } - - public function write($buffer, $add_newline = TRUE) { - if (!$this->socket) { - throw new Exception("Telnet connection closed"); - } - - // clear buffer from last command - $this->clearBuffer(); - - if ($add_newline == TRUE) { - $buffer .= "\n"; - } - - $this->global_buffer .= $buffer; - if (!fwrite($this->socket, $buffer) < 0) { - throw new Exception("Error writing to socket"); - } - - return self::TELNET_OK; - } - - protected function getBuffer() { - // Remove all carriage returns from line breaks - $buf = preg_replace('/\r\n|\r/', "\n", $this->buffer); - // Cut last line from buffer (almost always prompt) - if ($this->strip_prompt) { - $buf = explode("\n", $buf); - unset($buf[count($buf) - 1]); - $buf = implode("\n", $buf); - } - return trim($buf); - } - - public function getGlobalBuffer() { - return $this->global_buffer; - } - - protected function negotiateTelnetOptions() { - $c = $this->getc(); - - if ($c != $this->IAC) { - if (($c == $this->DO) || ($c == $this->DONT)) { - $opt = $this->getc(); - fwrite($this->socket, $this->IAC . $this->WONT . $opt); - } else if (($c == $this->WILL) || ($c == $this->WONT)) { - $opt = $this->getc(); - fwrite($this->socket, $this->IAC . $this->DONT . $opt); - } else { - throw new Exception('Error: unknown control character ' . ord($c)); - } - } else { - throw new Exception('Error: Something Wicked Happened'); - } - - return self::TELNET_OK; - } - - protected function waitPrompt() { - return $this->readTo($this->prompt); - } -} \ No newline at end of file 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 index 5ab70c78..074e22fe 100644 --- a/php/fucking_coffee.php +++ b/php/fucking_coffee.php @@ -1,170 +1,14 @@ +#!/usr/bin/env php IsWeekend( date('m.d.y') ) == false ) - { - - return false; - } - - /** - * Create a new telnet class - */ - - $this->telnet = new Telnet( $this->host, $this->port ); - - /** - * Once we have completed this, we can brew our coffee! - */ - - $this->BrewCoffee( function(){ - - /** - * Echo out a message - */ - - echo "coffee has been poured"; - - /** - * Unset - */ - - unset( $this->telnet ); - }); - - /** - * Return tue - */ - - return true; - } - - /** - * Brews our coffee - * - * @param $callback - */ - - public function BrewCoffee( $callback ) - { - - if( $this->telnet != null ) - { - - /** - * Execute and enter the password - */ - - $this->telnet->exec('Password: ' . $this->password); - - /** - * Brew the coffee - */ - - $this->telnet->exec('sys brew'); - - /** - * Wait - */ - - sleep( $this->delay ); - - /** - * Pour the coffee - */ - - $this->telnet->exec('sys pour'); - - /** - * Execute our callback - */ - - call_user_func( $callback ); - } - } - - /** - * Is this currently the weekend? - * - * @param $date - * - * @return bool - */ - - public function IsWeekend( $date ) - { - - if( date('N', strtotime( $date ) ) >= 6 ) - { - - return true; - } - - return false; - } - -} \ No newline at end of file +(strpos(exec('who'), getenv('USER')) !== false) or exit('no session'); +sleep(17); +$con = new TelnetClient('10.10.42.42'); +$con->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 index 46c3d8f4..903bd5cd 100644 --- a/powershell/smack_my_bitch_up.ps1 +++ b/powershell/smack_my_bitch_up.ps1 @@ -6,7 +6,7 @@ if ($DAYOFWEEK -eq 6 -or $DAYOFWEEK -eq 7) { } # Exit early if no sessions with my username are found -if ((QWINSTA $env:USERNAME | measure).Count -gt 0){ +if (-not (QWINSTA | FINDSTR $env:USERNAME)) { return } @@ -14,26 +14,25 @@ if ((QWINSTA $env:USERNAME | measure).Count -gt 0){ $MY_NUMBER='+xxx' $HER_NUMBER='+xxx' -$TWILIO_ACCOUNT_SID = 'xxx' -$TWILIO_AUTH_TOKEN = 'xxx' - -$REASONS= +$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; +} -$RAND = Get-Random -Maximum $REASONS.Count - -$MSG="Late at work. $REASONS[$RAND]" - - -$BASE64AUTHINFO = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $TWILIO_ACCOUNT_SID,$TWILIO_AUTH_TOKEN))) - -#Send a text messag and Log errors +#Send a text message and Log errors try{ - Invoke-RestMethod -Method Post -Headers @{Authorization=("Basic {0}" -f $BASE64AUTHINFO)} "https://api.twilio.com/2010-04-01/Accounts/$TWILIO_ACCOUNT_SID/Messages" -Body "From=$MY_NUMBER&To=$HER_NUMBER&Body=$MSG" > $null + 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 c19572f3..82609323 100755 --- a/python/fucking_coffee.py +++ b/python/fucking_coffee.py @@ -10,6 +10,8 @@ if 'my_username' not in output: sys.exit() +time.sleep(17) + coffee_machine_ip = '10.10.42.42' password = '1234' password_prompt = 'Password: ' @@ -20,7 +22,7 @@ # Make some coffee! con.write("sys brew\n") -time.sleep(64) +time.sleep(24) # love the smell! con.write("sys pour\n") 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 02c7e051..17bd3216 100755 --- a/python/smack_my_bitch_up.py +++ b/python/smack_my_bitch_up.py @@ -17,7 +17,7 @@ TWILIO_AUTH_TOKEN = os.environ.get('TWILIO_AUTH_TOKEN') # Phone numbers -my_number = '+xxx' +my_number = '+xxx' her_number = '+xxx' reasons = [ diff --git a/python3/fucking_coffee.py b/python3/fucking_coffee.py index 0268b79a..b3007804 100755 --- a/python3/fucking_coffee.py +++ b/python3/fucking_coffee.py @@ -24,7 +24,7 @@ def main(): conn.write(COFFEE_MACHINE_PASS) conn.write('sys brew') - time.sleep(64) + time.sleep(24) conn.write('sys pour') conn.close() diff --git a/python3/kumar_asshole.py b/python3/kumar_asshole.py index c85155b7..a66b255a 100755 --- a/python3/kumar_asshole.py +++ b/python3/kumar_asshole.py @@ -16,7 +16,7 @@ KUMAR_EMAIL = 'kumar.a@example.com' KEYWORDS_REGEX = re.compile(r'sorry|help|wrong', re.IGNORECASE) -REPLY_BODY = "No problem. I've fixed it. \n\n Please be careful next time." +REPLY_BODY = "No problem. I've fixed it. \n\nPlease be careful next time." yagmail.register(GMAIL_USERNAME, GMAIL_PASSWORD) 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